eucaly が 2023年09月02日19時52分37秒 に編集
初版
タイトルの変更
秋月のマトリックスLEDをLチカさせて遊んでみる
タグの変更
LED
LEDマトリクス
Lチカ
メイン画像の変更
記事種類の変更
製作品
ライセンスの変更
(MIT) The MIT License
本文の変更
こんにちは、ゆうかりです。 さて今回は。 秋月電子のサイト見てたら、「ピックアップ」に、こんなのがあり。 ![キャプションを入力できます](https://camo.elchika.com/8afe91a00ceb9abbdd69022acb279dc3e1d8c9c8/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666637633237372d646465642d343333632d393736342d6162303436346433326631302f62353636353461612d343664622d343464612d386133312d313730376431323239636632/) ミント色!?。 つい気になって、衝動買い。 ![キャプションを入力できます](https://camo.elchika.com/faf17c9eca4d82f8f474ed9dd65ad98e7cbe7d60/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666637633237372d646465642d343333632d393736342d6162303436346433326631302f36316438306432632d663633352d343530342d623935612d373433326636663330653533/) しかも何故かの八潮店で。 けっこうデカいのに、しれっと部品引き出しに納まってて、びっくり。 マトリクスLEDは、HUB75なコントローラー経由でしか触ったこと無いので、どうなることやらですが。 ま、遊んでみたいと思います。 # 素性 モノは、オプトサプライのやーつで。 ![キャプションを入力できます](https://camo.elchika.com/e8b7e288362af4657b3a1b860a3b9a6e3673e2a4/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666637633237372d646465642d343333632d393736342d6162303436346433326631302f32646566383831622d363338362d343338642d616264312d666133633762356338313938/) 蛍光管、VFDチックなお色でステキに輝くようです。 中身は、各LEDのアノードとカソードをマトリクス状に繋いでおり。 ![キャプションを入力できます](https://camo.elchika.com/e0a2b65cda507ff27056f2b7049f491507c23d0a/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666637633237372d646465642d343333632d393736342d6162303436346433326631302f61356430313335342d353765312d343035612d623364662d346465616536366637366239/) それぞれ16本、合計32本のI/Fという、なかなかにゴツーい感じ。 ま、やってみますか。 # 当初の作戦 マトリクスLEDは、そのまま使うと配線だらけになって使いづらいので、「ドライバIC」なるものがあります。 秋月電子も扱っていて、「HT16K33」てのをお勧めされております。 コイツは、I2Cドライバなので、大量の配線がSCLとSDAだけで制御可能になる夢のデバイスです。 えぇ、もちろん買いましたとも、何も考えず!。 ![キャプションを入力できます](https://camo.elchika.com/70a0487bf5899f5c6ab03e9038e7e0b4b3c2ca2b/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666637633237372d646465642d343333632d393736342d6162303436346433326631302f34653866343961642d663865342d343633382d396239642d306234323232303364323335/) しかも2セット。 でもねーこれねー、ソースは16chあるんだけど、シンクが8chしかなくて。 「複数使い用の同期」も取れなさそう。 2つ使えばいけんじゃね?、とごにょごにょ思考実験したんだが、同居は無理っぽくて。 「3ステートバッファ使ってソースシンクを切り替える」とかいう力業しか思いつかなくてね。 そもそもバッファ使うと「線少なくしたい」的なお話からは吹っ飛んでしまうし・・・。 つーわけで、やめやめ。 ![キャプションを入力できます](https://camo.elchika.com/4e46bca92aa91fc89cfb8861e110fe5625b839dc/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666637633237372d646465642d343333632d393736342d6162303436346433326631302f63356566656134392d643638332d346134362d626164392d383231353531353364383265/) ごーとぅー部品箱 # もうね、32本、GPIOに繋いでしまえと しかも速度必要そうなので、CPU直結の。 流石にそんなステキCPU無いよねー、FPGAあたりでがんばりますかねー、とぐぐっていたら。 ありました、しかもArduino純正で。 「ATMEGA2560」、Arduino MEGA、ですね。 最大54本もGPIOがあり、各端子の定格は20mA、しかも5Vと、もうステキです。 早速純正品、、、ではなく、中華な互換品をAmazonでポチっと。 ![キャプションを入力できます](https://camo.elchika.com/35a5d3a33f6f2fdee9e29d2282944c9b7b1400d6/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666637633237372d646465642d343333632d393736342d6162303436346433326631302f35383430616164382d316532662d343038642d393663332d346438643835643133653933/) 静電袋に入ってるのはいいんですが、オマケのピンヘッダを、ごろんと入れるの勘弁してほしい、なかなかに怖い! # とりあえず点けてみる 適当なピンをHIGHとLOWに設定し、適当なROW側にHIGHを、適当なCOL側にLOWを接続。 電流制限は20mAなので、 R = V / I 、250Ωですが、まあ半分の470Ωに設定。 特に事故もなく、光りましたとさ。 ![キャプションを入力できます](https://camo.elchika.com/e74ebf7f009824f8f8fd2b6ed6b37444121438d4/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666637633237372d646465642d343333632d393736342d6162303436346433326631302f35643965313638362d663039352d346134322d383034632d343132636632313430653662/) ミント?、明るいと雰囲気出ないのかも # 基板作成 適当な秋月B基板にハメてみると、ちょうどよさげなので。 ピンソケット経由にして、配線開始。 電流制限抵抗をちまちまと。 ![キャプションを入力できます](https://camo.elchika.com/461490d7714d5b60d1cf562b3f618bc54a384f23/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666637633237372d646465642d343333632d393736342d6162303436346433326631302f36373861303263392d306136332d343937342d383466652d393138373366663232343066/) 1/6Wタイプだけどまあ、50mWしか掛からんので、大丈夫でしょう すだれ配線になりましたとさ。 ![キャプションを入力できます](https://camo.elchika.com/8bffd7b6d9de9b4347d5e4cfec24c393c6d26c7e/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666637633237372d646465642d343333632d393736342d6162303436346433326631302f63306464613433622d663037632d343962322d383235322d343330393666623536383032/) で、完成、と。 ![キャプションを入力できます](https://camo.elchika.com/25f917ad4522f8136361984a1b07ff7609dc3dd2/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666637633237372d646465642d343333632d393736342d6162303436346433326631302f64613633366564372d323230372d343037632d613638362d343966633762356437326163/) # とりあえずランダム点灯 いい感じです。 ![キャプションを入力できます](https://camo.elchika.com/0220e4608de07268edfad840849ba8b095f0dced/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666637633237372d646465642d343333632d393736342d6162303436346433326631302f31623966663238622d323463352d346138612d386436302d383730306236653562643632/) やりくちは簡単で。 ![キャプションを入力できます](https://camo.elchika.com/b0fe40dbc27aa919f1a969ed88159ed16b97b48e/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666637633237372d646465642d343333632d393736342d6162303436346433326631302f62376237306130632d393632312d346166342d386265312d356364633339326532643135/) ROW側がHIGH、COL側がLOWだと点灯しますよと 初期状態は、ROW側もCOL側もHIGHで。 非点灯にしたいとこをROW側をLOWにし。 最後に点灯したい列をLOWに落とす感じで。 # UART経由流し込み点灯 まあ、こいつにセンサーとかつけてゴニョゴニョも楽し気ですが。 UART経由で描画することで、ラズパイだのから流し込みたいな、と。 ゆーわけで適当にプログラミング!。 ```c:mintmatrix_demo.ino byte cols[16] = {54,56,58,60,62,64,66,68,32,34,36,38,40,42,44,46}; byte rows[16] = {55,57,59,61,63,65,67,69,33,35,37,39,41,43,45,47}; byte gmemory[256]; int x; byte i = 0; byte j,k; byte rowswitch = 0; unsigned long timenow,timedelta; unsigned long timestart = 0; unsigned long timethreshold = 1000; int count; byte mpointer = 0; byte readdata = 0; long randdata; void setup() { // put your setup code here, to run once: Serial.begin(115200); Serial.setTimeout(100); for (x=54; x <= 69; x++){ pinMode(x, OUTPUT); digitalWrite(x, HIGH); } for (x=32; x <= 47; x++){ pinMode(x, OUTPUT); digitalWrite(x, HIGH); } for (x=0; x <= 255; x++){ gmemory[x] = 0; } } void loop() { if (rowswitch != 0) { if (timestart == 0){ digitalWrite(rows[i], LOW); timestart = micros(); } timenow = micros(); timedelta = timenow - timestart; if (timedelta > timethreshold){ digitalWrite(rows[i], HIGH); count++; rowswitch = 0; timestart = 0; } } else { i++; if (i >= 16){ i = 0; } for (j=0; j <= 15; j++) { k = i * 16 + j; if (gmemory[k] == 0) { digitalWrite(cols[j], LOW); } else { digitalWrite(cols[j], HIGH); } } rowswitch = 1; } } void serialEvent() { readdata = Serial.read(); if (readdata == 48) { gmemory[mpointer] = 0; mpointer++; return; } if (readdata == 49) { gmemory[mpointer] = 1; mpointer++; return; } if (readdata == 50) { mpointer = 0; return; } if (readdata == 51) { timethreshold = 1000; return; } if (readdata == 52) { timethreshold = 100; return; } if (readdata == 53) { timethreshold = 50; return; } if (readdata == 54) { timethreshold = 10; return; } if (readdata == 55) { timethreshold = 2; return; } } ``` UART、シリアルから数字を打ち込むことで描画します。 コマンドはこんな感じで。 | コマンド | 内容 | |:---:|:---| | 0 | 非点灯 | | 1 | 点灯 | | 2 | 描画位置リセット | | 3 | 一番明るい設定 | | 7 | 一番暗い設定 | コマンド送るたびに描画位置はひとつづつずれ、勝手に改行していく感じで。 明るさの設定は、各行に電圧加えた後の待機時間を調整することで実現してます。 コマンド例は、こんな感じ。 ``` 520000000000000000100000000110001011111110100110101000000001000110000000000000000010000000011111001111111010010010100000000110010000000000000000000111111011111110100010000100100001111110001110000000000000000000111111100000000000011100000000001111111000000000 ``` コレをArduinoのシリアルモニタに、115200bpsで貼り付けると、無事に動作しますよ、うふふ。 # 工夫?のメモ - ビット操作でメモリ圧縮しようとしたら、ビット操作自体時間かかってチラつく! - ほんとは非点灯時COL側は、HIGHじゃなくてHi-Zがいいっぽいけど、まあいいや - Duty弄ることで、2階調ではなく、8階調くらい作れそうだけど、リニアに変化しないので、めんどくさくなって無しに - ドライバIC使ってないので、ちょっとでも処理がモタつくと即ちらつきが!、ホントは2コアCPUとかでマルチスレッドさせたい - まあ、ちゃんと作るなら、FPGAのほうがよさそうね、、、 # らずぱいにつなげてみました まずはaptして ``` apt install python3-serial python3-pillow python3-requests ``` pythonをざっくりと。 ```python:test.py from PIL import Image, ImageFont, ImageDraw import serial import time font = ImageFont.truetype("./misaki_gothic_2nd.ttf", size=8) ser = serial.Serial('/dev/ttyUSB0', 115200, timeout=1.0) time.sleep(2) count = 0 while (True): count = count + 1 image = Image.new("1", (16,16), color=0) draw = ImageDraw.Draw(image) draw.text((0, 0), 'test', fill=(1), font=font) draw.text((0, 9), str(count), fill=(1), font=font) image = image.rotate(90) dataarray = image.tobytes() output = '2' for i in range(32): j = i + 1; data = '{:08b}'.format(ord(dataarray[i:j])) output = output + data print (output) ser.write(output.encode('utf-8')) time.sleep(1) ser.close() ``` 無事に動作しましたとさ。 ![キャプションを入力できます](https://camo.elchika.com/802fb186104ef970ecd1e4d4c98384110db5c864/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666637633237372d646465642d343333632d393736342d6162303436346433326631302f32393664623664332d303734352d346436612d616239382d373237323332386539323537/) フォントは美咲フォントを使っているので、漢字とかもいけます、テストしてないけど! 動画だと、こんな感じ!。 @[youtube](https://youtu.be/5crZLNhdkNk) # ま、活用してみます とりあえず作業場の消費電力を表示させてみたりして。 ![キャプションを入力できます](https://camo.elchika.com/0648d0853d6144dd4e00a0630f37453dc844f44f/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666637633237372d646465642d343333632d393736342d6162303436346433326631302f33646164346330312d386432322d346664332d396664322d366561616133316638313866/) 右はM5Stick版、無事に同期しとる それなりに目を引く大きさですし、スキャンさせて点灯させてるので、消費電力ま抑えられ気味。 なかなかステキなデバイスな気もします。 まあ、本来の用途は、スペアナとかっぽいけれども、気にしない!。 以上です。