今回は Adafruit さんの I2C制御 8×8 Mini LED ドットマトリックスを Adafruit さんのライブラリを使わずに点灯させる実験をしてみました。
これは、以下のものを使いました。
前回の記事でもちょっと紹介しましたが、私の環境ではなぜかAdafruitさんのライブラリで動かなかったんです。
それに、そのライブラリは私にはあまり使わない機能が多く、これ単体で動かすにはオーバースペック過ぎました。
ということで、ArduinoのWireライブラリのみで一から自分でスケッチを組んでみることにしました。
では、まず、この使い方から説明していきたいと思います。
1.HT16K33ボードとドットマトリックスをハンダ付けする
Adafruitさんのホームページにこのモジュールのハンダ付け方法がありますが、ここでは私がやった方法を掲載しておきます。
購入すると下図のように、
・LEDドライバー(HT16K33)ボードモジュール
・2.54mmピンヘッダ
・8×8 LED ドットマトリックス KWM-20882CBA
という部品が入っています。
ピンヘッダを4ピンだけニッパで切り取ります。
次にLEDドライバーボードモジュールとピンヘッダをハンダ付けします。
ボードの表裏を間違えないようにしてください。
因みに私は間違えそうになりました・・・。
ハンダ付け後はこんな感じになります。
次に、LEDドットマトリックスとボードとの間に隙間を空けて設置します。
おそらく、放熱のためかと思います。
ドットマトリックスの方向はAdafruitさんのホームページでは左右どちらでも良いということが書いてあるようです。私は英語が苦手ですので、Google翻訳で訳してみた結果です。
実際、「ホントか?」と思いましたが・・・
次にLEDドットマトリックスとボードをハンダ付けします。
1点だけ、チョコっとハンダ付けしてから、ハンダを溶かしながら位置を微調整すると良いと思います。位置が決まったら、本ハンダ付けしていくと良いです。
仕上がりはこんな感じです。LEDマトリックスの向きはこんな感じにしました。
2.Arduino UNO または ESPr Developer ( ESP-WROOM-02 開発ボード )と接続する
まず、Arduino UNO と Adafruit Mini 8×8 LED マトリックスをブレットボードとジャンパーワイヤー接続していきます。
通信はI2Cという便利なものを使いますので、電源5VとGND、それとSCL、SDAという信号ラインを接続します。I2Cはバス接続できますので、いろいろなICを接続できて、とても便利な通信規格です。
接続例は下図のとおりです。
ブレットボード接続した写真はこんな感じです。
(ESP-WROOM-02開発ボードがありますが、ここでは関係ありません)
Arduino UNO はAmazonさんではこんな感じで販売しておりました。
永久保証付きとは何ぞ??と思ってしまいましたが・・・。
I2C信号ラインは規格によるとそれぞれプルアップ抵抗を入れなければなりません。
しかし、Adafruit さんのHT16K33ボードは予めプルアップ抵抗が基板にマウントされております。
プルアップ抵抗は通信速度によって適切に決めなければいけないらしいです。
また、I2C接続を複数接続するときにも適切な抵抗値を決める方が良いとされています。
興味ある方はI2C通信規格の詳細がネット検索で見つかると思いますので、調べてみてください。
とりあえず、このボードにはそれぞれ10kΩの抵抗がマウントされておりました。
下図のところです。
反対側にあるA0、A1ジャンパー端子はハンダショートするとHT16K33のアドレスを変更することができます。何もしないとアドレスは0x70です。
また、スイッチサイエンスさんのESP-WROOM-02開発ボードに接続するときは下図のようにします。
ブレットボード上で接続した写真はこんな感じです。
ちなみに、AmazonさんではESP-WROOM-02開発ボードはこんな感じで販売しております。
これはArduino UNO より格段に安いのに、もの凄い大容量でWi-Fi通信ができて、しかも日本で安心して使えるように電波法をクリアした技適認証済みボードです。
何度も言いますが、これは使いやすい超おすすめボードです。
今、とても売れているらしく、在庫切れの場合があります。
スイッチサイエンスさんのウェブショップでも直販しておりますので、そちらも合わせてご覧ください。
このI2C信号ピンは、スケッチでピン番号を指定しないと、GPIO 4番がSDA、5番がSCLとなります。
また、ESP-WROOM-02 ( ESP8266 ) の信号ラインは3.3Vです。
ですから、電源もそれに合わせて3.3V出力から取っています。
実は、HT16K33のデータシートによると、動作電圧は4.5~5.5Vとあります。
しかし、Adafruitさんのホームページでは3.3Vでも動くようですと載っていたので、3.3Vで動かしました。実際動作は問題ありませんでした。明るさは暗くなりますが、十分でした。
もし、気になる方は、電源も5Vから取り、I2C信号レベルコンバーターで5V信号にすると良いです。
3.スケッチを書き込む
では、Arduino IDE を使ってパソコンからプログラムスケッチをArduino UNO や ESP-WROOM-02 に書き込んでみましょう。
その前に、このAdafruit Mini 8×8 LED Matrix はちょっとクセがありますので、それを説明しておきます。
LEDドライバーHT16K33 はI2C通信でバイト毎に、0ならば消灯、1ならば点灯という指定の方法です。
例えば以下のような 8×8 ビットを書き込むとします。
10000001 01000001 10100001 00010001 10001001 00000101 10000011 00000001
すると、普通にプログラムを組むと下図のように表示されてしまいます。
これはどういうことかというと、右上端を 0バイト目、0ビット目とすると、0~6ビットが全バイトについて左右逆対象(鏡面対象)になっていて、7ビット目だけそのまま表示されているのです。
最初、こう表示されたとき、LEDを左右逆にハンダ付けしてしまったかと思ってしまいましたが、どちらでもこうなるようです。
つまり、こういうことです。
実は私は過去の記事でAdafruitさんのLEDドライバーボードを秋月電子さんで売っているLEDドットマトリックスに接続する基板を作ったことがありました。
これをこの小さい基板の中に回路を押し込めるのが大変でした。
これは多層基板だと思いますが、それでもこのドットマトリックスに収めるのは至難の業です。
それで、止むを得なく7ビット目だけこうなってしまったのではないか、という推測ができます。
なるほど・・・、Adafruitさんも苦労してるんだなぁ・・・と思ってしまいました。
ということで、これをプログラムでビット操作しなければなりません。
Adafruitさんのライブラリではビット操作しているようです。
実は、私の環境が悪いのかもしれませんが、Adafruitさんのライブラリが動作しないんです。
どうしようもなかったので、一からスケッチを作って、解明してみました。
こんな感じです。
【ソースコード】 (※無保証 ※PCの場合、ダブルクリックすればコード全体を選択できます)
#include <Wire.h> #define LDaddrs1 (0x70) //LEDドライバーHT16K33 アドレス byte LedDot[8] = { B10000001, B01000001, B10100001, B00010001, B10001001, B00000101, B10000011, B00000001 }; byte LedDot2[8]; //***********セットアップ*************************************************** void setup() { Wire.begin(); // initialise the connection Wire.setClock(400000L); //HT16K33のクロックはMax 400kHz LED_Driver_Setup( LDaddrs1, 1); //HT16K33システムオシレータ ON LED_Driver_Blink( LDaddrs1, 1, 0); //blink_Hz=0 点滅off, 1は2Hz, 2は1Hz, 3は0.5Hz, on_off=0は消灯、1は点灯 LED_Driver_Brightness( LDaddrs1, 1 ); // brightness= 0~15 LED_Driver_DisplayInt( LDaddrs1 ); //Display Black OUT delay(1000); } //**************メインループ************************************************* void loop() { LED_Ada88_cnv(LedDot, LedDot2); LED_Driver_DisplayOutput(LDaddrs1, LedDot2); } //**********************LEDドライバ HT16K33 セットアップ******************* void LED_Driver_Setup(byte LD_addrs, byte on_off) { //HT16K33は8X8マトリックスLEDを2台まで制御できるらしい。 //ドライバIC#1 アドレスは0x70から設定する。 Wire.beginTransmission(LD_addrs); Wire.write(0x20 | on_off); //システムオシレータをONにする Wire.endTransmission(); } //**********************LEDドライバ HT16K33 点滅周期設定******************* void LED_Driver_Blink(byte LD_addrs, byte on_off, byte blink_Hz) { //blink_Hz=0 点滅off, 1は2Hz, 2は1Hz, 3は0.5Hz, on_off=0は消灯、1は点灯 Wire.beginTransmission(LD_addrs); Wire.write(0x80 | (blink_Hz<<1) | on_off); Wire.endTransmission(); } //**********************LEDドライバ HT16K33 明るさ設定********************* void LED_Driver_Brightness(byte LD_addrs, byte brightness) { // brightness= 0~15 Wire.beginTransmission(LD_addrs); Wire.write(0xE0 | brightness); Wire.endTransmission(); } //**********************LEDドライバ HT16K33 画面初期化********************* void LED_Driver_DisplayInt(byte LD_addrs) { Wire.beginTransmission(LD_addrs); Wire.write(0x00); for(int i=0;i<8;i++){ Wire.write(B00000000); //1つ目の8x8LED初期化 Wire.write(B00000000); //2つ目の8x8LED初期化 } Wire.endTransmission(); } //**********************Adafruit8x8ドット bit変換****************************** void LED_Ada88_cnv(byte* Bdot1, byte* Bdot2) { for(byte i=0; i<8; i++){ for(byte j=0; j<7; j++){ bitWrite(Bdot2[i],6-j,bitRead(Bdot1[i],j)); } bitWrite( Bdot2[i],7,bitRead(Bdot1[i],7)); } } //**********************LEDドライバ HT16K33 8X8データ送信******************* void LED_Driver_DisplayOutput(byte LD_addrs, byte* DotB) { int i,j; Wire.beginTransmission(LD_addrs); Wire.write(B00000000); //これは必要 for(i = 0; i<8; i++){ Wire.write(DotB[i]); Wire.write(0); //2つ目のLEDがある場合はここで送るが、今回は無し } Wire.endTransmission(); }
Arduino IDEで標準でついてくる、Wire.hライブラリだけを使っています。
●6~13行: ここで表示したいビットを定義してます。
●22行: ここではI2C通信のクロック周波数を決めています。とりあえず、HT16K33の最大値を指定してみました。
●62~71行: この自作関数でセットアップ時に一旦ブラックアウトします。つまり、ドライバにゼロを送って初期化しています。これをやらないと上手く表示できないです。
●73~81行: ここでビット操作をしています。
●83~93行: ここで、HT16K33 にビットを送ってLEDを点灯させます。
ここで注意していただきたいのが、このHT16K33はLEDマトリックスを2個制御できるのです。
ですから、89行目で1つ目のLEDを点灯させるビットを送り、続けて2つ目のLEDのビットを送っています。
しかし、今回は2つ目はありませんので、ここはゼロを送っておきます。
これを忘れると、意図した表示になりません。
因みに、Wire.endTransmission(); で各命令ごとにこれを指定して区切っておかないと上手く動作しません。
スケッチは以上です。
では、これをコンパイルして書き込んでみてください。
Arduino UNO についてはコンパイル方法は割愛させていただきます。
ESP-WROOM-02開発ボードのIDEの設定方法は以下のリンクをご覧ください。
現在、Arduino.ccページの最新IDEは1.6.6(2015/12/11現在) となっています。
●ESPr Developer ( ESP-WROOM-02 開発ボード )の使い方をザッと紹介
●WROOM 単体に Arduino スケッチで Wi-Fi ストリーミング
コンパイルしたらLEDがこんな感じで表示されていればOKです。
では、今回はここまでです。
このデバイスを応用した記事をアップしました。
以下の記事をご覧ください。
●EasyWebSocket 自作ライブラリ Beta version 1.1 をアップしました
●I2C LEDドットマトリックスの WebSocket スマホ ジャイロ コントロールを解説
Amazon.co.jp 当ブログのおすすめ
コメント