« 2016年1月 | トップページ | 2016年4月 »

2016年3月の1件の記事

2016年3月16日 (水)

ESP8266の冒険は続く(2) SDカードブラウザーやRTCで遊ぶ

 このブログは2ヶ月近いご無沙汰である。実は6年ぶりに海外旅行に出かけて電子工作をお休みしていた。旅行は70才以上の方々とスキーを楽しむツアーである。場所は念願のスイスのツエルマット。スイスからイタリアまでスキーで滑り込める。結論から言えば、猛烈に楽しかったが疲れた。

 4日以上連続してスキーするのは日本でも20代の学生の時以来始めてである。疲れるのは当たり前と言えば当たり前のことだが、帰ってきてすぐ風邪を引いて熱を出し寝込んだくらい疲れた。でも、昔からいつかは行きたい行きたいと願っていた所だったので、今は深い満足感がある。

Dsc001000001 そんなことで、電子工作は、半かけのまま放置されていた。体調が戻って、やりかけていたプログラム開発を細々と再開した。ESP8266のRTC(リアルタイマークロック)である。想定通り動き始めたので、ブログに報告することにする。

 この趣味を止める気はない。ここ10年の楽しみだったので未使用の在庫部品が相当溜まっている。今止めればすべてが無駄になる。とても止めるわけにはいかない(笑)。ということで、電子工作の話は少し古くなってしまったが、以下から順を追って報告する。

SDカードの不具合は前にも経験したお粗末エラー(1/28/2016)
 前回のテーマはWiFiモジュールのESP8266でフラッシュメモリに仮想ファイルを作り、画像付きのウェブサーバーを動かすことで、これはうまくいった。ESP8266のArduinoスケッチライブラリーには、SDカードのサポートがある。勢いに乗って、こいつも試してみたが、さすがにSDカードはすぐには動かなかった。

Dsc003850003 ブログに書いた後、本腰を入れてSDカードを動かす作業に入る、色々試したが、がんとしてSDカードは言うことを聞いてくれない。Arduinoのプログラムは動くときはあっと言う間だが、動かないとなると何をいじって行けば良いのか全く見当がつかなくなる。良くも悪くも情報隠蔽がうまく行われているので手がかりがつかめない。

 散々苦労した挙句、動かすことには成功したのだが、何のことはない、原因は昔のドジなミスの再現であった。トラブルシューティングとは、こんなものである。自分を責めてみても仕方がない。苦笑いするだけである。

 使っているハードのSDカードアダプターは、電子工作を始めた8年前、ルネサスの16ビットCPUボードH8/3069FやAVRのMega128などで、汎用的に動かすことを目的に作ったものである。リセットなどがソフトでできるようにするため、電源をFETで切れるようになっている。

 電源ONは、FETからの制御線をGNDに落とさなければならないのだが、これを完全に忘れていて、端子が浮いたまま(未配線)動かそうとしてエラーを起こしていた。確か、このミスは、H8/3069Fのときも全く同じ状況だったはずだ。要は電源が入っていない状態で動かそうとしていたことになる。

 究明のきっかけは、動作中の入念な電圧測定である。このFETスイッチは前のトラブルのあと、バイパスしてあるものだとばかり思いこんでいた。電源電圧がかかっていることを確認し、そうだとばかり勘違いしていた。このときの電圧測定が不十分だったのである。

 どうしても動かないので、もう一度、各部の電圧を念入りに測り直した。すると、規定より少し電圧が低いことが分かった。3Vであるべきところが、2.5Vしかない。ふーむ、これはおかしい。どこにも熱を持っているところはない。過大電流で下がっているのではない。

 それなのに、どうしてこんなに低い?色々調べるうち、このFETスイッチがOFFになっていることを突き止めた。で、どうして2.5Vが上がる。犯人は、ESP8266からのChipSelectの結線であった。これによって電源がOFF(ハイサイドで)でも、制御線を通して機器側に回り込んで電源電圧をあげてしまう。

 ちょうどAVRで電源を切っても、USB-UARTのプルアップされたRX(受信)から電流が本体に流れ込んで、PowerOnResetが出来なくなる現象と同じである。SDカードアダプターの制御線をしっかりGNDに落とし、SDカードが正常に動いたことは言うまでもない。

 やれやれ、解決したのは良いが、前のH8/3069Fのときも制御線をGNDに落とすのを忘れ、半年近くSDカードが動かない事件を起こしている。これとそっくり同じミスをするとは。年は取るものではない。

