見出し画像

Arduino UNO R4にSPIでOLEDディスプレイをつなぐ

Arduino UNO R4では、これまでの8bitのATmega328から、32bitのArm Cortex-M4プロセッサへと、大幅なCPU性能の向上が図られました。ルネサス製RA4M1という日本のメーカーのCPUが採用されたという点でも喜ばしいことです。

今回は、Arduino UNO R4に1.5inch OLEDモジュール(waveshare製)をSPI接続して、デモ用のプログラムをビルド実行してみました。

Arduino UNO R4以前のArduino UNOであれば、ArduinoIDEでデモ用のプログラムを開いて、ビルドして書き込めば動くのですが、R4では少し修正が必要でした。

今回は、開発環境としてラズパイ5を例に説明します。ラズパイ5(ラズパイOS bookworm)では、パッケージでインストールされるArduino IDEのバージョンは1.8.19です。

$ sudo apt install arduino

Waveshareのページから1.5inchOLEDのDemo Code(OLED_Module_Code.7z)をダウンロードして、適当な場所に展開します。

$ 7z x OLED_Module_Code.7z

ArduinoIDEを起動し、展開した ./OLED_Module_Code/Arduino/OLED_1in5_rgb/OLED_1in5_rgb.inoをArduinoIDEで開きます。

UNO R4を始めて使う場合には、ボードマネージャでArduino UNO R4 Boardsをインストールします。

ボードマネージャでArduino UNO R4 Boardsをインストール

使うボードに合わせて、メニューの「ツール」ー「ボード」で、「Arduino UNO R4 Minima」か「Arduino UNO R4 WiFiを」選択します。

デモプログラムの修正箇所ですが、まず、OLED_1in5_rgb.inoの2行目の"GUI_paint.h"を"GUI_Paint.h"に変更します。Windowsの環境だと問題ないのかもしれませんが、Linuxではファイル名の大文字小文字は区別するので、この部分は修正しないとエラーになります。これはR4より前の環境でも同じです。

次に、DEV_Config.cppのSPIの初期化部分の下記のコードを修正します。

25 #if USE_SPI_4W
26   Serial.println("USE_SPI");
27   //set OLED SPI
28   SPI.setDataMode(SPI_MODE3);
29   SPI.setBitOrder(MSBFIRST);
30   SPI.setClockDivider(SPI_CLOCK_DIV2);
31   SPI.begin();

SPIの初期化の関数、setDataMode(), setBitOrder(), setClockDivider()は現在は推奨されない関数す。UNO R4より前の開発環境では互換性のために残されていますが、UNO R4の開発環境では無くなっているため、エラーになってしまいます。
SPIの初期化はSPISettingを使うのが現在推奨されている方法のようです。

25 #if USE_SPI4W
26   Serial.println("USE_SPI");
27   //set OLED SPI
28   SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE3));
29 //  SPI.setDataMode(SPI_MODE3);
30 //  SPI.setBitOrder(MSBFIRST);
31 //  SPI.setClockDivider(SPI_CLOCK_DIV2);
32   SPI.begin();

以上の修正をしたのちコンパイルを実行(左上の[✓]のボタンを押す)すると、下記の3カ所でエラーが生じます。

GUI_Paint.cppでp_textとpStringで型があっていないエラー
(pStringの前に(const unsigned char *)を書き加えても回避できます)
OLED_1in5_rgb.inoでsetup()関数の戻りがvoidなのにreturn 0;と値を返しているエラー
(return 0;を削除または、return;に修正しても回避できます)
font12CN.cppで変数の初期化サイズが未定義のエラー
font24CN.cppでも同じエラーが出ます。

いずれのエラーも以前のコンパイラーでは出なかったものですが、UNO R4のコンパイラーではチェックが厳しくなったために出ているものです。いずれも、コンパイルオプションで-fpermissiveを付ければ、コンパイルエラーを回避(エラーを警告にすることが)できるというようなヒントが表示されています。

そもそもはエラーが出ないようなソースコードに修正するのが正しい対処方法だと思いますが、今回はソースコードの修正を極力しない方法として-fpermissiveをコンパイルオプションに付ける方法でコンパイルを通します。

ArduinoIDEでのコンパイルオプションの追加方法ですが、platform.txtに設定する方法で行いました。

先のボードマネージャで開発環境をインストールすると、そのインストール先は、$HOME/.arduino15/packages/arduino/hardware/renesas_uno/1.2.0になります。platform.txtもその中にあります(インストールしたバージョンが異なる場合は、ディレクトリ名はそのバージョン名です)。

その中の、platform.txtをエディタで開き、compiler.warning_flags.noneの設定の中に、-fpemissiveを追加します。

8 # Compile variables
9 # ------------------------
10 
11 compiler.warning_flags=-w
12 compiler.warning_flags.none=-w -fpermissive
13 compiler.warning_flags.default=
14 compiler.warning_flags.more=-Wall
15 compiler.warning_flags.all=-Wall -Wextra

platform.txtを書き換えた後、ArduinoIDEのメニューの「ファイル」ー「環境設定」を開き、コンパイラーの警告を「なし」に設定します。
platform.txtでcompiler.warning_flags.noneではなくdefault, more, allなどに追加した場合には、それにあわせて、「初期値」「より多く」「全て」の中から選択してください。

環境設定画面

以上で、-fpermissiveのオプションをつけてコンパイルするようになり、コンパイルが無事に終わります。

USBケーブルでラズパイ5につないで、コンパイルしたプログラムをArduinoに書き込めばOKです。
ちなみに、Aruduinoとディスプレイの配線はR4でも同じです。waveshareのwikiページにある通りです。

実行中の様子

この記事が気に入ったらサポートをしてみませんか?