HUB75 LEDアレイの表示画像を任意に変更できるようにした

固定した画像ファイルを選択するだけではイマイチだから、webサーバー(ラズパイzero)にブラウザ経由で任意の画像をアップロードして、サーバー側で画像の圧縮処理、rgb抽出を行いTCPでラズピコに送信して表示させるようにした

構成はwebアプリをgolangで作成し、ラズピコ側のコードも対応して変更、途中でデータロスはできないからUDPはあり得なくてTCPは前提

コード生成はPerplexityが無償でもgolangでは使えるコードが出てくるので活用、多分コードの生産性からいったら倍以上にはなる

<web application code>

https://github.com/chateight/golang/tree/master/image

<raspberry pi pico code>

https://github.com/chateight/hub75_led_array_image_upload/tree/main

ラズパイzeroでの実行速度は150KBぐらいのイメージファイルでLEDアレイに表示されるまで2秒ちょっとといったところ(Wi-Fi転送は過去の経験で1MB/secは出るからほぼイメージ処理の時間)だけど実用的には問題ないレベル

ラズピコ側でTCP通信するのにどうやるのかを検索してもイマイチだったので、それもPerplexityからの回答で、主要なコードを抜き出すとこんな感じ、

void setup(){
  IPAddress staticIP(192, 168, 1, 200); 
  IPAddress gateway(192, 168, 1, 1);
  IPAddress subnet(255, 255, 255, 0);

  WiFi.config(staticIP, gateway, subnet);

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println("Connecting to WiFi...");
  }
  server.begin();
}