SDカードのウェブファイラー動く。しかし、実用には耐えなさそう(1/30/2016)
 SDカードが動いたので、その応用であるSDカードの中身をウェブから見られるウェブファイラーの実験に入る。使ったソースは、ここから頂いた。大したソース量ではないので、コピペ一発でスケッチを作り、動かしてみる。

Esp8266_sdcard  ビルドはNO ERRORだったが、実際の動作は、HTMLのエラーでまともに動かない。WiFiやサーバーの起動部分は正常に動いているようだ。用意されたSdrootというフォルダーの中のindex.htmlを読むが、どうもこのファイルではファイラーになっていないような気がする。

 GitHubの該当のディレクトリを見ていたら、Sdrootの下にさらにeditというサブディレクトリの中に別のindex.htmlがあった。中を見ると、どうもこちらの方が最新のようだ。試しに前のindex.htmlファイルと交換してみた。

 あてずっぽうだったが、見事にこれが当たりだった。ちゃんとブラウザーの画面にSDカードのファイル一覧が表示された。いやあ、たいしたものだ。スケッチソースを調べると、jpegファイルなどが画面に直接表示できるようである。 

 早速やってみた。出た。うーむ、出ることはでたが、目茶目茶遅い。以前のH8/3069F程度の遅さだ。測ってみたら、4KB/秒もかかっていた。SDカードの読み込みが遅いのか、ESP8266の中のスループットが低いのか今のところはわからない。しかし、これでは実用的にこのSDカードファイラーを使うのは殆ど無理だ。

Esp8266sdfiler  なるほどね。これが、ESP8266で画像の話題が出て来ない理由のようだ。なぜこんなに遅いんだろう。writeブロックが、1460バイト程度(HTTP_DOWNLOAD_UNIT_SIZE)では、こんなものなのかなあ。

 今のところ差し迫ったファイラーへのニーズがないので、追及に力が入らない。SDカードの実験はどうも先に進みそうにない。ESP8266への情熱が急速に冷めて行く。

ESP8266のアクセスポイント(AP)モードも超遅い(2/2/2016)
 長い間買うのを我慢していた、スマホ(iPhone 6s)を遂に導入した。海外旅行に向けて色々準備していることの一環だ。料金プランは月々の通話料を抑えるため端末を買い取ったが、長い間、単一ガラケーの所有者だったので、ポイントがかなり貯まっていて、思ったより安く手に入れることが出来た。それでも6万を超す出費だ。

 海外では4Gは通らないが、WiFiなら海外でも使えるルーターがレンタルできる。例えばスイスなら、swisscomというプロバイダーと契約したルーターが一日¥1000前後で借りられる。レンタルを申し込んで旅行に備える。

 自宅でWiFiのテストしていたときである。トイレに持ち込んでアクセスしたら、なんとここだけ我が家のWiFiが通らない。こういうときのESP8266である。こいつのWiFiモードには中継をするAP(アクセスポイント)モードというのがあると聞いている。早速試してみた。

 作業はとても簡単で、ATモードのとき以下のコマンドを入れるだけである。何でもない2ステップだ。動いたようだ。スマホにはちゃんとアクセスポイントとしてESP8266が表示される。
AT+CWMODE=2                     動作をアクセスポイント(AP)モードのみにする
AT+CWSAP="ssid","pass", chn, ecn 
ssid(id名)
pass(パスワード) 
chn(チャンネルID、1でよい)
ecn(エンコード 1= WEP, 2 WPA_PSK, 3 WPA2_PSK, 4 WPA_WPA2_PSK)

 いやいや、簡単なものである。繋いでみた。繋がることはつながった。しかし、残念。とても遅い。メールくらいならともかく、音声、画像は全く無理といってよい。

 WiFiの物理層のスループットがそもそも大きくないのか、組み込まれた32bitプロセッサーが遅いのか、それとも何か他に原因があるのかどうかはわからない。pingが1ms以上かかっていることから考えると、プロセッサーの論理層の処理が余り早くないのかもしれない。

 少し、ウェブで探してみたが、このあたりに言及するサイトは見つけられなかった。いずれにしても、ESP8266のWiFi中継は、デフォルトで動かす限り実用には程遠いレベルであることだけはわかった。そりゃそうだよね。¥500少々では無理な話だ。

