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カードから読み込ませる事にする。




