フォト
2017年4月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            
無料ブログはココログ

« 2013年11月 | トップページ | 2014年1月 »

2013年12月の12件の記事

2013年12月30日 (月)

2台のarduinoをI2Cバスで接続して通信を行う実験

今日はI2Cバスの学習のため2台のArduinoをI2Cバスで接続する実験を行いました。
きむ茶ガレージハウスさんのHPのI2Cの実験の記事で勉強させていただきました。

Dscn2277

この前作成した4桁7セグLEDを接続しているArduino(スレーブ)にマスタのArduinoから
表示データを送信して表示するといった構成です。

01

マスターから見ると、4桁7セグLED表示器は完全にブラックボッスであり、たた単純に
表示データを送るだけです。

思っていたよりも簡単に通信でき、遅れ等も感じられずに表示ができました。
取りあえず、イメージはつかめました。
実際にはエラー処理、制約、バスケーケーブル最大長などの考慮も必要でしょう。

写真の真ん中のは Arduino Pro mini です。Aliexpressで$3.84で売っていたので試しに
買ってみたのですが、ちゃんと動きます。基板上に実装できるサイズなので、
いろいろと使えそうです。

このちっこいArduino pro mini 使えばICたくさん使わなくても簡単にモジュールが作れそうです。

02

プログラムソースファイル

スレーブ側

//
// arduino I2Cスレーブ
//

#include <Wire.h>
#include <led7segfont.h>
#include <Static7Seg.h>
#include <stdlib.h>

// 4桁7セグLED制御 インスタンスの作成
Static7Seg seg(8,12,11);  

char buf[20];

// マスタからの表示用データ受信し表示する
void receiveEvent(int howMany) 
{
  int n = 0;
  
  // 送信された全てのデータを受信
  while(Wire.available()) {
    buf[n++] = (char)Wire.read();    
  }
  buf[n] = '\0';
  
  // 受信したデータを7セグLEDに出力
  seg.print(buf);
}

void setup() {
  seg.print("");  
  Wire.begin(8) ;                    // I2Cの初期化、自アドレスを8とする
  Wire.onReceive(receiveEvent) ;     // 割込み関数の登録
}

void loop() {
}

マスタ側

//
// arduino I2Cマスタ
//

#include <Wire.h>
#include <stdlib.h>
void setup()
{
 Wire.begin() ;       // I2Cの初期化、マスターとする
 delay(5000) ;        // 5秒後に開始
}

// データの送信
void seg_print(char *str) {
  Wire.beginTransmission(8) ;             // 通信の開始処理、スレーブのアドレスは8とする
  Wire.write((byte *)str, strlen(str)) ;  // 通信データ送信
  Wire.endTransmission();
}

// 繰り返し実行されるメインの処理関数
void loop()
{
   seg_print("");  delay(1000);   
   seg_print("1");  delay(1000);
   seg_print("12");  delay(1000);
   seg_print("345");  delay(1000);
   seg_print("1234");  delay(1000);
   seg_print("3.141");  delay(1000);
   seg_print("   1");  delay(1000);
   seg_print("  12");  delay(1000);
   seg_print(" 123");  delay(1000);
   seg_print("1234");  delay(1000);
   seg_print("");  delay(200);
   seg_print("1234");  delay(200);
   seg_print("");  delay(200);
   seg_print("1234");  delay(200);
   seg_print("");  delay(200);
   seg_print("1234");  delay(2000);
}

2013年12月29日 (日)

arduinoでI2C接続LCDモジュールを利用する

秋月電子でarduinoで使えそうなLCDモジュールを買ったので早速試してみました。
製品: I2C接続キャラクタLCD 16x2行白色バックライト付(ACM1602NI-FLW-FBW-M01)

この製品はI2Cインタフェースでの接続ということでarduinoとは4線で接続できます。
実際にarduinoで本LCDモジュールを使用してる紹介がエレキジャック(CQ出版社)のHP
紹介されています。
LiquidCrystal互換ライブラリも公開されておりこれを使えば即利用できます。
取りあえず動作確認のため、このライブラリとサンプルソースをそのまま利用させて
頂きました。記事の解説は分かりやすく大変参考になりました。

I2Cについては、きむ茶ガレージハウスさんのHPI2Cの実験の記事で勉強させて
いただきました。

電子回路作成後、問題なく動作しました(写真は動作確認の状況)。

Dscn2263

電子回路の作成

本製品は3.3V電源で利用するのが前提ですが、絶対最大定格が5.5Vなので5V電源でも
利用可能です。

ただし、5Vで利用する場合はバックアップライト用のLEDに流す電流を調整するために
抵抗を付ける必要があります。

必要部品
・バックライトLED用電流調整抵抗     330Ω x 1
・I2C SCL、SDA端子用プルアップ抵抗 2.2kΩ x 2
・液晶コントラス調整用10kΩ半固定抵抗 x 1(添付資料より選定)

