ここから本文です
普通のソフトウェアエンジニアが、半田ごて片手に組込み機器にチャレンジします。

書庫Arduino

記事検索
検索

全6ページ

[1] [2] [3] [4] [5] [6]

[ 次のページ ]

■概要
WioLTEを最近利用していますが、気になる点を書きました。
次のVersionで改善されるといいなぁ。自分なりの工夫も書いているのでご参考になれば。
気になる点だけ書いていますが、簡単にクラウドにデータをアップロードできるし便利ですよ。

イメージ 1

■1.ボードをマウントする穴にチップが接触する
写真にあるように、BOOT0ボタンの周辺にチップ部品が実装されているので、ボードを固定する際にフラットでなくなり不安定になります。さらに、マウントする穴が3か所あれば、多少安定するのですが、穴が対角の2か所なので安定しません。スペース的には、3か所開けられそうなんだけどなぁ。

イメージ 2

流石に、もう一つ穴を開ける訳にはいかないので、六角スペーサーを少しだけカットして取り付けしました。それでも強度は落ちてしまいますね。ほとんど基板を触らない場合は良いのですが、書き込むためにDFUモードへ移行しなければならず、裏のBOOTボタンとRESETを同時押しするので、そこそこ触ります。
しかも、ボタンの色が黒いですよね。これそこそこ重い(強い力を要する)ボタンなんですねぇ。

イメージ 3
イメージ 4

■2.外部5V入力がUSBしかない
WioLTEを購入すると、極太で短いmicro-USBケーブルが同封されています。(標準付属品ではなく、初回ロット特典のプレゼント?)私の手持ちでここまで太くて短いものはありませんでした。しかも、固いので取り回しし辛い。悪名高いmicro-USBなのでもげる可能性もゼロじゃないのでドキドキしてます。LTEで通信するために、そこそこの電流(500mA以上)を要求されるので、抵抗値の少ないものをご提供いただいていると思います。プレゼントなので文句は言えません。

イメージ 5
※写真の左側です。約20cmのUSBケーブルです。

回りくどくなりましたが、ケーブルの不満ではなく、5Vを入力するのがmicro-USBポートしかないのです。

外部から、3.7Vを入力するリポ用の端子はあるのですが、5Vを入力できる端子が無く、USB以外の外部電源からボードへ電源供給することができません。もちろん安定化された5Vを入力する必要があるので、適当な電源繋いで壊されても・・・って思いがあったのか分かりませんが、私は3.7Vよりも5Vの外部端子が欲しかった。
イメージ 6

仕方ないので、裏面のパットに出ているのでそこにはんだ付けして外部から5V供給するようにしてます。

イメージ 7
※不安なのでホットボンドで補強してます。

以上の2点がここ2か月間くらい利用したボードの気になる点です。

■WioLTEについて
SeeedさんとSORACOMさんが上手く組んで環境を準備してくださっているので、最初のお試しが手軽にできるのは良いですね。頻繁にハンズオンワークショップ開催しているようなので、気になる方は参加されてみてはどうでしょうか?
https://soracom.connpass.com/

ハンズオンのテキストをこちらで見ることができます。
https://github.com/soracom/handson/wiki/Wio-LTE-%E3%83%8F%E3%83%B3%E3%82%BA%E3%82%AA%E3%83%B3

クラウドにアップロードできるIoTが手軽に体験できます。私も参加しましたが、疑問点も解決できて非常に良かったです。

■最後に
参考までですが、LTEのアンテナがぷらぷらして気になるので、プリンタで固定化部品を4つ出力して、こんな感じでスッキリさせています。2本は極力離した方が良いそうですよ。

イメージ 8

イメージ 9

需要あるかわかりませんが、STLファイルをダウンロードできるようにしておきますね。

■概要

ESP-WROOM-02(ESP8266)Milkcocoaと連携しログを出力しているとたまに、ESPがへそを曲げて例外出力する場合があり、ここ数日解析して対処法が見えてきたので書きとめておくことにしました。もし同様の現象で悩んでいる方の参考になれば幸いです。私の解決方法は、一番下に書いてあります。
探した限り情報が無かったので、あまり困っている人いないかもしれない。

