今日は超音波センサを使ってみました。新ロボット設計開始!
指向性のテストもしてる。

ネットを漁ってもポーリングで測定する方法しか出てこなかったのでこんなんじゃ処理追いつかなさそうと思った私は全てを割り込みで処理させようとしました。割り込み大好きすぎます。ポーリングより圧倒的にパフォーマンスが出せるのと、全てのピンが割り込み対応というのはSTM32などのARMマイコンの特権でもあります。だから使わないと損なわけです。今回使った割り込みはTimeout(ワンショット割り込み)とInterruptInです。
Timeoutとは一般的にワンショット割り込みと言われている割り込みだそうです。
TimeoutはTickerと同じようにタイマー割り込みの一種です。Tickerは毎回一定時間が経つと割り込み処理をするのに対し、こちらは一回しか呼び出されません。一回割り込み処理をしたら次からは禁止します。
InterruptInは文字通り割り込みです。これはピン割り込みと呼ばれているものです。riseとfallを見て割り込みます。InterruptInは使えるピンが限られてきます。チャンネルをそれぞれ分けてあげないと割り込みません。普通のデジタルピンとして機能してしまいます。なのでどのピンなら割り込みが同時に使えるのかを検証する必要があります。
プログラムを貼っておきます。Xcodeで開いてコピーするだけでハイライト付けれるの便利です。
#include "mbed.h" Serial pc(USBTX,USBRX); InterruptIn IN1(D3); DigitalOut OUT1(D2); Timer timer1; Timeout MF; Ticker Debug; short US1; void US_OFF(){ OUT1 = 0; } void US_ON(){ OUT1 = 1; MF.attach_us(&US_OFF,10); } void IN1_rise(){ timer1.start(); timer1.reset(); } void IN1_fall(){ US1 = ((timer1.read_us()*343)/20000); MF.attach_us(&US_ON,15); } void SerialDebug(){ pc.printf("%dcm\r\n",US1); } void setup(){ IN1.rise(&IN1_rise); IN1.fall(&IN1_fall); pc.baud(115200); IN1.mode(PullDown); US_ON(); } int main(){ setup(); Debug.attach(&SerialDebug,0.05); while (1) { wait(1); } }
完全割り込みです。メイン関数の中身は設定だけです。ライブラリ化して完全にバックグラウンドでセンサー更新したいですね。このライブラリ作ってネットにあげたら僕はヒーローになれそうですよ(結構マジで)
明日は6個同時に計測できるか試してみます。
HC-SR04と比較してみましたが指向性が悪すぎます。動作電圧は5Vです。電源的には不安定にはならないはずです。しかし全くちゃんと測れません。たまにオーバーシュートします。安定しないのでフィルタをかけるとかしてあげないと使い物になりません。
レーザー距離測定機とかの方が圧倒的に良い精度とスピードが出せそうですね。ルール的にどうかはわかりませんが。
明日は
●どのピンが使えるか(1時間)
・SPIマルチプル(2時間)・・無理でした
●USライブラリの作成(30分)
をしたいです。

Loading Comments...