Arduino IDE で小さな RISC-VマイコンCH32V003が動くようになりました。
センサーなどをつなぐにはI2C通信が必要な事も多く,ATtiny402などをテストした環境と同じI2C接続の光センサーで試してみました。
最大の難敵はメモリ不足でした。
プログラムメモリ16KBに安心していてはいけないのです(^^;;;;;;
[テスト装置]
カラーセンサーから読み取ったRGB値をLCDに表示します。
・MPU:CH32V003F4P6 ( SDA 11pin,SCL 12pin )
Boards;CH32 MCU EVT Boards by WCH Ver. 1.0.3
・Color Sensor:HAMAMATSU S11059-02D I2C接続
・Display:自作I2C接続モジュールのLCD
・レベル変換:BSS138ロジックレベル変換モジュール
MPUとLCDは5V,カラーセンサーは3.3VなのでセンサーのI2C信号はレベル変換を通しています。
[動作結果]
やっと動いて,RGB値の変化も見えました。
LED光源で各色を出して計測値を表示したところです。
![](https://stat.ameba.jp/user_images/20230803/20/pta55/f1/75/j/o1200052515320603233.jpg?caw=800)
![](https://stat.ameba.jp/user_images/20230803/20/pta55/e7/dc/j/o1200050015320603228.jpg?caw=800)
![](https://stat.ameba.jp/user_images/20230803/20/pta55/66/06/j/o1200043715320603223.jpg?caw=800)
[I2Cライブラリはメモリ不足に注意]
CH32V003シリーズはプログラムメモリが16KB,RAMが2KBと多めな感じがしますが,今のところ?Arduino ではシステムやWireライブラリなどが特にプログラムメモリをかなり占領します。
ざっとした数値ですが,プログラムに追加記入してはコンパイルしてメモリの使用状況をみてみました。
プログラムメモリ (16,384 byte)
・ setup(), loop()だけの状態:9,844 byte 使用
+ # include <Wire.h>:10,840 byte
+ Wire.begin(); :14,340 byte
+ Wire.beginTransmission();:14,892 byte
Wire.write();
Wire.endTransmission();
+ Wire.requestFrom();:15,364 byte
Wire.read();
どう考えても,I2Cを使うとプログラムメモリは1KBも残っていないことになりますよね(^^;;;;;;
UARTには500 byteぐらいは必要ですので,もうぎりぎりです。
ちなみにRAMは1.3KBぐらいは残っているようですので,そうは心配ないと思っています。
[テストプログラム]
表示用LCDはカラーセンサーとI2Cライブラリを共有できるものにしています。
初期設定など,ほとんどATtiny402用のプログラムの流用です(^^;;;;
(1/2)
![](https://stat.ameba.jp/user_images/20230803/21/pta55/67/8c/j/o0668087915320613091.jpg?caw=800)
ループ部もほぼATtiny402用と同じですが,自作のI2C接続のLCDなので少し表示の記述が異なります。
(2/2)
![](https://stat.ameba.jp/user_images/20230803/21/pta55/d7/5a/j/o0798095715320613095.jpg?caw=800)
[プログラムでの注意点]
私なりにArduinoでCH32V003をプログラムする時に思ったことです。
・システムで9.8KB,I2Cで5.5KB,UARTで0.5KBぐらいは使うと思っておく
・Stringクラスのようなメモリを食うものは使わない
・コンパイルエラーが出たら,エラー表示の最初の2行ぐらいを最後までたどって,メモリーのover flowが何バイトなのか確かめて対処を考える。
今回は手間がかからない20Pinでテストしてみましたが,CH32V003シリーズはPin数は違ってもメモリ構成は同じですから,メモリの問題点は同じでしょうね。
ま,I2Cが動いたのでセンサーがいろいろ付けられそうです(^^)。
センサーなどをつなぐにはI2C通信が必要な事も多く,ATtiny402などをテストした環境と同じI2C接続の光センサーで試してみました。
最大の難敵はメモリ不足でした。
プログラムメモリ16KBに安心していてはいけないのです(^^;;;;;;
[テスト装置]
カラーセンサーから読み取ったRGB値をLCDに表示します。
・MPU:CH32V003F4P6 ( SDA 11pin,SCL 12pin )
Boards;CH32 MCU EVT Boards by WCH Ver. 1.0.3
・Color Sensor:HAMAMATSU S11059-02D I2C接続
・Display:自作I2C接続モジュールのLCD
・レベル変換:BSS138ロジックレベル変換モジュール
MPUとLCDは5V,カラーセンサーは3.3VなのでセンサーのI2C信号はレベル変換を通しています。
[動作結果]
やっと動いて,RGB値の変化も見えました。
LED光源で各色を出して計測値を表示したところです。
![](https://stat.ameba.jp/user_images/20230803/20/pta55/f1/75/j/o1200052515320603233.jpg?caw=800)
![](https://stat.ameba.jp/user_images/20230803/20/pta55/e7/dc/j/o1200050015320603228.jpg?caw=800)
![](https://stat.ameba.jp/user_images/20230803/20/pta55/66/06/j/o1200043715320603223.jpg?caw=800)
[I2Cライブラリはメモリ不足に注意]
CH32V003シリーズはプログラムメモリが16KB,RAMが2KBと多めな感じがしますが,今のところ?Arduino ではシステムやWireライブラリなどが特にプログラムメモリをかなり占領します。
ざっとした数値ですが,プログラムに追加記入してはコンパイルしてメモリの使用状況をみてみました。
プログラムメモリ (16,384 byte)
・ setup(), loop()だけの状態:9,844 byte 使用
+ # include <Wire.h>:10,840 byte
+ Wire.begin(); :14,340 byte
+ Wire.beginTransmission();:14,892 byte
Wire.write();
Wire.endTransmission();
+ Wire.requestFrom();:15,364 byte
Wire.read();
どう考えても,I2Cを使うとプログラムメモリは1KBも残っていないことになりますよね(^^;;;;;;
UARTには500 byteぐらいは必要ですので,もうぎりぎりです。
ちなみにRAMは1.3KBぐらいは残っているようですので,そうは心配ないと思っています。
[テストプログラム]
表示用LCDはカラーセンサーとI2Cライブラリを共有できるものにしています。
初期設定など,ほとんどATtiny402用のプログラムの流用です(^^;;;;
(1/2)
![](https://stat.ameba.jp/user_images/20230803/21/pta55/67/8c/j/o0668087915320613091.jpg?caw=800)
ループ部もほぼATtiny402用と同じですが,自作のI2C接続のLCDなので少し表示の記述が異なります。
(2/2)
![](https://stat.ameba.jp/user_images/20230803/21/pta55/d7/5a/j/o0798095715320613095.jpg?caw=800)
[プログラムでの注意点]
私なりにArduinoでCH32V003をプログラムする時に思ったことです。
・システムで9.8KB,I2Cで5.5KB,UARTで0.5KBぐらいは使うと思っておく
・Stringクラスのようなメモリを食うものは使わない
・コンパイルエラーが出たら,エラー表示の最初の2行ぐらいを最後までたどって,メモリーのover flowが何バイトなのか確かめて対処を考える。
今回は手間がかからない20Pinでテストしてみましたが,CH32V003シリーズはPin数は違ってもメモリ構成は同じですから,メモリの問題点は同じでしょうね。
ま,I2Cが動いたのでセンサーがいろいろ付けられそうです(^^)。