RasPi2 でスタンドアローンThingspeak Server

最初見たときは、Thingspeak をプロキシーするか、API をたたいているんだと思っていましたが、これは単体で動作するっていうことなんでしょうかね?

https://github.com/iobridge/thingspeak

手順を見る限り、MySQL + Ruby + Rails 入れてる感じです。

これをRaspiで動作させて、ESP8266 からのセンサーを投げているブログを見ました。

Raspberry PI – Standalone Thingspeak Server installation
http://www.esp8266-projects.com/2015/05/raspberry-pi-standalone-thingspeak.html

 

今日から夏休みなので、これも題材としたいなと。うまく動けば、RasPi2 + ESP8266 で低消費電力なデータロガーができそうです。

ESP12の配線いろいろ

 

ESP-12 や ESP-07 は2mm ピッチの穴が開いているのでブレッドボードやユニバーサル基盤に収まらず、変換基盤をつけたり自作したりしているわけですが、世の中のそんな実装を集めてみました。

2015-05-08 13.15.50

http://wa0uwh.blogspot.jp/2015/05/esp8266-esp-12.html

 

 

9557225000_1418754453

1524219100_1418754452

http://www.esp8266.com/viewtopic.php?f=13&t=782

 

 

2015-03-14 17.06.27

http://blog.squix.ch/2015/03/esp8266-module-comparison-esp-01-esp-05.html

 

 

FJV7WFII50CPT2P.LARGE

http://www.instructables.com/id/Make-ESP8266-REV-12-prototype-friendly/

 

FYLODIII622H6UB.LARGE

http://www.instructables.com/id/Getting-Started-with-the-ESP8266-ESP-12/

 

 

hqdefault

https://www.youtube.com/watch?v=wBfCPHXtSSY

 

 

IMAG0091

http://www.element14.com/community/community/design-challenges/sudden-impact/blog/2015/03/19/easyconfigure–remote-sensor-unit-preparation

 

 

ESP-07-Soldered-to-Perf-Board-2_sm

http://2xod.com/articles/ESP8266_Quick_Getting_Started/

 

 

P1050194

http://hackers.gallery/672/electronics/sunday-soldering-20150215

 

 

38de9bd81791b5692ce1645024349111

http://ehbtj.com/electronics/esp-12-try

 

 

B87_OXdIIAEOKaX

https://twitter.com/markusulsass/status/562667626695258112

 

 

IMG_5279

http://www.esp8266.com/viewtopic.php?f=11&t=1568

 

 

実にいろんな実装方法があって楽しいです。薄くて、面積を小さくするにはやはりピンを直接くっつけるのが良さそうです。小さいですが、穴は開いていますので、そこにワイヤーを半田付けしてユニバーサル基盤につけるのがいいのかなと。

 

自分は以下のような感じで、浅めのピンに直付けする案を考えています。

 

写真 1

このピン、浅めでボードにはめ易いです。

写真 3

ユニバーサル基盤は一番細いのにつけて内側に足を持ってくる感じが良いかなと。ユニバーサル基盤につけるならば、リセットボタンと、ジャンパーかスイッチで書き込みモードに変更するものを付け、UART用のメスピンヘッダーをつけようかなと。

osx のシリアルポートのユーティリティーあれこれ

シリアルをtelnet 経由してつなげるようになったので、ArduinoIDE からシリアルをWiFi で書き込めるようにしてみようとあれこれやること、1日弱。結局、osx では良いツールが見つからずできませんでした。

何ができなかったかと言うと、仮想シリアルポートを作成して、それをArduinoIDE から認識できずで、何かやり方があるんだろうと思います。socat の使い方が悪いんだと思うので、継続して調査。Windows だとこのあたりのツールはたくさんあって、苦労しない感じなので、次回は、Windows でやってみることに。

で、いろいろsocat の使い方を試しているうちに、昨日の疑問が解けました。

・ESP12 の接続IPにつなげて、echo が表示されてしまう問題
・CTL + C など 接続した先でやりたいんだけど、socat の接続元(osx 側)で CTL + C になる問題

これは、以下のようにすれば良いようです。

$ socat STDIN,raw,echo=0 TCP:192.168.1.36:23

raw をつけておけば、そのままコントロール信号も送られるけども、手元のターミナルは中断できないので、ターミナルウィンドウを閉じてしまう感じ。tcpdump とか、WiFi 経由のシリアルから入って採取してるときとか、CTL + C できるし、上矢印のコマンド履歴も、tab 補完キーも効きます。理屈がわかってしまえば、あ、そうかということですが。。。。

 

調べているときに、よくまとまったBlog記事があったので、メモしておきます。

Make RS232 Serial Devices Accessible via Ethernet
http://blog.philippklaus.de/2011/08/make-rs232-serial-devices-accessible-via-ethernet/

最後に、socat でのソケットを分割するには、以下のようにやれば良い事がわかりました。

ishizaka_—_socat_—_ttys008_—_76×23_と_ishizaka_—_socat_—_ttys007_—_76×23_と_ishizaka_—_socat_—_ttys002_—_76×23_と_ishizaka_—_tail_—_ttys009_—_76×36

sudo socat -d -d -d -d -lf /tmp/socat \
pty,\
link=/dev/master,\
raw,\
echo=0,\
user=junkhack,\
group=staff\
\
pty,\
link=/dev/slave,\
raw,\
echo=0,\
user=junkhack,\
group=staff

 

 

どうやって、arduinoIDE のシリアルポートに表示させるかが課題です。

