Speedセンサ非リードスイッチ化を進めてますが、これは趣味でかつ暇な人でないとやらないことだと思います。
QMCセンサの仕様書のバックアップが下記にありました
http://web.is.tokushima-u.ac.jp/wp/wp-content/uploads/2017/12/QMC5883L-Datasheet-1.0.pdf
アマゾンからAMRセンサのQMC8553Lが到着して、mbedライブラリをimportしてパッチ当てて動作させて実験しました。
位置をいろいろ変えて、感度と応答性を見た結果シートステイブリッジ位置で、Y方向をハブ軸芯に向けた方向に設置すると波形が先鋭化して感度もでることが分かりました。
IMU LSM9DS1のMAGセンサより数倍感度と応答性が上です。
リムとタイヤをはさんで10cmくらい離しても感度がでるので凄い高感度です。
磁石も仙台のMagFine社から届いたネオジを2個CATSEYEのプラスチック部品といっしょにスポークニップル直上に締め付けました。
QMC5883Lは、シートステブリッジのボルト穴に貼り付けました。基板面に平行で上方向がY軸でそれをハブ軸芯に向けます。
<
●波形データから応答とゲイン
CPLTで測定しました。Magx,MagY,Magzと
Magxyz=sqrt(Magx^2+Magy^2+Magz^2)のベクトル値を出力
高速回転では、やはり波形高さが低くなる現象が発生してました
中速でも発生するのでこれは磁気の残留飽和関係の現象ではないかと思います。リフレッシュできればクリアできるのですが
低いといってもゲインが200以上あるので、ノイズとの区別は可能なので、回転数エッジの検出可能です。
応答速度は速くて、横軸1マス50msecで周期36msecでも十分でてますので、応答速度は、1KHz以上はあります。
36msecは1000/36*2m=56m/sec=200km/hですので自動車でも使えます。
●実験準備(回路、基板、プログラム)
PMM2018は、母艦マイコンをサドル下に収納するため
大きめのCPU NucleoF303KCを使ってます。安くて高性能で
そこそこのサイズで使い勝手がいいので、Arduinoとかmbedの安いモデルは選択しませんでした。
■回路図
・Serial
シリアルをXbeeとBleuTooth SPPで2個使っているので、USBSerialは使えませんでした。もっと大きくて高級CPUならシリアル3ch可能なのですが、このサイズではありませんでした。
・DigitalOut
赤と緑のLEDを基板上に設置しました。心拍数とXbee、BlueToothの通信モニターをさせます。
・i2c
風速センサとしてOMRON D6FPHと
車速センサとしてAMR型磁気センサQMC8553Lを採用しました。i2cはプルアップ抵抗を2個設置しないといけませんが、
あとは、SCl-SDAを結線すれば複数個のセンサが自由に接続できるのでセンサには具合のよいIFです。
■実装基板
50x6両面基板にCPUと無線モジュールを載せてました。
mbedでは QMC8553Lのライブラリは1個しかありませんが、
Atrduinoではたくさん事例紹介があります。
http://osoyoo.com/ja/2017/09/14/qmc5883l-electronic-compass-for-arduino/
https://leico.github.io/TechnicalNote/Arduino/esp32-qmc5883l
では、mbedではここしかありません
https://os.mbed.com/users/sarahbest/code/QMC5883L/
importしてプログラムを作るのですが、このライブラリは
i2cの設定が元祖HMC5883.hと中華GMC5883L.hの2個があって
それぞれのcppファイルの中身のピン番号を書き換えます
NucleoF411RE用に書かれているi2cピン番号を
今回使うNucleoF303K8に変更します。
これをHMC5883L.cppとQMC5883L.cppの2個のファイルで同じ位置にあるので2箇所書き換えます。
/* NUCLEO F411RE board */ static I2C QMC5883L_i2c(PB_7, PB_6); // setup i2c (SDA,SCL) float mRes; // Varies with gain |
あとは、ライブラリー中にpc.printfを使っているので、main.cでSeialpc(USBTX,USBRX)を定義しておかないとエラーがでます。
以上で下記テストプログラムで実験できます。
#include “mbed.h” #include “QMC5883L.h” QMC5883L qmc; DigitalOut myled(LED1); Serial pc(USBTX,USBRX); int main() { qmc.init(); pc.baud(115200); while(1) { wait(0.001); int mgx=qmc.getMagXvalue(); int mgy=qmc.getMagYvalue(); int mgz=qmc.getMagZvalue(); float mgxyz=sqrt(pow((float)mgx,2)+pow((float)mgy,2)+pow((float)mgz,2)); pc.printf(“%d,%d,%d,%7.0f\n\r”,mgx,mgy,mgz,mgxyz); } } |
●以後
基板とセンサの個別の接続テストログラムは確認完了しましたので母艦マイコンのプログラムを合体させます。
リスクとしては、車速のカウント誤差です。LOOPを回して
QMC5883Lの波形をAD変換した値を検出してタイマーを回して周期を測って速度を計算しますが、4msec以内程度おさめないと精度がでないのででないとなると別のシステム構成を考えないといけませんので、月末までの日程が危なくなります。