ch32funでmruby/c

mrubyc_arduinoを使って,rubyからマイコンを使える環境を整えて来た。 Wifiを使うなら、EPS8266に各種の機能を実装できたので、それを使うと良いだろう。 Wifiが必要ないのなら、価格や性能などを考えると、CH32V203が最適であると感じている。 しかし、CH32V203はマイコンボードの入手性があまり良くない。 BluePill+が日本でも600円程度で入手可能だが、ボードが少し大きめである。 同じようにUSBが使えるマイコンにはCH32X035があり、400円程度でボードが容易に手に入る。 しかし、かなり機能を削らないとflashに収まらない。 これまでは、環境の構築の容易さや、汎用性を重視して、mrubyc_arduinoを使っていたが、 CH32については、ch32funの方が、コンパイルサイズが小さいので、ch32funとmruby/cを組み合せて使ってみた。 ArduinoはC++なので、C言語と組み合せるときに工夫が必要だが、 ch32funはC言語なので、mruby/cと相性が良いというメリットもある。 しかし、機能を実装するのが面倒という大きなデメリットがあり、今回はArduinoっぽく使えるようになっているGPIOとADCを使えるようにしてみた。 まず、必要なファイルを揃えないといけないので、 例えばmrubyc_ch32funというフォルダを作って、その中に以下のようにファイルやフォルダを配置する。 ch32funの最新のファイルをzipで取って来て、その中のch32funとextralibsのフォルダを入れる。 mruby/cのリリースは3.4.1が最新なので、それを持って来て、mrubycというフォルダを作って、その下にsrcとsupportフォルダを入れる。 さらに、hal/minimal.hをmrubyc/src/hal.hにコピーする。 hal.hの中では、“ch32fun.h"をincludeするようにして、delayをDelay_Msに変更する。 必要なファイルを生成するために、mrubyc/srcフォルダの中で、make autogenを実行する。 mrubyc/src/vm_config.hでは、MRBC_USE_FLOATを0にして、MRBC_REQUIRE_32BIT_ALIGNMENTのコメントアウトを外してこれを有効にする。 FLOATを0にすると、そのままではコンパイルできないので、2026/04/15のブログを参考にして、いくつかのファイルを変更する。 mrblibを組み込まないclass.cの括弧を除いた最後の二行をコメントアウトする。 ch32fun用のコンパイラは、 Debianの場合は2025/11/25のブログを参考にしてインストールできる。 これで、準備は完了である。 ch32x035用のプログラムを作るために、先のフォルダの中にCH32X035というフォルダを作って、必要なファイルをつくる。 コンパイルに必要なMakefileは、以下の内容にする。 all : flash TARGET:=main TARGET_MCU?=CH32X035 MRUBYC_SRC := $(wildcard ../mrubyc/src/*.c) ADDITIONAL_C_FILES += $(MRUBYC_SRC) CFLAGS += -I../mrubyc/src -DNDEBUG CFLAGS += -Os -flto include ../ch32fun/ch32fun.mk flash : cv_flash clean : cv_clean ch32funで組み込まれるfunconfig.hは、特に何の指定も必要無いので、以下のようにする。 #ifndef _FUNCONFIG_H #define _FUNCONFIG_H #endif 中心となるmain.cは、以下のようにした。 #include "ch32fun.h" #include <stdio.h> #include "mrubyc.h" #include "
Read more...

ESP8266のArduinoでmruby/cのPWM

