INDEX(各項目ごとの目次)

[HOME]  [Processing関係]  [Arduino関係]  [マテリアル関係]  [秋葉原工作マップ]

2008年用ですが、部分的に内容を更新しています(2010/06/14)。
また、[建築農業工作ゼミ2009-2010]とも連動していますので、そちらにも幾つかサンプルがあります。
:

ラベル 距離センサ の投稿を表示しています。 すべての投稿を表示
ラベル 距離センサ の投稿を表示しています。 すべての投稿を表示

8/23/2008

Arduino 距離センサ/超音波レンジファインダー

今回は、Parallax社の超音波レンジファインダー「PING)))」で距離の計測実験を行います。距離センサとして、以前に赤外線で検出する「GP2Y0A21YK」を扱いましたが、「PING)))」は超音波を使って検出するタイプです。測定距離は3cm〜3.35mとなっているので、「GP2Y0A21YK」(測定距離10cm〜80cm)より測定範囲の幅はあります。「GP2Y0A21YK」は、信号端子をPWM端子に接続しanalogRead()によって簡単に読み込みが可能ですが、「PING)))」では1本の信号端子(SIG)に対してパルスを用いて測定します。まず「PING)))」から超音波を発します(5マイクロ秒間)。その超音波が物体に当たれば反射して戻ってくるので、戻ってくるまでの時間を計測し、音速と時間の関係から距離を導き出します。
サンプルソースがArduinoサイトのPlaygroundLearning>Examples>Complex Sensorsの中にあります。前者はpulseIn()を使って反射波の時間を計測しており、後者は変数を用いて時間をカウントしています。今回は前者のpulseIn()を用いた方法を参考にします。pulseIn()の場合は、unsigned long(正の整数値:0〜4,294,967,295までの値)の変数タイプを用います。尚、接続方法は以下の通りです。




//反射波の変数を用意
unsigned long echo = 0;
//信号ピンを9番ピンに設定
int signalPin = 9;

void setup(){
//出力用にシリアル通信開始
Serial.begin(9600);
}

void loop(){
//まず信号ピンを出力に設定(発信用)
pinMode(signalPin, OUTPUT);
//2マイクロ秒間LOWで出力
digitalWrite(signalPin, LOW);
delayMicroseconds(2);
//5マイクロ秒間HIGHで出力
digitalWrite(signalPin, HIGH);
delayMicroseconds(5);//超音波発信
//信号ピンをLOWに戻す
digitalWrite(signalPin, LOW);

//信号ピンを入力に設定(受信用)
pinMode(signalPin, INPUT);
//信号ピンをHIGHに設定
digitalWrite(signalPin, HIGH);
//反射波が戻ってくるまでの時間を計測し
//片道の時間(半分の値)にする
echo = pulseIn(signalPin, HIGH)/2;
//ミリメートル単位に変換
int distance = echo*0.34442;

//距離を出力
Serial.println(distance);
delay(250);
}


PING)))」では、ひとつの信号端子(SIG)だけで超音波の発信と受信を切り替えて制御する必要があります。まず最初に信号端子をLOWに設定(2マイクロ秒程度)しておき、その後5マイクロ秒間HIGHにすると、超音波が発信します。その後、物体に反射して戻ってくる超音波を感知させるために、信号端子を「デジタル出力」から「デジタル入力」に切り替えます。「デジタル入力」に切り替えられた信号端子は、反射波を受信するとHIGHになります。反射波がなくなればLOWになるので、それまでの継続時間をpulseIn()でカウントします。pulseIn()の括弧内には、ピン番号とHIGHかLOWの値を入れます。HIGHを入れれば、そのピンがHIGHになるまで待機し、HIGHになったときに時間(マイクロ秒単位)の計測を開始し、次にLOWになるときに時間の計測を終了します。今回の場合は、発信した超音波が反射して戻ってくるまでの時間を計測してくれることになります。計測した時間は超音波が往復して戻ってくるまでの時間なので、計測時間の半分が実際の距離に要した時間となります。音速は344.42m/secなので、1マイクロ秒で0.34442mmの距離を進むことになります。従って、pulseIn()で求めた時間(往復)を片道分の時間にするため2で割り、0.34442をかければミリメートル単位で出力することになります。

6/01/2008

センサについて

センサには、複雑なものもありますが、ArduinoのdigitalRead()analogRead()ですぐに使うことができるものも多くあります。いままで習った範囲でも制御できるセンサを挙げておきます。「四谷工作研究所(2007)」にも各種センサについて使い方を記載しているので参考にして下さい。
ツマミ回転式可変抵抗器:ツマミの回転量で出力値を変化
スライド式可変抵抗器:スライダの移動量で出力値を変化
ジョイスティック式可変抵抗器:スティックの動きで出力値を変化
圧電スピーカ:マイクとして使うことで衝撃音を計測
CDSセル(光センサ):光量を計測し出力値を変化
曲げセンサ:センサ自体を曲げることで出力値を変化
圧力センサ:押された圧力を計測
距離センサ:物体との距離を計測
加速度センサ:物体の重力方向に対する傾き角度/加速度を計測
人体感知センサ:人間の動きを感知しHIGH/LOWを出力


