ハードウェア」カテゴリーアーカイブ

ESP8266ボードにジャイロを搭載した

ESP8266ボードにジャイロを搭載した

Elecrowに出していた基板のVer.2が納品されたので早速リフローしました。

なんと今度はジャイロ搭載です!

記載の動画は、ジャイロの情報をESP8266経由でシリアルに流して、それをPCのProcessing上で動くアニメーターで受けて思うがままに追従させるデモです。

もちろん、ESP8266はWiFi SoCですから、UDPパケットにして送信したりすればシリアルラインは不要となります。また、今回のオリジナルボードにはリチウムポリマーの端子がついているので、完全ノンワイヤーで動かすことができます。

何に使うの?

今回使ったMPU-6050は、加速度とジャイロ(角速度)の2種類のセンサーと、DMPというモーションプロセッサが内蔵されたチップです。こういうユニットのことを、一般にはInertial Measurement Unit(IMU)と言って、自動制御には欠かせない部品です。センサーですから単体で何ができるかというわけではありませんが・・・そうだな・・・一般には、ドローンに1個は必ず搭載されているもの、であって、自動運転自動車とか多関節の歩行ロボットだと複数個ついていてセンサーデータを統合しながら動いているんですね。まあ「ロボット用」と言って差し支えないと思います。

QFNパッケージ

今回のオリジナルボードの場合、ESP8266のIO4,IO5をI2CバスとしてMPU-6050が接続されています。IO15ははんだジャンパで割り込み入力用に割り当てることができます。IO12,IO13,IO14はSPIバス用に開放されていますので、モータードライバー等をSPIバスに接続すれば、これは「WiFiでコントロール可能なドローンの頭脳」として活用することが可能なわけです。

