またまたCH32V003ネタです。
I2CインターフェースのOLEDのディスプレイをArduino UNO R3用のDFPlayer miniシールドに以前実装した過去の経験があったのですが、今回は、CH32V003で使用するためライブラリの解析をしたので共有します。
恐らくCH32V003でOLED SSD1306を使い方で、私と同じくライブラリを探している方には朗報です。
Arduinoで使用する場合は、ネットで検索するとすぐいろいろヒットします。
前述のArduino UNO R3用のシールでは、Adafuruitのライブラリを使っています。
まぁ、販売用なのでIDEからインストールできるライブラリである必要もあったので、公開されているライブラリで実装しました。
さて、今回はCH32V003ですが、やはり開発環境が整いつつあるとはいえ、Arduino IDEでは、ポン付けでは使えません。
ネットでいろいろなライブラリを使ってみたという記事を拝見します。例えばこちら。
そのまま使えるかどうかという点までしか記事になっていないのですが、紹介されているライブラリであってもArduino IDE環境では使えなったりします。
今回は、ACROBOTIC_SSD1306ライブラリを解析しCH32V003でも使えるようにしたので、紹介します。
ACROBOTIC_SSD1306は、Arduino IDEのライブラリのインストーラーから検索しインストールできます。前述の記事では、1.0.0では動いたが、1.0.1では動かないと紹介されている。
自分もそうでした。
うんともすんともです。
調べてみると、3か所の修正でArduino IDEを使用したCH32V003でも無事動きました。
ACROBOTIC_SSD1306.cpp
1 2 3 4 5 6 7 8 9 |
... // bool ACROBOTIC_SSD1306::putChar(unsigned char ch) ↓ void ACROBOTIC_SSD1306::putChar(unsigned char ch) { // if (!m_font) return 0; ↓ if (!m_font) return; ... |
putCharというアスキーコードをsendDataする関数ですが、boolで宣言されています。
フォントが格納されているm_font配列が存在しない場合は、0を返すようにエラー処理がされていますが、bool宣言されてしまっています。本関数の戻り値は、このreturn 0;のみなのですが、bool宣言されているので、正常に動きません。Arduino IDE 1.8.10でなコンパイルではエラーにはならず、ワーニングにもなりません。※ここが開発途中なのでしょうね。
じゃぁ、int宣言にしてもみたのですが、これの何故か正常に動きません。もちろんですが、コンパイルは通ります。※ここの開発途中なのでしょうね。
このフォント配列のエラー処理の戻り値も実際は使用もされていないので、void関数にしてしまいます。
著者の方も検証も完全に行って公開しているようではなさそうです。
突っ込みどころが他にも多いのですが、ACROBOTIC_SSD1306.cppは、この2点の修正で動きます。
ACROBOTIC_SSD1306.h
関数を変更したので、ヘッダーファイルも修正します。
1 2 3 4 |
... // bool putChar(unsigned char c); void putChar(unsigned char c); ... |
これにて、サンプルプログラムも動くようになります。
解析ついでに改善点も多く見つけたのでいっそのこと新規にライブラリを作成してしまえという感じでもあったのですが、暇なときにでもやってみようと思います。
本ライブラリは、8×8のフォントも実装しており、Flashに配列で格納するため、Flashがかなりひっ迫します。
開発するファームで必要な最小限のフォントのみに限定すればFlashのひっ迫は改善できると思います。
余談ですが、OLEDは、0.96インチなので、8×8のフォントでも小っちゃくてたいへんです。
ドット表示の具合は拡大鏡が必要だったりします。^^;
独自のフォントの描画もできますが、ビットマップ画像の描画も128 x 64以内で可能です。
が!
Flashが、16kBしかないので、そのまま128 x 64フルでのマップデータは描画はFlashがオーバーフローします。
マップデータの形式を工夫すれば、Flashの節約できそうです。
縦が、8Line * 8bit = 64bitで、横が8bit * 16桁 = 128 bitです。
フルで描画するには、8192bit = 1024byteととなりますが、Flashの容量的には、850byteほどでコンパイルエラーとなります。
因みに、Flashがオーバーフローすると、オーバフローのエラーではなく、以下のようになります。当初は、原因は分からずに困っていました。
1 |
collect2.exe: error: ld returned 1 exit status |
当医院のロゴでも描画しましたが、CH32V003の容量では足りないので、I2C 256bitのメモリを外付けして表示させてみました。
※縁が湾曲しているのは、マクロレンズで撮影したせいです。