目次
Milk-V Duoについて
Milk-V Duo は、中国 Shenzhen MilkV Technology社が開発したマイコンボードです。RISC-V マイコンを搭載し、Linux が動作します。
メモリ容量は 256 MB のものと 64 MB のものが販売されています。もちろん、RAM容量の違いにより、価格も4割くらいの差があります。そこで、本稿では、あえて容量の小さな 64MB のものを選択し、少ないリソースと不安定な OS を克服してみます。
型番 | マイコン | RAM | 価格 |
Milk-V-Duo-64M | CV1800B | 64 MB | ¥1,420 |
Milk-V-Duo-256M | SG2002 | 256 MB | ¥2,300 |
形状やサイズは Raspberry Pi Pico 互換なので、一部の周辺機器を流用できます。

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 のスロットに挿入します。スロットの存在が分かりにくいですが、下図を見ると分かるでしょう。

なお、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に割り当てられていれば動作しています。なお、「識別されていないネットワーク」「インターネットなし」と表示されますが、正しい動作なので心配ありません。

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:~/⏎
または、以下の手順でファイルの内容を転送する方法もあります。
- PC側で元のファイルの内容を[Ctrl]+[A]で全選択します。
- [Ctrl]+[C]でクリップボードにコピー(保持)します。
- Milk-V Duo 側(SSH接続した端末)で「cat > ファイル名⏎」を入力します。
- マウスの右クリックで Milk-V Duo にペーストします。
- クリップボードの内容の転送完了まで待ちます。
- [⏎]キーで末尾を改行します。
- [Ctrl]+[D]で転送を終了します。
他にも curl コマンドで取得する方法があります。この場合は、Milk-V Duo にEthernet端子を取り付け、インターネットに接続する必要があります。
サンプル1: リモートLチカ
はじめにLEDをリモート制御するプログラムを実行してみましょう。プログラムを起動すると、Milk-V Duo はHTTPサーバーとして動作します。下図のように、インターネットブラウザから1または0を送信し、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サーバーとして動作し、取得した温度値を下図のように表示します。

プログラムは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に送信したときの一例です。

プログラムは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 64MB
- マイクロSDカード 1GB以上
- PCとの接続ケーブル(USB Type C)
- パルストランス内蔵 RJ45モジュラージャック
- 抵抗器5~10Ω 4本
- LANケーブル、インターネット接続環境
マイクロSDカードはOSのファイルシステムとして使用します。実験用としては安価なもので問題ありません。ただし、実使用時は信頼性のある商品を使用してください。

パルストランス内蔵RJ45端子
Ethernet 端子には RJ45 モジュラージャック(以下RJ45端子)を使用します。RJ45端子にはパルストランス内蔵のものと内蔵していないものが売られています。パルストランス内蔵タイプであれば、抵抗器を経由して直結できます。
- パルストランスなし:別途、パルストランスが必要
- パルストランス内蔵:抵抗だけで直結可能
筆者は、ヒロセ電機のパルストランス内蔵モジュラージャックTM11RD-5TANA-A-88-LPを使用しました。

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

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

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

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

なお、過電圧保護用のダイオードは省略しました。実験用であることと、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 64MB | Raspberry Pi Zero | |
CPU | CV1800B Dual Core 1GHz/700MHz RISC-V C906 | BCM2835 Single Core 1GHz ARM11 |
DMIPS | 2.3 /MHz | 1.25 /MHz |
NPU/GPU | Tensor Prossing Unit 0.5 TOPS | VideoCore IV 250MHz 24 GFLOPS |
RAM | 64 MB | 512 MB |
Drive | micro SD | micro SD |
MIPI-CSI | v | v |
USB HOST | CDC-NCM | OTG |
HDMI | – | v |
Ethernet | v (要RJ45端子・別売) | – |
価格(JPY) | ¥1,420 | ¥1,980 |
by bokunimo.net