これまでに、mrubyc_arduino用にいくつかの機能を組み込むためのプログラムを書いて来た。 しかし、PWMについては、不十分な点があった。 その時には、Arduinoの機能のみを使うことにしたので、APIのガイドラインのすべての機能を実装できていないかったのである。 dutyとfrequencyは、それぞれAnalogWriteとToneを使って変化させることが出来るのだが、これらを同時に変えることが出来無いので、それを実現するのは諦めていた。 マイコン毎に別々にプログラムを書くのは非効率なので、mrubyc_arduinoを用いることによって、共通のプログラムで様々なマイコンが使えるようにしてきた。 しかしESP8266では、WiFiを扱うために、専用のプログラムを作ったが、そこではArduinoから使える関数を使った。 ESP8266専用のプログラムが一つあるのだから、PWMも専用のプログラムを書いても良いのでは無いかと思うようになった。 それでもハードに近い部分までいじるのは避けたい。 少し調べると、ESP8266用のArduinoでは、 AnalogWriteやToneを実現するためには、startWaveformという関数が使われており、この関数を使えば、dutyとfrequencyを同時に変えることができることが分かった。 mrbc_pwm.hは、pin番号以外に、dutyとfrequencyを保存するために少しだけ書き換えた。 #ifndef _MRBC_PWM_H #define _MRBC_PWM_H #include <Arduino.h> #ifdef __cplusplus extern "C" { #endif #include "mrubyc.h" typedef struct PWM_HANDLE { uint8_t pin_num; float duty_num; float freq_num; } PWM_HANDLE; void mrbc_init_class_pwm(void); #ifdef __cplusplus } #endif #endif mrbc_pwm.cppは、dutyとfrequencyの値から、highの時間とlowの時間を計算して、startWaveformに渡すようなサブルーチンを作って、それを他の関数から呼び出すようにした。 少し長くなったが、ガイドラインに沿った機能が使えるようになった。 #include "mrbc_pwm.h" #include <core_esp8266_waveform.h> extern "C" { void c_pwm_sub(mrb_vm *vm, mrb_value *v){ PWM_HANDLE *handle = (PWM_HANDLE *)v[0].instance->data; if(handle->freq_num==0){ stopWaveform(handle->pin_num); }else{ uint32_t timeLow=(uint32_t)(1e6/(handle->freq_num)); uint32_t timeHigh=(uint32_t)(timeLow*(handle->duty_num)/100); timeLow = timeHigh>timeLow ?
Read more...

USBSerialを使ったCH32V203用のmrubyc_arduino

single wire debugを標準入出力としたCH32V203用のmruby/c環境は、2026/5/3や5/17のブログで紹介した。 CH32V203のUSB機能を活用して、USB serialを標準入出力にしたmruby/c環境を作りたいと考えていたが、いくつもの問題があって、なかなか実現出来無かったが、なんとかそれなりのものが出来たので、その方法について説明したい。 mrubyc_arduinoのライブラリやCH32用のpackageのインストールは2026/5/3のブログと同じである。 USB serialは21km43さんのライブラリを使うことにしたので、2026/5/16のブロクを参考にしてインストールする。 通常のflashに配置するデータを減らすために、2026/5/17のブログに書いたように、Link.ldを変更する。 USB CDCを使うためには、最適化でLTOが指定できないので、サイズが大きすぎるので、さらに工夫をする必要がある。 Floatを消すために、vm_config.hのMRBC_USE_FLOATを0にして、2026/4/15のブログに書いたようにいくつかのファイルを修正し、Taskも消すために、2026/4/20のブログに書いたようにrrt0.hとrrt0.cを修正して、_autogen_class_rrt0.hを削除する。 そして、以下のスケッチをsmallestでコンパイルすると、ぎりぎり64kに入った。 #include <usb_serial.h> #include <mrubyc.h> #define MEMORY_SIZE (1024*10) #define FLASH_CODE 0x8020000 //ch32v203 static uint8_t memory_pool[MEMORY_SIZE]; int hal_write(int fd, const void *buf, int nbytes) { Serial.write((uint8_t*)buf,(size_t)nbytes); return (nbytes); } int hal_flush(int fd) { return 0; } unsigned char hal_read(int fd) { while (Serial.available() == 0); return Serial.read(); } void setup() { Serial.begin(115200); mrbc_init(memory_pool, MEMORY_SIZE); mrbc_init_class_digital(); mrbc_init_class_adc(); mrbc_init_class_pwm(); mrbc_init_class_i2c(); mrbc_init_class_spi(); mrbc_init_class_get(); mrbc_run_mrblib( FLASH_CODE ); } void loop() {} 実はここでも少し工夫をしていて、Serial.
Read more...

