このところ御本家Go言語の標準ライブラリを試用してましたが、今回はTinyGoユニークなものに復帰。TinyGoのライブラリ「Devices」は各種の周辺デバイスを接続するときに役立つライブラリです。以前に使ったときは簡単接続、便利便利という感じでした。でもね。ちょっとメンドイことがないわけでもないです。まずは電源ね。
※「GoにいればGoに従え」Go関連記事の総Index
※実機動作確認は Arm Cortex-M4FコアのNordic nRF52833チップ搭載、みんな大好き BBC micro:bit v2 機にTinyGoのオブジェクトを書き込んで行っています。
ターゲットに使用しております BBC micro:bit v2機は、USBから電源をもらってオンボードのレギュレータで電源電圧を生成してます。しかし電池用のソケット端子も装備されており、基本は1.5Vの電池2本で動くように設計されとるようです。3V電源、IO電圧も3Vとな。nRF52833の場合、端子にかけてもよい電圧はVDD+0.3Vまでのようなので、IO電圧5Vの装置と直接接続するのはマズイです。
HCSR04
HC-SR04と綴られることが多い小さなモジュールは、物体に反射して帰ってくるまでの超音波の反射時間を測ることで物体までの距離を測定することができる装置です。数cmから数十cmくらいの距離はまあまあ測れるのでないかと。一応もっと遠距離測れるという話もないわけでないですが、なかなか難しいんでないかと。知らんけど。御本家はAdafruit社みたいです。製品Overviewページが以下に。
Distance Measurement with Ultrasound
上記ページへ行くと赤い警告に気づきます。この回路は5V信号出力だから。。。という内容の警告が書かれてます。IO電圧を確かめずに接続してマイコンを壊している人も多数と見ました。
今回使用のBBC micro:bit v2は、先ほど述べたとおり、IO電圧3Vなので、HC-SR04をダイレクトに接続することはできません。それどころかボード自体は3V電源しか持っていないので、外部5V電源を別途用意せねばHC-SR04を動作させることもできません。
大分以前の以下の別シリーズ記事でHC-SR04をIO電圧3.3V(3Vでない)のラズパイPicoに接続するのはやっていたのです。
上記でやっていた回路をもってくれば接続など簡単、と思ったらそうでもなかったです。上記の記事では、ラズパイPico上の MicroPython で処理を書いていたのですが、肝心のHC-SR04とのインタフェースは PIO(プログラム可能なIOステートマシン、ラズパイPicoにユニークなもの)で書いていたのです。自前で信号を生成していたので、信号の極性を反転させることなど自由自在。
上記記事で3.3Vと5V間のレベル変換に使用していたのは東芝製のワンゲートロジック TC7SH00(5VトレラントなNAND)とTC7S14(ヒステリシス付きのインバータ)、いずれも秋月電子殿で売られている奴だったのです。いずれも信号が反転するタイプ。Picoのときはレベル変換すると信号が反転してしまうのですが、マイコン側の自前のPIOコードで信号反転に対応すればよかったです。
しかし今回はTinyGoの以下のページにならんでいるTinyGoのDevicesライブラリに登録されているモジュールを「無修正で」使いたいです。
レベル変換するから信号の極性をひっくり返してね、というようなリクエストに適合しているとも思われません。そこでレベル変換のmicro:bit側に「普通の」3V電源の74HC04をもう一段かませて信号の極性を本来あるべき姿に戻しました。これでライブラリ内部をいじくるような不埒なことはせずとも済むと。外付け回路がメンドイけど。
なお、以下の回路図で3V電源を3v3と3.3Vであるかのような記載してますがそれは私の誤りです。訂正図面つくるのがメンドカッたのよ。3.3Vでなく、3.0Vピタリの電源です。まあ3.3Vでも大丈夫なのだけれども。
ビルドの準備
TinyGoの x/drivers ライブラリを使うためには、いつもの go mod init に加えて以下の手続きも必要みたいです。知らんけど。
上記以外は、普段通りです。
サンプルプログラム
非常に充実したdriversの中には、examples も隠れています。今回は、以下のexampleのGo ソースを可能な限りそのまま走らせたい、と思いました。よってソースは以下をご覧ください。
https://github.com/tinygo-org/drivers/blob/release/examples/hcsr04/main.go
ソースの中で、micro:bit v2 のために修正したのは、以下の端子指定のための一行です。ここだけ直せば動作OK。
sensor := hcsr04.New(machine.P0, machine.P1)
なお、最初、v2であれば使える筈の P8とP9 を使おうとしましたがダメでした。理由は未調査デス。すみません。TinyGoのmachineパッケージをみると、Pinなどはv1とv2の違いをちゃんと切り分けている部分と、2つが混然一体化している部分があるのでそういう違いが出てしまったのかな?もしかするといつもの勘違いじゃないか。ちゃんと調べとけよ、自分。
実機動作
ビルドしてオブジェクトをmicro:bit v2に書き込んだ後、USBシリアルを開けばこんな感じです。最初はセンサの前8cmくらいにボール紙を立ててある場合。
まあ、距離はそれなりに測っているのでないかい。平らなボール紙は測り難い対象とは思われんし。