抵抗値の決定
ArduinoでI2C制御LCD ACM1602を使う(1)の解説に回路図がありそのまま
利用すれば良いのですが、勉強のため自分で思考して選択しました。

・バックライトLED用電流調整抵抗
  添付資料より、順方向電圧 Vf = 3.1V、定格電流 If = 20mAなので
  電源V  = 5V 、流す電流を5mAとすると、
     R = (5.0 -3.1) / 0.005 = 380Ω

  手持ちの330Ωを利用することにします。

・I2C SCL、SDA端子用プルアップ抵抗
  NXPセミコンダクターズの公開資料 「I2C バス仕様およびユーザーマニュアル(日本語訳)」
  「7. I2C バスデバイスからバスラインへの電気接続」に計算方法があります。
  私は分かりやすく解説している「電子工作の実験室(後閑さん)」のHP
  「I2Cモジュールの使い方」の「I2Cの接続構成とプルアップ抵抗」を参考にさせて
  頂きました。

  arduinoのI2C用のライブラリWireを使う場合、転送速度は100kbpsに固定されてるそうな ので
  条件式で求めると1.5K~10KΩとなります。手持ちの2.2KΩを利用しました。
 
  I2Cを使ったことがないので、ライブラリのソースを読んでまずは勉強です。

2013年12月28日 (土)

arduino用の5V定電圧電源を安価に確保する

近所の100円ショップ売っているUSB接続の充電用電池ボックスがarduino用の
電源として利用できるか試してみました。

Dscn2249

まずは、単三電池を入れて電圧を測定してみます。

Dscn2255

5Vちゃんと出ていますね。電圧も安定しています。
内部にDC-DCコンバーターか何かがちゃんと入っているようです。

次にEneloopで試してみます。
単三電池よりも電圧は低くく、入力電圧は1.2Vの直列接続で2.4Vです。

Dscn2257

こちらもちゃんと5Vが安定して出ています。arduinoの電源として使えそうです。

直接arduinoを繋げてみます。USBポートからの供給で試してみます。

Dscn2260

普通に使えました。100円の割にはいい仕事していますね。
5V動作のロジックIC用の電源にも利用できそうです。

まあ、arduinoのDCコネクタから電池による電源供給もできるようですが、
6V-12Vが必要なので電池が単三電池4本または006P 9V電池1個を使う必要があります。

eneloop2本で1.2V 3800mAhの容量なので5Vだと900mAhくらいになるのかな?
2、3時間は利用できそうです。

関連記事
Arduino Uno で006P(9V)電池を使って電源を確保する

2013年12月27日 (金)

たまちゃんの香箱座り

うちのたまちゃんが完全に足が見えない状態の香箱座りをしていたので撮影。

01

英語圏ではパンのかたまりに似ているのでcatlofというそうですが、
まさに食パンの塊に猫の顔が生えている感じです。

02

香箱座りをするときは、比較的リラックスしている状態なのだそうです。

2013年12月26日 (木)

シフトレジスタ(74HC595)を使って4桁7セグLEDを表示

この前購入したシフトレジスタ(74HC595)を使って、arduino用のスタティック点灯の
4桁7セグLED表示モジュールを作成しました。

作成には、本家ARDUINOのHP「Serial to Parallel Shifting-Out with a 74HC595」の記事と
hiramine.comさんのHPの「少ない出力ピンで、大量のLEDを制御する(シフトレジスタ使用)
の記事を参考にさせて頂きました。

74HC595を4つ使って32ビットのON/OFF制御を行っています。
arduinoとの接続は5線です。スタティック点灯はやはり明るいです。
プログラムもダイナミック点灯のような制御も不要です。

裏はこんな感じです。



スズメッキ線と0.6mmポリウレタン銅線(UEW)ではんだ付けしました。
0.6mmはちょっと太すぎでちょっと使いにくです。

4個所の接続ミスと1個所の接触不良がありましたが無事動作しました。
回路図は下の図のような感じです。

510Ωの抵抗を使ってLED1つ当たり6mA弱の電流を流しています。
結構まぶしいので、もっと電流を抑えても良い感じです。3mAくらいでよいかも。

全部点灯した場合188mAとなるのでちょっと多いですね。
純正の arduinoのUNO の場合VCC から流せるのは200mAまでらしいので、
別電源にしないとまずいかも。
私が使っている互換機 SainSmart UNO R3 は 500mAまで流せるので問題無しです。

サンプルソース
数字以外にいくつかのパターンが表示できます。

単純な4桁表示でIC4個と抵抗32本の利用となりました。
部品代はは700円くらい。もっとシンプルにしたい。

2013年12月23日 (月)

LAN-W300N/G8の管理画面が最新版Chromeで正常に表示できない

