2025年9月29日月曜日

スライドパズルをデザインする

 皆さんは、スライドパズルをご存じでしょうか。

 パズルのピースをスライドして、番号を揃えるパズルです。よく販売されているパズルは、ピースが外れるためなくなることもあり、なくなるとパズルができなくなります。

 そこで、3DCADで設計して、3Dプリンタで作成しようとするテーマです。

3Dプリンタの45度のルール

 いろいろなデザインを設計する中で、45度のルールというものをつかみました。3Dプリンタは、下から造形するため、右図のようにフィラメントを積み上げる下に何かパーツがないと積み上がりません。サポートを付けるのも一つですが、造形に時間がかかるため、できればサポート無しで作りたいものです。
 何度か試していると、角度が45度であれば、サポート無しで造形できることが分かりました(あとで調べると「3Dプリントにおける45度の法則とサポート」というサイトを見つけました)。
 このルールを使い、スライドピースが外れないスライドパズルを設計しました。

パズルピースのCAD設計

 まず、パズルピースの設計です。造形角度が45度として設計します。(角度を90度に近づけすぎるとピースが外れてしまいます。)

 横V字(<形)形にすることで、中のピースを両サイドのピースで支えるようになり、ピースが外れなくなります。
 ピースを並べると、スライドパズル部分が出来上がります。この時に、ピース間をどの程度にするかが、3Dプリンタで調整が必要です。
 私は、Bambu社のA1miniを使っています。ピース間を0.2mmで設計しています。例えば、小さいと横のピースとくっ付いてしまいます。大きいとピースが外れます。

パズルのケース(外形)のCAD設計

 パズルピースが出来上がったら、ピースを囲むように外形を作成します。
 右図では、3×3サイズのパズルです。
 1つのピースを1cm角とすると、外形が約4cmとなります。

 ただ遊ぶだけでなく、ストラップを付けてキーホルダーになるようにしています。
 このため、市販されているスライドパズルでは、右下(一番大きい数字の部分)が空きとなっています。しかし、右下であると揃っているときに重力でピースがずれてしまいますので、左上を空きとしています。

パズルのデザイン

 現在までの設計では図などが無いために、パズルにはなりません。そこでパズルの上に画像を載せてパズル化します。

 時期なのでハロウィンをデザインしました。画像はJPEGやPNGです。
 Fusionに取り込むために、SVG形式などに変換して、取り込みます。

 取り込んだら位置を合わせて、「押し出し」をします。
(0.5mm程度押し出しをしました。)



 ここまま造形すると、画像で載せた層がつながっているため、パズルピースも表面でつながってしまいます。
 これを右図のように、ピース間の溝に合わせて、切り取りをします。




 出来上がった3Dデータが次の画像です。












3Dデータが出来上がったので、さっそく造形してみます。
 
 

 ハロウィンに合わせて、オレンジ色と黒色で造形しました。

 ストラップを付けて完成です。




 はじめに、ピースに力を加えると動くようになります。
 ゲーム途中は、図のようになります。

2025年9月27日土曜日

SPIFFSからLittleFSへのプログラム変換

  SPIFFSが非推奨となり、今度はLittleFSに移行していきます。

 この時に、今まで作成してきたプログラムをLittleFSに対応させるためには、SPIFFSクラスの命令をすべて置き換える必要があります。ありがたいことに、SPIFFSの命令は、LitteleFSになっても、クラス名を変えるだけでそのまま利用できます。


SPIFFSのサンプルをLittleFSに対応させる

 プログラムの大きな変更をすることなく、LittleFSに対応させることを想定してブログアップしています。SPIFFSのサンプルプログラム「SPIFFS_Test」をもとにして、LittleFSに対応させる変更点です。

 
 まず、そのまま「SPIFFS_Test」を実行します。
 実行結果が右図です。下線部分はSPIFFSに1MBを書き込む時間と読み込む時間を表しています。

 書き込み 約37秒
 読み出し 約0.5秒


 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

 3行目から9行目が追加した部分です。「#ifndef」 のディレクティを使い、「LITTLEFS」が定義されているときは5行目でLittleFSをインクルードし、6行目でプログラム中の「SPIFFS」を「LittleFS」に置き換えるように#defineにて定義しています。


 実行結果が右図です。プログラムをLittleFS対応に変更しましたので、下線部分はLittleFSに1MBを書き込む時間と読み込む時間を表しています。

 書き込み 約5秒
 読み出し 約0.2秒



 これの2つの実行結果を比較すると、LittleFSの方が書き込みで約7倍、読み込みで約2倍速いことが確認できます。

 この変更したプログラムでは、SPIFFSとLittleFSの両方に対応しており、3行目の「#define」文をコメントアウトすると、SPIFFS対応になります。

