2025年9月29日月曜日
スライドパズルをデザインする
2025年9月27日土曜日
SPIFFSからLittleFSへのプログラム変換
SPIFFSが非推奨となり、今度はLittleFSに移行していきます。
この時に、今まで作成してきたプログラムをLittleFSに対応させるためには、SPIFFSクラスの命令をすべて置き換える必要があります。ありがたいことに、SPIFFSの命令は、LitteleFSになっても、クラス名を変えるだけでそのまま利用できます。
SPIFFSのサンプルをLittleFSに対応させる
#include "FS.h" #define LITTLEFS on #ifdef LITTLEFS //LITTLEFSが定義されている時実行 #include "LittleFS.h" #define SPIFFS LittleFS #else //LITTLEFSが定義されてない時 #include "SPIFFS.h" #endif /* You only need to format SPIFFS the first time you run a test or else use the SPIFFS plugin to create a partition https://github.com/me-no-dev/arduino-esp32fs-plugin */ #define FORMAT_SPIFFS_IF_FAILED true
LittleFSに対応させるプログラム変更
#include "LittleFS.h" #define SPIFFS LittleFS
2025年9月25日木曜日
LEDマトリックス表示装置の設計・製作 5(完成)
表示画面設計
ケース設計
ハイパーテキストによる表示の拡張
_yb長野県_pw松本市_wb _aoZK.Lab._s5JIMA_wk _wgESP32S3_s2 _wkUSB_wkから_wk表示_wk
LEDマトリックス表示装置の設計・製作 4(漢字表示)
LEDマトリックスに漢字を表示させるようにします。ドットマトリックスのため、漢字のフォントもドットタイプが必要です。このフォントとして、BDF形式(Bitmap Distribution Format)フォントデータがあります。
mgo-tec様のサイトを参考にしました。
東雲フォントを使い、ESP32用にライブラリ化した「ESP32_SPIFFS_ShinonomeFNT」です。ESP32マイコンには、SPIFFSという内部メモリを利用したファイルシステムがあります。ここにフォントデータを入れておき、読みだして利用するものです。
最近のArduinoIDEの環境では、同じ内部のフラッシュメモリにアクセスする「SPIFFS」が非推奨となり、より高速(2~3倍高速)な「LittleFS」に移行しつつあるようです。上記のライブラリも少し改造することで「LittleFS」を使ったアクセスに変更することができます。
SPIFFSからLittleFSへの変更点
プログラムでLittleFSに変更するには、「SPIFFS.begin()」を「LittleFS.begin()」、「SPIFFS.open()」を「LittleFS.open()」の様に行うことで対応できます。(インクルードも変更します)
今回の実行プログラムは、オリジナルのSPIFFSのまま実行させていきます。
東雲フォントをシリアルモニタに表示させる
(1)準備
#include <ESP32_SPIFFS_ShinonomeFNT.h< //ver beta 1.32
const char* UTF8SJIS_file = </Utf8Sjis.tbl<; //UTF8 Shift_JIS 変換テーブルファイル名を記載しておく
const char* Shino_Zen_Font_file = </shnmk16.bdf<; //全角フォントファイル名を定義
const char* Shino_Half_Font_file = </shnm8x16.bdf<; //半角フォントファイル名を定義
ESP32_SPIFFS_ShinonomeFNT SFR;
#define DISPLINEMAX 16
uint8_t msg_buf[44][16] = {0};
uint16_t msg_data[22][DISPLINEMAX] = {0};
uint16_t msg_sj_length;
void displayFontData( int len ) {
// フォントを表示
for (int c = 0; c < len; c = c + 1 ) {
for (int i = 0; i < DISPLINEMAX; i = i + 1 ) {
Serial.printf("%04x : ", msg_data[c][i] );
for (int j = 15; j >= 0; j--) {
if ( ( msg_data[c][i] & (1 << j) ) != 0 ) {
Serial.printf("*");
} else {
Serial.printf(".");
}
}
Serial.printf("\n");
}
Serial.printf("\n");
}
}
String message="本日は晴天なり";
void setup() {
Serial.begin(115200);
//フォントファイル(SPIFFS)オープン
SFR.SPIFFS_Shinonome_Init3F(UTF8SJIS_file, Shino_Half_Font_file, Shino_Zen_Font_file); //ライブラリ初期化。2ファイル同時に開く
// 漢字フォント取得
msg_sj_length = SFR.StrDirect_ShinoFNT_readALL( message, msg_buf );
// フォントデータを16bitデータに変換
for(int xx=0; xx<message.length()/3; xx++){
for(int yy=0; yy<16; yy++){
msg_data[ xx ][ yy ] = ( msg_buf[ xx * 2 ][ yy ] << 8 ) | msg_buf[ xx * 2 + 1 ][ yy ];
}
for(int yy=16; yy< DISPLINEMAX; yy++){
msg_data[ xx ][ yy ] = 0;
}
}
Serial.println( message );
// フォントを表示
displayFontData( message.length()/3 );
}
void loop() {
}
(2)SPIFFSにファイルを転送
(3)実行結果の確認
表示するメッセージはプログラムの31行目の「本日は晴天なり」表示します。シリアルモニタを確認すると、フォントファイルを処理後に、BDFフォントの16進データとそのビットデータを表示させています。
右の図では、「本」の文字がビットデータになっている様子が分かります。
このデータをLEDマトリックスに表示すると、漢字が表示できるようになります。
LEDマトリックスに漢字を表示
Yahoo! RSSから情報を得る
LEDマトリックス表示装置の設計・製作 3(WiFi・NTP)
WiFiとNTP
WiFi設定の課題と解決策
WiFi設定ファイルの構造
WiFi設定ファイルを読み込む方法
esp32s3_USB_Driveの改造
#include <WiFi.h> char ssid[30], pass[30];
static void file_operations(void)
{
const char *file_path = "/usb/wifi.txt";
FILE *f;
ESP_LOGI(TAG, "Reading file");
f = fopen(file_path, "r");
if (f == NULL) {
ESP_LOGE(TAG, "Failed to open file for reading");
return;
}
char line[64];
int ptr;
// 読み込んだデータをSSIDに格納
char *pos;
fgets( line, sizeof(line), f);
//文字列のクリア
for ( int i = 0; i < 30; i++) ssid[i] = 0;
ptr = 0;
for ( int i = 0; i < strlen(line); i++) {
if ( 0x20 <= line[i] && line[i] < 0x7f ) {
ssid[ptr] = line[i];
ptr++;
}
}
// 読み込んだデータをPASSに格納
fgets(line, sizeof(line), f);
//文字列のクリア
for ( int i = 0; i < 30; i++) pass[i] = 0;
ptr = 0;
for ( int i = 0; i < strlen(line); i++) {
if ( 0x20 <= line[i] && line[i] < 0x7f ) {
pass[ptr] = line[i];
ptr++;
}
}
fclose(f);
}
setup関数の終わりでWiFiに接続する処理
// do {
uint8_t device_address = wait_for_msc_device();
ESP_ERROR_CHECK( msc_host_install_device(device_address, &msc_device) );
msc_host_print_descriptors(msc_device);
ESP_ERROR_CHECK( msc_host_get_device_info(msc_device, &info) );
print_device_info(&info);
ESP_ERROR_CHECK( msc_host_vfs_register(msc_device, "/usb", &mount_config, &vfs_handle) );
//while (!wait_for_event(DEVICE_DISCONNECTED, 200)) {
file_operations();
//}
// xEventGroupClearBits(usb_flags, READY_TO_UNINSTALL);
// ESP_ERROR_CHECK( msc_host_vfs_unregister(vfs_handle) );
// ESP_ERROR_CHECK( msc_host_uninstall_device(msc_device) );
// } while (gpio_get_level(USB_DISCONNECT_PIN) != 0);
// ESP_LOGI(TAG, "Uninitializing USB ...");
// ESP_ERROR_CHECK( msc_host_uninstall() );
// wait_for_event(READY_TO_UNINSTALL, portMAX_DELAY);
// ESP_ERROR_CHECK( usb_host_uninstall() );
// ESP_LOGI(TAG, "Done");
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi OK.");
esp32s3_USB_Driveを改良して分かったこと
event = xEventGroupWaitBits(usb_flags, DEVICE_CONNECTED | DEVICE_ADDRESS_MASK, pdTRUE, pdFALSE, portMAX_DELAY);
LEDマトリックス表示装置の製作 2(基板製作と表示テスト)
基板の半田付け
基板の半田付けを行い、制御基板が完成しました。左側が制御基板で、右側がESP32S3 DevkitCマイコンです。
サンプルプログラムの実行
コネクタHUB75のライブラリをインストールします。
ライブラリ「ESP32-HUB75-MatrixPanel-I2S-DMA」
このライブラリにはダブルバッファ機能があり、この機能でちらつきを抑止できます。
サンプルプログラム「1_SimpleTestShapes」を実行します。
しかし、このままでは接続しているポートが違うため、合わせる必要があります。
ポート定義を追加します。
// setting Port #define PIN_R1 4 #define PIN_G1 5 #define PIN_B1 6 #define PIN_R2 7 #define PIN_G2 15 #define PIN_B2 16 #define PIN_A 8 #define PIN_B 18 #define PIN_C 10 #define PIN_D 9 #define PIN_E -1 #define PIN_CLK 12 #define PIN_LAT 11 #define PIN_OE 13
次にポート定義を有効にするために、設定のプログラムを追加します。 (既に定義済みの部分の3行目から8行目をコメントアウトします)
void setup() {
// Module configuration
// HUB75_I2S_CFG mxconfig(
// PANEL_RES_X, // module width
// PANEL_RES_Y, // module height
// PANEL_CHAIN // Chain length
// );
HUB75_I2S_CFG mxconfig;
mxconfig.gpio.r1 = PIN_R1;
mxconfig.gpio.g1 = PIN_G1;
mxconfig.gpio.b1 = PIN_B1;
mxconfig.gpio.r2 = PIN_R2;
mxconfig.gpio.g2 = PIN_G2;
mxconfig.gpio.b2 = PIN_B2;
mxconfig.gpio.a = PIN_A;
mxconfig.gpio.b = PIN_B;
mxconfig.gpio.c = PIN_C;
mxconfig.gpio.d = PIN_D;
mxconfig.gpio.e = PIN_E;
mxconfig.gpio.lat = PIN_LAT;
mxconfig.gpio.oe = PIN_OE;
mxconfig.gpio.clk = PIN_CLK;
mxconfig.clkphase = false;
//mxconfig.gpio.e = 18;
//mxconfig.clkphase = false;
//mxconfig.driver = HUB75_I2S_CFG::FM6126A;
// Display Setup
dma_display = new MatrixPanel_I2S_DMA(mxconfig);
dma_display->begin();変更後にプログラムを書き込みます。
LEDマトリックス表示装置の設計 1(回路設計)
設計構想
回路設計
アクリルイルミネーション
電子工作とアクリル加工を組み合わせて、イルミネーションを製作しました。
回路図とプログラム
クリスマスバージョン
2025年9月23日火曜日
ESP32S3-DevKitCマイコンでUSBメモリにアクセス
ESP32S3 USB Driveがヒットした
実行すると動いた
static void file_operations(void)
{
const char *directory = "/usb/esp";
const char *file_path = "/usb/esp/test.txt";
struct stat s = {0};
bool directory_exists = stat(directory, &s) == 0;
また「ESP_LOGI」関数を使用して、ログ出力をしているので、
ESP_LOGI(TAG, "Read from file: '%s'", line);
立体迷路(ものづくりキットNo.2)
迷路を3Dプリンタで造形し、立体迷路に仕上げました。キットシリーズの第2弾です。
現在、サンプルとして配布して不具合などの検証をしているところです。
[Know-How]
(1)迷路をEXCELで作図する。
(2)Fusion360(3DCAD)で3Dデータの作成
DXF形式でデータを挿入して、押し出しをして3D化します。その後、底面を追加すると、迷路が完成します。
上のEXCELデータと比較してみてください。
(迷路の幅や壁の厚さは、EXCEL側で設定しています)
ビー玉ガチャキット(オリジナルキット)
子供たちが楽しく「ものづくり」できる機会を作ろうと、組み立てて遊ぶ「ビー玉ガチャキット」を設計・開発しました(出来上がってから半年ほど経過していますが...)。
ドライバ(プラス)1本で組み立てができるオリジナルキットで、透明なアクリルを使い、内部が見えて、ガチャの仕組みを知ることができるキットです。サイズも約10cm x 10cm x 10cmで大き過ぎず、インテリアの一部として置いておくこともできます。
サンプルを地元の小学生に製作して頂いたところ小学生高学年であれば、約30~1時間程度で製作できます(ただし、ネジの締め付けが弱い時には、大人が手助けしてください)。
YouTubeで製作の様子の動画を公開しています。 https://youtu.be/dkUn8Dyoi8E
このキットは販売をしております。購入を希望される方は「メルカリ」、「ラクマ」に商品と出品しております。ブログをはじめました。
ブログをはじめました。
日々、「ものづくり」をテーマにして取り組んでいます。ものづくりの記録をするために始めました。
投稿するテーマは、「電子工作(マイコン制御系)」、「3Dデザイン(CAD)」が主なテーマです。
これまでものづくりすることが中心で、ホームページやブログなどは後回しにしてきました。しかし、いろいろなノウハウを知って頂くためもあり、これまでの内容も含めて公開をし始めます。
また、ものづくりをテーマにした「キット開発」や「講習会」などを行うにあたり、団体名を「ZK Lab JIMA」とネーミングして活動をし始めました。ZK(ずく)は長野県の方言です。「精を出して」、「やる気」という意味で使われます。
やる気や根気を出して取り組む姿勢は大切なことです。そして自分が作成したもので遊ぶことはうれしくもあり、楽しいものです。特に子供たちに、「ずく」を出して、ものづくりの楽しさを味わって欲しいと願っております。
LEDマトリックス表示装置の設計・製作 9(画像表示)
LEDマトリックスに画像を表示させるには、いろいろな画像形式を知る必要があります。現在、よく使われるJPG形式やPNG形式は圧縮処理されて保存されています。これに対して、BMP形式やTIFF形式は非圧縮形式で、画像データがそのまま保存されています。このため、ファイルは大きくな...
-
制御対象の動作確認(LED) 基板が完成したので、それぞれの制御対象が動作するかを確認します。プログラムはスケッチの例の「Blink」を基にしています。ポート番号の定義を変えて動作を確認します。 setup内の4行目から7行目に記述しているところがリセットボタンを「シームレス...
-
CH32V003マイコンの入手 だんだんと半導体の高騰する中で、何か安価で使えるマイコンは無いかと探していたところ、1月中旬頃、某中華サイトでCH32V003マイコンが1個100円程度で販売されていることを見て、注文しました。2月19日に届き、Arduino環境構築と簡単なL...
-
設計コンセプト 制御学習用のボードを設計するにあたり、次の点を考慮しています。 ・基本となるLED、スイッチ制御を組み入れる。 ・「光る」、「音が鳴る」、「動く」の動作を入れる。 ・制御学習が終わったら、ボードが無駄にならないようにする。 2項目の「動く」はモータなどが...





