(2014/01/04 修正) 
記事全体でChromeがchomeを記述していました。修正します。

2014/04/13 追記
本件、Chromeの 31.0.1650.63mにて発生していた現象ですが、
現時点のChrome最新バージョン34.0.1847.116mでは問題なく表示出来ています。

現在利用しているロジテック製 無線LANルータ LAN-W300N/G8の管理画面を久しぶりに
表示してみると、正常に表示出来ない状態になっていました。

ご覧のように、左側のメニューが表示されません(下図)。

04

再起動してもダメでした。
これは、私が作成したカスタムファームウェアに問題があると思い、純正ファームウェア
LANW300NG8_FW110.bin に戻して確認しても同様の症状が発生しました(下図)。

01

ところがブラウザをChromeではなくFireforやIE11で確認してみると正常に表示できます。
更に古いバージョンのChrome(バージョン 24.0.1312.57)でも正常に表示できました。

05

この問題はChromeの最新版でのみ発生する現象のようです。
Chromeは12月5日頃に更新があり、最新バージョン 31.0.1650.63mとなっています。

この版ではセキュリティ修正が行われたようで、それに引っかかっているようです。

「何でも雑記板 (避難)」さんのブログの下記の記事を参考にさせていただきました。
最新のGoogle Chrome 31.0.1650.63がリリース!【セキュリティ修正にAdobe Flash Playerの更新!】

コンソールを見てみるとセキュリティーエラーが発生しています。
(追記&修正 2013/12/24)

Uncaught SecurityError: Blocked a frame with origin "http://192.168.0.253" from accessing a frame with origin "chrome-extension://pioclpoplcdbaefihamjohnefbikjilc". The frame requesting access has a protocol of "http", the frame being accessed has a protocol of "chrome-extension". Protocols must match.  ソースを見ると、フレームにより4分割されたページが画面上にあります。
そのうち1つのページは高さ0ピクセルの見えないページ(code.asp)です。

この見えないページからJavaScriptで左フレームのメニュー(menu_empty.html)の表示内容
を動的変更する反則的な操作を行っています。これが引っかかってようです。

なんでこんな面倒なつくりにしているのだろう?
最新版では同一サーバーから表示したページでも別のページの内容を書き換える操作は、
セキュリティ的に出来ないようになったようです。

カスタムファームウェアにてこの問題対応できるかちょっと調べてみます。
多分、code.aspのメニュー作成の処理をmenu_empty.htmlに移植するか、
新たにメニューを新規作成するかの対応となると思われます。

まあ、別のブラウザを使えば問題ないので放置となるかもしれません。


2013年12月22日 (日)

Aliexpressで購入したシフトレジスタ(74HC595)が到着

arduinoの工作で利用するためにAliexpressで注文していたシフトレジスタ(74HC595)が到着しました。



30個で送料込みで$4.25でした。30個も必要ないのですが、Aliexpressでチェックすると
5個セット、10個セットと価格があまり変わらないので30個 $4.25(444円)の商品を購入しました。

ちなみにいつも使う千石の通販を利用すると1個179円+送料420円で合計599円となります。
(高い分、東芝製のICなので安心して利用できます)
まあ安い分、信頼性は不明・商品の到着に3週間かかりましたが..

さて到着した製品ですが、梱包はしっかりしていました。

Dscn2224

プチプチにくるまれて、5個入りレーンが6本入っていました。

Dscn2226

ロゴがありますがどこのメーカーのものかは不明です。

Dscn2227

とりあえず、シフトレジスタ(74HC595)の動作確認のため、
7セグメントLEDを2桁表示する回路を作成してみました。

Dscn2229

74HC595を2個連結して16ビットシフトレジスタ構成で利用しています。
動作確認をしましたが問題無しです。まともな製品のようです。取り合ず一安心。

30個 $4.25(444円)なので1個当たり 14円です。
これは安い。今回は良い買い物ができました。

スタディック点灯だとLEDが明るいです。配線量は大変だけど。

74HC595を4つ使ってスタディック点灯で4桁表示のモジュールを作成する予定です。
抵抗の数だけで32本、この抵抗の両端の配線だけで64本、これはちょっときつい。
明るさのムラを容認してコモン側に抵抗を一本づつ付ける方が良さそうかも。

2013年12月16日 (月)

arduinoで4桁7セグメントLEDの表示 の続き

前回arduinoで作成した4桁7セグメントLED表示を汎用的に利用するためにモジュール化しました。

まずはハードウェアのモジュール化
ユニバーサル基板上に実装し直しました。arduinoとは6線接続となります。



裏はこんな感じです。0.26mmのポリウレタン銅線(UEW)を使っています。
この線は被膜がハンダごての熱で溶けるので、はんだ付けが楽です。

