前回に引き続きLLM モジュールを触ってみます。
開発環境としてArduino IDE (2.3.6)を使います。
Arduino IDE からのメッセージ送信や結果などの表示にM5Stack CoreS3 SE を使ってみます。
PCと接続
アプリケーションではllmを使った生成AIでチャットをやってみます。
元ネター>Module LLM-LLM Generative Dialoge
環境設定1
Windows側にArduino IDE をインストールしてツールを設定
インストールして起動したらメニュのファイルー>基本設定からM5Stack 開発用のボード情報などを設定します。
Arduino IDE は基本英語版なので、Language は日本語に変えておきます。
またボード情報のURLにはコピー・ペーストしてOKをクリック。
|
1 |
https://static-cdn.m5stack.com/resource/arduino/package_m5stack_index.json |
メニュのTool ->Board->Boards Manager を開いてM5Stackを検索してインストールします。
再起動して日本語表示。
再度ツールのボードマネージャーからボードとしてM5CoreS3 を選択します。
ポートは COM n (AirM2M_CORE_ESP32C3) と表示されているものを選びます。
LLM モジュールのライブラリ追加
メニュのスケッチー>ライブラリをインクルードー>ライブラリを管理を開きます。
M5ModuleLLM を検索してインストールします(依存ライブラリM5Unifiedもプロンプトに従ってインストール)。
一旦Arduino IDE は終了。
環境設定2
ここではModule LLM – LLM 生成型対話をやってみるので、それ用の設定をします。
元ネタ Module LLM – LLM Generative Dialogue
LLM モジュール側にライブラリをインストールします。
Tera Term を使います。
Tera Term のインストールに関しては前回のWindows 11からM5Stack LLM モジュール に触ってみる(1)アクセス編の
WindowsからLLM モジュールにアクセスの項を参照してください。
Tera Term は上記Arduino IDE とは違うポートで開きます(CH340 と書かれたポート
)。
メニュの設定ー>端末を開いて通信速度を115200に設定します。
CoreS3 SE のポートからUSBケーブルを抜いておきます。
LLM モジュールのType-C ポートに電源を供給するとモジュールが起動します。

