LoginSignup
4
4

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-09-29

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

・前準備
1.配線
[1]
ブレッドボードに挿してみる。
cap_1.png

orz
大きい。仕方ないので、ブレッドボード2枚使う。
cap_2.png

[2]
アナログデータを可変抵抗にするよう配線。
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

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

3.サーバー
アクセスポイント化したラズパイのサーバーを用意した。
サーバーはRubyで記述するのでRuby導入済み。
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

ラズパイAPに接続して電文を投げている。
ラズパイ側の出力を確認。
cap_6.png

UDPの電文を受け取って、標準出力している。
esp側の可変抵抗をてきとーに変えて、コンソールを確認。
cap_7.png

で、ラズパイ側。
cap_8.png

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

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

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4