LittleFSに対応させるプログラム変更

 SPIFFSからLittleFSに変更するとき、プログラム中の「#include "SPIFFS.h"」の1行を次の2行に置き換えます。

#include "LittleFS.h"
#define SPIFFS LittleFS
 これだけの変更で、LittleFS対応となります。

2025年9月25日木曜日

LEDマトリックス表示装置の設計・製作 5(完成)

 表示画面設計

 今までのプログラムライブラリをまとめて、完成を目指します。

 まず、画面設計です。横64×縦32ドットの画面を大きく2つに分けます。
 上部は時刻表示するエリア(縦15ドット)、下部はメッセージを表示するエリア(縦17ドット)です。
 図の右側の「次の文字挿入エリア」は、文字をスクロールしていったときに、1文字がスクロールアウトした場合に、次の文字を入れるワークエリアとなります。プログラムでは、このエリアも含めてスクロールさせます。

 漢字フォントは16×16ドットですが、拡張させた表示を行うために、1ドット多くしています。

 普通に文字を表示すると、右図の左側になります。これを縦横1ドットずつずらして、重ねるように表示すると、影文字が出来上がります。
 これで、見栄えのする文字表示ができます。


ケース設計

 ケースはFusion360により設計を行い、3Dプリンタで造形しました。

 持っている3Dプリンタの最大造形サイズが、128×128mmのため長辺は分割して、ネジにて接続するようにしています。


メッセージボード完成

 メッセージボードが完成しました。動作状況の動画をアップします。

 USBを認識しているときには、USBメモリからデータを読み込み、表示させています。


 USBが接続されていなく、WiFiに接続されているときには、「Yahoo!!ニュース」を表示するようになっています。

ハイパーテキストによる表示の拡張

 影文字を表示するときに、テキスト内にハイパーテキストを組み入れ、表示色指定をしています。USBメモリに書き込んであるデータです。
_yb長野県_pw松本市_wb
_aoZK.Lab._s5JIMA_wk
_wgESP32S3_s2 _wkUSB_wkから_wk表示_wk
 このように「_(アンダーバー)」に続く2文字で、表示色や一時停止を操作しています。
例えば、「_ob」は文字色がオレンジ(orange)色、影文字が青(blue)色という設定です。また、「_s5」は一時停止(stop)で、そのあとに続く数字で停止時間が決まります。「5」の時は、5×0.2秒=1秒間停止します。

ここまで見て頂きありがとうございました。

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()」を「Litt​​leFS.begin()」、「SPIFFS.open()」を「Litt​​leFS.open()」の様に行うことで対応できます。(インクルードも変更します)

 今回の実行プログラムは、オリジナルのSPIFFSのまま実行させていきます。


東雲フォントをシリアルモニタに表示させる

 ライブラリ「ESP32_SPIFFS_ShinonomeFNT」を利用するときに、一緒にライブラリ「 ESP32_SPIFFS_UTF8toSJIS」も必要です。これは漢字データ(UTF-8)からフォントを取得するときに、S-JISコード(ShiftJIS)で参照するためです。

(1)準備

 次のプログラムを書き込みます。書き込む前に、SPIFFSに書き込むデータが約1.5MBあるため、コンパイルの設定をSPIFFSが2MB以上とれるようにしてから書き込みます。


#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にファイルを転送

 次のファイルをSPIFFSに転送しておく。
  shnmk16.bdf
  shnm8x16.bdf (※shnm8x16r.bdfのファイル名を変更しておく)
  Utf8Sjis.tbl

(3)実行結果の確認

 表示するメッセージはプログラムの31行目の「本日は晴天なり」表示します。

 シリアルモニタを確認すると、フォントファイルを処理後に、BDFフォントの16進データとそのビットデータを表示させています。

 右の図では、「本」の文字がビットデータになっている様子が分かります。

 このデータをLEDマトリックスに表示すると、漢字が表示できるようになります。