void loop() {
  client = server.accept(); // TCP start
  // if network is active
  if (client) {
    while (client.connected()) {
      if (client.available()) {
        // receive binary data
        int bytesRead = 0;
        unsigned long startTime = millis();
        
        // Read all available data within a 500ms window
        while (client.available() && (millis() - startTime < 500) && bytesRead < MAX_BUFFER) { 
      receivedData[bytesRead] = client.read(); 
      bytesRead++; 
     }
        
        // response to the server
        const char* response = "Resp from Pico W!";
        client.write(response, strlen(response));
      }
  }

今更ながらコード作成でもLLMはもはや必需品で、用途ごとに要求されるものが違うからそれは人間社会と同じかもしれない

 

admin

 

 

Arduino言語でのHUB75 LEDアレイ制御の一応の完成形

基本の表示機能の作成から、

https://isehara-3lv.sakura.ne.jp/blog/2024/12/16/hub75パネルを動かしてみた/

① 画像イメージ情報を3パターン用意

② LED駆動用にUSBの口が二つあるACアダプタ(二つで3Aの容量)用意してラズピコのケーブルも接続できるようにして物としてのまとまりをよくする

USB – DCプラグケーブル購入して、ジャックは見繕って加工してつないだ

③ M5Stackをコントローラーにして3パターンの画像切り替えと表示オフ機能を持たせた

ラズピコとM5Stackのコードと、LEDアレイとラズピコ接続回路図は以下のリンクから、

https://github.com/chateight/hub75_led_array_drive

Arduino言語ではこれでほぼ終わりの予定

 

admin

ラズピコ wでのマルチコアの使い方(Arduino IDE)

ラズピコはマルチコアになっていて、MicroPythonでもマルチコアを使えるけれど、実行速度考えたらArdunino言語を使った方が高速だろうから、

https://ameblo.jp/pta55/entry-12798012318.html

で見つけたやり方を参考に、Lチカアプリをマルチコア使って他のコアにメッセージを送ってみた

ここでは固定値message_sをfifoで送信していますが、受信側で使われるglobal変数はloop1のfifo受信処理で書き換えられています(最初のブレークポイントではグローバル変数の初期値999ですが、その後のブレークでは1になります(fifoバッファーのデータ有無チェックしてるのに初期値になるのは変!

https://arduino-pico.readthedocs.io/en/latest/multicore.html

には、

int rp2040.fifo.available()

Returns the number of values available to read in this core’s FIFO.

とありますが

// constants won't change. Used here to set a pin number:
const int ledPin = LED_BUILTIN;  // the number of the LED pin

// Variables will change:
int ledState = LOW;  // ledState used to set the LED

// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis = 0;  // will store last time LED was updated

// constants won't change:
const long interval = 500;  // interval at which to blink (milliseconds)

uint32_t message = 999;

void setup() {
  // set the digital pin as output:
  pinMode(ledPin, OUTPUT);
}

void setup1(){
}

void loop() {
  // here is where you'd put code that needs to be running all the time.

  // check to see if it's time to blink the LED; that is, if the difference
  // between the current time and last time you blinked the LED is bigger than
  // the interval at which you want to blink the LED.
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }

    // set the LED with the ledState of the variable:
    digitalWrite(ledPin, ledState);

    // send message via FIFO
    uint32_t message_s = 0;
    rp2040.fifo.push(message_s);
  }
}

void loop1(){
  if (rp2040.fifo.available()>0){
    message = rp2040.fifo.pop();
    message += 1;
  }
}

マルチコアの使い方は、

① コアごとの動作はsetup/setup1、loop/loop1で指定する

② コアプロセス間の通信はfifo(rp2040.fifo)を使って行う、データ幅は4バイトで長さは8らしい(ソフト的なfifoなら任意に設定できるはずなのでこれはハードレジスタ)、受信するデータはglobal変数で定義しないといけない、送信側はlocal変数でもglobal変数でも大丈夫

デバッガで動かしてみると、マルチコア動作が確認できるのと、sync.hなるファイルが自動で生成されています、これはステップイン機能(停止したポイントの関数の中も追える)ですね

 

画面を見ればわかるようにコア二個分のデバッグ情報を見ることができます

 

admin

 

Raspberry piのDebug Probeを使う(Arduino IDE)

中身はラズピコのDebug Probeを使ってみる、もう一枚ラズピコでファームインストでも良いけど、かさばらないでスマートだから専用品の方が良い

Debug Probeの公式ページは、

https://www.raspberrypi.com/documentation/microcontrollers/debug-probe.html

<動作環境>

M1 MacBook Air/Arduino IDE 2.3.3

USBケーブルはswdの場合にはどちらもダウンロードはデバッガ経由なのでターゲットは電源供給だけで問題ないそうです、実際にはどちらからのダウンロードも使うから最初からデータ転送できるケーヌルにしとけば良いと思いますが、macからの見え方は、

Arduino IDEのToolsの設定は、デバッガーポートが認識されている状態では以下のような選択と見え方です

一点ハマったのは、デバッグ用のglobeボードの捺印のあるコネクタにswd信号はつながっていない事、wでない普通のボードはつながっているのかもしれないけど(ケーブルの色はオレンジ:SWCLK、黒:GND、黄色:SWDIOに対応してます)

でPCB上のviaにピン立てて受けにしてケーブル接続

swdインターフェースがアクティブならば、オレンジと黄色のledが点灯状態になって、Arduino IDEのデバッグも機能します

P.S. 2024/12/1

デバッガーのswdコネクタの半抜け注意

何故か急に繋がらないなと思ったら、コネクタが半抜け状態、この状態では最初にorange/yellow ledが点灯してすぐに消える(エラーになる)

奥まで押し込んだら回復、

<追記:2024/12/24>

デバッグできない(一度止めるとエラー出た)ので、何かと調べるとシリアルポートの設定をこのようにしないといけなかった

% ls /dev/cu.*
/dev/cu.Bluetooth-Incoming-Port	/dev/cu.usbmodem11102
/dev/cu.ESP32			/dev/cu.usbmodem11201

となっているから、デバッグ用にシリアルポートは正しく設定しましょう、このポートはmacのリブートなどで変わるんだろうね

 

admin

ラズパイPico W(Arduino IDEで)

タイトル通りですが、picoをArduino IDEで使ってみました。

参考は以下のサイトですが、微妙にUIは異なるので想像力を駆使してセットアップ。

https://logikara.blog/raspi-pico-arduinoide/#mokuji_4

ポイントはボード追加とシリアルポートの設定だろうと思います。ボードはリンクの通りのURLから設定すれば良くて、シリアルポートの設定はUF2 Boardを選択します。

白ボタン押しUSBコネクタ挿入で外部ファイルと認識できれば、サンプルプログラムをシリアルで送信、送信完了すると切り離されてプログラムが自動スタートします。

 

Thonnyでうまく点灯しなかったLEDの動作が確認できました。

 

admin

 

Arduino IDEでM5stackを扱う

今更のメモですが、

簡易的にM5stackを扱うのにはArduino IDEが便利です、その理由はI2Cデバイスのライブラリが整っているので、わざわざライブラリを組み込む手間が省けると言うのが一番大きいし、VScodeはビルドの時にパスを通すように設定とか必要になるから。

あと、シリアルポートの出力結果を簡単にグラフ表示できると言うのもありますね。

環境のセットアップ手順は既に作成されている資料で完璧です。

https://qiita.com/hmmrjn/items/2b2da09eecffcbdbad85

USBドライバーは最近新しいバージョンになっていますが。

 

admin