Más contenido relacionado
La actualidad más candente (20)
Similar a ワンコインでIot入門 第二章 (17)
ワンコインでIot入門 第二章
- 4. 必要なハードウエア
ITEM 最安値 価格備考 備考
Arduino nano clone 179円 前回購入 マイコン本体。前回使ったものを利用
USB cable(mini) 100円 前回購入 前回使ったものを利用
LANケーブル 0円 エンジニアなら余るほど持ってるはず
ジャンパーコード
各3種類×40本
239円 aliexpress 最安値 オスメス、メスメス、オスメス
全種類。どうせ今後使うので
3種類全部準備
ENC28J60 266円 aliexpress 最安値 イーサネットモジュール
3.3v 電源 70円 3.3vの外部電源が必要なことが判明
種類手配中
ワンコインを超えてる気もするが、とりあえず気にしない
- 7. なぜArduino uno + ENC28J60なのか=安いから
ArduinoのEthernet実装の選択肢
今回の構成 Ethernet Shield
実装例 Arduino nano クローン(139円〜)
+ENC28J60 (266円〜)
正規版
Arduino UNO (3000円ぐらい)
+ Ethernet Shield(3000円ぐらい)
クローン
Arduino UNO (270円ぐらい)
+ Ethernet Shield(551円ぐらい)
利点 安い、小さい
世界的には情報量が多い
半田いらず
情報量が多い
欠点 ピンの半田付け必須 大きい
酔っぱらって触って壊してもいいやと思える程度にお手軽(酒の肴に最適)
ワンコインにこだわらなかったらEthernet Shield クローンもアリ
- 8. ArduinoとENC28J60との通信:SPI
Arduinoと周辺機器とのデジタル通信インターフェースの例
SPI I2C UART
トポロジー
概要 SCLK: クロック
SOMI: 周辺機器からArduinoへの通信
SIMO: Arduinoから周辺機器への通信
SS: 通信する周辺機器を選択
SCL: クロック
SDAI:データ送受信
TX: データ送信
RX:データ受信
特徴 バイナリー通信
Pros:全二重、通信速度が早い
Cons,:結線が多い
バイナリー通信
周辺機器のアドレスで対象を選択
Pros:結線数が少ない
Cons;半二重通信、遅め
テキスト通信の利用も多い
Pros:全二重そこそこ早い
Cons: 通信速度は両端で手動設定
実装例 TFT液晶、イーサネット等の
高速通信
デジタルセンサー、LCD液晶など Arduinoへのスケッチ書き込み
ATコマンドやGPSのNMEA、,Log出力等
のテキスト通信
Arduino
周辺機器
周辺機器
SCLK
SOMI
SIMO
SS1
SS2 Arduino
周辺機器
周辺機器
SDA
SCL
Arduino 周辺機器
TX
RX
RX
TX
バス型 バス型 P2P型
- 9. なぜMQTTなのか
1. 理由(棒読み)
HTTP MQTT
トポロジー
通信 1:1のRequest-Responseが基本。
擬似的なPush型通信実現のため、頻繁
にRequestが発生、トラフィック増加
Push型通信をサポート
Sub/Pub型のため、容易に1:Nを実現
データ量 扱うデータが小さいのでプロトコルヘッ
ダーの割合が相対的に大きい
IoTに最適化されているため小さい
なんとなくまわりで流行ってて楽しそうだから
HTTP
Server
Client A
Client B
Response
Request
Response
Request
Client A
MQTT
Broker
Client B
Client C
Request/Response型 Sub/Pub型
2. 理由(本音)
- 10. Ether
Ubuntu 14.04
MQTT
Subscriber
MQTT
Publisher
MQTT Broker
今回実装する概要1: ArduinoでPublishテスト
Arduino nano clone
MQTT Subscriber
MQTT Publisher
ENC
28J60
IP network
1. “output”購読
2. “output”に”Ready”を発行
3. “Ready”受信
シリアルモニタ(UART)へ
ログを出力
1. テスト用MQTTクライアントがtopic”output”をsubscribe
2. Arduino起動後、Topic”output”へ”Ready”という文字列をpublish
3. テスト用MQTTクライアントが”Ready”という文字列を受信
(*) 一連の開析のため、テキストログをシリアル通信( UART)へ出力
- 12. Server側準備
❖ 環境
➢ OS: Ubuntu 14.04
➢ MQTT: Mosquitto ubuntuデフォルトのパッケージは古いのでNG。PPAで最新
版をインストール
$sudo apt-get install software-properties-common
$sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
$sudo apt-get update
$sudo apt-get install mosquitto
$sudo service mosquitto start
$sudo apt-get install mosquitto-clients
- 13. Server側接続テスト
サーバ上にターミナルを2つ立ち上げ、topic”output”経由で文字列”test”が送受信される事
を確認
$mosquitto_sub -d -t "output" -h localhost
Client mosqsub/2308-ip-172-31- sending CONNECT
Client mosqsub/2308-ip-172-31- received CONNACK
Client mosqsub/2308-ip-172-31- sending SUBSCRIBE
(Mid: 1, Topic: output, QoS: 0)
Client mosqsub/2308-ip-172-31- received SUBACK
Subscribed (mid: 1): 0
Client mosqsub/2311-ip-172-31- received PUBLISH (d0, q0,
r0, m0, 'output', ... (4 bytes))
test
$mosquitto_pub -t "output" -h localhost -m "test"
MQTT Publish
Termina1: Subscriber 側 Termina2: Publisher 側
- 17. RJ45
USB
Arduino物理的準(3.3v外部電源)
D12 D11 D10
5V GND
D13
SO
SCK
GNDVCC
SI
3.3v
SI
3.3V
GND
CS
GND
外部電源
乱暴に言えば「3.3v」が電
池でいうプラスでGNDがマ
イナス
本来5vのArduinoと3.3vの周辺機器は給電だけでなくデータ線も直接接続できず、レベル変換が必要ですが
28J60のデータ線は5vに耐えられる(5v tolerant)なのでOK
- 20. #include <UIPEthernet.h>
#include <PubSubClient.h>
byte mac[] = {0x00,0x01,0x02,0x03,0x04,0x05};
byte server[] = { 192,168,1,1 };
EthernetClient ethClient;
void callback(char* topic, byte* payload, unsigned int length);
PubSubClient client(server, 1883, callback, ethClient);
void setup(){
Ethernet.begin(mac);
Serial.begin(9600);
Serial.print("IP Address : ");
Serial.print(Ethernet.localIP());
Serial.print("/");
Serial.println(Ethernet.subnetMask());
if (client.connect("arduinoClient")) {
Serial.println("MQTT PubSub Ready");
client.publish("output","ready");
client.subscribe("input");
}else{
Serial.println("MQTT PubSub failer");
}
}
void loop(){
client.loop();
}
void callback(char* topic, byte* payload, unsigned int length) {
byte* pl = (byte*)malloc(length);
memcpy(pl,payload,length);
if (memcmp(pl, "ping",4)==0) {
Serial.println("Payload=ping");
client.publish("output","ok");
}
free(pl);
}
開発環境(サンプルスケッチ)
「カンマ」区切りの
MQTT brokerの
IPアドレス
MACアドレス手書
きっすか!!
- 21. 書き込み:シンボリックリンクを作成
❖ OSXではArduino nanoのUARTのデバイス名に空白文字が含まれ、IDEで正常に
扱えないのでシンボリックリンクを作成
-rw- 1 root wheel 18, 93 4 24 14:23 cu.wch ch341 USB=
$ sudo ln -s "/dev/cu.wch ch341 USB=>RS232 fd120" /dev/cu.wch
Password:
$ ls -al /dev/cu.*
crw-rw-rw- 1 root wheel 18, 3 4 3 15:24 /dev/cu.Bluetooth-Modem
crw-rw-rw- 1 root wheel 18, 1 4 3 15:24 /dev/cu.Bluetooth-PDA-Sync
lrwxr-xr-x 1 root wheel 0 4 24 14:20 /dev/cu.wch -> /dev/cu.wch ch341 USB=>RS232 fd120
crw-rw-rw- 1 root wheel 18, 97 4 24 14:46 /dev/cu.wch ch341 USB=>RS232 fd120 ダメなデバイス名
- 23. Publishのテスト
$mosquitto_sub -d -t "output" -h localhost
Client mosqsub/2308-ip-172-31- sending CONNECT
Client mosqsub/2308-ip-172-31- received CONNACK
Client mosqsub/2308-ip-172-31- sending SUBSCRIBE
(Mid: 1, Topic: output, QoS: 0)
Client mosqsub/2308-ip-172-31- received SUBACK
Subscribed (mid: 1): 0
Client mosqsub/2311-ip-172-31- received PUBLISH (d0, q0,
r0, m0, 'output', ... (4 bytes))
Ready
1.ubuntuで”output”をサブスクライブ
4.文字列”Ready”を受信
2.Arduinoのリセットボタンで再起動
IP Address : 172.16.81.52/255.255.192.0
MQTT PubSub Ready
3.シリアルモニタでDHCOで取得した
IPアドレス、MQTT接続を確認