ラベル Arduino IDE の投稿を表示しています。 すべての投稿を表示
ラベル Arduino IDE の投稿を表示しています。 すべての投稿を表示

2020年1月11日土曜日

Seeediuno XIAOが見えない(解決)

おお、久しぶりのマイコンネタ。

■XIAO、そそるぜ■

SeeedstudioのXIAO、中々良さげです。あ、日本語サイトできてる。

ピンヘッダ/ピンソケットがはんだ付けされていないし、何よりGroveコネクタに場所を取られることなくGPIOを有効に活用できます。

まず、注文する前に環境を入れて、当面使ってみたい用途(USB Host)でビルドが通るかを確認しようと思います……私も大人になったものだ。以前は買ってからビルドが通らない!ってことが多々ありましてですね。

■ボードが見えない■

それはともかくSeeedのWikiに従ってボード情報を登録し、ボードマネージャでXIAOを……入れても一覧に出てきません。


結果として、Wikiでの記述が間違っていました。



Preferenceに緑の字のURL「https://raw.githubusercontent.com/Seeed-Studio/Seeeduino-Boards/master/package_seeeduino_index.json」を貼れと書いてありますが、その下のスクリーンショットには「https://raw.githubusercontent.com/Seeed-Studio/Seeed_Platform/master/package_seeeduino_boards_index.json」となっていて、こちらが正解です。これをpreferenceに貼ってください。

これで無事XIAOがボードマネージャにあらわれて、インストールでき、サンプルも無事ビルドできました。

よかったよかった。

■解決までの道のり■

以下の手順で気づきました。次回ハマったときのためにメモしておきます。

~Library/Arduino15/cache/の下を見ると、raw.githubusercontent.com/Seeed-Studio/Seeeduino-Boards/master/package_seeeduino_index.jsonがダウンロードされているが、開いてみるとここにはXIAOがない。

一方でSeeed Studioのgithubを見ると、XIAOがある。

よく見たらファイル名違うやんけ←ココ

2016年6月27日月曜日

ArduinoでJSON


javaでJacksonなんかをいじっていると、 "{\"name\" …なんて書いていくのは面倒くさいというか、どうせミスするのがオチなんだよ俺なんかー(血の叫び

と、つい人は不良化してしまいます。

というわけで、また楽な道を探しましたところ、良いライブラリ見つけました。

これ使いやすいですよ。ちょっとバッファを食うので、nano / unoあたりだと大きなデータは作りにくいかもしれないですが、例えばAmbient(thingspeak.comのようなクラウドサービス)に送るデータをserializeする場合なんか、これだけで書けてしまいます。dictionaryもarrayもかなり直感的に書くことができてとてもラクです。

//
//  send to Ambient
//
const int kMaxJsonBuffer = 2048;
StaticJsonBuffer<kMaxJsonBuffer> jsonBuffer;
char jsonPrintBuffer[kMaxJsonBuffer];
bool sendStorageToAmbient() {
  int n = storage.uni.datas.counter;
  JsonObject& root = jsonBuffer.createObject();
  root["writeKey"] = "*****************";    // ambientのapi write key
  JsonArray& dataArray = root.createNestedArray("data");
  for (int i = 0; i < n; i++) {
    OneData_t *pSrc = &storage.uni.datas.blocks[i];
    JsonObject& one = jsonBuffer.createObject();
    one["created"] = pSrc->created;
    one["d1"] = pSrc->temperature;
    one["d2"] = pSrc->humidity;
    one["d3"] = pSrc->pressure;
    one["d4"] = pSrc->airQuality;
    dataArray.add(one);
  }
  root["data"] = dataArray;
  Serial.print("text size = ");
  Serial.println(root.measureLength());
  root.printTo(jsonPrintBuffer, sizeof(jsonPrintBuffer));
  Serial.println(jsonPrintBuffer);
  int sent = ambient.bulk_send(jsonPrintBuffer);
  return true;
}

お勧め。

上の例ではバッファサイズを2048バイトにしているのでArduinoだと一発アウトですが、一度に送るレコード数を制限する等でカバーしてみてください。

なお、写真は特にこの記事とは関係ありませんが、次期モデルのプロトタイプ。LEDの色をちょっくら変えてみました。緑色LEDが明るすぎるので少し抵抗を大きくしないといけないの図。

2016年3月28日月曜日

