ArduinoでTB62706を使ってみました
TB62706は、ピンピッチが1.778mmなのが面倒ですが、機能はシンプルで使いやすいです。
簡単な配線で16個のLEDをピコピコできます。
シフトレジスタ 74HC595と使い方は同じ感じですが、LED用ドライバだけあって
LEDに流す電流は抵抗1つで設定できるので楽です。
最終的には16x16 LEDドットマトリックスの制御使う予定です。
回路はこんな感じです。
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); } }
ちなみに今回、新たに購入した格安互換機を使ったのだけれど、ちゃんと動いてます。
原価いくらなんだろう?
このICを使って16x16 LEDドットマトリックスを制御したいと思います。
関連記事: Arduinoで16x16 LEDドットマトリックスを利用する(5)
« 購入した16ビットシフトレジスタTB62706ピンピッチが1.778mmだった | トップページ | Arduinoで16x16 LEDドットマトリックスを利用する(5) »
「arduino」カテゴリの記事
- Arduino IDE+Arduino STM32環境で指定と異なるgccが使われてしまう(2025.01.23)
- Zorin OSでArduino Uno互換機(CH340)が認識しない(2025.01.19)
- Arduino IDE 2.3.4でArduino STM32を利用する(2025.01.12)
- Arduino用 SKK日本語変換ライブラリの開発 その1(2024.12.28)
- NeoPixel(WS2812B)の制御 その5(2024.09.15)
「AVR」カテゴリの記事
- NeoPixel(WS2812B)の制御 その5(2024.09.15)
- Arduino用SJIS漢字フォントライブラリ SDカード版を作成しました(2018.10.30)
- ATtiny13AでI2C接続キャラクタLCDを利用する(4)(2018.04.16)
- ATtiny13Aで赤外線リモコン受信センサーを使う(2)(2018.04.15)
- ATtiny13AでHC-SR04を使った距離計測(2018.04.14)
「表示器制御関連」カテゴリの記事
- NeoPixel(WS2812B)の制御 その5(2024.09.15)
- Arduino用 美咲フォントライブラリを更新しました(2024.03.21)
- Raspberry Pi Pico(MicroPython)でLEDドットマトリックスを使ってみる(2024.03.14)
- Raspberry Pi Pico MicroPython用のマルチフォントライブラリ(2023.02.09)
- MicroPython(Raspberry Pi pico)で8x8ドットNeoPixcel文字表示(2023.02.08)
コメント
« 購入した16ビットシフトレジスタTB62706ピンピッチが1.778mmだった | トップページ | Arduinoで16x16 LEDドットマトリックスを利用する(5) »
突然で申し訳ないのですが、
digitalWrite(dataPin, !!(val & (1L << i)));について詳しく教えていただけませんか??
投稿: あきや | 2016年9月30日 (金) 17時10分
あきやさん
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の値をシリアル出力できます。
こんな感じでご理解できたでしょうか^^
投稿: たま吉さん(管理者) | 2016年10月 1日 (土) 02時17分
返信遅れて申し訳ございません。
凄くわかりやすく
説明して頂きありがとうございます!
早速お手本にさせて頂きます!
投稿: あきや | 2016年10月 4日 (火) 12時20分
LEDのサンプル探していたらここに来ました。
突然の質問ですが、上記で解説されている
----
10010111 & 00000001 = 00000001
10010101 & 00000010 = 00000000
10010111 & 00000100 = 00000100
・・・
10010111 & 10000000 = 10000000
---
の部分でvalの値は10010101ですが
1行目 10010111
2行目10010101
3行目10010111
の部分で1行目と3行目が10010111になっているのが?なんです
よろしければ教えてもらえないでしょうか?
投稿: たく | 2016年12月14日 (水) 12時59分
たくさん、こんにちは
済みません。記載ミスです。
コメント回答を修正しました。
>> ここで val の値が 2進数で10010101 とすると
と定義しているので、左側の2進数は全て10010101 ですね。
ご迷惑をおかけしました。
投稿: たま吉さん(管理者) | 2016年12月14日 (水) 15時58分