「Arduinoが無線で接続できたらいいのに…」と思っている方へ

  • 7
    Like
  • 0
    Comment

Arduinoは便利で、PCと接続すれば様々なセンサーから情報を取ってきたり、制御を行うことができます。

しかし、このつなぐ問部分がネックになり、実現しえないことがありました。
例えば、脈拍のビジュアライズ。脈拍センサーは数種類Arduinoにあるので、ほどほど接続してしまえば何とかなります。でも、対象者が動く場合、配線でつなぎ留めておくわけにはいきません。

無線で情報を送ってくれる「Arduinoっぽいもの」があれば…

そんなあなたにぜひ紹介したい!そんなボードががあるんです!

ESP-WROOM-02開発ボード(ESPr Developer)

ESP-WROOM-02開発ボード.PNG
出展:スイッチサイエンス

お値段なんと2,580円!
お手頃!

さて、どのように無線で接続すかというと、こういう感じです。
ESP-WROOM-02開発ボード2.PNG

SoftAPモードではESP-WROOM-02自体がアクセスポイントになります。
つまり、プログラムを書き込んだESP-WROOM-02をモバイルバッテリーに接続した瞬間、Wifiが飛びます。
PC側では、このアクセスポイントに接続するだけでOKです。

StationModeは、他のWifiを経由して接続します。こっちのほうがイメージしやすいですかね。

見てわかる通り、ジャンパワイヤーを差し込む穴があります。
このあたりもArudinoと同じなので、親しみやすいところです。

大きさはこちらの画像を見ていただければわかる通り、小さいです。
(重なっている白い箱のようなものは、センサー側の装置です。)
14595586_1598741463763581_6273077075903958125_n.jpg

モバイルバッテリーからの給電でも動きました。

実用例

モバイルバッテリーからの給電でESP-WROOM-02を駆動(アクセスポイントモード)。脈拍センサーからの情報をTOUTから読み込み、UDPで飛ばしています。
ビジュアライズはおなじみのvvvvです。

test3.gif

実装については、こちらの情報に沿って行いました。
ESP8266を使ってArduinoからネットワーク接続してみる
ESP8266にArduinoスケッチを書き込んでUDPデータ送受信
(筆者のイシイさんありがとうございます。)

アナログのセンサー値を、TOPUTピンから取ってくるにはややコツがあってこちらを参考にしました。http://qiita.com/azusa9/items/26e74e4e0d5773ce9c41

また、ファームウエア更新を手探りでやったのですが、メモリの番地指定とかあって、わけもわからずやったら起動すらしなくなって詰みかけました。そんなとき、こちらのサイトに救われましたので、もし同様のことで困ったら見てみるといいかもしれません。
http://nemuisan.blog.bai.ne.jp/?eid=215341

最終的に私が使ったコードはこちら。

ESP
#include <ESP8266WiFi.h>
#include <WiFiUDP.h>
extern "C" {
#include "user_interface.h"
}

//Access Point Setting
const char *APSSID = "ESP_WROOM_02";
const char *APPASS = "hoge4009";
unsigned int localPort = 8888;

WiFiUDP UDP;
char packetBuffer[255];

static const char *udpReturnAddr = "192.168.4.2";
static const int udpReturnPort = 8889;

void setup() {

  Serial.begin(115200);
  Serial.println();

  WiFi.softAP(APSSID, APPASS);

  IPAddress myIP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(myIP);
  UDP.begin(localPort);

}

void loop() {

  int packetSize = UDP.parsePacket();

 if (packetSize) {

    int len = UDP.read(packetBuffer, packetSize);
    //終端文字設定
    if (len > 0) packetBuffer[len] = '\0';



  uint ADC_Value = 0;
  ADC_Value = system_adc_read();
  Serial.println("=======ANALOG " + String(ADC_Value) + "ANALOG ");


String str = String(ADC_Value) ;
int a = str.length();
 char msg[a+1];
  str.toCharArray(msg, a+1);


    UDP.beginPacket(udpReturnAddr, udpReturnPort);
    UDP.write(msg,a+1);
    UDP.endPacket();  

} 

}

※記憶が正しければ、PC側からポート8888へUDPで「1」を飛ばしてあげる必要があります。
というのは、この処理を入れずに、電源入れたらすぐUDP走らせてねってやると、ボード自体がうまく動かないからです。

よきvvvvLifeを!

This post is the No.18 article of vvvv Advent Calendar 2016