ESP8266にI2C機器(DS3231)をつなぐ(2/8/2016)
 今度は、リアルタイマークロック(RTC)である。これもウェブあたりで沢山紹介されているI2CのRTC(DS3231)をアマゾンで手に入れた。このチップは、Arduinoで簡単に動くようである。I2Cなので結線もわずかである。これもあっけなく動いた。 

Dsc003890001  I2Cの部分はそっくり、人さまのソースを参考にしたのでこれに関しては、全く経験値は上がらない。手持無沙汰なので、Arduinoのコーディングの勉強を兼ねて、UARTで時刻の初期設定をするルーチンを組み込むことにした。

 簡単に行くと思ったがこれが難儀したのである。このArduinoの言語仕様がいまひとつ理解できていない。C++だというが、とても簡単なところでコンパイルエラーになる。それは、文字配列をストリング型に移すステートメントで言う事を聞かない。

 char buf[32];

として、新しいStringクラスのインスタンスstrに入れようと

   String str = new String(buf);

とするが、

error: conversion from 'String*' to non-scalar type 'String' requested

というエラーになる。どうもおかしい。Arduinoでは、newという命令が違う意味に使われているようなのだが、このあたりを解説するウェブサイトが見つからない。結局、このステートメントをあきらめ、最初からstring型で受信バッファーを作って、ごまかした。

 それに、Arduino IDEに付属しているシリアルモニターと、TeraTermなどのPCコンソールとは入力の状況がかなり違う。どちらも快調に動くしかけがなかなか作れない。これも、何とかArduinoの方に合わせ、初期入力が出来るところまで行った。

Dsc003860002  やっとのことでRTCの時刻設定が動き始めた。アマゾンで買ったこのDS3231基板には、時刻保持のためのボタン電池のフォルダーが裏に用意されている。良くわからないがボタン電池を入れて動かしてみた。電源を切って暫くしてもう一度電源を入れ直す。

 問題なく正しい時刻を表示した。これで当面RTCも動いた。 しかし、繰り返しになるが、どうも経験値が上がってこない。Arduinoの開発というのはこんなものなのだろうか。よく言われる諺の「靴を隔てて足を掻く(隔靴搔痒)」感が否めない。

あいついで新ディバイスの導入(2/15/2016)
 海外旅行のため、スマホに続いて思い切ってカメラも刷新した。ほぼ10年ぶりの更新である。撮像素子がほどほど大きく(APS-C)、軽量のミラーレスをチョイスした(Sony α6000)。これまでのデジタル一眼レフ(オリンパスE510)に較べれば、遥かに軽いうえに高性能である。

Sony_a6000  ISO感光度がとんでもなく高くなっているのに驚く(ASA25600)。夜の光景が真昼のように撮れる。WiFiでデータが送れる。ピント合わせが瞬間で終わる。いやいやここ10年の進歩はすさまじい。

 あれやこれやの新機器で周辺の整備に気を取られ電子工作どころではない。スマホやこのカメラを触ってみて、これまでの電子工作で驚いていた技術の進歩は、着実にこうした実社会にも反映されていることを実感した。

 スマホの方はGPSの進歩に感動である。何と地下鉄の中でもトレースするのだ。通勤の経路がほぼ完全にトレースできている。聞くところによると、a-GPSと言って、携帯基地局の場所から換算したGPSデータを送っているらしい。

 10年前、日本橋の事務所のビルの谷間では、現在地さえ把握できなかったGPSの性能に比べると格段の進歩だ。いや、車の無人運転が間もなく実用になるような時代だ。21世紀は着実に歩みを進めていることは間違いない。

15年ぶりの海外スキー。もう思い残すことはない(2/29/2016)
 海外スキーの話である。カナダで海外スキーしたのが15年前の話で、それ以来である。結論から言えば、やっぱり年だ。ヨーロッパまでの旅はいくら早くなったとはいえ、まだ10時間以上かかる。行き帰りの空の旅だけで相当体力を消費する。海外旅行はやはり若いうちに行っておくべきだ。

 搭乗するときビジネスクラス席を通過する。ゆったりとした席が用意されているようだが、いくら広くなると言っても、所要時間がエコノミーに比べて少なくなるわけではない。金をかけてもこの時間は少なくならないのだ。しかも時差で体の調子は一ぺんにおかしくなる。