作成した回路図を見ながら一本一本接続を間違わないようにはんだ付けしました。
はんだ付け後、テスターで通電チェックをしたら問題無し。
奇跡的に一発で正常動作してくれました。

接続端子の詳細
(2013/12/28 追記)

Bord

GND    : ArduinoのGNDに接続
Vcc(5V)
Arduinoの5Vに接続
DATA    : シリアルデータ入力端子
(サンプルではarduinoの5ピンに接続)
CLK      : クロック信号入力端子(サンプルではarduinoの4ピンに接続)
STB      : ストローブ信号入力端子
(サンプルではarduinoの3ピンに接続)
CLR      : クリア信号入力端子
(サンプルではarduinoの2ピンに接続)

ソフトウェアのモジュール化


この表示器用のライブラリも作成しました。
前回作成したプログラムをクラスライブラリ化しました。

arduinoのライブラリは他のライブラリのソースをまねて作成しました。
もしかしたら、正規の作り方でないかもしれませんが、まあ動いたのでよしとします。
ライブラリを使ったプログラムはかなりシンプルになりました。

(2013/12/28 修正)
ソースを見直し大幅修正しました。
汎用的に使うLED用フォントクラスを追加しました。


サンプルプログラム(SEG4.ino)

#include <stdlib.h>
#include <led7segfont.h>
#include <mstimer2.h>
#include <Dinamic7Seg.h>

// ダイナミック点灯用 インスタンスの作成
// 利用ピン: CLR:2、STB:3、CLK:4、DATA:5
Dinamic7Seg seg(2, 3, 4, 5);

// タイマー割り込みから呼び出される表示用関数
void disp() {
   seg.show();
}

void setup() {
  // タイマー割り込み開始
  MsTimer2::set(20, disp);
  MsTimer2::start(); 
}

void loop() {
   // デモプログラム
   // フォントは見た目に近いものを強引に表示している
   // mwxz はもう無理、なんだか分からんフォントで表示
   char* t="0123456789abcdefghijklmnopqrstuvwxyz -,_~^([)]<>/=\\\?#+:\"012";
   int n;
   char*p;
   int i;
   p=t;
   n = strlen(t);
   
   // 桁表示確認を確認する
   seg.print("");  delay(1000);  // 0文字はクリアに相当する   
   seg.print("1");  delay(1000); // 左詰めから表示となる。
   seg.print("12");  delay(1000);
   seg.print("345");  delay(1000);
   seg.print("1234");  delay(1000);
   seg.print("3.141");  delay(1000); // 数字の後ろのドットは数字に付く
   seg.print("   1");  delay(1000);  // 空白文字は何も表示しない
   seg.print("  12");  delay(1000);
   seg.print(" 123");  delay(1000);
   seg.print("1234");  delay(1000);

   // フラッシュ表示(1234が点滅する)
   seg.print("");  delay(200);
   seg.print("1234");  delay(200);
   seg.print("");  delay(200);
   seg.print("1234");  delay(200);
   seg.print("");  delay(200);
   seg.print("1234");  delay(2000);

  // フォント確認
  //   プログラムは表示開始位置をずらしてスクロール表示する
  //   print文では4文字以上の指定が可能だが、表示できない分は無視する。
  for(;;) {
    seg.print(p);
    p++;
    if (*(p+3) == '\0') {
      p = t;
    }
   delay(500);
 }
}

ライブラリはarduino-1.0.5\libraries\の下に格納するとIDEから利用可能になります。

ファイル構成
   \libraries\
    LED7SEGFont\ ・・・・・ LED7セグ用表示パターンフォントクラス
        led7segfont.h
        led7segfont.cpp
  Dinamic7Seg\ ・・・・ LED7セグ4桁ダイナミック点灯表示クラス

        Dinamic7Seg.h   
        Dinamic7Seg.cpp
        examples\
              SEG4\
                SEG4.ino

汎用的に利用するLED7セグ用表示パターンフォントもクラス化して、簡単に利用できる
ようにしました。

ライブラリのソース
led7segfont.h

/**
 ** 7セグメントLEDスタティックフォントクラス
 ** 2013/12/27 Tamakichi
 **
 **/
 
#ifndef led7segfont_h
 #define led7segfont_h

#include <arduino.h>

