![見出し画像](https://assets.st-note.com/production/uploads/images/151347670/rectangle_large_type_2_aa07fb3d0412e262e140215bc41fcf5b.jpeg?width=1200)
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をインストールします。
![](https://assets.st-note.com/img/1724120462494-95ppqL25Bv.png?width=1200)
使うボードに合わせて、メニューの「ツール」ー「ボード」で、「Arduino UNO R4 Minima」か「Arduino UNO R4 WiFiを」選択します。
![](https://assets.st-note.com/img/1724120748094-6YYHmkeWcX.png?width=1200)
デモプログラムの修正箇所ですが、まず、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カ所でエラーが生じます。
![](https://assets.st-note.com/img/1724136854891-UYvciNp2Dh.png?width=1200)
(pStringの前に(const unsigned char *)を書き加えても回避できます)
![](https://assets.st-note.com/img/1724136867699-bAfoH2sWJq.png?width=1200)
(return 0;を削除または、return;に修正しても回避できます)
![](https://assets.st-note.com/img/1724136876882-gtp2qSwmom.png?width=1200)
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などに追加した場合には、それにあわせて、「初期値」「より多く」「全て」の中から選択してください。
![](https://assets.st-note.com/img/1724134369972-8iK7FpWBZV.png?width=1200)
以上で、-fpermissiveのオプションをつけてコンパイルするようになり、コンパイルが無事に終わります。
USBケーブルでラズパイ5につないで、コンパイルしたプログラムをArduinoに書き込めばOKです。
ちなみに、Aruduinoとディスプレイの配線はR4でも同じです。waveshareのwikiページにある通りです。
![](https://assets.st-note.com/img/1724123758648-bmhh4AEvqa.jpg?width=1200)