※ちなみに、ESP-WROOM-02をArduino化してMilkcocoaのSDKライブラリを利用している環境になります。

イメージ 1

★例外の出力画面:そうあれです。

ESPで例外が出力されると、

『どうせ電源でしょ?』とあまり例外のスタックトレースダンプをスルーすることが多かったのですが、ダンプの確認方法も紹介します。(ご存じの方も多いと思います。)

■システム構成
今回作っていたのは、ESP-WROOM-02(ESP8266)でMilkcocoaにデータに一定時間毎にpushし、onでデータも監視しているようなシステム構成です。そして、親機と子機の関係も存在し、子機はonだけでデータの変化を監視しているような構成になってます。

イメージ 2

■現象
ログに'Exception (28)'を出力しESP-WROOM-02がリブートしてしまうというものですが、少し面白い?現象が発生しておりました。それは、親機と子機の両方がほぼ同時にリブートするのです。考えられるのは
・USBの電源ノイズ?
・USBのリセット?
・強力な2.4Gが飛んで来てリセット?
なんだろう

傾向として、電源投入直後というよりも少ししばらくしてから発生する頻度が多いような気がしました。

■ヒントは受信データ量にあり!
実は、pushするデータには連番のシーケンス番号(リセットで1〜になる)を振っているので、milkcocoa側のデータを確認すると、直前にpushされたデータを確認することができます。

なんとなく、データ量が増えたときに発生するような気がしてきました。

イメージ 3

赤枠で囲った場所が、リセットの直前データ。それ以前のデータよりデータ長が増えている様子が分かると思います。このキャプチャーはその前より2Byte増えている。

イメージ 4

■Exception Decoderを使う
同様な事例を探してみると、あまり見つからないのですが、Exception Decoderなるものがあることを見つけました。例外発生時のスタックトレースをコピペすると、コールスタックを出力してくれる素晴らしいツールです。

ESP-WROOM-02(ESP8266)使う方は、解析用に
絶対に入れておくべき
ツールです。

インストール方法は、他にお任せするのですが、私がインストールする際にはまったのは、Exception Decoderを起動した際に、ELFファイルを要求する選択ダイアログが表示されて困りました。結論としては、IDEを再起動して、ビルドし直せば要求されることなく上手く利用できるようになりました。

シリアル出力されたあの例外をコピペして貼り付けると、なんか出ます。

イメージ 5

一部加工していますが、以下のような出力です。
許可されない領域の不正なアクセスというところでしょうか・・・
※結果としては、後で出てきますが0ポインタのアクセスでした。
Exception 28: LoadProhibited: A load referenced a page mapped with an attribute that does not permit loads

Decoding 8 results
0x40209f22: aJsonClass::getObjectItem(aJsonObject*, char const*) at C:\xxxxxxx\aJSON.cpp line 973
0x40209084: DataElement::DataElement(char*) at C:\xxxxxxx\Milkcocoa.cpp line 159
0x40209309: Milkcocoa::loop(unsigned short) at C:\xxxxxxx\Milkcocoa.cpp line 172
0x402088a4: milkcocoa_main() at xxxxx
0x40208968: loop at xxxxxx
0x40212134: loop_wrapper at xxxxx
0x40100718: cont_norm at xxxxxxx

aJSON.cppのgetObjectItemで、不正アクセスが行われたことが分かりました。
そして、ライブラリの利用側からするとMilkcocoaのloopを呼び出している最中であることも。

■例外をcatchできないか?
私の中の悪魔がささやきました。
『解析するのも面倒だなぁ。データが少しぐらい欠けても問題ないので、リブートさせずにtry-catchでスルーさせるのも良いのでは?』と・・・・

いろいろ調べてみたのですが、Arduino IDEではできないそうですね。
コンパイルオプションの変更を許可してないらしい。残念でした。

■よし!解析するかぁ
シリアルデバッグで気にあるところを出力していきます。今回幸運だったのは、
再現性が高いこと
リブート直前のデータをpushすると、即座に同様の現象が再現できます。

そこで見つけたのは、データ量が増えるとJSONのカッコが消えること。