// キャラクターコード
#define SEG_CHAR_0 0
#define SEG_CHAR_1 1
#define SEG_CHAR_2 2
#define SEG_CHAR_3 3
#define SEG_CHAR_4 4
#define SEG_CHAR_5 5
#define SEG_CHAR_6 6
#define SEG_CHAR_7 7
#define SEG_CHAR_8 8
#define SEG_CHAR_9 9
#define SEG_CHAR_A 10
#define SEG_CHAR_B 11
#define SEG_CHAR_C 12
#define SEG_CHAR_D 13
#define SEG_CHAR_E 14
#define SEG_CHAR_F 15
#define SEG_CHAR_G 16
#define SEG_CHAR_H 17
#define SEG_CHAR_I 18
#define SEG_CHAR_J 19
#define SEG_CHAR_K 20
#define SEG_CHAR_L 21
#define SEG_CHAR_M 22
#define SEG_CHAR_N 23
#define SEG_CHAR_O 24
#define SEG_CHAR_P 25
#define SEG_CHAR_Q 26
#define SEG_CHAR_R 27
#define SEG_CHAR_S 28
#define SEG_CHAR_T 29
#define SEG_CHAR_Y 30
#define SEG_CHAR_V 31
#define SEG_CHAR_W 32
#define SEG_CHAR_X 33
#define SEG_CHAR_Y 34
#define SEG_CHAR_Z 35
#define SEG_CHAR_SPACE 36
#define SEG_CHAR_BAR 37
#define SEG_CHAR_DOT 38
#define SEG_CHAR_UBAR 39
#define SEG_CHAR_TILD 40
#define SEG_CHAR_HAT 41

class LED7SEGFont {
 public:
  static byte asc2font(char c);    // アスキーキャラクタコードをフォントデータに変更
  static byte code2font(char c);   // LED7SEGフォントコードに対応するフォントを取得 
};
#endif 

led7segfont.cpp

#include <led7segfont.h>
//7SEGフォント
static const byte font[] = {
   // abcdefgp 
    0b11111100, //0 :0
    0b01100000, //1 :1
    0b11011010, //2 :2
    0b11110010, //3 :3
    0b01100110, //4 :4
    0b10110110, //5 :5
    0b10111110, //6 :6
    0b11100000, //7 :7
    0b11111110, //8 :8
    0b11110110, //9 :9
    0b11101110, //A :10
    0b00111110, //B :11
    0b10011100, //C :12
    0b01111010, //D :13
    0b10011110, //E :14
    0b10001110, //F :15    
    0b10111100, //G :16    
    0b01101110, //H :17    
    0b00001100, //I :18    
    0b01110000, //J :19    
    0b10101110, //K :20    
    0b00011100, //L :21    
    0b11101101, //M :22    
    0b11101100, //N :23    
    0b00111010, //O :24    
    0b11001110, //P :25    
    0b11100110, //Q :26    
    0b00001010, //R :27    
    0b10110111, //S :28    
    0b10001100, //T :29    
    0b01111100, //U :30    
    0b00111000, //V :31    
    0b01111110, //W :32    
    0b01101111, //X :33    
    0b01110110, //Y :34    
    0b11011011, //Z :35    
    0b00000000, //  :36   
    0b00000010, //- :37    
    0b00000001, //. :38     
    0b00010000, //_ :39     
    0b10000000, //~ :40     
    0b11000100, //^ :41
    0b11110000, //] :42
    0b01001010, ///':43
    0b00011010, //< :44
    0b00110010, //> :45
    0b00010010, //= :46
    0b00100110, //\ :47
    0b11001010, //? :48
    0b01101100, //# :49
    0b01100010, //+ :50
    0b10010000, //: :51
    0b01000100  //" :52
};

// アスキーキャラクタコードをフォントデータに変更
byte LED7SEGFont::code2font(char c) {
  return font[c];
}

// キャラクタコードをフォントデータに変更
byte LED7SEGFont::asc2font(char c) {
  if ( isdigit((int)c) ) {
    // 数字
    return font[c-'0'];
  }   
  if ( isalpha((int)c) ) {
    // アルファベット
    if (c >='a' && c <= 'z') {
      return font[c-'a' + SEG_CHAR_A];
    } else if (c >= 'A' && c <= 'Z') {
      return font[c-'A' + SEG_CHAR_A];
    }
  }
  
  switch(c) {
    case ' ':return font[SEG_CHAR_SPACE];
    case '-':return font[SEG_CHAR_BAR];
    case ',':return font[SEG_CHAR_DOT];
    case '_':return font[SEG_CHAR_UBAR];
    case '~':return font[SEG_CHAR_TILD];
    case '^':return font[SEG_CHAR_HAT];
    case '(':
    case '[':return font[SEG_CHAR_C];
    case ')':
    case ']':return font[42];
    case '<':return font[44];
    case '>':return font[45];
    case '/':return font[43];
    case '=':return font[46];
    case '\\':return font[47];
    case '?':return font[48];
    case '#':return font[49];
    case '+':return font[50];
    case ':':return font[51];
    case '"':return font[52];
  }
  return font[SEG_CHAR_SPACE];	
}

Dinamic7Seg.h

/**
 ** 4ケタ7セグメントLEDダイナミック表示クラス
 ** 2013/12/27 Tamakichi 
 **
 **/

#ifndef Dinamic7Seg_h
 #define Dinamic7Seg_h

#include <Arduino.h>
#include <led7segfont.h>
 
