LoginSignup
2
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-10-27

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

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

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1