目次
2.超音波モジュールをArduino開発ボードに接続する方法
この記事の最後に完全なビデオの説明があります
ArduinoとRaspberryPiをプレイする学生は、超音波モジュールに精通している必要があります。これは高価ではなく(通常、5〜10元)、機能が制限されています。インターネットで検索する場合、アプリケーションシナリオの99%は距離測定用です。シーンの残りの部分は、2つの超音波モジュールを使用して向かい合わせたり、超音波を使用してフローティングを再生したりするなど、役に立たない小さなゲームです。実際、あまり役に立ちません。この記事では、新しいアイデアを提供します。わずか数行のコードで、超音波モジュールを音声起動スイッチに変更して、LEDや複雑な電子機器を制御できます。また、この機能を使って鴻蒙をベースにした「SOS」ゲームを作りました。後で紹介する記事を書きますが、とりあえずこの記事のトピックに戻ります。
まず、超音波モジュールに基づくサウンド起動スイッチを体験してみましょう。
[Arduinoラボ]超音波は距離しか測定できないのですか?空中でLEDを制御する方法を聞いたことがありますか?奇跡の瞬間を目撃してください!
1.超音波モジュールの動作原理
超音波モジュールに慣れていない読者もいるかもしれません。みんなを混乱させないために、超音波モジュールを見てみましょう。とてもかわいいです。目と針のようなものが2つあります。ピン。
もちろん、このモジュールから放出される超音波は非常に弱く、Fu Hulkほど強くはありません。そうでなければ、記事を書くためにここで死ぬことはありません。
超音波モジュールの測距の原理は実際には非常に単純です。前者が超音波を使用し、後者がレーザーを使用することを除いて、地球から月までの距離の測定に似ています。超音波モジュールは、空気中の音波の速度が340メートル/秒(光の速度が約30万キロメートル/秒であるのと同じように、これは固定値です)という特性を使用して、超音波から受信超音波の時間(往復時間)を返し、2で割ると、A点からB点までの超音波に必要な時間になります。この値が1000ミリ秒の場合、Aからの距離Bまでは340メートル、100ミリ秒の場合は34メートルというように続きます。もちろん、超音波はレーザーとは異なり、距離が遠すぎることはありません。一般的に、測定はせいぜい数十メートルです。
超音波モジュールには目のようなものが2つあります。1つは超音波の送信を担当し、もう1つは返された超音波の受信を担当します。超音波が送信され始めると、タイマーが自動的に開始され、返された超音波を受信するとタイマーが停止し、対応するピンからタイマーの時刻が読み取られます。計算後、特定の単位(メーター、センチメートル、ミリメートル)を取得できます。距離。次の図は、超音波の送受信のタイミング図です。出力残響信号のタイミング図の突出部の下部は左側がハイレベルに設定されており、このとき超音波が戻るのを待ちます。戻りの超音波を受信すると右側が高くなります。ローレベルになり、タイマー時間に戻ります。実際、必要な時間は、隆起部分が高レベルにある時間(つまり、超音波モジュールの特定のピンが高レベルにある時間)です。
2.超音波モジュールをArduino開発ボードに接続する方法
写真は千の言葉に値するので、写真を見て話しましょう!
これは超音波モジュールとArduino開発ボードの接続図であり、Arduino開発ボードに接続されたLEDもあります。実際、ここのLEDは超音波モジュールとは関係ありませんが、LEDは超音波モジュールによって変更された音声起動スイッチ。
超音波モジュールには、次の4つのピンがあります。
(1)VCC:Arduino開発ボードの5vピンに接続します
(2)トリガー:超音波を送信するピンをデジタルピンに接続する必要があります。この例では、10番ピンに接続します。10番ピンがハイレベルの場合、超音波を送信します。
(3)エコー:超音波を受信するためのキーをデジタルピンに接続する必要があります。この例では、9番目のピンに接続されています。9番目のピンがハイレベルになると、超音波が戻るのを待ちます。超音波を受信すると、9番目のチューブ足が自動的に低レベルになり、タイマーの時間(超音波の往復時間)に戻ります。
(4)GND:Arduino開発ボードのGNDピン(アース)に接続します
LEDは非常にシンプルで、正極は7番デジタルピンに接続され、負極は接地されています(GND)
この例では、5Vがブレッドボードに接続されているため、VCCをブレッドボードに直接接続できます。
ブレッドボードの使用法がわからない場合は、次のビデオをご覧ください。
[Arduinoラボ]コードを1行書く必要はなく、ボタンを使用してLEDを制御します。これは、Arduinoの初心者にとって最初の選択肢です。
3.レンジングから始めます
最初にコードを取得しましょう!
void loop() {
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
// 发射超声波
digitalWrite(trigPin, HIGH);
delayMicroseconds(5);
// 这个distance就是距离,超声波返回时,pulseIn函数会返回计时器的时间,单位:微秒
int distance = pulseIn(echoPin, HIGH) * 340 / 2 / 1000
delay(40);
}
このレンジングコードは合計6行あります。実際、最初にトリップピンを低レベルに設定し、次に高レベルに設定して超音波モジュールに超音波を放射させます。次に、pulseIn関数を使用してエコーピンを高レベルに設定し、超音波が戻るのを待ちます。戻った場合、pulseIn関数は時間(単位:マイクロ秒)を返します。この例で計算された距離の単位は次のとおりです。ミリメートル。
ほら、簡単じゃない?
4.超音波を音声起動スイッチに変換する方法
測距はわかりやすいので、超音波モジュールを音声起動スイッチにするとどうなるでしょうか。実際、これは複雑ではなく、ここでは手法とステートマシンアルゴリズムが使用され、合計で12行を超えるコードが使用されます。
測定距離は遠く、近くにある必要があります。たとえば、300mmと600mmの間に差がある必要があります。これは、肉眼でも確認できます。そして、ここにある音声起動スイッチは、実際にはあなたが叫ぶためのものではありません。ゴマでドアを開けてください。超音波を送信したり聞いたりすることはできません。ここでの音声制御とは、超音波にあなたの存在を感知させることを指します。
前のビデオからわかるように、手を超音波モジュールの前にスライドさせます。手が超音波モジュールの前にある場合、測定距離は、超音波モジュールの前にない手の間の距離よりも短くする必要があります。実際、これはバイナリロジックです。測定距離の変化を利用して、手が超音波モジュールの前にあるかどうかを判断できます。したがって、ここでしきい値を設定する必要があります。測定距離がこのしきい値よりも小さい場合は、手が超音波モジュールの前にあることを意味します。このしきい値よりも大きい場合は、手がないことを意味します。超音波モジュールの前面。
ただし、ここには別の問題があります。ループ機能は継続的にループするため、常に超音波モジュールの前に手を置くと、常に「オン」アクションがトリガーされます。したがって、この状況をシールドするには、ステートマシンを使用する必要があります。つまり、前の状態が「オフ」の場合にのみ、現在の状態が「オン」であるかどうかを検出します。完全な実装コードは次のとおりです。
// 单超声波实现
#include <SoftwareSerial.h>
#define LED 7
int trigPin = 10; // 发射管脚
int echoPin = 9; // 接收管脚
int distance = 0;
int state = 0; // 用于控制状态机的状态
bool led_state = false; // false:灭 true:亮
void setup() {
pinMode(LED, OUTPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
digitalWrite(LED, LOW);
Serial.begin(9600);
while (!Serial) {
}
Serial.println("hello world!");
}
void loop() {
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
digitalWrite(trigPin, HIGH);
delayMicroseconds(5);
distance = pulseIn(echoPin, HIGH) * 340 / 2 / 1000;
// 状态:关
if (state == 0) {
// 判断距离是否小于300毫米
if (distance < 300) {
state = 1; // 如果小于300毫米,说明手正好在超声波模块起那么,将状态设置为开
}
} else if (state == 1) { // 状态:开
// 如果距离大于等于300毫米,说明手不在超声波模块前面,状态设置为关
if (distance >= 300 ) {
state = 0;
// 当手不在超声波模块前面时,根据LED当前的状态,决定是关闭LEd,还是点亮LED
if(led_state) {
led_state = false;
digitalWrite(LED, LOW);
} else {
led_state = true;
digitalWrite(LED, HIGH);
}
}
}
delay(40);
}
5.超音波スイッチを追加します
満足できない場合は、別の超音波スイッチを追加できます。接続方法は上記と同じです。2つの超音波スイッチを制御するコードは次のとおりです。
#include <SoftwareSerial.h>
#define LED1 8
#define LED2 7
int trigPin1 = 10; // 发射管脚
int echoPin1 = 9; // 接收管脚
int trigPin2 = 13; // 发射管脚
int echoPin2 = 12; // 接收管脚
int distance = 0;
int state1 = 0;
int state2 = 0;
bool led_state1 = false; // false:灭 true:亮
bool led_state2 = false; // false:灭 true:亮
void setup() {
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(trigPin1, OUTPUT);
pinMode(echoPin1, INPUT);
pinMode(trigPin2, OUTPUT);
pinMode(echoPin2, INPUT);
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
Serial.begin(9600);
while (!Serial) {
}
Serial.println("hello world!");
}
void loop() {
// 处理第1个超声波开关
digitalWrite(trigPin1, LOW); // 高电平发射超声波, 但要先设置为低电平。 就像打开灯,需要先关闭灯,才能打开
delayMicroseconds(5);
digitalWrite(trigPin1, HIGH);
delayMicroseconds(5);
distance = pulseIn(echoPin1, HIGH) * 340 / 2 / 1000;
if (state1 == 0) {
if (distance < 300) {
state1 = 1;
}
} else if (state1 == 1) {
if (distance > 300 ) {
state1 = 0;
if(led_state1) {
led_state1 = false;
digitalWrite(LED1, LOW);
} else {
led_state1 = true;
digitalWrite(LED1, HIGH);
}
}
}
// 处理第2个超声波开关
digitalWrite(trigPin2, LOW); // 高电平发射超声波, 但要先设置为低电平。 就像打开灯,需要先关闭灯,才能打开
delayMicroseconds(5);
digitalWrite(trigPin2, HIGH);
delayMicroseconds(5);
distance = pulseIn(echoPin2, HIGH) * 340 / 2 / 1000;
if (state2 == 0) {
if (distance < 300) {
state2 = 1;
}
} else if (state2 == 1) {
if (distance > 300 ) {
state2 = 0;
if(led_state2) {
led_state2 = false;
digitalWrite(LED2, LOW);
} else {
led_state2 = true;
digitalWrite(LED2, HIGH);
}
}
}
delay(40);
}
このコードは、1つのデジタルピンを使用して複数のLEDを制御し、2つのデジタルピンを使用して2つのグループのLEDを制御します。したがって、次の図に示すように、最初にブレッドボードをデジタルピンに接続してから、これらのLEDをブレッドボードに接続する必要があります。さて、あなたは好きなだけ遊ぶことができます。
以下は、この記事のビデオによる説明です。
[ハードコア]古いプログラマーは、超音波モジュールを数秒で音声起動スイッチに変えるコツを教えてくれます!