LEDマトリックスに漢字を表示

 以前に使った、ライブラリ「ESP32-HUB75-MatrixPanel-I2S-DMA」を組み込み、「drawPixel」関数で表示させました。

 漢字が16x16ドットのため、横に4文字表示できます。表示では「本日は晴天なり」の4文字分が表示されています。





Yahoo! RSSから情報を得る

 ニュースサイトとして、よく見られるサイトの一つがYahoo!! Japanでしょうか。
ニュースの情報は、RSSとして閲覧できます。こちらも、多くの方が実験しておりますので、プログラムなどを得られるのではないでしょうか。

以上で、メッセージボードを構築するプログラムライブラリが揃いました。

LEDマトリックス表示装置の設計・製作 3(WiFi・NTP)

 WiFiとNTP

 WiFiとNTPから時間を取得するプログラムは、インターネットから容易に取得できるので、取得して、実行します(この時WiFiのSSIDとPasswordは環境に合わせます)。

 実行結果が右図です。
 WiFiに接続後に、NTPサーバより時間を取得して、1秒ごとに時間を表示しています。




WiFi設定の課題と解決策

 WiFiは便利に使え、FreeWiFiも増えてきています。タブレットやノートPCでは、簡単にWiFiへの接続設定ができますが、マイコンではプログラム中にSSIDとPASSを書き込んでいます。WiFi環境が変わると接続できなくなり、プログラムを書き換えるしかありません。
 この課題は先駆者たちが、WiFiに接続できないときにタブレットと連携して設定する仕組み(WiFi Manager)などを開発しています。

 今回はUSBメモリが利用できるため、以前に紹介した「esp32s3_USB_Drive-main.zip」を使います。USBメモリにWiFi設定ファイルを作成しておき、このファイルを読み込んでWiFi設定をします。

WiFi設定ファイルの構造

 WiFi設定ファイルはメモ帳などで作成できます。
 ただし、文字コードに注意が必要です。近年は、UTFコードが標準になりつつあります。

 WiFi設定ファイルを右図のように作成します。





 名前を付けて保存するときに、ファイル名の下に、エンコードタイプとあります。ここでコードタイプを設定できるのですが、UTF-8に「UTF-8」と「UTF-8(BOM付き)」の2種類あります。
 ここでBOM(Byte Order Mark)は、ファイル形式がUTF-8コードであることを示すため、3バイト「EF BB BF」(16進数)が先頭に付加されるものです。
 これをUSBメモリに保存して、ESP32マイコンから読み込むと、本来「mySSID」の文字列が「???mySSID」のようになってしまいます。このSSIDとPasswordを使ってWiFiに接続しても接続できません。

WiFi設定ファイルを読み込む方法

 SSIDに設定する文字は「ASCIIコード(7ビット)」です。このことから制御コード(00H~1FH、7FH)を除いたコード 20H~7EHの文字を有効な文字として処理します。これによりUTF-8のBOMは除外(削除処理)されることになります。
 この処理はプログラムで処理します。

esp32s3_USB_Driveの改造

 USBメモリを読み込む「esp32s3_USB_Drive」にWiFiに接続する機能を追加します。

 プログラムの先頭で、WiFiに関する定義を追加
#include <WiFi.h>
char ssid[30], pass[30];

 file_operations関数を変更
  読み込むファイルは「/usb/wifi.txt」
  不要なコードを取り除く処理。
 
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に接続する処理

 このサンプルは、外部入力スイッチを押すと、USBメモリを取り外す処理をしています。今回スイッチ処理は使わないため、不要な部分をコメントアウトしました。
 
//  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.");

 これで実行させ、USBメモリを認識すると、WiFi接続が完了します。
 また、NTPサーバに接続して、時間表示させるプログラムも追加してm動作させました。






esp32s3_USB_Driveを改良して分かったこと

 USB Driveのサンプルプログラムは、ソースコードを見てわかるように、FreeRTOSを利用し、割り込みにより処理をしています。
 このサンプルでは、USBメモリを認識するまで、処理が進まず待ち続けます。しかし、常にUSBメモリが接続されているわけでなく、処理によってはUSBメモリがない時には、次の処理に移りたい時があります。
 解析の結果、この場合には次の場所を変えることで、一定時間、USBを認識しないと次の処理に移行するように変更できます。

