kipopytokyo が 2021年02月23日21時27分35秒 に編集
説明一部追記(互換ケーブル)
本文の変更
電動アシスト自転車には、電池が付いているので、スピードメーターが付いていますが、普通の自転車にはスピードメーターは付いていません。 前々からあったらいいなぁ…と思っていたのですが、ディスプレイ付きのWio Terminalを何となく入手したので、小手調べに作ってみましたので、ご紹介しましょう。 # :smile: 仕組み :smile: 自動車などのスピードメーターと仕組みは一緒です。タイヤなどが回転する度に、車速パルスという物が変化します。 それをカウントして、時速〇〇km/hと表示させるのです。 例えば、時速1km/hというのは、秒速〇m(〇m/s)という数値に換算すると、1kmは1000m、1時間は60分x60=3600秒なので、1000÷3600≒0.28(m/s)となります。 1秒に28cm進めば、1時間で約1kmという訳です。 つまり、28cm進む度にパルスを発生させれば、〇km/hというような速度が分かるという訳です。 速度を計測する方法は、車速パルスをカウントする方法や車速パルスの幅を計測する方法があります。今回は、簡単に作りたいので、車速パルスをカウントする方法にしてみました。 # :relaxed: 材料 :relaxed: |部品|個数|値段|購入先| |---|---|---|---| |[Wio Terminal](https://www.switch-science.com/catalog/6360/)|1|¥3,784|スイッチサイエンス| |[M5Stack用GROVE互換ケーブル200cm(1個入り)](https://www.switch-science.com/catalog/5217/)|1|¥517|スイッチサイエンス| |[Wio Terminal 用バッテリーベース(650 mAh)](https://www.switch-science.com/catalog/6816/)|1|¥2,629|スイッチサイエンス| |[M5Stack用ホールセンサユニット(A3144E)](https://www.switch-science.com/catalog/6558/)|1|¥715|スイッチサイエンス| |できるだけ強力な磁石|4|¥100|ダイソーなどの100円ショップ| 今回はたまたま手元にあったということもあり、ディスプレイ付きのWio Terminalを使いました。これにM5Stack用ホールセンサーを繋げただけというハードウェア的には~~手抜き~~面白くない構成ではありますが、仕方ありません。 これで、ホントにできちゃうんだから…:sweat_smile::sweat_smile: ただ、ホールセンサー付属のコードでは短すぎて、ハンドルのある前まで届かないので、200cmものの長さの長~いケーブルを使いました(意外とあるものですね:sweat_smile:)。 また、Wio Terminalにはバッテリーが内蔵されていないため別途バッテリーベースを用意。 少々お高めではありますが、ベストマッチなのは言うまでもありません。 少々見てくれは悪いですが、代用として、ダイソーで販売されているモバイルバッテリー(税別500円)とUSB-Cケーブル(税別100円~)の組み合わせにすれば、もっとお安くできます。
互換ケーブルのコネクタは、そのままではWio Terminalに挿さらないので、引っ掛かる所をカットしてやる必要があります。ご注意を!
# :open_mouth:プログラム紹介:open_mouth: ```arduino:WioTerminalを使った自転車用スピードメーターの例(ArduinoIDE用) //https://wiki.seeedstudio.com/jp/Wio-Terminal-Mic/ //から必ずライブラリをゲットしてくださいね。 #include"seeed_line_chart.h" TFT_eSPI tft; TFT_eSprite spr = TFT_eSprite(&tft); uint8_t count; char moji[3]; void cnt(){ //車速パルスが入ったら、実行。 count++; } void setup() { pinMode(0,INPUT_PULLUP); tft.begin(); tft.setRotation(3); spr.createSprite(TFT_HEIGHT,TFT_WIDTH); attachInterrupt(0,cnt, RISING); //割り込みの宣言 } void loop() { spr.fillSprite(TFT_BLACK); count=0; delay(1000); auto caption = text(80,0) .value("---Speed Meter---") .color(TFT_WHITE) .thickness(2); caption.draw(); dtostrf(count,2,0,moji); //char変数に変換 auto spd = text(0,50) .value(moji) .color(TFT_WHITE) .thickness(10); spd.draw(); auto jisoku = text(100,150) .value("km/h") .color(TFT_WHITE) .thickness(5); jisoku.draw(); spr.pushSprite(0, 0); } ``` # :yum:動作を解説:yum: メインループの箇所をチャートで纏めてみました。 :::plantuml:動作(一部) @startuml (*) --> "画面を黒くする(1)" --> "変数countを0にする(1)" --> "1秒ディレイする" --> "ーーーSpeed Meterーーーという文字の設定・表示" --> "変数countをchar変数(文字)に変換する" -->[変数mojiに格納]"変数mojiの設定・表示" --> "km/hという文字の設定・表示" --> "最後におまじない" --> "画面を黒くする(1)" @enduml ::: 何て簡単(?)なんでしょう!! ここでの肝になる箇所は、1秒ディレイです。 チャートには示しませんでしたが、パルスが入った際に割り込みを掛け、変数countをカウントしています。1秒の間に何回カウントできたかによって、時速が分かるのです。 文字を表示するのに、別の方法もありましたが、1秒毎にディレイさせると、文字がチカチカしたので(やり方がまずかったか?)、描画する方法で文字を表示することにしました。 # :sweat:補足と実験の様子:sweat: 使用したホールセンサーですが、付属のマグネットでは、磁力が弱すぎて、少し離すと反応しなくなりましたので、100円ショップに行って、できるだけくっつきやすい磁石をチョイスしました。 磁力をチェックしようと、磁石同士をくっつけていましたが、変なおじさんに他のお客さんはさぞかし冷ややかな目で見ていたでしょうねぇ。 それでも、まだまだ磁力が弱く、センサーと磁石の距離を1~2mm位まで近づけてやっています。 改善の余地ありなので、小型で強力な磁石を探している所です。 ご存じの方いらっしゃいましたら、教えてくださいな。 マグネットを養生テープで貼り付けているおバカっぷりな実験の様子を[YouTube](https://youtu.be/m3Vhwn4u3Qk)にアップしましたので、ご参照ください。 また、今回取り付けた自転車は20インチのタイヤが付いており、マグネットを38cmおきに4つ付けています。 円周の関係上、28cmの倍数になっていませんので、スピードメーターには誤差が生じています。 私の場合は、時速1km/hでは1.3km/h、時速10km/hでは13km/hとなりました。 円板などを自作して、28cmの倍数となるようにし、そこに磁石をくっつけてやれば、もちろんスピードは正確になりますが、車検をするわけでもなく、このままでも充分ではありますので 「ま、いっか」 …と適当ぶりを発揮している私です:sweat: センサーを外し、18V前後のパルス電圧を3.3V位に落とす回路をWio Terminalに接続すれば、自動車やバイクなどにも使えるとは思いますが、車種によってパルスの出てくる回数が異なります。 プログラムがそのままでは使えないということです。 1秒ディレイの箇所を実測に合うよう適度に変えれば、使えるスピードメーターになるかも。 ただし、かなり高速になると、このパルスをカウントする方法では、ノイズにより、かなり誤差が生じてきます。その旨、ご容赦ください。 それと、残念ながら、私の自転車には、昔の自転車にあったようなダイナモ(発電機)が付いていません。 ダイナモで発電しながらWio Terminalのスピードメーターを動かせば、エコですね。 そのうち、やってみようかな。 そうそう、Wio Terminalには、防水でないという欠点がありました。 使わない時は、Wio Terminalは外しておきましょうね。