Anpassade Arduino Shield och sensorer (10 / 10 steg)
Steg 10: Arduino koden för hinder undvika Robot
Koden nedan används sensorer från detta instructable för att styra en autonom hinder undvika robot. Växlarna blad används för att upptäcka kontakt med föremål till vänster och höger. Om en kontakt växel är aktiverad, roboten stannar, ryggen upp och sedan vänder sig bort från objektet innan du fortsätter. IR-avstånd sensorn används för att bestämma avståndet till föremål framför roboten. Om ett objekt är närmare än en avvikelser, roterar ett servo och robot hållplatser mot IR-sensorn till höger och till vänster för mätningar. Roboten vänder sedan i riktning mot tydligare sökvägen innan du fortsätter. En knapp används för att starta roboten. Även om inte tekniskt sensorer, används laser, Summer och lysdioder att ge ljud- och ljussignal feedback från sensorerna. När roboten är i rörelse, lyser den gröna lysdioden. När roboten slutar, lyser Summer ljud och den röda lampan. Lasern är fäst mot IR-sensorn ger en visuell indikation på var IR-avstånd sensorn pekar.
Jag har klistrat Arduino koden nedan (med skruvas upp formatering), men av någon anledning inte kunde jag ladda upp en fil som innehåller koden. Detta är konstigt eftersom jag kunde göra det för min tidigare instructable. Men denna gång, när jag försöker ladda upp .ino filen får jag meddelandet "fel 400: kan inte ladda upp skript:"
/ * 4/29/14
Denna kod sysselsätter flera sensorer för att styra beteendet
autonoma hinder att undvika robot. Som roboten
rör sig framåt, en IR-avstånd sensorn mäter avståndet
hinder i robotens väg. Om det uppmätta avståndet
understiger en avvikelser, en servo kastruller och robot hållplatser
IR-sensorn höger och vänster att bestämma den tydligaste sökvägen.
Roboten vänder sedan i riktning mot den tydligaste väg
och sedan intäkter.
Höger och vänster löv växlar upptäcka kontakt med föremål
till höger eller vänster om roboten. När kontakt, den
robot ryggen upp och sedan vänder sig bort från det upptäckta objektet
innan du fortsätter.
En laser monterad ovanför IR-sensorn indikerar riktning
där roboten är "ute". När roboten stoppar en
röd lysdiod är tänd och en piezo Summer ljud. När roboten är
framåt, är en grön lysdiod tänd. När roboten drivs
upp sker ingen rörelse tills en knapp på roboten är
är nedtryckt.
*/
#include < Servo.h >
Servo leftWheelServo;
Servo rightWheelServo;
Servo panServo;
Deklarera digital pins
int stopLightPin = 2;
int leftContactPin = 3;
int rightContactPin = 4;
int servoPinLeft = 5;
int servoPinRight = 6;
int laserPin = 7.
int goLightPin = 8;
int servoPinPan = 9;
int buzzerPin = 12;
int buttonPin = 13.
Deklarera analoga pins
int IRpin = 4;
Definiera variabler
int distanceReading;
int wallDistance;
int wallDistanceTolerance = 30.
int distanceReadingLeft;
int distanceReadingRight;
int wallDistanceLeft;
int wallDistanceRight;
int panDelay = 1000; Dröjsmål att IR-sensorn ta en behandling
int turnTime = 250; Varaktigheten av tur baserat på försök och misstag
int buzzTime = 200.
int buttonValue = 0;
int oldButtonValue = 0;
int leftContactValue = 0;
int rightContactValue = 0;
void setup()
{
pinMode (buzzerPin, produktionen);
pinMode (stopLightPin, produktionen);
pinMode (goLightPin, produktionen);
pinMode (buttonPin, ingång);
pinMode (laserPin, produktionen);
digitalWrite (buzzerPin, låg);
digitalWrite (stopLightPin, låg);
digitalWrite (goLightPin, låg);
leftWheelServo.attach(servoPinLeft);
rightWheelServo.attach(servoPinRight);
panServo.attach(servoPinPan);
Ljud Summer att indikera att roboten har makt
digitalWrite (stopLightPin, hög);
digitalWrite (buzzerPin, hög);
Delay(buzzTime);
digitalWrite (buzzerPin, låg);
Vänta tills knappen trycks innan du flyttar
medan (buttonValue == låg)
{
leftWheelServo.write(90);
rightWheelServo.write(90);
buttonValue = digitalRead(buttonPin);
}
Ljud Summer att ange start-knappen har tryckts
digitalWrite (buzzerPin, hög);
Delay(buzzTime);
digitalWrite (buzzerPin, låg);
Avkommentera det seriella fodret för att testa om behöver vara
Serial.BEGIN(9600);
}
void loop()
{
Slå på laser
digitalWrite (laserPin, hög);
Punkt avstånd sensor rakt fram
panServo.write(90);
Gå framåt
leftWheelServo.write(0);
rightWheelServo.write(120);
digitalWrite (goLightPin, hög);
digitalWrite (stopLightPin, låg);
Test för vägg kollisioner
leftContactValue = digitalRead(leftContactPin);
om (leftContactValue == hög)
{
Stanna
leftWheelServo.write(90);
rightWheelServo.write(90);
digitalWrite (goLightPin, låg);
digitalWrite (stopLightPin, hög);
digitalWrite (buzzerPin, hög);
Delay(buzzTime);
digitalWrite (buzzerPin, låg);
Säkerhetskopiering
leftWheelServo.write(120);
rightWheelServo.write(0);
digitalWrite (goLightPin, hög);
digitalWrite (stopLightPin, låg);
Delay(500);
Sväng höger
leftWheelServo.write(180);
rightWheelServo.write(180);
Delay(turnTime);
leftWheelServo.write(90);
rightWheelServo.write(90);
Återställa vänstra kontakt variabel
leftContactValue = 0;
}
rightContactValue = digitalRead(rightContactPin);
om (rightContactValue == hög)
{
Stanna
leftWheelServo.write(90);
rightWheelServo.write(90);
digitalWrite (goLightPin, låg);
digitalWrite (stopLightPin, hög);
digitalWrite (buzzerPin, hög);
Delay(buzzTime);
digitalWrite (buzzerPin, låg);
Säkerhetskopiering
leftWheelServo.write(120);
rightWheelServo.write(0);
digitalWrite (goLightPin, hög);
digitalWrite (stopLightPin, låg);
Delay(500);
Sväng vänster
leftWheelServo.write(0);
rightWheelServo.write(0);
Delay(turnTime);
leftWheelServo.write(90);
rightWheelServo.write(90);
Återställa rätt sensor variabel
rightContactValue = 0;
}
Ta behandlingen från avstånd sensor
distanceReading = analogRead(IRpin);
wallDistance = 40-distanceReading/10.
Väggen avstånd formeln ovan bestäms av rättegång
och fel och linjär konvertering
Testa om en vägg är nära
om (wallDistance < wallDistanceTolerance)
{
Stanna
leftWheelServo.write(90);
rightWheelServo.write(90);
digitalWrite (goLightPin, låg);
digitalWrite (stopLightPin, hög);
digitalWrite (buzzerPin, hög);
Delay(buzzTime);
digitalWrite (buzzerPin, låg);
Panorera avstånd servo vänster och höger för att se vilken riktning
erbjuder en tydligare väg
panServo.write(170);
Delay(panDelay);
distanceReadingLeft = analogRead(IRpin);
Delay(panDelay);
wallDistanceLeft = 40-distanceReadingLeft/10.
panServo.write(20);
Delay(panDelay);
distanceReadingRight = analogRead(IRpin);
Delay(panDelay);
wallDistanceRight = 40-distanceReadingRight/10.
Avkommentera seriell print uttalanden för felsökning ändamål
Serial.Print(wallDistance);
Serial.println ("cm");
Serial.Print(wallDistanceLeft);
Serial.println ("cm");
Serial.Print(wallDistanceRight);
Serial.println ("cm");
Serial.println("");
Serial.println(distanceReading);
Serial.println(distanceReadingLeft);
Serial.println(distanceReadingRight);
Serial.println("");
Test för att se vilken riktning erbjuder en tydlig väg
och flytta roboten i den riktningen
om (wallDistanceLeft > wallDistanceRight)
{
Sväng vänster
leftWheelServo.write(180);
rightWheelServo.write(180);
Delay(turnTime);
leftWheelServo.write(90);
rightWheelServo.write(90);
}
annat
{
Sväng höger
leftWheelServo.write(0);
rightWheelServo.write(0);
Delay(turnTime);
leftWheelServo.write(90);
rightWheelServo.write(90);
}
}
Delay(200);
}