class Dinamic7Seg {
  private:

	// 利用ピン
	int	pin_clr;
	int	pin_stb;
	int	pin_clk;
	int pin_data;

	//表示データ
	byte bcd[4];
		
  public:
  	Dinamic7Seg();
  	Dinamic7Seg(int pin_clr, int pin_stb, int pin_clk, int pin_data); // 利用ピン指定

	void init(void);
  	void attach(int pin_clr, int pin_stb, int pin_clk, int pin_data); // 利用ピン指定

	void clear();					// 7セグLEDのクリア
	void print(char* str);			// 7セグLEDへの表示
	void show(); 					// 7セグLED4桁表示
	void segout(int no, byte c);	// 指定桁の表示
};
#endif

Dinamic7Seg.cpp
/**
 ** 4ケタ7セグメントLEDダイナミック表示クラス
 ** 2013/12/27 Tamakichi
 **
 **/

#include <Arduino.h>
#include <Dinamic7Seg.h>
 
// 桁表示パターン
static const boolean __DIG[4][4] = {
	  {0,0,0,1},
	  {0,0,1,0},
	  {0,1,0,0},
	  {1,0,0,0}
};

// コンストラクタ
Dinamic7Seg::Dinamic7Seg() {
	clear();
}

Dinamic7Seg::Dinamic7Seg(int _pin_clr, int _pin_stb, int _pin_clk, int _pin_data) {
	clear();
	attach(_pin_clr, _pin_stb, _pin_clk, _pin_data);
}

// ビンの初期化	
void Dinamic7Seg::init() {
  digitalWrite(pin_clr, HIGH); 
  digitalWrite(pin_stb, HIGH);
  digitalWrite(pin_clk, LOW);
  digitalWrite(pin_data, LOW);
}

// 利用ピンの指定
void Dinamic7Seg::attach(int _pin_clr, int _pin_stb, int _pin_clk, int _pin_data) {
	pin_clr = _pin_clr;
	pin_stb = _pin_stb;
	pin_clk = _pin_clk;
	pin_data = _pin_data;
	
	pinMode(pin_clr, OUTPUT);
	pinMode(pin_stb, OUTPUT);
	pinMode(pin_clk, OUTPUT);
	pinMode(pin_data, OUTPUT);
	init();
}

// 7セグLEDのクリア
void Dinamic7Seg::clear() {
  bcd[0]= 0;
  bcd[1]= 0;
  bcd[2]= 0;
  bcd[3]= 0;	
}	

// 7セグLEDへの表示
void Dinamic7Seg::print(char* str) {
  clear();
  int n = strlen(str);
  int p = 0;
  byte c;
  boolean pre = 0;
  
  for (int i=0; i <n && p < 4 ; i++) {
    if (str[i] == '.') {
      // ドットの処理
      if (pre) {
        bcd[p-1] |= LED7SEGFont::code2font(SEG_CHAR_DOT);
        pre=0;
      } else {
        bcd[p] = LED7SEGFont::code2font(SEG_CHAR_DOT);
        p++;
        pre=1;
      }
    } else {
      // それ以外の文字  
      bcd[p] = LED7SEGFont::asc2font(str[i]);
      p++; 
      pre = 1;
    }
  }
}

// 7セグLED4桁表示
void Dinamic7Seg::show() {
  for (int i = 0; i < 4; i++) {
    segout(i, bcd[3-i]);
  }
  digitalWrite(pin_clr, LOW);
  digitalWrite(pin_clr, HIGH);  
}

// 指定桁の表示
void Dinamic7Seg::segout(int no, byte c) {
  // 12 ビットデータ転送

  // 表示する桁のセット
  for (int i=0; i< 4; i++) {
    digitalWrite(pin_data, __DIG[no][i]);
    digitalWrite(pin_clk, HIGH);  
    digitalWrite(pin_clk, LOW);  
  }  
  
  // フォントデータのセット
  shiftOut(pin_data, pin_clk, LSBFIRST, c);
  
  digitalWrite(pin_stb, LOW); 
  digitalWrite(pin_stb, HIGH);
  delay(2);
}
C++でプログラムを組んだのは数年ぶりでした。
JavaやPHPの感覚でクラスを定義したらコンパイルエラーが続出。
クラス定義とメンバー関数実装が別ファイルとなるのは非常に違和感があります。
クラス定義内に配列データを定義するのがJavaのように出来ないしちょっと不便。

まあ、これでセンサー類を使って簡単に数値が表示できるようになったと思われます。

このダイナミック点灯だと、タイマー割り込み等で随時表示処理を実行しないと
いけないのでちょっと無駄にCPU負荷がかかりますねぇ。
表示くらいハードウェアで全てやりたいなぁ。

2013年12月15日 (日)

無線LANルータ TP-Link TL-WR703NでWebカメラを利用する

