フォト
2017年8月
    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 31    
無料ブログはココログ

« 購入した16ビットシフトレジスタTB62706ピンピッチが1.778mmだった | トップページ | Arduinoで16x16 LEDドットマトリックスを利用する(5) »

2014年9月21日 (日)

ArduinoでTB62706を使ってみました

TB62706は、ピンピッチが1.778mmなのが面倒ですが、機能はシンプルで使いやすいです。
簡単な配線で16個のLEDをピコピコできます。

シフトレジスタ 74HC595と使い方は同じ感じですが、LED用ドライバだけあって
LEDに流す電流は抵抗1つで設定できるので楽です。

最終的には16x16 LEDドットマトリックスの制御使う予定です。

回路はこんな感じです。

1

R-EXTに接続している2.2kΩの抵抗でOUT0〜OUT16のそれぞれに流れる電流を
決めています。

データシートより抵抗値の決定は、次の式で計算します。
   IOUT = ( 1.26 / REXT) x 14.7

この式より、
   REXT  = 18.522 / IOUT   
となりまして、この回路では8mAを流したいので、
   REXT  = 18.522 / 0.008 = 2315.25 8 ≒ 2.2kΩ
となりました。



テスト用のプログラムはこんな感じです。
//
// TB62706を使ったLEDの点灯サンプル
//

#define DATAPIN		(9)	// TB62706のSERIAL-INへ
#define LATCHPIN	(11)	// TB62706のLATCHへ
#define CLOCKPIN	(12)	// TB62706のCLOCKへ
#define ENABLEPIN       (8)     // TB62706のENABLEへ

//
// ビット列データの出力
//
void dataOut(byte dataPin, byte clockPin, byte nbits, uint32_t val ) {
	digitalWrite(LATCHPIN, LOW);		//送信開始
	for( byte i = 0; i < nbits; i++ ){
		digitalWrite(dataPin, !!(val & (1L << i)));			
		digitalWrite(clockPin, HIGH);
		digitalWrite(clockPin, LOW);
	}
	digitalWrite(LATCHPIN, HIGH);		// 送信終了
}

void setup() {
        pinMode(ENABLEPIN,OUTPUT);
	pinMode(DATAPIN, OUTPUT);
	pinMode(LATCHPIN, OUTPUT);
	pinMode(CLOCKPIN, OUTPUT);

        digitalWrite(ENABLEPIN,LOW);            // OUTを有効にする
}

void loop(){
        // 点灯LEDが移動するパターン
  	for( int i = 0; i < 16; i++ ) {
		dataOut( DATAPIN, CLOCKPIN, 16, 1L << i );
		delay(100);
	}
}

ちなみに今回、新たに購入した格安互換機を使ったのだけれど、ちゃんと動いてます。

01

原価いくらなんだろう?

このICを使って16x16 LEDドットマトリックスを制御したいと思います。
関連記事: Arduinoで16x16 LEDドットマトリックスを利用する(5)

« 購入した16ビットシフトレジスタTB62706ピンピッチが1.778mmだった | トップページ | Arduinoで16x16 LEDドットマトリックスを利用する(5) »

arduino」カテゴリの記事

AVR」カテゴリの記事

表示器制御関連」カテゴリの記事

コメント

突然で申し訳ないのですが、
digitalWrite(dataPin, !!(val & (1L << i)));について詳しく教えていただけませんか??

あきやさん

digitalWrite( dataPin, !! ( val & ( 1L << i ) ) )
でやっていることはvalの値の下位からi番目のビット(1:HIGH or 0:LOW)を取り出して出力しています。

実際にiを0から1つづ増やしてみていきましょう。

1L<< i は シフト演算ですが、 iを0から 1づず増やしていくとこの2進数表記で値は(面倒なので8ビット)
00000001
00000010
00000100
・・・
10000000
となります。

ここで val の値が 2進数で10010101 とすると val & 1L<< i の値は、iを増やしていくと
10010101 & 00000001 = 00000001
10010101 & 00000010 = 00000000
10010101 & 00000100 = 00000100
・・・
10010101 & 10000000 = 10000000
となります。

次に! は単項演算子(否定)ですが、演算結果は0なら1、0以外なら0となります。
!0 = 1
!1 = 0
!2 = 0
!4 = 0
!8 = 0
・・・

2つ並べると否定の否定で 0なら0、0以外なら、1となります。
!!0 = !(!0) = !1 = 0
!!1 = !(!1) = !0 = 1
!!2 = !(!2) = !0 = 1
!!4 = !(!4) = !0 = 1
!!8 = !(!8) = !0 = 1
・・・

否定の否定は肯定で意味なさそうですが、「0 または 0以外」という値を
 「0 または1」 にしてくれます。

なので !!( val & ( 1L << i ) ) はiを増やしていくと、
!!( 10010101 & 00000001 ) = !!00000001 = 1
!!( 10010101 & 00000010 ) = !!00000000 = 0
!!( 10010101 & 00000100 ) = !!00000100 = 1
・・・
!!( 10010101 & 10000000 ) = !!10000000 = 1

となり、valの下位から順番に1ビットずつ取り出していることになります。

よって、
digitalWrite( dataPin, !!( val & ( 1L << i ) ) )
はvalの値の下位からi ビット目の値をdataPinで指定したポートに出力出来ます。
iを0~n または、n~0と変えていくことで、valの値をシリアル出力できます。

こんな感じでご理解できたでしょうか^^

返信遅れて申し訳ございません。

凄くわかりやすく
説明して頂きありがとうございます!

早速お手本にさせて頂きます!

LEDのサンプル探していたらここに来ました。
突然の質問ですが、上記で解説されている
----
10010111 & 00000001 = 00000001
10010101 & 00000010 = 00000000
10010111 & 00000100 = 00000100
・・・
10010111 & 10000000 = 10000000
---
の部分でvalの値は10010101ですが
1行目 10010111
2行目10010101
3行目10010111
の部分で1行目と3行目が10010111になっているのが?なんです
よろしければ教えてもらえないでしょうか?

たくさん、こんにちは

済みません。記載ミスです。
コメント回答を修正しました。

>> ここで val の値が 2進数で10010101 とすると
と定義しているので、左側の2進数は全て10010101 ですね。

ご迷惑をおかけしました。

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/571408/60353228

この記事へのトラックバック一覧です: ArduinoでTB62706を使ってみました:

« 購入した16ビットシフトレジスタTB62706ピンピッチが1.778mmだった | トップページ | Arduinoで16x16 LEDドットマトリックスを利用する(5) »