2015年8月31日月曜日

謎のペットボトルキャップ基板についてのメモ

秋月電子の新製品にペットボトルのキャップに入る丸型ユニバーサル基板を発見

秋月HPより/何のためにキャップにはめるの?

最初は用途がまるっきりわからなかったのだが

 ・関連商品にLEDが表示されること
 ・基板に高反射塗料が塗布されていること

からLEDペットボトルランタン的なモノを作るのに使うのでは?と予想した

ペットボトルランタンの市販品


内側にLEDをマウントしてやり防水処理をする
ボタン電池はサイズ的にギリギリなのでキャップから配線を引き出して外側に
これを水を入れたペットボトルに装着すればLEDの光は水で拡散しライトとなる

これで決まりだな!と思ったらaitendoでこんなものを見つけてしまう

謎のバラエティ感

ICソケットはまだわかる
これは…何に使うのだ?


ICのプリントはLEDの制御用で説明がつかなくもない
ミニUSBコネクタ?D-SUB9ピン?ご丁寧にキャップを開口した作例すらある
いったいこれを何に使っているのだ…?

20150906追記:
 後日の調査結果

ESP-WROOM-02プログラミング:スリープのテスト

前回のメモ:3つのSleepの使い分けについての検証用プロジェクト


プロジェクト概要:
 無線LANルータに対して接続を確立した後、処理を行わずスリープを誘発する

 Sleepの設定を切り替えてビルドし、各Sleepの挙動をチェックするために用いる
 Deep_Sleepについては大きく使用方法が異なるのでここでは割愛
 ※外部機器による電流値の測定が必要/表面上の動作にはまったく差が無い


データシートより/通信およびスリープ中の電流値


準備すること:
 ・ArduinoIDE上でのESP8266開発環境構築
 ・ESP-WROOM-02を接続してもよい無線LANルータのSSIDとパスワードをメモ
 ・電流値を測定できる外部機器


作成方法:
 ・ソースをコピペして以下の情報を修正する
   ・SSID
   ・SSIDに対するパスワード
   ・測定したいスリープモード設定行のみを有効にする
    (SLEEP無効/MODEM_SLEEP/LIGHT_SLEEP)
 ・ビルドしてダウンロードモードのESP-WROOM-02に書き込み
  (→過去メモ参照)


実行方法:
 ・外部機器でESP-WROOM-02の電流値を測定開始
 ・ESP-WROOM-02をブートモードで起動
 ・デバッグ出力より無線LANルータとの接続を確認
  (『WiFi connected』の表示を確認)
 ・起動~ルータとの接続~スリープ状態までの電流値を測定する


うまくいかない場合は以下をチェック:
 無線LANルータの規格
   →ESP-WROOM-02が対応できるのは802.11b/g/n

 ・チップへの給電が十分か
   →通信時は80mA以上消費する

 ・ダウンロードモードからの設定変更は忘れていないか
   →GPIO0ピンをL→Hに戻し忘れることが多い
    ブートモードにしないと当然ながら起動しない


注意点:
 ・無線LANルータの設定(ステルスID/接続先限定など)によっては動かない


測定結果:

 グラフはこちら

 802.11gにて無線LANルータと接続した
 10msecの分解能でESP-WROOM-02の電流値を測定
 (電流センサモジュールArduinoUno、SDカードシールドを使用/精度は参考程度)
 以下はすべてloop()内での電流値について

 ・NONE_SLEEP(スリープ無効)は常に70mA
 ・MODEM_SLEEPは定常状態が15mA
  150msec前後の周期でパルス状の電流変化(ピーク70mA程度)あり
・LIGHT_SLEEPは定常状態が1mA程度
  MODEM_SLEEPよりも高い頻度で15mAと70mAの変化が混じる

 スリープ時に定期的に消費される70mAは無線LANルータとの接続を維持するための通信と思われる
 測定の分解能が不足しているためこの環境でこれ以上の測定はあまり意味が無い

おまけ:
 setup()実行前の初期化段階で200mA程度の電流値を測定
 測定時の分解能の低さを考えるとピークはもっと高いかも
 状態別電流値の代表値を参考に定格電流を決めると起動でしくじるかも


#include <esp8266wifi.h>

extern "C" {
#include "user_interface.h"
}

//無線LANルータのIDおよびパスワード
const char* ssid     = "XXXXXXXX";
const char* password = "YYYYYYYY";

void setup() {  
//スリープモードの選択
//    wifi_set_sleep_type(NONE_SLEEP_T);
//    wifi_set_sleep_type(MODEM_SLEEP_T);
  wifi_set_sleep_type(LIGHT_SLEEP_T);

  Serial.begin(115200);
  delay(10);

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}
void loop() {
  delay(5000);
}

2015年8月28日金曜日

ESP-WROOM-02のメモ(11):3つのSleepの使い分け

ESP-WROOM-02(ESP8266)には3種類のスリープ機能がある
それぞれのざっくりしたイメージは以下のようになる

 ・Modem-Sleep
   →無線通信関連の部分(モデム部分)をスリープ

 ・Light-Sleep
   →CPU部分を含めてスリープ

 ・Deep-Sleep
   →RTC(リアルタイムクロック)部分以外をすべてスリープ

下にいくほど深いスリープとなる
各モードでの消費電流は以下の表を参照

データシートより/状態別の消費電流

3種のスリープはDeep-Sleepとそれ以外で扱いが大きく異なる


