読者です 読者をやめる 読者になる 読者になる

(ブログ名 '未定)

プログラミングとかのメモ帳

mbedでI2C通信

プログラミング 組み込み

 作成中のシステムでI2Cのプログラムが必要になり、勉強しがてら、簡単なテストモジュールを作ってみた。

作ったもの

マスター側のマイコンはスイッチの情報を読み込み(ジャンパー線と抵抗で代用している)、I2Cでその情報を送る。
スレーブ側のマイコンは、I2Cで送られてきた情報を読み込み、対応したLEDを点灯させる。
f:id:ikemaki:20161030144149p:plain

材料

名前 備考
LPC1768 1 マスター側のマイコン
LPC1114 1 スレーブ側のマイコン
LED 4 対応した情報を表示する
抵抗330Ω 4 LEDの抵抗
抵抗1kΩ  4 スイッチの代用品
抵抗2.2kΩ 2 I2Cのプルアップ抵抗

ソース

マスター側(LPC1768)

// test with lpc1768 

#include "mbed.h"

#define in_1 p5
#define in_2 p6
#define in_3 p7
#define in_4 p8

#define sda p28
#define scl p27
#define addr 0x0A

DigitalIn in1(in_1);
DigitalIn in2(in_2);
DigitalIn in3(in_3);
DigitalIn in4(in_4);

I2C master(sda, scl);

int main() {
    char cmd[4];
    DigitalIn inputs[4]={in1, in2, in3, in4};
    while(1) {
        // reset input_val
        for (int i=0; i<4; i++){
            cmd[i]=inputs[i];
        }
        // I2C tuusin
        master.write(addr, cmd, 4);
        
        wait(0.2);
    }
}

スレーブ側(LPC1114)

// test with lpc1114

#include "mbed.h"

#define led_1 dp10
#define led_2 dp11
#define led_3 dp13
#define led_4 dp14

#define sda dp5
#define scl dp27
#define addr 0x0A

DigitalOut led1(led_1);
DigitalOut led2(led_2);
DigitalOut led3(led_3);
DigitalOut led4(led_4);

I2CSlave slave(sda, scl);

int main() {
    char buff[4];
    DigitalOut leds[4]={led1, led2, led3, led4};
    
    int receive;
    
    slave.address(addr);
    while(1){
        // I2C tuusin
        receive = slave.receive();
        
        if(receive==I2CSlave::WriteAddressed){
            slave.read(buff, 4);
        }
        // led_ reset
        for(int i=0; i<4; i++){
            leds[i]=buff[i];
        }
        wait(0.1);
    }   
}

感想、考察など

  • mbed同士なら、ピン番号を変えるだけで、同じマイコンでも動作するようになるはず、、、。
  • I2Cののプルアップ抵抗を忘れて、何時間も苦労した。
  • 長年の疑問を解決したような感覚で、嬉しい。

参考文献

このモジュールを作成するにあたっては、以下のサイトが参考になりました。ありがとうございました。

I2Cの原理を動画で分かりやすく解説しています。

mbedでI2Cのライブラリを使う方法を解説しています。