結果JSON(一部省略)
{xxx,"params":{"seq":99,"dist":12354,"vc":132,"irc":999}}95
×{xxx,"params":{"seq":100,"dist":12355,"vc":133,"irc":100095

×の方は、}}が2つ消えちゃってます。parse処理で失敗するのねぇ。
なんとなく、このバッファサイズが匂います。

■調べるとここで問題発生
カッコが抜けていると判断されて、DataElementのparse処理で失敗して、paJsonObjがNULLで返却されて、getObjectItemにNULLが渡されてしまうことが問題でした。

イメージ 7

■対策方法
結局のところ、バッファサイズが足りないので、MAXサイズを変更することにしました。

Milkcocoa ESP8266 SDKが利用しているAdafruitのMQTTライブラリのヘッダファイルAdafruit_MQTT.h
のMAXBUFFERSIZEを以下のように修正します。
値は、自分の最大データが収まるサイズにすれば256である必要はありません。

イメージ 6

■まとめ
少し長めのデータを受信した場合に、Exception 28が発生する場合は、上記のバッファサイズを変更すると幸せになれるかもしれません。

Milkcocoaも初めて利用させていただきましたが、ありがたいですね。他の会社様に譲渡?されたり今後がきになりますが、無料で継続利用できることを望みます。

対策したことで、非常に安定して連続稼働することができています。
ESPの例外確認は、ひと手間かかりますがException Decoderおすすめです。

Wio NodeのArduino化

■概要
Wio Nodeは、ESP-WROOM-02のWi-Fiモジュールが搭載された小型で低価格なモジュールです。

ESP-WROOM-02といえば、Arduino化が流行っているようなので、これもArduino化して利用できると思いネットを探したのですが、『できる』という記事があるだけでその手順が無かったので、私が試した手順を紹介します。もとのファームに戻す手順は試してないので、一度やると戻せない可能性がありますので自己責任でお願いします。

イメージ 4

この作業を行うことで、非常に小型のWi-Fi機能が搭載された使いやすいArduinoが手に入ります。
格安なので、通常とArduino化したものと2つ持ちもいいのでは?(;^ω^)

イメージ 1

■準備するもの

Arduino化するためには、以下のものが必要です。
- Wio Node本体
- USBシリアル変換モジュール(この(Amazon)辺のもの)
- GROVEケーブル(この(Amazon)辺のもの)

※私は、GROVEケーブル持ってないのでコンタクトピンで接続しました。

■書き換え方法

Wio NodeをUART経由でPCに接続しファームウェアをArudino IDEから書き換えします。
※OTA(Over-The-Air)での書き換え方は知りません。

■接続図

Wio Nodeの回路図を探したのですが、残念ながら見つけられませんでした。
(2016/09/07修正)下記の一番下に回路図ありました。<(_ _)>
http://wiki.seeed.cc/Platform/Wio/Wio_Node/

テスターで調べて、下記のように端子が出ていることが分かりました。

イメージ 2

そこで、このUARTにUSBシリアル変換モジュールを下記のように配線します。
TXはRXIへ RXはTXOへ接続し3.3Vは接続しません。
注意点は、USBシリアル変換モジュールからの電源供給ではなく、USBケーブルを介して電源は供給します。

イメージ 3

ここまでくれば半分はできました。

■Arduino IDEを準備する

私が利用した環境は、Arduino.ccの1.6.10版です。ESP-WROOM-02(ESP8266)のファーム書き換えには、Arduino.ccのIDEが必要のようです。

ここの準備の方法は、他のサイトで詳しく説明しているので、IDEの環境準備はそちらをご参照ください。
大変お世話になっているスイッチサイエンスさんの記事です。
こちらの記事にある、『スケッチを書き込み』する前まで準備します。


一つ注意点があります。
Wio Nodeには書き込みの際に自動的にリセットする機能は無い(と思う)ので、Reset Methodは、ckにしておきましょう。※手動でリセットを入れる必要があります。

イメージ 5

■書込みプログラムで注意点あります!