拡張flashを活用するCH32V203用のmrubyc_arduino

CH32V203でmrubyc_arduinoを使うために、2026/5/3のブログでは、FloatとTaskを無効にしたり、mrblibを拡張flashに移動させたりする方法を紹介した。 拡張flashをさらに有効に活用することによって、Floatを無効にするだけで、mruby/cを動かすことに成功したので、その手法を紹介する。 環境の構築は、先のブログの通りである。 Arduinoのスケッチは非常に単純で、以下の通りである。 #include <mrubyc.h> #include "swd.h" #define MEMORY_SIZE (1024*10) #define FLASH_CODE 0x8020000 //ch32v203 static uint8_t memory_pool[MEMORY_SIZE]; static volatile char inbytes=0; static volatile uint8_t last=' '; extern "C" { void handle_debug_input( int numbytes, uint8_t * data ) { inbytes+=numbytes; last = data[0]; } } int hal_write(int fd, const void *buf, int nbytes) { _write(0, (char*)buf, nbytes); return (nbytes); } int hal_flush(int fd) { return 0; } unsigned char hal_read(int fd) { while(inbytes==0) _write(0, "
Read more...

CH32V203でArduinoからUSBSerial

Arduino上で、CH32V203のUSBSerialを使おうとしたが、思ったよりも苦労した。 このマイコンのUSBは以前にArduinoから使ったことがあったので、その時と同じようにすれば良いと予想していたが、使い方が変わったりしていて、素直には動かなかったが、動かし方が分かったので、そのコツを書いておく。

CH32V203でArduinoからUSBSerialを使う場合、いくつかの方法がある。その中で最も一般的なのがTinyUSBを使う方法である。 TinyUSBのライブラリは、「ライブラリを管理」から「Adafruit TinyUSB Library」を選ぶことでインストールできる。 最新versionは3.7.7で、それなりに頻繁に更新されているようだ。 すぐに動くと思ったのに、なかなかうまく動かなくて苦労したが、最終的には次のようにすると動くことが分かった。 スケッチ例のCDCのserial_echoを見ると参考になるが、ライブラリのヘッダを取り込んで、TinyUSBDevice.begin(0);を実行してから、SerialTinyUSBをSerialと同様に使えばよい。 以前使ったときには,Adafruit_USBD_CDCオブジェクトをUSBSerialなどの名前で作って使っていたが、使い方が変わったようだ。 私が試したところ、最適化でSmallest with LTOでは、USBがうまく認識せず、Smallestだとうまく動いた。 しかし、その場合には、簡単なプログラムでもコンパイルサイズが24k程と、かなり大きくなった。 また、 Suzuduinojobitjosephさんのものなどの、 WCH公式以外のarduino coreで、USB supportを選択できる場合でも、「なし」としないとエラーが出てしまった。 これはおそらくversionの相性の問題だろうと考えている。

サイズがもう少し小さいものとしては、 21km43さんのライブラリを使う方法がある。 これを使うには少しだけ準備が必要である。 ファイルをdownload zipとして取って来て、解凍してからsrcフォルダをCH32V203_USBCDCなどと名前を変えてから、Arduinoのlibrariesフォルダに入れるのである。 使い方は単純で、以下のようにヘッダを取り込んだら、Serialという名前で使える。

#include <usb_serial.h>

こちらも、Smallest with LTOだと駄目で、Newlib Nano + USBDにしても、LTOだと動かない。 やはりSmallestにする必要があり、このときのサイズは15kとなった。 TinyUSBよりは小さいが、それでもまだ大きいと感じる。 また、個人的にはUARTと混同しないように、Serialとは別の名前で動いてくれた方が良いので、usb_serial.hとusb_serial.cppを変更しようかと考えている。

