ファームウェアと制御コード
EcoCONNECTはカスタムモジュール(firmware/pico2/)を追加した MicroPythonと制御コード(firmware/main/)で動作します。
ここではカスタムモジュールや制御コードのインストール方法を紹介します。
カスタムモジュールのインストール
Pico2用にリリースされているuf2イメージのパワーマネージメント機能を高めるため、EcoCONNECTでは、カスタムモジュールを組み込んだMicroPythonを使用しています。
コンパイル済みのイメージをインストール
すぐに実行したい場合には、コンパイル済みのカスタムイメージをダウンロードして使用します。
- AuraLinc Communityのリポジトリにある
firmware/pico2/releaseからファームウェア(ecoconnect-pico2.uf2)をダウンロードする。 - USBケーブルを使用して、メインボードのUSBポート(MicroUSB)とPCを、メインボードのPico2上にある
BOOTSELボタンを押しながら接続する。 - PCのファイルマネージャを開き、
RP2350フォルダが追加されたことを確認し、このフォルダにファームウェアをドラッグ&ドロップする。 - ファームウェア更新が完了するとメインボードが自動で再起動される。(PCでUSBデバイスの取り外し警告が出るがあるが無視して構わない)
- USBケーブルをPCから抜き取り、ファームウェア更新完了。
ここまででカスタマイズされたMicroPythonを動作させる準備が整いました。 続けて下にある「制御コードのインストール」に進みます。
ソースをコンパイルしたい場合(開発者向け)
ここではMicroPythonカスタムモジュールをビルドする手順を解説します。(macOS環境向け) 「コンパイル済みのイメージをインストール」した場合には、この章はスキップして構いません。
手順1: 開発ツールのインストール(macOS)
Homebrewを利用して、ビルドに必要なCMakeやARMコンパイラをインストールします。
brew update
brew install cmake ninja gcc-arm-none-eabi git pkg-config手順2: MicroPythonソースの取得と準備
MicroPythonの公式リポジトリをクローンし、サブモジュールを初期化します。
git clone --recursive https://github.com/micropython/micropython.git
cd micropython
git submodule update --init手順3: カスタムCモジュールの準備
プロジェクトルートにカスタムモジュール用のディレクトリ(例: my_module)を作成し、Cコードとビルド設定を配置します。
AuraLincのカスタムモジュールをコンパイルする場合には、firmware/pico2/auralinc_c_modulesをダウンロードし、カスタムモジュール用のディレクトリにします。
自作コードのためのサンプルとして、以下では与えられた値を2倍にして返すカスタムモジュールmy_module_double_valを定義します。
1. my_module/my_module.c
#include "py/runtime.h"
STATIC mp_obj_t my_module_double_val(mp_obj_t val_in) {
mp_int_t val = mp_obj_get_int(val_in);
return mp_obj_new_int(val * 2);
}
MP_DEFINE_CONST_FUN_OBJ_1(my_module_double_val_obj, my_module_double_val);
STATIC const mp_rom_map_elem_t my_module_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_my_module) },
{ MP_ROM_QSTR(MP_QSTR_double_val), MP_ROM_QSTR(&my_module_double_val_obj) },
};
STATIC MP_DEFINE_CONST_DICT(my_module_globals, my_module_globals_table);
const mp_obj_module_t my_module_user_module = {
.base = { &mp_type_module },
.globals = (mp_obj_dict_t*)&my_module_globals,
};
MP_REGISTER_MODULE(MP_QSTR_my_module, my_module_user_module);2. my_module/micropython.cmake
add_library(usermod_my_module INTERFACE)
target_sources(usermod_my_module INTERFACE
${CMAKE_CURRENT_LIST_DIR}/my_module.c
)
target_include_directories(usermod_my_module INTERFACE
${CMAKE_CURRENT_LIST_DIR}
)手順4: ビルドの実行
ports/rp2 に移動し、CMakeを使ってビルドを行います。
cd ports/rp2
make submodules
mkdir -p build-pico2
cd build-pico2
# 絶対パスまたは相対パスで USERMOD_DIR を指定
cmake -DPICO_PLATFORM=rp2350 -DBOARD=RPI_PICO2 -DUSERMOD_DIR=../../my_module ..
make -j$(sysctl -n hw.ncpu)ビルド完了後、build-pico2/firmware.uf2 ファイルが生成されていることを確認します。
手順5: カスタムファームウェアの書き込み
- ブートモード: メインボードのRaspberry Pi Pico 2にある BOOTSEL ボタンを押しながらPCのUSBポートに接続します。
- 転送: マウントされた「RP2350」ドライブに、
firmware.uf2をドラッグ&ドロップします(自動的に再起動します)。 - REPL確認:
mpremoteなどのシリアルツールで接続し、モジュールを検証します。
pip install mpremote
mpremote connect /dev/cu.usbmodem*REPL上で次を実行して 84 が返れば成功です。 これで、カスタムモジュールmy_module_double_valが実行できるファームウェアのできあがりです。
>>> import my_module
>>> my_module.double_val(42)
84制御コードのインストール
カスタムモジュール(auralinc_c_modules)が組み込まれているファームウェアを書き込んだら、センサーデータを送信する制御コードをインストールします。
手順1: 制御コードの準備
まず、firmware/mainフォルダから以下のファイルをダウンロードします。
main.pyhal_hardware.pydevice.json.example
今回のLoRaWANの通信では、deveui, appeui, appkeyを使用します。
deveuiは購入したLoRaWANモジュールに固有のものです。購入時の添付されてきた紙などを確認します。
appeui, appkeyはThe Things Networkに繋げてみようで設定しますので、リンク先を参照してそれぞれの値を取得します。
3つすべての値が揃ったらdevice.json.exampleに書き込み、ファイル名をdevice.jsonに変更して保存します。
手順2: 制御コードの実行
メインボードをPCに接続し、先のmain.py、 hal_hardware.py、device.json.exampleをマウントされたドライブ「RP2350」にコピーします。
コピーが完了したらメインボードをPCから取り外します。 メインボードは電源スイッチが入ると同時に、main.pyを実行しデータ送信を開始します。