Wio Nodeの上位機種?にWio Linkという製品があり、そちらでは、GPIO15をかならずHIにしなさい。とあるので、そのようにSetupでかならず記載するようにします。

  pinMode(15, OUTPUT);
  digitalWrite(15, 1);

イメージ 6

■書込みます!

最後に一番重要なポイントです。ファームを書き込む前に、本体を書き込みモードに移行するRESETを手動で入れる必要があります。

1.USBの電源を入れます。(初回のみ)
2.FUNCのボタンを押しままにします。
3.RSTのボタンを押します。
4.1秒くらい経過したらFUNCのボタンを離します。
5. IDEから書き込みします。
※USB電源を毎回入れ直す必要はありません。プログラムを変更する場合は、2〜5を繰返します。

上手く行くと、書き込み中に青色のLEDがちかちか点滅します。

■下記のエラーが出る場合は、上手くリセットが出来てない可能性があります。
もう一度リセット手順を行ってください。ダメなら、いちどUSBの電源を切ってから再度TRYしてみます。
warning: espcomm_sync failed
error: espcomm_open failed
error: espcomm_upload_mem failed
error: espcomm_upload_mem failed

■成功!

書込みが成功すると、本体の赤色LEDが点灯します。
※この赤色LEDの点灯は、先のGPIO15をHIにしないと点灯しません。
イメージ 7

リセットは、慣れれば簡単です。
あとは、いろいろお楽しみいただけると思います。
ご参考になれば幸いです。

■調査の背景

Arduino Pro miniやその互換機(GR-KURUMI)などで、FTDIのチップを利用した書き込み回路があり、それを真似て作ってみたところ、USBに接続した際に、マイコンへのリセットが多発していることに気づいたので少し調べてみました。

イメージ 2
イメージ 3

※少しほこりが・・・(^_^;)

■回路

イメージ 1

FTDI側*マイコン側備考
DTR-GRNこれ
RXI-TXO
TXO-RXI
3V3-VCC
CTS-GND
GND-BLK

で、このDTR信号はこの先のマイコンのRESETに接続されています。

■DTRの様子は・・・

イメージ 4

1:黄色 CTS
2:水色 DTR(これ)

こんな感じで、4〜6秒間くらいパタパタやっていました。(画像は4秒)
私の場合は、Windows10のVMWareでやっていますが、使っている環境で多分違うのかなぁと思っています。

単にFTDIに電源を与えただけ(モバイルバッテリーに接続)では、DTRはパタパタしませんでした。
これより、USB接続の際に、シリアルポートとしてOSが認識した際にパタパタするんだと思います。

これでなんか問題かというとそんなことは無いのですが、チョット気になったので。

SerialLedシールドとは?

■Serial LED シールド
Arduino用にSerial LED シールドを作成しました。

2017/1/21 写真ではLED表面が白色ですが、黒色となる場合があります。色のご指定はできません。
2014/5/30 頒布をスイッチサイエンスさんで開始しました。
こちらからご購入することができます。完成版とキット版の2種類にしました。
キット版はチップ品のはんだ付けが必要になりますが、その分お安くご提供しています。

v1は緑色でしたが頒布用のv1.1は、朱色っぽい赤になります。
左上に搭載されているマイコン(DIP8パッケージ)が、フルカラーLEDをコントロールします。

イメージ 1

■概要
フルカラーシリアルLEDであるWS2812系をUARTコマンドで簡単に制御できるLEDコントローラを開発しました。
そのコントローラをArduinoのシールドに搭載することで簡単に評価することができるようになります。

イメージ 2

■フルカラーシリアルLEDについて
本シールドには、8個のWS2812BのフルカラーLEDがフロント部分に搭載されているため、そのままでも簡単に演出確認が行えます。さらに拡張端子も備えているため、お手持ちの(WS2812系LEDが搭載された)テープタイプのLEDを接続し実験することも可能です。

・制御できるWS2812系はスイッチサイエンスさんが扱っている製品だと以下が制御できるはずです。
#製品名
1フルカラーシリアルLEDテープ(1m)
2フルカラーシリアルLEDテープ(17cm)
3フルカラーシリアルLEDモジュール
4NeoPixel Ring - 16連フルカラーシリアルLED
5NeoPixel Ring - 12連フルカラーシリアルLED
※全てを動作を保障する訳ではありません。