この前購入した無線LANルータ TP-Link TL-WR703NにWebカメラを接続して
動画のストリーミング配信を試してみました。

01

Webカメラはロジクール HD Webcam C270を使いました。この製品はLinuxとの相性も良く
安価なのでお勧めの製品です。

Dscn2191

参考にしたのは次のHPです。
・TL-WR703N Example Project 4 : Webcam Streaming
   http://www.madox.net/blog/2013/02/23/tl-wr703n-example-project-4-webcam-streaming/

ファームウェアは、上記のホームページの内容に従ってUSB Video supportが
組み込まれているOpenWRTに変更しました。ファームウェアのダウンロードおよび適用方法は

   TP-Link TL-WR703N Introduction
   http://www.madox.net/blog/projects/tp-link-tl-wr703n/

を参考に行いました。既にOpenWRTを適用済みのためファームウェアのインストールは
"OpenWRT Upgrade"の手順で行いました。

ファームウェア適用後、TL-WR703N Example Project 4 : Webcam Streaming
内容に従って試してみたのですが、正常に動作しません。
ストリーミングはMJPG-streamer というアプリケーションを利用しているので、
このマニュアル等を調べて、次のようにコマンドを入力したら正常動作しました。

# mjpg_streamer -i "./input_uvc.so -n -r VGA -f 6 -d /dev/video0" -o "./output_http.so -p 8080 -n  --www /www/webcam" &

これでストリーミングを行うサーバーが稼働します。
パソコンからはブラウザで次のアドレスにアクセスします。

 http://192.168.0.251:8080/

問題が無ければサンプルのホームページが表示されます。
ざっと確認して静止画、動画とも問題なく表示できました。

サンプルを元に、自前のホームページに動画や静止画を埋め込むことが出来ます。
サンプルのホームページだけでも、動画、写真だけの表示も可能です。

03

私は有線LANで利用していますが、無線LANでの動画配信も可能です。
小型で省電力なため、ロボットに乗せて動画配信している人なんかもいます。


TP-Link TL-WR703N はかなり遊べるルータです。

2013年12月14日 (土)

arduinoで4桁7セグメントLEDの表示

arduinoでの4桁7セグメントLEDの表示を行うメモです。

7セグメントLEDの基礎については、下記の記事が参考になると思います(2015/01/28追記)
武蔵野電波のブレッドボーダーズ 「7セグメントLEDを使ってみよう」
武蔵野電波のブレッドボーダーズ  「LEDは楽しい電子部品」

センサー等を付けて、測定する場合に数値を表示したいので作成しました。
電子回路の知識はまだまだ素人に毛が生えたレベルなので、こんな回路でも
まともに動かすのに意外と時間がかかります。

4桁7セグメントLED表示機能の詳細

Dscn2189

arduinoのI/Oピンの利用数を減らすため、シフトレジスタを使いダイナミック点灯にて
LEDを表示します。

利用した部品

赤色7セグメントLED表示器(カソードコモン) OSL40562-LR x 1 ・・・  秋月電子にて購入
12ビットシリアル-パラレル変換IC NJU3714D x 1 ・・・   秋月電子にて購入
トランジスタアレイ(7ch)TD62003AP x 1 ・・・  秋月電子にて購入
1/4W 330Ω カーボン抵抗 x 8 ・・・  秋月電子にて購入

NJU3714Dはポピュラーなシフトレジスタ74HC595と同じように使えます。
12ビットあるので、表示パターン用の8ビットと桁切り替え用の4ビットを1つで制御できます。

LEDに使う抵抗値の計算

秋月電子のHPに計算方法が紹介されていたので計算しました。

OSL40562-LR の商品説明およびデータシートからVF=2.0V、IF10mAとすると
   抵抗 = (5V -2.0V)  / 10mA = 300Ω となります。
手持ちの330Ωを利用することにします。

この時にカーソドードコモン流れる最大電流は1桁当たり8個のLEDが点灯するので
  10mA x 8 = 80mA
となり80mA必要です。

arduino UNOでは1ピン当たり40mAしか流せないのでこのままではLEDが
点灯出来ません。そこでトランジスタを使ってもっと多く流すようにします。

今回はトランジスタアレイTD62003APを使いました。
このICは7つ分のNPNダイリストントランジスタが入っていて抵抗やらも内蔵されているので、
直接ロジックピンに接続して利用できます。

このあたりは、『昼夜逆転』工作室(J.Sugitaさん) のホームページの
「8桁対応 7セグテストボード」の記事が大変参考になりました。

取りあえず、回路もどきを書いてみました。

01
うーん、PowerPointで書いたのでちょっと汚いです。
フリーのツールいろいろと試したのですが、データシートの図を流用できる
ようなのが無いので自分的にはPowerPointが一番楽でした。

赤線がarduinoに接続する配線です。

