カテゴリー「esp8266」の18件の記事

2019年9月19日 (木)

半年ぶりのブログ更新に漕ぎつけた


 しばらく休んでいた研究所の報告を半年(正確には7ヵ月)ぶりに再開する。休んでいた理由は、電子工作が低調で報告するようなものがなかったということにつきる。電子工作を始めて10年以上が経ち自分で出来そうな工作はあらかたやってしまった。いわゆるネタ切れである。

 まあそれは表向きで、低調な理由は、やはり所長の高年齢化、いわゆる加齢(今年から後期高齢者)によるということは残念ながら否定できない。年は取りたくないがこればっかりは皆に平等に訪れるので文句を言ってみても始まらない。

 実はそれだけではない。2月に記事をアップしたあと、いくつか事件があってブログへの意欲がさらに落ちた。それは、恒例のスキー合宿のことである。年と共に年間の滑降日数が減っているが、昨シーズンはたまたま一回も行けず、今年3月始めの八方尾根のスキーは2年ぶりだった。

 これが、もうシーズンの終わりに近く、しかもウイークデイだったため、コースの整地が行き届いておらず、こぶだらけのバーンの急坂(八方リーゼンスラロームコースの薄葉のカベ)で、疲労で足が言うことを聞かなくなってしまったのである。

 いつもシーズン最初の滑りでは足の疲労で激しい痛みに見舞われることがあったのだが、今回は2シーズンぶりで、しかも、このコースは途中から緩斜面の初心者コースに逃げることができない。コース上で立ち往生し、生まれて初めてスノーボートのお世話になった。これまでちょっとした足自慢だったのだが、すっかり自信を失った。
Img_0548

  • Img_0544 Img_0546

 悪いことは重なるもので、次の日、大雨でスキーをやめスキー場近くの秘境集落(青鬼集落)に遊びに行く途中の山道で、ころがってきたコブシ大の石を跳ね上げ、ミッションオイルのタンクからの油漏れで車が運転不能になった。結局、一行はバスで帰る羽目に陥った。

 直接、電子工作とは関係ないが、度重なる不運である。幸い、修理代やレッカー代、帰りの交通費などは保険が効いたので、経済的な損失はだいぶ免れたが、立て続けの災難に、気持ちの上ですっかり落ちこんでしまい、まとまったことをする気がなくなってしまった。

旧友からブログ再開の催促(2019/6/20)
 それがどうして再開する気になったか、スキーのあと、電子工作を全くやらなかったわけではない。何度か記事を書くために作業メモをワープロに残してはいたが、たいした成果も生まれず記事にまとめるところまで行かなかった。

 こういうものは、一旦、流れの方向を失うと立ち直りが難しくなる。時間が経てば経つほどそうだ。このブログも、もうこれでおしまいかと考えていた矢先、旧友からメールが入った。楽しみにしているのに音沙汰がないが、どうかしたのかという問い合わせである。読者から、しかも知人からの意外な消息の問い合わせは嬉しいものだ。

 これでやっとブログを再開する意欲がわいた。ちょうど、ジャイロセンサーを応用した倒立振り子のウェブの試作記事が面白くて、自分も作りたくなり、少しづつ倒立振り子を作り始めた。完成したらブログを書こうと思っていたのだが、これがまた難儀したのである。

 ただ、うまく行かないとなると、猛烈に何とかしてやろうという気分に陥るいつもの性格が幸いした。結局のところ自作の倒立振り子は、今日現在、まだ立たせることに成功していないのだが、ブログ再開には十分な作業記録もまとまった。記事にするまで、さらにまた2ヵ月ほどかかったことになるが、その間の試行錯誤の記録を公開する(9/15/2019)。
 
名古屋での大学同期の同窓会(3/25/2019)
 電子工作の話の前に、それ以外のことを、書き留めてきたメモを元に少しご紹介。このブログは日記の代わりを兼ねているので、記録の糸を切らさないために暫くご辛抱いただきたい。まずは、3月に名古屋で行われた大学の同期会の話である。

 名古屋は、家族の関係で、このところ行く機会が増えており、また名古屋かと少し迷ったが、名古屋は京浜地区と阪神地区の中間にあたり、関西の連中が久しぶりにたくさん来るというので出席する気になった。

 大学の同期会というのは、若いうちは苦手だった。大学の同窓生は、高校と違い同業者が多いので、現役の頃は、何かと緊張して遠慮することが多い。自分がどうということではない。まわりに気を遣うのである。

  Dsc01730
Dsc01699Dsc01728Dsc01709

 大きな会社だと同期が何人も就職している。何十年か経つとおのずと身分に大きな差が生じる。当人たちはさほど気にしているようには見えないが、同級生同士で余りに違いすぎると、かえってまわりが緊張する。

 かたや重役クラスと、研究所の主任研究員あたりとは、話す内容も全く違ってくるし、学生の頃はどちらかというと主任研究員の方が羽振りが良かっただけに、余計に気を遣ってしまう。

 しかし、最近は、卒業してもう50年近くが経ち、殆どの者は、すっかり引退しているので気が楽である。ホテルでの飲み会では、それぞれ近況報告があった。数十年ぶりの再会もあり、話がはずむ。仕事の話はもう殆どなく趣味などの個人的な話が多い。結構面白くて時間を忘れる。

 次の日は、名古屋観光である。熱田神宮と、名古屋城、トヨタ博物館などをみんなで貸し切りバスを利用して訪問した。幸い、始めて行くところが多く、飽きなかった。昼食は名物の「ひつまぶし」。昔から同じというが20年前に食べたものとは少し違うような。

 印象に残ったのは、名古屋城のボランティアのガイドさんたちだった。バスガイドのOGや、会社を息子に譲って引退した旅行代理店の白髪の元社長が、嬉々として案内してくれる。同年代の頑張りについ感動してしまった。やはり人のお役に立つのがいちばん嬉しい。

タッチボタン式ベッドスタンドの改修(5/2/2019)
 工作の話である。家族が使っていた、筐体を触るだけで点灯するスタンドが時々誤動作するようになった。暗闇でも点けられ便利なのだが、勝手に電源が入ってしまうのは危険である。捨てるというので引き取った。Dsc01745

 台座の部分を分解して中身を取り出した。円盤型の台座の中にはタッチ機能一式の入った小さなプラスティックケースが固定もされずに入っているだけの極く簡単な構造である。タッチ機能は、台座、フレキシケーブル、笠などの金属部分を触るたびに、クリプトン球の照明が、小、中、大、オフに切り替わるという仕掛けだ。Dsc01753 Dsc01754 Dsc01757

 簡単なロジックなので、作り直すなら静電センサーと、SSR(ソリッドステートリレー)にTiny13あたりの極く小さな8ビットマイコンの組み合わせで作れる。しかし、何となく気が進まない。これが電子工作低調の原因なのだが、今までに同じようなことを沢山やってきたので、いわゆる「わくわく」感がないのだ。

 もともとタッチ機能は便利なようで、ちょっと触っただけで、切れたり点いたりするのは自分ではあまり便利だとは思っていなかった。たまに、家人から借りて使って、触れるたびに明るさが変わるので煩わしかった記憶がある。

 どうしたものかと思案していると、塗装された台座の表部分に、タッチを確実にするための金属面のメクラ蓋がつけられているのに気が付いた。タッチセンサーはここをセンサー部の入力としている。この穴に単なるオルタネートのプッシュスイッチをつけて電源スイッチにすればどうだろうか。もっとも簡単な修理法だ。

 久しぶりに秋葉原にでかけ、スイッチの種類の多い千石通商で、良さそうなタクトスイッチ(径6.5ミリ)を見つけてきた。工作は、造作もない。めくら蓋の穴をリーマーで少し広げ、スイッチを取り付けて数か所のハンダ付けをするだけである。

 組み上げてみる。見映えも悪くない。スイッチの押し心地は、台座に重量があるので安定感があり安物のタクトスイッチでも感触は悪くない。現用のベッドスタンドにすることにした。

 リハビリの電子工作としては、全く物足らない作業量だったが、それでも何かを自分の手で解決したという満足感は十分味わえた。

囲碁ソフトに翻弄される。何とか2段(6/15/2019)
 久しぶりに「天頂の囲碁7」という囲碁ソフトを買った。所長は10年近く前に、北朝鮮製の「銀星5」というソフトを試したことがある。これはアマ2段という触れ込みだったが、精々が2級程度で、所長は最後は3目置かせて良い勝負だった。

 今度のソフトはそれとは比べ物にならないほど強そうだ。このソフトを買うきっかけとなった碁仲間によると、全く歯が立たないという。彼はアマ6段の高段者でプライドがあるので最強のままでランクを落としていないそうだが、それにしても市販クラスの囲碁ソフトがそんなに強くなったとは信じがたい。

 注文してほどなくアマゾンから品物が届いた。19路盤は時間がかかるので、13路盤でやってみる。これが強いのである。コンピューターのレベルを初段にしたのだが、何度やっても勝てない。こちらにもプライドがあるので、暫く挑戦したが諦めた。ランクを段々下げていくと2級程度で何とか互角になった。

 そのうち、この囲碁ソフトには検討モードといって、お勧めの次の手を教えてくれる機能があることを知った。これを使うと、これが実に簡単に勝てるのだ。自分がいかにまずい手を打っていたかということをいやというほど味合わされる。

 これを暫く繰り返すうち、次第にこの検討モードを使わなくても勝てるようになった。2級クラスでは、打ってくる手は素人で、切れるところはすべて切ってきて、大抵の試合はねじり合いの混戦になり、読みあいに負けてしまう。2級と言えど、手数の計算はコンピューターにかなわない。

 なるべく挑発に乗らずに、じっくり模様を作っていき、ここぞというところで勝負すると相手が投げてくれるようになった。このソフトは先行き15目以上の負けになりそうなときは投了するようだ(投了を拒否して続けて行くと無茶苦茶な手を打ってきて負ける時があるので注意)。

 次第に勝率が上がり、最近は相手が2段でも、ちょうど良い相手になった。所長は自称、初段と言っているので順当な所か。そんなこんなで電子工作の方はさっぱり進まなかった。

ジャイロセンサーの応用、倒立振り子をつくることにする(7/19/2019)
 電子工作再開のきっかけとなったのは倒立振り子を制作する以下のブログサイトである。

  半日で作る倒立振り子

 実験の経過の逐一を、ステップバイステップで丁寧に解説されており、とても面白い(最後はProcessingによるPCでの画像シミュレートまである)。読んでいるうち、段々自分もやりたくなってきた。

 ただ、この記事のジャイロセンサーはアナログのもので、所長はこれを持っておらず、CPUもAVRを使った正規のArduinoで、こちらは、例のESP8266である。この記事をそのまま作っていくことは出来ない。移植が必要である。

 しかし、ウェブで「倒立振り子 MPU6050 ESP8266」のキーワードで探すと、これらを使った倒立振り子の記事が山ほど見つかった。 今度は多すぎて、何を選んでよいか迷ってしまうほどだ。

 MPU6050は、6軸の加速度、ジャイロセンサーで、I2Cがインターフェースになっている。3年程前、Processingを使った飛行モデルの実験に使った。記事が残っている。

 このときは実際のハードの姿勢制御ではなく、PC画面上の飛行機モデルを動かすのが目的だった。ソースコードは、そっくりひとさまの物を拝借し、PC画面に飛行機をだそうとしたがうまく行かない。

 つながらないのは、現用のビデオカードが、Proscessingのビデオエンジンをサポートしていないことが原因とわかり、新しいビデオカードを購入したりして大騒ぎして、やっとのことで動かした。結局、ジャイロセンサーの動きを確認するだけに精力を使い果たし、実際の応用まで行かなかった。

 実物の姿勢制御にジャイロセンサーを使うのは、今回が初めてである。モーターなどのメカ部分と、センサーからのデータで如何にモーターを制御するか、ソフトのロジックだけでなく、メカトロニクスとしてはかなり高度な技術が要求される。

 先ほどのサイトの写真を見ていると、モータードライバーは以前、Xbeeを使ったラジコンカーと同じTA7291を使っており、とりあえず、これは、そのまま流用して先に進むことにした。

TA7291Pはやはり4.5V以上が必要か(7/29/2019)
 件のラジコンカーを制作品を積み上げた資料棚から取り出した。このラジコンカーは。タミヤのツインモーターキットを使って、前進と後進だけでなく左右の回転も出来るようになっている。

基板には、今になっては思い出せないトランジスターが6ケも実装されていた。情けないことに、これが何のためにつけられたのか思い出せない。解析の結果、モーター電圧(4.5V)とXbeeのVcc、3.3Vの間のバッファーと断定した(自分で作ったものなのに確信がない。まあ、8年も前のことだけど)。

ところがテストしてみると、TA7291は、リチウム電池の4.1V近辺では動かないのである。データシートを見るとロジック電圧は4.5V以上とある。しかし、ネットのなかでは、Arduinoの3.3Vでも動かしている例がある。どうもおかしい。もう一度やってみたら、今度はちゃんと動いた。Dsc01770

ちょっとパワーが足らないような気がするが、まずは動けば良い(このトラブルは、その後、PWM制御入力ピンのハンダ付け不良が発見されて無事解決した。つまりゲイン最小になっていた)。もし、これで動かなければ、こちらにはDRV8835という強力なモータードライバーがある。

あらためて新しいハードを作るのでなく、このラジコンカーを立てて使い、上にジャイロセンサーや、ESP8266をつけるサブシャーシーをつけることにした。あれこれ実装の方法を考える。

18650電池フォルダーをホットボンドでつけて倒立振り子のハード完成(7/30/2019)
 結局、既存のリモコンカーのシャーシー(といっても秋月C基板)に、フロッピーケースのコーナーを切り取ったL字アングルをつける。このフロッピーケースを応用する方法は、これまでいろいろな所で使っているので手慣れたものである。Dsc01769

 電池は容量の大きい、リチウム充電池18650を使い、Aitendoで手に入れた18650用の電池ケースをホットボンドでメインシャーシーにつける。重心が問題だ。倒立振り子の安定は、重心が上にあればあるほど安定するはずだが、そのことはどの記事にも明記されていない(昔、雨傘を立てて遊んだ記憶にもとづく)。よくわからないが、とりあえず、電池はサブシャーシーとモーターの中間に
つけた。
 
 やっつけだが、一応、定番の倒立振り子風の形が完成した。タイヤが他のウェブサイトの作品のように大型のものにするか迷っている。 テストのため、簡単なスケッチを書いて、TA7291Pモーター基板とESP8266でモーターをリモコンで回すところまで確認した。