WiFi 経由のシリアルコンソールで、ずっとtcpdump を流してテストしていますが、接続もきれず良い感じです。あと、話は飛びますが、ESP8266 Arduino Core のドキュメント見てましたら、File system も使えるようですね。これはある程度まで、データをメモリに貯めておいて、まとめてWifi 出力でデータを飛ばせば、電力の消費も抑えられそうです。sleep mode の下調べはおおよそ終わったので、コード実装して、電池駆動にしてテストするデバイス作りを夏休み(まだこれからなんですが)にやれればと思っています。ESP8266 、こんなに遊べるとは。まだlua にするのもありますしね。今年いっぱいは遊べる感じです。飽きるか、いきづまらなければね。

ESP-12でraspi2のシリアルコンソールをWiFi化

前から、興味があった透過型のUARTーWiFIブリッジ的に使う方法をあれこれ試していました。

結論から言えば、出来ました。

こんな感じで、電源はRasPi2 から取っていますので蓋の中に収められそうです。

uart-wifi

ESP-12 に収めるプログラムは、なんとサンプルスケッチの中にありました。WiFiTelnetToSerial です。

/*
WiFiTelnetToSerial - Example Transparent UART to Telnet Server for esp8266

Copyright (c) 2015 Hristo Gochkov. All rights reserved. This file is part of the ESP8266WiFi library for Arduino environment.

This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */

include <ESP8266WiFi.h>

//how many clients should be able to telnet to this ESP8266

define MAX_SRV_CLIENTS 1

const char ssid = "yyyyy"; const char password = "xxxxx";

WiFiServer server(23); WiFiClient serverClients[MAX_SRV_CLIENTS];

void setup() { Serial1.begin(115200); WiFi.begin(ssid, password); Serial1.print("\nConnecting to "); Serial1.println(ssid); uint8_t i = 0; while (WiFi.status() != WL_CONNECTED && i++ < 20) delay(500); if(i == 21){ Serial1.print("Could not connect to"); Serial1.println(ssid); while(1) delay(500); } //start UART and the server Serial.begin(115200); server.begin(); server.setNoDelay(true);

Serial1.print("Ready! Use 'telnet "); Serial1.print(WiFi.localIP()); Serial1.println(" 23' to connect"); }

void loop() { uint8_t i; //check if there are any new clients if (server.hasClient()){ for(i = 0; i < MAX_SRV_CLIENTS; i++){ //find free/disconnected spot if (!serverClients[i] || !serverClients[i].connected()){ if(serverClients[i]) serverClients[i].stop(); serverClients[i] = server.available(); Serial1.print("New client: "); Serial1.print(i); continue; } } //no free/disconnected spot so reject WiFiClient serverClient = server.available(); serverClient.stop(); } //check clients for data for(i = 0; i < MAX_SRV_CLIENTS; i++){ if (serverClients[i] && serverClients[i].connected()){ if(serverClients[i].available()){ //get data from the telnet client and push it to the UART while(serverClients[i].available()) Serial.write(serverClients[i].read()); } } } //check UART for data if(Serial.available()){ size_t len = Serial.available(); uint8_t sbuf[len]; Serial.readBytes(sbuf, len); //push UART data to all connected telnet clients for(i = 0; i < MAX_SRV_CLIENTS; i++){ if (serverClients[i] && serverClients[i].connected()){ serverClients[i].write(sbuf, len); delay(1); } } } }

ArduinoIDE へ、ESP8266 Arduino Core の最新(ver. 1.6.5-1044-g170995a, built on Aug 10, 2015)を収めました。

SDK1.3 が収まったものは、以下のStaging versionから入れました。

ESP-12のファームウェアをv1.3.0 に

オフィシャルのツールがWindows のexe だったので、バーチャルボックスでインストール。

Flash download tool Vsersion:v1.2

http://bbs.espressif.com/viewtopic.php?f=57&t=433

DETECTED INFO に 32Mbit って出てました。前回、調査したように、やはりESP-12 には、32M-bit / 4M-byte ( 4,194,304 )あるようです。今まで、512Kb でもarduino とかと比べると、おおーたくさんあるねと思っていましたが、それの4倍です。ちょっと得した気分ですね。クリスタルは26Mhz のようです。

GW-20150812-000341 で、書き込みして、AP に接続できるようにしてリセットかけてみました。ちゃんとフラッシュに設定は保存されて、バージョンも1.3.0 になっていました。UART の都合上、Windows のCoolTerm で接続テストはやりました。

GW-20150812-000919

あと、マニュアルのP.55 に 前からできるみたいなんだけども、UART-WiFi passthrough modeというのがあって、WiFi経由でシリアルにパススルーできるようです。osx 側の nc は brew で netcat を入れています。osx のだとオプションが通らないので。

CoolTerm_0_と_ishizaka_—_ESP8266_—_netcat_—_ttys000_と_名称未設定

この設定は、フラッシュに保存されないようなのですが、IP と Port を打ち込めるようなものをESP側に付ければ、WiFi 経由でシリアルを操れることになりますね。これを、単機能にしてESPのAP に接続しにきたものをシリアルに流すだけのファームが透過のブリッジのファームウェアの原理なのかも。このあたりは、次回以降実験してみたいと思います。

あ、あとWEBにもオフィシャルのAT コマンド(ちょっと古いけど)があったので、メモ。

CIPMODE

https://github.com/espressif/esp8266_at/wiki/CIPMODE

ま、とりあえずフラッシュが4Mあって、SDK1.3も書き込めるということがわかったのでとりあえず今日はここまで。