LTOを指定した場合には、割り込みに必要な関数などが使われていないと判断されて、消去されてしまってUSBが動かないのだろう。 これらの関数に、敵切に__attribute__((used))などの指定をつければ、LTOも使えるのでは無いかと思うが、それがどこに定義されているのかを調べるのが大変だろう。 一方、LTOを指定しない時には、使われていない多くの関数が残って、コンパイルサイズが大きくなっていると思われる。 もう少しサイズが小さく出来無いものかな。

Read more...

CH32X035用のmrubyc_arduino

flashやRAMが豊富なマイコンの場合には、 大抵はmicropythonを動かすことが出来て、 そのマイコンをC言語やC++以外で使いたいときには、micropythonを使えば良い。 しかし、 micropythonは動かないけど、mruby/cなら動くような場合には、mruby/cを使おういうことになるだろう。 そこで、より少ないflashやRAMしか持たないマイコンでmruby/cを動かそうとしているが、 マイコン毎にハードに依存する部分をいちいち書くのは面倒なので、 ハード依存部はArduinoに任せられるようにmrubyc_arduinoを利用している。 これまでに、 WiFiを組み込んだESP8266や、SWDを組み込んだCH32V203について、 mrubyc_arduinoでmruby/cを使える環境を構築してきた。 これらはそれぞれ2026/5/5と5/3のブログにまとめてある。 これらの環境の構築の際には、より実用的な環境になるように、次のような条件を付けている。 まず、標準的なAPIであるGPIO,ADC,PWM,I2C,SPI,UARTを組み込む。 そして、標準入力を使えるようにする。 また、rubyスクリプトを書き換えたときには、mrbcで処理したコードを、Arduinoでの再コンパイルしないで、書き込むことができるようにする。 ESP8266はflashやRAMがそれなりに大きいので、それほど苦労せずにこれらの条件を満たすことができたが、WiFiでhttpsにアクセスするのが大変だった。 CH32V203は公式なflashは64kとそれほど大きく無いが、隠しflashがあり、これをうまく活用すると、FloatとTaskの二つのclassを無効にしなければならなかったが、flashになんとか収まった。 次にmruby/cを使いたいと思っていたマイコンの一つがCH32X035である。 このマイコンはflashが62kしか無いが、マイコン自体がUSB機能を持っているので、他に外付のIC無しでPCと通信が出来て、安価なマイコンボードが入手できる。 このマイコンでは、標準入出力をUSBSerialにして、mruby/cを使えるようにするのが目標である。 しかし、USBSerialやmrbも62kのflashに収めないといけないので、様々な工夫が必要である。 まだ改善の余地はあるかも知れないが、なんとか使えそうな環境が構築できたので、それについて説明したい。 mrubyc_arduinoのライブラリのインストールは2026/5/3のブログと同じである。 ch32用のパッケージは、USBSerialを使えるようにする関係で、以下のURLを設定に追加してボードマネージャーからインストールする。 https://raw.githubusercontent.com/jobitjoseph/CH32_Arduino_Core/main/board_manager/package_ch32_index.json このパッケージでは、ToneやI2Cなどのファイルはすべて揃っているので、それ以外の操作は不要である。 Arduinoでは、CH32 EVT boards supportからCH32X035を選択して、最適化のオプションはsmallest with LTOとしておく。 USBSerial用のライブラリは2026/5/11のブログに書いたように、「ライブラリを管理」から検索してインストールする。 mrubyc_arudinoがCH32X035のflashに入るように、これまでにやってきた工夫を総動員する。 まず、floatを消すために、vm_config.hのMRBC_USE_FLOATを0にして、2026/4/15のブログに書いたようにいくつかのファイルを修正する。 Taskも消すために、2026/4/20のブログに書いたようにrrt0.hとrrt0.cを修正して、_autogen_class_rrt0.hを削除する。 mrblibも消すために、mrblib.cを削除して、class.cの最後の二つの命令をコメントアウトする。 StringとArrayとHashについて、autogen_class.hのsymbolsとfunctionsについて必要最低限のmethod以外を/ */でコメントアウトする。 そして、2026/5/12のブログに載せたrubyスクリプトを使って、_autogen_builtin_symbol.hを作って、上書きする。 これで、USBSerialも含めてなんとか61k弱になり、残りはユーザーのmrb用にできる。 Arduino用のスケッチは以下の通りである。 #include <mrubyc.h> #include <CH32X035_USBSerial.h> using namespace wch::usbcdc; #define MEMORY_SIZE (1024*10) #define FLASH_CODE (0x8000000+62072) static uint8_t memory_pool[MEMORY_SIZE]; int hal_write(int fd, const void *buf, int nbytes) { USBSerial.print((char*)buf); return (nbytes); } int hal_flush(int fd) { return 0; } unsigned char hal_read(int fd) { while (USBSerial.
Read more...

