500円esp8266を子機デバイスとし、wifiでサーバーに
アナログデータを飛ばすよーなものを動作確認の為、作ってみた。
2.ソース
とりあえず、通信はせず、アナログ値をコンソールに出すものを
書いてみた。
#include <ESP8266WiFi.h>
int val = 0;
void setup() {
// put your setup code here, to run once:
Serial.begin(9800);
}
void loop() {
// アナログ入力
val=analogRead(0);
String str_val = "val=" + String(val);
Serial.println(str_val);
delay(2000);
}
つまみを回すと、値が変化して出力される。
3.サーバー
アクセスポイント化したラズパイのサーバーを用意した。
サーバーはRubyで記述するのでRuby導入済み。
MACとはLANケーブルで直挿し。
親機になるLANアダプタを挿してAPサーバーにしている。
電源はモバイルバッテリー使用。
電圧足らないのか、立ち上がっても、MACからなかなか正常に接続出来ないのが、難点。。。
・実装
1.ラズパイ側のUDPサーバーのソース
リクエストがポート4567番でくると内容を標準出力する。
# coding: utf-8
require 'socket'
$: << File.expand_path('../', __FILE__)
# UDPサーバー
udps = UDPSocket.open()
port = 4567
udps.bind('', port)
loop do
msg,addr = udps.recvfrom(65535)
data = msg.chomp
puts "#{Time.now}:recv:#{data}"
sleep(0.1)
end
udps.close
とりあえず、これだけ。
ruby便利。。。
2.Aruduino側のソース
前準備のソースで記述したものに、APに接続する処理と、UDPでデータを飛ばす処理を追加する。
#include <ESP8266WiFi.h>
#include <WiFiUDP.h>
// APのSSID
const char *ssid = "XXXXXXXX";
// APのパスワード
const char *pwd = "XXXXXXX";
// UDPサーバーアドレス(APサーバーと同じ)
const char *app_udp_addr = "192.168.128.12";
// UDPサーバーのポート
const int app_udp_port = 4567;
// 割り振られたIP
static String localIp;
// ボードのMAC
static String macAddr;
// UDP
static WiFiUDP wifiUdp;
// アナログ値
int val = 0;
// MACアドレス取得
static String getMACAddress()
{
byte mac[6];
WiFi.macAddress(mac);
return String(mac[5],HEX)
+ ":"
+ String(mac[4],HEX)
+ ":"
+ String(mac[3],HEX)
+ ":"
+ String(mac[2],HEX)
+ ":"
+ String(mac[1],HEX)
+ ":"
+ String(mac[0],HEX);
}
// Wifi接続初期化
static void WiFi_setup()
{
IPAddress ip;
// APに接続
WiFi.begin(ssid, pwd);
while(WiFi.status() != WL_CONNECTED) {
// つながるまで待つ
delay(1000);
}
Serial.println("ap connected!!!");
localIp = String(WiFi.localIP());
macAddr = getMACAddress();
Serial.print("local ip:");
Serial.println(localIp);
Serial.print("mac:");
Serial.println(macAddr);
wifiUdp.begin(app_udp_port);
}
void setup() {
Serial.begin(9800);
// Wifi接続初期化
WiFi_setup();
}
// メインループ
void loop() {
// アナログ入力
val=analogRead(0);
// 電文作成(MACとアナログ入力値を送る)
String send_msg;
send_msg = "mac=" + macAddr + ",val=" + String(val) + "\r\n";
char msgBuf[send_msg.length()];
send_msg.toCharArray(msgBuf, send_msg.length());
// デバッグ出力
Serial.println("------------"); //入力された値をモニターに出力
Serial.println(msgBuf); //入力された値をモニターに出力
Serial.println("------------"); //入力された値をモニターに出力
// UDPで指定サーバー・ポートへ電文を送信
wifiUdp.beginPacket(app_udp_addr, app_udp_port);
wifiUdp.write(msgBuf);
wifiUdp.endPacket();
// 5秒wait
delay(5000);
}
アナログの入力値をMACを付けて送信する。
これにより、どのボードから送ったか判別する(という目論見。。。)
・実行
1.ラズパイ側のUDPサーバー
[1]+ 停止 emacs ./
pi@raspberrypi:~/hoge/ecp $ ruby ./hoge_udp_srv.rb
接続がないので、待機状態。。。
2.aruduino側
ビルドしてボードに書き込む。終わったら実行。
ラズパイAPに接続して電文を投げている。
ラズパイ側の出力を確認。
UDPの電文を受け取って、標準出力している。
esp側の可変抵抗をてきとーに変えて、コンソールを確認。
受信出来ている。
esp8266ってすごい。。。
・TODO
APの情報をコードに埋め込んでいるので、SDカードから読み込ませる事にする。