[作業ログ]ESP8266でアナログデータをwifiで飛ばしてみる


500円esp8266を子機デバイスとし、wifiでサーバーに
アナログデータを飛ばすよーなものを動作確認の為、作ってみた。


・前準備
1.配線
[1]
ブレッドボードに挿してみる。
![cap_1.png](https://qiita-image-store.s3.amazonaws.com/0/38889/552bd31c-3851-d325-9aaf-7f9dfc2c0ee9.png "cap_1.png")

orz
大きい。仕方ないので、ブレッドボード２枚使う。
![cap_2.png](https://qiita-image-store.s3.amazonaws.com/0/38889/28165e4c-e3cb-6d33-018d-17b5387c85ca.png "cap_2.png")

[2]
アナログデータを可変抵抗にするよう配線。
![cap_3.png](https://qiita-image-store.s3.amazonaws.com/0/38889/bc092b0e-fbaa-9b0d-4ba9-dff9db130d32.png "cap_3.png")


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);
}

```

ビルドして、実行してみる。
![cap_4.png](https://qiita-image-store.s3.amazonaws.com/0/38889/4c475b76-720b-12a9-78b3-deac4662ed13.png "cap_4.png")

つまみを回すと、値が変化して出力される。


3.サーバー
アクセスポイント化したラズパイのサーバーを用意した。
サーバーはRubyで記述するのでRuby導入済み。
![raspi.png](https://qiita-image-store.s3.amazonaws.com/0/38889/32453b61-093e-80c4-d9e3-a775c98ff506.png "raspi.png")
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側
ビルドしてボードに書き込む。終わったら実行。
![cap_5.png](https://qiita-image-store.s3.amazonaws.com/0/38889/9380e735-84df-8ff8-a117-d62ceacb4c13.png "cap_5.png")


ラズパイAPに接続して電文を投げている。
ラズパイ側の出力を確認。
![cap_6.png](https://qiita-image-store.s3.amazonaws.com/0/38889/911004a8-f0cc-ad68-3ec4-ea8b79022e6b.png "cap_6.png")

UDPの電文を受け取って、標準出力している。
esp側の可変抵抗をてきとーに変えて、コンソールを確認。
![cap_7.png](https://qiita-image-store.s3.amazonaws.com/0/38889/d29fc17a-ec3a-1e1f-a02a-ca1cbdabf29d.png "cap_7.png")

で、ラズパイ側。
![cap_8.png](https://qiita-image-store.s3.amazonaws.com/0/38889/12087e86-1bca-88a5-ca54-7009213716e6.png "cap_8.png")

受信出来ている。
esp8266ってすごい。。。


・TODO
APの情報をコードに埋め込んでいるので、SDカードから読み込ませる事にする。