SPI SD1306 OLED を STM32Duino ( Arduino IDE + One of BluePill : Robotdyn STM32F103 Dev.Board )で動かす

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を使ってみる
![image](https://qiita-image-store.s3.amazonaws.com/0/139524/e448d1fb-6d40-43a7-cd27-b21feef4ffc3.png)


あらかじめ、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の設定を使いました。