Deep-SleepはRSTピンに対するリセット信号が入力されないと復旧しない
この復旧処理はほぼ通常時のリセット動作と同じ
プログラムは冒頭から再実行される
 (※復旧時にいくつか設定を保持しているような記述があり調査中
RTCは自分で任意時間後にリセット信号を出力するために用いる

スリープするトリガーはユーザーのESP.deepSleep()関数実行による


Modem-SleepとLight-Sleepは無線通信などの割り込みによって復旧する
Deep-Sleepとは異なりプログラムがリセットされることは無い
スリープ自体も自動的に行われるため、スリープ/復旧ともにユーザーが意識することは無い
スリープというよりは未使用のリソースをサスペンドする省電力動作モードのイメージの方が近い
スリープに入っても無線接続等は維持される

スリープ時にどちらのスリープに入るか(またはスリープしないか)の設定が可能
この設定にはwifi_set_sleep_type()関数が用いられる
デフォルト設定はModem-Sleep
以前に電流値を測定した際、入力待ち状態で15mA程度であったので符合する


実際の処理および消費電流の実測は次回

2015年8月27日木曜日

ai.shuttle.jamが(明後日の方向に)スゴい

本家IchigoJam

こどもパソコンIchigoJam/安価なBASICマイコン

aitendoの互換機ai.shuttle.jam

圧電ブザーくらいしか差が無い

機能的な差はほとんど無くてただかっこいいだけ
(この圧電ブザーもコクピットっぽくするためだけですよね?)

 ・あやしい日本語(シャットル)
 ・謎コンセプト
 ・フットワークの軽さ

とaitendoイズム溢れる逸品

ESP-WROOM-02プログラミング:スリープしながら定期的にツイート

ESP-WROOM-02のDeep-Sleepを使ったツイッター操作プロジェクトのメモ

プロジェクト概要:
 スリープしながら定期的にWakeUPしてツイートを行うプロジェクト

 ツイートにはStewGateUのWebAPIを使用
 ネタ元はESP8266WIFI/WiFiClientサンプルコードとマイクロテクニカESP-WROOM02簡単マニュアル


Deep-Sleep機能とは?:
 低消費電力(消費電流平均10uA)でスリープする機能
 
 スリープ中は以下の機能以外のすべてを停止する
  ・リセット信号の監視と受理
  ・スリープ時間カウント用のタイマ
  ・ウェイクアップ用信号の出力(IO16)

 スリープからの復旧方法はリセットのみ
 リセットするとプログラムの最初から実行される(通常時にリセットをかけたのと同じ)
 
 スリープというとなんだか特定の状態で休止してそこから復旧するように思えるが
 このDeep-Sleepはリセット信号の受理と目覚まし時計以外のすべてを終了してしまう
 目覚まし時計が鳴るとIO16ピンにLパルスが出力されるので
 IO16ピンを自身のリセットピンに接続しておけば、自身のリセットをかけることが出来る

 Arduinoのアドオンなどに用いる場合は、Arduino側からリセットをかけることも可能 

データシートより/最終行がDeep-Sleep

準備すること:
 →基本的に前回までと同じ

 ・ArduinoIDE上でESP8266の開発環境構築(ググろう!)
  ・3V3とGNDに十分な電流が供給可能な3.3V電源を接続
 ・IO16ピンとRSTピンを接続
 ・TX/RXにはデバッグ用にシリアル―USB変換機を接続する
 ・ツイートに用いるTwitterアカウントの準備(新規アカウント推奨)
 ・StewGateUにてTwitterアカウント登録およびトークン取得
 ・ESP-WROOM-02を接続してもよい無線LANルータのSSIDとパスワードをメモ


作成方法:
 ・ソースをコピペして以下の情報を修正する
   ・SSID
   ・SSIDに対するパスワード
   ・StewGateUで取得したトークン
 ・ビルドしてダウンロードモードのESP-WROOM-02に書き込み
  (→過去メモ参照)


実行方法:
 ・ESP-WROOM-02をブートモードで起動
 ・起動→接続→ツイート→(指定時間スリープ)→再起動→接続→ツイート…
  が反復することを確認
  (※止めない限りずっと反復するので注意


うまくいかない場合は以下をチェック:
 無線LANルータの規格
   →ESP-WROOM-02が対応できるのは802.11b/g/n

 ・ダウンロードモードからの設定変更は忘れていないか
   →GPIO0ピンをL→Hに戻し忘れることが多い
    ブートモードにしないと当然ながら起動しない

 ・チップへの給電が十分か
   →今回これで大ハマリした
    当初はaitendoのVBUSキットを用いてノートPCのUSBポートから電源を取っていたのだが
    何回やってもリセット動作に失敗していた
    (リセット後、ブートローダーの段階でハングアップする)

    原因はどうもノートPC側の省電力機能らしい
    スリープから復旧する際の電流が不足するために起動に失敗する
    (ネゴシエーション時の100mA制限に引っかかる?)
    定常状態では十分な電流が供給できていたため気づかなかった

    電源をACアダプタに変更して解決


注意点:
 ・ソースの大半はESP8266WIFI/WiFiClientサンプルコードからの流用
 ・無線LANルータの設定(ステルスID/接続先限定など)によっては動かない

 ・ソース内でanalogRead(17)しているのは
  『結線していないアナログピンの値(不定値)を取得して乱数の種にする』
  ため
  Arduinoで良く使われている処理を真似してみた
  今回はリセット時にカウンタがクリアされてしまうため、これが無いと乱数の値が重複する

 ・ESP.deepSleep()コール後からスリープされるまでに遅延がある
  このため
   loop()末尾でESP.deepSleep()コールするとスリープに入る前にループ先頭に飛んでしまい動作がおかしくなる場合がある
  ESP.deepSleep()後に適当なdelay()を入れること


 
#include <esp8266wifi.h>

//接続先のIDおよびパスワード
const char* ssid     = "XXXXXXXX";
const char* password = "YYYYYYYY";
 
const char* host = "stewgate-u.appspot.com";
//http://stewgate-u.appspot.com/より取得したトークン
const char* token = "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ";
//スリープ時間60秒
const int sleepTimeSec = 60;

void setup() {
  Serial.begin(115200);
  delay(10);

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  
  String text;
  randomSeed(analogRead(17));
  text += String(random(0,9999), DEC);
  text += ":Hello!ESP-WROOM02";

  postMsg(text);
  
  ESP.deepSleep(sleepTimeSec * 1000 * 1000, WAKE_RF_DEFAULT);
}

bool postMsg(String msg)
{
  Serial.print("connecting to ");
  Serial.println(host);
  
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return false;
  }
  
  client.println("POST /api/post/ HTTP/1.0");

  client.print("Host: ");  
  client.println(host);
  
  int msgLength = 40;
  msgLength += msg.length();
  client.print("Content-length:");
  client.println(msgLength);
  client.println("");

  client.print("_t=");
  client.print(token);
  client.print("&msg=");
  client.println(msg);

  delay(10);
  
  // Read all the lines of the reply from server and print them to Serial
  while(client.available()){
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }
  
  Serial.println();
  Serial.println("closing connection");

  return true;  
}

void loop() 
{
}



2015年8月22日土曜日

スマホのシャッターをマイコンから押す方法:作例

スマホのシャッターをマイコンから押す方法を実際に作成したメモ

単純なリレー回路なので、キモは光学リレーICの使い方だけ


光学リレーについて:

 光学リレー(フォトカプラ)はLEDとフォトトランジスタを組み合わせた素子
 同じICにパッケージされているが、LED側とトランジスタ側は別回路で絶縁されている
 LEDを点灯させるとフォトトランジスタがその光を受光し、エミッタ―コレクタ間に電流が流れる
 
 めっちゃ簡単なイメージは次のような感じ

 LEDへの入力:スイッチのON/OFF
   スイッチをONにするとエミッタ―コレクタ間が接続する
  スイッチをOFFにするとエミッタ―コレクタ間が切断される

  ※ただし、エミッタ―コレクタ間の電流の方向は決まっている(後述)


光学リレーICについて:

 実際に光学リレーICを使ってみる
 

TLP621-1
 東芝セミコンダクター製の1回路光学リレー
 
下のピン接続図と配置をそろえてある

ピン接続図/左側がLEDで右側がトランジスタのシンプルな回路
 
 とてもシンプルな素子なので使い方も簡単
 
  1.アノードからカソードに電流を流すと
  2.エミッタとコレクタが接続される

 これだけ
 注意すべき点は以下のとおり
  
  ・ピン配置を間違えないこと
    →丸印があるのが1ピン

  ・LED側の回路に適当な抵抗を挟むこと
    →電流が大きすぎると普通のLED同様に破損する

  ・エミッタ―コレクタ間の電流の方向に注意すること
    →電流の流れる方向はトランジスタ記号の矢印の方向
     TLP621ならばコレクタを+側、エミッタをマイナス側に結線すること
  

作例:

 前回取り上げた100均のシャッターケーブルの中に光学リレーを組み込んでみる
 ピンソケットでアノード/カソード端子を引っ張り出し、外部から5V/GNDを接続できるようにする

必要な材料/光学リレーとピンソケット

 カッターでピンソケット2ピン分の開口部を作る
 ソケットの厚みと壁の高さがほぼ一緒なので作業の難易度は低い

開口部の加工

 ピンソケットを3ピン分切り出し、2ピンが外に露出するように加工する
 ピンソケットの内部には金属端子があるのでプラスチック用ニッパーで切らないこと

ピンソケットの加工/開口部に合うように調整すること

 ピンソケット側をLED側、タクトスイッチ側をコンデンサ側にしてTLP621-1を結線する
 タクトスイッチ側の配線には極性があるのでエミッタ/コレクタを間違えないこと
 LED側に抵抗を入れておくことを忘れないこと

配線の例/赤が+黒が-の配線とした

 フタを閉じる前に動作確認をする
 シャッターケーブルの4極プラグをスマホに接続してカメラを起動する
 ピンソケットのアノード側に5V、カソード側にGNDを接続するとシャッターが切れることを確認

タクトスイッチを挟んでみた例/スイッチを押すと通電してシャッターが切れる

 ピンソケットへのピンの挿入に耐えられるように適当に接着する
 接着剤には絶縁性のものを使うこと

ハックルーを使ってみた

 フタを閉めたら完成
 開口部がうまく閉まらない場合は微調整すること

完成

 バイパスしてあるだけなので元々のタクトスイッチも生きている
 シャッタースイッチに限らず、スイッチの類には同様の加工で光学リレーを使うことができる


 以下は今回使った材料

 ・シャッターケーブル
  →100円均で買える
   ダイソーで購入したが似たような商品はどの店にもあった

 ・フォトカプラ 赤外LED+フォトトランジスタ TLP621-1
  →秋月で購入
   40円とお安い
   同等品ならば他社製でも当然OK

 ・分割ロングピンソケット 1x42 (42P)
  →これも秋月で購入
   すごく良く使うので常にストックしてある
   刃の厚いニッパーで切り離すと砕けるので注意

 ・ハックルー
  →これまた秋月
   いつか使ってやろうと買ってあった
   普段は100均のホットボンドを使っている
   ホットボンドと違って絶縁性が保証されているのがよい
   使い勝手はあんまりよくなかった
   またホットボンドに戻りそう

2015年8月21日金曜日

書評メモ(1)


CADLUS+Arduino 電子工作ガイド


 オーム社

 横田 一弘(著)














缶サット(空き缶に入るサイズの擬似人工衛星ユニット)を目的としたArduino互換機作成の解説書
基板用CADの無料版を用いた基板設計とその実装方法についてがメインの内容


互換機作成に必要な情報を浅く広く、しかし必要十分に解説している
基板設計→発注→パーツの表面実装というハードルの高い工程を懇切丁寧に説明してある
やる気のある中高生でも理解でき、実際にチャレンジできるのではないか
(ただし基板代が結構かかる)


個人的にとても気に入ったのははんだづけの解説パート
はんだづけ工程が写真を添えて説明してあるのだが、この作例の仕上がりが汚いところがとてもよい(嫌味ではなく)
はんだづけが苦手な者にとってこれほど勇気付けられることは無いのだから




Amazing Science ―驚きのエンターテインメントサイエンス工作25


 オライリージャパン

 Stephen Voltz (著), Fritz Grobe (著), 高橋 信夫 (翻訳)











有名なメントスコーラを代表としたサイエンス実験/サイエンス工作の手引書
見栄えのよい実験のレシピと、それに対する科学的な解説がセットになっている

25本の実験のうち7割方はホームセンターで2000円も出せば材料が揃う
週末に家族で実験会としゃれこむのはどうか
残りの3割はわりと大掛かりな実験なので文化祭のだしものなどに向いているのでは

各実験には著者のHPへのリンクが掲載されており、実験結果の動画なども見られる
メントスコーラなどは写真で見てもピンと来ないのでこれはいい工夫
実践ありき、レシピ中心の本なので読み物としてはやや物足りないか


ESP-WROOM-02のメモ(10):手ハンダで2.54mmピッチ変換

ESP-WROOM-02のネックはポートの間隔が1.5mmピッチであること
なかなか使われないピッチなのでピンもソケットも見つからない
各社から2.54mmピッチへのブレイクアウトボード が発売されているが、できれば直接基板にマウントしたい
 
 
モジュール単体

変換ボード(実装済み)


以下はESP-WROOM-02モジュール単体 に手ハンダで2.54mmピンを付けたメモ


必要なもの:
 ・ESP-WROOM-02モジュール
 ・2.54mmピッチのピンヘッダ10列×2本
 ・ブレッドボード
 ・線材
 ・適当なスペーサー(2.5mm程度)


作成方法:
 1.ピンとモジュールのセッティング
  ブレッドボードにESP-WROOM-02モジュールを裏側(プリントがある方)上にして置く
  (裏面の方が端子のパッド面積が広い&端子のプリントが見られるため)
  モジュールをはさむようにピンヘッダを挿す
  モジュールとブレッドボードの間にスペーサーを挟む
   →ピンヘッダの先端をモジュールの高さを合わせる


この時点では位置あわせの必要なし


 2.ピンを曲げる
  ピン先を曲げてモジュール端子の位置に合わせる
  端子に対してピン数が足りないので飛び飛びになるがひとまずこのまま

TX/RXなど主要端子にあわせてみた

  
 3.ハンダ付け(ピン)
  ピン先とモジュールの端子をハンダ付けする
  ピンからブレッドボードに熱が逃げることを加味して作業すること

ハンダ付け後/作業ミスで2.から1段ずつズレている(2.の意味が無い…)

  
 4.ハンダ付け(線材)
  未接続の端子とピン先を線材でハンダ付けする 
   
未使用端子をすべてピンに接続/今考えればアンテナ側のピンを使った方がよかった
 

 5.余分なピンの切断
  結線していないピンを切り取って完成

完成



作ってはみたもののブレークアウトボード買えばよくね?って気持ちでいっぱい
必要な端子を厳選して3.を行い、不足する端子のみ追加で線材で引き出す…という使い方ならありかもしれない
端子のプリントが見えるのが唯一のメリットか?


2015年8月18日火曜日

スマホのシャッターをマイコンから押す方法

マイコンでカメラモジュールを制御しようとすると一苦労である
 ・沢山のポートが占有される
 ・データが大きい
 ・ストレージが必要
 ・画処理が重い
  etc

ならばシャッタートリガーのみマイコンで制御を行い、その他はすべて外部機器に任せてしまえばよい
以下、スマホのイヤホンコントロールを用いて、スマホのカメラに対してシャッタートリガーを指示する方法のメモ


前提情報:

 スマホのイヤホンは4極になっており、それぞれの信号線は
  ・L
  ・R
  ・GND
  ・マイク
 となっている
 イヤホンには再生/停止/音量のコントロールボタンがあり、これらを押すとGND-マイクの抵抗値が変化する
 スマホ側はこの抵抗値をウォッチすることで入力検知を行っている

4極タイププラグ/GNDとマイク間の抵抗値変化がコントロールになる

 スマホのデジカメアプリではこのコントロールボタンをシャッターとして使用可能である
 (音量+のボタンを割り当てているスマホが多い)
 (トルカ棒、セルフィーなどで有線シャッターボタンが付いているものはこの機能を用いている)

 例:viewing(ビューイング) 自撮り棒
 
amazonより/有線プラグのあるタイプ


 このボタンをリレーに置換してやればマイコンのGPIOポートからコントロールすることが可能
 

必要なもの:

 ・市販のシャッターケーブル
  →100均で『リモートシャッター』等の名前で売っている
  (※やる気があるならば、4極プラグ+ケーブル+240Ω?抵抗+タクトスイッチで自作できる) 
 ・光学リレー(フォトカプラ)IC
 ・適当な抵抗(リレー用/リレーで指定された大きさの抵抗を使うこと)
 ・適当なマイコン(GPIOポートが使えればなんでもよい)

ダイソーで購入したシャッターケーブル
中身はこんな感じ

 作成方法:

 シャッターケーブルを分解し、ボタンの両端から信号線を引っ張りだす
 この信号線をリレーの両端に接続する
 マイコンのGPIOポートとリレーICの入力ポートを抵抗を挟んで接続する
 (※リレー内部のLEDに直結するため、抵抗が無いとLEDが破損する)

特に接着していないのでカッターをねじ込めば簡単に外れる
タクトスイッチがあるだけ/抵抗は背面にマウント

使用方法:

 スマホを起動してデジカメアプリを立ち上げる
 作成したケーブルのオーディオプラグをスマホに挿す
 マイコンのGPIOポートをHにするとデジカメアプリが撮影を行う
 (※スマホによっては対応していない/設定が必要な場合がある


発展系:

 極性のあるトリガーならば何でもよいので、実はマイコンもいらない
 人感センサ、ドアセンサなどH出力が出されるものをリレーに接続すれば
 センサの検知トリガーで撮影ができる


作例をアップしました


2015年8月17日月曜日

ESP-WROOM-02のメモ(9):マイクロテクニカボードのカスタマイズ

マイクロテクニカの実装済ブレークアウトボードを使いやすくカスタマイズしたメモ

マイクロテクニカショップより

前回設定用ポートの検証を行ったが、実使用上は設定専用の死にポートとして割り切ってしまった方が良い

そう考えると設定用ポートすべてを選択可能にしておく必要は無くなる

データシートより/GPIO0以外はプルアップ・プルダウンでよい

上図のとおりGPIO0のみを選択可能にすればよい
 GPIO2:3.3V直結
 GPIO15:GND直結
 (※本当は10k程度のプルアップ/プルダウン抵抗を入れた方が良い)

以下はマイクロテクニカの実装済ブレークアウトボードにて上記の変更を反映させたもの

カスタマイズ版

GPIO2、GPIO15、ENについてはジャンパピンを立てる必要が無いので直結に変更
リセット用のタクトスイッチはそのまま
GPIO0にはジャンパピンの代わりにスライドスイッチを付けた
(抜き差しでジャンパをよく無くすため/2.54mmピッチのものを無理やりねじ込んでいる)

最終形になんか既視感を感じたと思ったらCerevoのブレイクアウトボードだった
次はこちらも買ってみようかと思う

ESP-WROOM-02のメモ(8):モード切替GPIOポートについての検証2

前回に引き続きモード切替GPIOポートについての懸賞
以下はモード切替GPIOポートが起動後も入力ポートとして働くかどうか確認するためのプロジェクト

データシートより
プロジェクト概要:
 GPIO0、GPIO2、GPIO15が入力ポートとして動作することを確認する
  各ポートに接続されたタクトスイッチの状態を読み取りLEDを点滅させる

準備すること:
 ・3V3とGNDに電源を接続
 ・LEDと適当な抵抗を3つ用意(まだ接続しないこと
 ・タクトスイッチを3つ用意(まだ接続しないこと

作成方法&実行方法:
 ・ソースをコピペ
 ・ダウンロードモードでESP-WROOM-02を起動する
 ・ビルドして書き込み
 ・GPIO0、GPIO2、GPIO15にタクトスイッチを接続(→もう片側をGNDへ)
  (※ブート用の接続は外すこと/ジャンパなど)
 ・GPIO12、GPIO13、GPIO14に抵抗とLEDを直列に接続(→もう片側をGNDへ)
  (※すでにフラッシュブートしているので注意)

 実行するとGPIO0、GPIO2、GPIO15が入力ピンとして機能するのがわかる


 
#define CONFIG_PIN_1 0
#define CONFIG_PIN_2 2
#define CONFIG_PIN_3 15

#define LED_PIN_1 12
#define LED_PIN_2 13
#define LED_PIN_3 14

void setup() {
  pinMode(CONFIG_PIN_1, INPUT_PULLUP);
  pinMode(CONFIG_PIN_2, INPUT_PULLUP);
  pinMode(CONFIG_PIN_3, INPUT_PULLUP);  
  
  pinMode(LED_PIN_1, OUTPUT);  
  pinMode(LED_PIN_2, OUTPUT);  
  pinMode(LED_PIN_3, OUTPUT);    
}

void loop() {  
  if(digitalRead(CONFIG_PIN_1) == LOW)
  {
    digitalWrite(LED_PIN_1, HIGH);
  }
  else
  {
    digitalWrite(LED_PIN_1, LOW);    
  }

  if(digitalRead(CONFIG_PIN_2) == LOW)
  {
    digitalWrite(LED_PIN_2, HIGH);
  }
  else
  {
    digitalWrite(LED_PIN_2, LOW);    
  }

  if(digitalRead(CONFIG_PIN_3) == LOW)
  {
    digitalWrite(LED_PIN_3, HIGH);
  }
  else
  {
    digitalWrite(LED_PIN_3, LOW);    
  }
  
  delay(10);
}

 



ESP-WROOM-02のメモ(7):モード切替GPIOポートについての検証1

ESP-WROOM-02は起動時にGPIOポートを参照することで起動するモードの切替を行う

データシートより

モードは以下の2つ
 ・ダウンロードモード
  内蔵フラッシュROMへファームウェアを書き込む場合に用いる

 ・フラッシュブートモード
  内蔵フラッシュROMに書き込まれているファームウェアを実行する


参照されるGPIOポートはGPIO0、GPIO2、GPIO15の3ポート
このポートはブート後は普通のGPIOポートとして使用できる
以下は上記ポートが出力ポートとして働くかどうか確認するためのプロジェクト


プロジェクト概要:
 GPIO0、GPIO2、GPIO15が出力ポートとして動作することを確認する
  各ポートに接続されたLEDを点滅させる


準備すること:
 ・3V3とGNDに電源を接続
 ・LEDと適当な抵抗を3つ用意(まだ接続しないこと


作成方法&実行方法:
 ・ソースをコピペ
 ・ダウンロードモードでESP-WROOM-02を起動する
  その後、GPIO0、GPIO2、GPIO15をオープン(何も接続しない)にする
  (例:マイクロテクニカボードの場合はENピン以外のジャンパを取り外す)
  ※ファーム書き込み終了後、強制的にフラッシュブートするため
   出力ポートに直接3.3VとGNDが接続されるのを防ぐ
 ・ビルドして書き込み
 ・GPIO0、GPIO2、GPIO15に抵抗とLEDを直列に接続(→もう片側をGNDへ)
  (※すでにフラッシュブートしているので注意)

 実行するとGPIO0、GPIO2、GPIO15が出力ピンとして機能するのがわかる


注意点:
 ・ファーム書き込み後フラッシュブートモードで起動しないこと
  理由は前述のとおり出力ポートに3.3VとGNDが接続されてしまうため
 ・もしやるなら電気的な安全を確保するかブート後接続を外すための十分なウェイトをいれること 

入力ポートの検証は次回

 
#define CONFIG_PIN_1 0
#define CONFIG_PIN_2 2
#define CONFIG_PIN_3 15

void setup() {
  pinMode(CONFIG_PIN_1, OUTPUT);
  pinMode(CONFIG_PIN_2, OUTPUT);
  pinMode(CONFIG_PIN_3, OUTPUT);  
}

int counter = 0;
void loop() {
  digitalWrite(CONFIG_PIN_1, counter % 2);
  digitalWrite(CONFIG_PIN_2, counter % 2);
  digitalWrite(CONFIG_PIN_3, counter % 2);

  delay(500);
  counter++;
}

 



2015年8月15日土曜日

ESP-WROOM-02プログラミング:ボタンを押したら最新のメンションを取得

前回に続きESP-WROOM-02 を使ったツイッター操作プロジェクトのメモ

プロジェクト概要:
 ボタンを押すと最新のメンション(返信)を取得するプロジェクト
 
 ツイートにはStewGateUのWebAPIを使用
 ネタ元はESP8266WIFI/WiFiClientサンプルコードとマイクロテクニカESP-WROOM02簡単マニュアル

動作のイメージ/Web APIを用いた最新メンションの取得

準備すること:
 →基本的に前回と同じだが、タクトスイッチ周りが変更されているので注意

 ・ArduinoIDE上でESP8266の開発環境構築(ググろう!)
  ・3V3とGNDに十分な電流が供給可能な3.3V電源を接続
 ・GPIO5にタクトスイッチを接続
  (プルアップ設定がOKだとわかったので抵抗不要/もう片側はGNDへ)
 ・TX/RXにはデバッグ用にシリアル―USB変換機を接続する
 ・ツイートに用いるTwitterアカウントの準備(新規アカウント推奨)
 ・StewGateUにてTwitterアカウント登録およびトークン取得
 ・ESP-WROOM-02を接続してもよい無線LANルータのSSIDとパスワードをメモ


作成方法:
 ・ソースをコピペして以下の情報を修正する
   ・SSID
   ・SSIDに対するパスワード
   ・StewGateUで取得したトークン
 ・ビルドしてダウンロードモードのESP-WROOM-02に書き込み
  (→過去メモ参照)


実行方法:
 ・ESP-WROOM-02をブートモードで起動
 ・デバッグ出力より無線LANルータとの接続を確認
  (『WiFi connected』の表示を確認)
 ・タクトスイッチを押すと最新のメンションがデバッグ出力される
  (※取得日時やホスト名などの付加情報も同時に出力される)


うまくいかない場合は以下をチェック:
 無線LANルータの規格
   →ESP-WROOM-02が対応できるのは802.11b/g/n

 ・チップへの給電が十分か
   →通信時は80mA以上消費する

 ・ダウンロードモードからの設定変更は忘れていないか
   →GPIO0ピンをL→Hに戻し忘れることが多い
    ブートモードにしないと当然ながら起動しない

 ・レスポンス取得前のdelay()を増やしてみる
   →リクエストを出してから返事が来るまでに若干の待ち時間があるため
    即座に取得しようとすると失敗する様子


注意点:
 ・ソースの大半はESP8266WIFI/WiFiClientサンプルコードからの流用
 ・無線LANルータの設定(ステルスID/接続先限定など)によっては動かない
 ・マイクロテクニカESP-WROOM02簡単マニュアルのパスは尼のマイクロテクニカショップでESP-WROOM-02を買ったら付いてきた
  各機能の使い方が日本語で簡潔にまとめられておりおススメ
  (ただし、デフォルトファームをATコマンドで操作する前提での解説)

 
#include <esp8266wifi.h>

#define KEY_PIN 5

//接続先のIDおよびパスワード
const char* ssid     = "XXXXXXXX";
const char* password = "YYYYYYYY";

const char* host = "stewgate-u.appspot.com";
//http://stewgate-u.appspot.com/より取得したトークン
const char* token = "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ";
void setup() {
  Serial.begin(115200);
  delay(10);

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  
  //プルアップが使えるのでそちらに変更
  pinMode(KEY_PIN, INPUT_PULLUP);
}

bool getLastMention(void)
{
  Serial.print("connecting to ");
  Serial.println(host);
  
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return false;
  }

  //ツイートとはアドレスが異なるので注意  
  client.println("POST /api/last_mention/ HTTP/1.0");

  client.print("Host: ");  
  client.println(host);
  
  int msgLength = 35;
  client.print("Content-length:");
  client.println(msgLength);
  client.println("");

  //トークンのみ
  client.print("_t=");
  client.println(token);

  //この待ち時間が短すぎるとclient.available()がうまく働かずレスポンスがうけとれない
  delay(500);
  
  while(client.available()){
    String line = client.readStringUntil('\r');
    Serial.println(line);
  }
  
  Serial.println();
  Serial.println("closing connection");

  return true;  
}

void loop() {
  delay(100);

  //プルアップにしたため極性を変更
  if(digitalRead(KEY_PIN) == LOW)
  {
    getLastMention();  
  }
}


2015年8月11日火曜日

ESP-WROOM-02のメモ(6):動作中の電流値について


前々回の『ボタンを押すとツイート』プロジェクトを使って電源関係の調査を行った

ESP-WROOM-02

・動作時の電流値を測定

 測定条件:

  ・無線ルータとの接続はIEEE802.11g
  ・ルータとの距離は2メートル程度
  ・テスターを用いた簡易的な測定なのでピーク電流等は不明

 測定結果:

  ・送受信中は平均80mA程度
  ・接続後の入力待ち状態は平均15mA程度

 TOCOSのTWE-LiteやZigBeeみたいなコイン電池駆動は無理筋
  →いずれも『送信時』の瞬間的な消費電流が20~15mA程度
   動作電圧も2.0~3.3V程度なので大きな電流を引っ張った際の電圧降下に耐えうる

・電池を使った電源の調査

 チェックした電池は以下の2つ

  ・コイン電池CR2032(3V)
  ・アルカリ単四電池2本直列(3V)

 調査結果:

  ・コイン電池はブートに失敗する
   (起動時メッセージ(76.8kbps)が出力されていることは確認/そこからブートできない)  
  ・アルカリ単四電池2本はブート/接続/送信すべて成功
  
  ・電流不足で送信を行うと本体にリセットがかかってしまう場合がある
 
 駄目元でテストしてみたもののやはりコイン電池駆動は無理
 起動すらできない

 キャパシタにコイン電池から給電して送信時の瞬間的な大電流をゲット!という妄想をしてみたが(参考
 そもそも通常時に常に15mAかかるので無理っぽい
 (通常時は通信機能をOFFにして省電力、トリガを得てからチャージを繰り返して休み休み送信すればよい…?)
 
 素直に他の電池を使ったほうがよさげ
 ただし電源電圧3.0-3.6Vなので乾電池2本で動作するのは最初の間だけかも
 使っているうちに電圧降下で落ちそう

2015年8月10日月曜日

ESP-WROOM-02プログラミング:ツイートプロジェクト発展

前回のESP-WROOM-02 を用いた『ボタンを押すとツイート』プロジェクトに対して
ボタンを他のセンサに置換することでちょっとだけ実用的なプロジェクトになるのでは?というメモ


案1:ドアが開けられたらツイート

 ドア開閉センサモジュールを用いて作る防犯用のプロジェクト
 ドア開閉センサは磁石付きの子機と対になっており
 子機が接触(接近)するとONになる

 ケース入りリードスイッチ(磁石付セット)

 ドア側に子機を、ドア枠にドア開閉センサおよびESP-WROOM-02を取り付ける
 ドアが開けられるとセンサはOFFになるため、このトリガーでツイートを行う

開閉センサモジュール/LED付きもある


案2:人感検知したらツイート

 人感センサモジュールを用いて作る防犯用のプロジェクト
 人感センサは赤外線によって周囲の動く物体を検知できる
 センサー範囲内で動く物体を検知したら一定時間ONになる

 焦電型赤外線(人感)センサーモジュール

 人感センサをESP-WROOM-02に接続し、検知したい場所に設置する
 動く物体を検知した場合にONになるため、このトリガーでツイートを行う

人感センサーモジュール


案3:雨を検知したらツイート

 水滴感知センサモジュールを用いて作るプロジェクト
 センサに対する水滴の付着を検知できる
 これはアナログ値なのでADコンバータが必要
 
 雨検出モジュール(要納期チェック)

 水滴感知センサを検知したい場所に設置する
 (当然ながらESP-WROOM-02および電源は濡れないようにすること)
 一定以上の水滴付着(≒一定以上のアナログ値)をトリガーにツイートを行う

雨検知モジュール/普通に錆びるので寿命は短い


いずれも課題は電池による長時間駆動の難しさ
他の低消費電力無線モジュールのようにコイン電池が使えればよいのだが…
省電力機能および通信時のピーク電流を稼ぐ方法を調査中
給電ポートの口に大容量コンデンサ接続でいけるか?

ESP-WROOM-02プログラミング:ボタンを押したらツイート

以下ESP-WROOM-02 を使ったプロジェクトのメモ

プロジェクト概要:
 ボタンを押すと定型文をツイートするプロジェクト
 
 ツイートにはStewGateUのWebAPIを使用
 ネタ元はESP8266WIFI/WiFiClientサンプルコードとマイクロテクニカESP-WROOM02簡単マニュアル

動作のイメージ/Web APIを用いたtweetを行う

準備すること:
 ・ArduinoIDE上でESP8266の開発環境構築(ググろう!)
  ・3V3とGNDに十分な電流が供給可能な3.3V電源を接続
 ・GPIO5にタクトスイッチ+プルダウン抵抗を接続
  (押すとHが入力されるように3.3VとGNDに接続すること)
 ・TX/RXにはデバッグ用にシリアル―USB変換機を接続する
  (接続しなくても動作自体は行われる)
 ・ツイートに用いるTwitterアカウントの準備(新規アカウント推奨)
 ・StewGateUにてTwitterアカウント登録およびトークン取得
 ・ESP-WROOM-02を接続してもよい無線LANルータのSSIDとパスワードをメモ


作成方法:
 ・ソースをコピペして以下の情報を修正する
   ・SSID
   ・SSIDに対するパスワード
   ・StewGateUで取得したトークン
 ・ビルドしてダウンロードモードのESP-WROOM-02に書き込み
  (→過去メモ参照)


実行方法:
 ・ESP-WROOM-02をブートモードで起動
 ・デバッグ出力より無線LANルータとの接続を確認
  (『WiFi connected』の表示を確認)
 ・タクトスイッチを押すと定型文(『XXXX:HelloWorld!』)がツイートされる


うまくいかない場合は以下をチェック:
 無線LANルータの規格
   →ESP-WROOM-02が対応できるのは802.11b/g/n

 ・チップへの給電が十分か
   →通信時は80mA以上消費する

 ・ダウンロードモードからの設定変更は忘れていないか
   →GPIO0ピンをL→Hに戻し忘れることが多い
    ブートモードにしないと当然ながら起動しない

 ・メッセージ長の設定は正しいか
   →Content-length:の設定値以上の情報は無視される

 ・ツイート内容が重複していないか
   →同じ内容のツイートをした場合はTwitterにキックされる

注意点:
 ・ソースの大半はESP8266WIFI/WiFiClientサンプルコードからの流用
 ・無線LANルータの設定(ステルスID/接続先限定など)によっては動かない
 ・マイクロテクニカESP-WROOM02簡単マニュアルのパスは尼のマイクロテクニカショップでESP-WROOM-02を買ったら付いてきた
  各機能の使い方が日本語で簡潔にまとめられておりおススメ
  (ただし、デフォルトファームをATコマンドで操作する前提での解説)

 
#include <esp8266wifi.h>

#define KEY_PIN 5

//無線LANルータのIDおよびパスワード
const char* ssid     = "XXXXXXXX";
const char* password = "YYYYYYYY";

const char* host = "stewgate-u.appspot.com";
//http://stewgate-u.appspot.com/より取得したトークン
const char* token = "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ";

void setup() {
  Serial.begin(115200);
  delay(10);

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  
  pinMode(KEY_PIN, INPUT);
}

bool postMsg(String msg)
{
  Serial.print("connecting to ");
  Serial.println(host);
  
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return false;
  }
  
  client.println("POST /api/post/ HTTP/1.0");

  client.print("Host: ");  
  client.println(host);

  //メッセージ以外の長さ(トークン含む)にメッセージ長を加算  
  int msgLength = 40;
  msgLength += msg.length();
  client.print("Content-length:");
  client.println(msgLength);
  client.println("");

  client.print("_t=");
  client.print(token);
  client.print("&msg=");
  client.println(msg);

  delay(10);
  
  while(client.available()){
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }
  
  Serial.println();
  Serial.println("closing connection");

  return true;  
}

int value = 0;
void loop() {
  delay(100);
  ++value;

  if(digitalRead(KEY_PIN) == HIGH)
  {
    String text;
    //同じ内容のツイートはキックされるためユニークな値を付加
    text += String(value, DEC);
    text += ":HelloWorld!";
    
    postMsg(text);
  }
}

2015年8月7日金曜日

ESP-WROOM-02についてのメモ(5)

・ついに秋月電子も取扱いを開始

  Wi-Fiモジュール ESP-WROOM-02

 単品税込\550、10個以上の数割引で単価\450と相変わらずの殺人的プライス
 安い
 残念ながらモジュール単体のみの取り扱い
 この調子で実装済ブレークアウトボードもお願いしたい


・スイッチサイエンスからは新型のブレークアウトボードが発売

  ESP-WROOM-02ピッチ変換済みモジュール《シンプル版》 
  ESP-WROOM-02ピッチ変換済みモジュール《シンプル版》 ボードのみ 

 シリアル通信用途に割り切ったブレークアウトボード
 不要なIOはバッサリ切り捨てて必要なピンだけを引き出している
 裏面にチップ抵抗用のパッドがありプルアップ抵抗を外付けする必要がない

 チップ抵抗はリール買いするともてあますので小口売りがよい
 いつもaitendoで買っているがスモールパーツだと送料が割高になるのが難点
 チップ抵抗のサイズに注意すること

スイッチサイエンスよりモジュール裏面/これはいい感じ













2015年8月5日水曜日

Maker Faireのメモ(2)

以下、Maker Faire Tokyoに行ったメモ

初日の1時頃に入場
すでに満員御礼といった様子


会場全体で10体以上いたペッパー君
待機状態(うつむきポーズ)で大量に並んでいるとディストピア感ある
















R2-D2ビルダーズの展示/ただいまメンテナンス中
作業者を含めた絵面がズルい
勝てる気がしない

















僕の考えたさいきょうのカーボン自転車
カーボンパイプを接着して…ではなく焼成からやる狂気
















Faireの良心デイリーポータルブースより2秒で壊れた手製の自転車
カーボン自転車との落差が凄い
見えてる足は製作者ご本人
作業をしていたので設営トラブルかな?と思ったら別企画の作品を作成中であった