UIAPduinoでシリアルモニタ

Arduinoでは出来るのに,UIAPduinoで出来無いことの一つが,シリアルモニタである. UIAPduinoでは,USBからの書き込みは出来るが,bootloaderに書き込まれたソフトでUSBを取り扱っているので,Arduino IDEで作ったユーザーのプログラムの実行時には,USBは使えない. そのために,UIAPduino単体ではシリアルの出力をモニタできないのである. 例えば,ADCなどの結果を出力させたりする際には,PC側からその結果を見たいが,そのような時に,シリアルモニタが便利である. UIAPduinoで,マイコンの出力をPCから見る方法は,いくつか考えられる. 最も簡単に思い付くのが,別のUSB-シリアル変換を使う方法である. CH32の書き込み機であるWCH-LinkEにもこの機能があり,それらを使うと,Arduino IDEからモニタすることができる. しかし,そのハードを別途用意する必要があり,コストもかかるので,ここではUIAPduinoのみという縛りをつけて,それを実現する方法を考えてみよう. ch32funでよく行われているのが,デバッグプリントを使う方法で,SWDIOを使ってデータを送って,PCから見ることが出来る. この方法は,一般にはWCH-LinkEをマイコンに接続して行うが,そのかわりにUAIPduinoで書き込み機を作って,同様に使うことが可能である. ch32v003でUSBを使うためのrv003usbには,rvsdio_programmerという書き込み機を作るためのソフトがあり,UIAPduinoにこれを書き込むと,それを使ってデバッグプリントできるようになる. ユーザーのプログラムの実行用とモニタ用で,二つのUIAPduinoが必要になるが. 標準のrvsdio_programmerから,ピン番号とDPUの設定をカスタマイズしたUIAPduino用のバイナリをdownloadする. wget https://www.uiap.jp/doc/rvswdio_programmer-md5sum-651b141f51da9a29e9988559fc562157.bin すでに設定してある場合には不要だが,UIAPduinoに書き込みをする権限を設定する. sudo wget -O /etc/udev/rules.d/99-minichlink-uiap.rules https://raw.githubusercontent.com/YuukiUmeta-UIAP/ch32fun/3bfa603f11d493710f2a811b5a2dfad905d9425c/minichlink/99-minichlink-uiap.rules sudo udevadm control --reload-rules sudo udevadm trigger 書き込み用のソフトであるminichlinkは, wget https://github.com/YuukiUmeta-UIAP/ch32v003fun/releases/download/1.0.0/minichlink-2982dfd-1.0.0.tar.gz tar -zxvf minichlink-2982dfd-1.0.0.tar.gz mv minichlink-2982dfd/minichlink . とすると,minichlinkができる. UIAPduinoのRSTボタンを押しながらUSBにつないで,minichlinkを使って,以下のコマンドで書き込みを行う. ./minichlink -c 0x1209b803 -w rvswdio_programmer-md5sum-651b141f51da9a29e9988559fc562157.bin flash -b そして,rvsdio_programmerにアクセスする権限を以下のようにして与える. sudo wget -O /etc/udev/rules.d/99-minichlink.rules https://github.com/cnlohr/ch32fun/raw/refs/heads/master/minichlink/99-minichlink.rules sudo udevadm control --reload-rules sudo udevadm trigger これで,UIAPduinoをrvsdio_programmerとして使うことができるようになった. あとは, ボードをデバッガにするのところに書いてある通りに配線して, ./minichlink -T とすれば良いはずである. しかし,この手法にはいくつかの欠点がある. まず,Arduino IDEからは使えないことである.現時点では,私はArduinoからSWDIOへの出力の仕方は分らない.一般的なArduinoにはSWDIOは無いので,可能だとしても特殊な使い方が必要になるはずである. また,配線が少し複雑である. シリアルモニタの場合には,GNDと電源とデータの三本で良いのだが, rvsdio_programmerの仕様上,特定のピンを繋いだりする必要がある. Arduino IDEのからシリアルモニタから見ることが出来無いのも,面倒かも知れない.
Read more...

UIAPduinoをch32funで使う方法

