XODで作るArduino用カスタムLCDメニュー 〜コーディング不要の視覚的プログラミング〜
概要
XOD(視覚的プログラミング環境)を用いて、Arduino UNOとDFRobot LCDキーパッドシールド(16×2文字LCD+5方向キー)で動作するメニューシステムをノーコードで構築するプロジェクトです。メニューツリーの定義からキー入力デコード、画面表示、外部出力制御までをパッチ(ノードグラフ)として組み立て、C++コードを書かずに階層メニューを実現します。
システム構成
メニューコントローラー部
- アナログ入力ノード:シールドのキーパッド(A0接続)から電圧を読取
- キーデコードノード:電圧レベルを上/下/左/右/セレクトのパルストリガーに変換(デバウンス調整可)
- メニューコントローラーノード:トリガーを受け取りメニュー階層のナビゲーション・選択状態を管理。外部パラメータ(ポテンショメーター等)の入力ポートを持ち、リーフメニュー選択時にパラメータ変更パルスを出力
- LCD表示ノード:XOD標準の16×2 LCDノード(他の表示デバイスにも置換可)
メニューツリー部
以下の3ノードを組み合わせてツリーを構築:
- Branch(分岐):子メニューを持つ中間ノード。入力ポートで上位から接続、出力ポートで子グループへ
- Leaf(葉):最終アクション。パラメータ変更パルスと「Invoke」パルスを出力
- Concat(連結):複数の子メニューをまとめてBranch入力へ接続
サブサブメニュー等、メモリ許す限り階層を深くできます。スプラッシュスクリーン用の文字列入力ポートも用意。
出力部
各Leafの「Invoke」パルスをフリップフロップ経由でデジタル出力ピンに接続し、リレーやLEDのON/OFFを制御。パラメータ値はBufferノードで保持し、他ノードへ展開可能。
既知の課題と回避策
- Branchノードが最低1つ必要(コンパイルエラー回避)
- 「トップメニューへ戻る」機能未実装
- 4行表示対応はメニューコントローラー側のみ(Leaf側未対応)
- 定数文字列がRAMを消費するため、長文メニューではフラッシュメモリ格納用の専用ノード(
flash-string)を用意。ノード内のC++コードを直接編集して文字列を書き込む運用 - ID入力ポートは未使用(将来的に階層内位置表示用に拡張予定)
第2例:パラメータ入力・保存・表示のデモ
カウンターノードの値をメニューコントローラーのパラメータ入力に接続し、Leaf「A」選択時に現在値をBufferへ保存。Buffer出力を1行目に、カウンター現在値を2行目に表示する構成。外部アナログ入力や内部演算結果など、任意の数値をメニューから設定・保存する汎用パターンを示しています。
ライブラリとファイル
- XODライブラリ:
bitrex/xod-menu-system(XOD IDEの「File → Add Libraries」から追加) - パッチファイル:
xodmenusystemrev1_1_4-1-19_fLVYrcSgbX.xodball(XOD IDEで直接オープン)
今後の展望
ARM系ボードでの動作検証、入出力ノードタイプの拡充、コンパイル時メタプログラミングによるフラッシュ格納の自動化などで、更なる低メモリ化と汎用性向上を目指します。
製造プロセス
- ArduinoだけでDTMFデコーダーを構築 – 外付けIC不要
- Arduinoで作るモニター用Ambilightシステム:没入感アップの自作ガイド
- Arduinoで超音波レベーション(浮遊)装置を自作:ステップバイステップガイド
- Arduino UNOで作るLCDアニメーション&ゲーム入門
- Arduinoとスマホで作るスマート電圧計 – 簡単DIYプロジェクト
- ArduinoとMAX30100で作るリアルタイムIoT心拍数モニター
- Arduino UNO WiFi Webサーバー:ブラウザからLEDをON/OFF制御
- スマート駐車場カウンター:Arduino、Processing、PHPでリアルタイム車両管理
- Arduinoで自動化するChrome恐竜ゲーム – LDRとPythonで障害物を検知してジャンプ
- Arduino NanoとRDA5807Mで作るコンパクトFMラジオ
- ワイヤレスArduinoプログラミングシールド – HC-05 BluetoothでUSBケーブル不要に