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
このうち、STM32でそのまま(?)動く形になっているのは
ssd1306_128x64_i2c_STM32
だけで、あとはオリジナルのものから変わっていないようだ。
とりあえず、ssd1306_128x64_spiを使ってみる
あらかじめ、Adafruit GFX Libraryをライブラリマネージャからインストールしておこう。
また、
https://qiita.com/nanbuwks/items/ba37f049f45378da0e2b
これになぞって、
Arduino_STM32-masterの中にある STM32F1/libraries/Adafruit_SSD1306/Adafruit_SSD1306_STM32.cpp
を修正
# 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.
となった。
# include <Adafruit_SSD1306.h>
を
# include <Adafruit_SSD1306_STM32.h>
としたらコンパイルが通るようになった。
後述のピンアサインを変更したら、
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
の該当箇所を書き換えると直すとエラーが出なくなった。
さて、実行。
シリアルモニターに
x: 45 y: 0 dy: 4
x: 70 y: 0 dy: 5
x: 4 y: 0 dy: 4
x: 120 y: 0 dy: 2
x: 104 y: 0 dy: 5
x: 127 y: 0 dy: 2
x: 43 y: 0 dy: 1
x: 124 y: 0 dy: 4
x: 122 y: 0 dy: 2
x: 9 y: 0 dy: 3
と出ているが画像が出ない。
あれれ?
ピンアサインの変更
僕のテストボードのピンアサインに合わせて以下のように変更
うまく行かなかったやりかた
// If using software SPI (the default case):
// #define OLED_MOSI 9
// #define OLED_CLK 10
// #define OLED_DC 11
// #define OLED_CS 12
// #define OLED_RESET 13
// Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
// Uncomment this block to use hardware SPI
# define OLED_DC PA6
# define OLED_CS PA4
# define OLED_RESET PA3
Adafruit_SSD1306 display(OLED_DC, OLED_RESET, OLED_CS);
//
うまくいったやりかた
結局、
// 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の設定を使いました。