wait_for_msc_device関数内を変更
 プログラムの行末のパラメータ「portMAX_DELAY」のままであると、無制限に待ちます。これを「3000」に変更すると、3秒(3000mS)待ち、ループを抜けるようになります。

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マトリックスに文字が表示され、表示するプログラムの動作を確認することができました。

LEDマトリックス表示装置の設計 1(回路設計)

設計構想

 
 ESP32S3マイコン(DevKitC)の機能から、インターネット接続とUSBメモリへのアクセスが可能です。





 そこで、右のような設計構想をしました。
  ・LEDマトリックス64x32ドットを表示させる。
  ・USBメモリの情報をLEDマトリックスに表示させたい。
  ・時計機能を持たせたい。RTC(リアルタイムクロック)を実装して
   電源が切れても時間を保持したい。
  ・インターネットに接続しているので、NTPにより、時間を取得したい。
  ・YahooRSSに接続して、Yahooニュースを表示したい。

回路設計

 以前にESP32マイコンを使って、メッセージボードを製作したことがあるために、回路設計をして、基板発注しました。
 回路図(クリックするとPDFが開きます)を示します。
 
 LEDマトリックスとの接続はHUB75規格

 USBコネクタ(タイプAメス) USB接続用

 RTC(リアルタイムクロック) RX8900
 バックアップ用 電気2重層コンデンサ1F(逆流防止ダイオードと急速充電防止抵抗)

 この他に、スイッチ、可変抵抗接続を想定したピンヘッダを接続


 KiCAD7でPCBで設計をしました。その後、JLCに基板発注して、基板が出来上がってきました。



アクリルイルミネーション

 電子工作とアクリル加工を組み合わせて、イルミネーションを製作しました。


 1年ほど前に、製作したものもとにして、この時期ならではの「ハロウィン」をデザインしたものです。




 2色に輝いているように見えます。
 これはマイコン内蔵のフルカラーLED「WS2812」を使い、2列に並べています。

 このLED上に、3mmのアクリルを3枚載せています。スリットを入れたアクリルが、LEDの上にくるようにします。
 すると、LEDの発光により、違う色に光ります。

回路図とプログラム

 回路図(PDF)を掲載します。ロータリースイッチで点灯させるパターンを変化できるようにしています。
 マイコンはPIC12F1822を使用しています。使用しているメモリ(RAM)を最大限利用しているため、マイクロチップのXC8コンパイラのバージョン(Freeモード)により、コンパイルできないバージョンもあります。
使用しているのは、「Microchip MPLAB XC8 C Compiler V2.32」です。
プログラムは、こちらから閲覧してください。

クリスマスバージョン

 
 イルミネーションのデザインをクリスマスにしたものです。表示色も緑と赤にして、クリスマスを演出しています。

 LEDの発色パターンは、9パターンあります。


2025年9月23日火曜日

ESP32S3-DevKitCマイコンでUSBメモリにアクセス

 今までSDカードにはアクセスできましたが、USBメモリには対応できていません。
SDカードの方がSPI接続で手軽なのでしょう。SDカードは、アダプタが必要などUSBメモリほど手軽ではありません。

 ESP32S3-DevKitCマイコンが登場し、今までのESP32マイコンにはなかったUSBデバイスへのアクセスする端子が追加されました。

 確かに、 Espressif Systems社のサイトのブロック図を見ると、ESP32S3に「USB Port」が接続できるようになりました。

 今まで、USBメモリを制御用マイコンに接続して利用できるものはほどんどありません。
 そこで、USB端子を利用するもので調べると、HIDとして、キーボード、マウスにするなどはあるのですが、USB MSC(USB Mass Storage Class)として利用できるものは見当たりません。

ESP32S3 USB Driveがヒットした


 ある時、「esp32s3_USB_Drive-main.zip」がヒットしました。

動作環境はArduinoIDE1.8.19で動作させています。

 USB32S3マイコンにUSBコネクタ(Aタイプメス)を回路図のように接続して、サンプルプログラムを書き込みました。(電源+5Vは外部より供給しています)