mrubyc_arduinoのbuiltin symbolを削減

mrubyc_arduinoでコンパイルしたバイナリを眺めていたら、最後の方にいくつもの文字列が保存されていることに気が付いた。 それらはエラーメッセージやメソッド名に対応している。 メソッド名などは、内部ではsymbolとして取り扱われているが、それらを_autogen_builtin_symbol.hで取り込んでいる。 これらのbuiltin symbolをプログラムに組込むことによって、約6kほどのflash容量を消費している。 これを削減できれば、コンパイルサイズを小さくできるのでは無いかと思い付いて、試してみた。 他のクラスの多くは、c_*.cなどのファイルで定義されているが、 Symbolクラスについては、symbol.cの中で定義されている。 Symbolでは、文字列と内部で使う数値を対応させているが、 builtin symbolでは、その数値はMRBC_SYMID_*という定数として定義されており、 MRBC_SYM()というマクロで呼び出している。 その変換を行うために、symbolの文字列のデータがプログラム上に保存されている。 それ以外のSymbolでは数値はhash関数を用いて計算され、それがメモリ上に保存される。 そして、これらのSymbolは、method名を処理するために使われている。 マイコンでは、使うmethodの種類はそれほど多く無い場合がほとんどで、使うSymbolの数も少なくなり、使う可能性のあるbuiltin symbolをすべてflash上に保存するのは無駄にも思えるが、 メモリの使用量を減らすために、flash上にbuiltin symbolを保存しているようだ。 私がmruby/cで使おうとしているマイコンの多くは、メモリよりもflashが不足している。 そのため、flashの使用量を減らす工夫をいろいろとして来た。 その一つが、autogen_class.hで使わないmethodと対応する関数をコメントアウトして、これらのメソッドを消してしまう方法である。 これらのメソッドの名称もbuiltin symbolとして登録されているが、それらは消してしまって問題無いはずである。 そこで、autogen_class.hなどの中で登録されているmethodのみを_autogen_builtin_symbol.hに残すプログラムを作ってみた。 fld="/home/user/Arduino/libraries/mrubyc_arduino-main/src/" fl=Dir.entries(fld).grep(/^_autogen_class/) fl=fl.reject{|l|l=~/float/} fl<<"vm.c" sym=[] fl.each{|fn| d=open(fld+fn,"r"){|f|f.read} d=d.gsub(/\/\*.*?\*\//m,"") sym+=d.split(/\n/).grep(/MRBC_SYM\((.+?)\)/){$1} } sym=sym.uniq fo="_autogen_builtin_symbol." d=open(fo+"org","r"){|f|f.readlines} dd=sym.map{|e| d.index{|l|l=~/\/\/\s*MRBC_SYMID_#{e}\s*=/} }+ sym.map{|e| d.index{|l|l=~/^\s*MRBC_SYMID_#{e}\s*=/} } dd=dd.sort out=[] d.each_with_index{|l,i| out<<l if dd.include?(i) or not l=~/MRBC_SYMID_/ } i=0 out=out.map{|l| (l=~/^\s*MRBC_SYMID_/) ? l.sub(/=\s*\d+/){"= #{i+=1}"}: l } open(fo+"h","w"){|f| f.puts out} ユーザーのフォルダを示す~が使えなかったので、ユーザー名はuserとしました。 autogen_class.hの/ */のコメントを除去してから処理するようにしていますが、マクロのifや//のコメントには対応しておりません。 Floatは除去する前提なので、Floatのmethodは取り込んでいません。 元の_autogen_builtin_symbol.hを_autogen_builtin_symbol.orgという名前に変えて、スクリプトを実行すると、新たな_autogen_builtin_symbol.hが出来ます。
Read more...

ArduinoでCH32X035のUSBSerial

CH32X035をArduinoから使うときには、通常はWCHサポートを使うが、それだけではCH32X035のUSBSerialは使えない。 WCH社が公開している CH32X035EVT には、 MounRiver Studio用のプログラムの例がある。 これをArduinoで活用することも可能だろうが、どのようにして組み込むかを検証するのはそれなりに面倒であろう。

いろいろと探していたら、CH32X035_USBSerialというライブラリを発見した。 これは、Arduinoでスケッチ-ライブラリをインクルード-ライブラリを管理…-CH32X035_USBSerialを選択してインストールできる。 Arduinoのスケッチは、こんな感じである。

#include <CH32X035_USBSerial.h>
using namespace wch::usbcdc;

void setup() {
  USBSerial.begin();
  USBSerial.waitForPC(); // Wait for host connection
  USBSerial.println("USB CDC ready!");
}
void loop {
  if(USBSerial.available()){ USBSerial.read(); }
}

しかし、このライブラリはWCHサポートでは動かず、そのフォークを使う必要がある。 環境設定で以下のURLを加えて、それをインストールする。

https://raw.githubusercontent.com/jobitjoseph/CH32_Arduino_Core/main/board_manager/package_ch32_index.json

ボードはCH32 EVT boards supportからCH32X035を選ぶ。 オリジナルのWCHサポートではCH32V EVT boards supportとなっているので、“V"の有無で区別ができる。 少し調べたところでは、WCHのgithubのファイルと比較して、 system/CH32X035/SRC/Peripheral/src/ch32x035_misc.cと system/CH32X035/SRC/Startup/startup_ch32x035.S などを更新しているようである。 コンパイルして、バイナリを出力して、wchispで書き込むと、USBSerialが使えるようになる。

USBSerialを組み込んだときと組み込まないときで、コンパイルしたときのサイズを比較すると、3k弱の違いである。 以前、CH32V203でTinyUSBを組み込んでみたときには、10kぐらい増加したので、条件の違いはあるが、このライブラリはUSBSerialにしては、それなりにコンパクトだと言えるだろう。 以後、CH32X035でUSBSerialが必要な時には、このライブラリを使ってみようと思う。 このライブラリはCDCしか対応していないので、USBの他のデバイスを作ることは出来無いが、参考にはなるかも知れない。

Read more...

mruby/cでメソッドの制限

mrubyc_arduinoで、使用するflashを節約するためには、floatを無効にするとか、マルチタスク機能を削除するなど、いくつかの方法がある。 もう一つの方法は、使えるメソッドを減らすことである。

mruby/cではrubyのクラスやメソッドは、主にc言語で実装されているが、その一部はrubyで書かれたコードをmrbcでバイナリにして組み込むことによって実現している。 これがmrblibであり、そのバイナリのサイズは約4.5kである。 ch32v203でmrubyc_arduinoを使ったときには、mrblibを拡張flashに移動することによって、メインのflashを節約したが、これを組み込まないこともできる。 mrblibを組み込まなければ、必要なflashは約4.5kぐらい減る上に、mruby/cに必要なメモリの量も少なくなる。 以前、ESP8266で実験したときには、mrblibを組み込む場合にはmruby/c用に5kほどのメモリを確保しないといけなかったが、mrblibを組み込まない場合には2kでも動かすことができた。

しかし、mrblibを組み込まない場合には、そこで定義されていたメソッドが使えない。 mruby/cで使うことのできる クラス・ライブラリ の中で、下の表がmrblibで定義されているメソッドである。

Enumerable collect, map, each_with_index
Array all?, any?, collect!, map!, delete_if, each, each_index, index, find_index, none?, reject!, reject, reverse_each, select, filter, select!, filter!, sort!, sort
Hash each
Numeric times, upto, downto
Object loop
Range each
String each_byte, each_char, ljust, rjust, each_line
これらのメソッドの中で、個人的によく使うのは、map,each,times,loopなどだろうか。 mrblibを組み込ま無いことによって、これらは使えなくなるが、性能の限られたマイコンで使えないメソッドがあるのは仕方無いだろう。

一方、c言語で実装されているmethodを使わないようにするには、 _autogen_class_*.hのmethod_symbols_とmethod_functionsにある要素をコメントアウトすれば良い。 すると、コンパイル時の最適化でこれらは除かれるのである。 取り除いてはいけないメソッドもあるかも知れないが、ほとんど使わないけどコードが長くなりそうなメソッドを消せば、flashの節約になるだろう。

問題なのは、あまりメソッドを減らしすぎると、rubyっぽく無くなってしまうことである。 機能の限られたマイコンで動かすrubyとして、最低限必要なメソッドはどれかというのは、人によって意見が別れるだろう。

さらにflashの使用量を減らすためには、 マイコンには必要ないと思われるクラスを消すということも考えられる。 そのままではうまく働かないものの、 FloatやStringを無効にする指定はvm_config.hで定義されている。 Floatについては、2026/4/15のブログに書いてあるように修正すれば、無効にできるが、Stringは他のコードでも使われていることが多く、無効にするのは諦めている。 それと同様に、マイコンで使う必要性が低いクラスを無効にしてしまうことも出来るだろう。 例えば、Hashをマイコンから使う機会は少ないように思うが、SrtingやHashはmrblibにも定義が書かれているので、これらを無効にするのは単純には出来無いだろう。

2026/5/12追記 Hashはキーワード引数の処理に使われているので、消すことは出来無さそうだ。

Read more...

ArduinoでCH32X035のi2c

CH32X035はWCH社の比較的新しいマイコンで、安いのにflashやメモリもそれなりにあり、USBも使える。 このマイコン用にArduinoからI2Cを使おうとしたら、少し苦労したので、その解決法について書きたい。

ArduinoでCH32マイコンを使うには、WCHサポートをインストールする必要がある。 それを使うと、CH32X035も使えるようになるのだが、I2Cなどはまだ対応できていないようで、そのままではエラーが出て使うことが出来無かった。

WCHサポートの最新のリリースは2023年12月に出たもので、それ以降はリリースされていないものの、それ以降にも若干の更新が行われている。 いくつかのファイルを最新版に入れ替えると、CH32X035でもWireを使ったプログラムのコンパイルができることが分かった。 入れ替える必要のあるファイルは、 arduino_core_ch32/variants/CH32X035/CH32X035G8U/ のvariant_CH32X035G8U.hとPeripheralPins.c、 arduino_core_ch32/cores/arduino/ch32/ のPinNamesTypes.hとanalog.cppとanalog.hとtimer.cとtimer.h である。 これらで ~/.arduino15/packages/WCH/hardware/ch32v/1.0.4の 対応するファイルを上書きするのである。 動作は確認していないが、きっと動くと信じることにする。

Toneなども最新のリリースには無いので、同じところから最新版を取って来る必要があった。 もしかすると、すべてのファイルをgithub上の最新版に入れ替えた方が良いのかも知れない。 ch32x035については、まだusbをArduinoから使えていないので、その方法を探そうと思う。

Read more...