カテゴリー
Raspberry Pi

Milk-V Duo用サンプル・プログラムで リモートLチカ と IoT温度計 の製作

Linux が動作する RISC-V マイコン Milk-V Duo を使って、Ethernet 対応 IoT 機器を製作してみました。低リソースで動く Bash と Python のサンプルプログラムも用意しました。

Milk-V Duoについて

Milk-V Duo は、中国 Shenzhen MilkV Technology社が開発したマイコンボードです。RISC-V マイコンを搭載し、Linux が動作します。

メモリ容量は 256 MB のものと 64 MB のものが販売されています。もちろん、RAM容量の違いにより、価格も4割くらいの差があります。そこで、本稿では、あえて容量の小さな 64MB のものを選択し、少ないリソースと不安定な OS を克服してみます。

型番マイコンRAM価格
Milk-V-Duo-64MCV1800B64 MB¥1,420
Milk-V-Duo-256MSG2002256 MB¥2,300

形状やサイズは Raspberry Pi Pico 互換なので、一部の周辺機器を流用できます。

Milk-V Duo
Milk-V Duo の形状やサイズは Raspberry Pi Pico 互換となっている(但し、4隅に穴がない)

Buildroot SDK V1

Milk-V Duo 64 MB のファームウェアには Buildroot SDK V1 を使用します。最新の V2 には対応していません。

下記の中から「milkv-duo-sd-v1.X.X.img.zip」をPCにダウンロードし、PCからマイクロSDカードに書き込みます。筆者は V1.1.4 を使用しました。

Buildroot SDK V1 :
https://github.com/milkv-duo/duo-buildroot-sdk/releases

ファームウェアは、ISOイメージファイルをZIP圧縮したものです。ISOファイルをマイクロSDカードに書き込むには、下記の balenaEtcher が分かりやすいと思います。

balenaEtcher (Windows/Mac/Linux x64/x86) :
https://etcher.balena.io/

ファームウェア書き込み後のマイクロSDカードは、Milk-V Duo のスロットに挿入します。スロットの存在が分かりにくいですが、下図を見ると分かるでしょう。

マイクロSDカードをMilk-V Duo に挿入した
ファームウェアをマイクロSDカードに書き込み、Milk-V Duo に挿入した

なお、Buildroot SDK の名称から気づいてるかもしれませんが、自分でファームウェアをビルドすることも出来ます。

専用ソフト不要! SSH接続

Milk-V Duo は、PCにUSB接続することで、ネットワークアダプタとして動作します。

Milk-V Duo をPCにUSB接続

ファームウェアを書き込んだ Milk-V Duo をPCにUSB接続すると、約1分くらいで起動し、青色のLEDが点滅します。このときPCは、USB接続のネットワークアダプタ(CDC-NCM)として Milk-V Duo を認識します。

認識されたことを確認するには、PCの「設定」→「ネットワークとインターネット」から「イーサネット」を選択します。下図の下のほうの「説明」欄に「UsbNcm Host Device」が表示されており、またIPv4アドレスがPCに割り当てられていれば動作しています。なお、「識別されていないネットワーク」「インターネットなし」と表示されますが、正しい動作なので心配ありません。

Milk-V Duo のファームウェアはCDC-NCM に対応しているので、USBでPCに接続するだけで、ネットワークアダプタとして認識する

SSHでMilk-V Duoにログイン

上図のようにPCが Milk-V Duo のUSBを認識したら、PowerShell を起動し、SSHコマンド「ssh root@192.168.42.1」と、パスワード「milkv」を入力します。Milk-V Duo 側の IPアドレスは固定値 192.168.42.1 です。

下図は Milk-V Duo への初回ログイン時の様子です。赤文字の部分を入力して下さい。

PS C:\Users\watt> ssh root@192.168.42.1
The authenticity of host '192.168.42.1 (192.168.42.1)' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.42.1' (ED25519) to the list of known hosts.
root@192.168.42.1's password: milkv
[root@milkv-duo]~#

電源を切る前にhaltコマンド

Milk-V Duo の電源を切る前には、下記の halt コマンドを実行してください。見た目はマイコンですが Linux です。いきなり電源を切るとシステムが壊れることがあります。

[root@milkv-duo]~# halt

筆者作成サンプルプログラム

Milk-V Duo 64MB 版のサンプル・プログラムを作成し、下記に公開しました。言語は Bash スクリプトと Python です。

