Project_OKI’s diary

エンジニアの勉強ブログ

MbedとobnizのI2C通信

MbedとobnizのI2C通信

1.目的

・nucleof401とobnizでI2C通信を行い、nucleof401で送ったコマンドをobnizでホームページ上に表示する。

 

2.使用部品

個数 部品名 型番
1 接続ケーブル ジャンパーワイヤ​​  
1 mbed(マイコンボード)

NUCLEO-F401RE STM32 Nucleo-64

1 USBケーブル

USB2.0ケーブル タイプAオス-ミニBオス:alls well​​​

1 obniz

obniz Board 1Y 

1 抵抗 10kΩ
1 ブレッドボード ブレッドボード、ジャンパセット​​
1 タクトスイッチ 1273HIM-160G-G
     


実際には、10kΩ抵抗が表面実装しかなかったので、ブレッドボードではなくユニバーサル基板で作成した。

3.実際の動作




最初は下記サイトのサンプル動作

obniz Slave Read


2個めが自分で作成したプログラムの動作

 

仕様: 
 ・nucleof401:
  ・マスター側
  ・nucleof401についている青ボタンを押すと、0x01と0x02のコマンドを送信
  ・mbedプログラムで作成
 ・obniz:
  ・スレーブ側
  ・コマンドを受け取ると、ホームページに数値を表示
  ・赤ボタンを押すと、ボタンONの表示
  ・HTML,CSS,Javascriptで作成 
参考:
 ・obniz公式

 

4.回路図



・配線

 

5.プログラム

mbed側:

電源:
 ・USBより供給
mbed側ピン配置:
 ・PB8:SCL
 ・PB9:SDA
 ・PC13:mbed付属青ボタン
 ・3.3V:obniz+ピンへ接続(obniz電源)
 ・GND:obniz-ピンへ接続(obnizGND)

//mbedヘッダのインクルード
#include "mbed.h"

//接続先アドレスの設定:0x01
#define addr   (0x01 << 1)  // 8bit address

//ピンのI2C設定
//PB9:SDA
//PB8:SCL
I2C i2c(PB_9,PB_8);
//ボタン入力設定
DigitalIn sw1(PC_13);
//LED出力設定
DigitalOut LED(PA_5);

//メイン処理開始
int main(){
    //送信コマンド宣言
    char cmd[2];
    //送るコマンドの代入
    //1と2を送る。
    cmd[0]=0x01;
    cmd[1]=0x02;

    while (true) {
        //繰り返し
        //スイッチがONの場合の動作
        if(sw1 == 0){
         LED = 1;   //LED点灯
         i2c.write(addr,cmd,2);  //I2Cコマンドの送信
        }else{  //スイッチがOFFの場合の動作
         LED=0;      //LED消灯
        }
    }
}

 

 

obniz側:

電源:
 ・mbed(nucleof401)の3.3Vを使用
obniz側ピン配置: 
 ・ピン0:SDA
 ・ピン1:SCL
 ・ピン2:赤ボタン(Signal)
 ・ピン3:赤ボタン(GND)
 ・+ピン:mbedの3.3Vに接続
 ・-ピン:mbedのGNDに接続

<!-- 
 日付:2022/02/06
 目的:obnizとmbedのI2C通信
 概要:mbedで送ったI2Cのコマンドを表示させる。
  ファイル名:i2c_slave.html
 -->

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8" />
    <!-- obnizの設定-->
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <link
      rel="stylesheet"
      href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
    />
    <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
    <script
      src="https://unpkg.com/obniz@3.x/obniz.js"
      crossorigin="anonymous"
    ></script>
    <!-- obnizの設定完了-->
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />

    <title>I2Cテストプログラム</title>
    <!-- CSSの設定 -->
    <link rel="stylesheet" href="style.css" />

    <!-- UI kitの追加 -->
    <link
      rel="stylesheet"
      href="https://cdn.jsdelivr.net/npm/uikit@3.6.18/dist/css/uikit.min.css"
    />
    <!-- UIkit JS -->
    <script src="https://cdn.jsdelivr.net/npm/uikit@3.6.18/dist/js/uikit.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/uikit@3.6.18/dist/js/uikit-icons.min.js"></script>

    <!-- JQuaryの追加 -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
  </head>

  <body>
    <!-- main.js(javascript)ファイルの読み込み -->
    <script type="text/javascript" src="./main.js"></script>

    <!-- HTML書き出し -->
    <h1>I2Cプログラミング(Slave)</h1>
    <h2>説明</h2>
    <h3>nucleof401で送信したデータを受信し、表示する</h3>
    <h3>数値 <span id="data1" class="square">数値表示</span></h3>
  </body>
</html>
/* CSSファイル */
/* ファイル名:style.css */
/* 装飾の設定 */
.square {
  background: pink;
  display: block;
  width: 200px;
  height: 100px;
  text-align: center;
}

 

//javascriptプログラム
//ファイル名:main.js

//put your obniz ID(obniz IDの入力)
//var obniz = new Obniz("OBNIZ_ID_HERE"); //ホームページを開いたときにobnizの番号を入れる
//自分のobniz番号を入力
var obniz = new Obniz("xxxxxx");	//ホームページを開くと、自動的に[xxxxx]に接続(自分のobnizのIDを入力)

//変数宣言
//ホームページの表示
let textno = "数値表示部分(obniz接続中)"; //ボタンOFF時表示
let texton = "testボタンon";    //ボタンON時表示

//during obniz connection:obnizの動作処理開始
obniz.onconnect = async function () {
    console.log("開始");

    //ボタンの入力設定
    //GND:ポート2,信号:ポート3として、入力
    var button = obniz.wired("Button", { signal: 2, gnd: 3 });
    console.log("ボタン読み込み");
    //id:html側の data1を取得し、buttonOnに格納
    var buttonOn = document.getElementById("data1");

    //I2C通信動作
    //slave設定
    function i2cProg() {
        console.log("通信開始");
        var i2c = obniz.getFreeI2C();
        //i2c設定:salve側に設定
        //アドレス:0x01に設定
        //0番ピン:SDA、1番ピン:SCL
        i2c.start({ mode: "slave",sda:0,scl:1,slave_address: 0x01 });

        //i2cデータ取得
        i2c.onwritten = function (data) {
            console.log("データ取得");
            //入力データを表示
            console.log(data);
            buttonOn.innerHTML = data;
        }
    }
    i2cProg();
    //ボタン入力動作
    //ボタンONの時
    button.onchange = function (pressed) {
        if (pressed === true) {
            //textonを表示
            buttonOn.innerHTML = texton;
        } else if (pressed === false) {
            i2cProg();
          //textnoを表示
buttonOn.innerHTML = textno; } } }


以上により、mbedとobnizでI2C通信ができる。

参考:
Obniz-Arduino間でのI2C通信をしてみた。
mbedピン配置
obniz I2C ライブラリ

 

3.関連記事

関連記事一覧:
obniz関連

ObnizとjQuaryでLED点灯/消灯 - Project_OKI’s diary

ObnizでDFplayer動作(UART通信) - Project_OKI’s diary

mbed関連:

mbed(nucleo f401)でサーボモータを動作させる - Project_OKI’s diary

mbedとマルチプレクサで、複数サーボモータ制御 - Project_OKI’s diary

mbedでソレノイド制御 - Project_OKI’s diary

nucleof401RE(外部電源の使い方) - Project_OKI’s diary