UIAPduinoの開発環境として,初心者にとって最も簡単なのはおそらくArduino IDEである. 新しい種類のマイコンを使うたびに,そのマイコンの仕様を勉強するのは大変だが, arduinoは,マイコンの種類をあまり意識せずに使えるという点で,優れていると思う. UIAPduinoのArduino環境は,WCH社のArduino環境を用いており,少い重いという欠点がある. また,USBを使ったプログラムを作ることができない.

もう一つのUIAPduinoの開発環境が,ch32funであり,軽くて機能も充実しているが, ch32funでプログラムを組むには,CH32V003について多少の知識が必要となる. 実は,UIAPduinoのUSBによる書き込みは,ch32funのrv003usbを使ってソフト的に実現している. 同様に,ch32funでrv003usbを使うと,USBを利用するようなプログラムも作ることができる. ちなみに,PlatformIOでは,ch32funを使うことができるらしいが,私は使ったことが無い.

ch32funでUIAPduinoを使うには, UIAPduinoのbootloaderは,ch32funのbootloaderとProductIDが異なるので,minichlinkでの書き込み時のコマンドにオプションを指定する必要がある. そこで,ch32fun/ch32fun.mkの中の

FLASH_COMMAND?=$(MINICHLINK)/minichlink -w $< $(WRITE_SECTION) -b

という行を,

FLASH_COMMAND?=$(MINICHLINK)/minichlink -c 0x1209b803 -w $< $(WRITE_SECTION) -b

に変更する. すると,普通のch32funと同様にUIAPduinoを使うことができる. minichlinkをUIAPduinoのものと入れ替えても良いのだが.

ch32funでUIAPduinoを使うもう一つの方法を紹介しておこう. AlexanderManderaさんの環境は,arduino IDEからch32funを使えるようにしたものなので,これを使うと,Arduino IDEからch32funを通して,UIAPduinoを使うことができる. Arduino IDEでファイル-環境設定として,追加のボードマネージャのURLに

https://alexandermandera.github.io/arduino-wch32v003/package_ch32v003_index.json

を入れて, ツール-ボード-ボードマネージャで"ch32"などと検索すると,“WCH Boards"が出てくるので,インストールするとこの環境が使えるようになる. そして,UIAPduinoを使えるように,以下のようにして書き込みソフトをUIAPduinoのもので上書きする.

cp ~/.arduino15/packages/UIAP/tools/minichlink-2982dfd/1.0.0/minichlink ~/.arduino15/packages/alexandermandera/tools/minichlink/1.0.0/

この環境を UIAPduinoの環境と比較をしてみよう. ファイル-スケッチ例-01.Basics-Blinkの例に,

#define LED_BUILTIN 2

を加えてUIAPduinoでコンパイルすると,6972バイトとなる. スケッチ-コンパイルしたバイナリを出力としてできるbinファイルのサイズは7140バイトである. ツール-ボード-WCH Boards-CH32V003として,環境を変えた場合のbinファイルは1640バイトである. ファイルサイズは四分の一となり,プログラムがかなりコンパクトになってることが分かる. ch32funがベースになっているので,うまく設定すればrv003usbも使えるかも知れない. このように,UIAPduinoの環境よりも,こちらの方が良いようにも思えるが,必ずしもそうとは言えない. この環境では,digital IOとSerialはarduinoと同じように使えて,i2cは少し違う形式で使うことができるが,analog IOなどはまだ使えない. また, ch32funも古いものを使っており, しばらく更新が止っているので,進展はあまり望めないように思われる. digital IOとSerialしか使わなくて良い場合を除いて,UIAPduinoの環境を使っておくのが良いのでは無いだろうか. なお上の例で,ピン番号の代わりにPC0などを使う場合には,C0としなければならないことに注意しないといけない.

Read more...

UIAPduinoを試してみた

