- STM32F103C8I2Cの概要
- STM32F103C8のI2Cピン
- ArduinoのI2Cピン
- 必要なコンポーネント
- 回路図と接続
- STM32でのI2Cプログラミング
- マスターSTM32プログラミングの説明
- スレーブArduinoプログラミングの説明
以前のチュートリアルでは、2つのArduinoボード間のSPIおよびI2C通信について学習しました。このチュートリアルでは、1つのArduinoボードをSTM32F103C8であるBlue Pillボードに置き換え、I2Cバスを使用してArduinoボードと通信します。
STM32はArduinoボードよりも多くの機能を備えています。したがって、SPIおよびI2Cバスを使用してSTM32とArduino間の通信について学ぶことは素晴らしいことです。このチュートリアルでは、ArduinoとSTM32F103C8間の通信にI2Cバスを使用し、次のチュートリアルでSPIバスについて学習します。STM32ボードの詳細については、他のSTM32プロジェクトを確認してください。
STM32F103C8I2Cの概要
STM32F103C8ブルーピルボードのI2C(Inter Integrated Circuits)をArduino Unoと比較すると、ArduinoにはATMEGA328マイクロコントローラーが搭載されており、STM32F103C8にはARMCortex-M3が搭載されていることがわかります。STM32には2つのI2Cバスがありますが、Arduino Unoには1つのI2Cバスしかなく、STM32はArduinoよりも高速です。
I2C通信の詳細については、以前の記事を参照してください。
- ArduinoでI2Cを使用する方法:2つのArduinoボード間の通信
- PICマイクロコントローラPIC16F877とのI2C通信
- I2Cを使用した16X2LCDとESP32のインターフェース
- MSP430ランチパッドとのI2C通信
- I2Cを使用せずにLCDをNodeMCUに接続する
- arduinoの単一プログラムでマルチ通信(I2C SPI UART)を処理する方法
STM32F103C8のI2Cピン
SDA: PB7またはPB9、PB11。
SCL:PB6またはPB8、PB10。
ArduinoのI2Cピン
SDA: A4ピン
SCL: A5ピン
必要なコンポーネント
- STM32F103C8
- Arduino Uno
- LED(2-Nos)
- 押しボタン(2-Nos)
- 抵抗器(4-Nos)
- ブレッドボード
- 接続線
回路図と接続
次の表は、I2Cバスを使用するためのSTM32 BluePillとArduinoUno間の接続を示しています。必要なワイヤーは2本だけです。
STM32F103C8 |
Arduino |
ピンの説明 |
B7 |
A4 |
SDA |
B6 |
A5 |
SCL |
GND |
GND |
接地 |
重要
- ArduinoGNDとSTM32F103C8GNDを一緒に接続することを忘れないでください。
- 次に、10kのプルダウン抵抗を両方のボードのプッシュボタンピンに別々に接続します。
このSTM32I2Cチュートリアルでは、STM32F103C8をマスターとして、Arduinoをスレーブとして構成します。両方のボードには、LEDとプッシュボタンが別々に取り付けられています。
STM32でのI2C通信を実証するために、スレーブArduinoプッシュボタン値を使用してマスターSTM32 LEDを制御し、マスターSTM32F103C8プッシュボタン値を使用してスレーブArduinoLEDを制御します。これらの値は、I2C通信バスを介して送信されます。
STM32でのI2Cプログラミング
プログラミングはArduinoコードに似ています。同じ
このチュートリアルには、マスターSTM32用とスレーブArduino用の2つのプログラムがあります。 双方のための完全なプログラムは、デモンストレーションビデオでこのプロジェクトの終わりに与えられ ます。
マスターSTM32プログラミングの説明
マスターSTM32で、何が起こっているかを見てみましょう。
1.まず、STM32F103C8でI2C通信機能を使用するためのWireライブラリとsoftwireライブラリを含める必要があります。
#include
2. void setup()で
- ボーレート9600でシリアル通信を開始します。
Serial.begin(9600);
- 次に、ピン(B6、B7)でI2C通信を開始します。
Wire.begin();
3. Void loop()内
- まず、スレーブArduinoからデータを取得するため、スレーブアドレス8で requestFrom() を使用し、1バイトを要求します。
Wire.requestFrom(8,1);
受信した値は、 Wire.read() を使用して読み取られます。
バイトa = Wire.read();
- スレーブからの受信値に応じて、PA1ピンで デジタル書き込み を使用してマスターLEDをオンまたはオフにし、シリアル印刷を使用してシリアルモニターに値を印刷します
if(a == 1) { digitalWrite(LED、HIGH); Serial.println( "マスターLEDオン"); } else { digitalWrite(LED、LOW); Serial.println( "マスターLEDオフ"); }
- 次に、マスターSTM32プッシュボタンであるピンPA0のステータスを読み取る必要があります。
int pinvalue = digitalRead(buttonpin);
- 次に、ロジックに従ってピン値を送信するため、 if 条件を使用して 、 アドレスとして8を使用してスレーブarduinoで送信を開始し、プッシュボタンの入力値に従って値を書き込みます。
if(pinvalue == HIGH) { x = 1; } else { x = 0; } Wire.beginTransmission(8); Wire.write(x); Wire.endTransmission();
スレーブArduinoプログラミングの説明
1.まず、I2C通信機能を使用するためのWireライブラリを含める必要があります。
#include
2. void setup()で
- ボーレート9600でシリアル通信を開始します。
Serial.begin(9600);
- 次に、スレーブアドレスを8としてピン(A4、A5)でI2C通信を開始します。ここでは、スレーブアドレスを指定することが重要です。
Wire.begin(8);
次は呼び出す必要が Wire.onReceive スレーブがマスターから値を受信したときに機能を Wire.onRequestの スレーブからの関数呼び出し時にマスター要求値。
Wire.onReceive(receiveEvent); Wire.onRequest(requestEvent);
3.次に、リクエストイベント用と受信イベント用の2つの関数があります。
リクエストイベントの場合
マスターSTM32がスレーブから値を要求すると、この関数が実行されます。この関数は、スレーブArduinoプッシュボタンから入力値を取得し、 Wire.write() を使用して、プッシュボタンの値に従ってバイト(1または0)をマスターSTM32に送信します 。
void requestEvent() { int value = digitalRead(buttonpin); if(value == HIGH) { x = 1; } else { x = 0; } Wire.write(x); }
受信イベントの場合
マスターがスレーブアドレス(8)でスレーブにデータを送信すると、この機能が実行されます。この関数は、マスターから受信した値を読み取り、バイト型の変数に格納し、 if ロジックを使用して、受信した値に応じてスレーブLEDをオンまたはオフにします。受信値が1の場合、LEDがオンになり、0の場合、LEDがオフになります。
void receiveEvent(int howMany) { バイトa = Wire.read(); if(a == 1) { digitalWrite(LED、HIGH); Serial.println( "スレーブLEDがオン"); } else { digitalWrite(LED、LOW); Serial.println( "スレーブLEDオフ"); } delay(500); }
出力
1.マスターSTM32の押しボタンを押すと、スレーブアルディオノに接続されているLEDが点灯(白)します。
2.スレーブ側の押しボタンを押すと、マスターに接続されているLEDが点灯(赤)し、ボタンを離すとLEDが消灯します。
3.両方の押しボタンが同時に押されると、両方のLEDが同時に点灯し、ボタンが押されるまで点灯したままになります。
つまり、これが STM32でI2C通信が行われる方法です。これで、任意のI2CセンサーをSTM32ボードとインターフェースできます。
マスターSTM32とスレーブArduinoの完全なコーディングは、デモビデオとともに以下に示されています。