k_abeのアイコン画像
k_abe 2021年12月06日作成 (2021年12月07日更新) © Apache-2.0
製作品 製作品 Lチカ Lチカ 閲覧数 976
k_abe 2021年12月06日作成 (2021年12月07日更新) © Apache-2.0 製作品 製作品 Lチカ Lチカ 閲覧数 976

RustのHAL(avr-hal)でシンデレラのペーパークラフトを【Leafony】でライトアップ

概要

先日、Rust LT Online #5でライトニングトーク(以下LT)しました。

この記事ではLTで言及しなかったハードウェア製作について書きます。
※2020年6月にelchikaさんのキャンペーンでLeafonyが当選しました。当選してから今までLeafonyの情報発信をしていなかったので今回記事を書こうと思いました。

ライセンス

今回使用させていただいた各種開発成果物のライセンスです。
リーフ】とはLeafonyを構成する各種基板を指します。

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

マイコンのリーフ(AP1 AVR MCU)のピン配置
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には次のリーフが同梱されています。

  1. Bluetooth LEモジュールのリーフ(AC02 BLE Sugar)
  2. センサのリーフ(AI01 4-Sensors)
  3. MCUのリーフ(AP01 AVR MCU)
  4. 電源リーフ(AV01 CR2032)
  5. IO拡張用のリーフ(AX02 29 pin)
  6. 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ピンにポリウレタン銅線をはんだづけします。

IO拡張用のリーフへのはんだづけ

ポリウレタン銅線から抵抗⇛LEDを経由しGNDにはんだづけします。

はんだづけ完成図

組み立て

はんだづけが終わったらリーフを組み立てます。
今回は次のリーフを使います。

  1. 電源リーフ(AV01 CR2032)
  2. IO拡張用のリーフ(AX02 29 pin)
  3. MCUのリーフ(AP01 AVR MCU)
  4. USB-シリアル変換のリーフ(AZ01 USB)
  5. センサのリーフ(AI01 4-Sensors)

番号が若いリーフが下になります。リーフをスタックする順番ですが特にないと思います。
ケース(AZ66 Basic Kit Case)にマグナットがついており、電源リーフとくっつくようになっているので電源リーフは必然的に一番下になります。

ケースの写真

1番下の電源リーフです。
電源リーフにはコイン型リチウム電池(CR2032)をセットできます。スライドスイッチONで電源供給できます。
電源リーフ(AV01 CR2032)の写真

基板の下の金具に電池をセットします。
電源リーフ(横)の写真

下から2番目のIO拡張用のリーフです。

IO拡張用のリーフ(AX02 29 pin)

下から3番目のMCUのリーフ(AP01 AVR MCU)です。
MCUのリーフ(AP01 AVR MCU)

下から4番目のUSB-シリアル変換のリーフ(AZ01 USB)です。
USB-シリアル変換のリーフ(AZ01 USB)

下から5番目のセンサのリーフです。
センサのリーフ(AI01 4-Sensors)

各リーフをプラスチック部分の機構でカチッカチッと小気味よくスタックしていきます。
リーフをスタックした写真

全てのリーフをスタックしたら一番上のセンサリーフのネジを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制御のサンプルコードは次のパスに格納されています。

ベースのソースコードから変更点は次の点です。

  1. PWM機能ピン変更
    Arduino UNOのPWM制御のサンプルコードはPWM機能ピンを【d9】で使っています。
    今回はPWM機能はPD6ピン == d6を使うのでソースコードも変更します。
    変更後のソースコードはこちらです。

変更前のソースコードでは【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つの方法があります。

  1. USBケーブルで動作確認
  2. スタンドアロンで動作確認

実際の使用シーンではUSBケーブルは使わないと思うのでスタンドアロンで動作確認する方法を書きます。
電源リーフにコイン型リチウム電池CR2032をセットし、スイッチを矢印の方向にスライドします。
Leafonyに電源が供給されLEDの調光が始まります。

スタンドアロン動作設定

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のアイコン画像
組込みソフトウェアエンジニア。 技術バックボーンはC言語・ベアメタル。 よろしくお願いします。 Twitter: @juraruming LAPRASポートフォリオ: https://lapras.com/public/k-abe
  • k_abe さんが 2021/12/06 に 編集 をしました。 (メッセージ: 初版)
  • k_abe さんが 2021/12/07 に 編集 をしました。 (メッセージ: 記事の種類、ライセンスを設定)
ログインしてコメントを投稿する