- Arduinoベースの床掃除ロボットを構築するために必要な材料
- ポータブル掃除機
- HC-SR04超音波センサーモジュール
- 階段検知用フロアセンサー(IRセンサー)
- Arduinoベースのフロアクリーナーロボットの回路図
- Arduinoベースの床掃除ロボットの回路を構築する
- Arduino
今日のシナリオでは、私たち全員が仕事で忙しく、家をきちんと掃除する時間がありません。この問題の解決策は非常に簡単です。ボタンを押すだけで家を掃除するirobotroombaなどの家庭用掃除機ロボットを購入するだけです。しかし、そのような商品は共通の問題であり、それはコストです。そこで本日、市場に出回っている市販品に比べて、製造が簡単であるだけでなく、コストも非常に安い、シンプルなフロアクリーナーロボット を作ることにしました。よく読む人は、ずっと前に作ったArduino掃除機ロボットを覚えているかもしれませんが、それは非常にかさばり、動き回るには大きな鉛蓄電池が必要でした。新しいArduino掃除機 ここで構築するのは、コンパクトで実用的です。その上、このロボットは超音波センサーとIR近接センサーを備えています。超音波センサーはロボットが障害物を回避することを可能にし、部屋が適切に掃除されるまでロボットが自由に動くことができるようにし、近接センサーはロボットが階段から落ちるのを防ぐのを助けます。これらの機能はすべて面白そうですね。それでは、始めましょう。
以前の記事の1つで、自己平衡型ロボット、自動表面消毒ロボット、障害物回避ロボットなどの多くのボットを作成しました。それがあなたにとって興味深く聞こえるなら、それらをチェックしてください。
Arduinoベースの床掃除ロボットを構築するために必要な材料
非常に一般的なコンポーネントを使用して掃除機ロボットのハードウェアセクションを構築したので、地元のホビーショップでそれらすべてを見つけることができるはずです。これは、すべてのコンポーネントの画像とともに、必要な材料の完全なリストです。
- Arduino Pro Mini-1
- HC-SR04超音波モジュール-3
- L293Dモータードライバー-1
- 5ボルトN20モーターと取り付けブラケット-2
- N20モーターホイール-2
- スイッチ-1
- LM7805電圧レギュレータ-1
- 7.4Vリチウムイオン電池-1
- IRモジュール-1
- Perfboard-1
- キャスターホイール-1
- MDF
- 汎用ポータブル掃除機
ポータブル掃除機
コンポーネント要件のセクションでは、ポータブル掃除機について説明しました。下の画像はまさにそれを示しています。アマゾンのポータブル掃除機です。これには非常に単純なメカニズムが付属しています。下部に3つの部分があります(ほこりを保管するための小さなチャンバー、中央部分にはモーター、ファン、上部のバッテリーソケットが含まれます(バッテリーのカバーまたはキャップがあります)。DCモーターとファン。このモーターは、簡単なスイッチを介して3V(2 * 1.5ボルトAAバッテリー)に直接接続されています。7.4Vバッテリーでロボットに電力を供給しているため、内部バッテリーから接続を切断し、5Vから電力を供給します。そのため、不要な部品をすべて取り外し、2線式ステーのモーターのみを取り外しました。下の画像で確認できます。
HC-SR04超音波センサーモジュール
障害物を検出するために、人気のあるHC-SR04超音波距離センサーを使用しています。これを障害物回避センサーと呼ぶこともできます。作業は非常に簡単です。まず、送信機モジュールが超音波を送信します。超音波は空気中を伝わり、障害物にぶつかって跳ね返り、受信機はその波を受信します。Arduinoで時間を計算することにより、距離を決定できます。Arduinoベースの超音波距離センサープロジェクトに関する前回の記事では、このセンサーの動作原理について非常に徹底的に説明しました。HC-SR04超音波距離センサーモジュールについてもっと知りたい場合は、それをチェックしてください。
階段検知用フロアセンサー(IRセンサー)
機能のセクションでは、ロボットが階段を検出し、落下を防ぐことができる機能について説明しました。そのために、IRセンサーを使用しています。IRセンサーとArduinoのインターフェースを作ります。ワーキングIR近接センサは、それがIR LED及びフォトダイオードを有し、IR LED発光するIR光は非常にシンプルであり、任意の障害物が、この放出された光の前に来る場合、それは反射され、反射光が検出されますフォトダイオードによる。しかし、反射から生成される電圧は非常に低くなります。それを増やすために、オペアンプコンパレータを使用して、増幅して出力を得ることができます。アンIRモジュールVcc、グランド、出力の3つのピンがあります。通常、センサーの前に障害物が来ると出力が低くなります。したがって、これを使用して床を検出できます。ほんの一瞬、センサーから高値を検出した場合、ロボットを停止したり、元に戻したり、階段からの落下を防ぐために必要なことを実行したりできます。前回の記事では、IR近接センサーモジュールのブレッドボードバージョンを作成し、動作原理を詳細に説明しました。このセンサーについて詳しく知りたい場合は、それを確認できます。
Arduinoベースのフロアクリーナーロボットの回路図
障害物を検出する3つの超音波センサーがあります。したがって、超音波センサーのすべてのアースを接続し、それらを共通のアースに接続する必要があります。また、センサーの3つのVccをすべて接続し、それを共通のVCCピンに接続します。次に、トリガーピンとエコーピンをArduinoのPWMピンに接続します。また、IRモジュールのVCCを5Vに接続し、アースをArduinoのアースピンに接続します。IRセンサーモジュールの出力ピンは、ArduinoのデジタルピンD2に接続します。モータードライバーの場合、5ボルトのモーターを使用しているため、2つのイネーブルピンを5Vに接続し、ドライバー電圧ピンも5Vに接続します。前回の記事では、Arduinoモータードライバーシールドを作成しました。L293DモータードライバーICの詳細については、こちらをご覧ください。およびその操作。Arduino、超音速モジュール、モータードライバー、モーターは5ボルトで動作し、電圧が高いとそれを殺します。7.4ボルトのバッテリーを使用して5ボルトに変換し、LM7805電圧レギュレーターを使用します。掃除機を主回路に直接接続します。
Arduinoベースの床掃除ロボットの回路を構築する
自分のロボットについてのアイデアを得るために、オンラインで掃除機のロボットを検索し、丸い形のロボットの画像をいくつか入手しました。そこで、丸型のロボットを作ることにしました。ロボットのチェイスとボディを構築するために、フォームシート、MDF、段ボールなどのオプションがたくさんあります。しかし、MDFは硬く、耐水性があるため、MDFを選択します。これを行う場合は、ボットに選択するマテリアルを決定できます。
ロボットを作るために、MDFシートを取り、半径8 CMの円を2つ描き、 その円の中に半径4CMの円をもう1つ描きました。掃除機の取り付け用。それから私は円を切り取りました。また、ホイールパスに適した部分をカットして削除しました(理解を深めるために画像を参照してください)。最後に、キャスターホイール用に3つの小さな穴を開けました。次のステップは、ブラケットを使用してモーターをベースに取り付け、キャスターホイールをその位置に配置して固定することです。その後、超音波センサーをロボットの左、右、中央に配置します。また、IRモジュールをロボットの下側に接続します。外側にスイッチを追加することを忘れないでください。ロボットの構築は以上です。この時点で混乱している場合は、次の画像を参照してください。
上部もフォームシートに半径11CMの円を描いてカットしました。上部と下部の間隔は、4CMの長さのプラスチックチューブを3本カットしました。その後、下部にプラスチックスペーサーを接着し、次に上部を接着しました。必要に応じて、ボットの側面部分をプラスチックまたは同様の材料で覆うことができます。
Arduino
このプロジェクトの完全なコードは、ドキュメントの最後に記載されています。このArduinoコードは、Arduinoベースの超音波距離センサーコードに似ていますが、唯一の変更点は床の検出です。次の行では、コードがどのように機能するかを説明しています。この場合、追加のライブラリは使用していません。以下では、コードを段階的に説明しました。 HC-SR04センサーからの距離データは非常に単純であるため、デコードに追加のライブラリを使用していません。次の行では、その方法について説明しました。まず、Arduinoボードに接続されている3つの超音波距離センサーすべてのトリガーピンとエコーピンを定義する必要があります。このプロジェクトでは、3つのエコーピンと3つのトリガーピンがあります。 1が左側のセンサー、2が前面のセンサー、3が右側のセンサーであることに注意してください。
const int trigPin1 = 3; const int echoPin1 = 5; const int trigPin2 = 6; const int echoPin2 = 9; const int trigPin3 = 10; const int echoPin3 = 11; int irpin = 2;
次に、すべてが(int)型変数である距離の変数を定義し、期間については(long)を使用することを選択しました。繰り返しますが、それぞれ3つあります。また、ムーブメントのステータスを格納するための整数を定義しました。これについては、このセクションの後半で説明します。
長い期間1; 長い期間2; 長い期間3; int distanceleft; int distancefront; int distanceright; int a = 0;
次に、セットアップセクションで、 pinModes() 関数を使用して、すべてのパースペクティブピンを入力または出力として作成する必要があり ます。モジュールから超音波を送信するには、トリガーピンをHighに有効にする必要があります。つまり、すべてのトリガーピンをOUTPUTとして定義する必要があります 。また、エコーを受信するには、エコーピンの状態を読み取る必要があるため、すべてのエコーピンをINPUTとして定義する必要があります 。また、トラブルシューティングのためにシリアルモニターを有効にします。IRモジュールのステータスを読み取るために、irpinを入力として定義しました。
pinMode(trigPin1、OUTPUT); pinMode(trigPin2、OUTPUT); pinMode(trigPin3、OUTPUT); pinMode(echoPin1、INPUT); pinMode(echoPin2、INPUT); pinMode(echoPin3、INPUT); pinMode(irpin、INPUT);
そして、これらのデジタルピンは、モータードライバーの入力の出力として定義されます。
pinMode(4、OUTPUT); pinMode(7、OUTPUT); pinMode(8、OUTPUT); pinMode(12、OUTPUT);
メインループには、3つのセンサー用に3つのセクションがあります。すべてのセクションは同じように機能しますが、それぞれが異なるセンサーに対して機能します。このセクションでは、各センサーから障害物の距離を読み取り、定義された各整数に格納します。距離を読み取るには、最初にトリガーピンがクリアされていることを確認する必要があります。そのためには、トリガーピンを 2 µsの間LOWに設定する必要があります 。ここで、超音波を生成するには、トリガーピン を10 µsの間HIGHに回す必要があります 。これにより超音波音が送信され、 pulseIn() 関数を使用して移動時間を読み取り、その値を変数「 duration 」に保存できます。この関数には2つのパラメーターがあり、最初のパラメーターはエコーピンの名前であり、2番目のパラメーターには次のいずれかを記述できます。HIGHまたは LOW。 HIGHは、 pulseIn () 関数が 、バウンスした音波によってピンが HIGHになるのを待ってカウントを開始し、 音波が終了するとピンがLOWになるのを待って 、カウントを停止することを意味します。この関数は、パルスの長さをマイクロ秒単位で示します。距離を計算するために、持続時間を0.034(空気中の音速は340m / s)で乗算し、それを2で除算します(これは音波の前後の移動によるものです)。最後に、各センサーの距離を対応する整数で格納します。
digitalWrite(trigPin1、LOW); delayMicroseconds(2); digitalWrite(trigPin1、HIGH); delayMicroseconds(10); digitalWrite(trigPin1、LOW); 期間1 = pulseIn(echoPin1、HIGH); distanceleft = duration1 * 0.034 / 2;
各センサーからの距離を取得した後、 ifステートメント を使用してモーターを制御できるため、ロボットの動きを制御できます。これは非常に簡単です。最初に、障害物の距離の値を指定しました。この場合は15cmです(必要に応じてこの値を変更してください)。次に、その値に従って条件を与えました。たとえば、障害物が左側のセンサーの前に来て(つまり、左側のセンサーの距離が15 cm以下である必要があります)、他の2つの距離が大きい場合(つまり、そのセンサーの前に障害物がない場合)、次に、デジタル書き込み機能を使用して、モーターを右に駆動できます。その後、IRセンサーの状態を確認しました。ロボットが床にある場合、IRピンの値はLOWになり、そうでない場合、値は次のようになります。高。次に、その値を ints変数 に格納しました。この状態でロボットを制御します。
コードのこのセクションは、ロボットを前後に動かすために使用されます。
if(s == HIGH) { digitalWrite(4、LOW); digitalWrite(7、HIGH); digitalWrite(8、LOW); digitalWrite(12、HIGH); delay(1000); a = 1; }
しかし、モーターが後方に移動し、床が戻ってボットが前方に移動し、ボットがスタックするのを繰り返す場合、この方法には問題があります。これを克服するために、 floorが存在しないことを理解した後、値(1)をintに格納します。他の動きについてもこの状態をチェックします。
床がないことを検出した後、ロボットは前進しません。代わりに、左に移動します。このようにして、問題を回避できます。
if((a == 0)&&(s == LOW)&&(distanceleft <= 15 && distancefront> 15 && distanceright <= 15)-(a == 0)&&(s == LOW)&&(distanceleft> 15 && distancefront> 15 && distanceright> 15))
上記の状態で。まず、ロボットがフロアの状態と整数値をチェックします。ボットは、すべての条件が満たされた場合にのみ前進します。
これで、モータードライバーのコマンドを記述できます。これにより、右モーターが後方に、左モーターが前方に駆動され、ロボットが右に回転します。
コードのこのセクションは、ロボットを右に移動するために使用されます。
digitalWrite(4、HIGH); digitalWrite(7、LOW); digitalWrite(8、HIGH); digitalWrite(12、LOW);
ボットがフロアが存在しないことを検出すると、値が1に変更され、ボットは左に移動します。左に曲がると、「a」の値が1から0に変わります。
if((a == 1)&&(s == LOW)-(s == LOW)&&(distanceleft <= 15 && distancefront <= 15 && distanceright> 15)-(s == LOW)&&(distanceleft <= 15 && distancefront <= 15 && distanceright> 15)-(s == LOW)&&(distanceleft <= 15 && distancefront> 15 && distanceright> 15)-(distanceleft <= 15 && distancefront> 15 && distanceright> 15)) { digitalWrite(4、HIGH); digitalWrite(7、LOW); digitalWrite(8、LOW); digitalWrite(12、HIGH); delay(100); a = 0; }
コードのこのセクションは、ロボットを左に移動するために使用されます。
if((s == LOW)&&(distanceleft> 15 && distancefront <= 15 && distanceright <= 15)-(s == LOW)&&(distanceleft> 15 && distancefront> 15 && distanceright <= 15)-( s == LOW)&&(distanceleft> 15 && distancefront <= 15 && distanceright> 15)) { digitalWrite(4、LOW); digitalWrite(7、HIGH); digitalWrite(8、HIGH); digitalWrite(12、LOW); }
Arduinoベースのスマート掃除機ロボットを構築するのは以上です。プロジェクトの完全な作業は、このページの下部にリンクされているビデオで見つけることができます。ご不明な点がございましたら、以下にコメントしてください。