RustのHAL(avr-hal)でシンデレラのペーパークラフトを【Leafony】でライトアップ
概要
先日、Rust LT Online #5でライトニングトーク(以下LT)しました。
この記事ではLTで言及しなかったハードウェア製作について書きます。
※2020年6月にelchikaさんのキャンペーンでLeafonyが当選しました。当選してから今までLeafonyの情報発信をしていなかったので今回記事を書こうと思いました。
ライセンス
今回使用させていただいた各種開発成果物のライセンスです。
【リーフ】とはLeafonyを構成する各種基板を指します。
名称 | ライセンス |
---|---|
IO拡張用のリーフ(AX02 29 pin)回路図 | CC-BY |
IO拡張用のリーフ(AX02 29 pin)部品配置図 | CC-BY |
avr-hal | Apache License Version 2.0 |
PC
開発用PCは次のとおりです。
確認していませんがWindows, Linuxも同様の手順でできるかと思います。
- MacBook macOS Big Sur バージョン11.6
仕様
Leafonyの電源ONでLEDを調光し、シンデレラのお城のペーパークラフトがライトアップしているように魅せます。
準備するもの
物 | 詳細 | 備考 |
---|---|---|
Leafony | Basic Kit | Basic Kitのリンク |
ペーパークラフト | DAISO製 シンデレラのお城 | ディズニーのペーパークラフト |
ポリウレタン銅線 | 0.29mm | 購入先リンク |
LED | 汎用的なもの | 購入先リンク |
カーボン抵抗 | 1kΩ | |
USBケーブル | マイクロB, タイプAの汎用的なもの | Leafonyプログラム書き込みで使用する |
ハードウェア作成手順
ペーパークラフト
DAISOさんのペーパークラフト(今回はシンデレラのお城)を購入します。
説明書通りに組み立てます。私は4時間かかりました。今回の工作で一番時間がかかりました^^;
Leafony・周辺回路
部品選定
簡単・手軽にライトアップする方法はLEDをPWM制御し調光すること、と考えました。
Leafony以外の部品はLEDと抵抗のみのシンプルな構成です。
使用するPWMピンの決定
LEDを調光するためにPWM機能のピンにLEDを接続する必要があります。
Leafonyのピン配置を参照し、次のピンに決めました。
- No=F7, Name=6, Port=PD6
https://docs.leafony.com/docs/leaf/processor/ap01/より引用
Port=PD6に決めた理由ですが兼用機能がないピンだからです。
のちのち機能追加したときに使いたい機能が既に使われてしまっている、ということがないように兼用機能がないピンを選択しました(※)。
※
前述のピン配置図を見るとPD6は兼用機能がないですがマイコンのデータシートを参照するとPD6には次の兼用機能がありました。なので使用するPWM機能ピンはどこを選択しても同じでしたね^^;
ATmega328P [DATASHEET]
Table 13-9. Port D Pins Alternate Functionsを参照。
PD6は次の兼用機能があると記載されています。
- AIN0 (analog comparator positive input)
- OC0A (Timer/Counter0 output compare match A output)
- PCINT22 (pin change interrupt 22)
リーフの選択
Leafony Basic Kitには次のリーフが同梱されています。
- Bluetooth LEモジュールのリーフ(AC02 BLE Sugar)
- センサのリーフ(AI01 4-Sensors)
- MCUのリーフ(AP01 AVR MCU)
- 電源リーフ(AV01 CR2032)
- IO拡張用のリーフ(AX02 29 pin)
- USB-シリアル変換のリーフ(AZ01 USB)
IO拡張用のリーフ(AX02 29 pin)にポリウレタン銅線をはんだづけし、抵抗・LEDを接続します。
回路
PWMピンに【No=F7, Name=6, Port=PD6】を割り当てることを決めました。
PWMピンがIO拡張用のリーフのどこに配置されているか回路図を見て探します。
IO拡張用のリーフの回路図は次のリンクにあります。
IO拡張用のリーフ回路図
No=F7はD6と関連があり、D6は【DP567】ピンと接続されていることがわかります。
LEDはGNDとも接続します。GNDは【DP587】ピンと接続されていることがわかります。
DP567、DP587の接続情報がわかったので次はピンの配置場所を部品配置図から探します。
IO拡張用のリーフ部品配置図
部品配置図からDP567の配置場所がわかりました。ここがPWM機能ピンになります。
GNDのDP587ピンの配置場所もわかりました。
はんだづけ
PWMピンの配置場所(DP567)がわかったので抵抗、LEDを接続をはんだづけします。
まずIO拡張用のリーフのDP567ピンにポリウレタン銅線をはんだづけします。
ポリウレタン銅線から抵抗⇛LEDを経由しGNDにはんだづけします。
組み立て
はんだづけが終わったらリーフを組み立てます。
今回は次のリーフを使います。
- 電源リーフ(AV01 CR2032)
- IO拡張用のリーフ(AX02 29 pin)
- MCUのリーフ(AP01 AVR MCU)
- USB-シリアル変換のリーフ(AZ01 USB)
- センサのリーフ(AI01 4-Sensors)
番号が若いリーフが下になります。リーフをスタックする順番ですが特にないと思います。
ケース(AZ66 Basic Kit Case)にマグナットがついており、電源リーフとくっつくようになっているので電源リーフは必然的に一番下になります。
1番下の電源リーフです。
電源リーフにはコイン型リチウム電池(CR2032)をセットできます。スライドスイッチONで電源供給できます。
下から2番目のIO拡張用のリーフです。
下から3番目のMCUのリーフ(AP01 AVR MCU)です。
下から4番目のUSB-シリアル変換のリーフ(AZ01 USB)です。
各リーフをプラスチック部分の機構でカチッカチッと小気味よくスタックしていきます。
全てのリーフをスタックしたら一番上のセンサリーフのネジを2箇所締めます。
ソフトウェア作成手順
開発環境構築
Leafony Bacic KitのマイコンはArduino UNOと同じAVRマイコン【ATmega328P】です。
【Rustの学習を兼ねた娘の玩具つくり】ということでRustのHAL(avr-hal)を使いプログラミングしていきます。
プログラミングの開発環境構築はこちらを参照ください。
こちらのリンクは本家avr-halのコミット(2021/4/7 885e8ec)をフォークし動作確認用に変更したものです。最新の本家avr-halだと私が確認したソースコードがコンパイルエラーになるため古いソースコードを使用しています。
Rustのインストール
nightly版コンパイラをインストール
コンパイルはnightly版を使うのでavr-hal指定のコンパイラをインストールします。
avr-halのQuickstart通りに次のコマンドを実行します。
rustup toolchain install nightly-2021-01-07
実装
今回のソースコードはこちらです。
ベースにするソースコード
Leafony Bacic KitのマイコンはArduino UNOと同じAVRマイコン【ATmega328P】と書きました。
avr-halは様々なArduinoシリーズをサポートしていますが、Arduino UNOもサポートしています。
そこでArduino UNOのサンプルコードをベースにして実装することにしました。
Arduino UNOのPWM制御のサンプルコードは次のパスに格納されています。
- avr-hal/blob/add_leafony/boards/arduino-uno/examples/uno-pwm.rs
Arduino UNOのPWM制御のサンプルコード
ベースのソースコードから変更点は次の点です。
- PWM機能ピン変更
Arduino UNOのPWM制御のサンプルコードはPWM機能ピンを【d9】で使っています。
今回はPWM機能はPD6ピン == d6を使うのでソースコードも変更します。
変更後のソースコードはこちらです。
- avr-hal/blob/add_leafony/boards/arduino-uno/examples/cinderella-castle-lightup.rs
変更後のソースコード
変更前のソースコードでは【Timer1Pwm】を使っていますが、変更後ソースコードでは【Timer0Pwm】を使っています。
変更前のPWM機能ピン【d9・PB1】はOC1A (Timer/Counter1 output compare match A output)が兼用機能です。
変更後のPWM機能ピン【d6・PD6】はOC0A (Timer/Counter0 output compare match A output)が兼用機能です。PWM機能ピンによりタイマが変わるため【Timer0Pwm】に変更しています。
「どのPWM機能ピンがどのタイマに対応しているか?」は次の資料を参照し確認しました。
コンパイル
ソースコードの変更が完了したらコンパイルします。
コンパイルはavr-halのQuickstart通りに次のコマンドを実行します。
cd boards/arduino-uno
ビルドするソースファイル【cinderella-castle-lightup.rs】をファイル拡張子なしで指定しコンパイルします。
cargo +nightly-2021-01-07 build --example cinderella-castle-lightup
コンパイルが正常終了すると次のパスに*.elfファイルが生成されます。
- target/avr-atmega328p/debug/examples/cinderella-castle-lightup.elf
プログラム書き込み
プログラム書き込みはavrdudeを使用します。
書き込みツール(avrdude)準備
avrdudeはMacの場合、次のコマンドでインストールできます
brew install avrdude
Leafony USB-シリアル変換デバイスのデバイスファイル名を調べる
LeafonyとUSBマイクロBコネクタと接続し、USBコネクタA側をPCに接続します。
LeafonyのUSB-シリアル変換デバイスのファイル名を調べておきます。
ls /dev/cu.usb*
私の環境の場合、次のファイル名となりました。
/dev/cu.usbserial-AH07FVYA
書き込みコマンド実行
次のコマンドを実行しLeafonyにプログラムを書き込みます。
avrdude -patmega328p -carduino -P/dev/cu.usbserial-AH07FVYA -b57600 -D -U flash:w:/Users/k-abe/avr_rust/avr-hal_fork_add_leafony/target/avr-atmega328p/debug/examples/cinderella-castle-lightup.elf:e
次のパラメータは環境に合わせて正しく設定してください。
-
/dev/cu.usbserial-AH07FVYA
USB-シリアル変換デバイスのデバイスファイル名 -
/Users/k-abe/avr_rust/avr-hal_fork_add_leafony/target/avr-atmega328p/debug/examples/cinderella-castle-lightup.elf
*.elfファイルのパス
書き込みが正常に終了していればOKです。
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.01s
avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: reading input file "/Users/k-abe/avr_rust/avr-hal_fork_add_leafony/target/avr-atmega328p/debug/examples/cinderella-castle-lightup.elf"
avrdude: writing flash (664 bytes):
Writing | ################################################## | 100% 0.38s
avrdude: 664 bytes of flash written
avrdude: verifying flash memory against /Users/k-abe/avr_rust/avr-hal_fork_add_leafony/target/avr-atmega328p/debug/examples/cinderella-castle-lightup.elf:
avrdude: load data flash data from input file /Users/k-abe/avr_rust/avr-hal_fork_add_leafony/target/avr-atmega328p/debug/examples/cinderella-castle-lightup.elf:
avrdude: input file /Users/k-abe/avr_rust/avr-hal_fork_add_leafony/target/avr-atmega328p/debug/examples/cinderella-castle-lightup.elf contains 664 bytes
avrdude: reading on-chip flash data:
Reading | ################################################## | 100% 0.32s
avrdude: verifying ...
avrdude: 664 bytes of flash verified
avrdude: safemode: Fuses OK (E:00, H:00, L:00)
avrdude done. Thank you.
動作確認
Leafonyの電源供給は次の2つの方法があります。
- USBケーブルで動作確認
- スタンドアロンで動作確認
実際の使用シーンではUSBケーブルは使わないと思うのでスタンドアロンで動作確認する方法を書きます。
電源リーフにコイン型リチウム電池CR2032をセットし、スイッチを矢印の方向にスライドします。
Leafonyに電源が供給されLEDの調光が始まります。
LEDが点灯し始めたらLEDをシンデレラペーパークラフトのタワーの中に入れます。
シンデレラ城のペーパークラフトのライトアップが完成です!!!
次の図は少し暗い場所にシンデレラ城のペーパークラフトを置いたときの写真です。
感想
次は個人的な感想です。
Leafonyに関して
- 小型なLeafonyは様々なシーン・電子工作で活用できそう。
- ハードウェア、ソフトウェアは全てGitHubで公開されておりすぐに必要な情報にアクセスできるのが良い。リーフを自作できる可能性もある。
- Leafony Basic KitはBluetooth、4センサ、電源、IO拡張と拡張性のあるリーフで構成されている。IoTエッジデバイスのプラットフォームとして重宝しそう。
- リーフをスタックする機構、ケースが付属しているなどハードウェア構造の面でも魅力を感じる。
avr-halに関して
- avr-halを使えばRustでAVRマイコンをそれほど手間をかけずに動かすことができた。
- 今回はLeafonyのAVRマイコンをavr-halで動かした。avr-halはArduino UNOをはじめ少しリッチなArduinoシリーズ(Mega 2560)に対応しているのが良い。
- avr-halはマイコンの周辺機能を制御するサンプルプログラムがあり、すぐにRustで組込みプログラミングを体験できる。
- avr-hal×Arduinoで組込みRustプログラミング開発体験は如何ですか?
以上、長文を最後まで読んでいただきありがとうございました。
投稿者の人気記事
-
k_abe
さんが
2021/12/06
に
編集
をしました。
(メッセージ: 初版)
-
k_abe
さんが
2021/12/07
に
編集
をしました。
(メッセージ: 記事の種類、ライセンスを設定)
ログインしてコメントを投稿する