ESP-WROOM-02の直接通信モードESPNOWを試す


ESP NOWは生パケットをやりとりするモード。DHCPどころかチャンネル自動選択もないので基本的にはチャンネル指定して送りっぱなし。つまり、余計な処理がない分オーバーヘッドも消費電力が少ないということです。

いやー、知りませんでした。何か別のことを調べていたらこの記事がヒットして、そんなことがあったのかー、となった次第。ちゃんとリリースノートを読まないといかんですね。


■ビルドする■

ただし、esp-nowは普通のarduino sdkには含まれていないので、ビルド通りません。設定を変える必要があります。

Arduino IDE : 1.6.5
Board Manager : esp8266 2.1.0

一度Arduino IDEを終了し、
~/Library/Arduino15/packages/esp8266/hardware/esp8266/2.1.0/platform.txt
のcompiler.c.elf.libs=-lm -lgcc -lhal -lphy -lpp -lnet80211 -llwip -lwpa -lcrypto -lmain -lwps -laxtls -lsmartconfig -lmesh -lwpa2という行に -lespnowを追加します。

…って書くと一瞬なんですけどね、ここまでたどり着くのに2日かかりました。makeEspArduinoを試したり、PlatformIOをインストールしたり。まぁその過程でSublime TextからESPをビルドする方法が見つかったりしたので、まったくムダになったというわけではありませんが(空元気

■試す■

まず上記ページに掲載されているソースを試してみます。いやー、シンプルで美しい。なお蛇足ですがESP-WROOM-02が2枚必要です。

スレーブは受信側、常時電源入れっぱなしにしておいてデータが届くのを待つイメージ。コントローラは送信側です。このサンプルでは2.5秒ごとにdeep sleepから復帰して適当な文字データを送っています。Deep Sleepを使うので、RESETとIO16を接続する必要があります

なお、実際に送受信する前に、2枚のESPそれぞれのMACアドレスが必要です。今回のアプリを起動すると自分のStation interfaceとSoft AP interfaceのMACアドレスがシリアルに出力されますので、

Slave : 相手側(Controller)STATION_IFのMACアドレス
Controller:相手側(Slave)SOFTAP_IFのMACアドレス

これをそれぞれのソースの最初の方にあるuint8_t macにセットします。相手側のアドレスを設定して登録するというのがミソ、まぁMACアドレスなんて変更できちゃうんですが、一応世界の一つだけのアドレスということになっているので、これで相手をフィルタリングするわけです。そうでないとご近所のWiFiがたまたま同じチャンネルに送信している時のデータをすべて受けてしまうので使いにくくて死にます。

実行結果はこんな感じ。画面下がController、2.5秒ごとにdeep sleepから復帰してデータを送信してます。画面上はSlaveでIO13のLEDは1秒ごとにLチカ、Controllerからデータが送られるたびにシリアルのLEDが点滅しているのがご覧いただけるかと思います。

データを送信する側は起きてすぐ寝るという感じで、通常TCP/IPなどで送信する場合に接続するだけで2-5秒かかってしまうのと比べるとかなりの消費電力削減が期待できます。




今回はこれで力尽きました(結果としてはよそのWebに紹介されてたプログラムを走らせて終わりなんだけどさ、ビルド通すまでが大変でした)。次回はこれでちゃんとセンサーのデータを送ってみます。

■追記■

1度に送れるデータは200バイトまでです。

…センサーからのデータをまとめて送ろうとしてハマりました。送っても送っても届かなくて、散々調べたらこれが原因でした。ちゃんとエラーステータスを見ましょうね、というお話ですね。とほほ。

2015年10月24日土曜日

鳩対策2号機(動きモノ


学習能力のあるカラスは電撃一回で来なくなったようですが、鳩は電撃で対策した柵には寄りつかなくなったものの今度は室外機の上に来るようになりました。

ということで、今度は、光り物と動き物で脅かす作戦にしました。やつら「実害」がないとダメなので、当初は電極を振り回そうかと思ったのですが、製作中に私が「実害」を受ける未来しか浮かばないので保留。

■仕様■

まず使用機材:
  • 動作状況をモニタできるようにESP8266を使用
  • 動きモノはサーボモータSG90
  • 光りモノは赤色LEDを直接接続
  • 鳩検出はPIR
  • 動作状況の記録にはThingSpeakを使用
動作仕様:
  • PIRで何かを検出したら時計をセット
  • 時計がセットされていたらサーボ腕を振り回しつつLEDを点滅させる。5秒経ってもどかなければ、LEDの点滅を激しくする
  • 何かがいなくなったら、サーボとLEDを止めてから何秒とどまっていたかをThingSpeakに送信
  • それとは別に1分ごとに気温と湿度をThingSpeakに送信する

■ハードウェア制作■

ESP8266/ESP-WROOM-02の電源を甘く見てはいけません。最終的に毎度お馴染みの「超高効率DC-DCコンバーター(3.3V0.5A) M78AR033-0.5」を使い、アルミ電解コンデンサ470uF + タンタル4.7uF + 積層セラミック1uをブレッドボードの3.3v電源ラインに並べ、ESPモジュールの上、Vcc - GND間に直接積層セラミック0.1uをハンダ付けして、安定動作させることができました。VccとGNDが離れているのでパスコン付けにくいんですよね…。ロットでの差異や個体差もあると思いますが、ここまでやれば起動直後にドーンと電流食われてもだいたい安定します。

サーボモータはIOピン直結、LEDはVfの実測値1.8vだったのでESPのIO定格値12mAを超えないよう150Ωの抵抗を入れて制限します。

HDC1000は秋月のプルアップ抵抗内蔵モジュールを使いますので、電源とI2Cを接続するだけでOKです。

PIRはHC-SR501を使いました。アマゾンでも秋月でも入手できます。このPIRは4.5vから使うことができます。秋月では5-12vと書いてありますが、他サイトでは4.5-12vになっていて、実際に試しても5vで問題ないようです。SE-10のように5vって書いてあるけど5vで使うとしばらくして不安定になる、ということはありません。以下配線表です。


ESP-WROOM-02モジュール接続先
1Vcc3.3vライン
2EN10kΩを通して3.3vラインへ(プルアップ)
3IO14HDC1000のSCLへ
4IO12150Ωを介してLED1へ
5IO13150Ωを介してLED2へ
6IO15N.C.(無接続)
7IO2プルアップ
8IO0プルアップ
スイッチを通してGNDへ
9GNDGNDへ
10IO4HDC1000のSDAへ
11RxDFTDIのTxへ
12TxDFTDIのRxへ
13GNDGNDへ
14IO5N.C.
15RSTプルアップ
スイッチを通してGNDへ
16TOUTN.C.
17IO16SG90の信号線(オレンジ色)
18GNDGNDへ


この他、各モジュールには電源を接続します。HDC1000はモジュールに書いてある通り、PIRはここがわかりやすいです。サーボはこちらを参考にしました。

PIRは感度と出力秒数をボリュームで、ジャンパで出力モードを指定できます。感度ボリュームは検知範囲の指定ですが、人間よりも小さい鳩が対象なので最大(7m程度)にします。出力秒数は動きが検知されなくなった後何秒ぐらい出力HIGHをキープするかを設定します。よくある侵入警告灯などで使う機能ですね。これは居なくなったらできるだけ早く消えて欲しいので最小にします。ジャンパは信号出力中に動きを検知した場合に点灯時間を延長するか最初の検知から指定時間を経過したらその間動きがあってもOFFにするかを切り替えます。内側は動いている間はずっと出力、外側は指定時間でOFF。今回は鳩の滞在時間を調べたいので、内側にします。上記の通り出力が延長されてしまうので正確な記録にはならないのですが…まぁ傾向はわかるかなと。

■ThingSpeakすげえ■

今回、ThingSpeak初めて使ったのですが、こういうWebサービスの中では今までで一番簡単でした。開発中、「そろそろThingSpeakへの書き込みコードを用意しておこう」と思ってコピペしてAPI KEYや変数などを書き換えてそのまま放置していたんですが、画面の隅で何か動いているものがあるなと思ったらThingSpeakのグラフでした。これだけでグラフになっちゃったのは初めてです。いやー、恐ろしい。

なお、ThingSpeakへの書き込みコードはここからコピーしました。ありがとうございます。Particleも良いんだけどね…I2Cが動かないのと何よりも技適がないのでどうにもなりまへん。

■ESPをArduino IDEで使う場合のピン番号■

動かしたヒトならみんなご存じだと思うのですが、探しても明記しているページが出てこなかったので書いておきます。

Arduino IDEでpinmode, digitalOutなどを使い場合に指定するピン番号は、ESPのIO4, IO5などと書いてある数字を使います。物理的なピン番号ではありませんのでお間違いのないように。

■ハマり所■

  • 上にも書きましたが、ESP8266の電源はちゃんとインピーダンスを下げないと暴走します。それもArduino IDEが書き込み終わった直後に暴走(電解コンデンサ追加で改善)、動作するけど数分で止まる(タンタル4.7uF追加)、数十分で止まる(パスコンを基板上に直接ハンダ付けで改善)…と対策をすれば良くなりますので、安定して動作しないとお悩みの方はお試しあれ。
  • Arduino HDC1000ライブラリはそのままでは動きません。Wire.beginでSDL, SCLのピン番号を指定する必要があります。HDC1000.cppのコンストラクタでWire.begin(); を Wire.begin(4,14); にします。
  • 存在しないIO番号、例えば6を指定すると、Arduino IDEではエラーになりませんがpinmodeなどを実行した際にExceptionが出ます(シリアルコンソールにメッセージが出ます)。
  • サーボモータを使うのはこれが初めてです。サーボモータは0-180度で動作するとのことなんですが、激安サーボとして有名なSG90は45-135度ぐらいしか動作しませんでした。その範囲外を指定すると唸り始めます。5個買ったうちの2個が同じ状態だったのですが、そういうもの?
  • サーボモータをつないだままにしておくと信号が一定でもピクピクもぞもぞ動いていますが、これを止めるにはdetachします。使う時にまたatachします。消費電力の節減にもなります。

■ソース■

より高い威嚇効果を求めて複雑な動きをさせたら腕の動きが激しくなったときにサーボがモゲそうになったので、単純な動きにしていますが…RTOSあたりをつかって、ちゃんと加速度制御を考えた上で複雑な動きをさせたいものです。


2015年8月24日月曜日

やっとESP8266(WROOM-02)入手


■追記9/16■

ファームウェアのダウンロード先が違っていました。またコマンドラインなどの表示が崩れていました。ご迷惑をおかけして申し訳ありませんでした。

なお、後日、もう一枚のESP-WROOM-02を組み立てたら、コマンドやArduino IDEファームウェアの書き込みはできるものの、起動してすぐにexceptionやコアダンプの山が出てくる状態になりました。

原因は電源でした(ESP-WROOM-02の電源はかなりシビア?)。某林さんを初め、この現象で悩んでいる方は少なくないようですので、ご参考になれば幸いです。

■お礼■

facebookで某林伸夫さんから教えてもらって、仕事帰りにaitendoに駆け込み入手しました。2個入りとボード2枚で1320円。情報ありがとうございました。

■準備■

さっそくハンダ付け。何も考えずにピンヘッダ付けちゃいましたけど、幅が広いのでブレッドボードで使うのが難しいです。横方向にジャンパ伸ばせばいいんだけど、壮大に間違える自信があるw なので、写真にあるように100円で買ってきたミニブレッドボードを2枚橋渡しして使っていますが(aitendoで1枚100円大安売りしてました。買っといてよかったw…と思ったけど、安いのには理由がある。クソ堅くてピン刺さらないいいいいいw)、ピンソケットを付けた方が試作には便利かも。あ、サンハヤトの新しいブレッドボードなら届きますね。


■さて■

何はともあれ環境整備、最近失敗が多いので、人様の成功例を真似しました。今回はこの記事(ESP-WROOM-02 の Arduino 環境で I2C 制御)を参考にさせていただきました。ありがとうございます。I2C用のプルアップ2本だけだと思っていたのですが、10kΩは5本必要。ずいぶん抵抗使うなぁと思ったんですが、おかげさまで一発で成功しました。

なおリセット/ISPについてはいつもの抵抗入りジャンパ線でGNDに落とすだけ、プルアップはしていません。

電源は最初余裕を見て秋月の超高効率三端子レギュレータを使いましたが、そのあと3.3v100mAの安い三端子レギュレータ(HT7533…秋月では販売終了)に交換しても問題なく動作しました。ESP-WROOM-02の平均消費電流は80mAとのことなので、ちょっとギリギリですが。

Arduino IDEは1.6.5を使います。まずArduino IDEを起動しPreference / 環境設定画面のAdditional Boards Manager URL'sに「http://arduino.esp8266.com/stable/package_esp8266com_index.json」をコピペしてOKをクリック、Toolsメニュー>Board>Board Manager>esp8266 platformを選ぶとインストールされます。

この後、ボードの種類を選びますが、aitendoなど素のespの場合にはGeneric ESP8266 Moduleです。

■ファームウェアアップデート■

この後、WiFiのサンプルを試したのですが、うまく動きませんでした。ので、ファームウェアをアップデートします。バージョンを確かめようとシリアルモニタからATコマンドを叩いてみたのですが、返ってきません。どうやら一度Arduinoとして動作させるとATコマンドインタフェースが消えてしまう模様。そのためだけにツールをアップロードするのも面倒なので、もうサクッとアップデートしてしまいます。Windowsはそのためのツールがあるようなので、そっちをどうぞ。Mac / Linuxではコマンドラインから操作します。

まずesptool.pyライブラリ(分かりにくいけどATTACHMENTSのところ)をダウンロードします。それぞれのzipを解凍したら、esptoolをインストールします。

$ cd <ダウンロードディレクトリ>
$ cd esptoos-master
$ sudo python setup.py install

次にライブラリをインストールしますが、そのためにはUSBで接続したデバイス名が必要です。Arduino IDEのツールメニュー>ポートを見れば /dev/tty.usbなんたら という名前が表示されているはずですので、それを控えておきます。私のところは /dev/tty.usbserial-AH016T8K です。

$ cd <ダウンロードディレクトリ>
$ cd esp_iot_sdk_v1.3.0_15_08_08 ←ダウンロードしたバージョン次第
$ cd esp_iot_sdk_v1.3.0/bin ←これも


以下は実際には1行です。また、上が1.3なのに下が1.2ですが…これは何故か1.3の中に入っているものが1.4と1.2で、1.4はβ版(b1)なのでこうなりました。ダウンロードしたものの中身に合わせてください(以下のコマンド、実際には1行です)。

$ esptool.py -p /dev/tty.usbserial-AH016T8K write_flash 0x00000 boot_v1.2.bin 0x01000 at/user1.1024.new.2.bin 0xfc000 esp_init_data_default.bin 0xfe000 blank.bin

すると以下の表示が出てきます。エラーなしにLeavingが出てくれればOKです(というかエラーになったことがないので不明…エラーとしてあり得るのは、usbシリアルの名前が違う、ファイル名が違う、ディレクトリが違う…などでしょうか)。

Connecting...
Erasing flash...
Writing at 0x00000400... (100 %)
Erasing flash...
Writing at 0x00041000... (100 %)
Erasing flash...
Writing at 0x000fc000... (100 %)
Erasing flash...
Writing at 0x000fec00... (100 %)
Leaving...$

これで書き込み終わりました。念のため、さっき動いたスケッチをもう一度書き込んでみて、同じように動作するか確認しておきましょう。

■さて。WiFi■

これもサンプルを試しました(ええそうよ失敗したくないのよ私は)。Arduino ideで ファイルメニュー>スケッチの例>ESP8266WebServer>AdvancedWebServer を開き、WifiルータにあわせてSSIDとパスワードを設定します。シリアルモニタを開くとIPアドレスなどの情報が表示されますので、そのURLをブラウザで叩くと表示されました。このグラフは単に乱数で生成されたものですが、SVGで非常に簡単にグラフができていますので、サーバ側単体でデータ表示する場合の参考になると思います。


…と書くと一発で動いたみたいですが、実際には上記ファームウェアアップデートの前に試してみたら、動きませんでした。v1.2のファームウェアを入れたところ、一発で起動してそのまま8時間安定して動きました。

でそのファームウェアやバージョンの差異ごとにパラメータが違ったりで、インストール後にまったく反応しなくなることもあり、結局最終的に上記パラメータにたどり着くまで2時間ほどかかりました。

■お約束のハマりどころ■

Arduinoとの互換性は高いのですが、微妙な違いもあります。私がハマったのは、もはや私の宿敵ともよぶべきI2C。最初に試した、超小型液晶AQM0802はそのままスケッチをコピペして動いたのですが、その後、手持ちのLCDライブラリやHDC1000用ライブラリは動いたり動かなかったり。

どうもI2CでendTransmissionした後、標準のArduinoでは送信を終了してから戻り、ESPでは終了を待たないで戻ってしまうのが原因ではないかと思い、調査中です。