k_abe が 2021年12月06日01時04分15秒 に編集
初版
タイトルの変更
RustのHAL(avr-hal)でシンデレラのペーパークラフトを【Leafony】でライトアップ
タグの変更
Leafony
Rust
avr-hal
本文の変更
# 概要 先日、[Rust LT Online #5](https://rust.connpass.com/event/228732/)でライトニングトーク(以下LT)しました。 - LT資料:[RustのHAL(avr-hal)で電子工作~シンデレラペーパークラフトをライトアップ〜](https://speakerdeck.com/grace2riku/rustfalsehal-avr-hal-dedian-zi-gong-zuo-sindererapepakurahutoworaitoatupu) この記事ではLTで言及しなかったハードウェア製作について書きます。 ※2020年6月にelchikaさんのキャンペーンでLeafonyが当選しました。当選してから今までLeafonyの情報発信をしていなかったので今回記事を書こうと思いました。 # ライセンス 今回使用させていただいた各種開発成果物のライセンスです。 【**リーフ**】とはLeafonyを構成する各種基板を指します。 |名称|ライセンス| |:---:|:---:| |[IO拡張用のリーフ(AX02 29 pin)回路図](https://github.com/Leafony/HW-Design-Files/blob/master/AX02_29pin/AX02_29pin_Schematic.pdf)|[CC-BY](https://github.com/Leafony/HW-Design-Files)| |[IO拡張用のリーフ(AX02 29 pin)部品配置図](https://github.com/Leafony/HW-Design-Files/blob/master/AX02_29pin/AX02_29pin_ComponentMarking.pdf)|[CC-BY](https://github.com/Leafony/HW-Design-Files)| |[avr-hal](https://github.com/Rahix/avr-hal)|[Apache License Version 2.0](https://github.com/Rahix/avr-hal/blob/main/LICENSE-APACHE)| # PC 開発用PCは次のとおりです。 確認していませんがWindows, Linuxも同様の手順でできるかと思います。 - MacBook macOS Big Sur バージョン11.6 # 仕様 Leafonyの電源ONでLEDを調光し、シンデレラのお城のペーパークラフトがライトアップしているように魅せます。 # 準備するもの |物|詳細|備考| |:---:|:---:|:---:| |Leafony|Basic Kit|[Basic Kitのリンク](https://docs.leafony.com/docs/products/basic/)| |ペーパークラフト|DAISO製 シンデレラのお城|[ディズニーのペーパークラフト](https://www.instagram.com/p/ByjRgy4HJf_/)| |ポリウレタン銅線|0.29mm|[購入先リンク](https://akizukidenshi.com/catalog/g/gP-09583/)| |LED|汎用的なもの|[購入先リンク](https://akizukidenshi.com/catalog/g/gI-11578/)| |カーボン抵抗|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/より引用](https://docs.leafony.com/docs/leaf/processor/ap01/) Port=PD6に決めた理由ですが兼用機能がないピンだからです。 のちのち機能追加したときに使いたい機能が既に使われてしまっている、ということがないように兼用機能がないピンを選択しました(※)。 ※ 前述のピン配置図を見るとPD6は兼用機能がないですがマイコンのデータシートを参照するとPD6には次の兼用機能がありました。なので使用するPWM機能ピンはどこを選択しても同じでしたね^^; [ATmega328P [DATASHEET]](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf) 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](https://docs.leafony.com/docs/products/basic/)には次のリーフが同梱されています。 1. [Bluetooth LEモジュールのリーフ(AC02 BLE Sugar)](https://docs.leafony.com/docs/leaf/communication/ac02/) 2. [センサのリーフ(AI01 4-Sensors)](https://docs.leafony.com/docs/leaf/io/ai01/) 3. [MCUのリーフ(AP01 AVR MCU)](https://docs.leafony.com/docs/leaf/processor/ap01/) 4. [電源リーフ(AV01 CR2032)](https://docs.leafony.com/docs/leaf/power/av01/) 5. [IO拡張用のリーフ(AX02 29 pin)](https://docs.leafony.com/docs/leaf/extension/ax02/) 6. [USB-シリアル変換のリーフ(AZ01 USB)](https://docs.leafony.com/docs/leaf/others/az01/) IO拡張用のリーフ(AX02 29 pin)にポリウレタン銅線をはんだづけし、抵抗・LEDを接続します。 ### 回路 PWMピンに【No=F7, Name=6, Port=PD6】を割り当てることを決めました。 PWMピンがIO拡張用のリーフのどこに配置されているか回路図を見て探します。 IO拡張用のリーフの回路図は次のリンクにあります。 [IO拡張用のリーフ回路図](https://github.com/Leafony/HW-Design-Files/blob/master/AX02_29pin/AX02_29pin_Schematic.pdf) No=F7はD6と関連があり、D6は【DP567】ピンと接続されていることがわかります。 LEDはGNDとも接続します。GNDは【DP587】ピンと接続されていることがわかります。 DP567、DP587の接続情報がわかったので次はピンの配置場所を部品配置図から探します。 [IO拡張用のリーフ部品配置図](https://github.com/Leafony/HW-Design-Files/blob/master/AX02_29pin/AX02_29pin_ComponentMarking.pdf) 部品配置図からDP567の配置場所がわかりました。ここがPWM機能ピンになります。 GNDのDP587ピンの配置場所もわかりました。 ## はんだづけ PWMピンの配置場所(DP567)がわかったので抵抗、LEDを接続をはんだづけします。 まずIO拡張用のリーフのDP567ピンにポリウレタン銅線をはんだづけします。  ポリウレタン銅線から抵抗⇛LEDを経由しGNDにはんだづけします。  ## 組み立て はんだづけが終わったらリーフを組み立てます。 今回は次のリーフを使います。 1. [電源リーフ(AV01 CR2032)](https://docs.leafony.com/docs/leaf/power/av01/) 2. [IO拡張用のリーフ(AX02 29 pin)](https://docs.leafony.com/docs/leaf/extension/ax02/) 3. [MCUのリーフ(AP01 AVR MCU)](https://docs.leafony.com/docs/leaf/processor/ap01/) 4. [USB-シリアル変換のリーフ(AZ01 USB)](https://docs.leafony.com/docs/leaf/others/az01/) 5. [センサのリーフ(AI01 4-Sensors)](https://docs.leafony.com/docs/leaf/io/ai01/) 番号が若いリーフが下になります。リーフをスタックする順番ですが特にないと思います。 [ケース(AZ66 Basic Kit Case)](https://docs.leafony.com/docs/leaf/others/az66/)にマグナットがついており、電源リーフとくっつくようになっているので電源リーフは必然的に一番下になります。  1番下の電源リーフです。 電源リーフにはコイン型リチウム電池(CR2032)をセットできます。スライドスイッチONで電源供給できます。  基板の下の金具に電池をセットします。  下から2番目のIO拡張用のリーフです。  下から3番目のMCUのリーフ(AP01 AVR MCU)です。  下から4番目のUSB-シリアル変換のリーフ(AZ01 USB)です。  下から5番目のセンサのリーフです。  各リーフをプラスチック部分の機構でカチッカチッと小気味よくスタックしていきます。  全てのリーフをスタックしたら一番上のセンサリーフのネジを2箇所締めます。  # ソフトウェア作成手順 ## 開発環境構築 Leafony Bacic KitのマイコンはArduino UNOと同じAVRマイコン【**ATmega328P**】です。 【Rustの学習を兼ねた娘の玩具つくり】ということでRustのHAL(avr-hal)を使いプログラミングしていきます。 - [avr-hal](https://github.com/Rahix/avr-hal) プログラミングの開発環境構築はこちらを参照ください。 - [開発環境構築](https://github.com/grace2riku/avr-hal/tree/add_leafony) こちらのリンクは本家avr-halのコミット(2021/4/7 885e8ec)をフォークし動作確認用に変更したものです。最新の本家avr-halだと私が確認したソースコードがコンパイルエラーになるため古いソースコードを使用しています。 ### Rustのインストール - [Rustのインストール](https://www.rust-lang.org/tools/install) ### nightly版コンパイラをインストール コンパイルはnightly版を使うのでavr-hal指定のコンパイラをインストールします。 [avr-halのQuickstart](https://github.com/grace2riku/avr-hal/tree/add_leafony)通りに次のコマンドを実行します。 ```nightly版コンパイラをインストール rustup toolchain install nightly-2021-01-07 ``` ## 実装 今回のソースコードはこちらです。 - [ソースコード ブランチ名:add_leafony](https://github.com/grace2riku/avr-hal/tree/add_leafony) ### ベースにするソースコード 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制御のサンプルコード](https://github.com/grace2riku/avr-hal/blob/add_leafony/boards/arduino-uno/examples/uno-pwm.rs) ベースのソースコードから変更点は次の点です。 1. PWM機能ピン変更 Arduino UNOのPWM制御のサンプルコードはPWM機能ピンを【d9】で使っています。 今回はPWM機能はPD6ピン == d6を使うのでソースコードも変更します。 変更後のソースコードはこちらです。 - avr-hal/blob/add_leafony/boards/arduino-uno/examples/cinderella-castle-lightup.rs [変更後のソースコード](https://github.com/grace2riku/avr-hal/blob/add_leafony/boards/arduino-uno/examples/cinderella-castle-lightup.rs) 変更前のソースコードでは【Timer**1**Pwm】を使っていますが、変更後ソースコードでは【Timer**0**Pwm】を使っています。 変更前のPWM機能ピン【d9・PB1】はOC**1**A (Timer/Counter**1** output compare match A output)が兼用機能です。 変更後のPWM機能ピン【d6・PD6】はOC**0**A (Timer/Counter**0** output compare match A output)が兼用機能です。PWM機能ピンによりタイマが変わるため【Timer**0**Pwm】に変更しています。 「どのPWM機能ピンがどのタイマに対応しているか?」は次の資料を参照し確認しました。 - [Arduino UNO ピン配置図](https://www.circuito.io/blog/arduino-uno-pinout/) - [ATmega328P [DATASHEET]](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf) ## コンパイル ソースコードの変更が完了したらコンパイルします。 コンパイルは[avr-halのQuickstart](https://github.com/grace2riku/avr-hal/tree/add_leafony)通りに次のコマンドを実行します。 ```コンパイルするディレクトリに移動する 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の場合、次のコマンドでインストールできます ```avrdudeのインストールコマンド(Mac) brew install avrdude ``` ## Leafony USB-シリアル変換デバイスのデバイスファイル名を調べる LeafonyとUSBマイクロBコネクタと接続し、USBコネクタA側をPCに接続します。 LeafonyのUSB-シリアル変換デバイスのファイル名を調べておきます。 ```LeafonyのUSB-シリアル変換デバイスのファイル名を調べる ls /dev/cu.usb* ``` 私の環境の場合、次のファイル名となりました。 ``` /dev/cu.usbserial-AH07FVYA ``` ## 書き込みコマンド実行 次のコマンドを実行しLeafonyにプログラムを書き込みます。 ```avrdude書き込みコマンド 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書き込みコマンドの結果表示 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つの方法があります。 1. USBケーブルで動作確認 2. スタンドアロンで動作確認 実際の使用シーンでは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プログラミング開発体験は如何ですか? 以上、長文を最後まで読んでいただきありがとうございました。