Japaninoで超音波距離計を作ってみる。Maruduinoまたは(◎)の応用編 [ATmarquino Arduino]
計測した対象物までの距離はLCDにて表示を行っています。
電源電圧は5Vです。送信側の振幅をより大きくする為にRS232ドライバーICを流用しています。
40KHzの発振はArduinoのtoneライブラリを使用して発生しています。これを搬送波とする短いパルスを発し、帰って来るまでの時間を計測し、音速≒340m/sから対象物までの距離を計算しています。
音速は周囲温度に依存しますので、実際には温度を計測しながら距離の計算を行うと、もっと良いでしょう。
という訳で簡単なコードを書いておきます。あまり深く考えて記述した物ではないのでご注意を。
#include <LiquidCrystal.h> #include <avr/io.h> #include <avr/interrupt.h> /*************************************************************************/ /* defines */ /*************************************************************************/ #define AREF 0 #define NOT_GND 1 #define DI13 2 #define DI12 3 #define DI11 4 #define DI10 5 #define DI9 6 #define DI8 7 #define DI7 8 #define DI6 9 #define DI5 10 #define DI4 11 #define DI3 12 #define DI2 13 #define DI1 #define DI0 #define AN0 14 #define AN1 15 #define AN2 16 #define AN3 17 #define AN4 18 #define AN5 19 #define PWM11 DI4 #define PWM10 DI5 #define PWM9 DI6 #define PWM6 DI9 #define PWM5 DI10 #define PWM3 DI12 /*************************************************************************/ /* global parameter */ /*************************************************************************/ #define UltraSonicPin PWM6 LiquidCrystal lcd(DI2, DI3, DI4, DI5, DI6, DI7); /*************************************************************************/ /* prototype */ /*************************************************************************/ /*************************************************************************/ /* timer1 output compare match a int handler */ /*************************************************************************/ SIGNAL( TIMER1_COMPA_vect ) { } /*************************************************************************/ /* setup */ /*************************************************************************/ void setup() { lcd.begin(16,2); lcd.clear(); lcd.print( "designed by" ); lcd.setCursor(0,1); lcd.print( " hamayan." ); pinMode( DI8, INPUT ); pinMode( DI10, OUTPUT ); digitalWrite( DI10, LOW ); } /*************************************************************************/ /* main loop */ /*************************************************************************/ void loop() { digitalWrite( DI10, HIGH ); tone( UltraSonicPin, 40000 ); unsigned long startMicro = micros(); delayMicroseconds( 500 / 8 ); noTone( UltraSonicPin ); delayMicroseconds( 500 / 8 ); digitalWrite( DI10, LOW ); unsigned long endMicro = startMicro; while( digitalRead( DI8 ) == LOW ) { endMicro = micros(); if( (endMicro - startMicro) > 20 * 1000UL ) break; } unsigned long distance; if( (endMicro - startMicro) < 20 * 1000UL ) { distance = ((340 * (endMicro - startMicro)) / 10000UL) / 2; } else { distance = 999; } lcd.clear(); lcd.print( distance ); lcd.print( "cm" ); delay( 500 ); }
Prototyping Lab ―「作りながら考える」ためのArduino実践レシピ
- 作者: 小林 茂
- 出版社/メーカー: オライリージャパン
- 発売日: 2010/05/27
- メディア: 大型本
2010-05-19 01:01
nice!(0)
コメント(0)
トラックバック(0)
コメント 0