安価でそれなりの性能のマイコンとして,WCH社のCH32V003を時々使うようになった. 最初はICを基板に半田付けして使っていたが,特に3.3Vで使いたい時には,三端子レギュレータなども使わなければならないので,面倒に感じていた. CH32V003を使ったマイコンボードとしては,WeAct Studioの開発ボードを見付けたので,少し使ってみたが,USBを使うためにはチップ抵抗を三つ半田付けしなければならないことが判った. そのままでUSBを使うことができるCH32V003のマイコンボードとしてUIAPduinoというものがあり,興味はあったが入手経路が限られていたので見送っていたが,なんと開発者の方から連絡があって,譲ってもらえることになった. 昨日届いたのだが,同じ日にUIAPduinoについての記事が出ていたので読んでみたが,興味深いものだった. 積極的に普及活動を行っているようで,大いに感謝したい. 早速,少し使ってみたので,Debian13でのArduino IDEからUIAPduinoを使う方法を説明したい. まずはArduino IDEをaptでインストールする. sudo apt install arduino arduinoを立ち上げると,UIAPduinoには関係しないが,dialoutのgroupに追加するかを聞かれるので,addを指定する. ここでインストールされるarduinoのversionは1.8.19であり, UIAPduinoの公式ページによると,このversionは動作確認されていないそうだが,aptで簡単に使えるversionで使えた方が良いので,以下ではこのversionについて説明する. UIAPduinoを使えるようにするために,ファイル-環境設定として,追加のボードマネージャのURLに https://github.com/YuukiUmeta-UIAP/board_manager_files/raw/main/package_uiap.jp_index.json を入れて, ツール-ボード-ボードマネージャで"uiap"などと検索すると,UIAPduinoが出てくるので,インストールする. そして,USBでの書き込み権限を与えるために,以下のコマンドを実行する. sudo wget -O /etc/udev/rules.d/99-minichlink-uiap.rules https://raw.githubusercontent.com/YuukiUmeta-UIAP/ch32fun/3bfa603f11d493710f2a811b5a2dfad905d9425c/minichlink/99-minichlink-uiap.rules sudo udevadm control --reload-rules sudo udevadm trigger インストール作業は基本的にはこれで終了であるが,このversionでは書き込み時にエラーが出るので,少し後に説明するような修正が必要である. それでは,実際の使い方である. 新しいUIAPduinoをUSBに接続すると,二つのLEDが点灯し,一つのLEDが点滅する. 明るさがゆるやかに変化するので,PWMでも使っているのかな. arduino IDEではボードの種類を,ツール-ボード-CH32V EVT Boards Support-Pro Micro CH32V003と選択する. 別のボードをインストールしている場合には,“CH32V EVT Boards Support"が複数出てくることもあるが,その下に"Pro Micro CH32V003"だけがあるものを選択する. 一番簡単な例として, ファイル-スケッチ例-01.Basics-Blinkを選んで,LEDをon/offするプログラムを呼び出す. setup()よりも前に, #define LED_BUILTIN 2 という行を追加する. ボードのピン番号の2の代りに,ICのピンの名前のPC0でも良い. しかし,いざ書き込みをしようとすると,コンパイルが終った後に, 書き込み中にエラーが発生しました:設定パラメータの「upload.params.quiet」が見つかりません というエラーが出てしまう. これを回避するためには,設定ファイル ~/.arduino15/packages/UIAP/hardware/ch32v/1.0.42/boards.txt の適当な場所に, CH32V00x_EVT.upload.params.quiet= CH32V00x_EVT.upload.params.verbose= という行を追加して,arduinoを立ち上げ直せば良い. すると,書き込み時には
Read more...

picoRuby

ESP32を使うときには,私は主にmicropythonを使っていた. C言語よりはpythonの方が楽なので. micropythonでは,binaryを書き込んだら,pythonのコードをマイコンが実行してくれる.

esp32ではmrubyというrubyを使うことも出来るが,rubyのコードをPC側でコンパイルしてマイコンに書き込む必要がある. 手順も複雑なので,素人向では無いと感じて,手を出さなかった. mrubyも進化しているようで,mruby/cという小さなRAMで動かせるものも開発されているが,大まかな使い方はmrubyと同じようである.

mruby/cについて調べていたら,picoRubyというものもあることを知った. microの次はnanoなのに,それを飛ばしてpicoになったのは何故かなと思ったら,raspberry pi pico用に開発されたものだからのようだ. 使い方はmrubyと似ているのかなと予想したが,micropythonと同じように使うことができる. それなら使ってみようかなということで,試してみることにした.