llm-llm のパッケージをインストール
|
1 |
apt install llm-llm |
base model の qwen2.5-0.5B-prefill-20eをインストールします。ただ、これはaptのリポジトリにはもうないみたいなので、ダウンロードしてインストールします。
wgetで降ろしてもいいのですがモデルのサイズが大きのでLLM モジュールのそれでは時間がかかります。母艦のWindowsでダウンロードしてscpで転送した方が速いかも…..。
ダウンロード先 Download llm-model-qwen2.5-0.5B-prefill-20e
debファイルがダウンロードされます。
Windows側でターミナルを開いてダウンロード場所に移動します。
|
1 |
cd C:\Users\user\Downloads |
ip a でLLM モジュールのアドレスを調べておきます。
で、転送。
|
1 |
scp llm-model-qwen2.5-0.5B-prefill-20e_0.2-m5stack1_arm64.deb root@アドレス:/root |
転送されたローカルにあるdebをaptでインストールします。
|
1 |
apt install ./llm-model-qwen2.5-0.5B-prefill-20e_0.2-m5stack1_arm64.deb |
ところで、lib-llm は1.3だけど、1.6以上が必要ですよと言われた場合、
上と同様に1.8のdebファイルをダウンロードしてインストールします。
scpで転送してaptでインストール
|
1 2 3 |
scp lib-llm_1.8-m5stack1_arm64.deb root@アドレス:/root apt install ./lib-llm_1.8-m5stack1_arm64.deb |
ところでデフォルトのllm-llmのバージョンは1.3なのでllm-llmも1.9にアップグレードしておきます。
|
1 2 3 |
scp llm-llm_1.9-m5stack1_arm64.deb root@アドレス:/root apt install ./llm-llm_1.9-m5stack1_arm64.deb |
バージョン確認
|
1 2 3 4 5 |
dpkg -l | grep lib-llm dpkg -l | grep llm-llm dpkg -l|grep llm-model-qwen2.5-0.5b-prefill-20e |
Tera Term を終了して、LLM モジュールからケーブルを抜いて、再度CoreS3 SE のポートにケーブルを挿しておきます。
アプリケーション
Arduino IDE を再起動したらメニュー>ツールからボードとポートを再設定しておきます。
新しいスケッチに以下のようなLLM CoreS3のソースコードをコピー・ペーストします。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
/* * SPDX-FileCopyrightText: 2024 M5Stack Technology CO LTD * * SPDX-License-Identifier: MIT */ #include <Arduino.h> #include <M5Unified.h> #include <M5ModuleLLM.h> #define CommSerialPort Serial M5ModuleLLM module_llm; String llm_work_id; String received_question; bool question_ok; void setup() { M5.begin(); M5.Display.setTextSize(2); M5.Display.setTextScroll(true); /* Init usb serial */ CommSerialPort.begin(115200); /* Init module serial port */ int rxd = M5.getPin(m5::pin_name_t::port_c_rxd); int txd = M5.getPin(m5::pin_name_t::port_c_txd); Serial2.begin(115200, SERIAL_8N1, rxd, txd); /* Init module */ module_llm.begin(&Serial2); /* Make sure module is connected */ M5.Display.printf(">> Check ModuleLLM connection..\n"); while (1) { if (module_llm.checkConnection()) { break; } } /* Reset ModuleLLM */ M5.Display.printf(">> Reset ModuleLLM..\n"); module_llm.sys.reset(); /* Setup LLM module and save returned work id */ M5.Display.printf(">> Setup llm..\n"); m5_module_llm::ApiLlmSetupConfig_t llm_config; llm_config.max_token_len = 1023; llm_config.setParam("enable_temperature", true); llm_config.setParam("temperature", 0.7f); llm_config.setParam("enable_top_p_sampling", true); llm_config.setParam("top_p", 0.9f); llm_config.setParam("enable_top_k_sampling", true); llm_config.setParam("top_k", 50); llm_config.setParam("enable_repetition_penalty", true); llm_config.setParam("repetition_penalty", 1.05f); llm_config.setParam("penalty_window", 20); llm_work_id = module_llm.llm.setup(llm_config); M5.Display.printf(">> Setup finish\n"); M5.Display.printf(">> Try send your question via usb serial port\n"); M5.Display.setTextColor(TFT_GREEN); M5.Display.printf("e.g. \nHi, What's your name?\n"); M5.Display.printf("(end with CRLF \\r\\n)\n\n"); } void loop() { /* Check comm serial port and get received question */ question_ok = false; if (CommSerialPort.available()) { while (CommSerialPort.available()) { char in_char = (char)CommSerialPort.read(); received_question += in_char; /* Check if question finish */ if (received_question.endsWith("\r\n")) { received_question.remove(received_question.length() - 2); question_ok = true; break; } } } /* If question is ready */ if (question_ok) { M5.Display.setTextColor(TFT_GREEN); M5.Display.printf("<< %s\n", received_question.c_str()); M5.Display.setTextColor(TFT_YELLOW); M5.Display.printf(">> "); CommSerialPort.printf("<< \"%s\"\n", received_question.c_str()); CommSerialPort.print(">> "); /* Push question to LLM module and wait inference result */ module_llm.llm.inferenceAndWaitResult(llm_work_id, received_question.c_str(), [](String& result) { /* Show result on screen and usb serial */ M5.Display.printf("%s", result.c_str()); CommSerialPort.print(result); }); /* Clear for next question */ received_question.clear(); M5.Display.println(); CommSerialPort.println(); } delay(20); } |
矢印ボタンをクリックして書き込みます。
コンパイル後、CoreS3 SEにデプロイされます。
CoreS3 SE 側
Arduino IDE からチャットを開始するために、シリアルモニターを開きます。
設定で改行とボーレート(115200)をこのように選択。
メッセージ欄に例えば「How are you ? 」と入れてリターン。これでメッセージがシリアル通信でCoreS3に送られます。
メッセージはLLM モジュールで処理されチャットの内容が推論されて表示されます。
この程度のQ&A ならかなり高速にやりとりされています。
Appendix
今回はCoreS3 SE を使っていますが、Gray でもできます(もう販売終了になってますから中古市場にしかありませんけど)。
Arduino IDE の変更点は以下の2点。
ボード情報は「M5Core 」、ポートは「Silicon Labs CP210x USB to UART Bridge」
Next
Gray のバッテリをスタックすれば、単体で起動します。Grayのバッテリは110mAh程度なのであまり持ちません。なお、M5Stack のType-Cポートから充電することができます。
CoreS3 SEの電源系ボタンはPowerとResetの2ケ所あります。
どちらかを6秒ほど長押しすると電源が切れるのですが、もう一方から起動することはできないようです。電源は切ったボタンからのみ起動もできます。
ところで、外部からメッセージを受信する方法は?Wi-Fi?
Google のAIが教えてくれました。
M5Stackに外部から文字列を送信するには、USBシリアル通信、Wi-Fi、またはBluetooth通信を利用します。PCから文字列を送信する場合は、M5Stackのプログラムで該当する通信手段(Serial.print()、WiFiClient、BluetoothSerialなど)を呼び出し、送信された文字列を受け取って表示または処理させます。
……だそうです。
関連ページ
Windows 11からM5Stack LLM モジュール に触ってみる(1)アクセス編
Windows 11からM5Stack LLM モジュール に触ってみる(2)環境設定とアプリケーション
Windows11からM5Stack LLM モジュール に触ってみる(3)アプリケーション(TTS)
Windows11からM5Stack LLM モジュール に触ってみる(4)アプリケーション(SerialTextAssistant + TTS)
LLM モジュール のSerialTextAssistant + TTS のシリアルモニタにPythonを使ってみる






















Leave a Reply