モチログ

はてなでのブログ

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チカをしてみた。
写真の配線が汚い。いや、色々汚い。
f:id:m0chikun:20170205195842j:plain

家のルーターの設定で、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

ただ、WiFiESP-WROOM-02で使えてるので、32でWiFIだけ使ってもいまいち。Bluetoothが使えるようになっているけど、BLEでボタン電池でって使える消費電力では無さそうなので、どういう使い方をしようか悩む。
スペック見ると、色々使える機能が増えてるのでサンプルコードが色々出てきたら試そうかと思った。

MacのHomebrew CaskでFirefoxのバージョンを落とす

vimperatorがFirefoxのバージョンアップ(51.0.1)でおかしくなった(よくある)ので、バージョンを落とした(50.1.0)。

cd /usr/local/Homebrew/Library/Taps/caskroom/homebrew-cask/Casks
git checkout 3cc374e78ea0e477cb061bc7a81a92f9432c4281 firefox.rb
brew cask install firefox

FirefoxのPreferencesで自動更新も切っておく

AmazonのAudibleを約1ヶ月つかってみた(解約)

最近、電車で立って移動することが多くなってきたので、立って、目をつぶって情報を得る方法があると言うことで、オーディオブックに興味が出た。
Amazon Audibleなら1ヶ月無料で試せるし、プライム会員なら3ヶ月無料らしい。
で、試してみた。

とりあえず、本で読んでいたけど、あんまり頭に入らなかった気がしていた、川端康成の雪国があったので、これを聴いてみた。

速度は1.7-1.8位までは大丈夫だったので、それくらいのスピードで。
これは結構良い感じで聞くことが出来、満足して次を探したけど、あんまり良いのが見つからなかった。
なんとか見つけたのが、H・P・ラヴクラフトシリーズ。

結構沢山あって、聞き応えがある。が、この先特に無いのと、月1500円は高いと思ったので、これは続けないだろうと言うことで解約しました。
解約しても、残りの期間はとりあえず継続出来ると言うことで、あと2ヶ月あるからまあ良いかと思ってたら、まだ1ヶ月無料体験期間中(になってる?)見たいで、残り日数が数日だった。
これは、解約する前に気をつけた方が良いと思った。

次はPodcastでも試してみようと思う。

brew cask upgrade がしたい

brew cask infoの表示が変わってしまい、これまでのスクリプトが動かなかったのと、fish shellを使ってみたので、fish shell向けにupgradeスクリプトを作ってみた。
1回しかテストしていないので、使用する場合は自己責任でお願いします。

github.com

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。
とりあえずタブレットに情報を出した状態が下記写真。

IMG_20160327_224347160

サンプルプログラムのHeart Rate Monitorを試してたときに挿しているA0-GNDの抵抗は無視して欲しい。

Genuino 101のサンプルスケッチ

環境はMacです。
ArduinoIDE 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のチェックも入れると良い。 ここまでの作業をした物が下記画像になる。

nrpic1

debugの設定

次にドロップしたdebugをダブルクリックし、OutputをComplete msg Objectに変更する。 そして、sensorTagの右とdebugの左をドラッグして線をつなぐ。右上で赤くなっているDeployをクリックして変更を適応させる。 右側のバーにある、debugタブをクリックすると、ズラーっと情報が出てくると思う。 情報を止めるにはdebugの右側のベロをクリックする。 とりあえず下記画像の感じ。

nr2

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つめ)をドラッグ&ドロップし、上記順番につないでいく。 delaysensorTagfunctionの間に置くのは、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;
}

画像は下記のようになる。
nr3

http requestの中身

ダブルクリックして、Methodを`set by msg.method`に変更する。 画像は下記。 nr4

debug(2つめ)の中身

1つめと同じくOutputをcomplete msg objectにする。 1つめのdebugのベロをクリックしてデバッグメッセージの出力をoffにしておく。

いざ送信

右上の赤いDeployをクリックして送る。右のDeployで出てくる情報の中のstatusCodeが202になっていると成功。4XXになっていると失敗している。