ESP8266基板にMPU6050を実装した。出てくる数値がおかしい(8/3/2019)
 駆動部のハードの目途が立ったので、MPU6050の実装に取り掛かる。これは結局ESP8266基板の空き地に単にピンヘッダーを立てるだけでつけてしまった。ジャイロなので本当はもっとしっかりつける必要があると思うが、まずはこれでいこう。

 次はいよいよソフトだ。これが実はくだらないところで大はまりした。 長期間、開発から離れているとどうもカンが働かないからだろうか。横道に何度もはまり込んで、ウンウンうなっていた。まあ、これが面白いということもあるが、全部を書き出しているときりがないので、はまった落とし穴の主なものだけ、以下にまとめておく。

 まず(1)、Arduinoのintって、unsigned なの? 
 MPU6050の出力データをテストのためUARTに連続して数値を出力していた時である。ジャイロの角度の数値がマイナスに振れないのである。MPU6050の各データは、符号付き16ビットで、8ビットづつのレジスターから値をシフトしてintで定義した変数に収容している。

 これが、マイナスになっていない。8ビットデータ(上位データ)は、符号なし(uint8_t)でとっても、intに入れると符号付でマイナスになるはずなのだが、そうなっていない。ひとつひとつ、データをSerial.print()でしらみつぶしに出力させて確かめた。

 その結果、intタイプの変数に入れたとき、MSBビットをマイナスにみなしていないということがはっきりした。そんな馬鹿な。 Arduinoでもデータタイプのintは、符号付(signed )のはずなのにおかしい。

 半信半疑で、データタイプのintを int16_tにしてみたら、何とちゃんとマイナスが出た。えー、そんなー、信じられない。Arduinoでは、intは符号なし(unsigned)なのか。何かの具合で、データタイプがおかしくなっている。この真相究明に数日を無駄にした。何か間違っているのだろうか(どこかで#defineされている?)。

 次は(2)、ビルドしたプログラムがsoft WDTエラーで先に行かない
 ソースコードは、ここを参考にさせてもらった。ここは、MPU6050とTA7291を使っており、姿勢制御の部分がそのまま使えそうだったからである。ただし、CPUはPICなので、ESP8266のArduinoに書き換える必要がある。

 このあたりの移植は所長にとっては難しい仕事ではない(何十年もやってきた)。タイマーの部分や、割り込みの処理をかえる必要があるが、これらは、すべて調査済みである。(ESP8266のタイマー割り込みは、通常のArduinoの
MsTimer2::set(mill-sec, TimeProc);
MsTimer2::start();

ではなく、
#define MSEC2CLOCK(ms) (ms * 80000L) //ESP8266内部クロック換算。
timer0_isr_init(); // 割り込みルーチンの初期化
timer0_attachInterrupt(timer0_ISR); //割り込みベクトルに登録
timer0_write(ESP.getCycleCount() + MSEC2CLOCK( 100 )); // 100msごと
などを使う。)

 意気揚々と、ESP8266用のコードに書き換え、コンパイルした。順当にコンパイルは通った。モータードライバーはつけずに、出力をデバッグUARTに出させて、まずはテストである。

 ところが、これが全く動かないのである。ウェブで原因を探すが、ハードがおかしいとか、ユーザーループが長すぎるとか、不安定な電源だとか、どうもピントがずれている。PICからの移植だが、機種依存になるようなものは何もやっていない。

 ただ、floatなどの4バイトデータが非常に多いので、SRAMあたりのヒープデータを食ってしまっている感じだ。ユーザープログラムがスタートする前に、メモリ破壊が起きている感じである。

 さらに(3)実行時エラーで、新版のArduinoIDEを試すも、今度はファームが書き込めない
 というので、Arduino IDEそのものを新しい版に換えてみることにした。今使っているIDEは、数年前におとした1.6.12で、最近は1.8.21まで上がっている。

 ところが悪いことは重なるもので、こいつは、ファームを書き込むesptoolがUARTを認識せず、プログラムそのものを焼くことすらできない。なにか散々な目にあっている。やれやれ、このあたりで原因を究明する気力を失った。

 仕方がないので、IDEは1.6.12まで戻り、別のソースコードで作り直すことにした。

 ここは、MPU6050からのデータを取り出して、相補フィルターで出てきたデータの補正をしているところまであったのでこれを参考にすることにした。

 不思議なことに、最初のソースコードに、このコードを組み込んでみると、WDTのエラーは解消したのである。モーターにはつないでいないが、MPU6050の測定値がシリアルコンソールに派手に出始めたのである。いやいや、理屈はわからないが、プロジェクトは一歩前進した。このあと実際にESP8266の出力ピンからモーターをドライブする段階に入れる。Dsc01772

やっと動く所まで漕ぎつけたが、暴れるだけ(9/19/2019)
 倒立振り子が出来たら、ブログを半年ぶりに更新しようと目論んでいたが、いつまでたっても倒立がうまくいかないのであせっている。タイヤをかえたり、PID制御のパラメーターを変えても、細かいモーターの動きが実現せず、暴れるだけである。

 モーターが「ミー」と弱い音を立てるだけで動かないので、PWM値を上げて、モーターの出力を増やすと、今度は、回りすぎて車体が激しく振動し、倒立するどころではない。

 そのうち、頼まれた研修講師の期日がせまり、その準備でそれどころではなくなった。暫く、工作室に降りない日が続く。それでも日を置くと、物事を外から見ることになり、トラブルがわかってくることがある。それなりの解決法は何となく見えてきたが、ブログの記事もかなり多くなったのでこのあたりで一区切りつけることにする。

| | コメント (8)

2018年10月 2日 (火)

ESP8266のJJY電波時計のスケッチ公開

 これまで作っていたESP8266を使ったJJY電波リピーターと電波時計受信機のうち、受信機の方が何とか安定して時刻を知らせるようになった。とりあえずこちらを先に、ソースコードと回路図を公開することにする。

 電波時計は長時間動かすものだから、本来はESP8266のような大喰いのWiFiモジュールで作るのは筋違いだが、WiFi環境が必要な電波リピーターにESP8266を使ったので、開発環境を共通にしたかったのと、気楽に始めたのにうまく動かず、止めるに止められなくなったせいでもある。

 前にも書いたが、JJYの受信パルスは1秒に一回の超低速通信(1bps)である。クロック80MHzのESP8266なら沢山のロジックを組み込んで、相当インテリジェントなエラー修正が出来ると意気込んで始めたのだが、これがとんでもなく難関で、ほんの少しでもノイズが出るような受信環境では全く正しくデコードができない。Dsc01493

 リピーターのコイルから数十センチも離すと、受信モジュールが正規の福島(おおたかどやま)からの電波も受け始めて干渉を起こすらしく、年月日などに目茶目茶な数字を出し始めて全く話にならない。出来ないとなると、むらむらと反抗心が出てきて何とかしてやろうと、いつもの悪い癖が出る。

 この3週間、半分泣きべそをかきながら、意地になってデバッグに熱中していた。その結果、何とか市販の電波時計程度の信頼性のある時計になったので、Arduinoのスケッチソースリストと、回路図を公開することにする。どれだけ迷走したか。詳しくはこれ以降の作業記録で。

やっぱり日本の女子は強い(9/9/2018)

 その前に、ちょっと電子工作とは違う話題を少し。プロテニスの話である。手が届きそうで届かなかったテニス4大大会(グランドスラム)の日本人の優勝は、天真爛漫なあの「大坂なおみ」があっさり全米で達成してしまった。

 4年前の錦織の全米準優勝も驚いたが、今度はもっとすごい。勝ち方が豪快である。彼女のことだったら、本当のグランドスラム(1年間に、全米、全豪、全仏、全英すべてに優勝)をやってのけるかもしれない。

 錦織のときにも同じことを書いたが、野球はアメリカと日本でしか騒がないのに対し、テニスは全世界が対象である。しかも、サッカーは庶民が中心だが、テニスはセレブのスポーツファンを巻き込む。ウィンブルドンの観客の平均年収は2000万円という話を聞いたこともある。世界に与える影響は、野球の比ではない。

 ちょっと気になるのが、彼女の出自の問題だ。今、世界は、水面下では色々あっても建前上は人種の区別をしないことに極度に神経質になっている。それなのに日本のマスコミが彼女の帰国会見で、実に無神経な質問をしたのには驚いた(あなたは何人?)。

 こういう話は、すぐに世界中にひろまる(マスコミの浅はかさは世界共通)。世界から日本が馬鹿にされるのは身から出た錆でしようがないけれど、大坂選手が日本に愛想をつかしてアメリカ国籍に換わってしまわないことを祈るばかりである。Dsc01485

I2C液晶を2台とも4本の結線だけで動かす(9/10/2018)
 電子工作の話に戻ろう。Aitendoで入手した2台のI2C液晶の始末である。このうち一台は電源を逆接してしまい、破損が心配されたが、幸運にも壊れていなかった。バックライト付きだから今のところACアダプターのついた電波時計に使う予定である。

 インターフェースはI2Cだが、液晶の本体は12本のピンが出ており、内部で使うコンデンサーや、I2C/SPIの識別をする制御線などの追加の配線が必要である。工作のついでに、2つの液晶がいつでも使えるようチップコンデンサーなどを使って整備しておくことにした。

 このままでは、ブレッドボードに配線を加える必要があり、特にひとつは動作テストを急いだため、ジャンパーコードやコンデンサーを空中でハンダ付けする完全なバラック状態になっている。なお、このコンデンサーは省略することが出来ない。はずすと簡単に動かなくなる。Dsc01494

 久しぶりに秋月にでかけ(このところはAitendoが多かった)、1μFのチップセラコンを入手した。相変わらず、ここはいつも賑わっている。帰って早速チップセラコン(2012)の空中配線を楽しむ。I2Cだけだとピンヘッダーは4 本ですむのだが、4本だとやや強度に不安が出る。

 課題が残った。液晶とバックライトの発光面との接着である。両面テープで貼るのは手軽で良いが、蛍光面にテープが見えて見栄えが悪い。それと時計の表示装置にするのならバックライトなしの液晶の方が消費電力が少なくて済む。また買いに行かなければ。

JJY電波リピーターのバグを解消した(9/14/2018)

 電波時計の前にやることが残っている。JJY電波リピーターの不具合である。リピーターはNTPから時刻を貰っているので正確無比のはずなのだが、長時間動かすと、何故か分単位で遅れることがある。

 NTPや、WiFiが原因であることは考えにくいので、すべてこちらが悪いのだが、原因が思い当たらない。NTPの正時(0秒)を待ってパルスシーケンスを始めるのだが、パルスシーケンスは59 秒間の最後がポジションマーカーパルスで0.2秒、この残りの0.8秒で次のNTP時刻が変わるのを待って同期させるロジックである。

 たとえ遅れたとしても、秒単位の遅れのはずなのにパルスシーケンスは、1分以上の時刻遅れを表示する。しかも、エラーは長時間のときにたまに発生するだけで、普通は全く問題ない。

 長時間(2時間以上)コンソールにメッセージを記録し続けてやっと原因がわかった。何と本来は59.2秒で終わるはずなのに、59秒より早く送り終えるところが見つかった。ロジックは59とか0などの絶対値ではなく、NTPで得た秒データの変化をトリガーにしている。

 このままだと59秒の時に、そのときの「分」データを得てそれを新しい時刻の「分」にするので結果として1分遅れることになる。なぜ早くなるのかの原因は全く見当がつかない。どうしようか。

 迷ったけれど、対症療法で、NTPの秒データが00になるまでべたに待つことにした。CPUは回りっぱなしで精神衛生上あまり愉快ではないが背に腹は代えられない。幸いなことにこの修正後は全く問題なく動いている。

焦電型人感センサーを更新(9/15/2018)
  さらに道草を食っている。階段の照明の入り切りに使っていた焦電型人感センサーが何となく感度が悪くなり、階段の前でパントマイムをやらされることが増えてきた(動きがあると反応する)。

 人感センサーについては、実は、一年前、秋月で偶然これを見つけて買ってある。以前、千石で買おうと思った赤外線センサーNapionの改良形のようだ、値段は半分以下の¥480だった。テストしただけで、部品箱に眠っている。Dsc01496

 階段の上での身振り手振りが、段々煩わしくなったきたので、これに更新することにした。久しぶりの汎用基板でのハンダ付けが楽しい。UEW線を持ち出さずに、すべてのパーツのリード線を活用し配線する。

 作り替えたのはセンサー部だけで、電源の入り切りなどの制御ユニットはこれまでのものを流用する。何事もなく完成した。ちょっと物足らなかったが、出来上がりには満足である。今度のセンサーはやたら高感度で、階段に近づくだけで反応する。

 考えてみたら、最初のセンサーを作ったのは、もう6年も前のことだった。まあ、6年も使ったのだがら減価償却はできているだろう。Dsc01495

エラー回復ロジックをつけた電波時計ロジックの工夫(9/20/2018)
 電波時計の開発にぐずぐずしているのは理由がある。今回のプロジェクトの本筋は、JJY電波リピーターで、電波時計は単なるテスト環境のつもりだった。我が家にある市販の電波時計は、腕時計、目覚まし、掛け時計とあらゆる種類が整い、今さら電波時計を自作する必要性はない。

 それなのに電波時計の方に夢中になっているのは一種の逃避である。電波リピーターはハードの要素が大きい。しかもハードと言っても電波という高周波の世界である。所長の高周波の知識は、60年近く昔の少年時代から一歩も進んでいない。大学時代の知識は超絶的な理論ベースで、実践には見事なほど役に立たない(自分であきれるばかり)。

 何となくハードを避け、自分の得意なソフトにこだわりたくなる潜在意識があるようだ。電波時計のハードは、いじるところがないが(受信モジュールには手が出せない)、ソフトには改良の大きな余地があるような期待がある。

 JJYの標準電波のロジックは簡単な構造である。一秒に一回の立ち上がりパルスのタイミングが、その時の正確な秒を示し、そのあとのパルス幅でコードが決定する(0.5秒が1、0.8秒が0)。10秒に一回、マーカーパルス(0.2秒)が出て、次のフレームへ進む。

 さらに1分に一回、このマーカーパルスが冒頭に出て正時(0秒)を定義する。6つのフレームは、時分、月日、西暦、曜日などに分かれ、時分については第4フレームにパリティビットがついて誤り検知が出来るようになっている。Dsc01488

 この連続マーカーパルスさえ正しく検知できれば、データが途中乱れても相当なエラー回復が可能である。いわゆるフレーム同期というやつで、月日、西暦などのデータは数多く重複するので、フレーム単位にデータを貯めておけば、大きな狂いを防ぐことも出来る。

 こうしたことを頭に入れて、オシロでJJY受信モジュールの出力波形をつぶさに観察すると、ノイズはパルスの立ち上がりや立下りでチャタリング風に出る短いパルスが多く、パルスの真ん中を分断することは少ない。チャタリング抑止のロジックを入れればだいぶエラーを減らせそうだ。

 さらに、パルス巾の認定にも工夫をした。参考にさせて貰ったソースリストでは、パルス巾の有効範囲がひどく狭く、それ以外をエラーにしている。このため、ちょっとノイズが出始めると、エラービットばかりになって話にならない。

 考えてみれば、パルス巾は、0.2、0.5、0.8秒以外はないので(15分、45分に出るモールス信号列を除けば)、中間値をすべてエラーにするのはおかしい。少々強引だが、ここではエラーの範囲をなくし、適当な区切りですべてを何らかの有効データとみなして後で調整することにした。

思いつくエラー修正を片っ端から盛り込むも迷走(9/23/2018)
 さらに、次のようなフレーム単位の修正ロジックを入れて、実験を開始した。測定では正式のJJY標準電波は、PCルームではノイズだらけで全くデコード不能になるので、主にNTPを使った電波リピーターの出力をソースにする。それでも正規のJJY電波と干渉するせいか少し離すとノイズが出る。

●正時(0秒)と正時の間のフレーム数が、6つ以外はエラーとしこの間のデータは捨てる
●マーカーとマーカーの間のパルス数が規定以外(9ビット)ではエラーとし、このフレームのデータを無効とする。

 しかし、この程度では少し波形がノイズっぽくなってくると、データが全く有効ではなくなり、表示は目茶目茶になる。特に致命的なのが、正時を判断する連続ポジションマーカーの取りこぼしで、たとえそのあとのフレームを正しく受信していても、西暦などもとんでもない数字に変わってしまう。

そこでさらに、
●キャッシュにデータを蓄えておいて、1分間正しくデータ(6フレーム、9ビット)を拾ったとき  にのみ始めて、そのときの時分、年月日を表示する。
●10秒ごとのフレーム単位に 有効/無効フラグを設定し、年月日のデータは使いまわしをする。

 などのデータ保全を狙った改善を行った。だいぶん精度が高くなった半面、正しい時刻に戻るのに時間がかかるうえ、時々、月日や西暦が出鱈目になる不具合は改善されない。エラーの程度を定量的に把握することが難しく何が効果があるのかわからないので泥沼状態である。

 試しに正式なJJYの受信できる場所で動かしてみる。電波が安定しているときは良いが、やっぱり、少しノイズが出始めてエラーになったら全くダメダメで、なかなか回復しない。既に正しく受信できているはずの西暦や、月日も目茶目茶になってしまう。

別の不具合が落着。やっと日にち違いの原因が究明された(9/25/2018)
 それでも受信エラーが僅かなうちは修正が効き、リピーターに近づけている限り、正しい時刻を表示するようになってきた。JJY標準電波の方も場所を選べば安定して受信できる。しかし、受信機にはまだもうひとつ大きな問題が残っている。 Dsc01482

 実際のJJY標準電波を受信すると受信機の日付が一日先になるのだ。リピーターから受信していれば合っているのに、標準で一日ずれるのは、要するにリピーターが出すパルスシーケンスがずれていることを示すが、リピーターが表示している日付とパルスシーケンスは全く同じリソースからとっており、ここで誤りが起きるのは不可思議としか言いようがない。

 例の辻褄合わせで直した「とがめ」が出ている感じがする。今度も閏年を疑って再度テストステートメントを挿入して確かめるが、問題はない。そこで少しづつ、printfを入れ込んで犯人を追跡していった。その結果、電波時計の方が帳尻合わせをしているようで、犯人はリピーター臭い。

 ビットの送り込みや、UNIX経過秒なども調べるが問題なし。さんざん調べまわった結果、やっと原因がわかった。NTPの通算日データが0オリジンだったというオチである(JJYは1オリジン)。NTPでは通算日と月日の両方のデータが独立して取れるようになっており、これが発見を遅らせた。

 奥歯に物がはさまったように気になっていたJJYリピーターと電波時計の一日の狂いが遂に究明された。最近は物忘れが激しく、つい10年も経たない職場の同僚の名前を思い出せなくて数日悩むことがあるが、それに匹敵する「もやもや感」が解消され、気分が良い。

もう一歩踏み込んでエラー補正。何とか及第か(9/27/2018)
 市販の電波時計が受信できるところでは、殆どエラーなしに受信ができるようになってきた。ただ、一分ごととフレーム毎のエラーチェックを厳密にしているはずなのに、まだ年月日が、ときどきインチキになるときがある。

 これがなぜ起きるのか、調べているうちに、この現象は偶にではなくしょっちゅう起こりうる現象であることがわかった。つまり誤ったポジションマーカーを途中で拾うと本来入るべきフレームではないところに別のデータが送り込まれる。

 当然、そのフレームはエラーになるが、次のフレームは0から始まるのでビット数が合ってそのフレームが有効になってしまうのだ。このフレームは所定の場所ではないので、データはでたらめになるというわけである。これを避けるには、正時から積算しているシステム内の秒数とフレーム数の照合をする必要がある。

 生の秒数と、フレーム番号を比較するのは少し抵抗があったのだが、この秒数は、連続したポジションマーカーの時、0に戻しているので信頼性は高い。やってみると、この効果は絶大で、年月日はまずどんなことがあっても変化しなくなった。やっと電波時計らしくなった。

 さらに、一度、正確に手に入れたデータはUNIX経過秒の形で残し、1分後のデータに不安がある時は、これを更新せず、前の経過秒に秒数を足す形で表示を守る。この秒数は、ArduinoIDEのタイムスタンプmillis()まで動員した。ちょっと禁じ手に近い技だが、理論上は、とりあえずは電波が受信できない状態でも時間は守れる。

JJY電波時計のESP8266用スケッチソースコードの公開(9/30/2018)
 居間に持ち込んでフィールドテストを続ける。本来のJJY電波の到達するところは殆どエラーなしで順調である。たまに数分遅れる時があるが、すぐに復帰する。これを避けるのは、電波時計の中にRTC(リアルタイマークロック)を入れれば完全に解決するが、元はと言えば、電波リピーターのテスト環境のつもりで開発してきたので、そこまでやる気はない。

 消費電流の多いESP8266とバックライト付きの液晶を使った電波時計だが、何かの参考になるかと思い。ここに回路図と一緒にスケッチソースコードを公開することにする。参考にさせていただいたソースコードはここである。復号のところは大いに参考にさせてもらった。あらためて御礼申し上げたい。Jjyclock

 回路について少し説明をしておくと、JJY受信モジュールはAitendoの古い40/60Khz受信モジュールで、もう販売しておらず、今は新しい受信モジュールになっているが、所定のところにつなげば(GPIOへは新しいモジュールのTNというネガティブ信号入力)、問題なく動くと思われる。

 受信モジュールとESP8266のGPIOとの間にトランジスター(2SA1015)が入っているが、これは、受信モジュールが負論理(0がデータ受信)の逆転をするためと、受信モジュールと直接ESP8266とつないだときの高周波ノイズを避けるためである(以前オシロにプローブをあてると誤動作した)。

 液晶の表示は、上段が年月日と時分、下段は、秒数とフレームの処理推移のプログレッシブバーもどき、さらに頭に正式なJJYからではなく推定の時には「X」マークが出る。

以下に、zipファイルでかためたスケッチソースファイルのフォルダーと、BSCH3Vの回路図ファイルを置きます。

「JJYradioClock.zip」をダウンロード


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

2018年9月 9日 (日)

ESP8266による電波時計リピーターの完成

 今年の8月は例年にない猛暑だった。観測史上初めてという猛暑日(35度以上)数の記録が各地で相次いだ。ここ東京も例外ではなく、月後半には猛烈な雷の夕立が連続したりして、何か日本が亜熱帯気候地帯に変わってしまったかのような不気味さを覚える。

 電子工作は相変わらずである。暑さでアスレチックジムのヨガを欠席することが増えて工作の時間はむしろ増えているのだが(何しろ老人は不要不急の外出はするなと脅されている)、集中が効かなくなっている。昔に比べれば間違いなく進行の速度が落ちている。

 ESP8266を使いまわして、AitendoのJJY標準電波受信モジュールを使った自作電波時計や、オシレーターチップ(LTC1799)を使ってJJY電波にNTP時刻を載せるリピーターを大分前から作っているのだが、どうも埒(らち)が明かない。記事の更新間隔もまた一か月を越えてしまった。

 まあそれでも、あれこれいじくりまわして、やっとそれらしい動きを双方がするようになってきたので、ここらでご報告することにする。このままずるずるブログの更新が出来ないでいると、電子工作に対する意欲そのものを失う心配があるからだ。

自前で作ったUNIX経過秒のお粗末(8/9/2018) 

 前回記事のコメント通り、自前のUNIX経過秒とNTP時刻との1日のずれは、Shuji009さんの指摘であっさり解決した。何と閏年の計算違い(バグとも言う)というお粗末である。Ws000008

 以前、JSTの指定をしたのにNTPからの時刻に9時間の差が出てしまい、面倒なので9時間足して辻褄あわせをしたことがあるが、今度も自前で計算した日時(1970年1月1日からの経過秒)とNTPの経過秒が合わない。時差のずれではないので少し気になったが、これも無精して1日足して帳尻を合わせた。

 それが記事をアップしたあと、Shuji009さんからコメントが入った。2000年は400で割り切れる年で閏年ですけど大丈夫ですかというご指摘である。閏年のロジックは、「4で割り切れる年は閏年。ただし、100で割り切れる時は平年。さらに400で割り切れると再び閏年」という結構ややこしいロジックである。

 はいはい、ちゃんと400で割り切れるロジックも入っていますよと、最初は自信満々だったが、何か胸騒ぎがした。待てよ、400で割り切れるときに、平年に戻していないかい。言葉にすると400で割り切れる時は、100でも割り切れるので、そんなことは考えられないが...

 あわててソースリストを出して見る。「がーん」、400で割り切れるときは平年にしている!こいつだ。せっかく400年のロジックを入れたのに逆さまでは何にもならない。これでは一日遅れるのは当然だ。 

 自作の閏年を決める関数、leapyear( )のロジックを修正する。勿論、簡単に解決した(添付画面は修正済み)。考えてみたら、UNIXの経過秒は、1970/1/1からの計算だから、時差とは関係ない。プログラムミスの疑いを持つべきだった。こういうことにあとから気づくのだから、どうしようもない。

パラレルキャラクタLCDもお粗末なトラブル(8/15/2018)
 気になっていたパラレルのキャラクターLCDが動くようになった。Arduinoの標準ライブラリ(LiguidCrystal.h)では動かず、ESP8266ではだめなのかも、と放置してあったのだが、その後ウェブ上で新しいライブラリーが見つかったのでこれを試すことにした。

 LCDのテストに使っていたNTP時刻をUARTに出力するプログラムに、前のライブラリを退避させて新しく組み込む。しかし、こいつも最初は動かなかった。このパラレルLCDは当初3.3V仕様であることを忘れ、不要なバックライトの負電圧回路を組み込んだり、バックライト配線が別にあることに気づくのが遅れたり散々苦労しているのだが、今度も駄目かとがっくり落ち込む。

 こういうときは腰を据えて、落ち着くことだ。基本に立ち返ってハードウエアの配線からチェックしなおした。おやあ、コントラストを決める端子が未配線だけれど、これに電圧をかけなくても良いの?いや、そりゃ駄目でしょう。

 そうか、こいつが原因に違いない。あわててブレークアウト基板に、半固定抵抗器を実装し、ピンに接続する。電源を入れ起動しなおすと見事LCD画面に「Hello ARDUINO」の初期表示がでた。やれやれ長かったな。コントラストの配線をしていないのでコントラスト最小のまま表示が見えていなかっただけというお粗末である。

Dsc01476

 もしかすると、元の(ArduinoIDEに最初から組み込まれている)LiguidCrystal.hでも動いていたのかも知れない。しかし、他にやらねばならないことが多いので、そこまでさかのぼって確認する気力がもう生まれてこない。さきに進もう。

 NTPの時刻を表示して暫く遊ぶ。書式付きの関数printfがlcdでも動くことを発見した(lcd.printf)。数字の表示位置が固定されるので「:」や「/」がずれず、格段に見やすくなる。ただし、ESP8266では多数の変数を表示しようとすると暴走する(3つまでOKであることは確認)。

較正の仕方がわかってエンコーダーの開発は順調に進む(8/22/2018)

 猛暑が続く。しかし地下室は温度が安定して涼しく、極楽だ。それなのに電子工作の進捗ははかばかしくない。今度のプロジェクトの最終目標は、ESP8266でNTP時刻を使いJJY電波をエンコードするリピーターである。Dsc01478 そのモニター用のこれもESP8266で作ったJJY電波時計の調整に手間取っている。このプログラムはUARTに盛大なテストメッセージが出るので、テストをやりやすくするため、時刻表示をLCDに出そうとしたのだが、LCDそのものの表示がなかなかうまくいかない。

 一方、オシレーターチップLTC1799を使ったリピーターの電波の強度は、もう十分だ。受信機と発信機双方をデスク上に置いた(1m以内)状態で、電波をON/OFFすると電波時計のモニターLEDがはっきり同期して点滅するのを確認している。ただ、送信を止めて暫くすると、受信機は本来のJJY電波を受信するのか乱れたパルスが出始める。

 受信モジュールにはAGC(自動感度制御)がついているようだ。ある程度以上の強度の電波をうけていれば微弱なJJY電波の方はマスクされるが、それが止まると弱い電波でも受信し始める感じだ。実用性を高めるためには、このあたりをもう少し調べておきたい。

 しかし、現在の電波時計プログラムの出力は、PCのコンソールしかなく移動できる場所が限られる。PCからは結構ノイズが出るのでここからも少し離したい。キャラクタLCDに手を付けたのも移動性を高めるためだった。

 とはいえ、こればっかりやっていても先に進まない。そこで、これまで放置していたリピーターのJJY電波エンコーダーの開発に注力することにした。干渉の方はこれが出来てからでも良い。リピーターの実装は、前回記事で紹介した通り、Pythonで書いたソースコードが手本にある。

 あらためてこれを読み込む。おお、これはとても自然なコーディングで好感が持てる。難しいことは全くやっていない、仕様通り、ポジションマーカーパルスで隔てられた10秒単位のデータを送り込んでいる。NTPとの較正のやり方がよくわからなかったのだが、ここでは平明な方法で実装している。

 あらかじめ、NTPで時刻を得たところをマイクロセカンドオーダーのタイムスタンプで記録し、次の正時(0秒)に見合う待ち時間を計算し、その待ち時間を使ってJJYのエンコードシーケンスの関数をスタートさせるというものだ。これで正確な同期が実現する。これはわかりやすい。

それらしい電波時計のシーケンスが出た(8/24/2018)

 同期ロジックがわかったので、急に先が拓けた気分になった。俄然コーディングする意欲が起きて移植に力が入る。Pythonから、Arduinoの言語(C++が基本)に戻すのは、そう難しくない。

 ただ、Pythonは構造化ブロックの識別がインデント(字下げ)だけなので、間違いやすいだろう。書くのは楽だがデバッグに苦労しそうだ(何を隠そう所長はbegin endで構造に厳密なpascal派だ)。

 しばらくコーディングに専念した。なにしろパルス一回当たりで数百msは待つロジックなので、少々のデバッグステートメントは入れ放題である。ArduinoのUART(Serial.printなど)はバッファリングしているらしく、一行出力では数十μsしか遅れないし、lcdでも2行出力が3msしかかからない。

 デバッグのためテンコ盛りにテストメッセージを入れたスケッチが完成した。まだLTC1799オシレーターの出力制御まで配線が済んでいないが、LEDをつけて動きを確かめる。電波時計のLEDブリンクは、このところいやというほどテストしているので、大体の動きは見ているだけでわかる。Dsc01481

 よーし、それらしい点滅が始まった。念のためオシロにもいれて動きを確認する。良いようだ。ブレッドボード上のLTC1799発生回路のロジックICに結線して実際の電波を発射する。ここまで来ると先を急ぎたくなる。ミニブレッドボード2つに組んだJJY電波時計を近くに寄せ、受信テストを開始する。

 良いぞ。電波時計のLEDがLTC1799オシレーターのLEDに合わせて点滅を始めた。問題ない。本来のJJY側の干渉もなく、順調に受信しているようだ。UARTコンソールをもう一台増設し、電波時計側のモニターも開始する。

 いやあ、長いことかかったが、電波時計側も、ノーエラーで時刻を表示し始めた。しかし、少し電波が弱い。1mも離すと、エラーが出始め、大元のJJY電波と干渉が始まってエラーの嵐になる。まだ安定したとは言えない。

 そうは言っても、とにかく目的は果たした。嬉しい。しばらく表示させて様子を見る。うーむ、まだ時間は正確ではないようだ。まず、分の更新が遅れている。それと1分遅い(これは想定済み)。それと、NTPとの同期ではどうも一秒程度遅いようだ。

秒の精度にこだわってみる(8/26/2018)

 ArduinoのNTPはSNTPがベースで、一時間に1回くらいの較正が入っているようである。クライアントのレベル(つまりWiFiの先のESP8266)でも、公式サイトによると0.5ms程度の誤差に止まるという話だが、どうもそれほど正確ではない(このほかここも参照)。

 自宅にある既存の電波時計を持ち込んだり、有線電話の117で調べるが、1秒近くずれている。もっとも市販の2万円以上するNTPリピーターでも誤差は1秒というのが多い。相手が人間である限り、こだわってみても余り意味はないのだが気にはなる。

 同期の方法を、待ち時間方式ではなく、一分単位に最終59秒まで来たら、NTPの時刻取得コマンド now = time(NULL); を10ms間隔で発行し、秒が59から00になるタイミングを待って同期させる方法に換えてみた。これでかなり正確になるはずだが、余り前と変わらない。それでも、分の更新の遅れの修正や(これは単なるコーディングミス)、コンソール出力メッセージの調整(多すぎるデバッグ用メッセージ削除)を進め、段々電波時計らしくなってきた。Dsc01482

 開発が一段落してきたので、昨日、これも久しぶりに御徒町のAitendoを訪れ、ESP8266の予備とアダプター基板、ついでにI2C液晶を数点買い込んだ。土曜ということもあって、いつもながら混雑している。ここのLCDのラインナップはすさまじく多い。I2C液晶のコントローラーチップは殆どが例のST7032のようで、制御ソフトについて神経を遣わないで済むのは嬉しい(Arduinoのライブラリで動く)。

AitendoのI2C液晶ディスプレイで遊ぶ、いや遊ばれている(8/28/2018)

 リピーターや受信機は、ブレッドボードでは動いたが、実装をどうするかで迷っている。すぐにはうまい方法が見当たらないので、とりあえずは、Aitendoで買い込んだI2C液晶のLCDの動作試験をすることにした。ところが、これがまた曲者だったのである。

 沢山のAitendoの液晶群の中から、あらかじめウェブで一番スマートそうな奴を選んで買ったのが、このLCDである。しかし買って帰って良く見ると、ピン幅が、1.8ミリという変態的な間隔で、しかもバックライトの端子が横に不作法に突き出ている。Ws000009

 例のピッチ変換テクニックの荒業を駆使してブレッドボードに装着する。空中配線は予想通りうまく行った。10ピンのハンダ付けはとても頑丈で、ハンダは僅かづつしか付いていないが12本もつけば少々力を入れてもビクともしない。ブレッドボードの抜き差しも全く心配ない。

 このLCDはI2CとSPI両方のインターフェースをサポートしているので、ジャンパー配線や、パスコンを2つも接続しなければならないが、とりあえずはピンだけにしてブレッドボードでこのあたりは配線する。Dsc01483  最終的には、受信機も、リピーターもLCD表示でスタンドアローン化したい。ただ。時計なので電池駆動は無理でACアダプターということになりそうだ。

ST7032のライブラリーが入らない(9/4/2018)
 I2C液晶に対するArduinoの対応は、多種多様な方法があるようで、ウェブ上には、沢山の方法、ライブラリーの紹介があり、何を選んでよいか迷ってしまう。このあたりは、ここのサイトが詳しく紹介されているのでお勧めである。

 今度の液晶のコントローラチップST7032のライブラリーだけでもいくつかあるが、当研究所では、一番簡単そうな、このサイトのライブラリーを選ばせてもらった。

 おや、こちらは標準のライブラリではなく、新たなライブラリST7032.hが必要なようだ。言われるままにリソースをダウンロードし、所定のディレクトリに収容してビルドに入った。しかし「ST7032.hなんて知らないよ」という素っ気ないエラーが返ってきた。

 ふーむ、ウェブの指定では、とってきたリソース(フォルダー)のリネームをすることになっている。そういえば、ArduinoIDEは立ち上げ直していない。一旦、終了して立ち上げ直す。よーし、ビルドのメッセージが先に進んだ。コンパイルしているようだ。

 いやだめだ。ソースリストの中でコンパイルエラーが出ている。ST7032.cppの中でavr/pgmspace.hがないと怒られる。なにー、avrじゃないとだめなのか。手近なところにavrのライブラリーはない。それにここはESP8266だ。暗雲が垂れ込める。

 困ったときのGoogle先生である。ウェブを漁ると出てきた出てきた。いつものエラーメッセージぶっこみ方式である。「ST7032.h avr/pgmspace.h no such file」で一発で、このGitHubがヒットした。ST7032.cppを探し出し、この通りにしたらコンパイルが通った。

 ソフトはOKである。意気揚々と、配線をしてテストを開始する。店が紹介するデータシートは中国語だが、不思議に殆どが理解可能だ。I2Cなので、ピン12本のうち必要なのは4本だけで(Vcc GND SCL SDA)配線が楽だ。それと、I2C/SPIの識別する制御ピンなどを適当につないで実験を開始した。

この液晶もコントラスト不足で最後までてこずる(9/5/2018)
 これがまた全く動かない。ライブラリーを使うのは楽で良いけれど、ソフトが悪いのかハードが悪いのか、このままでは全く見当がつかない。こういうときは処置なしである。そのうち、不具合箇所の切り分けに良い方法を見つけた。

 I2C液晶は、ストロベリーリナックスの昔のPCMプレーヤーに使った現物がブレッドボード上に残っている。これを流用して動かしてみればどちらが悪いかすぐわかる。早速試す。え、いやこれも動かない。何だと―、ソフトが悪いのか。

 ウェブ上で紹介されているソースリストをもう一度良く見る(これしか頼りにならない)。コンストラクターでlcdオブジェクトを作って(ST7032 lcd;など)、次のステップがいきなりlcd.clear()などのステートメントだ。これ何か足らないような。例えば、lcd.begin(16,2)なんて初期化はしないで良いのかい。半信半疑だったが、だめもとである。付け加えてみる。

 おーし、ストロベリーリナックスの超小型LCDにメッセージが出た。初期化ステートメントが抜けていただけだ。ソフトは問題ない。しかし新しいLCDでは動かない。何回目かのピン配置の確認をしているとき、とんでもないことを見つけて顔が青ざめた。

 何とピン番号のスタートが逆順だ。ICなどのストレートのピン番号は原則は反時計回りで下の段なら左側からだが、このLCDのピン番号は右から始まっている!データシートには明記されているので間違えたこちらが悪いが、それにしても。

 さらにVccとグランドの端子位置を確かめて愕然とする。電源2本は中間地点で対称についている。つまり逆にすると電源は逆差しになってしまう。いやあ、壊したか。折角、ピンヘッダーを芸術的に接続したというのに。逆接の時間は通算でも1分ないと思うが壊れた可能性は高い。

 泣く泣く、もう一台のLCDの実装にとりかかる。最初のLCDのピッチ変換のピンヘッダーをとりはずし、2台めにハンダ付けする。さあどうだ。あれー、まだ表示されない。しかし、表面がうっすら変わった感じがする。前の経験が生きている。

 今度もコントラストか。 I2C液晶のコントラストはソフトである。コードには中間の30にしてある。ストロベリーリナックスのLCDはこれで良かった。もしかしたら、こいつを変えると良いのかもしれない。コントラストを50にして再ビルドする。やったー、文字が出た。

Dsc01485  悔しいので、速攻でコンソールからのキー入力でコントラストを上下するロジックを組み込む。このLCDは0~63までのうち、50以上でないと鮮明に出ないことが分かった。

 壊れたと思った最初のLCDの方である。ピッチ変換ピンヘッダーをもう一度付け直すのは大変なのでジャンパーコードを無理やりハンダ付けし、付属のパスコンなどは空中配線でつけてテストした。良かった、壊れていなかった。正常に表示が出た。やれやれこれでブログに書くことができる。
(スケッチのコードはまだ未完成なので、次回以降に公開したいと思います。)

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

2018年8月 3日 (金)

また脱線。今度は電波時計リピーターでさらに迷走

 記事の間隔が今回も一か月を越えた。このあいだ電子工作をやっていなかったわけではない。毎日、PCルームにこもって、ごそごそやっているのだが、何しろやることが発散し、次々に興味が他に移るので記事にまとめるところまでいかない。

 赤外線リモコンウェブサーバーのプロジェクトはソースコードの公開で一段落し、そのあと、表面実装基板にするためkiCADの基板設計に取り組んでいた。しかしこれが、ひょんなことで別のテーマに興味が移った。電波時計のリピーターである。

 さらに、そのリピーターも部品の動作テストをやっただけで、関心は電波時計の制作の方に移り、それも、さらに別の枝葉の分野に手を伸ばして収拾がつかなくなってしまった。このあたりで戦線をまとめ直さないと、いつまでたっても記事が書けなくなる。

久しぶりのkiCADは進みが遅い(6/25/2018)
  ミニブレッドボードに作ったリチウム電池駆動の携帯型赤外線リモコンウェブサーバーは、とりあえず目的の機能を満足し(2階のエアコン、温風ヒーターの制御)、実用化の目途が立った。ただハードはまだ実験用のブレッドボード上だし、ソフト面でも残された課題が多い。

Dsc01462  まずは、覚えたリモコン命令を記録していくEEPROMエリアの拡張である。まともにやるなら、例のSPIFFSのファイルシステムにすれば良いのだけれど、そこまで大がかりにする気にはなれない。そう、ニーズがはっきりしていないので運用シナリオが描けないである。

 具体的な仕様が決まらない。今のところ考えているのが寝室の冷暖房の精密温度制御だが、どうしてもやりたいわけでもない(時限タイマーを使えばそれなりに間に合う)。もうひとつが洗面所の温風ヒーターだが、これは防水仕様(湯舟から動かしたい)をまとめる方が先で、ソフト面でこれ以上つけたすところはない。

 あらゆる機器開発でうまくいかない原因の最大級は、この「仕様が明確でない」ということである。実際の使い方が決まらなければ、結局、どれくらいの大きさのEEPROMが必要なのかも定まらない。困ったものだ。

 というので、赤外線サーバーのソフト開発はこのあたりにし、ハードの実装基板を作ることにした。もともとの制作動機は、この基板を表面実装で自前のCNCマシンで作ることだったのだ。何のことはない、本道に戻ったことになる。

 久しぶりにkiCADを立ち上げて表面実装基板の設計に入る。回路図エディターで、ミニブレッドボードに作ったESP8266のウェブサーバーの回路図を改めて書き下ろす。情けないことにkiCADの使い方をあらかたみな忘れている。 

 ESP8266のフットプリントデータをネットで探す。これが意外と見つからない。みんなブレークアウト基板で済ませているようだ。あちこち探し回ってやっと見つかった。しかし、これが回路図エディターに取り出すことができない。 Irserver

 原因はフットプリントデータと、ESP8266の回路図データは別物であることに暫く気が付かずに迷走していただけだった。やれやれ、年は取りたくないものである。見つけたフットプリントは、新しいバージョンのkiCADが必要だというので、kiCADのインストールをしなおす。殆ど泥縄状態である。

 ところが新バージョン(4.0.7)のkiCADは、変な所でループが始まって先に進まない。部品の諸元を変更するたびに、フリーズする。全く止まるわけではなく暫くすると復帰するが、ちょっとした定数の変更のたびに長時間待たされるのはたまらない。

 バージョンを元にもどそうかと考え始めたころ、解決法が見つかった。アノテーションと言ってパーツの番号付けをするルーチンがおかしくなっているようだ。強制的なアノテーションを部品の諸元を替えるたびに行うと、短時間で処理が終わることが分かった。なんやかんやで、回路図をつくるところでなかなか先に進まない。

電波時計リピーターは市販化されていて結構良い値段がする(7/8/2018)
 そんなころ、ESP8266の予備品を見つけるため部品箱を整理していたら、LCT1799というチップが目に入った。これは、去年の4月に面白がって買ったオシレーターチップで、これでNTP(Network Time Protocol)から得た正確な時刻を元に自前のJJYの標準電波(40kHz)を出して、電波時計を動かそうというものである。

 ウェブを検索してみて驚いた。NTPを使った電波時計リピーターは、最近は事務所などで沢山の掛け時計の時刻合わせに使われるらしく、市販品が多数出ており、しかも結構な価格で売り出されている。安いものでも2万円はする。

 電波時計のJJY信号は、もう6年も前、Aitendoで実際に受信モジュールを買ってきてテストしたことがある。値段を聞いて俄然、制作意欲が盛り上がった。赤外線サーバーそっちのけで、受信モジュールの実験の準備を始める。リピーターの実験には、こういう受信モジュールが必須だからだ。

 電波時計リピーターの方は、参考にさせて貰ったサイトではRaspberryPiでPythonを使ったソースコードが公開されている。電波時計は処理単位が一秒ごと、つまり1 bpsなので、NTPさえ動けば何もRaspiまで担ぎ出すことはない。ESP8266で十分動くはずだ。 

 NTPではなく、既存のJJYからのリピーターなら、当研究所の名前になっている8ビットのAVRでも十分可能だ。電子工作では著名なChaNさんは、10年以上も前にTiny2313クラスで電波時計を作られている。

 少し迷ったが、現在一番環境が揃っていて開発に慣れているESP8266で作ることにした。まずは正しい電波をデコードできる時計を完成させ、次に電波発生装置に行くことにする。アンテナが課題だ。

6年ぶりの電波時計モジュールは動いた(7/11/2018)
 部品箱から取り出したAitendoの受信モジュールは、ミニブレッドボードに刺さったままで、モニターのときPCなどからのノイズを避けるフォトカップラーもついていた。早速、通電して動作を確認する。電源を入れてすぐは動かないが、暫く(十数秒)すると、福島からの電波を受信し、LEDが点滅し始めた。

Dsc01475  うむ、動いているようだ。新しいオシロをつないでパルスを見る。前のオシロはじかに接続すると、ノイズが出て受信不能になったのだが、どうだろう。まずは直接つないでみる。おお、今度のオシロは直結でも全く問題なくJJYのパルスが表示された。

 ちゃんとした高周波ノイズ漏れ対策が出来ているのだろう。たいしたものだ。ただ、地下室の奥にあるPCのそばではやはりノイズが多い。オシロと受信モジュールをひとまとめにして、PCのそばから、地下室のオープンスペース(保安上の吹き抜け)へ持ち込むとJJY時報パルスは完全になる。

 蛍光灯の近くは全然だめだが、PC電源の影響は殆どないようだ。受信機はオシロがなくても、電波を受けるとLEDが点くようになっているので、部屋のあちこちに移動して受信状況を調べる。以前はPCの横でも正常に受信できたのだが、長波は季節的なものがあるのかもしれない。Dsc01468

 とはいえ、オシロで見ているとパルスが全くでたらめになることは少なく、パルスの立ち上がりと立下りでチャタリングが起きている程度である。頑張れば、ここでもデコードすることが出来るかもしれない。このあたりの受信強度でも時刻を得られることを今回の開発目標とする。

 ESP8266でのJJYデコードのソースコードはウェブにいくつかころがっていた。Arduino IDEを使ったそのうちの一つが簡単そうなので、これを利用させてもらうことにする。参考にさせて貰ったソースのブログは以下の通り。    
https://ameblo.jp/amano-jacky-nochio/entry-11824498383.html

 ソースが見つかったので安心して、その前に、まだやっていない40kHzの発振機能を確かめておくことにした。

電波送信は昔の真空管のC級増幅を真似る(7/14/2018)
 ブレッドボードにLTC1799モジュールを差し込み、ウェブで紹介された通りの回路を組み立てる。このサイトの記事は外見だけでアンテナの諸元の詳しい説明がない。これは電波法のからみで具体的な情報を避けておられると勝手に判断し、自分なりのアンテナを用意して長波の電波発振のテストを始めることにした。

 動作そのものは、モジュールなので電源を入れると簡単に動いた。オシロで波形を確かめる。矩形波の綺麗なパルスが出ているのを確認した。既に組み上げたJJY受信モジュールを近づけてみる。アンテナは適当なリード線(電話ケーブル4~5m)である。Dsc01473

 JJYのデコードは出来ていないが、受信だけならLEDの点滅でわかる。ブレッドボードの近くに受信モジュールを近づけると、LEDが点いたままになり、受信していることは明らかだ。少し離すと切れる。1m程度が限界だ。リード線はつないでも離しても変わらない。ほっておくとJJYからの電波を受信し始める。

 サイトの記事の外見はフェライトコアにUEW線を巻き付けたいわゆるバーアンテナである。長波なんて波長は何キロメートルもあるので、どんなアンテナで送信するのが良いか全くわからない。

 それでも、ふと思い出して部品箱を漁る。みつけたみつけた。以前Aitendoで買ったシングルバンド用の受信モジュールのアンテナ部分が見つかった。買ったころ断線していて苦労したやつである。

Dsc01466  これは受信用だが、送信アンテナの代わりになるはずだ。単にオシレーターの出力につなぐのではなく、サイトの記事通り、FET(2SJ377)をつけ、20Ω程度の抵抗負荷をつけてみた。

 少し電波は強くなったようだが、事務所内の電波掛け時計を一斉に同期させるほどの強さではない。よく考えてみたら、電源電圧が変わっていないのだから、FETで増幅してみても同じ負荷なら出力は増えない理屈だ。

 念のため、オシロで波形を見てみる。おやあ、鋭い下向けのパルス(数十V以上)が出ている。ふーむ。これはDC-DCコンバーターのスイッチング回路そのままだ。これをならせば正弦波になるのか。

 ここで閃いた。昔というより大昔、アマチュア無線の真似事でやった共振回路である。適当なコンデンサーをインダクタンス(バーアンテナ)に並列にして同調回路にする。真空管時代のC級増幅のタンク回路である。

 おお、正弦波まではいかないがそれらしい矩形波がでた。喜び勇んでJJY受信機の感度を確かめる。うん少しは良くなったようだ。LTC1799そのものよりは少し距離が伸びた。しかし、3mから4m少々までが受信限度である。

 バーアンテナの威力がわかったものの、すこし離れるとJJY電波の方が強くなる。福島からの電波に負けるのだから、LTC1799から発射されている電波強度は、いわゆる電波法に云う免許なしに出して良い微弱電波であることは間違いない。

 大きな部屋の多くの電波掛け時計を制御することは出来ないので実用品にはならないが、アマチュアで近くの電波時計を動かすには十分だろう。免許の必要もない(大体、許可されるはずもないが)

ESP8266によるNTPの受信は簡単に動いた(7/16/2018)
 JJY受信の目途はたったし(ソースを入手しただけだが)、電波の送信もOKになった。残りは、NTPの受信である。以前、RaspberryPiでNTPを受信したことがあるが、ESP8266では初めてである。またネットのお世話になる。

 調べると、簡単に、サンプルソースが見つかった。早速新規プロジェクトを立ち上げ、コピペ一発でソースをぶちこむ。幸いビルドはNO ERRORである。動かしてみるとシリアルコンソール上に、正確な年月日時分秒が出た。

Jjydecoder  同期をどうするかという問題は残るが、これで必要なリソースはすべて揃ったことになる。ただし正確さについては、NTPを使っている以上、余り厳密な追及は出来ない。

JJY受信機の表示に3.3V用のキャラクターLCDを使おうとして失敗(7/18/2018)
 JJYの受信デコードのプログラムのソフト開発に戻る。ネットから頂いたJJYデコードプログラムは、ESP8266ではなく、普通のAVRを使ったArduinoがベースで、表示装置はキャラクターLCDである。

 こちらのLCDの手持ちは、大分前に買ってあった定番中の定番、秋月の反転色の2行16文字のキャラクターLCD(SC1602BBWB-XA-LB-G)である。普通、こういうLCDは3.3Vでは動かない。ウェブを見ていても、ESP8266のLCDは最近はやりのI2Cインターフェースの3.3V版が殆どで、こうしたパラレルLCDの使用例は極めて少ない。 

 そのうち、5VのLCDを、LCDクロックのパルスを利用した負電圧発生回路を付加して使っているページを見つけて制作心が刺激され、これを入れてみることにした。久しぶりのハンダ付けを楽しむ。ところが、これが全く動かない。バックライトすらつかない。

 キャラクターLCDを使うのは、考えてみると久しぶりで、下手をするとガイガーカウンター以来で7年は経っている。色々調べるうち、お粗末な間違いというか勘違いをいくつも発見した。まず、このパラレルLCDはもともとが3.3V用で、負電圧回路は全く必要がなかった。お馬鹿な話である。

 さらに、バックライトの電源は別から供給しなければならないということにだいぶあとで気が付いた。いやいや、情けないの一言である。

Dsc01467  バックライトに電源を入れて、LCDはそれらしい表示が出てきたが、表示ドットはいわゆる豆腐状態で全く反応が見られない。オシロで制御信号を見ると、細かいパルスが出ているが、LCDのパルスにしては、細すぎる(数μs)。どうも、このソースはArduino用で、ESP8266では動かないようだ。

 ライブラリーのLiquidCrystal.hのソースを見た限りでは、クロック依存のところはなさそうなのだが、ここにあまりかかずらっているのも意味がなさそうな感じがしてきた。時計を作ることが最終目的ではない。潔くLCDをあきらめてシリアルコンソールにすることにする。

LCDを諦めて、シリアルコンソールに出力を換える(7/20/2018)
 猛暑である。週2回行っているヨガとプールのアスレチックジムもお休みである。LCDは開発の必須条件ではない。本筋でないところであちこち道草を食ってきたので、何が何だかわからなくなってきた。とりあえずはソースコードのLCD表示部分をシリアルコンソールに切り替える作業に没頭する。

 これは手数がかかっただけで、何も問題はなかった。シリアルコンソールに、それらしいメッセージが次々に表示された。しかし、エラーが多い。いつまでたっても正しいJJY時刻を手に入れることは出来なさそうである。

 このソースは、チャタリングなどの抑止機能は全くついていない。パルスを単純に受け入れて、パルス幅、0.2sec(マーカーパルス)、0.5sec(論理1)、0.8sec(論理0)をスペックどおり(±5ms)調べて、範囲を超えるところはすべてエラーにしている。

 これでは、オシロでみたような立ち上がりや立下りでチャタリングを起こせば、全くデコードできなくなる。そこで、スイッチ制御でおなじみのチャタリング防止ロジックを入れる。立ち上がりと立下りの双方に数十msの待ち時間を入れ、安定したパルスになるようにする。

 しかし、PC横の受信モジュールではどうやっても安定した時刻を得ることができない。前と違って、まれに(10回に一回くらいか)、時刻が出る時もあるが、これでは実用性にかける。

Dsc01471  こうなると意地である。受信機を地上近くのオープンスペースの階段に置いて、PCのところまで電話ケーブル(10m)で送電線のように引き回してテストを続ける。フォトカプラーを経由しているせいか、少々引き回しても結果が乱れることは全くなかった。

 地上近くでは、殆どエラーは起きない。この状態でやっとJJY電波のデコードに成功した。大体、JJY時計の開発が目的ではなく、リピーターが目的なのに全く無駄なことをやっていると思うが、やりだしてことを途中で止めることが出来ない性格である。自分でもあきれてしまう。

一分の遅れをどうするかでまた脱線(7/28/2018)
 実は、これも、NTPを使ったリピーターには関係のない話なのだが、ここでまた3日近く浪費した。それは、JJY標準電波の表示時間が、最初に正時パルスが来て、そのあとおよそ1分かけてその時刻(時分年月日)を伝えるパルスが送られてくるというロジックの問題である。

 つまり、パルスを受け取って、その時刻が何時何分の正時だったかがわかるのは、およそ1分後になるということだ。リピーターなら、NTPと同期させて正時パルスを伝え、その時刻データを送って行けばよい。しかし、時計の場合は、1分先の時刻を用意しないと、正確な時刻にならなくなる。

 これも、お馬鹿な話だが、リピーターでも、この1分先の時刻を用意しなければならないと思い、一生懸命ロジックを考えてテストしていた。たかが一分と侮ってはいけない。単に分を足すだけでは問題は解決しない。下手をすれば年をまたがるときは、すべての表示を変える必要がある。

 色々考えたが、UNIX経過時間を使うのが一番合理的だと判断した。UNIXは1970年1月1日午前0時から始めた秒数をタイマーとして持っている。これに関しては沢山の標準関数が用意されているのでこれを応用する。

 やりかたはこうだ。JJYから得られた時分年月日を一旦、この経過秒に変換し、これに60を足して、また時分年月日に戻せば良い理屈である。

 早速、先ほどのNTPプログラムにこのロジックを組み込んでテストする。ところがこれが一筋縄では行かなかったのである。

 悪戦苦闘、3日間。やっと解決した。しかし、この経過時間があちこちで違うので参った。つまり、JST(日本標準時)の扱い方が、サイトやNTPのオプションで違うのか、どうしても数が合わない。最終的な解決は、この前もやったと思うが、現場合わせである。つまり、NTPをJSTオプションで使ったタイマー値は、地道に計算した1970/1/1の経過秒より一日増やせば一致することがわかった。

 いかにも釈然としない解決だが、とりあえずは、一分遅らせることに成功である。やれやれ。このあたりでブログの原稿をまとめよう。

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

2018年6月23日 (土)

ESP8266の赤外線リモコンウェブサーバー実装にはまる

 2年越しの課題、古いエアコンの赤外線リモコンの制御に成功して意気が上がったのも束の間、またブログの更新間隔が1ヵ月を越えてしまった。久しぶりのソフト開発に思いのほか手間がかかった。ソースの公開のためのスクラッチビルドが遅々として進まず、開発が難航していたのだ。

 最近、ソースコードを公開していないので、そろそろソフトを公開しようとしていた。人様のソースの流用なので、許諾を得るために何度か先方に問い合わせをしてきた。しかし、今になっても返事がない。仕方がないので、ソースコードをこちらで書き直すことにした。

 本来は、クリーンルームなどにこもって、既存のコードとは完全に切り離した形で開発しないといけないのだが、まあ、アマチュアなのでそこは大目に見ていただき、ソースコードをモジュール単位に分解して作り直す。しかし、どうしても似たようなコードになってしまうのは仕方がない。

 それでも、独自のロジックを組み込んだりして、何とか目鼻がついてきたので、このへんでそろそろ公開することにする。

ウェブサーバーからリモコン操作ができるようにする(5/12/2018)
 参考にさせてもらったサイトはここである。ESP8266でコード式の赤外線リモコンの送受信までの機能がある。記事の続編には、ウェブサーバー版もあるようなので、これも少し参考にさせてもらった。

 ただ、ここでは、赤外線リモコンのコードは手入力でソースコードのHTMLデータにセットしている。せっかく赤外線コードが得られているのに、これを手書きで入れ直すのはあまり嬉しくない。 そこで、これをもっと使いやすく、受信したコードをコンパイルなしにウェブを通して送信する機能を追加することにした。

 この世界は所長の慣れないウェブプログラミングである。それでもAVRなどと違ってESP8266はかなりのフラッシュを持っているので、相当なことが出来そうだ。ここで勉強して経験を積み、このあたりの開発力をもう少し高めておきたいという下心もある。

Dsc01464 このため、最近何冊か参考書を買って勉強しているが、今一つ成果は上がっていない。意気込んでプログラミングにとりかかったもののなかなか先に進まない。ウェブを漁ったり、過去の参考書を引っ張り出したり、悪戦苦闘の連続で、まともに動き始めるのに、結局ほぼ2週間かかった。

 Arduinoのライブラリーを活用しようとしているので、回り道が多い。調べているうちESP8266のウェブサーバー関係のプログラム例は沢山、ウェブ上に見かけるが、まとめると大きく2つの流れがあることがわかった。

ESP8266のウェブサーバーライブラリには2種類あり微妙に違う(5/14/2018)
 まず、ひとつは、この参照サイトにも使われているESP8266webserver.hというライブラリ(クラス)を使ったコードで、もうひとつはArduino本来のWiFiシールド時代からとみられるWiFiserver.hである。 

 最初のライブラリは、クライアントからリクエストが上がると、server.on()というイベントドリブン的な関数が呼ばれて、ここでそれぞれイベントに応じた処理が行える。メインのloop()の中は、HandleClient()しかなく、ここでこまごまとした処理を一手に引き受けているようだ。

 もう一方は、clientというクラスを定義して、クライアントからのレスポンスをloop()の中で常時待ち、リクエストそのものを実際に受け取りながら処理を制御する。こちらの方はやや原始的だが多彩な操作が出来そうである。

 ウェブサーバーのGET/POSTといったデータのやり取りは今一つ理解できていないので、後者の系統が分かりやすくて良いのだが、クライアントからのデータの取り出しが難しい。見様見真似でコードを書いていくのだが、今一(いまいち)しっくり来ない。

 前者はそのへんを組み込み関数一発で解決できる。しかしウェブサーバーの処理以外の並行処理をしようとすると(たとえばタクトスイッチ制御など)、どうもうまく動いてくれない。loop()のなかの、handleclient()がブラックボックスになっていて難しい。あれこれ悩む。

50年ぶりの葵祭は小ぎれいになっていた(5/15/2018)
 開発の話が続いたので、たまには、電子工作以外の話題をご紹介。所長の例の京都の小学校の同窓会の話である。これまでは京都近郊の少し離れた会場(石山寺、宇治など)に惹かれて、東京から足を運んでいたが、こんどは別のおさそいである。幹事もなかなかやるものだ。

Dsc01451 前は場所につられたが、今度は京都三大祭りのひとつである葵(あおい)祭の当日がクラス会という趣向である。われわれのクラスの卒業時の総数は51名、そのうち物故者4名、所在が分かっている人32名で、今回は15名の参加であった。半分に近い結構な出席率だ。しかも関東からの出席者が半数近くもいる。やはり祭りの威力はたいしたものである。

Dsc01459  子供の頃見物した葵祭は、平安時代の装束をつけた行列が鴨川の土手を練り歩く頃は、祭りが終盤に近いので、学生アルバイトが汗みずくで疲れ果てて歩いており、近くで見ると見映えの決して良いものではなかった。しかし50年ぶりに見た祭りの行列は、なかなか小ぎれいになっていた。

Dsc01455

 みな溌剌としており、藤の花で飾られた牛車(ぎっしゃ)がとても優雅だ。馬に乗った人の列も昔より沢山いる。しかも馬はみなサラブレッドで昔はこんな立派な馬ではなかった。話に聞くと、関東方面の牧場から乗馬用の馬を大量に借りて来るそうで、人ごみに慣れておらず、時々、暴れるそうだ。

 そういえば、所長の学友には祭りの主催者、上賀茂神社の関係者がおり、直垂(ひたたれ)姿で乗馬していて、御所内で落馬しかけている報道写真を数年前新聞で見たことがある。

やっと目鼻がついたか。ウェブプログラミングが通る(5/25/2018)
 開発の話に戻ろう。2年越しでエアコンの作動に成功したといっても、これはモニターにしているシリアルコンソールからの発信で、ブラウザー画面からではない。ハードはこの前に使ったミニブレッドボードの携帯型の学習リモコンで、ここにウェブサーバーのソフトを流し込んでいく。

Dsc01465  ウェブサーバー用のソースコードは既にサイトに紹介されているのだが、スクラッチから開発したいため、別のライブラリーWiFiserver.hで動くようにコードを書き換えて行く。前にも述べたように、このライブラリーは、loop()の中でGET/POSTという、クライアントとサーバーのやりとりが目に見える形で操作できるのでプログラミングがしやすい。

 しかし、すぐに暗礁に乗り上げた。帰ってくるデータが制御文字を避けるためのエンコードが残ったままで(スペースが%20など)、これをデコードしなければならない。%20をスペースに戻すくらいなら簡単だが、サーバーには日本語が使いたいので漢字となるとお手上げである。

 ウェブ上で解決法を探したが手ごろな仕掛けは見つからない。色々迷ったが、結局、オリジナルのESP8266webserver.hに戻し、なるべく元のソースコードを見ないようにして開発していくことにした。

 こちらのライブラリでは、GET/POSTで入ってくるコードは、argsという組み込み関数にパラメーターを与えれば、コマンドのStringデータを次々に一発で得ることが出来る。しかもデータはエンコードされておらず(というより、関数内でデコード済み)、大幅に開発量を減らせる。

 お手本があるので進捗が早い。オリジナルのWiFiがAPモードで使いにくかったので、STAモードに換え、一般のブラウザーでも画面が出るようにする。これで使いにくいスマホをクライアントにしないで、一般のPCから操作が出来るようになった。

 HTML文書は、以前、ESP32で画像付きサーバーを作ったときのソースを流用して、とりあえず画面を立ち上げる。styleシートの扱いが難しく、素人まるだしの無粋な画面だが、動かしてみると、これが意外にも簡単に動いた。Ws000004 とりあえず、電子音量リモコンの上下ボタンと、エアコンのスタート/ストップだけの操作だが、PCの画面から、ボタンをクリックすると、音量リモコンが動き、エアコンが、厳かに音を立てて始動するのを確認した。いやいや、まだオリジナルのソースのかなりの部分が残っているが、とりあえずは完成である。感慨にふける。

コンパイルなしに新しい赤外線コマンドを画面から追加する(5/27/2018)
 次の課題は、ウェブサーバー上でのコマンドの追加である。受信部はまだこのサーバープログラムには実装していないので、まずはFORMタグによるクライアント画面上からのコマンド名と、その赤外線データの文字入力でコマンドを新設する機能を開発する。

 ブラウザーの画面で、データのやりとりをするのは簡単ではない。シリアルコンソールなどの送受信は、双方が同等の機能を持ち、独立して動くので、やりとりを設計するのに苦労しないが、HTMLを介したサーバーとクライアントのやりとりは、サーバーからクライアントにトリガーをかけることは基本的には出来ないので、一筋縄ではいかない。

 いわゆるプッシュ通信という、あたかも、サーバーからデータが来るように見える機能があるが、これは、あらかじめクライアント側のアプリに仕掛けがしてあるからで、基本的にサーバーは、あくまでもクライアントからのリクエストを待つしかない。

 つまり継続して通信を続けるには、必ず、クライアント側にお膳立てが必要で、HTML文書やCGIなどでサーバーが事前に準備しておく必要があるのだ。これが面倒である。

 悪戦苦闘の結果、画面上の形や位置は、とてもスマートと言えない状態だが、コマンド名とそのコード化された赤外線コマンド($から始まる16進コード、オリジナルがまだ残っている)を画面上に表示し、FORMタグで取りこむことに成功した。下の行に、クリッカブルになったコマンドが表示され、これをクリックすると、めでたくリモコンとして動作した。やれやれ、これでまた一歩前進である。

 こうなると、受信部の実装が急がれる。赤外線受信のハードの部分は携帯型学習リモコンに実装済みで、オリジナルのソースコードでは動作を確認している。これを独自ソースに書き換えなければならない。

 受信部分で最も大変なのが、得られたRAWデータ(パルス幅μs)をコード化する部分である。オリジナルは、AEHA(家電協)方式と、NEC方式しかサポートしておらず、あとからSONY方式を追加したのだが、今度は、いちから作り直しである。

 特に苦労したところは、NEC方式とSONY方式の区別だ。基本のパルス長が562μsと600μsと非常に近接しており、この差だけで区別することは難しい(テストのときは何とか特定データで誤魔化した)。これを全く違う方法で区別するように頭を捻った。

 その方法は、ソースを見て頂ければわかるが、NECとSONYの基本長がほぼ同じで、論理ビットがちょうど反転しているのを利用している(NECはONパルスの長さが一定で、OFFの長さで0.1を判断し、SONYはその逆)。得られたON/OFFのビット長の平均を比較すれば、ほぼ間違いなく両者を区別できるしくみだ。

EEPROMが曲者だった。いくつかの落とし穴にはまる(6/5/2018)

 受信部のスクラッチ開発は手間がかかるので、その作業のかたわら、EEPROMでデータを保存する機能をつけてみた。ESP8266でのEEPROMの実装は始めてであるが、見たところ簡単そうなので気楽にコードを加えて行ったところ、最初は大はまりにはまった。

 プログラムがひんぴんと落ちるのである。データを書き込むと、一瞬でメモリ破壊でシステムがリセットする。ためしにネットにある例題をコーディングすると問題ない。つまりハードではない。頭を抱えた。

 オチは簡単だった。要するに、データをStringで定義すると、EEPROMの中のデータ長が不定になるため(恐らく0バイト指定)、メモリ破壊になるのだ。Stringで定義してはいけない。探した限りでは、これまでの情報にこの落とし穴の指摘はなかった。

 文字配列にして長さを指定しても、実はまだメモリ破壊が止まらなかった。これは今度はこちらのミスだった。要するに、文字列の最後の'\0'キャラクターを長さに入れていなかったためで、少し多めにデータ長を指定してOKとなる。やれやれ。

Ws000006  このあと、待ち時間を入れないとおかしくなる(5ms以上必要)と聞いて、慌てて待ち時間を追加する。これでやっとのことで、画面で定義した新しいコマンドが電源を入り切りしても現れるようになる。このあたりも作りこめば、いろいろ工夫できるが、とりあえず、最後の受信部の書き直しに移る。

ウェブサーバーに受信部を追加する。大幅書き直しでこいつも難航(6/12/2018)
  Arduinoのプログラムステップ数も500を越えて、そろそろ開発の限界に近付いてきた(ひとつのモジュールの開発規模が500ステップを越えると制御不能になりやすい)。そういうことでもないが、気楽に、今までの受信部をとりあえず、全部取りこみ、タクトスイッチで受信を開始するロジックを加えたのだが、全体が全く動かなくなった。

 わかってみれば、単なる変数の初期化忘れが原因だったのだが、最初はなぜ動かなくなったのか全く見当がつかない。疑似コード作成をさぼって、適当にコードを追加した咎めである。こうなると、もう修復は難しい。

 一旦、入れたコードを#if 0と#endifで全部元へ戻し、少しづつコードを足して、その度に動くことを確認しながら入れるコードを増やして行った。結局、バグは先に述べた通り、単なるレコード数変数の初期化忘れという初歩的ミスだった。

 何とか動くようになり、このソフトは、以下の手順で学習した赤外線データを送ることが出来る。まず、タクトスイッチの押下で(準備OKのLEDが点灯)、赤外線リモコンの照射を待ち、正しく信号が入ると、LEDが点滅して無事受信されたことを知らせる。

 ここで、画面上の、「画面更新」というボタンを押すと、得られた赤外線コードが表示されるので、クリックすると、学習した赤外線コマンドが送信される。電源を切ってもデータを残すためには、この赤外線コードを、ブラウザーのコピー/ペーストで、コマンド新設の欄に入れて登録すれば電源を切っても残る。

Ws000007  学習したコマンドを直接EEPROMに保存する機能はまだ未開発だが、これ以上、公開を遅らせたくないので、見切り発車で公開の準備に入った。ソースコードの独自開発をせっせと進める。

ソースコードの公開(6/22/2018)

 そのうち、4年に一度のサッカーのワールドカップが始まった。PCに向かうより、TVの前で深夜過ごすことが多くなり、開発の速度はいやでも落ちる。しかも、全く勝てる見込みのなかったコロンビアに日本が見事な勝ち越しゴールで勝ったものだから、もう大変である。

 ということで遅れに遅れていたが、やっとのことでソースコードを公開できるまでになった。まだ未完成な所も多く、オリジナルのコードをすべて取り替えるところまで行っていない。プロの世界では、まずクロだが、まあ、お金をとるわけでもないので、とりあえず公開して様子をみることにする。
以下に、赤外線リモコンサーバーのスケッチを公開いたします。フォルダーがzipファイルになっていますので解凍のあと、適当なArduinoの開発環境に入れてビルドしてください。WiFiのIDとパスコードを加えるだけで、上記の画面が、192.168.0.33/で見えるはずです。

「sketch_IRserver.zip」をダウンロード

意:6/26以前にダウンロードした方は、もういちどダウンロードしなおし、前のものは廃棄してください。一部にバグがありました。

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

2018年5月14日 (月)

CNCマシンは少しお休み。赤外線学習リモコンに熱中

 CNCマシンで DC-DCコンバーター基板を切削して動作するところまで作りこみ、CNCマシンへの情熱は少しおさまった。

 電子工作を始めてから早いものでもう10年が経つ。正確には2007年10月、ブログの公開が2008年8月だが、前にも書いたようにCNC制御は究極の夢で、とても自分では実現できるとは思っていなかった。それだけに感動の思いはひとしおである。

 勢いに乗って、次々に基板切削にとりかかりたいところだが、なぜか手が止まった。当研究所のモットーは「実用」である。「何かに役に立つものをつくる」ということから言えば、今作りたい表面実装基板はない。

 実用にこだわると意外にテーマがないものだ。CNCマシンの他の応用、彫刻などの木工も、題材を探してはいるが、これはという決め手がない。レーザーカッターまで買ってあるのだが、テーマは見つからない。そう、何となく、みんな「ときめかない」のだ。

一度挫折した赤外線学習リモコン基板はどうだろう(4/15/2018)
 そこで、これまでのブログの記事を読み返しながらテーマを探していると、以前AVRで作って、うまく動かず途中で諦めた赤外線学習リモコンの記事が目に止まった。
(もともとの電子音量リモコン制作記事はこちら

 2年ほど前に、AVRのTiny861を使って、得られた受信信号をそのまま(RAWデータ方式)送り返す方式で、手始めに自作の赤外線による電子音量リモコンを動かそうとしたのだが、一番簡単なSONY方式にもかかわらず、全く動かなくて途中で投げ出した。エアコンのようなデータ量の多いリモコンを学習することはとてもじゃないけれど出来そうもなかった。

Pc043427  このあたりは最近どうなっているのだろう。ネットで「学習リモコン」をキーに検索する。すると最近のIOT時代を反映してか、予想以上にたくさんヒットした。2年前より明らかに多い。電子工作というよりこれは実用品のようで、商品の宣伝がやたら目につく。自作の制作記事も前より増えている。

 自作のターゲットマシンはWiFiモジュールのESP8266が多い。廉価だし、WiFi付きなので遠隔地からも簡単に制御が出来る。しかもプログラム開発にArduinoが使える。この前は意地を張って、ESP8266でなくわざとTinyを使って失敗したが、今度は素直にESP8266を使ってみようか。

 ソースコードも、あまりやせ我慢をしないで先人のものを使わせてもらおう。うまく動けば、この学習リモコンユニット基板をCNCマシンで作ればよい。これまでのリベンジと、CNCマシンの第二作、一石二鳥である。

 ESP8266はこの前使ったAVRに比べると格段に高性能である。クロックは80Mhzと、下手なARMより早いし、フラッシュやSRAMもメガバイトクラスなので気楽にプログラミングが出来る。AVRのときのようにメモリに気を遣う必要は殆どない。

 ただ、赤外線学習リモコンと言っても、色々な方式がある。一旦意味のあるデータにデコードしてから、それを再生するコード方式が一番確実だが、赤外線リモコンには多種類のコードフォーマットがあり、これをすべて網羅することは難しい。といって、記録したデータそのものを忠実に再現する方法(RAWデータ方式)は、以前、失敗していてトラウマがある(ロジアナで同じような波形だったのに全く動かなかった)。

 いずれにしても、ESP8266を変換基板なしに直付けして作る表面実装のリモコン基板なんかはちょっと格好が良いのではないか。どの方式にするかはあとからでも決められる。とにかく学習リモコンを作ることを次のテーマにすることにした。

受信部分はあっさり動いたが、送信部分は追加開発が必要(4/23/2018)
 RAWデータ方式でもコード方式でも、受信部分は同じなので、まずはESP8266を使った受信部分の開発を始める。ハードの準備はミニブレッドボードで簡単に組みあがる。
ソースコードは、ここ(東京お気楽カメラ)を使わせてもらうことにする。記事はここ

 ここは詳細な分析があり、送信部分は、RAWデータではなく一旦すべてのデータをデコードするコード方式だが、このコードを使ってサーバーからの送信もできるらしい。とても高機能だ。

 赤外線受信モジュールを用意し、ソースコードをネットからコピペし、新規スケッチに放り込んでコンパイルする。幸いコンパイルエラーもなく順調にビルドが出来た(当たり前か)。モニターのPCコンソールをつないで早速動作テストに入る。

Ws000003  おお、素晴らしい。赤外線パルスのマイクロセカンドのオーダーの数値がコンソールに並んだ。いや、さすがはESP8266だ。4バイト(long)や2バイトのバイナリデータを多数(5ケ)かかえた構造体の配列を400以上とってもびくともしない。AVRとは大違いである。

 次は送信部分である。このサイトは赤外線LEDへ流す電流を詳細に検討されていてとても参考になる。こちらもサイトにならって2本の赤外線LEDを直列に並べる。大電流の必要な赤外線LEDのドライブは、トランジスターでなく、前に使ったFET(2SJ377)を使う。

 すぐにでも送信のテストをしたいところだが、このサイトの送信は、AEHA(家電協)とNEC方式の2つのコード方式で、皮肉にもこちらの手元にある赤外線ボリュームコントロールのSONY方式はなく、新たな開発が必要である。

 いずれはSONY方式のコード化はしなければならないが(ネットを経由するとき)、結果を早く知りたいのでRAWデータ方式の送信部を追加開発することにした。あわよくば、全部をRAWデータ方式にしても良い。これでうまく行けば無敵になるからだ。

RAWデータ方式で電子音量リモコンが動いた!(4/25/2018)
 送信部分が完成した。テストに入る。受信部分で対象のリモコンからデータを受け取ったあと、何らかのトリガーで、マイクロセカンドオーダーで蓄積された時間間隔に従って忠実に赤外線をON/OFFし発信する(RAWデータ方式)。

Dsc01431  このユニットは電池駆動にする予定である。リモコンの対象が家の各部に散らばっていて、テストのためにはPCから離れなければならないからだが、トリガーのタクトスイッチなどの実装が手間なので、とりあえずはPCのシリアルコンソールからのキーボード入力で制御する。

 テストの対象は、まずは目の前にある以下の3つである。このあいだの自作の電子音量リモコン、それにPCルームにある10年以上前の古い三菱エアコンと、RaspberryPi用の10インチモニターのリモコンである。他の部屋のエアコン、TVやDVD、洗面所の温風ヒーターなどは現地に赴かなければならない。

 手始めは、因縁の電子音量リモコンである。送信する。全く動かない。ふーむ、やれやれ。今度も駄目か。赤外線LEDに並列に可視光線のLEDをつけているので、発信していることは間違いがない。オシロにもそれらしい信号(サブキャリヤー)が観測できる(ただし、端子の所で)。

 受信の時のデータはコンソールで確認できているので、あとは、赤外線LEDあたりを疑うしかない。参考サイト以外の赤外線リモコン関連の記事を見ていると、赤外線LEDを4つも並列に並べているところや、複数あるとかえって個体差でエラーが多いという指摘のあるサイトがあったりして、混乱する。

 2つあったLEDを1つに減らしたり、制限抵抗を10Ωに下げたり、LEDの照準を合わせたり試行錯誤するうち、おお、気が付くといつのまにか電子音量リモコンが反応し、ボリューム値が変わっていた。

少しづつ成功率が上がっていく。PWM方式も有効(4/28/2018)
 いや、嬉しい。今まで全く反応がなかったSONYフォーマットの赤外線音量リモコンが動く。百発百中というわけにはいかないが、今まで全く無反応だっただけに嬉しい。

 でも、ときどきESP8266そのものが暴走するし、成功率は余り高くない。オシロの波形をさらに良く調べたところ、意外にも、パルスの立下りがなまったサブキャリヤーの波形があらわれた。なにー、FETはトランジスタより高速だというのに、この波形はおかしいではないか。

Dsc01435  このFETは、前に動かなかったとき使っていたのと同じP-MOSのFET(2SJ377)だ。サブキャリヤーがちゃんとした矩形パルスになっていない。そうか、以前動かなかったのは、この原因もあるのだろうか。

 赤外線LEDのドライバーをFETからトランジスター(2SC1815)に切り替えた。オシロの波形はまだ少しなまってはいるが、FETよりは格段にましな矩形波パルスになった。成功率は残念ながら100%とは言えないが、それでも反応する率は確実に高くなってきた。 FETのスイッチング特性については、ここ(SUDOTEK)が詳しくて参考になる。

 それにしても、久しぶりのコーディングは、落とし穴に落ちてばかりで、結構な手間がかかった。たとえばwhileループの継続条件を決める変数を、最初のカッコのなかで、++や--で、うっかり変えてしまうと、そのあとの処理は、変わった後の変数が使われる。

 コーディングしているものにとっては、forループと同じように、i++や、i--は、繰り返し処理が済んでから、やってくれるものと期待しているけれど、そう甘くはない。プログラムは書いたようにしか動かないのである。このデバッグに数時間かかった。やれやれ。

 リモコンの成功率を高めるために、サブキャリアーをdelayループでなくanalogWrite()を使ってPWMでサブキャリアーを出すこともやってみた。これはうまく行った。オシロにもきれいな矩形波が並び、周波数も想定通りだ。暫くこれを使おう。

Dsc01434  成功率は徐々に上がってきた。好調なときは、ヒット率は90%まで達するときがある。しかし、100ビット以上あるエアコンはまだピクリとも動かない。うーむ、これはコード方式でないと無理か。

 それはともかく、ネットを探し回っているうち、以下のすごいサイトを発見した。ArduinoでなくAVRのTiny85で学習リモコンを作った方のURL。いやこれはすごい。詳細な解析結果と、データ圧縮まで考えた力作である。

ミニブレッドボードに携帯版の学習リモコンを作る(5/1/2018)
 SONY方式の電子音量リモコンに続き、NEC方式のRaspiのモニターのリモコンも問題なく動いた。エアコンはまだ動かないが、我が家には、まだ数種類のエアコンや、TV、DVDなどがあり、どこまでRAWデータ方式が有効か確かめておきたい。このため携帯版の学習リモコンの開発に移った。

 このあいだ買ったESP8266用の幅の広いミニブレッドボードに、もう一台のESP8266を載せ、送信LEDと受信モジュールを接続する。さらに、タクトスイッチと状態表示のLEDを追加した。シリアルコンソールがなくても制御出来るようにするためである。電源はリチウム電池で、このあいだのLDO(NJM2845)で3.3Vにする。

Dsc01430  赤外線の送信トリガーはタクトスイッチで、発信の確認は赤外線LEDに並列に接続した普通のLEDである。受信の方は、データを読み終わると別の状態表示用のLEDを点滅させ、その後、点灯したままにしてデータが蓄えられていることを示す。

 これで自宅のあちこちにでかけ実際のリモコンの動作を確認していった。その結果、TVのリモコンや、洗面所の温風ヒーター、さらに2Fの寝室のこの間、買い替えたばかりの三菱エアコンは、このRAWデータ方式でも見事に動くことが確認された。

 結局、我が家でこのRAWデータ方式の学習リモコンで動かないのは、10年以上前のエアコンだけとなった。このエアコンは1Fの居間のエアコンと全く同じであり、皮肉なことに最もこの機械を使う可能性の高い機器が残ったことになる。何となく気持ちが収まらない。成功した気分になれない。

 それに、小規模なリモコンでもコマンドシーケンスを持っているのがあるので苦労する。最近導入した台湾製のロボット掃除機などは、コマンドの種類は少ないのに、ボタンの2度押しなどでコードを変えているようで、単純に2回同じボタン信号を送っても正しく作動しない。 

ESP8266のWatch Dog Timerの作動から逃げる(5/2/2018)
 実験機が持っていた持病、時々暴走してしまう症状の原因がやっとわかった。プログラムを動かしている間に、いつのまにか、CPUが例外条件を感知してリセットしてしまう。いわゆる暴走だ。

 最初は測定中に配列に大きな値がはいってメモリでも壊しているのだろうと思っていたが、メッセージを良く見ると、そうではない。ループ中にWatch Dog timerが動いたというメッセージである。わけがわからない。

 こういうときはGoogle先生に聞くに限る。いつものエラーメッセージをキーワードにする検索で、すぐ原因がわかった。ESP8266のArduinoは、ユーザープログラムの裏でWiFiなどのシステムが動いている。従って、ユーザーが一定以上CPUを独占すると、エラーとしてシステムをとめてしまうらしい。

 つまり、While(1)などでCPUをループさせ、ディジタルピンの変化を監視するプログラムは、途中で、delay(0)とか、yield()などの関数をはさまないと、このトラップにかかる。

 理屈がわかれば対処は上の通り簡単だ。参考にさせてもらったサイトのソースに、delayループが各所に挟まれていた理由が始めてわかった。何故こんなところでms単位の待ちをいれるのだろうと最初は訝っていた。これを省いていったため暴走が始まったらしい。

赤外線センサーが時々ノイズを出す(5/3/2018)
 さらに、携帯版の学習リモコンで、折角、覚えさせたデータが失われる不具合(点いていたLEDが消える)が、頻発し始めた。赤外線センサーの誤動作で受信ユニットが動き、貯めてあったデータが失われるようだ。

 こういうときのためのオシロである。 赤外線センサーの出力にSingleトリガーをかけて、早速、調査を開始する。接続して1分も経たないうちに原因が判明した。赤外線センサーから、20μs程度の短いパルスが発生している。手持ちの2つあるセンサーの内の一つがノイズっぽく、もうひとつは比較的安定している。

 電源ノイズで、こういう現象が起きるようだ。Vccにコンデンサーと抵抗のデカップリングをすればなくせるらしいが、そもそもは、こういう短いパルスだけで、これまでのデータを消してしまう方も悪い。一旦、まともに得たデータ(カウント20以上)は、受信エリアとは別に残しておくソフト的な方法で解決した。シングルパルスのノイズは無視しておればよい。

 あれやこれやで、携帯型の学習リモコンも安定してきたが、どうもプロジェクトの終着点が見えない。この学習リモコンで何を制御するのかという明確な目的がないので際限がないのだ。何と言っても、我が家の主力エアコン2機が、この方式で動かないというのが致命的である。やっぱり、コード方式をやってみるか。

やっと主力エアコンが動いた。やっぱりコード方式でないとだめだった(5/8/2018)
 長い間の懸案、学習リモコンで難攻不落だった三菱の古いエアコンを動かすことに遂に成功した。コード化して送り直す必要があった。いやあ、長かった。上記サイトのソースコードのおかげである。感謝、感謝。

 秋月で入手した赤外線センサー(OSRB38C9AA) は、このサイトにあるように、どうもON期間が短く、OFF期間が長くなる傾向があって(およそ30μs)、それでも新しいエアコンや、ビット数の少ないTVなどの制御はRAWデータ方式でうまく動くのだが、我が家にある、10年以上前の古い三菱エアコンだけはこの方式ではガンとして動かなかった。 

 最初、センサーの立ち上がりと立下りの遅れの時間の差と考えていたが、オシロで調べたところ、明確な差は出なかった。パルス列の中で、差のあるところと全くない所が混在している。RAWデータ方式の明確な問題点は突き止められない。

 結局、これまで参考にさせていただいたソースコードを元に戻し、コード方式の実験に移る。さらにSONY方式を加えて、プログラムの確認が容易に出来るようにした。エアコンを激しくon/offすると機械に良くないということを聞いたからである。

 SONY方式は、ビット数が少ないのだが、データビットの論理が反転しており、ビット'0'と'1'の区別はON部分の長さである。従って、リーダーの直後のOFF区間からデータに入る。

 つまり、コード化にあたっては受信のところからデータ収集のやり方を変える必要がある。しかも、基準時間がNEC方式との差が10%以下(560と600μs)なのでどちらかを決めるのが難しい。エアコンのデコードとは本来関係がないのだが、ついSONY方式の実現の方に夢中になる。

 送信の方は少し楽だ。ソースコードの中で、送信するビットの部分を2つ作り、最初から独立させてしまう。独立させるのは、送出時間の誤差を少しでも減らすためでもある。ESP82366である。フラッシュは潤沢にある。

 できた。コード方式をSONY方式の電子音量リモコンで確かめる。よーし、動いた。しかし成功率は、RAWデータ方式よりちょっと良いくらいで、目を見張る程のことはない。さて、いよいよ、問題のエアコンのテストである。

 まず、リモコンをエアコンに読み取られないよう(エアコンが動くとステイタスが変わる)、陰で実験機に覚え込ませ、シリアルコンソールでデータが入ったことを確認して、祈る気持ちで、送信ボタンをON。

 ピーっと、言う音と共に、エアコンにスイッチが入った。やった、やった。2年越しの懸案が解決した。勝利の快感に酔いしれる。これだから電子工作はやめられない。このあと、ウェブサーバーへの移転にも成功したのだが、紙数が増えてきたのでこのへんで一段落としよう。

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

2018年4月14日 (土)

CNCマシン(3)遅れていたが、遂にプリント基板初切削に成功

 このところ順調に20日程度の間隔でアップしてきた記事が今回は遅れている。道草を卒業してCNCマシンの工作にやっと戻れたのに、ちょっとしたことでまた止まってしまったからだ。それでもその後やっとプリント基板の初切削に成功した。基板も動いて長年の念願がかなった。

前回のBluetoothによるUSBシリアルのワイヤレス化について(3/12/2018)
 本題に移る前に、先の道草の報告をしておこう。USBシリアルデータをBluetoothで送り、CNCマシンをワイヤレスで動かす話である。

 いくつかの障害を越えて、前回までにRaspberryPi Zero W(以降raspi0W)のUSBシリアルポートは、Bluetoothを通して、別のPCの仮想シリアルになった。接続の開始に少しコツがいるが、送受信とも安定して動いた。ただ、少し画面の展開が遅いのが気になる。Grbl_ble

 残るは、実機のテストである。raspi0Wの基板をCNCマシンの横に持ち込んで、USBケーブルをRaspiのホストUSBソケットに接続する。少し離れたPCではBluetoothの仮想シリアルポートをCNC制御ソフトCandle(Grblcontroller)のシリアルポートに指定する。このPCでCandleが動けばワイヤレス化は成功である。

念のため、PCのTeratermでCOMポート(com10となった)を立ち上げる。すると例の、
Grbl 0.9j['$' for help]
>

という、ArduinoのGRBLのWelcomeメッセージが出た。$などのコマンドのレスポンスも正常だ。良いぞ。次はいよいよCandleの始動である。立ち上げたあと、設定で、bluetoothのCOMポートを指定する。

 うーむ、つながったような、つながっていないような。画面では、ジョグダイヤルの画面部分が黒くなり接続しているようだが、反応はない。そのうちエラーメッセージが出て、画面の制御部分がグレーになる。たまにスピンドルが回り出すが、止めることは出来ない。

 こういう制御系でこの安定性ではとても危なっかしくて使えないのだが、根がしつこい性分である。あきらめきれずロジアナを持ち出して、シリアルデータをCNC2418のコントロールボードから採って調べてみた(ストロベリーリナックスがおまけにつけてくれた極小プローブが役に立った) Dsc01408

 その結果、シリアルデータは正しくPCからここまで送られているが、Candleがレスポンスを返していない。懸念したとおり送受信の反応が遅すぎ、タイムアウトとなっている公算が強いことが分かった。

 データの中継をしているRaspiでのPythonプログラムの問題である。プログラム上は単純に来たデータを送っているだけで余分なことは何一つしていない。従って、これをさらに高速化するには全く別のことを考えないといけない。残念ながらこれ以上は無理だ。ここは潔く諦めるべき時だろう。 Grblstart

 ということで、このUSBワイヤレスプロジェクトは、これで一区切りとする。PythonとBluetooth、それにRaspiでのリダイレクトの勉強が出来ただけでも収穫だと考えよう。

PCB(プリント基板)制作の進行に戻る(3/15/2018)
 MDF板の彫刻以来、止まっていたCNCマシンの工作を再開する。Easelで作ったMDF板の切削はとても順調に出来たが、こちらが主力でやろうとしている基板切削は、基板データの制作途中で止まったままだった。

 基板の回路は、これまで幾多の挑戦をしてきたDC-DCコンバーター基板である。KiCADで設計データは大体できていたが、サイズが問題だった。今まで汎用の表面実装基板で作ったものより小さくすることが難しくて、そのままになっている。 Ws000001

  久しぶりにKiCADを立ち上げ、コンバーター基板の小型化を再開する。DC-DCコンバーターは、これまで3個以上の基板制作をやってる。少なくともこれより大きくしたくない。入出力間のピン間隔が20.32ミリ(mil規格で8ピン)、全体のサイズで25X15ミリ以下が目標である。

 一時的に嫌気がさして先に進まなかったのだが、時間を空けたのが良かったのだろう、何故か順調に手が動く。ほどなく目標のサイズにすることが出来た。このソフトに慣れてきたのかもしれない。配線チェック(DRC)も問題ない。最後のステップ、べたアースにして状態を見る。

 あれえ、出力側のピンの周囲のべたアースがおかしい。ここはかなり部品を寄せたところだが、べたアースのパターンは前のピン位置のところを基準に描かれ、このままではショートしてしまっている。

 うーむ、前の部品データが残っていて悪さをしているようだ。そう言えばピンを移動した時、パーツエディターではピンのフットプリントと形状枠がずれておかしなことになっていた。この部品(2ピンヘッダー)を一旦削除し、新しいデータを持ってきたが、事態は改善されない。

 KiCADの不具合に間違いないが、今これにかかわっている時間はない。プリント基板エディターのデータをすべて消去し、回路図エディターからネットリストや部品抽出を再度やりなおし、そっくり基板エディターのデータを作り直した。

 何回目かの手順なので作業が早い。すぐ基板が完成した。べたアースはどうだ。大丈夫だ。余計なものはついていない。前のデータのミスも見つけられたし(片側のピンヘッダーがmil規格でなかった)、KiCADの習得にもなった。言うことはない。そう、所長は究極のプラス思考人間である。

Gcodeを出す工程に移る。聞きしに勝る複雑な工程に四苦八苦(3/19/2018)
 次はいよいよ難関のCAMデータ変換である。いやいや、これがこんなに大変とは思っていなかった。KiCADのガーバーデータ(基板情報を網羅したもの)からCNCマシンの制御コマンドGcodeに移すのは、膨大な手順が必要である。 Ws000002

 ひとつひとつが複雑な手順で出来ているので、沢山の設定が必要なのはわかる。しかし、途中の工程が多すぎる。でも、悪戦苦闘したおかげで今までちんぷんかんぷんだった事情がだいぶ理解できるようになった。ガーバーデータなどというCAM技術用語をそれなりに駆使できるほどになったのは大したものだと自画自賛する。

 面倒な理由は他にもある。KiCADからGcodeを出すには定番のルートというものがなく、多くのやり方があって何を選べば良いのかわからないことだ。素人にとっては複数の手段があることはかえって難しくする要素である。

 しかし、泣き言を言ってもいられない。せっせとウェブサイトを逍遥し、一番楽そうな方法を探求する。検討の結果、FlatCAMが一番主流なようなので、これで先に進むことにする。こういうのは善悪を抜きにしてやっている人の多い道を選ぶというのが一番という「ずるい」考え方でもある。

 FlatCAMの解説は色々あるが、ここあたりが一番詳しくておすすめである。こちらも詳しいが、ちょっとわかりにくい。

べたアースのGcodeが難しい(3/22/2018)

 べたアースの切削がやはり最大の難関だった。境界部分の切削パスは、カッターの切削幅だけを注意していれば良いのだが、べたアースを指定すると、どこにも接続されない島が残る。この残った部分を削除する、いわゆる、べた抜き銅箔部の削除(noncopper削除)手順が思ったように働かない。

 ゾーンを指定すると、その部分の島の部分を削除するパスを作ってくれるはずなのだが、ゾーンの範囲がうまく決まらず、ソフトがハング状態(ゾーンを調べまわっているのか)になったり、とんでもなく広い部分がごっそり指定されたりする。

 結局、KiCADから FlatCAM、さらに CandleのGcodeまで行き来してやっと切削できそうなGcodeデータが揃った。 べた抜き銅箔は、ゾーンではなく切削パスを追加する手順がFlatCAMにあるので、これをせっせと島になった部分に書き込んで、切削データを揃える。

 いやいや、一癖も二癖もあるフリーソフトである。何とか出来上がった。実際のデータをCandleに持ち込んで、エンドミルをつけない運転(カメラリハーサルか)を開始した。ふーむ、予想通り動いているようだ。 Ws000000

 それにしてもこの熱中ぶりは自分でも驚くばかりである。難しいから面白いのか、夢中でデータをいじる。うっかりすると、エンドミルを基板深さまで打ち込んで、いきなり走り出すGcodeを吐いたりするので、油断はならない(あっという間に刃を折っておしまいになる)。

基板(PCB)の初切削は思ったより順調。しかし穴あけができない(3/25/2018)
  リハーサルがうまく行ったので、本番の切削に進む。最後の工程である。基板切削なのでZ軸の補正をするheightmap機能が活躍する。切削の範囲は小さいのでheightmapのデータ収集は簡単に済んだ。 Dsc01411

 いよいよ、Vカッターを付けてPCB(プリント基板)の切削である。最初はカッターの位置をきっちり基板にあてなかったこともあり、遠慮めの切削となって銅箔を削るところまでカッターが行かなかった。

 切削の深さを少し増やし、Z軸の原点をさらに近づけた2回目は、うまく行ったのだが、掲載写真の通りY軸のステッピングモーターが最後の最後で空回りし、外周の切削が基板を横切ってしまって失敗した。3回の試行でほぼ考えているような基板が削れた。スピンドルは全速ではなく60%で音は殆ど気にならない。 Dsc01413

 切り離しまで行って重大な誤りに気付く。ドリルビットに換えようと手持ちのプロクソンのミニリューターのビットをとりだしたら、何とここのシャンクサイズは3.0ミリだった。CNCマシンは3.175ミリである。3ミリのコレットチャックの持ち合わせはない。

 やれやれ、このドリルビットは使えないのか。これは大誤算である。ドリルビットはこれを流用することにしていたので何の用意もしていない。あわててアマゾンで適当なドリルビットのセットを発注する。アマゾンだからすぐ着くと思っていたが送られてきた書類の到着予定日を見て目を疑った。

 何と、10日以上もかかるという。アマゾンだけど販売している会社は中国だった。うーむ、注文の時に良く調べるべきだったが、もう遅い。まあ、余り慌てても仕方がないので、到着までやり残していた工作で時間をつぶすことにする。

中国からドリルビットが届くまで、他の工作で気を紛らわす(3/27/2018)

 やり残している工作はいくらでもある。まず、このあいだESP8266でワイヤレス化したロボットアームの暴走抑止である。制御系の電池がへたるとアームが暴走するのを止めたい。このあいだ全てのモーターが動き出して、大騒ぎになった。

 この原因はわかっている。これまで参考にさせていただいたプログラムがもともと負論理だったが、これをそのままにしたので、3V以下でも動くモータードライバーに0のデータが送られて、すべてのモーターが全開になるというオチである。

 これを逆にするソフトの改修である。サーバー側の改修だけで済むはずだ。でも気持ちが悪いので、クライアント側のリモコンからもすべて負論理から正論理に換えることにする。作業は面倒なだけで単純な作業だ。

 ところが動かしてみたら全く不審な動きをする。動かそうとする部分が動かなくて他のアームが動く。えー、そんな器用なことを誰がする。あらためて慎重に工程を確認した。サーバー側のESP8266のコンパイルがテスト用にだけ済んで、本番のロボットアーム基板に換装するのを忘れていたことがわかる。 Dsc01415

 やれやれ年は取るものではない。コンパイルのときは、必ず最初のメッセージなどにコンパイルの記録を残しておくという鉄則を怠った咎めが早速結果に表れた。自戒、自戒である。

 次は、ブレッドボードに組んであったクライアント(リモコン側)をまともなケースに組み込む工作である。久しぶりにサーキュラーソーを持ち出して、基板の端を切り、ケースの上蓋にタクトスイッチの穴を開ける。これはこれで面白い。 Dsc01416_2

 電源スイッチは、最初手持ちのスライドスイッチですますつもりだったが、ウェブで小さなロッカースイッチを見つけて、急に気が変わり、Aitendoで沢山のロッカースイッチが売られているのを発見し、急遽、足を延ばして買いに行ったりした。

 こういうものは実際に手に取って調べるのが一番確実だからだ。Aitendoはウィークデイだったが、前にも増して客が多い。品数も増えたようである。付近には、全く別の電子部品の小売店ができたりして町が何となく以前と雰囲気が変わってきた印象だ。 Dsc01418

 やることがなくなって、レーザーカッターの準備まで始める。お馬鹿なことに買ってあったレーザーは0.5Wの一番小さいレーザーユニットだった。慌てて5.5Wの別のユニットを注文した。$100以上する。道理で最初に払った金額が小さかったわけだ。

届いたドリルビットは初回でポッキリ。スピンドルが回っていなかった(4/8/2018)
 ビットが届いた。基板に両面テープを貼り(基板カットまでしてしまったので)、マシンにセットして、以前の合わせ位置を頼りに位置決めをする。ジョグを動かして合わせるが、目視ではなかなか合わない。

 リハーサルを何度も繰り返し、何とか許容範囲に納まったので、意気込んで切削開始ボタンを押す。あれ、スピンドルが回らない。えー、という間もなくドリルビットは目的地まで動いて、静かに下がって行き、リセットスイッチを押す暇もなく、たわんだところでソフトはエラーで緊急停止した。 Dsc01414

 ステッピングモーターが高負荷で止まったらしい。リセットなど押す余裕など全くなかった。真っ赤なエラーマークを解除し、祈る気持ちでZ軸を上げたが、残念ながらドリルビットは数ミリのところで折れていた。

 スピンドルが回らなかった原因は、Gcodeではない。リハーサルのときに用心してモーターの回転を止めるため接続コードをはずしてあり、それを開始前に確認するのを怠った、誠に単純なチェックミスである。 Dsc01419

 まだ、ひとつも穴を開けないうちにドリルビットを失う。情けなさに何故か思わず笑いがこみあげてくる。やれやれ、あれだけ用心していたのにこのざまだ。たかだか一本¥100のビットだが、このあいだ1 万円以上入った財布を落とした時よりはるかにショックが大きかった。

 それでも気を取り直し、ビットを取り替えて(0.6 -> 0.5mm)工作をすぐ再開する(俺も懲りない男である)。今度は全速でスピンドルモーターを回しながら再開。無事、穴あけに成功した。それはそうだ、穴開けといっても今度の基板はわずか6か所である。 Dsc01421

 ただ慎重になりすぎ、穴あけの深さが足らなくて全部貫通していない。基板は作業盤からはずしてしまったので、リューターで、0.5mmの貫通と、ピン穴用の1mm穴あけをやる。これで、すべての工程は終了した。当研究所の初の基板切削は、ほろ苦い出発となったが、とりあえず一段落である。

一気に実装。よーし、一番性能が良いぞ(4/9/2018)

 基板切削終了のところでブログの記事にしようと思っていたのだが、部品のハンダ付けを試しに始めたところ、止まらなくなった。プリント基板は迷うことがないので次から次に進む。既に部品はビニール袋にすべて用意してあったのでなおさら止まらない。12個の部品実装はあっというまに終わった。 Dsc01422

 ここまできたら動くのを確認したい。これも我慢できない。ブレッドボードに基板を差し(これが使えるようにmilピッチにこだわった)、早速、これまでの基板とダミーロードのセメント抵抗も持ち出して実験を開始する。

 あれ、電圧が一定しない。一旦上がった出力電圧は、そのまま下がってしまって電源電圧と同じになる。早速、実体顕微鏡で仔細にハンダ付けをチェックする。すぐ不良個所が見つかった。電圧調整用の半固定抵抗のピンのひとつがどうもくさい。試しにピンセットで強く押すとピンが外れた。ここをしっかり固定しなおす。 Dsc01423

 よーし、所定の電圧が出た。さあ、これからが本番だ。ダミー抵抗で負荷をかけてテスト開始。これまでの自作基板では、250mAくらいまでは良いのだが、400mAを越えると出力が9Vを維持できなくなる。(7V程度に落ちる)

 さあ、こんどのやつはどうだ。うむ、250mAではこれまでのものと同様全く問題ない。400mAはどうか。やった。良いぞ。9Vに近い8.8Vで頑張っている。

 市販の大容量をうたったDC-DCコンバーターでも400mAを越えると、この程度の電圧降下はあるし、自作にしては上出来である。胸を張ってブログに報告できる。 Dsc01424

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

2018年1月15日 (月)

遂にCNCマシンキットを発注。細かい工作をしながら待つ

みなさま遅まきながらあけましておめでとうございます。
 おかげさまでこのブログは発足以来10年にもなりました。最近は記事の更新間隔が広がり、アクセス数も漸減しておりますが、自分として電子工作は定年後のライフワークとして欠かせない活動のひとつとなっています。

 このブログも少しは人の役に立っていることを感じる時がたまにはあり、自分の好きなことで人に喜ばれることは無上の喜びでもありますので、止める気は今のところ全くありません。この自己満足を満たしつつ、細く長く続ける所存でありますので今後ともよろしくご支援のほどを願っております(コメントがとても励みになります)。

 さて、今年は表題にありますように、とうとう念願のCNC(コンピューター制御)工作機の開発に挑むことにしました。当研究所の究極の目標のひとつでもあります。年末からこれまでの活動経過を以下にご報告します。

年末に意を決してCNC工作マシンに取り組むことを決定(12/27/2017)
 遂に中華CNCフライス盤キットを発注した。これまで欲しい欲しいと思っていたコンピューター制御の工作機械である。

Dsc01311_2  フライス盤とは高速で回転する刃物(ビット)で素材を切削し部品を作る機械のことで、プロの世界では、古くからコンピューター制御で自動的に作ることが当たり前になっている。最近はアマチュアの世界でも普及が広がってきた。

 しかし、ちょっと前までアマチュアが手の出せるCNCフライスは、どんなに安くてもキットで10数万円した。自作するのはもっと大変だった。市販のミニフライス盤を改造するにしても、相当な工作の熟練度と経験を持たないと近寄れない世界であった。

 それが中国製のCNCフライス盤キットならフレームからモーター、制御基板など全部合わせて、なんと数万円で手に入るのだ。ネットには続々と制作記が掲載され、評判も悪くない。

 情報が豊富になったので、中華キットでも不安がなくなってきた。これはもう作るしかないだろう。この制御コンピューターがArduinoというのも時代を感じさせる。やってみたいのは、プリント基板制作である。いわゆる乾式プリント基板である。

 発注先は、この前のオシロと同じAliexpressに決めた。沢山のショップが同じようなものを売り出している。良く見ると少しづつ微妙に違っていて同じではない。これを比較するサイトもあったりして選ぶのに参考になる。先月あたりから、色々物色して、多数の人が選んだCNC2418で、買うところは、一番安心できそうな、ここに決めた。

 発注の時、ついでに5.5Wのレーザーユニットもつける。フライス盤がCNCレーザーカッターに早変わりだ。3ミリくらいまでのアクリル板の切り抜きが出来るという。これまで実用品にこだわってきた電子工作だが、こんどのプロジェクトは究極の実用化である。 Ws000003

 ロボットアームなど、いくらこだわっても所詮は玩具である。一方、CNCマシンはこれをもとに、プリント基板や、ケースを自作できる。実用という意味では、「しかけ」を再生産する「しかけ」ほど実用的なものはない。

 価格は何とレーザーユニットも含めて$148、送料$50、あわせて$200たらず。関税がかかるにしても、日本円で2万5000円以下である。本当にこんなに安くて良いのか、画面の前で一抹の不安がよぎる。

 しかし、ここまで来て引き返すわけにもいかない。自分ひとりで興奮しながら、深夜、購入のボタンを押した。手元に届くには暫く日がかかりそうだが、楽しみに待つことにしよう。

参考にさせてもらったサイト。
CNC制御の自作レーザーマシンや、ルーター(フライスまで行かないか)マシンの全体俯瞰には、次のサイトがおすすめ。
自作CNCマシン・レーザーカッターについて

中華CNCマシンの制作や調整は以下の2つのサイトが細かくて懇切丁寧。必見である。
みら太な日々

マーティーの工房日誌

中華CNCマシンの比較は以下が詳しい。結局ここと同じものを選択。
念願のCNCフライスをついに注文……ただし、激安の中華CNCだがな

(無断引用ご容赦)

秋月電子で安いLDOを見つけた。秋月のLDOが勢ぞろい(12/29/2017)
 キットが来るまでには日数がかかる。調べたいことは調べつくした。何か手を動かしていないと落ち着かない性格になっている。ということで、これまでやりのこした細々とした工作で、気を紛らすことにした。

 ロボットアームのリモコンは、まだブレッドボードの上の仮ごしらえである。いずれケースに入れるつもりだが、せめて電源だけでもバッテリーにしようと、部品箱にころがっているリチウム電池を取り出した。

 リチウム電池は、満杯のときが4.1Vで、公称が3.7Vだ(危険水位は3.6Vでこのあと急激に下がる)。3.3Vディバイスのためには、いわゆるLDO(low drop out)3端子レギュレーターの出番である。

 当研究所には、既に沢山の3.3V用のLDOレギュレーターが揃っている。レギュレーターによっては、発振したり、なかなか定電圧にならなかったり微妙にやっかいな部品である。しかも、過去にはレギュレーターを2つも焼損させて「復讐」を受けたりしている。

 最近のディバイスの電源電圧は3.3Vが多い。RaspberryPiやESPシリーズなど、これらは消費電流が多くて、電源の容量不足で問題が続出し、ネットが一時この話題で大いに賑わったことがある。

 このとき、ねむいさん達が推奨していた3.3V用の強力なレギュレーター、ADP3338が、秋月でも売り出されているのを発見した。しかし高い。ひとつ¥300もする(DigiKeyではもっと高かった)。

 どうしようかなと、さらに秋月サイトを眺めていると、LDOのジャンルで、日本無線のNJM2845というチップが目に止まった。こいつは最大出力が0.8Aと少し低いものの(ADP3338は1A)、最小ドロップ電圧が0.18Vという優れものである(ADP3338は0.19V)。価格はなんと1/6の¥50。これは買うべきだろう。

Dsc01310  それに、LT1963というLDOも売り出されていた。これは小さいけれど1.5Aも出せる強力なLDOで、ねむいさんがかなり前に推奨していたことがある。しかし、これも少し高くひとつ¥200もする。でも何となく気になったので、暮れの秋葉原に出て、これら話題のLDOをまとめて買ってきた。

 買ってきてとりあえずNJM2845のブレッドボード用のミニ基板を作る。こういう工作は楽しい。簡単にできた。早速、ロボットアームのリモコンボードに使ってみる。うむ、これまで、LD3985や、AMS1117では、電池電圧が3.9Vを下回るとリセットを繰り返して動かなくなったリモコンが、快調に動く。

Dsc01308  まあ、AMS1117は最小ドロップ電圧が1.0V、LD3985は、最大出力電流が0.15Aといずれもスペック外になるのだが、同じLDOと銘打っても、こんなに差があることに驚いた。ADP3338ならもっと安定するのだろうが、これは先のお楽しみということで先に進む。

ESP8266の省電力化はうまくいかない(12/31/2017)
 ロボットアームのESP8266は送受信とも電池駆動である。ネット機器は一般に大飯喰らいで、Xbeeなどは数十mA、WiFiのXbeeなどは百mAを越す。ESP8266でもWiFi接続時は同じくらい消費する。そのため、当然、電池駆動などの時のため節電モードが用意されている。

 ESPシリーズ(ESP8266やESP32)はこれまで動かすことに専念してきたので、省電力化の機能は横目で見るだけだった。手が空いたので、少しは省電力化しようと調べてみた。このサイトの情報が良くまとまっている。

 それによると、3つのモードのうち、使えそうなのはlight sleepである。ただ、今度のロボットアームは、送受信とも常にネットで相手の状況を調べている。こういう常時ネットと交信するシステムでは余り効果がないように思われるが、こればかりはやってみないとわからない。

 省電力の設定そのものは、リセットを伴うdeep sleep以外はソースコードに手を入れる必要は殆どない。単に設定のAPI関数、 wifi_set_sleep_type(LIGHT_SLEEP_T) を入れるだけである(モデムスリープはMODEM_SLEEP_T)。

 deep sleepはプログラムがリセットされるから、プログラムの構造を変える必要があり、立ち上がりのトリガーをコーディングしなければならない。今度のプログラムではこれを使うことが出来ない。

 送受信とも、このlight sleepでテストしてみた。結果は全く影響がなかった。sleepを入れる前、受信側(サーバー)は交信前で、93~98mA、送信側(リモコン側)は、108mA程度で、交信が始まると、受信側が120mAに跳ね上がり、送信側も、134mAに上がる。

 sleepを入れると、受信側は、交信中で136mAとかえって悪化してしまう(送信側は変化なし)。休止するための何らかのオーバーヘッドがあるのだろう。プログラムの構造を考えずに、こういうステートメントを入れても効果がないことが良くわかった。

 測定は、電源に0.5Ωの抵抗を挿入し、両側の電圧をオシロで100mV/divで測った。今度のオシロは測定機能も充実していて、平均電流や、RMS(二乗平均)値も出してくれる(上記数値はすべてRMS値)。

 さらに、測定量が多いので、時間軸を拡大してもちゃんとデータを持っている。前のオシロでは、持っているデータが少ないので、少し詳細を見ようと、時間を広げると、すぐ波形が凸凹になって絵にならなかった。

 落ち着いた大晦日。電流の計測で、日がな、ゆったり時を過ごす。東京では雪が降ったそうである。こちらは雨だったと家人が言う。都心の方が雪というのも面白い。

めげない性格。何とかクライアント側を半分にする(1/4/2017)
 何事もなく新年を迎えた。近くの神社に初詣に行き、箱根駅伝を見てしまうとやることがない。CNCキットは正月中なので来る気配はない。で、年末挫折したESP8266の省電力化をあきらめないでしつこく続けることにした。

Dsc01305  要するに、断続的な観測以外の用途では、deep sleepは使えないし、無理に入れてもリセットなどで結果としてトータルとしては電力増の可能性がある。light sleepもネットが動いているときは殆ど無力だ。

 従って、UDPパケットがくるのをひたすら待つサーバー側は、省電力にすることは難しい。調べる間隔を延ばせば、反応が遅くなるだけだ。残るはクライアント側のリモコンスイッチのところである。

 少なくても、スイッチを押すまでは送信を休止していれば、少しは減るのではないか。再び、オシロに火を入れて測定開始である。まず、何もしない時の電流量は、先に紹介した通り100mAを越えている。一定の間隔(17ms)で常時パケットを送る仕様なのでこんなものだろう。

 そこで、スイッチを押したときのみUDP送信をするようにソフトの修正を行った。これがはまったのである。うまく動かない。電池が不足してコアダンプを始めたり、memcpyの標準関数がおかしくなったり、さんざんな目にあう。

 久しぶりの疑似コーディングで考え直す。スイッチを押した後の処理が難しい。うまく止まってくれない。フラグやスイッチはなるべく使いたくない。苦労の結果、前の状況を残しておくロジックで省電力化に成功した。電流量は60mAと半分近くになった。

 オシロで調べたところでは、最初、フルにネット接続をしているようだが、暫くすると休止モードに移行し(ベースの電流ががくっと下がる)、消費電流が低くなる。しかし、WiFiネットの継続のための内部のヘルスチェックの交信が入るようで、たとえアプリで送信を止めていてもこれ以上、下げるのは無理なようだ。

遂にCNCマシンキットきたー(1/9/2018)
 そうこうするうちに、思ったより早く暮れに発注した中華CNCマシンキットが到着した。AliExpressは注文確定から入金報告、出荷の有無などを逐一メールで報告してくれる。運送会社はEMSでこれも荷物の状況をかなり詳しくサイトで確認できる。

 ついでに発注したレーザー光線防眩ゴーグルは、本体より早く日本に到着していたようだが、受け取ったのは同時だった。外出中に家人が受け取ったのだが、関税は全く請求されなかった。送り状には、¥744と明記があるのだが、配達員は何も請求しなかったという。忘れたのかもしれない。Dsc01306

 荷物を記念撮影する。写真で見ていたのだが、思ったより小さい。しかしかなり重い。梱包も中国からにしては、歪みも殆どなくきれいな荷姿だ。さて、これから苦難の道が始まる。しかし、これは楽しみでもある。

 しばらく当研究所のブログはこの話題が続き、電子工作どころではなくなるが、まあ、AVRと銘打って今は殆どAVRをいじっていない。気儘にやることを勘弁して頂きたい。さきほどの先人たちの克明な制作記があるので何の不安もなく作業を開始できる。みら太さんの制作記事が一番詳しくてわかりやすい。

 梱包を解く。ありゃ、レーザー光線防眩ゴーグルが添付されていた。機材そのものは彼のキットとは微妙に違うところがあるが、大筋では同じ。X軸の動きが、彼のは渋かったようだが、こちらは、全く問題なくスムーズだ。反対にY軸がいまいち動きが悪い。レベル出しが必要なのかも知れない。

何とか動いたが、これからが大変(1/14/2018)
 残念なことに、我が家には水平を出せる定盤のような設備はない。床のフローリングも水平なようで、細かく歪んでおり、スマホの水平レベルアプリで調べても、これを頼りに水平を出すのは意味がなさそうである。

Dsc01307  実は当研究所では、ずいぶん昔、みら太さんが使っているダイヤルゲージを購入している。何のために買ったのか今になると思い出せないのだが、これを使えば相当精密な水平レベルを実現できそうだ。しかし、問題はフレームのレベル出しだ。色々考えた末、べニアの安い製図版を買って、ここで水平にすることにした。ネットで発注したが、到着まで10日近くかかるとメールが入った。

 待っていられないので暫定的な水平出しで我慢して、組み立てを急ぐ。4日ほどかけて無事完成した。組み立て過程は、これまでの複数のサイトの説明で十分なのでここでは省略する。最初は、このマシンの主要枠材、v-slotの取り扱いに難渋したが(後入れナットがうまく入らない)、これも慣れてくるとだいぶ楽になった。

 フレームが組みあがった。ステッピングモーターと、送りねじの接続で一苦労する。送りねじの長さが、X軸とY軸で微妙に違い、最初、逆につけてつながらない、つながらないと焦っていたり、基板の取り付けでフレームがずれているのに気が付かなくて(ここのずれは他と関係しない)、もうちょっとで取り付け穴を広げそうになったり、ドタバタはあったが特に大きな問題はなく組みあがる。

 電子回路の配線は、単にモーターのケーブルを基板につなぐだけである。あっけなく、終わった。さあ、今度はソフトの準備だ。実は、ソフトのインストールが一番てまどった。付属のDVDからPCに持ち込もうとするとエラーが出る。しかも英文用のGRBLはDVDで立ち上げようとするとアプリケーションエラーで止まる。

Dsc01312  あちこちいじったが、中文用のGRBLがDVDから動くことがわかった。紹介ネットサイトでおなじみのgrblControlの画面が出た。とりあえずこれでモーターの試運転まで行くことにする。USBをつないでUARTを接続、画面が変わった。

 動いたー。jogという手動のボタンで上下左右に動かす。いやあ感激、感激である。GRBLインストールのトラブルは、原因究明より大もとのサイトから正式のソフトをダウンロードしてめでたくHDDから起動できることを確認した。なんと全てオープンソースなのだ。これが中華製品躍進の理由かもしれない。

 とりあえず動いたというだけだが、ブログはこのへんで一段落しよう。残るは、防音ボックスと集塵装置の整備である。Fusion360のための64ビットOSの準備も待っている。ひょっとすると、このあたりの整備の方が本体より高くつくかもしれない。

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

2017年12月27日 (水)

ロボットアームのESP8266ワイヤレスリモコン化(続き)

ボタンの操作性を向上(12/8/2017)

 ロボットアームのリモコン(ESP8266のUDPクライアント)操縦用のボタン(スイッチ)は、5つのモーターの作動を指示するスイッチと、その正逆転の共通スイッチのひとつ、合わせて6つである。動かしてみるとやっぱり、アームの上下や左右の回転の操作は、それぞれが独立したタクトスイッチで動かす方がはるかに操作しやすい。

 

 しかし、ESP8266の使えるIOピンは6本が最大で、増やすわけにはいかない。というのでこのあいだ、I2Cで16チャネルまで増やせるI/OエキスパンダーIC(MCP23017)というのを秋月で買ってきてあるのだが、まあ、ここまでこだわることもあるまい。

 

 つらつら考えているうちにアイデアが浮かんだ。タクトスイッチは5X2の10個を並べ、対のボタンには、正転逆転のモードが同時に通電されるようなハード的なやり方を加えれば実現できるのではないか。例えばダイオードみたいなもので。

 

Tactsw_with_diode

 

 その昔、少年時代の頃、階段の明かりを単極双投のスイッチ2つでどちらから点けても、その先で消せるという回路を知って、ひどく感動した記憶がある。今度はそれほどでもないが、思いついたときは近来になく興奮した。

 

 でも、本当に動くのだろうか。これは試してみるしかない。小信号用の順電圧降下の少ないショットキーバリアダイオードの買い置きがある。早速、これを持ち出して同時に押す側のタクトスイッチから、正逆転のモードのピンと、本来の制御ピンに対して順方向に2つのダイオードをつなぎ、LEDをつけてみた。

 

 見事に、2つのLEDが考えたように点灯した。いやあ嬉しい。ウェブで調べると、キーマトリックスではダイオードが盛大に使われていることを知った。まあ車輪の再発明みたいなものだけれど、自力で思いついたところが偉いと自分で自分を褒める。

 

組み立てたけど動きが遅くなった。電池切れでもない(12/9/2017)
 遊んでいるうちに、アームの動きが急に鈍くなってきた。単一電池なのでまだまだ大丈夫なはずだが、グリッパーでものをつかんで運ぶのに結構長時間夢中になって動かしている。気がつかないうちに、電池がへたったのかもしれない。
Dsc01269

 

 オリジナルの電源は、単一電池4本を直列に接続し、その真ん中を共通グランドにして、これだけで正逆転の運転を巧妙に実現しているのだが、リモコンにするときは、この配列をモーター電源と制御電源(ESP8266とモータードライバー)に独立させて供給するように変更した。

 

 制御電源は、多くても数十mAしか流れない(但し、連続して流れる)。一方、モーターの方は数百mAではるかに消費が激しい。そこで、これを制御側と交換してみた。これで元気が戻るはずである。しかし、同じように勢いがない。ふーむ、これはおかしい。電池切れとは考えにくい。電圧を測るとモーター側もまだ一本1.5V近くある。

 

 マルチメーターで各部の電圧を測る。確かにモータードライバーのモーター出力は正規の1/3に近い1Vしか出ていない。念のため制御側のGPIO電圧も測る。おかしい。ここも1.8Vくらいしかない。ESP8266のGPIOピンのプルアップ不足かと思い、4.7KΩの少し強めのプルアップ抵抗をつけるが全く効果はない。

 

 モータードライバーDRV8835が早くも駄目になったのだろうか。ウェブで調べる。モータードライバーの損傷の原因は、過電圧、過電流、逆接続、モーターなどの逆起電力とある。電池なので過電圧はあり得ない。過電流に対してはモーター回路には用心して0.9A(遮断1.8A)のポリスイッチを入れてある。
逆向きに通電した覚えもない。

 

 ただ、モーターの逆起電力を抑えるダイオードは入れていない。考えられる原因は、やはり、逆起電力なのだろうか。しかし、リレーなどと違って正逆転するHブリッジのモーターの逆起電力を逃すダイオードの付け方がわからない。

 

 DRV8835がモータードライバーと銘打つからには、こうした備えは当然あると思うし、データシートには何の注意書きもない。しかし、現実には、モータードライバーがへたったとしか考えられない症状だ。仕事の帰り、秋葉原の秋月によって腹立ちまぎれにDRV8835を5つも買ってきた。

 

 交換する前に、念のため各部の電圧を測ってみた。すると奇妙な結果が出たのである。モーターの起動/停止ピンの電圧は低いが、左/右を決めるピンは、ばっちりVccと同じ電圧が出ている。

 

 おかしい。これは何か発振している。マルチメーターなので平均電圧しかわからないが、その可能性はある。
こうなると、オシロの出番だ。必要なピンにハンダ付けで臨時のプローブを出し、それをブレッドボードに差して動かないようにして慎重にIOピンの電圧波形を測定することにした。

 

オシロがお手柄。あけてみたら原因はハードではなくソフト(12/14/2017)
 実はオシロ測定に入る前に基本的なミスで大はまりした。こんどのESP8266受信サーバーは、モーターと制御系の電池を別にしているため、共通のグランドつまりローサイドで電源を切っている。これが原因で小一時間、頭を抱え込んでいた。

 

 念を入れてマルチメーターで電圧を測っていたときである。電源スイッチを入れてもいないのに電圧がでている。おかしい、どうしてだ。始めはスイッチがこわれているのではないかと疑った。しかしスライドスイッチがそうそう壊れるわけはない。

 

 ローサイドで電源を切っているときは、グランド側のプローブは、電池側でなく、スイッチの手前(回路側)にプローブをあてないといけないというのに気が付くまで暫く時間がかかった。図に書いたら一発でわかるミスだが、ブレッドボード上では中々わからない。実に情けない話である。

 

Dsc01265  この騒ぎが一段落して、やっと、オシロでGPIOピンの波形を出すところまで行った。そして、出てきた波形を見てさらにびっくりする。全く予想もしていない波形だった。最初、発振を疑っていたのでアナログっぽいランダムな波形を予想していた。

 

 それが、何とピンの電圧が、きれいなパルス状に出ているではないか。発振ではない人工的なパルス波形である。あっと思い当たった。これはソフトで作った波形だ。間違いない。

 

 動き始めた当初、暴走を止めるために受信メッセージが切れたときサーバー側で、とりあえず全ての制御を止めるロジックを入れた。こいつが原因に違いない。データが来るより、処理の方が速いため、次の受信データが来る前に制御は全部止まり、次のデータで再びONされる。

 

 マルチメーターでは平均電圧しかでないのでこの状況はわからない。ちょうどPWMのような動きをして回転が下がっているだけだ。モータードライバーはおかしくない。正しく動いている。全部自分が悪いのだ。モータードライバーさん疑ってごめんなさい。

 

 いやあ、世の中というのは恐ろしい。最初考えていた原因とは全く違っていて、犯人は暴走防止に気楽に入れたコードだった。ハードを疑った因果応報で、所長の本業のソフトの世界に弾が戻ってくるとは良く出来た話である。

 

無事、ロボットアームは元気を取り戻したが(12/16/2017)

 待ち時間を調整して、送る間隔と、受け取る間隔を同じにし、受信側も、受信データが来ない時は一定時間待ち、さらにデータの有無を聞いて、ないとき始めて制御を止めるロジックに変える。

 

Dsc01266  これで無事に普通のパルスが出た。ただ、どれだけ短くスイッチを押しても、100msちかいONになってしまうのが少し気になるが、とりあえずはもう大丈夫なはずだ。 もういちどロボットアームを組み立てなおす。試運転である。

 

 よーし、これまでへたったと思っていた単一電池でも元気よくアームが動いた。いやいや、お疲れさまでした。10個のボタンの制御はとても快適だ。まわりの消しゴムや、電池(単一でも持ち上る)を掴み、所定の位置に運んだりして遊ぶ。

 

 ロボットアームはワイヤレスで順調に動いた。動かすことが目的なのでこれでプロジェクトは大団円である。しかし、奥歯にものがはさまったように気になるところがまだひとつある。ワイヤレスのタクトスイッチをどれだけ短く打っても、モーターが100から120ms、動きを止めないことである。

 

 これはオシロで測ったときにわかったことなのだが、人間のタクトスイッチの押下の間隔は最小で50msくらいまで短く出来るはずなのにおかしい。実際の動作には殆ど影響がないのだが、何となく気になっている。

 

ロジアナでUDPを解析することを決断する(12/25/2017)

 現在クライアントとサーバーの間のUDP通信は17msという中途半端な時間間隔(オリジナルのまま)で送受信を繰り返しているが、この間隔で最小の動作時間が100ms以上というのは解せない。

 

 こうなってくると、オシロではわからない。もしかすると何かとんでもない動きをしているのかもしれない。データが溢れているのだろうか。UDPのパケットが未読のままだと、どういう状態でデータが残っていくのか、ウェブで調べてもはっきりとしたことはわからない。

 

 気になるといつまでも尾を引く、いやな性格である。オシロではなくロジアナで各部の動きを調べれば相当なところまでわかると思うが、ロジアナは準備が大変なのでなかなか決心がつかなかった。

 

 しかし、UDPの動きを知る良い機会でもある。ちょうど年賀状も出し終わって手が空いたところなので,結局、机の奥にしまってあったロジアナ一式を持ち出すことになった。

 

ロジアナで原因は一発で解明(12/27/2017)

 久しぶりのロジアナである。クライアントとサーバーの双方からプローブを引き出す。スケッチにはGPIO一本をつぶして動作点を記録するコードを追加して再ビルド。幸い双方にはUARTがついているのでこれも利用し、全体の動きを調べることにした。

 

Udpread  その結果、ロジアナはとても正直に実情を伝えてくれた。グラフを見れば一目瞭然である。受信側のデータの有無を調べる関数UDP.parsePacket()が正しく動いていない。暴走を避けるため、この関数を20msほど休んで再発行しているが、そのあとloop()の先頭に戻るので結果としてこの関数を連続して呼んでいることになる。

 

 UDP.parsePacket()は、連続して呼ぶと正しいデータを返さないようだ。いくつか空振りしたあとデータが入って処理が再開される。そのあいだの5回くらいの空振りが100msの原因だった。

 

Udp_read  要するに、Arduinoのloop()の中で、待ち時間を入れずにこのコマンドを実行させるとおかしくなる。まあ、通信関係では良くある、不具合とも言えないトラブルである。それにしても、ロジアナはいとも簡単に原因を解明してくれた。

 

 いやあ、さすがはロジアナだ。原因がわかれば解決は簡単である。loop()のUDP.parsePacket()が連続しないよう10ms程度の待ち時間を設ける。これでボタンの最小時間は50ms程度まで下げることが出来た。

 

 ま、しかし、それで動作が目に見えて早くなったわけでもない。完全な自己満足の世界だ。それでも何となくキビキビと動くように感じで(気のせいに違いないが)、気分が良い。

 

Dsc01276  こんどのスケッチのソースは、殆どが人さまからの借りものなので、ここで公開するのはためらっている。UDPのメッセージを漏らさずGPIOピンに反映させるのに少々手を入れたので、みなさんに使ってもらいたい気もするが、機種依存だろうから余り役に立たないかもしれない。

 

 もしどうしてもということなら、コメントかメールを頂ければ、ご送付申し上げる。

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

2017年12月 8日 (金)

ロボットアームを2台のESP8266でリモコン操縦する

ブレッドボードのテストは順調だがスマホのHTMLタグが難しい(11/13/2017)
 モータードライバーで、ロボットアームをタクトスイッチで動かすことは出来た。これをESP8266のGPIOで制御してやれば、ワイヤレスリモコンが完成する。

 ソフトは、以前クローラーをスマホで動かしたときのESP8266のスケッチが残っている。これを流用すれば良いはずだ。ESP8266のWiFiをAP(アクセスポイント)モードにして、スマホとpeer to peerでつなぎ、スマホの画面から制御する方式である。

 このスケッチの中の制御ピンを増やしてやれば良い。ESP8266のハード周りをもう一度復習する。ESP8266は18本ピンが出ているが、このうちGPIOとして使えるピンは9本だけである。しかも、いくつかはモード切替などのため使えないピンがあり、結局、自由に動かせるピンは、6本しかない(制限付きのものが3本)。ぎりぎりだった。

Dsc01236 以前のスケッチに、動かすGPIOピンを少しづつ増やし、モーターを動かす代わりにLEDをブレッドボード上につけて動かしてみる。LEDは順調に点いたり、消えたりした。

 しかし、問題なのはスマホの方だ。画面上のボタンを増やしていくと、すぐ画面が一杯になり、スクロールしないと、ボタンが押せなくなる。画面のタップで操作性が悪くなっているところへ、画面の移動までして操縦することは、ほぼ不可能だ。

 小さなスマホの画面に、数多くのボタン類をどうレイアウトするかも問題である。はじめ、ボタンをトグルスイッチのようにして、モーターの細かい制御が出来るように考えたが、スマホのタッピング操作は連続させると全く違うactionにとられることがわかってこれは断念する。

Dsc01237 不便だが、それぞれのモーターのボタンはすべて動きの開始だけで、停止は共通のボタン一つにすることにした。それにしても、このボタンに使うHTMLのformタグのレイアウトはとても難しい。行と行の間隔が空きすぎて、ボタンの多い今度のリモコン画面は一面に納まらない。

 formタグを一行に複数置く方法は、幸いウェブにやりかたが載っていた。フォントをさらに小さくするなどして、一画面に納まるようにレイアウトする。もっと良い方法があると思うが、情けないことに新しい方法が思い当たらない。これまでの方法を力づくで片付けていくしかない。

スマホでテスト用のLEDは動いたが、運転するのは無理か(11/14/2017)
 画面が出来た。LEDをタップで光らして見る。点灯は僅か遅れるし、画面だけ見ているならともかく、アームの動きを見ながら、のっぺらな画面をタップする事は目茶目茶難しい。スマホのタップで細かい動きを制御するのはどうも無理な感じがする。

 何か良い方法はないだろうか。色々探してみる。すると、ESP8266同士をサーバー・クライアントでつないでいる記事が見つかった。そうか、スマホでなく、もう一台のESP8266をクライアントにし、これをUARTか、タクトスイッチで動かせば、スマホのタップを使わなくてすむ。

 しかし、これまでWiFiで2台のESP8266を連携させた経験がない。通信のイメージが良くつかめない。STAモードなのか、APモードなのか、TCPかUDPか色々方式がありそうだ。ちゃんと動くのかどうかの確信がない。それに対して今のスマホ方式はとにかく動いている。

 乗り掛かった舟ということもある。今、これをやめるとこれまでの苦労が無駄になる。迷った挙句、とりあえずモーターを動かすところまでやってみて、だめなら2台方式に乗り換えることにする。

オシロの計測では、0.5~0.6秒遅れ。やっぱり諦めるべきか(11/22/2017)
 その前に、スマホ方式の時間遅れをオシロで調べてみることにした。スマホは画面のタップ操作以外に、スマホが反応してから実際にESP8266のGPIOが動くまで、瞬時というわけではなく一息遅れてしまう。これがどれくらいの遅れか実測し、スマホ方式を諦める駄目押しにしたい。Dsc01238_2

 実測と言ってもスマホをタップしたタイミングは、残念ながら電気的に知ることは出来ない。これは別のタクトスイッチとスマホを同時に押して近似することにした。以前、スイッチの同時押しを実装するとき、人間の同時押しというのがどれくらいの誤差があるか測ったことがある。

 それによると、人間は、ずれを5ms以下にすることは殆どできないが、50ms程度の違いなら同時に押せる。今測りたい時間差は数百msの世界なので、この程度なら複数回測って平均をとればよい。

 久しぶりの新型オシロに電源を入れる。ブレッドボードにタクトスイッチを付け、それで手でタクトスイッチとタップを同時に操作し、それをトリガーにESP8266側でONされる時間を画面に出す。

 測定の結果、少々の誤差はあるが、平均では、0.5~0.6秒程度遅れていることが分かった。この前、クローラーをスマホで動かしたときと大体同じ感触だ。クローラーのような大雑把な運転ならともかく、ロボットアームでものをつかむというような、細かい操縦は出来ないだろう。 

スマホの操縦でロボットアームが壊れそう。モーターを分解修理(11/24/2017)
 とにかく、スマホによるロボットアームの動作試験は、やって見ることにした。まだ実装がすんでいないのでブレッドボードを経由して、ロボットアームとESP8266を接続する。Dsc01254

 スマホのWiFiサイトを、画面に出てくるESP8266のアクセスポイントに設定し、適当なブラウザーでアドレスを指定する。よーし、制御画面が出てきた。適当なモーターをONする。良いぞ。モーターが動き始める。記念すべきスマホによるロボットアームの最初の稼働だ。

 しかし、予想した通り、やはり、遅れ時間が大きいうえ、少し焦って画面を見ずにタップすると思った通りの操作にならない。そのうちアームは限界点に達して悲鳴をあげる(このキットのギアは空回り機構がついている)。

 さらに都合の悪いことに、タップを正確にボタン上で行わないと画面が移動して目的のボタンがなくなってしまう。そのうち、モーターのひとつのギヤがかんで空転し始め、慌ててロボットアームの電源を切り離した。やれやれ、落ち着いているときは良いが、すこし焦るとタップ操作は、昨今の高齢者のブレーキとアクセルの踏み間違いと同じになる。Dsc01252

 モーターの空転は、減速ギアボックスの中で、歯車がはずれたようだ。ギアボックスの分解を余儀なくされた。予想通り、画面のタップで、こういう細かい動作を制御することは無理だということが良く分かった。

 タップというのは画面を見ながらでないと正確にできないし、それではロボットアームの動きがわからなくなる。これでスマホで操縦することは完全に諦めがついた。

 やっぱり、もう一台ESP8266を入れて、タクトスイッチを動かすクライアント方式にしよう。ロボットアームの実装は途中でお休みし、ESP8266の2台方式にとりかかった。

2台めのESP8266ブレークアウト基板の制作(11/25/2017)
 ということで、ストックしてあった予備のESP8266のブレークアウト基板の組み立てにとりかかる。これはクライアント用である。久しぶりなのでESP8266の開発環境を復習する。

 結構沢山のピンを事前にセットアップする必要ある。これまでの基板は、便利と思って、I/Oピンソケットをすべて片側に一列に並べたが、ピンの位置の確認に余計な手間がかかり反って非能率だった。その反省を生かして、今度はESP8266のピン両側に分けてピンソケットを並べる。

 書き込みモードとフラッシュブートの切り替えは、スライドスイッチからタクトスイッチに変更する。切り替えは、電源立ち上がりかリセット直後のGPIO0のhigh/lowだけで判断しているようなので、タクトスイッチだけで良い。 Dsc01264

 さらにGPIO15は立ち上がりの時は、必ず、LOWでないと動かないが(これが結構はまる)、立ち上がった後は、制御可能なので、プルダウンはピンヘッダーで変更可能にする。

 大した作業量ではないので、この基板はすぐ出来た。あとは、ロボットアームに実装する作業手順である。ロボットアームの基板は小さく、リセットスイッチなどは載せられないから、どこかでスケッチを焼いてから、持ち込む必要がある。

Aitendoピッチ変換基板で実装するESP8266を用意する(11/27/2017)

 作業手順を検討した結果、ESP8266の稼働用の基板がもうひとついることが分かった。リセットや書き込み用のボタンは必要ないが、立ち上がりに必要ないくつかの設定がある。立ち上がりモードの設定(GPIO0)、GPIO2のプルアップと、GPIO15のプルダウンである。

 ロボットアームの基板の平面上は確保したが、ESP8266のピッチ変換基板のピンヘッダーの高さが意外に大きく、普通にシングルラインのICソケットにつけていたのでは、カバーが入らないか、下のフレームにぶつかってしまう。

 実は、前からこのことに気づき、色々調べていたのだが、ふとしたことで良さそうな案を思いついた。秋月が売っている汎用基板に厚さが0.8ミリの薄い基板があることを知って閃いた。これにICソケットをハンダ付けし、この基板をESP8266の裏側に入れてESP8266をはさむ。Dsc01258

 こうすると、ICソケットの高さ分が低くなり、カバーの中におさまる。ESP8266の立ち上がりに必要な部品は、この薄い基板に配線できる。なかなか良いアイデアだと自己満足する。

 そのうち、Aitendoのピッチ変換基板の裏には、初期設定用のプリント配線が用意されており、あらためて配線しなくても実装できることを発見した。

 このプリント配線だが、リセットやENABLEのプルアップ抵抗のランドは、2010くらいあるのに、GPIO0や、GPIO15などのランドは非常に狭い。1005よりもっと狭い。これはあとになってわかったのだが、このランドはハンダブリッジの間隔で、チップ抵抗を置くランドではなかった。直接VccやGNDに落としてもOKだということなのかもしれないが、何となく不安だ。

 で、これまでのストックから、1005クラスのチップ抵抗を探し、ランドを削って正式なプルアップ/プルダウン配線にすることにした。しかし、こんな小さな抵抗の手持ちはない。

そこで、物入れから、ジャンク基板(結構たまった)や、歴代の不良HDDなどを掘り出して、1005に近いプルダウンになる10KΩ程度のチップ抵抗を探した。

 思ったより簡単に見つかった。ハンダごてだけで採集する。例の低温ハンダを使うまでもない。少し周りを長い間あてていれば、チップ抵抗くらいだと自然に動き出すので、取りだすのは簡単だ。

 何とか必要な数のチップ抵抗を確保し、やっとのことでつけたのだが、案の定、一か所テンプラハンダをやってしまった。ランドが小さすぎて片側が接触不良になっていたのである。Dsc01251

 写真ではよくわからないが、左側がつながっていない。これで数時間を無駄にした。チップ部品は、片側が固定されてしまうと、残りの部分の接触不良は目検や、物理的な検証(部品を触る)では簡単には見つからないことを学ぶ。

 それにしても、残してあったHDDは不良品もふくめて5個以上ある。Appleマッキントッシュ時代の160MB(GBではありません)、SCSII(スカジー、これは死語か)DISKを見つけて感慨無量である。あのころは100MBを越す容量は大容量だったのだ。このあたりのチップ部品は、2010ではなくもっと大きいので、最近の基板には大きすぎて使えないのが残念である。

UDPでLEDを制御するスケッチを見つけた(12/1/2017)
 2台のESP8266の接続を紹介するサイトは、探してみたら結構沢山見つかった。参考になりそうなスケッチ(ソースコード)もあちこちにある。いくつか見て手続きの簡単なUDPで行うことにする。ここのソースコードを拝借することにした。4つのLEDの点滅を別のESP8266で実現している。こちらと全く同じだ。動画も公開されており、見たところレスポンスも速い。

 Arduinoには沢山のライブラリーがあるのでUDPを動かすのは、とても簡単なようだ。UDPを知らなくても、単にソケットをオープンしてそこへデータを流し込むだけである。クライアント側は、ソケットにデータが来るのをループで待って、それを読むだけである。

 こちらも2台のESP8266とLEDで実験してみた。最初は全く動かなかった。動かなかった理由は、お恥ずかしいながら全く基本的なところである。拝借したソースコードのSSIDとパスコードを自分のところに変えていなかっただけのことである。Dsc01256

 UDPが今一つ理解できていない証拠である。ソースコードの中の、WiFiのSSIDとパスコードが'*'になっているのを見て、UDPではそうするのかと、そのままにしてあったというオチである。良く考えれば、WiFiのこことUDPとは何の関係もないのだが、思い込みというのは恐ろしい。これに気付くまでまた数時間を浪費した。

 2台のESP8266のWiFiを正しく設定して、UDPを使ったリモコンLEDは全く問題なく動作した。動きも速い。案ずるより産むがやすしである。もっと早くこの方式にすれば良かった。

 ついでにオシロで遅れ時間を測定した。今度は両方とも電気的に問題なく採集できる。良いぞ。最小5ms、最大でも20ms以内にレスポンスが返ってきた。スマホ経由のTCP/IPのサーバー経由なら数百msオーダーだったやつだ。

やった、タクトスイッチのUDP接続でロボットアーム快調に動く(12/6/2017)
 ここまで来たら、もうあと一歩である。ブレッドボードを何枚か連ねてバラックでモータードライバーの制御線をESP8266のGPIOにつなぎ、もうひとつのブレッドボードにタクトスイッチを並べてクライアントを組み上げる。

 あれえ。クライアントのGPIO16だけが一旦、0(active)になると1(stop)に戻らない。試行錯誤の結果GPIO16はプルアップが必要とわかった。10KΩの抵抗を入れてしのぐ。Dsc01263

 早く結果が見たいので、一部のモーターだけの結線にして、UDP接続を確かめる。UARTを動かして接続をモニターしながら、テスト開始。

 やった。とても機敏にモーターが動いたり止まったりする。スマホとは比較にならないレスポンスだ。全く問題ない。ところがしばらく動かしている間に、突然モーターが止まらなくなった。あわててロボットアームの主電源を切り離す。暴走だ。こういう機械で最も避けねばならない現象である。不安がよぎる。

 冷静になって、慎重にソースコードを見直した。ははーん、原因がわかったぞ。サーバーは常にクライアントからのUDPメッセージを待ち続け、切れても再接続の初期手続きをやりなおしてループしている。

 GPIOの状態はどうだ。あらあら、通信が途絶えても、前の状態を続けたままだ。これではクライアントの接続が切れると同時に、前の状況のまま暴走する。

 良かった。これが原因に違いない。LEDなら付きっぱなしでも実害はないが、モーターの場合は致命的だ。サーバー側に、通信が途切れれば、必ずすべてのモーターの駆動を止めるステップを加えた。その結果、動きは安定し、今までのところこのトラブルは再現していない。Dsc01260

 ESP8266基板に正式にモータードライバーの制御線を接続し、所定の基板スペースにセットして一段落である。記念撮影する。テストをやりすぎたので電池がへたり、モーターの動きが鈍くなってしまったが、すべてのモーターがリモコンで動くというのは気持ちが良い。

やれやれこれでロボットアームのリモコン化は一段落である。

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