ESP-WROOM-32でWiFiを使うとCPU Haltedになってしまう件
ArduinoのSerial Monitorにエラーが出て使えなかった。
Guru Meditation Error of type InstrFetchProhibited occurred on core 0. Exception was unhandled.
Register dump: 〜ダンプ情報
Backtrace: 〜情報
CPU Halted.
とでる。
調べてみると、電源が怪しいと出ている様子。
このとき使っていたのはakafuguの5V/3.3V Breadboard DC-DC Power Supply。
ここのページによると、ヒューズに500mAのを使用している。ヒューズの仕様として倍の1A位までは電流を流せて、それ以上だと遮断される。
もっと電流を流したいときはヒューズの所をショートさせるかより電流の流せるヒューズに交換とのこと。
とりあえず900mAのをつないでみたけど同じ結果になった。
テスターで見たけど、電圧は下がっていなさそう(瞬間的なものはわからない)。
仕方が無いので、超小型スイッチングACアダプター3.3V2A 100V~240V GF12-US03320 とブレッドボード用DCジャックDIP化キット で試したところ、CPU HaltedにならずにWiFiが使用できた。
ESP-WROOM-02の時にはakafuguので行けていたので、油断していた。
ESP-WROOM-32のMACアドレスを調べる
秋月にESP-WROOM-32が売られていたので、買ってLチカをしてみた。
写真の配線が汚い。いや、色々汚い。
家のルーターの設定で、MACアドレスフィルタリングをかけているので、MACアドレスを調べた。 [2017-03-20追記] ここで出てくるのはsoftAPモードのMACアドレスらしく、ルーターにつなぐ為に必要なStationモードのMACでは無いらしい。実際このMACではつなげなかった。
esp-idf-templateのサンプルプログラムを実行すれば、シリアルに情報が出てきたので、これを使用するのが良さそう。[追記ここまで]
前のESP-WROOM-02と同じく、esptoolを使う。折角なので、gitから取ってくる。
git clone https://github.com/espressif/esptool.git
cd esptool
python setup.py install
以前esptoolを使ったときに必要なパッケージが入っていたのか、特に追加で入れることも無く(pipで入れた物のアップデートはしていた)使えているっぽい(macOS Sierra環境)。
MACアドレスを使う方法はgitのページに書いてあるように、read_macを使う。ESP-WROOM-32に接続しているシリアルのポートは各自の環境に置き換える必要がある。
esptool.py –port /dev/tty.usbserial-hogehoge read_mac
ただ、WiFiはESP-WROOM-02で使えてるので、32でWiFIだけ使ってもいまいち。Bluetoothが使えるようになっているけど、BLEでボタン電池でって使える消費電力では無さそうなので、どういう使い方をしようか悩む。
スペック見ると、色々使える機能が増えてるのでサンプルコードが色々出てきたら試そうかと思った。
AmazonのAudibleを約1ヶ月つかってみた(解約)
最近、電車で立って移動することが多くなってきたので、立って、目をつぶって情報を得る方法があると言うことで、オーディオブックに興味が出た。
Amazon Audibleなら1ヶ月無料で試せるし、プライム会員なら3ヶ月無料らしい。
で、試してみた。
とりあえず、本で読んでいたけど、あんまり頭に入らなかった気がしていた、川端康成の雪国があったので、これを聴いてみた。
速度は1.7-1.8位までは大丈夫だったので、それくらいのスピードで。
これは結構良い感じで聞くことが出来、満足して次を探したけど、あんまり良いのが見つからなかった。
なんとか見つけたのが、H・P・ラヴクラフトシリーズ。
結構沢山あって、聞き応えがある。が、この先特に無いのと、月1500円は高いと思ったので、これは続けないだろうと言うことで解約しました。
解約しても、残りの期間はとりあえず継続出来ると言うことで、あと2ヶ月あるからまあ良いかと思ってたら、まだ1ヶ月無料体験期間中(になってる?)見たいで、残り日数が数日だった。
これは、解約する前に気をつけた方が良いと思った。
次はPodcastでも試してみようと思う。
brew cask upgrade がしたい
Genuino 101 + DHT22 で温度情報をBLEで送る(なんかおかしい)
RaspberryPi 3を買うまでの時間つぶしでGenuino 101を買ったけど、RaspberryPi 3 もう買えるみたい。時間つぶしのはずが目つぶしになっていた。
とりあえず、さっさとBLE使ってみようと言うことで、多めに買っていたDHT22 温度湿度センサの温度情報をBLEで送ってタブレットから見られるようにしてみた。ただ、どうも腑に落ちない部分がある。
Genuino 101の接続
とりあえずGenuino 101の13PinにLEDを直接刺している(よくない)。
DHT22は1Pinが3.3V, 2PinがGenuino 101の12Pin, 3PinはNC, 4PinはGenuino 101のGND。
とりあえずタブレットに情報を出した状態が下記写真。
サンプルプログラムのHeart Rate Monitorを試してたときに挿しているA0-GNDの抵抗は無視して欲しい。
Genuino 101のサンプルスケッチ
環境はMacです。
ArduinoのIDE Version 1.6.8に”Tools -> Board -> Boards Manager"で"101"と入れて検索で出てきたのをインストールすればGenuino 101のパッケージが入る。BoardにArduino/Genuino 101を選択。
下記スケッチを描いた。
ベースはDHT22のサンプルプログラム。
ソースを見るとわかるけど、BLEのサービスを指定して、その定義に従った情報を送ってやる必要がある。
BLEのサービスはここを参考に、Health Thermometerをつかった。
Genuino 101のCurieBLEでどうやってFloatの情報を送るのかサンプルには無かったので、困ったが、雰囲気的に、Floatの32bitデータをchar x 4で送っているような感じ。ただ、下記コードだと、どうもFloatのフォーマットじゃない気がする。でも、Androidのアプリからはそれっぽい値が見えている。謎。
// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain
#include "DHT.h"
#include <CurieBLE.h>
#define DHTPIN 12 // DHT22の接続PIN
const int ledPin = 13; // LEDの接続PIN
// Uncomment whatever type you're using!
#define DHTTYPE DHT22 // DHT 22 (AM2302)
// Initialize DHT sensor.
// Note that older versions of this library took an optional third parameter to
// tweak the timings for faster processors. This parameter is no longer needed
// as the current DHT reading algorithm adjusts itself to work on faster procs.
DHT dht(DHTPIN, DHTTYPE);
BLEPeripheral blePeripheral;
BLEService tempService("1809"); // Health Thermometer Service
BLECharacteristic tempChar("2A1C", BLERead | BLENotify, 5); // Temperature Measurement
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
blePeripheral.setLocalName("TempSketch");
blePeripheral.setAdvertisedServiceUuid(tempService.uuid()); // add the service UUID
blePeripheral.addAttribute(tempService); // Add the BLE Battery service
blePeripheral.addAttribute(tempChar); // add the battery level characteristic
blePeripheral.begin();
dht.begin();
Serial.println("Bluetooth device active, waiting for connections..."); //出ない
}
void loop() {
BLECentral central = blePeripheral.central();
// if a central is connected to peripheral:
if (central) {
Serial.print("Connected to central: ");
// print the central's MAC address:
Serial.println(central.address());
// turn on the LED to indicate the connection:
digitalWrite(ledPin, HIGH);
// Read temperature as Celsius (the default)
float t = dht.readTemperature();
// Check if any reads failed and exit early (to try again).
if (isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// 温度の値tをとりあえずintに
int it = (int)t;
// vals[1] - vals[4]がFloatのバイナリデータ?
const unsigned char vals[5] = {0, (char)it, 0, 0, 0};
tempChar.setValue(vals, 5);
Serial.print("Temperature: ");
Serial.println(it);
// Wait a few seconds between measurements.
delay(500);
}
digitalWrite(ledPin, LOW);
}
Androidアプリで確認
nRF Master Control Panel (BLE)をAndroidのタブレット(Nexus7 2013)に入れて実行。
すでにGenuino 101にスケッチ書いて実行している状態だと、デバイスが見えているはず。
選択し、情報を開いていくと温度情報が出ていた(上の写真)。
もうちょいちゃんとした内容で書きたかった。
Intel Edison + Node-RED でTI SensorTagのデータをAT&T M2Xに投稿する
前回の記事で力尽きたので、今回はその続きです。記事の大半をメモ用の口調で書いているのに途中で気づいたので、そのまま通しています。
EdisonでTI SensorTagのBluetooth UUIDを調べる
hcitool lescsan
を打って、SensorTagの右サイドにある電源ボタンを押すと、下記の様に検出される。
root@edison:~# hcitool lescan
LE Scan ...
XX:XX:XX:XX:XX:XX (unknown)
XX:XX:XX:XX:XX:XX CC2650 SensorTag
XX:XX:XX:XX:XX:XXの部分がUUIDになる。これをメモしておく。コマンドを終了するのはCtrl-C
でOK。
Node-REDでSensorTagのFlowを作成
http://EdisonのIPアドレス:1880
でWebブラウザからアクセスする。 左のバーに、各種機能毎にNode(と呼ぶ?)があるので、それの下の方にあるsensorTag
をドラッグして真ん中のキャンバスにドロップする。 さらに上のほうにある、debug
もドラッグドロップする。 それから、ドロップしたsensorTag
をダブルクリックする。 ここで、メモしておいたSensorTagのUUIDをペーストする。 使っているSensorTagがCC2650の場合、明るさも取得できるので、Luminosityのチェックも入れると良い。 ここまでの作業をした物が下記画像になる。
debugの設定
次にドロップしたdebug
をダブルクリックし、OutputをComplete msg Object
に変更する。 そして、sensorTag
の右とdebug
の左をドラッグして線をつなぐ。右上で赤くなっているDeploy
をクリックして変更を適応させる。 右側のバーにある、debug
タブをクリックすると、ズラーっと情報が出てくると思う。 情報を止めるにはdebug
の右側のベロをクリックする。 とりあえず下記画像の感じ。
debugの情報
右のDebugに出ている情報がSensorTagから来ている情報で、見る感じ、書くセンサーデータ毎にmsgのデータが飛んできている。例としてHumidityのmsgは下記。温度と湿度の情報が格納されている。
{ "topic": "sensorTag/humidity", "payload": { "temperature": 20.9, "humidity": 22.3 }, "_msgid": "a75f2cf4.58a0d" }
M2Xに投稿するFlowの作成
今回はこの温度データをAT&TのM2Xに送るフローを作成する。ちなみに、事前にM2Xのアカウントを作成し、新規Deviceの作成、温度用のstreamの作成ができている事とする。 新たに、真ん中のキャンバスにdelay
, function
, http request
, debug(2つめ)
をドラッグ&ドロップし、上記順番につないでいく。 delay
をsensorTag
とfunction
の間に置くのは、sensorTag
から流れてくる情報が多いので、それを間引くため。
functionの中身
function
をダブルクリックし、中身を下記内容にする。 api_key
, dev_id
, stream_name
を自分の環境に合わせて変更する。
if (msg.topic == "sensorTag/humidity"){
var api_key = "your M2X api key";
var dev_id = "your M2X device id";
var stream_name = "your device stream id";
var dev_url = "http://api-m2x.att.com/v2/devices/";
var stream = "/streams/" + stream_name + "/value";
var data = {"value": msg.payload.temperature};
var msg = {
"method" : "PUT",
"url" : dev_url + dev_id + stream,
"headers" : {
"Content-Type": "application/json",
"X-M2X-KEY": api_key
},
"payload" : JSON.stringify(data)
};
return msg;
}
http requestの中身
ダブルクリックして、Methodを`set by msg.method`に変更する。 画像は下記。
debug(2つめ)の中身
1つめと同じくOutputをcomplete msg object
にする。 1つめのdebugのベロをクリックしてデバッグメッセージの出力をoffにしておく。
いざ送信
右上の赤いDeployをクリックして送る。右のDeployで出てくる情報の中のstatusCode
が202になっていると成功。4XXになっていると失敗している。