この記事は
「SPI SD1306 OLED を STM32Duino ( Arduino IDE + One of BluePill : Robotdyn STM32F103 Dev.Board )で動かす」
https://qiita.com/nanbuwks/items/25ccb1ac38ebb237f94a.md
を再構成したものです
AVTOKYO 2017 BADGE は、0.96inのディスプレイがついています。OLEDディスプレイで、SPIでSTMマイコンに接続しています。
サンプルプログラム
STM32用のライブラリの中にあるサンプルプログラム
~/Arduino/hardware/Arduino_STM32-master/STM32F1/libraries/Adafruit_SSD1306/examples$ ls
ssd1306_128x32_i2c ssd1306_128x64_i2c_STM32
ssd1306_128x32_spi ssd1306_128x64_spi
がありますが、ssd1306_128x64_spiを使ってみます。
ライブラリインストール
あらかじめ、Adafruit GFX Libraryをライブラリマネージャからインストールしておこう。
また、
https://qiita.com/nanbuwks/items/ba37f049f45378da0e2b
これになぞって、
Arduino_STM32-masterの中にある STM32F1/libraries/Adafruit_SSD1306/Adafruit_SSD1306_STM32.cpp
を修正
(2018/11/1時点の最新版で確認したところ、この作業は必要なくなりました。)
#include <avr/pgmspace.h>
//#ifndef __SAM3X8E__ || __STM32F1__
//#include <util/delay.h>
//#endif
#include <stdlib.h>
//#include <HWIRE.h>
//#include <HardWire.h>
//HardWire HWIRE(1,I2C_FAST_MODE); // I2c1
HardWire HWIRE(2,I2C_FAST_MODE); // I2c2
を以下のように書きなおす。
#include <avr/pgmspace.h>
//#ifndef __SAM3X8E__ || __STM32F1__
//#include <util/delay.h>
//#endif
#include "Wire.h"
#define WIRE_WRITE HWIRE.write
#include <stdlib.h>
//#include <HWIRE.h>
//#include <HardWire.h>
//HardWire HWIRE(1,I2C_FAST_MODE); // I2c1
HardWire HWIRE(2,I2C_FAST_MODE); // I2c2
としておきます。
コンパイル
/tmp/arduino_modified_sketch_898425/ssd1306_128x64_spi.ino:22:30: fatal error: Adafruit_SSD1306.h: No such file or directory
#include <Adafruit_SSD1306.h>
^
compilation terminated.
となった。
ssd1306_128x64_spi.ino スケッチの、
#include <Adafruit_SSD1306.h>
を
#include <Adafruit_SSD1306_STM32.h>
としたらコンパイルが通るようになった。
ピンアサインの設定
さて、AVTOKYO 2017 BADGEのピンアサインに合わせてssd1306_128x64_spi.ino スケッチを、以下のように変更
// If using software SPI (the default case):
#define OLED_MOSI PA7
#define OLED_CLK PA5
#define OLED_DC PA6
#define OLED_CS PA4
#define OLED_RESET PA3
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
/* Uncomment this block to use hardware SPI
#define OLED_DC 6
#define OLED_CS 7
#define OLED_RESET 8
Adafruit_SSD1306 display(OLED_DC, OLED_RESET, OLED_CS);
*/
こうすると、software SPIの設定になります。
なお、hardware SPIを使おうとしましたが、うまくいきまんでした。
ピンアサインを変更した後、コンパイルエラーが出るようになった。
STM32_ssd1306_128x64_I2C:65: error: #error ("Height incorrect, please fix Adafruit_SSD1306.h!");
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
^
exit status 1
該当箇所は
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#end
となっていたので
Adafruit_SSD1306.h
の該当箇所を書き換える。
#define SSD1306_128_64
// #define SSD1306_128_32
// #define SSD1306_96_16
上記のように SSD1306_128_64 を有効にするとエラーが出なくなる。