しばらく放置していたArduinoですが、久しぶりに再開しようと「Prototyping Lab」を読みながら、いろいろセンサを買ってきて繋いでみています。
超音波センサ(「Prototyping Lab」p116 / 3 距離を測りたい(超音波センサ))を試そうと買ってきたら、参考書のセンサはアナログ出力で、買ってきたのはデジタル出力のみでアナログ出力がない…。ということで、いろいろ試してみたのでメモ。
・手に入れた超音波センサ(秋月で一番安かった)
このセンサのFAQページを見ると、PWM波形出力というのが(パルス幅=距離値)らしいので、FAQページに書かれている通りに接続して、このページの「Mode 3: PWM passive control mode」に書かれているスケッチをアップロード。要はこのスケッチでモジュール側の設定を書き換えて、設定書き換え用のピンを抜くと書き換えた設定で計測が開始される…ということらしい。
を引っこ抜くと、計測値が表示されるようになります(Arduino IDEでツール>シリアルモニタを表示すると、Serial.print() で出力されたメッセージが表示される)。
そこにLCDで計測距離を表示しようとプログラムを書き換えてみるが、計測自体がうまくいかない。調べた結果、LCDシールドと超音波センサモジュールで使用しているデジタルピン番号がかち合っていることが判明。LCDシールドは接続が固定なので、プログラムに書かれている超音波センサ側のピン番号を下記に変更。もちろん繋ぐピンも変更する。
これで超音波センサでの計測と結果のLCDシールド表示が完成。LCDシールド表示は、下記のような関数を作ってloopの中で呼び出した。
かなり初歩的な話なんだけど、すぐ忘れそうなので備忘録として。
<参考>
同じことをしても,「マイコンボードに書き込んでいます」と表示されるが,いつまでも終了しません.アドバイスをいただければ助かります.
初めまして。コメントありがとうございます。
今、ちょっと試せないので、使ったスケッチを貼っておきますね。ご参考になれば。
// # Editor :Jiang from DFRobot
// # Data :18.09.2012
// # Product name:ultrasonic scanner
// # Product SKU:SEN0001
// # Version : 0.2
// # Description:
// # The Sketch for scanning 180 degree area 4-500cm detecting range
// # Connection:
// # Pin 1 VCC (URM V3.2) -> VCC (Arduino)
// # Pin 2 GND (URM V3.2) -> GND (Arduino)
// # Pin 4 PWM (URM V3.2) -> Pin 3 (Arduino)
// # Pin 6 COMP/TRIG (URM V3.2) -> Pin 5 (Arduino)
// #
#include
//センサのデジタルピン番号
int URPWM = 8; // PWM Output 0-25000US,Every 50US represent 1cm
int URTRIG = 9; // PWM trigger pin
unsigned int Distance=0;
uint8_t EnPwmCmd[4]={0x44,0x02,0xbb,0x01}; // distance measure command
//ライブラリ初期化
LiquidCrystal lcd(12,11,5,4,3,2);
void setup(){ // Serial initialization
//LCD:桁数、行数の指定
lcd.begin(16,2);
Serial.begin(9600); // Sets the baud rate to 9600
PWM_Mode_Setup();
}
void loop(){
PWM_Mode();
showResult();
delay(20);
}
//PWM mode setup function
void PWM_Mode_Setup(){
pinMode(URTRIG,OUTPUT); // A low pull on pin COMP/TRIG
digitalWrite(URTRIG,HIGH); // Set to HIGH
pinMode(URPWM, INPUT); // Sending Enable PWM mode command
for(int i=0;i<4;i++){
Serial.write(EnPwmCmd[i]);
}
}
void PWM_Mode(){ // a low pull on pin COMP/TRIG triggering a sensor reading
digitalWrite(URTRIG, LOW);
digitalWrite(URTRIG, HIGH); // reading Pin PWM will output pulses
unsigned long DistanceMeasured=pulseIn(URPWM,LOW);
if(DistanceMeasured == 50000){ // the reading is invalid.
// Serial.print("Invalid");
Distance = 0;
} else {
Distance = DistanceMeasured / 50; // every 50us low level stands for 1cm
}
// Serial.print("Distance=");
// Serial.print(Distance);
// Serial.println("cm");
}
void showResult(){
//LCD:初期化
lcd.clear();
//LCD:表示
lcd.setCursor(0,0);
lcd.print("Range: ");
// lcd.setCursor(0,1);
lcd.print(Distance);
lcd.print(" cm");
}