raspberry pi picoが必要だが,手元にあるRP2040-zeroを使うことにした. まず,binaryをここから最新のものをdownloadして,展開する. pico用とpico2用があるが,今回は前者に対応しているのでそれを選ぶ. daily buildなどは無いようなので,最新のコードのbinaryが必要な場合は,自分でbuildしないといけない. BOOTを押しながらUSBに接続すると,RPI-RP2というmediaがマウントされるので,そこにuf2ファイルをコピーする. インストールはこれで終了である.

しばらく待ってからRESETを押すと,/dev/ttyACM0が出来ているので,ターミナルソフトで接続する. linuxだと,例えば以下のコマンドである.

gtkterm -p /dev/ttyACM0 -s 115200

lsなどの簡単なコマンドや,rubyを使うためのirbが使える. まずは簡単な計算をやってみて,micropythonと同じ感覚で使えることを感じた. Lチカをしようと思ったけど,RP2040のLEDは簡単では無いようなので,電圧のON/OFFをやってみた.

pin = GPIO.new(1, GPIO::OUT)
10.times{pin.write(1);sleep 1;pin.write(0);sleep 1}

esp32用のpicorubyもあるけど,binaryが無かったので,今回は見送った. binaryも公開して貰えると,素人でも始めやすくなって,使う人が増えると思うので,公開してくれると助かるけどな. しかし,esp32用のpicorubyは,netには対応していないようである. esp32のwifiが使えるようになったら,micropythonの代わりにpicorubyを使って行きたい. 開発が進むのを待つことにしよう.

Read more...

WeActStudioのCH32V003開発ボード

WCH社のCH32V003というマイコンを時々使うようになった. 当初は,ArduinoにWCHサポートをインストールして使っていたが,ソフトで実装したUSBを使うことができるch32funを使うようになった. 特にUSB用のbootloaderを書き込むと,以降はWCHLinkを使わずにUSBから書き込みが出来て便利である. しかし,マイコンそのものを使ってUSBを使えるようにするには,USBを繋げるようにしたり,3.3Vを作ったり,33Ωと1.5kΩの抵抗を接続したりしないといけないので,それなりの手間がかかる. そこで,CH32V003を使ったマイコン開発ボードを試してみることにした. いくつかの開発ボードが作られているようだが,小型で手に入りやすいという理由から,WeActStudioのものを使ってみることにした.

WeActStudioからは様々なボードが発表されており,それらはAliexpressから入手できる. 今回はCH32V003F4U6 Mini Core Boardを選んで, USBは通常は電源の供給のみであるが,回路図を確認すると,少し改造するとUSB通信が出来るように設計されていることが解る. 基板のUSBと書いてあるところの近くに三つの空きのランドがあるが,USBという文字に近い方の二つには33Ω,残りの一つに1.5kΩのチップ抵抗を半田付する. そして,ch32funのrv003usbでは,以下のように設定する.

#define USB_PORT D
#define USB_PIN_DP 3
#define USB_PIN_DM 4
#define USB_PIN_DPU 5

WCHLinkをつなぐための端子もあるので,それを使ってプログラムすることができ, rv003usbのbootloaderを使う場合にも,最初はそれを使って書き込む. 空きのランドの形が,半田で繋いで短絡しやすいようになっていたので,最初は短絡して試したがうまくいかず,回路を追い掛けたら抵抗が内蔵されていないので,それを半田付する必要があることに気が付いた.

PD5がUSBのDPUに使われてしまうために,USBを利用するときには,使えるピンの数は3つ減ってしまう. DMを3.3Vに直結すれば,PD5を開放できるのだが,それはこのボードでは簡単には実現出来無い. また,PD7がNRSTとして使われているために,スイッチとコンデンサに接続されており,これらを切り離してPD7を独立した入力ピンとして使えないのも残念なところである. そのため,実質的に使えるピンの数は,14である.