実行すると動いた

 
 実行して、USBメモリを挿入すると、シリアルモニタに、右のようなメッセージが表示されました。
 メーカ:SanDisk
 容量:256MB

 認識されていることが確認できました。

ソースコードを見ると、
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);

ArduinoIDEの設定を次のように

 「Core Debug level:」を「info」にします。
 
変更して書き込み直します。

 

 早速、実行させシリアルモニタを確認すると、


 USBを挿入するとデバイスが認識され、書き込んだデータ「Hello World!」と表示されることが分かります。



 USBメモリを外し、パソコンで確認すると、

 フォルダ「esp」が作成され、そのフォルダ内に「test.txt」が出来上がっています。






 これを使うと、データのやり取りが簡単にできるようになりそうです。



立体迷路(ものづくりキットNo.2)

 迷路を3Dプリンタで造形し、立体迷路に仕上げました。キットシリーズの第2弾です。

現在、サンプルとして配布して不具合などの検証をしているところです。

立体迷路(完成写真)

[Know-How]

(1)迷路をEXCELで作図する。



 EXCEL VBAを使い、迷路を作図します。迷路サイズを設定することで、いろいろな大きさの迷路が出来上がります。

 迷路が出来上がったら、CADに挿入するため、VBAによりDXF形式でデータを保存します。

 DXFで出力するマクロはVectorより、「Excel→DXF変換マクロ」を使っています。




(2)Fusion360(3DCAD)で3Dデータの作成

 DXF形式でデータを挿入して、押し出しをして3D化します。その後、底面を追加すると、迷路が完成します。

 上のEXCELデータと比較してみてください。

(迷路の幅や壁の厚さは、EXCEL側で設定しています)



ビー玉ガチャキット(オリジナルキット)

子供たちが楽しく「ものづくり」できる機会を作ろうと、組み立てて遊ぶ「ビー玉ガチャキット」を設計・開発しました(出来上がってから半年ほど経過していますが...)。

ドライバ(プラス)1本で組み立てができるオリジナルキットで、透明なアクリルを使い、内部が見えて、ガチャの仕組みを知ることができるキットです。サイズも約10cm x 10cm x 10cmで大き過ぎず、インテリアの一部として置いておくこともできます。

サンプルを地元の小学生に製作して頂いたところ小学生高学年であれば、約30~1時間程度で製作できます(ただし、ネジの締め付けが弱い時には、大人が手助けしてください)。

YouTubeで製作の様子の動画を公開しています。 https://youtu.be/dkUn8Dyoi8E

 完成した写真

 キットの状態の写真


 このキットは販売をしております。購入を希望される方は「メルカリ」、「ラクマ」に商品と出品しております。
 また、Maker Faireなどに参加した折には、販売が可能な場合に、会場で購入可能です。この時には、送料、梱包材、出品手数料がかかりませんので、少し安く購入できます。



ブログをはじめました。

ブログをはじめました。

 日々、「ものづくり」をテーマにして取り組んでいます。ものづくりの記録をするために始めました。

 投稿するテーマは、「電子工作(マイコン制御系)」、「3Dデザイン(CAD)」が主なテーマです。

 これまでものづくりすることが中心で、ホームページやブログなどは後回しにしてきました。しかし、いろいろなノウハウを知って頂くためもあり、これまでの内容も含めて公開をし始めます。

 また、ものづくりをテーマにした「キット開発」や「講習会」などを行うにあたり、団体名を「ZK Lab JIMA」とネーミングして活動をし始めました。

 ZK(ずく)は長野県の方言です。「精を出して」、「やる気」という意味で使われます。

 やる気や根気を出して取り組む姿勢は大切なことです。そして自分が作成したもので遊ぶことはうれしくもあり、楽しいものです。特に子供たちに、「ずく」を出して、ものづくりの楽しさを味わって欲しいと願っております。


LEDマトリックス表示装置の設計・製作 9(画像表示)

  LEDマトリックスに画像を表示させるには、いろいろな画像形式を知る必要があります。現在、よく使われるJPG形式やPNG形式は圧縮処理されて保存されています。これに対して、BMP形式やTIFF形式は非圧縮形式で、画像データがそのまま保存されています。このため、ファイルは大きくな...