ch32v203でmrubyc-arduinoを動かす
mrubyc_arduinoでのflashの節約
mrubyc_arduinoを小さなflashやメモリのマイコンで動かすために、どのようにすれば良いかを考えている。 GPIO, ADC, PWMを組み込んだ状態で、例えばボードとしてArduino Nano Everyを指定してコンパイルすると、flashが35kほどオーバーする。 この条件のもとで、 最低限のrubyの機能を残した上で、必要なflashのサイズを減らそうと試みてみた。
2026/4/15の記事で書いたように、適切な修正をして、vm_config.hで以下のようにFloatを無効にすると、 5.5kほど削減できる。
MRBC_USE_FLOAT 0
また、debug機能が有効になっているようなので、vm_config.hで以下のようにすると、さらに2kほど減少する。
//#define MRBC_DEBUG
NDEBUGを定義しても同じ効果が現れるのかと思ったが、この定数は特殊な意味を持つようで、逆に大きくなってしまった。
methodを使えるようにするために、プログラムが大きくなるので、最低限のmethodだけを残して、残りのmethodを消せば、さらに小さくできるはずである。 そのためには、_autogen_class_*.hの中のmethod_symbols_*とmethod_functions_*の一部をコメントアウトすると、対応するmethodだけを無効にできる。 array,hash,range,string,rrt0について、多くのmethodを無効にしたら、さらに15kほど減少した。
あと12kぐらい減らせば、Arduino Nano Everyのflashに収まる。 上記に加えてできそうな工夫としては、 objectの不要なmethodの削除や、 taskは一つしか走らせない前提でのrrt0.cの関数の簡略化などが試せるだろう。 flashが少し大きいch32v203などでは、上記の工夫でなんとかflashに入るかも知れないので、いつか試してみたい。
ソースを眺めていて感じたのだが、rubyでは同じ機能のmethodに複数の名前があるのだが、これはマイコンにとっては無駄になっている。 例えば、Arrayの要素数を求めるmethodには、count, size, lengthの三つが定義されている。 mrbcでコンパイルする際にこれらをsizeに統一してしまって、マイコンにはsizeのみを定義するようにすれば、多少ではあるが、無駄が減るように思う。 また、"%d,%d\n"%[a,b]という表現も、mrbcでprintf("%d,%d\n",a,b)に変換するようにすれば、マイコンへの負荷を変えずに、rubyの表現が広がる気がするけど、難しいかな。
2026/4/19追記 使わないであろうmethodを削って、flashの使用量を減らそうとしていたが、おそらくこれはうまくいかないことが判明した。 mrblib.cでmrubyのコードが定義されており、この中で使っているmethodを消してしまうと、エラーが生じる。 例えば、empty?なんかは使わないと思っていたが、消したら駄目のようだ。 または、mrblib.cも同時にいじる必要がある。
mrubyc_arduinoでPWM
mruby/cのFloatについての小さなバグ
Arduinoを利用してESP32でmruby/cからGPIOとADCを使うことができるようにはなった。 私がよく使うマイコンは、ESP32よりもflashやメモリの小さなものなので、そのようなマイコンでmruby/cを動かせないかと思っている。 Arduino ZeroやXiao SAMD21に使われているATSAMD21G18Aとか、 WCHマイコンの中では高性能なch32v305などが、次のターゲットであろう。 これらは、今のやり方で動きそうに思うが、残念ながらこれらは手元には無いので、確かめられない。 さらにその次には、 ch32v203とか、 Arduino Nano Everyで使われているatmega4809などかな。 これらは、メモリも少ないが、flashも足りていない。 そこで、Arduino Nano Everyを例にして、mrubyc_arduinoのflashの削減ができないかを検討していたら、mruby/cの小さなバグを見付けたので、そのことについて書くことにする。
Arduino Nano Everyのflashは、48kである。 ADCを使った簡単なプログラムをmrubyc_arduinoでコンパイルすると、82k程となる。 flashの使用量をかなり減らさないといけない。 vm_config.hを見ると、以下のような指定がされている。
MRBC_USE_FLOAT 1 MRBC_USE_MATH 0 MRBC_USE_STRING 1
機能を制限して、flashやメモリの使用量を減らすオプションのようだ。 Floatをoffにするために、0にしてみたが、コンパイルでエラーが出てしまう。 試行錯誤の末、以下のような修正をすると、これを0にしても動くようにできた。 boxing_no.h, value.cの中には、".d"や"->d"などが使われているが、これらはfloatを使わない場合には使えなくなっているので、それらの使われている場所を以下で囲って無効にする。
#if MRBC_USE_FLOAT #endif
そして、_autogen_builtin_class.hの中の以下の行も、同様に囲む。
extern struct RBuiltinClass mrbc_class_Float;
最後に、class.cの中のclassの定義を以下のようにする。
#if MRBC_USE_FLOAT MRBC_CLASS(Float), // MRBC_TT_FLOAT = 5, #else 0, #endif
これで、floatをoffにしてもコンパイルが通るようになる。 Arduino Nano Everyの場合には、flashの使用量が5.5kぐらい減った。 同じくらい効果のある削減を、あと5個ぐらい組合せれば、動くようになるかも知れない。 mruby/cでFloatをoffにすることはあまり無いのかも知れないが、0にしたときにエラーが出るのは、一応のバグと言えるのでは無いだろうか。 Stringをoffにしようとしても、エラーが出るが、こちらはややこしそうなので、あまり手を付けていない。
さらにflashを減らす試みとして、あまり使わないclassを取り除けないかも試してみた。 具体的には、Range,Proc,Hash,Arrayなどがあまり使わないclassかなと思う。 十分には検証していないが、rangeではflashは1.5kしか小さくならなかった。 Proc,Hash,Arrayは、取り除いてみたが、vmのcoreの部分で使っている感じなので、うまく動かない可能性が高いと思う。 たとえ、これらを全て取り除いても、10kぐらいしか減らないことが分った。 今後、Rangeは殆ど消して、Proc,Hash,Arrayでは不要なmethodを取り除いたときに、どうなるかを確かめてみたいと思う。 また、rrt0.cの中には、複数のタスクを動かすためのプログラムが書かれているが、一つのタスクが動けば良いと考えれば、工夫するとflashの節約が出来る可能性もあるのでは無いだろうか。
2026/4/16追記 value.hにもマクロで".d"を使っている部分があったので、これも修正した。
mrubyc_arduinoでGPIOとADC
Arduinoとmruby/cでESP32を使う方法
STM8のマイコンボード
もっとも安価なマイコンボードは何かと考えると、いろいろな候補が考えられるが、最も有力な候補がSTM8S103F3P6ボードであろう。 書込機が必要だし、他のマイコンボードで代替可能なので、これまで敬遠していたが、Arduinoでの使い方を確かめてみた。 STM社のマイコンボードとしては、USBを扱いたくてblue pillを使ったことがあるが、その時は他の人が作ったプログラムを書き込んで使うに滞っていた。
今回試すボードは、HW-177という刻印があるものである。 Arduinoで使うには、環境設定のところにあるURLに
https://github.com/tenbaht/sduino/raw/master/package_sduino_stm8_index.json
を加える。 ボードマネージャーからstm8などを検索すると、Sduinoが出て来るので、それをインストールする。 最新versionは2019年に出た0.5.0のようだ。 ツールのボードからSTM8S BoardsのSTM8S103F3 Breakout Boardを選択する。 しかし、そのままではコンパイル時にエラーが出た。 ボードマネージャーからArduino megaAVR Boardsもインストールしたら、コンパイルができるようになった。
書き込みをするためには、いくつかの前準備が必要となる。 USBの権限の問題をクリアするために、まずは/etc/udev/rules.d/99-stlink.rulesというファイルを作る。
# ST-Link/V2
SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3748", MODE="0666"
# ST-Link/V2-1
SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="374b", MODE="0666"
# ST-Link/V3
SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="374e", MODE="0666"
そして、この設定を有効にするために、以下のコマンドを実行する。
sudo udevadm control --reload-rules sudo udevadm trigger
新しいデバイスを使うときには、フラッシュの保護が有効になっていて書き込みができないので、stm8flashのインストールされたフォルダの~/.arduino15/packages/sduino/tools/STM8Tools/2019.02.05/linuxに行って、以下のコマンドでそれを解除する。
./stm8flash -cstlinkv2 -pstm8s103?3 -u
ボードによっては書込端子のGNDが繋っていないものもあるようだが、今回は大丈夫なようだった。 これで準備が完了である。 Arduinoで、書込装置を選択する。 今回はST-Link/V2を用いたが、それとマイコンボードを四本の線で接続する。 そして書き込みボタンを押せば、無事に書き込みが出来て、Lチカが無事に動くことが確認できた。
USBは電源供給のみで書込機が必要だし、ArduinoではC言語しか使えないなど、欠点も多いが、安くしたくて単純な用途には使える気がする。 今後の選択肢の一つとして、使って行こうと思う。
micro ATXからmini PCへ
メインPCを久々に更新することにした。 調べてみると、前回更新したのが2020年の5月だったので、実に6年ぶりということになる。 これまでに使ってきたメインのPCは、筐体はmicro ATXで統一しており、OSはメインのHDDまたはSSDに入れて、dataの入ったHDDを載せかえると、dataの移行の必要が無く、楽にPCの更新ができた。
昨年度、測定用にmini PCを買って使ってみたら、それなりに使い易かったし、性能もあまり問題が無いようだったので、今回はメインPCもmini PCにしてみた。 これまでの様に複数のstorageを載せられないので、homeのみ別のパーティションにして、dataはrsyncを使って移行した。 移行したい設定などのファイルもrsyncで移した。
OSはDebian13だが、sleepのときにhung upする可能性があったので、/etc/systemd/sleep.confでは以下のように指定した。
[Sleep] AllowSuspend=no AllowHibernation=no AllowSuspendThenHibernate=no AllowHybridSleep=no
light-lockerはあまり好きではないので、xscreensaverも入れておいた。 サウンドも認識していないようだったので、pavucontrolを入れて再起動したら、認識したようだ。 スピーカーが無いので、音はならないけど。
少し使った感じでは、うまく動いているようだけど、細々とした違いが出て来るかも知れない。 少しずつ環境を整えていこうと思う。 Linuxの場合、PCの速度による動作の違いは感じ難いけど、動作がきびきびしているように感じる。 さすがに6年の差は大きいのかな。
githubのアカウントを作ってみた
様々なプログラムが掲載されている場所として,githubの存在は以前から知っていたが,これまで詳しいことは知らなかった. Linuxを構成するコードを複数の人で開発するために作られたのがgithubのようだ. 普段からLinuxは使っているが,その事実は知らなかった.
githubのアカウントの作り方を調べたら,なんだかいろいろと面倒な作業が必要のようで,これまで敬遠していた. 知り合いに聞いたところ,googleアカウントでログインすると,そういった面倒なことは無いと言われた. その方法で試してみたら,ほとんど苦労することなく,githubを使うことが出来た.
githubの使い方を検索した時に,なんでこの事が見つからなかったのかと思ったら,これが可能になったのは,半年前のことのようだ. そのため,まだ情報が広がっておらず,昔の情報の方が検索にかかるのだろう.
これで,様々なプログラムをgithub上で開発することが出来るようになった. しかし私は,プログラムの開発はローカルな環境でやるのが好きで,通常は短いプログラムしか作らないので,公開の場所としては,blogなどで十分な気がする. 今後,どの程度使うかは不明だが,気が向いたら使ってみよう.