もちろん、本シールドを利用せずともArduinoでWS2812系のシリアルLEDをそのまま利用することができますが、点滅や色合いの変化等を組み合わせて実施するとそれなりにCPUを占有してしまいます。しかし、本シールド側にLED演出を任せてしまえば、Arduino側は本来の作業に集中することができ、並行して動作が可能となります。

イメージ 3

■Arduino用のソフトについて
Serial LED シールドをより簡単に利用していただけるようにArduino IDEで利用していただけるライブラリを公開しています。
ライブラリを追加していただくことで、より簡単に、そして多くの記述例から使い方を確認することができるようになります。

イメージ 6

ライブラリは、GitHubで公開されております。使い方やインストール方法についてはこちらでご確認ください。


■LEDの演出について
シールドに搭載したLEDコントローラは、マイコン(LPC810)を利用し独自設計のソフトウェアが搭載されています。
数種類のUARTコマンドを組み合わせることで鮮やかかLED演出を行うことができるようになります。
演出用のコマンドについては、以下のドキュメントにまとめられています。


★Windowsアプリ

さらに、Windows用に演出コマンドが作成できるアプリケーションを提供しています。
本アプリケーションから、シールドに搭載されているLEDの演出制御や、シミュレーションによる確認が行えます。
また、演出用のプログラムを生成することも可能です。

イメージ 4

詳細については、こちらのブログでご確認ください。

★Windows以外についも・・・
また、現在Windowsだけでなく、MacやLinuxでもコマンドが作成できるようにブラウザ版を開発中です。(2014/5/25現在)
もうしばらくお待ちください。進捗状況につきましては、こちらで公開しております。

■LEDのコントローラについて
LEDのコントローラは、LPC810と呼ばれるDIP8サイズのマイコンを利用しています。
シールドでは、ICソケットに挿入されていますが取り外して、オリジナル作品や製品への搭載が可能です。
LEDコントローラにこのマイコンを利用した目的は、この取扱いやすいサイズであれば他への流用が簡単にできると考えたためです。本シールドでコントローラを評価後には、是非オリジナル作品への転用をご検討いただければ幸いです。
UARTでコマンドが発行できる相手であれば接続可能です。無線モジュールで、UART通信できるものもありますので電源に注意すれば、多くの上位装置と接続することが可能です。

イメージ 5

LEDコントローラの仕様については、こちらのドキュメントでご確認ください。

■コンセプト動画
少し前に作成した動画です。
本シールドを検討中に、LEDコントローラの紹介とコンセプトをまとめたものになります。
お時間があればご覧いただければと思います。



■はんだ付けの方法について
頒布用のシールドは、2種類存在します。ピンソケットをはんだ付けするのみで利用できる完成品と、自分ですべての部品をはんだ付けするタイプ(キット品)です。

★完成品
完成品は、Arduinoにスタックするためのピンソケットをはんだ付けするのみで利用することができます。
ピンソケットのはんだ付け方法については、こちらで確認することができます。
※ピンソケットは、付属しませんので別途ご購入いただくかお手持ちのものを利用することになります。

イメージ 7

★キット品
すべてを実装する必要があります。こちらで、はんだ付けの方法をご確認することができます。動画も用意しています。

※もし失敗しても心配しないでください。ご連絡いただければ、送料+実費で修正します。
同封されている説明資料に記載されている宛先までご連絡ください。

※完成品同様ピンソケットは、付属しませんので別途ご購入いただくかお手持ちのものを利用することになります。

イメージ 8

■おまけ
おまけとして、初回頒布板(完成品、キット品の両方)には、ここで作成したLEDフェイスプレートを同封させていただきました。
両面テープ等で少し固定すれば、柔らかいLED演出になります。
※おまけなので、多少のズレや傷についてはご了承ください。

イメージ 9

以上になります。

全6ページ

[1] [2] [3] [4] [5] [6]

[ 次のページ ]

本文はここまでですこのページの先頭へ
みんなの更新記事