Milk-V Duo用 サンプルプログラム :
https://git.bokunimo.com/milkv

256MB版でも動作すると思いますが、未確認です。

プログラムは手動で Milk-V Duo に転送します。zipファイルを転送する場合は scp コマンドを使用します。

PS C:\Users\watt> scp ファイル名.zip root@192.168.42.1:~/⏎

または、以下の手順でファイルの内容を転送する方法もあります。

  1. PC側で元のファイルの内容を[Ctrl]+[A]で全選択します。
  2. [Ctrl]+[C]でクリップボードにコピー(保持)します。
  3. Milk-V Duo 側(SSH接続した端末)で「cat > ファイル名⏎」を入力します。
  4. マウスの右クリックで Milk-V Duo にペーストします。
  5. クリップボードの内容の転送完了まで待ちます。
  6. [⏎]キーで末尾を改行します。
  7. [Ctrl]+[D]で転送を終了します。

他にも curl コマンドで取得する方法があります。この場合は、Milk-V Duo にEthernet端子を取り付け、インターネットに接続する必要があります。

サンプル1: リモートLチカ

はじめにLEDをリモート制御するプログラムを実行してみましょう。プログラムを起動すると、Milk-V Duo はHTTPサーバーとして動作します。下図のように、インターネットブラウザから1または0を送信し、LEDの点灯/消灯制御ができます。

インターネットブラウザから1または0を送信してLEDの点灯/消灯制御する

下図は、ブラウザから「1」を送信し、青色のLEDを点灯制御したときの様子です。

ブラウザから「1」を送信し、青色LED(写真・左)を点灯制御した

本サンプル・プログラム用のファイルは下記のとおりです。

  • ex01_led_htserv.sh:Bash版プログラム
  • ex01_led_htserv.py:Python版プログラム
    (※GPIO制御にled_ctrl.shを使用)

Bash版の場合は1つのファイルだけで動作します。Python版はGPIO制御にled_ctrl.shを使用します。同じディレクトリに保存してください。

使い方の詳細はソースコードにコメントとして記載しました。Bash版は何度かアクセスしないと応答しないことがあります。

サンプル2: IoT温度計

次は温度計です。Milk-V Duo のCPU温度からCPUによる温度上昇分の固定値を減算して表示します。仕組み上、正確な温度は測れません。マイコンやネットワーク、プログラミングなどの学習用です。こちらも、Milk-V Duo はHTTPサーバーとして動作し、取得した温度値を下図のように表示します。

Milk-V Duo のCPU温度からCPUによる温度上昇分の固定値を減算して表示する

プログラムはBash版、Python版ともに単体で動作します。Bash版で表示されないときは何度かリロードしてみてください。

  • ex02_temp_htserv.sh:Bash版プログラム
  • ex02_temp_htserv.py:Python版プログラム

サンプル3: IoT温度計 送信機

今度は温度値を送信するプログラムです。以下の2種類の方式で送信します。どちらの場合も、別途、受信側が必要です。

送信方式送信先受信
CSVxUDP方式LAN内udp_logger.py
HTTP POST方式インターネットAmbient

インターネットへの送信には後述のEthernet端子が必要です。下図は、アンビエントデーター社が運用するクラウドサービスAmbientに送信したときの一例です。

アンビエントデーター社が運用するクラウドサービスAmbientに送信したときの実験例

プログラムはBash版、Python版ともに単体で動作します。

  • ex03_temp_tx.sh:Bash版プログラム
    (※CSVxUDPの送信に udp_sender.py を使用)
  • ex03_temp_tx.py:Python版プログラム

Ethernet端子を取り付ける

LAN内やインターネットに接続するには Milk-V Duo に Ethernet 端子を取り付けます。

Milk-V Duo に Ethernet 端子を取り付けた

製作に必要なもの

必要な部品、機材は以下の通りです。

  • Milk-V Duo 64MB
  • マイクロSDカード 1GB以上
  • PCとの接続ケーブル(USB Type C)
  • パルストランス内蔵 RJ45モジュラージャック
  • 抵抗器5~10Ω 4本
  • LANケーブル、インターネット接続環境

マイクロSDカードはOSのファイルシステムとして使用します。実験用としては安価なもので問題ありません。ただし、実使用時は信頼性のある商品を使用してください。

実使用時は信頼性の高いメーカーのマイクロSDカードを使用する

パルストランス内蔵RJ45端子