プログラムソース



LEDへ4桁表示するには、led_print("1234")のように文字列で指定します。
led_print("12.34")、led_print("-12.3")等の小数点やマイナス記号も指定できます。

表示処理はタイマー割り込みで20msecの間隔で行っています。
タイマー割り込みライブラリはMsTimer2を使っています。入手方法及び使い方は、
「Arduino 日本語リファレンス MsTimer2(ミリ秒単位で指定するタイマ)」を参照。

プログラム作成にあたっては、
くらんべりーさんのブログ 「特に縛りなく」「arduinoで4桁7セグメントLEDを使ってみる」
参考にさせて頂きました。大変勉強になりました。

取りあえず試作が出来たので、プログラムはライブラリ化し、電子回路は基板に
はんだ付けしてモジュール化しようと思います。

今回の回路はICを2つ使ったのですが、MAX7219というICを使うともっと回路の簡略化、
プログラムの簡略化が出来るようです。

続き :「arduinoで4桁7セグメントLEDの表示 の続き」

2013年12月11日 (水)

膝の上の湯たんぽ

愛猫のルミちゃん、椅子に座ると直ぐに膝の上に飛び乗ってきます。
爆音で喉をゴロゴロ鳴らし、やがて完全に熟睡状態になります。
膝がぽかぽかと暖かい。でもちょっと重い。

Dscn2185

私にはベタベタな状態なのですが、保護から一年たっても私以外には
体を触らせないばかりが、姿を見ると逃げます。

こんなにも可愛いくて良い猫なのですが、
私の母は『ほんと、可愛げのない猫だこと』と嘆いています。

元野良のルミちゃん。怪我をしていて保護した猫。
本当にあの時見捨てずに保護して良かった思います。良い猫です。


2013年12月 5日 (木)

無線LANルータ TP-Link TL-WR703Nを購入

Aliexpressで以前から気にかけていた無線LANルータ TP-Link TL-WR703Nを購入しました。
一部のマニアに人気のある製品です。amazon.co.jpでも購入可能な製品です。

本製品はマイクロUSBでの電源供給で大変小さくてポケットに入る大きさです。
機能としては、150Mbps無線LAN、100Mbps 有線LAN、USBポートがあり、3G USBモデム対応です。

早速起動してみると管理画面は中国語です。言語切り替えも出来ません。



まあ、これは想定内です。
で、この製品が一部のマニアに人気な理由はOpernWrtに対応している点です。
TL-WR703NのWikiもあり簡単にOpenWrt化できます。

私はOpenWrtを触ったことが無いのでその入り口として本製品を購入しました。
早速Wikiに掲載されているファームウェアをインストールしてもました。
Webの管理画面からファームウェアを指定して書き込むだけでできます。

再起動すると、問題なく稼働しました。有線、無線ともに利用可能です。

03

リモートログインはセキュリティレベルの高いSSHが利用できます。

02

管理画面を見た感じでは、管理機能が充実しています。
パッケージのインストールまでWeb画面で行うことができます。

04

コマンドでもインストールできます。取りあえずUSBメモリを利用したいので、
# opkg install kmod-usb-storage
とコマンドでパッケージのインストールが出来ました。

その他、次のパッケージもインストールします。
kmod-fs-vfat
kmod-nls-cp437
kmod-nls-iso8859-1
kmod-nls-utf8

マウントの実行
# mount /dev/sda1 /mnt

すんなりマウント出来ました。

なぜこんな簡単にパッケージがインストール出来るのだろうとファイルシステム
を確認すると/が書き込み可能なパーティションになってました。
試しに、/bin の下にファイルを新規作成したら作成できました。
マウント状況を調べるとこんな感じ。

#mount
/dev/root on /rom type squashfs (ro,relatime)
proc on /proc type proc (rw,noatime)
sysfs on /sys type sysfs (rw,noatime)
tmpfs on /tmp type tmpfs (rw,nosuid,nodev,noatime,size=14608k)
tmpfs on /dev type tmpfs (rw,noatime,size=512k,mode=755)
devpts on /dev/pts type devpts (rw,noatime,mode=600)
/dev/mtdblock3 on /overlay type jffs2 (rw,noatime)
overlayfs:/overlay on / type overlayfs (rw,noatime,lowerdir=/,upperdir=/overlay)
debugfs on /sys/kernel/debug type debugfs (rw,relatime)
none on /proc/bus/usb type usbfs (rw,relatime)

詳しくは分かりませんが、追記分をjffs2ファイルシステムのパーティションに書き込んで
いるようです。

今回は取りあえず、おさわり程度とします。

ハードウェア的にも、かなりいじれる製品なので色々と遊べそうな製品です。
TL-WR703Nをgoogleで画像検索すると改造された画像がいっぱいでてきます。

« 2013年11月 | トップページ | 2014年1月 »