HOME
  Security
   Software
    Hardware
  
FPGA
  CPU
   Android
    Raspberry Pi
  
nLite
  Xcode
   etc.
    ALL
  
LINK
BACK
 

2023/03/20

STM32で I2C OLED SSD1306を制御する方法、Arduinoを使うと簡単 STM32で I2C OLED SSD1306を制御する方法、Arduinoを使うと簡単

(How to Control I2C SSD1306 OLED with STM32F103 in Arduino)

Tags: [ワンチップCPU]




● STM32で I2C OLED SSD1306を制御する方法、Arduinoを使うと簡単

 How to Control I2C SSD1306 OLED with STM32F103 in Arduino

 STM32は I2Cを 2系統持っています。

I2C1SCL = PB6、SDA = PB7
I2C1SCL = PB8、SDA = PB9
I2C2SCL = PB10、SDA = PB11
※ I2C1のピンはどっちか片方だけの排他

STM32F103x8 Datasheet

・STM32 I2C1
STM32 I2C1


・STM32 I2C2
STM32 I2C2



utility/twi.c
  obj->i2c = pinmap_merge_peripheral(i2c_sda, i2c_scl);

...

#if defined I2C1_BASE
        // Enable I2C1 clock if not done
        if (obj->i2c == I2C1) {

#if defined I2C2_BASE
        // Enable I2C2 clock if not done
        if (obj->i2c == I2C2) {

#if defined I2C3_BASE
        // Enable I2C3 clock if not done
        if (obj->i2c == I2C3) {

...


● I2C1を使う場合の接続方法(SCL = PB6、SDA = PB7)

・STM32で I2C OLED SSD1306を制御する方法 I2C1(SCL = PB6、SDA = PB7)を使う場合の接続方法
STM32で I2C OLED SSD1306を制御する方法 I2C1(SCL = PB6、SDA = PB7)を使う場合の接続方法



● I2C1を使う場合の接続方法(SCL = PB8、SDA = PB9)

・STM32で I2C OLED SSD1306を制御する方法 I2C1(SCL = PB8、SDA = PB9)を使う場合の接続方法
STM32で I2C OLED SSD1306を制御する方法 I2C1(SCL = PB8、SDA = PB9)を使う場合の接続方法



● I2C2を使う場合の接続方法(SCL = PB10、SDA = PB11)

・STM32で I2C OLED SSD1306を制御する方法 I2C2(SCL = PB10、SDA = PB11)を使う場合の接続方法
STM32で I2C OLED SSD1306を制御する方法 I2C2(SCL = PB10、SDA = PB11)を使う場合の接続方法




● I2C OLED SSD1306の Arduinoライブラリ

・ Adafruit
Adafruit_SSD1306

 ※ 起動時の Adafruitのロゴ (゚⊿゚)イラネー(プログラムメモリの無駄)
・起動時の Adafruitのロゴ (゚⊿゚)イラネー(プログラムメモリの無駄)
起動時の Adafruitのロゴ (゚⊿゚)イラネー(プログラムメモリの無駄)



・Adafruit
Adafruit



・ ThingPulse
ThingPulse OLED SSD1306 (ESP8266/ESP32/Mbed-OS)

・ThingPulse
ThingPulse



 下記の警告が出ますが、無視して大丈夫です。
WARNING: library ESP8266 and ESP32 OLED driver for SSD1306 displays claims to run on esp8266, esp32 architecture(s) and may be incompatible with your current board which runs on stm32 architecture(s).
 ※ RP2040でも同様に問題無く動きました


● STM32で I2C OLED SSD1306を制御する方法のソースリスト

 下記のソースで、Adafruitと ThingPulseの両方に対応しています。
 //#define ADAFRUIT

 また、 STM32の I2C1の 2系統、I2C2のそれぞれにもコメント部分を変更する事で対応しています。
 (実際に各パターンで動作を確認済み)

// I2C OLED SAMPLE for STM32F103C8T6

// I2C
#include <Wire.h>

// OLED SSD1306 128x64
//#define ADAFRUIT
#ifdef ADAFRUIT
  // https://github.com/adafruit/Adafruit_SSD1306
  // #define SSD1306_NO_SPLASH /* opt-out of including splash images in PROGMEM */
  #include <Adafruit_SSD1306.h>
#else
  // https://github.com/ThingPulse/esp8266-oled-ssd1306
  #include <SSD1306Wire.h>
#endif

// STM32 Blue Pill and Black Pill
#define ONBOARD_LED_BLUE PC13
#define ONBOARD_LED_BLACK PB12
#define LED_ON LOW
#define LED_OFF HIGH

// I2C OLED SSD1306 128x64
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32

#ifdef ADAFRUIT
// I2C1
// Wire default SDA = PB7, SCL = PB6
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// I2C2
// OK TwoWire Wire1(PB11, PB10); // Use STM32 I2C2 SDA, SCL
// OK TwoWire Wire1(PB7, PB6); // Use STM32 I2C1 SDA, SCL
// OK TwoWire Wire1(PB9, PB8); // Use STM32 I2C1 SDA, SCL
// Adafruit_SSD1306 display(128, 64, &Wire1);
#else
#define OLED_BRIGHTNESS 196
// I2C1
// Wire default SDA = PB7, SCL = PB6
// SSD1306Wire display(SCREEN_ADDRESS);
int _frequency = 1000000;
SSD1306Wire display(SCREEN_ADDRESS, -1, -1, GEOMETRY_128_64, I2C_ONE, _frequency);

// I2C2
// OK TwoWire Wire1(PB11, PB10); // Use STM32 I2C2 SDA, SCL
// OK TwoWire Wire1(PB7, PB6); // Use STM32 I2C1 SDA, SCL
// OK TwoWire Wire1(PB9, PB8); // Use STM32 I2C1 SDA, SCL
// SSD1306Wire display(SCREEN_ADDRESS, -1, -1, GEOMETRY_128_64, I2C_TWO, _frequency);
#endif


void blinkLed() {
  digitalWrite(ONBOARD_LED_BLUE, LED_ON);
  digitalWrite(ONBOARD_LED_BLACK, LED_ON);
  delay(20);
  digitalWrite(ONBOARD_LED_BLUE, LED_OFF);
  digitalWrite(ONBOARD_LED_BLACK, LED_OFF);
  delay(200);
}

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  Serial.println("setup()");

  pinMode(ONBOARD_LED_BLUE, OUTPUT);
  pinMode(ONBOARD_LED_BLACK, OUTPUT);

  blinkLed();
  blinkLed();

  Serial.println("display.begin()");
// OK  Wire.setSCL(PB8); // I2C1:SCL: PB6 to PB8
//  Wire.setSDA(PB9); // I2C1:SDA: PB7 to PB9

// OK  Wire.setSCL(PB10); // I2C1:SCL: PB6 to PB10
//  Wire.setSDA(PB11); // I2C1:SDA: PB7 to PB11

// NG  Wire.setSCL(PB0);
//  Wire.setSDA(PB1);

// NG Wire.setSCL(PA6);
//  Wire.setSDA(PA7);

  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
#ifdef ADAFRUIT
  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }
#else
  display.init();
#ifdef OLED_BRIGHTNESS
  display.setBrightness(OLED_BRIGHTNESS);
#endif
  display.flipScreenVertically();
  display.clear();
  display.setTextAlignment(TEXT_ALIGN_LEFT);
  display.setFont(ArialMT_Plain_10);
#endif

  Serial.println("display.display()");

  // Show initial display buffer contents on the screen --
  // the library initializes this with an Adafruit splash screen.
  display.display();
  delay(2000); // Pause for 2 seconds

  // Clear the buffer
#ifdef ADAFRUIT
  display.clearDisplay();
#else
  display.clear();
#endif
}

int lp = 0;

void loop() {
  // put your main code here, to run repeatedly:
  Serial.println("loop()");

  blinkLed();
  blinkLed();

#ifdef ADAFRUIT
  uint8_t s = (uint8_t)random(5);
  if (s == 0) {
    display.clearDisplay();
  } else {
    uint8_t x = (uint8_t)random(SCREEN_WIDTH);
    uint8_t y = (uint8_t)random(SCREEN_HEIGHT);

    uint8_t c = (uint8_t)random(2);
    if (c == 0) {
      // display.setTextColor(WHITE);
      display.setTextColor(WHITE, BLACK); // Erase Background
    } else {
      display.setTextColor(BLACK, WHITE); // Reverse
    }
    display.setTextSize(s);
    display.setCursor(x, y);
    display.print("OLED Display");
  }

  display.setTextColor(WHITE, BLACK);
  display.setTextSize(1);
  display.setCursor(0, 0);
  display.print(lp++);
  display.display();
#else
  uint8_t s = (uint8_t)random(5);
  if (s == 0) {
    display.clear();
  } else {
    uint8_t x = (uint8_t)random(SCREEN_WIDTH);
    uint8_t y = (uint8_t)random(SCREEN_HEIGHT);

    uint8_t c = (uint8_t)random(2);
    if (c == 0) {
      display.setColor(WHITE); // White
    } else {
      // display.setColor(BLACK); // Black
      display.setColor(WHITE); // White
    }
    switch (s) {
      case 2: display.setFont(ArialMT_Plain_16); break;
      case 3: display.setFont(ArialMT_Plain_24); break;
      default: display.setFont(ArialMT_Plain_10); break;
    }
    display.drawString(x, y, "OLED Display");
  }

  display.setColor(WHITE); // Erase Background
  display.setFont(ArialMT_Plain_10);
  char buf[10];
  display.drawString(0, 0, itoa(lp++, buf, 10));
  display.display();
#endif
}


● STM32のI2Cのトラブルを回避する方法

 STM32ファミリのI2Cペリフェラルの正しい初期化方法。

技術ノート(日本語):STM32のI2Cペリフェラルの初期化におけるヒント
 STJFAE150004 2015年4月20日 Rev.1

アプリケーション ノート:AN2824 STM32F10xxx I²C 最適化例
 AN2824 STM32F10xxx I²C optimized examples

開発のヒント I2C端子の設定方法
 具体的には、AFRレジスタ→MODERレジスタ →SPEEDRレジスタ →OTYPERレジスタ →PUPDRレジスタの順でGPIOを設定した後にI2Cのクロックを有効にします。
 この順序を守らないと、通信が始まっていないのに、I2CのBUSYフラグが立つ場合があります。



Tags: [ワンチップCPU]

●関連するコンテンツ(この記事を読んだ人は、次の記事も読んでいます)

STM32 STM32F103C8T6マイコンボードを ST-Link V2(中華製の互換ドングル)を使って開発
STM32 STM32F103C8T6マイコンボードを ST-Link V2(中華製の互換ドングル)を使って開発

  STM32F103C8 ARM Cortex-M3 72MHz CPU、ST-LINK Utilityでファームのアップデート

STM32 STM32F103C8T6の Windows用の開発環境を無料で構築する方法。CubeMX True STUDIO ST-LINK V2
STM32 STM32F103C8T6の Windows用の開発環境を無料で構築する方法。CubeMX True STUDIO ST-LINK V2

  Windows用の STM32F103C8 ARM Cortex-M3 72MHzの開発環境を無料で作る、STM32CubeMX、TrueSTUDIO、ST-LINK V2

STM32 STM32F103C8T6の USB CDC Virtual COM portドライバを Windows 7に組み込む方法
STM32 STM32F103C8T6の USB CDC Virtual COM portドライバを Windows 7に組み込む方法

  Windows 7で VCPドライバを組み込む時に「INFファイルが無効です」の解決方法、COMポート増殖を防ぐ方法(増えすぎた COMポートを削除)

STM32 STM32F103C8T6の USB CDC Virtual COM portデバイスを実装する
STM32 STM32F103C8T6の USB CDC Virtual COM portデバイスを実装する

  STM32 STM32F103C8T6に STCubeで CDC VCPデバイスを組み込み、動作試験のループバックを実装する

STM32 STM32F103C8T6で ARM GCCの Cソース中にインラインアセンブラを記述する方法
STM32 STM32F103C8T6で ARM GCCの Cソース中にインラインアセンブラを記述する方法

  ARM GCCの Cソース中にインラインアセンブラを記述する方法

STM32 STM32F103C8T6で SPI接続の 1.8インチ TFT液晶を使用する方法
STM32 STM32F103C8T6で SPI接続の 1.8インチ TFT液晶を使用する方法

  STM32に 128x160 ST7735 TFT 1.8インチ LCDを SPI接続して自前アプリから文字列を描画する方法。

STM32 STM32F103C8T6マイコンボード開発、CubeMX STM32CubeMXの使い方
STM32 STM32F103C8T6マイコンボード開発、CubeMX STM32CubeMXの使い方

  STM32マイコン用の初期設定コード生成ツール STM32CubeMXの使い方、USBデバイスの作成方法

STM32 STM32F103C8のクローン(複製品) 108MHz動作の GD32F103C8、CS32F103C8
STM32 STM32F103C8のクローン(複製品) 108MHz動作の GD32F103C8、CS32F103C8

  STM32クローン GigaDevice GD32F103C8T6 108MHz、CKS CS32F103C8T6 72MHz

ラズパイを意識した別物製品 Orange Pi Zeroを買ってみた、Allwinner H2+ Cortex-A7 4core
ラズパイを意識した別物製品 Orange Pi Zeroを買ってみた、Allwinner H2+ Cortex-A7 4core

  オレンジパイはラズパイよりもコスパは良いが情報が無いので利用者側に一定のスキルが必要

Orange Pi PC 2を買ってみた、Allwinner H5 Cortex-A53 4core ARM64
Orange Pi PC 2を買ってみた、Allwinner H5 Cortex-A53 4core ARM64

  ラズパイを意識した別物製品、オレンジパイはラズパイよりもコスパが良い、でも情報が無い

Raspberry Pi Zero Wを海外通販の Pimoroni等での購入方法、購入できる通販ショップ一覧まとめ
Raspberry Pi Zero Wを海外通販の Pimoroni等での購入方法、購入できる通販ショップ一覧まとめ

  ラズパイゼロW ワイヤレスモデルを海外通販でサクッと簡単に個人輸入で入手。技適通過でも国内販売は常に品切れ

大人気の CPUボード、Raspberry Pi 3 Model Bで作ってみよう
大人気の CPUボード、Raspberry Pi 3 Model Bで作ってみよう

  Raspberry Piの開発環境の構築やタッチパネル付き液晶ディスプレイや各種センサーの使い方まとめ

Espressif ESP32 Arduino互換でスケッチが使える WROOM32開発基板
Espressif ESP32 Arduino互換でスケッチが使える WROOM32開発基板

  Espressif ESP32 32ビット Arduino互換マイコンボードをお手軽に開発する方法

Espressif ESP8266 Arduino互換でスケッチが使える ESP-12Eモジュール基板
Espressif ESP8266 Arduino互換でスケッチが使える ESP-12Eモジュール基板

  Espressif ESP8266 ESP-12-E NodeMCU V1 ESP12 CP2102

BangGood通販はドローン以外にも面白い商品がまだまだ有った(電子工作編)
BangGood通販はドローン以外にも面白い商品がまだまだ有った(電子工作編)

  レーザー彫刻機、カラー液晶の DIYオシロ、Arduinoや Raspberry Pi用の小型カラー液晶




[HOME] | [BACK]
リンクフリー(連絡不要、ただしトップページ以外は Web構成の変更で移動する場合があります)
Copyright (c) 2023 FREE WING,Y.Sakamoto
Powered by 猫屋敷工房 & HTML Generator

http://www.neko.ne.jp/~freewing/cpu/stm32_i2c_oled_ssd1306_arduino/