MbedとobnizのI2C通信
1.目的
・nucleof401とobnizでI2C通信を行い、nucleof401で送ったコマンドをobnizでホームページ上に表示する。
2.使用部品
個数 | 部品名 | 型番 | |
1 | 接続ケーブル | ジャンパーワイヤ | |
1 | mbed(マイコンボード) | ||
1 | USBケーブル | ||
1 | obniz | ||
1 | 抵抗 | 10kΩ | |
1 | ブレッドボード | ブレッドボード、ジャンパセット | |
1 | タクトスイッチ | 1273HIM-160G-G | |
実際には、10kΩ抵抗が表面実装しかなかったので、ブレッドボードではなくユニバーサル基板で作成した。
3.実際の動作
最初は下記サイトのサンプル動作
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と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