WeActStudioのCH32V003開発ボードでUSBを使うためには,二種類のチップ抵抗を用意して,それらの三つを半田付するというのが,少し面倒だが,ICから準備するよりはかなり楽になる. CH32V003を使ってUSBが扱えるマイコンボードであるUIAPduinoは,安価な上に半田付なども無しでUSBからプログラムを書き込めるようなので,このマイコンでUSBを使おうとしている人は,このボードの方が良いかも知れない. 入手経路が限られているために,これまで使ったことは無いのですが.

Read more...

arduino nanoのVin

ステッピングモーターをマイコンで動かそうとして,どのマイコンを使うか迷ったが,小型のarduino nanoを使うことにした. モーターのドライバーには,GNDと信号と電源を供給する必要があるが,ピンの順番の関係で,RSTの配線をカッターで切断して,そこに電源をつなぐことにした. Vinという端子があったので,それがUSBから電源として入力された信号を出す端子だろうと思って,それを電源として使ったら,モーターのトルクが非常に小さくなってしまった. 電圧を測ると,2Vぐらいしか出ていない. 調べてみると,Vinという端子は,そこに外部電源をつなぐための端子であることが分かった. つまり,arduino unoでは,ACアダプターをつなぐ端子があるが,その代わりに使う端子のようだ. 結局,5VがUSBの電源に対応するようなので,それを使ったら無事に動いた.

こういった単純な作業に使うマイコンボードとしては,小型で安いnanoが楽かなと思う. 小型のマイコンボードとしては,arduino pro microやesp8266ボードやesp32ボードに加えて,ch552ボードなどを使って来た. UIAPduinoなんかも安くて良さそうだけど.

Read more...

localhostと127.0.1.1

127.0.0.1は自分自身を表すIPだが,debianでマシン名に対応するIPは127.0.1.1となっている. つまり,自分自身には,127.0.0.1と127.0.1.1と割り当てられているIPが対応している. サーバーを立てているPCから,そのサーバーにアクセスしたときには,上記のどのIPを使うかによって,サーバーから見た接続先が異なっている.

例えば,rubyでserve側で

require "socket"
s=TCPServer.new(3030)
p s.accept.peeraddr

としてから,client側で

require "socket"
s=TCPSocket.open('localhost',3030)

とすると,serve側には

["AF_INET", 37666, "127.0.0.1", "127.0.0.1"]

などと表示される. 一方,localhostの代わりに,割り当てられたIPを指定すると,割り当てられたIPが表示される.

今回苦しんだのが,127.0.1.1にアクセスした場合の振る舞いである. 私の2009/1/16のブログを見るとその時のrubyでは,127.0.1.1と表示されたようである. しかし,最近のrubyでは,127.0.0.1と表示されるように変わったようである. 昔書いたプログラムを新しいPCで動かそうとして,なかなか思ったように動かなかったが,これが原因だったようである.

Read more...

Python-FuでGimpのFilter

Gimpで画像を処理させるときに,以前はScript-Fuを使っていてscheme言語で書くのが難しかったが,最近はPython-Fuを使えるようになって,楽になった. ちなみに私がpythonを使うのは,micropythonかPython-Fuが主な気がする. 少しは慣れて来たのだが,Filterなどの高度な処理をPython-Fuから行う方法が分からなかった. Gimp3.0になったし,新たに調べてみたら,やり方が分かったので,書いておきたい.

まず,画像の一部を選択した状態にする. Filters - Development - Python-Fu - Python Consoleからコンソールを開いて,以下のコマンドを実行すると,medianフィルターが適用される.

img=Gimp.get_images()[0]
lyr=Gimp.Image.get_layers(img)
chl=Gimp.Selection.save(img) #unselect layer
Gimp.Image.set_selected_layers(img,lyr)
drw=Gimp.Image.get_selected_drawables(img)[0]
flt = Gimp.DrawableFilter.new(drw, "gegl:median-blur", "")
fc = flt.get_config()
fc.set_property("radius", 10)
drw.append_filter(flt)

filterやそのpropertyの名前は,GEGLのサイトで調べることができる. get_configで作ったものに対してset_propertyをするという少し回りくどい設定をしてから,適用する. append_filterでは元の画像を保持したままfilterが非破壊に適用されますが,元の画像を保持する必要が無いときにはmerge_filterを使って下さい.

Read more...