M5 Atom Lite で7セグメントLEDをLチカした際の覚え書き
またしてもご無沙汰です。
先週からタイトルの通り、Atom Liteで7セグメントLEDでLチカできないかと孤軍奮闘?してみたので、Twitterでは書けない内容をまとめました。
事の始まりは秋月電子さんのサイトを眺めていたら7セグメントLEDが表示されたんです。
しばらく眺めていて、ふと なんか懐かしさもあるこの雰囲気を自分の手で動かせないかと思い立ち、さらにページ内を見ていたらArduinoのソースコードがアップロードされている。手元にはAtomLiteがあるので、もしかしたら動かせるんじゃないかと早速2つ購入しました。
届いてすぐに開封してブレッドボードに刺してみたけど、具体的になにをどうすればいいのか皆目見当がつかない。そこからが大変でした。
まずLEDの配線がわからない。ひたすらググって具体的に解説されているサイトを発見し、ピン配置から 5V, GND, SCK, SDI, LATCH が必要とわかったのですが、Atomには対応するピンはありません。さらに SPI という手法で接続するとのことで、「Atom SPI」でググって、今度はこちらのサイトでお勉強。
まあこんな感じかなぁと配線し、ダウンロードしたArduinoのソースコードにAtomのヘッダーをつけてビルドアップロードしましたが、びくともしません。
いただいたコメントには 勉強せよ とのありがたいお言葉🥺
ちょっとくじけそうになり、じゃぁArduinoでLチカして気分をあげようと早速購入して約1時間半で動き出しました😊
そもそもSPIがなんなのかすらわからないのに調べようがないなぁと思いつつ、ひたすらググっていたところ、少しずつヒントになるサイトが見つかり出しました。
「GPIOマトリクス」「SPI.begin()」などなど。SPIには HSPI と VSPI の2種類があるという記事もあって余計に混乱しましたが、SPI.begin()には引数はないはずなのに引数を指定しているコードを掲載しているサイトがあって、試しにその引数のとおり組み込んでみたらLEDがチカチカしだしたのです😆
でも数字じゃない適当な点滅を繰り返していました。
これはLEDの表示配置がArduinoとAtomでは違うのかと、試しにビット位置をひとつずつずらして表示するコードを書いて調べてみたら、やはり全然違いました。
結局Atom用の表示配置を調べ、数字とついでにアルファベットのA〜Fまで作ってやっと完成しました。
Twitterにはコードを画像で😆掲載していますが、こちらではコードそのものを掲載します。
ピン配置と配線
Atom -> LED左 - LED右 です。
5V -> 1 - 1
GND -> 2 - 2
22 -> 3 - 3 (SCK)
19 -> 0 - 4 (MOSI -> SDI) ※0は配線なし
33 -> 7 - 7 (LATCH)
0 -> 4 - 5 (SDI - SDO) ※0は配線なし Twitter動画上の右上の青い線
ソースコード
#include <M5Atom.h>
#include <SPI.h>
int scrollSpeed = 200;
int pinSck = 22; // LED -> 3 pin (SCK)
int pinMosi = 19; // LED -> 4 pin (SDI)
int pinLatch = 33; // LED -> 7 pin (LATCH)
const byte digits[] = { // ↓はLED配置と点灯位置
0b00111111, // 0 0b00000000, 消灯
0b00000110, // 1 0b10000000, ドット
0b01011011, // 2 0b01000000, 中
0b01001111, // 3 0b00100000, 左上
0b01100110, // 4 0b00010000, 左下
0b01101101, // 5 0b00001000, 下
0b01111101, // 6 0b00000100, 右下
0b00000111, // 7 0b00000010, 右上
0b01111111, // 8 0b00000001, 上
0b01100111, // 9 0b11111111, 全灯
0b01110111, // A
0b01111100, // b
0b00111001, // C
0b01011110, // d
0b01111001, // E
0b01110001, // F
};
void setup() {
pinMode(pinSck , OUTPUT);
pinMode(pinMosi , OUTPUT);
pinMode(pinLatch, OUTPUT);
// SPI.begin( sck, miso, mosi, ss);
SPI.begin(pinSck, -1, pinMosi, -1);
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(0);
}
void loop() {
for (int seg10 = 0; seg10 < 16; seg10++) {
for (int seg01 = 0; seg01 < 16; seg01++) {
digitalWrite(pinLatch, 0);
SPI.transfer(digits[seg10]);
SPI.transfer(digits[seg01]);
digitalWrite(pinLatch, 1);
delay(scrollSpeed);
}
}
}
最後に
私が参考にしたサイトを掲載します。
勉強になりました。どうもありがとうございました。
Arduinoで7セグLEDシリアルドライバモジュールを使う Qiita @nanase様
ATOM Lite、Matrix、Echo GPIO比較 Lang-ship様
M5StickCでSPI通信をする Lang-ship様
ATOM MatrixのセンサとIO Qiita @jksoft様
M5Stack の液晶ディスプレイ ILI9341 をちょっと解明してみた mgo-tec電子工様
Arduinoリファレンス > SPI Arduinoリファレンス様
Arduino-SPIライブラリの使い方 Spiceman様
赤色7セグメントLEDシリアルドライバモジュール 完成品 秋月電子通商様
その他多数……