その他、スイッチ類を利用してセンサのように使うこともできます。


センサやスイッチ類をそのまま単体で使うだけでは、すぐには面白い表現にたどりつかないかもしれないので、複数のセンサやスイッチを組み合わせることを考えてみてください。例えば、単純なタクトスイッチを「Wooden Stick」に多数配置すれば、棒を握った箇所を判別するセンサになるように、応用的な使い方や配置の仕方を試してみるといいでしょう。


センサとArduinoの接続について:
可変抵抗器のように段階的に出力が可能なセンサは、大抵5V線、GND線、出力線の3つの端子があり、以下のようにつなぎます。

距離センサGP2Y0A21YK」の場合、電源(5V)とグランド(0V)にそれぞれつなぎ、出力線となる端子をArduinoのアナログ入力(ANALOG IN)のピンにつなぎ、出力線からの値をanalogRead()を使って読み込みます(プログラムについては、「Arduino シリアル通信1」または「Arduino アナログ入出力」を参照)。距離センサGP2Y0A21YKからanalogRead()で読み取った値を距離に置き換えるには、距離=220000/(読取値*5-200)にするといいそうです。
以下は距離センサGP2Y0A21YKの読取り電圧と距離(cm)の関係のグラフです。


このように3線(3端子)あるセンサの場合はいいのですが、2線(2端子)しかない場合は、必要な抵抗をつなぎ以下のようになります。

CDSセル(光センサ)」や「曲げセンサ」などは、2線(2端子)のまま売られている場合が多いので、適宜抵抗を取付けて、分岐する3つ目の線をのばし(出力線)、アナログ入力のピンへつないで下さい。つまり、2線(2端子)を3線(3端子)にするということになります。この際必要となる抵抗は、「プルアップ抵抗」と呼ばれます(プラス側に取付けた抵抗)。例えば、「曲げセンサ」の場合、もともと10KΩ〜30KΩ程度の抵抗があるので、10KΩの抵抗をつなぐとちょうどいいでしょう。「CDSセル(光センサ)」の場合も、同様のつなぎ方をします。取付ける抵抗(上図の場合10KΩ)の目安は、センサ自体の抵抗値と同程度のものとなります。取付ける抵抗を変えれば、出力される電圧や出力幅も変わるので、幾つかの抵抗を試してみて、読み取る際に丁度いいものを選んでください(プログラムについては、「Arduino シリアル通信1」または「Arduino アナログ入出力」を参照)。

また、スイッチなども2端子しかついていないので、抵抗をつなぎ、分岐させた3つ目の線(出力線)を取付けて、デジタル入力ピンへつなぎます。

タクトスイッチ」(あるいは2端子しかないスイッチ類)の場合、抵抗はマイナス(GND)側にとりつけてあります。これを「プルダウン抵抗」といいます。スイッチを押すと5V、放すと0Vの状態になります。5V/0Vのスイッチなので、デジタル入力によって読み取ります。
以下は、タクトスイッチを押すと13番ピンのLEDが光るプログラムです。

void setup(){
//12番ピンをデジタル入力に設定
pinMode(12,INPUT);
//13番ピンをデジタル出力に設定
pinMode(13,OUTPUT);
}

void loop(){
 //デジタル入力(12番ピン)がHIGH(5V)なら
if(digitalRead(12)==HIGH){
//13番ピンをHIGH(5V)で出力
digitalWrite(13,HIGH);
}else{ //デジタル入力がLOW(0V)なら
//13番ピンをLOW(0V)で出力
digitalWrite(13,LOW);
}
}

プルダウン抵抗/プルアップ抵抗:
もし、タクトスイッチから抵抗を通してGND端子へ線を接続していなければ、スイッチを押したときだけ5Vが出力されてデジタル入力の12番ピンがHIGHとして読み取りますが、スイッチを押していない時は12番ピンがどこにも接続されていない状態になってしまい、12番ピンにおいて不安定な値が読み取られます。読み取り値が不安定な値にならないためにも、抵抗を通してGNDピンに接続しておく必要があります。そうすれば、スイッチを押していない時は、GNDピンから抵抗を通して0Vが出力され、12番ピンはLOWとして読み取ることができます。つまり、スイッチを押したときの状態(5V出力)だけでなく、押していない時の状態(0V)もきちんと定義しなければならないということになります。
また、抵抗をプラス(5V)側に取付けて線を分岐させれば、「プルアップ抵抗」となります。プルアップにした場合は、押すと0V、放すと5Vになります。スイッチを押さない時の状態、押した時の状態の設定に応じて使い分けます。




[目次:Processing関係]  [HOMEへ戻る]  [目次:Arduino関係]