ま、そこまでできないですが(^^;自動制御よくわかんないし。でも、単純にrawデータを得るだけでも、デジタルガジェットとしてのGUIの改善などに役立てることができるでしょう(iPhoneアプリでよくある、横に向けると画面も横になる、みたいなやつです)。

ちょっと高くなってしまうけど、おおよそボードの仕様が固まりつつあるかなーという感じです。本音を言うと、QFN24ピンのはんだ付けが一番大変でした・・・・

ESP8266にmicropythonをインスコ

言語micropython

せっかく画面付きのマイコンが手に入ったので、その上で遊べるインタプリタ言語があれば色々楽しめるかなと思っていました。最も有名なのはNodeMCU上のLua言語だと思います。LuaはTokyoTyrantの組み込みプロシージャ拡張でも使ったことがあるので馴染みがあります。ESP8266界隈では最も普及しており情報も豊富なのですが、私はひねくれものなので別の言語を探しました。

しばらく調べているとmicropythonというものがあることがわかりました。元々Kickstarterで募集していた「pyboard」というSTMicro SoC搭載のマイコンボード上で動く組込用Pythonのようです。これがESP8266にも移植されているということのようです。

さっそくgitから色々引っ張ってきてコンパイル。若干苦労しましたが書き込み自体は割と簡単でした。ターミナルつないで動かしてみると、ちゃんとプロンプトが出て、その中でLEDを光らせたり、OLEDに文字列を表示できたりするのは、なかなか箱庭感覚で不思議なものです。どうせならPS/2キーボード付けて完全スタンドアロンにしたい衝動にかられます。

saveができない

しかし・・・一通り楽しんで・・・ありゃ?これはREPL(インタプリタ)単体でスクリプトを書けないの???WebREPL(別のPCからWebブラウザで見るためのWebUI)を起動するか、webrepl_cli.pyというスクリプトで外部から接続しないといけなそうなのです。間違いだったらすみません。

もう少し、手軽に使えるものだとばかり思っていました。そりゃ今は確かに仮想端末でUSBシリアルでつないで文字入力してますが、必ずPCが必要というのはちょっと夢がないような(完全に難癖ですが)。でも、UNIXサーバでの開発がそうであるように、まずインタプリタで試して、再現した手順をバッチに保存したい、みたいな用途は絶対あると思うのですよね。

ちょっとソースを読もうと思いましたが、完全に荷が勝ちすぎております。どなたか解決方法あれば教えてくだされ。

 

ESPタイニーサイネージを作った

ESPタイニーサイネージを作った

長かったが、ようやくできました!

ESPタイニーサイネージ

ベース基板は↓のような感じ。ホームリフローでも、がんばればこんなミニ基板が作れるのね。

ベースボード

ベース基板には、WiFi SoCのESP8266EX W-ROOM-02をメインとして、フルカラーLEDのWS2812Bが載っています。電源はマイクロUSB端子以外に、リチウムイオンポリマー電池も使えます。

残念ながら、USBシリアル変換チップは載っていません。USB端子は本当に電源だけの利用です。これは、省スペースと低消費電力化のためです。開発時にしか使いませんから・・・・

スイッチサイエンスの5V/3.3VUSBシリアル変換

開発したい場合は、スイッチサイエンスのFTDI USBシリアル変換アダプター(5V/3.3V切り替え機能付き)をぶっさすと、Arduinoでプログラミングできるようになります。上記のはお高めですが、Arduino micro互換のピン配列のUSBシリアル(DTRが6番ピンに来ているもの)なら大丈夫です。

なお、eBayやAliexpressで$5くらいで売っている(電子工作では定番な)有機ELディスプレイ(128×64ドット)ボードが、ちょうど乗っかるようにi2c端子が生えています。最初の写真はディスプレイをつけたものです。

開発目的

覚えてらっしゃるでしょうか?その昔、Chumbyというデジタルガジェットがあったことを。

chumby

LinuxとAdobe Flash Lite(だったような)が載っていて、アプリもいろいろ入れ替えて使える、WiFi付きの時計、みたいなガジェットでした。言うまでもなく”スマホ”にやられてしまいましたが・・・(*_*)

そう、スマホ、iOSやAndroidの通知機能は便利ですよね。しかし、「認知」=「事象の存在そのものを把握する」ということに関しては、単一の画面、単一のデバイスのスマートフォンだけに頼っていいのだろうか?という疑問が私にはあるわけです。

むしろ、人間はデバイスを持たず、ありとあらゆるところ、キッチン、玄関、廊下、ベットサイド、そこら中に表示デバイスがあれば、ロックを解除して通知画面をフリックしてアプリを起動して・・・とやらなくても良いんじゃないかと。かなりパッシブな情報提供でも事足りるのではないかと。本来の意味でのユビキタスコンピューティングですね。

例えば、朝もうあと1分で家を出なきゃ遅刻しちゃう、でも今日傘持っていく必要があるか知りたい!テレビのDボタン?いやテレビは消しちゃった、スマホスマホ・・・Yahoo天気を起動、遅い!みたいなことをやらなくても、玄関でLEDが水色に光ってたら傘を持っていく、というシンプルな仕組みにしたいのです。

これ、実は世間様ではすでに実現されていますよね。街頭や山手線内の「デジタルサイネージ」として。だから私は「ホームサイネージ」を作ればいいんじゃないかと。で、出来たのが、このしょぼい自作デバイスというわけです。私は本当はLinuxが得意なので、RaspberryPiで作れば何もしなくても済んだのかもしれませんが、RaspberryPiはパッシブ表示デバイスとして扱うには、ちょっとでかくてお高くてリッチで、鶏を割くに焉んぞ牛刀を用いん感が無きにもあらず。画面もついていませんし。

てなわけで、この界隈では「タイニー」と付ければしょぼくても許される気風がある(ねえよ)と勝手に思っているので、名前は「ESPタイニーサイネージ」です。

ElecrowでV-CUTした基板が届いた

ElecrowでV-CUTした基板が届いた

裏面

  • 4/26 受付
  • 4/27 PCBプロセシング
  • 4/28 プロダクション(製造開始)
  • 5/12 発送(EMS)
  • 5/16 到着

製造・・・時間かかったナア・・・やはり、面付けは向こうのエンジニアにとっても面倒のようだ。付けられたV-CUT(溝)は、シュリンクパッケージの上からはイマイチわからないくらい薄いものだった。本当に切れてるの??

V-CUT断面

おー?!確かに切れてる

しかし・・・・基板の真ん中を通るラインは軽く力をかけただけでも折れそうなのだが、端っこの6mmのテクノロジーエッジの部分は文字通りテコでも割れない(^^;

応力がかかる部分には相応の面積がないと力が伝わらないようだ、かといってラジオペンチなどで部分的に加圧すると、ガラスエポキシ基板に捻じれの力が加わって良くなさそう。

うーん、やはり素人には面付けはオーバーテクノロジだったか・・・テクノロジーエッジは10mm以上とりましょう。ぱんだとの約束だ!

両面PCBステンシル

ついでなので、両面用ステンジルも公開。

両面ステンシル

単純に両面分並べてあるだけだけれども・・・こんなの自作するのは100%不可能だねご家庭カッティングマシンで作る方法があることはわかるけど、金属ステンシル1700円ちょっとで作ってくれるなら作ってもらったほうがいいよ絶対。

地味に良かったこと

面付けすると、テクノロジーエッジという「余白」を作ることになるが、ふと思い立って、そのエッジに直径3mmのホールを四隅にあけておいたら、なんとPCBステンシルにも同じ穴をあけてくれており、位置合わせがすごぶるし易かった。普通の基板のときは、そんなことしてくれたことはないので、多分業界では当たり前のことなんだろうと思う。

ESP8266開発ボードの設計者に物申す

ESP8266EX

これだけ普及しているESP8266EX(W-ROOM-02)について、素人がつまらないこと2点だけ言いたいので書きます。

RSTのプルアップ抵抗について

そこらの掲示板を読むと、10kオームでは動かない、3kオームでないといけないとか、色々書いてありますよね。きちんとプルアップ抵抗つけないとリセットできないとかブートしないとか。

でも、ESP8266EX Hardware Design Guideを見るとですね・・・

esp8266_rst

・・・・・・・

・・・

プルアップ抵抗5.1k入ってるよね?

いらないよね?外付けのプルアップ抵抗。もしかしたら3kは意味あるかもしれないけど、5.1kオーム以上のものはすべて無効だよね?

チップ単体で測定すると、だいたい4.8kオームくらいなので辻褄はあっている感じですがどうでしょうか?

CHIP_EN信号について

これも巷の掲示板読むと「仕様が途中で変更されて3kじゃなく1kオームじゃないと動かない!」とか書いてあります。あと、電源が1A以上の余裕のあるものじゃないと動かないとか、ひどいのになると1000μFのデカップリングコンデンサがあれば大丈夫とか書いてありますが・・・

件のガイドにはこう書いてあるんですよ。しかもデカデカとNOTICEに。

ESP8266_EN

要するに安定するまでEN信号は遅延させよう、ということなのです。模式的な回路にするとこんな感じ。

ESP8266_EN2

さらにENは元々プルアップされているわけだから、実際は抵抗も必要なく、コンデンサ1つ足すだけなのですね。ご丁寧に容量例まで書いてあるのだから従うべきでは?

ところが、この世界ではデファクトに近いスイッチサイエンスのW-ROOM-02開発ボードでさえ省略されちゃってるのよね。不思議ですね~(※決して煽っているわけではなく)

まあ、強引な理由を考えると、ESP8266EXの低消費電力通信機能ESP NOWを使おうとしたとき、遅延するだけ消費電力が延びることを憂慮して・・・とか考えたのですが、ぶっちゃけ仕様書読んでないだけでしょう。他人の作った回路図パチってるだけだといずれは手酷いやけどをすることになると思いますよ。

「H/W設計するなら仕様書くらい読みましょうよ!」言いたいことは以上です。

 

620円で8chロジアナが買えた話

620円で8chロジアナが買えた話

仮にも基板を開発しようというのに、測定機器が20年前のFluke社のテスターのみというのは流石に無理がありました。どうしようもなくて、会社のデジタルオシロを借りたこともありますが、職場で趣味のことをやるのは休み時間であっても肩身の狭いものです。

そこで、またAliexpressネタで恐縮ですが・・・1ヶ月くらい前にUSBロジックアナライザを注文していました。

中華製ロジアナ

$5.74(620円)で!

安すぎぃ!気が狂っている。まあ、どうみても高周波は測れそうにない外観ですし、プローブも付いていないです。でもデジタル回路設計では「信号が正しく出力されているか」ということがわかるだけでも大変助かります。テスターじゃ1Hz以上は絶対にわからないからね!

ソフトのインストールは簡単でした。Debianの場合リポジトリにpulseviewというGUIソフトが含まれているため、

# apt-get install pulseview

で必要なものは全て入りました。pulseviewを起動し、メニューFile→Connect to Device→Driver:fx2lafwと選択して、出てきたデバイス名「Saleae Logic with 8 channels」を選択するとすぐ使える状態になります。

デバイス認識

ここまで5分かかるかかからないか。

WS2812B信号

種明かし「海賊版」だから安い

設定画面のデバイス名を見て、勘の良い人はピンと来たと思いますが、これは海賊版です。Saleae社が昔売っていたロジックアナライザのハードウェアをコピーしたものです。

どういうことか?二昔前にUSB周辺機器を作る際には定番となっていた、Cypress社のCY7C63001A(EZ-USBシリーズ)というチップがありました。昔は、周辺機器に内蔵するマイコンは非常にプアで、USB2.0の400Mbpsという速度は神々の扱うスループットでした。そのためプログラマブルでマルチコア(複数のデジタル信号を並列処理できる)なEZ-USBチップが作られたという経緯があります。

Saleae社は、この高速USBのためのチップを、デジタル信号のキャプチャ装置に流用するという「発明」をした訳です。これは極めてソフト的な発明です。ハード自体はCypress社のリファレンスそのままでした。今回の海賊版も、Saleae社の基板をコピーした訳ではないようです。このため、オープンソースのpulseview(sigrokとlibusb)で使うのであれば違法性は全くありません。

しかし・・・そこは流石中華クォリティというべきか。今回買ったUSBロジアナにはSaleae社のベンダーID, プロダクトIDが、ご丁寧に書き込まれているのですよ。鬼かよ。なので、Saleae社純正のWindowsソフトでもきっちり認識し・・・・

saleae logic

実際に信号も取り込めました・・・

動いちゃうじゃん(i2c)

噂では、Saleae社は、この海賊行為を非常に怒っていて、ハードウェアチェックをして最新のソフトでは起動しないようになっているはずなのですが。1日前にダウンロードした試用版では何事もなく認識しました。

いや、もちろんWindowsで使う気は毛頭ないですけどね!

そりゃね、ぼくもまともなロジックアナライザ、デジタルオシロがほしいですよ!!寄付はいつでも受け付けております!!

ESP8266で有機ELディスプレイ

ESP8266で有機ELディスプレイ

SSD1306 OLED

本来、ESP8266をセンサーハードウェアと考えると、ディスプレイなど必要ないのですが、試作やデバック時には動作状態を表示できるデバイスがあると心強いです。シリアルコンソールだと別途PCが必要ですし、Webサーバとしてスマホからアクセス・・・でもいいですが、最初の1歩目をどうするか(WiFiのSSIDの設定とか!)という問題が残ります。

そこでAliexpressでi2c接続の0.96インチ有機ELディスプレイを買いました。中華クォリティよろしく、写真と全く異なる物理形状ピンアサインのものが届いたけど、一応問題なく動作したので文句は言わないことにします。

esp8266-oled-ssd1306ドライバ

Arduino用のドライバは、squix78/esp8266-oled-ssd1306を使いました。非常に高機能のようですが、単純に使うこともできます。

初期化

SSD1306 display(oled_addr, I2C_SDA_PIN, I2C_SCL_PIN);


 display.init();
 display.flipScreenVertically();
 display.displayOn();

画面の削除と更新

display.clear();
display.display();

文字列描画

display.setFont(ArialMT_Plain_10);
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.drawString(99, 54, string);

ビットマップ表示

display.drawXbm(72, -8, clouds_width, clouds_height, 
(const char*)clouds_bits);

これだけでも十分過ぎるくらい便利です。

使用感など

このライブラリ、標準フォントもとても綺麗で128×64しかないディスプレイでもかなりの情報を表示することができました。マジお勧めです。

あとわずか$5の有機ELモジュールも、反射液晶などとは見え方が全然違って、画面自体は小さくても、かなり遠くからでも視認できます。いつまで持つか(安い有機ELはシーリングが甘く寿命が短い)は未知数ですが、工作用としては十分以上です。

なお、ESP8266との接続はSDAをIO5, SCLをIO4に割り当てることでスムーズに接続できました。たぶんESP8266 SDKのWireクラスのデフォルト値でもあるでしょうから、他のデバイスとの共存も容易にできることでしょう。

とりあえず、今は天気予報時計を作っています。

 

 

EAGLE CADで面付けをする

EAGLE CADで面付けをする

そろそろ旬を過ぎるであろうESP8266(WiFi SoC)を使ったボードを急いで設計しています。今までの反省を元に、必要な機能だけをコンパクトにまとめることを目標に作業を進めています。

ESP IoT Board

ボードサイズは43mm x 28mmに抑えました。28mmは、電子工作の世界では一般的なフリスクケース(内寸 60mm x 28.5mm x 8.5mm)を流用することを考えて決定しました。

でも、この小さな基板1枚1枚に、クリームはんだを塗って、チップ部品を乗せ、リフロー炉で焼く・・・という作業を繰り返す想像をすると、かなり憂鬱になります。できれば作業はある程度まとめてやりたいですね。

そこで面付けという作業を行います。面付けとは、同一設計データを、1枚の基板上に、タイル状に並べることです。合体してたら困るじゃん!と思うのですが、V-CUTという溝を掘ってもらうようにすることで、後で切り離せるようにします。

くっつけて、ある程度大きい基板にしておくと、一度に何枚分かの基板をリフローできるので作業効率が激しくアップします。

今まではSingle PCB with millingという発注の仕方でした。millingは一般にフライス盤のことですが、どうも基板の世界ではドリルミリングカッターを指すようです。曲線などの複雑なカットができる半面、少々割高でした。一般に、試作ならこれでもいいんですけどね。面付けは基板の自由度が減る半面、少しだけコスト削減にもなります。

面付けの条件

Eagle-7.xでは、メニューのToolsにもろに「Panelize」というツールがあるので、これを使いましょう。EAGLEでは、単純に回路データをコピペすると、部品につけられた連番名(抵抗だとR1,R2…,みたいなもの)がインクリメントされてしまいます。先ほどのツールは、コピー元のtNames, bNamesレイヤーに書かれた連番名を、_tNames(125番), _bNames(126番)などに写像してくれるだけのツールです。

もう少し・・・融通が利かせられればいいだけなのにねえ・・・

手順としては以下のようになります。

  1. 元のボードデータから基板外形含めた全てをコピーする
  2. 新しいボードデータファイルを開いてペーストする
  3. 「Panelize」を実行する
  4. 改めて新しいボードデータをコピペして増やす
  5. 元データから来たDimensionレイヤーの線をすべて消す
  6. ドリル穴などが重複した箇所は個別に消す
  7. _bsilk(122番)にlongdot線でV-CUTラインを描く
  8. 新しい外形をDimensionレイヤーに描く
  9. 新しいボードデータをセーブする
  10. CAM Processerを起動して、silk bottomのbNamesのチェックを外し_bsilk, _bNamesをチェック、silk topのtNamesのチェックを外し_tsilk, _tNamesをチェックしてProcessing

ああ、面倒くさ。

vcutラインの書き方

Elecrowの場合、面付けの制約条件は以下のようなもののようです。

  1. ボードの大きさが 80mm x 80mm以上
  2. 前期サイズを満たすようにテクノロジーエッジを追加
  3. V-CUTラインが外形から6mm以上離れている
  4. V-CUTラインはシルク面に描く
  5. 設計データは全く同一でなければならない(異形データ混合は×)
  6. ボードの向きは同一方向でなければならない(互い違いなどは×)

1,2,3の条件は簡単で、6mm幅の余白を四方に追加すれば満たします。しかし、5,6の条件はEAGLE Lightが80mm x 100mmまでしか設計できないんで割と厳しいですね。自由に貼れるものだとばかり思っていました。せめてLightのサイズが正方形だったら良かったのに(縦横を交換することもできない、あくまで縦が80mm)・・・・

結局4枚しか配置できませんでした。果たしてきちんと出来上がってくるでしょうか・・・

PCBステンシルと面付け

余談ですが、ここまで踏み込んで書いている人は(少なくともWebでは)いなさそうなので書いておきます。Elecrowの場合、割と安くステンシルを作ってくれますが、今回設計したボードのように、表裏双方に表面実装部品がある場合、以下の2種類から選べます。

  • 基板の倍面積のステンシルに、表面、裏面を並べる
  • 表面、裏面、2枚のステンシルを作成

前者の場合は、Elecrowの場合150mm x 150mmのステンシルと200mm x 200mmのステンシルは値段が変わりませんから、100mm x 100mmまでの基板であれば収まりますのでお得です。しかし、自分で部品実装をしてみればわかりますが、ステンシルの取り回しは作業効率に大きく影響しますから、あまりお勧めできません。

後者の場合は、大変素直ですが、お金は倍かかります。標準料金より増えた分のお金は、Premium PCB Serviceというページで$1単位で追加で払います。

あと、面付けすると、あたりまえですが面付けした分のすべての穴があいたステンシルが来るようです。1個1個ずらしてスキージーでなめなくてもいいんだ!

来たらまたご報告します。

ESP8266からWS2812Bを光らす

ESP8266からWS2812Bを光らす

マイコンに表示機器が一切ないとデバッグ用にシリアルラインでもつながないと状態が全くわかりません。そこでフルカラーLEDでもつければ、遠くからでも様子がわかるなーと思って、電子工作界隈では有名なWS2812Bをつけてみようと思ったわけです。

こいつの特徴は、マイコンが内蔵されており、わずか1本のデータ線でRGBすべての制御ができ、かつデイジーチェインが可能で数十個数珠繋ぎになったLEDテープを一挙に制御可能ということ。使えれば工作の幅が広がりそうです。

VDDが3.5~5.3VでかつHysteresis voltageが0.35Vだから、ちょっと3.3Vオンリーで動作させるのは厳しい…ESP8266は5Vトレラントではないから信号線の3.3V→5Vレベルシフト回路が必要です。

世間の作例だと、3.3Vのまま動かしていたり3.7VのLiPOバッテリーを電源に使ったりしてレベル変換もせず動かしているものが多いのですが、点滅が不安定とかデイジーチェインの1個めだけ光らないとか、不具合も多いよう。

普通に正攻法でBSS138 MOSFETを使ってレベル変換回路かけばいいんちゃうか?と思って、以下のような回路を作って基板を起こしました。

WS2816B_BSS138

まー普通に動くでしょ?こんなの・・・と思ってたら見事に動かず。かなり苦労しました。
ライブラリは世間一般に使われているAdafruit NeoPixelでは動かなくて、Makuna NeoPixelBusのBitbangモードでだけ動き、しかも特定の組み合わせの色が白になってしまう。

不安定すぎんだろ!!

データシートを見る限り、1ビットのH信号を出すために、850nsのHを出した後450nsのLを出力、誤差は150ns以内ということですから、いくらARMコアが速くてもソフトだけでこのタイミングを生成するのは相当荷が重いでしょう。Bitbangモードは、使えるIOピンを選ばない利点がありますが、この微小なタイミング生成をソフトでやるので、ESP8266が忙しくなりすぎてWiFi通信が不安定になったり勝手にリセットがかかったりするそうです。やはりSPIやUARTのようなハード的なバッファを持ったモードで動作させたくなりますね。

うーん。いわゆるハッキング、マッシュアップのレベルでは「簡単にできた」と表現されるWS2812Bですが、実物はかなりの難物との印象です(少なくとも私のような素人には)

結局どうしたの?

結論だけ聞くと簡単そうに聞こえるでしょうが、「BSS138のプルアップ抵抗を100kΩ→1kΩにしただけ」で動きました(≧▽≦;)

参考になった記事はTesting level shifters for running Adafruit NeoPixel strips from a 3.3 Volt Teensyでした。どうもBSS138をはさむことで信号が鈍るようなんです。

私みたいにソフト・サーバ屋から電子回路に入ってきた人間には想像もつかないことですが、本来コンデンサではないはずの部品や回路配線自体に寄生容量というものが存在するそうです。これがコンデンサとして働いてしまう。この寄生容量(C)とプルアップ抵抗(R)で、RC遅延回路が形成されてしまう。すると信号の立ち上がりに遅れが生じて、方形が山形状の波形に鈍ってしまうと。

Bitbangモードだけで動いた、その理由は具体的にはわからないのですが、オシロで確認した限りでは生成された波形にかなり違いがありました。ちなみに出している信号はR=128, G=0, B=0です。Rの上位1ビットだけがHということですね。

int PixelPin = 5;
NeoPixelBus<NeoGrbFeature, NeoEsp8266BitBang800KbpsMethod> 
strip(PixelCount, PixelPin);

neopixel_bitbang_io5

int PixelPin = 2;
NeoPixelBus<NeoGrbFeature, NeoEsp8266Uart800KbpsMethod> 
strip(PixelCount, PixelPin);

neopixel_uart1

この違い、わかります?全体の長さも違いますが、Bitbangモードの方がH信号の山部分が平坦かつ長いんですね。つまりBitbangの方が正確なんですよ。UARTバッファモードは、元々シリアル通信の生成に使うハードウェア機能を流用して作られたものですから、本来の信号のためのクロックをだましだまし使うということになります。そりゃそうだ、WS2812B専用の回路を持つマイコンなんて存在しないから。

これが影響しているんじゃないかなー・・・・と個人的には思っているのですが、宮仕え先のオシロは仕事の都合で返してしまったので、結局調べられていません。

オシロほしいですね・・・・・まともなものは10万くらいしますから到底買えませんけども・・・お金ほしいですね・・・お金ください!!!(血涙

ESP8266のSPI通信周りをオシロで確認した

ESP8266に手を出したワケ

今まで作ってきたボードはRaspberry Pi前提で、車両からCANデータを取得するものでした。ちょっと回路の間違いはあったけど一応動いている。でも、ボード単体でCANデータを送信できるようにしたり、ちょっとした解析ができれば、便利ではないかと思った。それには通信機能がついているマイコンが必要だ。

ESP WROOM-02開発ボード

ここ1年くらいで急速に盛り上がってきたESP8266というWiFiチップがある。WiFiチップと言っても、Arduino IDEで開発できる単体マイコンでもあるから、他にマイコンは要らないわけだ。チップ単体だと500円を切っており、ヘタにArduinoボードを買うより安いというのも痺れる。

前回まで作っていたCANボードの搭載チップMCP2515はSPI接続だから、ESP8266のSPI APIを使おうとしたのです。

動かない・・・

ところが動かないんだなこれが。Arduino用のMCP2515ライブラリをESP8266で動くように移植していたのだが、テコでも動かない。レジスタも読めない。

ESP8266にはSPIとHSPIという2種類があるようなのだが・・・世間様の情報を見ても、なぜ2つあるのか全くわからなかったのだ。また、SPIにはArduino SDKでサポートされているArduino互換のSPI APIと、MetalPhreak: ESP8266_SPI_Driverの2種類あるのもなぞだった。
たまらず先人に質問したりしたのだが、接続等も間違っていないようだし。これはソフト的な問題なのか、それともチップ内部で使っているSPI接続(フラッシュメモリ)との競合なのか、などとと謎は増すばかり。

しかし、基板まで作っておいて手元にはテスター以外の計測器がなく・・・「わからないときはモノに聞け!」とばかりに宮仕え先のオシロをひっぱりだしてしまった。

ESP8266のSPI通信周りをオシロで確認した

まず、疑ったのはSPIのモード。SPI通信には4種類のモードがある。mbedのSPIマスターのWikiがまとまっている。Arduino ESP8266 SDKの標準SPIだとMODE0しかサポートしていないそうなので、MetalPhreak: ESP8266_SPI_Driverを使ってテストした。

ヘッダファイルのコメントには、

///////////////////////////////////////////////////////////////////
//
// Function Name: spi_mode
// Description: Configures SPI mode parameters for clock edge and
 clock polarity.
// Parameters: spi_no - SPI (0) or HSPI (1)
// spi_cpha - (0) Data is valid on clock leading edge
// (1) Data is valid on clock trailing edge
// spi_cpol - (0) Clock is low when inactive
// (1) Clock is high when inactive
//
///////////////////////////////////////////////////////////////////
void spi_mode(uint8 spi_no, uint8 spi_cpha,uint8 spi_cpol)

こう書いてあるので自然と、

spi_mode(HSPI, 0, 0);

と書いてしまっていた。この状態でオシロでクロック出力を観察しようとすると・・・

hspi_0_0

信号!出てねえ!!

マジかよ。ちなみに緑がクロック、水色がスレーブ信号出力(MISO)です。SPI通信の場合、クロック供給はホスト側(マイコン)がやるのでクロックが出ていないのは明らかに異常・・・・だと思うのですがどうでしょう?

spi_mode(HSPI, 1, 0);

hspi_1_0

あ、これがArduino一般で言うところのMODE0じゃないのか?

spi_mode(HSPI, 0, 1);

hspi_0_1

んークロックが負論理になっててラッチ先行だからMODE2ですよね。

spi_mode(HSPI, 1, 1);

hspi_1_1

クロックが負論理で、シフト先行だから、MODE3ですよね。

おい!MODE1どこいった!!とにかくspi_mode(HSPI, 0, 0)だと動きそうにないことはわかった。ちなみにこの初期化をしない(デフォルト)で波形を観察すると、デフォルトはspi_mode(HSPI, 1, 0)のようです。なんかモヤモヤするけど、とりあえずの観察結果は以上です。MCP2515はMODE0とMODE3をサポートしているから、デフォルトでOKなのかしら(確認していない)

たぶん、何か勘違いしていると思いますが、現場からは以上です。

SPIとHSPIの違い

もうひとつの疑問。HSPIとSPIの違いは・・・実はよくわかりませんでした。速度差なのかな?と思って速度を調べてみました。

SPIのほうはArduino標準APIに沿っているので最大ホストクロックの2分周(DIV2)のようです。この場合の波形は以下のようになります。

SPI_MODE0_DIV2

1クロック(立ち上がり立下り)でだいたい150nsだから、周波数に直すと約6.6MHzですかね。まあ大半の用途では十分でしょう。

一方でMetalPhreak: ESP8266_SPI_Driverのspi_clock(HSPI, 1, 2);の場合は以下のような波形になりました。

HSPI_CLK_1_2

60nsに2クロック入っているように見えます。だから周波数に直すと33MHzも出ているということになります。この設定では信号がかなり鈍ってしまってますので、実際に基板パターンをひきまわしてペリフェラルと33Mbpsで通信ができるとは限りませんが・・・確かに速いですね。

MCP2515の場合10MbpsまでサポートしていますからHSPIの方がよさそうです。デバイスにもよりますが画像取り込みもできる速度だと思います。意外とポテンシャル高いねESP8266。