思ったような色が出ない、点灯しない
こうした悩みを解決します。
LEDテープの動作仕様とセットアップ
LEDテープは5V電源線、接地線、通信線の3本で動作します。
見た目はこんなです、RGBのLEDなのでそれぞれの明るさ調節しながら点灯させると色鮮やか!
LEDはフレキシブル基板(これをテープと言っている)に等間隔に実装されていて、私の購入した10cmテープでは16個のLEDが実装されていました。
Adafruit_NeoPixelライブラリを使えば割と簡単に点灯制御できます…とはいえまあまあ苦労します。
使用するにあたって一般的にはGROVE端子に接続して使うことが多いと思います。
私はM5stack本体に拡張ハブユニット(下図 左)をつなげてLED テープ以外にも他のユニットをつなげて動作させていました。
そこで問題が起こったのでこの記事で紹介します。
あるピンだけ常に真っ白で明るさ最大で点灯する
まずLEDテープだけ M5stackのGROVE端子に繋いだ時の点灯状況は以下のような具合です。
全てのLEDを青色で点灯させるプログラムで問題なく動作しています。
そして拡張ハブユニットを介してM5stackと繋いだ時の点灯が次の図になります
(拡張ハブユニット2は LED テープ以外にもユニットが接続された状態です )
一番上の LED が緑色に点灯して、 上から2番目の LED が真っ白に点灯しています
(青じゃなくて赤とか分かりやすいのにしとけばよかった…すみません)。
つづいて全ての LED をオフにした状態です。オフに設定しているのに2番目の LED が点灯し続けているのがわかります。
M5stackに直接接続した場合は問題ないので何かしらユニットの影響を受けている可能性が考えられそうです。
GPIOとI2Cの競合
そもそも M5stackのGROVE端子は下記の接続となっています。
※M5stack basicのPort.A(赤コネクタ)の話をしています。
GROVE端子番号 | マイコン接続先 | 信号 |
---|---|---|
1 | GPIO 22番ピン | SDA |
2 | GPIO 21番ピン | SCL |
3 | 5V電源 | Vcc |
4 | 接地 | GND |
M5stackのGROVE端子上の筐体に書かれている図を見ると、I2Cの通信線として機能させることを考えて設計されているように思えます。
で、このSCLの通信線をGPIO 21番ピンとして使っているのがLEDテープです。
だから、 LEDテープを制御するのにGPIOとして使いつつ、他のユニットではI2Cの通信線として使っているという状態になっていて、混線してたわけです。
なんでもかんでもGROVE端子で対応しようとしすぎやろ m5stack。
むやみに拡張ハブユニット使ったら動作不良起こすやん…
まあ何でもかんでもくっつける前に仕様見ておきなさい、という話なんですけどね、私のミス。
解決方法
GROVE端子はI2C通信が行われる想定で設計しているので 、LED テープの信号線を変更することで対応します。
サンプルプログラムなどをコピペしてると LED テープの信号線が21番ピンに設定されていると思います。
これを別のピンに割り当てます、例えば私は26番のDA端子に割り当てました。
#define PIN 21 // M5Stack Grobe Pin
↓
#define PIN 26 // M5Stack Grobe Pin
M5stackの26番ピンをLED テープの信号線に接続し、 5V電源線と接地線に接続して今までと同じようにプログラムを動かします。
こうすることでI2C通信の影響を受けることなく意図した通りに点灯制御できるようになりました。
今回の件を通じて分かりましたが M5stack のGROVE端子の取り扱いは要注意ですね。
今回はGPIOとI2Cの衝突だったけど、ユニットによっては同じスレーブアドレス使って衝突することもあるんかな?…さすがにそれはないか?
まとめ
M5stakのGROVE端子にむやみに何でもくっつけてはいけない。
GPIO制御のユニットはGROVE端子使わない方が安心安全。
コメント