Dsc002060003  20年ぶりのヨーロッパは、列車が新しくなって、さらに快適に早くなっていた。ツエルマットからインターラーケンという主要な観光地は昔、一日で回ることが出来なかったが、長大なトンネル(長さ34.5kmレッチュベルグベース)が出来て一時間以上短縮され、ツエルマットから日帰りで、ヨーロッパ最高標高列車地点のユングフラウヨッホまで行けるようになっていた。

 ここはほぼ30年ぶりの訪問である。しかし、今度も運命の女神はユングフラウヨッホで晴天をくれなかった。マッターホルンは2回とも微笑んでくれたのに、ユングフラウヨッホは2回ともはずれだ。最高点のレストランでワインを飲んでうさをはらす(気圧が低いので用心して一杯だけ)。

 氷河上のスキーは、日本とはスケールの違う滑り方ができる。何十年もスキーをやってきたが、至福の滑降を楽しんだ。もう思い残すことはない。ツエルマットからはリフト、ゴンドラを乗り継ぎ、国境を超えてイタリアまで行くことが出来る。この往復の一本だけで日本の2日分の滑走距離になる(30キロ以上)。

Dsc001470002  スマホのGPSは上空(成層圏以上か)では無効になることがわかった。成田から飛び上がり新潟方面に進路をとると間もなくトレースが止まる。しかし最寄りのチューリッヒ空港で復活した。日本で借りてきたスイスのWiFiルーターが動き、スイス国内のルート地図があらわれた。

 GoogleMapで現在地が把握できる。夢のような話である。いや、スマホに買い替えて良かった。スキー場での場所の把握も簡単に出来る。スイスのスキー場は大抵のコース上でWiFiが効く。もっとも、コース上ではガイドについていくのに精いっぱいで、これをゆっくり見ている暇はとてもなかった。

 帰りに、添付写真のような立体地図を高速道路のサービスエリアでみつけ思い切って買って来た(117スイスフラン、1万3千円程度)。枠が大きすぎて機内持ち込みは出来なかったが、添乗員の計らいで「こわれもの」として別送してくれた。感謝、感謝である。Dsc003910001

帰国してからの電子工作。ArduinoでRTC時刻設定部を整備する(3/15/2016)
 日本に帰ってきてすぐ、風邪を引き、電子工作の再開はさらに延びた。参加者の人たちにOneDriveで、撮りためた写真を配布する。先方からも写真が届く。写真を見る度に、その場の雰囲気が思い出され、気分が高揚する。

 海外旅行好きの親父が良く言っていたのを思い出した。「海外旅行は、行く前と行った後が楽しい。最中は疲れる」というのだ。父はいまの私の年齢と同じころ盛んに海外旅行を楽しんでいた。 まさしくその気分である。行く前は、期待と不安で胸が膨らみ、帰ってからは楽しかったことだけが残る。途中は既に書いた通り、疲れることが多い。

 事務所に出たり、久しぶりにジムに出てステップで汗を流したり、日常の生活が戻ってきた。そろそろ電子工作に戻る時期だ。机の前を片づけて、PCを開き、Arduino IDEを立ち上げて以前のソースを眺める。

 一応、UARTから年月日や時刻が設定できるようになっているが、現在の設定は、年月日時分秒をただ直列に文字列に並べ、一気に定義する方法で人間にやさしくない。ウェブでもっと親切な時刻設定のスケッチを探したが、簡単には見つからなかった。それなら自分で作ってやろう。このあたりは力仕事なので、適当なところを関数に切り出してやらないと冗長なソースになる。

Esp8266rtc  うーむ、まだ、ArduinoのC++に慣れないな。stringというデータタイプは便利だが、他のデータタイプがCとはずいぶん違う。1バイトのバイナリ―を定義するため、データタイプをbyteと定義すると、コンソール出力が十進数字で出てくるのには参った(余計なお世話だ)。

 何とかひねくり回し、一応I2Cのリアルタイマークロックの時刻をコンソールから設定するArduinoのスケッチが完成した。年と月日、時分秒の3つを別々に設定できる。既に設定したところはリターンキーで素通りできるのがちょっと工夫したところだ。曜日の設定は、ウェブから変換式を手に入れたので改めて入力する必要はない。
 以下に、DS3231を使ったRTCスケッチのソースを.inoファイルの形で置きます。適当なプロジェクトフォルダーに入れてArdluino IDEでコンパイルしてください。

「sketch_DS3231.ino」をダウンロード

  これを公開してブログ再開の節目としよう。まだ、WiFiモードがバックグラウンドで動くのが気に入らないし、立ち上がりの時のボーレートの違うメッセージのゴミも気になるが、これはいずれ直すことにする。

| | コメント (2) | トラックバック (0)

« 2016年1月 | トップページ | 2016年4月 »