Ethernet 端子には RJ45 モジュラージャック(以下RJ45端子)を使用します。RJ45端子にはパルストランス内蔵のものと内蔵していないものが売られています。パルストランス内蔵タイプであれば、抵抗器を経由して直結できます。

  • パルストランスなし:別途、パルストランスが必要
  • パルストランス内蔵:抵抗だけで直結可能

筆者は、ヒロセ電機のパルストランス内蔵モジュラージャックTM11RD-5TANA-A-88-LPを使用しました。

ヒロセ電機のパルストランス内蔵モジュラージャックTM11RD-5TANA-A-88-LP

抵抗器を半田付けする

Milk-V Duo には、Ethernet接続用に TXP、TXN、GND、RXP、RXNの5つの端子があります。このGND以外の端子に5~10Ω程度の抵抗器を半田付けします。筆者は4.7Ωを取り付けました。

Ethernet接続用の TXP、TXN、RXP、RXNに5~10Ω程度の抵抗器を半田付けする

また、RJ45端子に半田付けしやすいようにリード線の折り曲げと切断を行います。パルストランス内蔵RJ45端子のピン配列に合わせて加工してください。下図は、TM11RD-5TANA-A-88-LPの場合の加工例です。※部品によって配列が異なることがあるので、注意してください。

RJ45端子に半田付けしやすいようにリード線の折り曲げと切断を行った(本例はヒロセ電機TM11RD-5TANA-A-88-LPの場合)

RJ45端子を半田付けする

ピン配列を間違わないように、RJ45端子に半田付けします。注意点としては、マイクロSDカードの抜き差しを考慮することです。このため、下図のように基板とRJ45端子との間に若干の隙間を確保しました。

ピン配列を間違わないように、またマイクロSDカードの抜き差しの妨げにならないように、RJ45端子を半田付けした(本例はヒロセ電機TM11RD-5TANA-A-88-LPの場合)

LAN端子付きMilk-V Duoの完成例

下図は完成例です。見た目は、LAN端子付きの他社品に近いと思います。しかし、基板とRJ45端子が分離しているので、LANケーブルを接続するときなどの応力が半田付け部に加わりやすいです。ケースに固定するなど、何らかの補強が必要です。

LAN端子付きMilk-V Duoの製作例

なお、過電圧保護用のダイオードは省略しました。実験用であることと、LANケーブルを接続してから起動するので問題ないと考えました。

起動方法とIPアドレスの確認

必ず、電源を切った状態でMilk-V DuoのLAN端子にケーブルを接続してください。※動作中にLAN端子を接続するとハングアップします。

USB端子をPCに接続して電源を供給し、起動後にSSH接続し、下記のように ifconfigコマンドでIPアドレスを確認します。

PS C:\Users\watt> ssh root@192.168.42.1
root@192.168.42.1's password: milkv
[root@milkv-duo]~# ifconfig⏎
eth0      Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX
          inet addr:192.168.1.123  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: XXXX::XXXX:XXXX:XXXX:XXXX/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1

usb0      Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX
          inet addr:192.168.42.1  Bcast:192.168.42.255  Mask:255.255.255.0
          inet6 addr: XXXX::XXXX:XXXX:XXXX:XXXX/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

Milk-V DuoのLAN端子のIPアドレスは、eth0として表示されます。上図の場合、192.168.1.123が割り当てられました。環境によって異なるので、必ず自分で確認してください。次節では、確認したIPアドレスを使ってソフトを修正します。

LAN用ソフト修正

筆者が作成したサンプルプログラムは、USB接続のネットワークセグメント192.168.42.0/24に合わせてあります。Ethernet端子を使ってLANに接続する場合は、セグメントの変更が必要です。

一例として、192.168.1.0/24のネットワークに接続し、DHCPで192.168.1.123に割り当てられた場合、変数IPを以下のように変更してください。

  • 変更前:IP=’192.168.42.1‘ # 本機のIPアドレス
  • 変更後:IP=’192.168.1.123‘ # 本機のIPアドレス

また、変数udp_ipは、以下のように変更します。末尾の255はブロードキャストのアドレスなので変更しません。セグメントを示す42の部分を1に変更します(クラスCの場合)。

  • 変更前:udp_ip=”192.168.42.255″ # CSVxUDP宛先
  • 変更後:udp_ip=”192.168.1.255″ # CSVxUDP宛先

変更後のIPアドレスは一例です。割り当てられるIPアドレスは、環境によって異なるので、必ず自分の環境で確認してください。

