Arduinoで最もシンプルなカメロボット

さまざまなロボットの作成に関するHabrを含め、インターネットで読んだ後、自分で作ることにしました。 特に私が長い間アイドル状態で横たわっているarduinoを持っていたので。



ロボットのシャーシにお金がないため、私は最も安くて簡単にすることにしました。 感覚器官として超音波距離計が選ばれました。











アイデア





私は自分のアルドゥインのために安くて作りやすいプラットフォームを作りたかった。



ラジコンジープを使用しようとしましたが、モーターシールドの電力が通常の動作に十分ではありませんでした(偶然エンジンドライバーを火傷しました)4つのトランジスタで構成されるhブリッジが必要でした。 おもちゃのスキームを理解するのは面倒でした(そして、私はそれを壊したくはありませんでした)が、それをはんだ付けするには、祖国の大箱を調べてトランジスタを探す必要がありました。



私が自由に使えるのは、いくつかのモーター、アルミニウム板のスクラップ、ソビエトの金属製造業者でした。



設計





インターネットを旅して、車輪もトラックも持たず、最も重要なことにはギアボックスのないビームロボットに出くわしました。

全体の秘密はモーターにあり、モーターは床に対して斜めに配置されていました。 ロボットはシャフトの上に立っていました。



これにより、ギア比、エンジン出力を心配する必要がなくなります。 モーター自体は、シャフトの直径が小さいため、ギアボックスです。



建物



フレーム


モーターホルダーをアルミニウムシートから切り取り、デザイナーからフレームに取り付けて、arduinoホルダーをネジ止めしました。 複雑なことはなく、ドレメル、ドライバー、最大15分の時間です。



エレクトロニクス




前述のように、arduinoはモーターシールドを介してモーターを制御し、マイクロプロセッサーを焼かないように別々の電源を備えています。 その後、シャットダウンボタンを追加しました。 超音波距離計SRF05がボードに接続されています。 彼は2つのモードでの作業方法を知っているので、詳しくは説明しません。最初のモードでは、2つの連絡先(音声を送信するためのトリガー、2番目のデータ受信)、および彼が選択した2番目のトリガーをそれぞれ使用する必要があるとしか言えません。 センサー用のアダプターがはんだ付けされました。これには、2番目のモード(接地1接点)のセンサーが含まれていました。



プログラミング




以下のビデオは、最も単純なアルゴリズムを示しています。 ここで、より意味のあるコードを示します。 コメントにはコメントがあります。



アルゴリズムは次のとおりです。

1)軸を中心に回転し、最大距離を見つける

2)最大距離に向かって曲がる

3.1)方向転換できる場合は、ある時点までまっすぐ進みます

3.2)前進できなかった場合

4.1)スタックしている場合(前進しますが、距離は変わりません)、後退してポイント1に戻ります

4.2)壁に到達したら、停止してポイント1に戻ります



ソース:

#include <AFMotor.h> #define MaxRange 23 //      #define MaxTries 3 //      int srfPin = 16; // Pin for SRF05 int ledPin = 2; // AF_DCMotor motorL(2); AF_DCMotor motorR(1); boolean isInRange(int value,int leftBorder,int rightBorder){ return (value>leftBorder && value<rightBorder); } //   int getDistance(){ delay(50); int duration=0; //    pinMode(srfPin, OUTPUT); digitalWrite(srfPin, LOW); //  ,   delayMicroseconds(2); digitalWrite(srfPin, HIGH); //  10    delayMicroseconds(10); digitalWrite(srfPin, LOW); //      pinMode(srfPin, INPUT); duration = pulseIn(srfPin, HIGH); //     return duration/58; //    } //  void goForward(){ motorL.setSpeed(255); motorR.setSpeed(255); motorL.run(FORWARD); motorR.run(FORWARD); } void goBackward(){ motorL.setSpeed(255); motorR.setSpeed(255); motorL.run(BACKWARD); motorR.run(BACKWARD); } void turnLeft(){ motorL.setSpeed(255); motorR.setSpeed(255); motorL.run(BACKWARD); motorR.run(FORWARD); } void turnRight(){ motorL.setSpeed(255); motorR.setSpeed(255); motorL.run(FORWARD); motorR.run(BACKWARD); } void stopMovement(){ motorL.run(RELEASE); motorR.run(RELEASE); } //     int getMaxDistanseAround(){ unsigned long timeStart=millis(); int maxFound=0; //     if(random(100)<50){turnLeft();}else{turnRight();} //       while(millis()-timeStart<3000){ int curDistance=getDistance(); if( curDistance > maxFound ){ maxFound=curDistance; } } return maxFound; } //     boolean turnToDistance(int distance){ unsigned long timeStart=millis(); //    if(random(100)<50){turnLeft();}else{turnRight();} //    while(millis()-timeStart<3000){ //        //  ,     if( isInRange(getDistance(),distance-5,distance+5)){ //   usb    Serial.print("Turned to "); Serial.println(getDistance()); //  (    ) goBackward(); delay(200); stopMovement(); blinkLed(); return true;//  1, ..    } } Serial.println("distance not found"); return false;//      } //  ,      float getMySpeed(){ int secToMeas=2; float firstDistance=getDistance(); goForward(); delay(secToMeas*1000); stopMovement(); float newDistance=getDistance(); return (firstDistance-getDistance())/secToMeas/100; } //  void blinkLed(){ digitalWrite(ledPin, HIGH); delay(1000); digitalWrite(ledPin, LOW); } float mySpeedSm=0;//  /c float mySpeedM=0;//   /c void setup() { Serial.begin(9600); // set up Serial library at 9600 bps // ..          //     randomSeed(analogRead(0)); //    ,   pinMode(ledPin, OUTPUT); Serial.println("Testing systems"); blinkLed(); //   getDistance(); if(getDistance()>0){ Serial.println("Ultrasonic sensor ready"); } delay(1000/4); //   motorL.setSpeed(255); motorR.setSpeed(255); stopMovement(); blinkLed(); delay(1000/3); Serial.println("Getting averange speed"); blinkLed(); mySpeedSm=getMySpeed(); mySpeedM=mySpeedSm/100; blinkLed(); blinkLed(); blinkLed(); } int tries=MaxTries; //     void loop(){ //    int maxDist=getMaxDistanseAround(); Serial.print("Found max distance"); Serial.println(maxDist); delay(500); //     if(turnToDistance(maxDist)){ tries=MaxTries;//    int lastDistance=getDistance(); //      while(lastDistance>MaxRange){ goForward(); delay(500); //     int newDist=getDistance(); if(isInRange(newDist,lastDistance-2,lastDistance+2)){ goBackward(); delay(1000); lastDistance=0; } else{ lastDistance=newDist; } } }else{ //       //    tries--; if(tries==0){//        - if(getDistance()>MaxRange*2){ goForward(); delay(1000); } else{ goBackward(); delay(1000); } } } stopMovement(); delay(500); }
      
      







映像







おわりに



ある晩、簡単なロボットを作ることが本当に可能になります。 もちろん、不完全な点もあります。たとえば、センサーをサーボモーターに掛けて、ワイヤを通常の状態に戻す必要があります。 このロボットをお楽しみください。



All Articles