低リソースで動かす工夫

CPUは初期の Raspberry Pi や、Raspberry Pi Zero よりも高速です(末尾・付録参照)。しかし、RAM が 64MB しかない点で、リソース不足が目立ちます。

例えば、Python や pip が実装されていますが、リソース消費の大きなモジュールは動作しません。MicroPython 用のハードウェア環境で、CPython を動かしているような印象を受けました(筆者の主観)。

urllibが使えなかった

例えば、本サンプル・プログラムを作成するにあたり、urllibが動作しませんでした。importすると固まったままとなり、しばらくすると強制終了されました(ex03_temp_tx_killed.py)。このため、ex03_temp_tx.py は、ソケット通信ライブラリで実装しています。下図は、そんなときに役立つ雑誌です[PR]。

pinpongが不安定

Python用GPIO制御ライブラリとしてpinpongが推奨されています。しかし、実行しても10秒以上待たされたり、制御できないまま強制終了されてしまうことがありました。単体では動作するのかもしれませんが、ネットワーク機能と組み合わせるのは難しそうです。このため、GPIO制御は Bashスクリプトを呼び出すようにして対策しました。

高機能エディタ?viが重たい

プログラム動作中は viエディタが重たいです。文字を入力しても、5秒から10秒くらい遅れることがあります。そんなときは、プログラムを終了させてください。

Python プログラムの強制終了: 
[root@milkv-duo]~# kill `pidof python`⏎

Bash プログラムの強制終了: 
[root@milkv-duo]~# kill `pidof bash`⏎

ちなみに、素のviではなく高機能エディタvimが実装されていました。

ncコマンドが終了しない

Bashのスクリプトでは、ncコマンドをKillする動作を追加しています。これは、コンテンツ応答後もコネクションが切れなかったためです。

感想

使ってみた感想です。Milk-V Duo で ビルド済のOS V1.1.4 を使うということを前提にしています。

Bashは、そこそこ動きます。ncの挙動については、解析と対策が必要です。

Pythonは、基本的な標準ライブラリだけで使う、もしくは本稿で作成したサンプル・プログラムを拡張する程度の用途であれば十分に使えそうです。しかし、Pythonの強みである多くのライブラリに頼るのであれば、注意が必要です。とくに、pipで組み込むときは、別のマイクロSDカードを用意し、事前に動作確認してから使用中のシステムに組み込んだ方が良いでしょう。

もし、市販用に使うということであれば、C言語で使うか、用途に合わせてOSをビルドしなおしたほうが良いでしょう。

とはいえ、わずか1,420円の Linux マシンという最大の特長を忘れてはいけません。OSがしっかりしているので、ちょっとしたサーバーとして活用できます。IO制御系IoT機器、オンプレWebサーバー、ルーター、NASなど、活用範囲は広いと思います。

付録 Raspberry Pi Zero との比較

Raspberry Pi Zero と比較してみました。
Milk-V Duo 64MB の CPU能力は、Raspberry Pi Zero の約1.8倍ほどあります。しかし、RAMは8分の1倍と大きく劣ります。リソース不足は主にRAMの容量から来ていると考えられます。
Milk-V Duo 64MBは、0.5 TOPSのNPUを内蔵している点で、AI機能が発揮できる特長もあります。GPUの24 GFLOPSでは、NPUの足元にも及ばないと思います。
この表から分かる Milk-V Duo 64MB の特長は、CPUとNPUの性能が高いこと、Ethernet内蔵、価格の3点だと思います。

Milk-V Duo 64MBRaspberry Pi Zero
CPUCV1800B
Dual Core
1GHz/700MHz
RISC-V C906 
BCM2835
Single Core
1GHz
ARM11
DMIPS2.3 /MHz1.25 /MHz
NPU/GPUTensor Prossing Unit
0.5 TOPS
VideoCore IV 250MHz
24 GFLOPS
RAM64 MB512 MB
Drivemicro SDmicro SD
MIPI-CSIvv
USB HOSTCDC-NCMOTG
HDMIv
Ethernetv
(要RJ45端子・別売)
価格(JPY)¥1,420¥1,980

by bokunimo.net

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

 - 
Chinese (Simplified)
 - 
zh-CN
Chinese (Traditional)
 - 
zh-TW
English
 - 
en
French
 - 
fr
German
 - 
de
Italian
 - 
it
Japanese
 - 
ja
Korean
 - 
ko
Russian
 - 
ru
Spanish
 - 
es