Wallbots: Autonoma magnetiska robotar att korsa vertikala ytor (11 / 12 steg)
Steg 11: Ladda upp koden till Arduino
Jag klistrar min koden nedan. Varje sensor ingår i urvalet, och roboten rör sig beroende på vilken sensor känner av en mänsklig hand, och om det är röd, grön eller gul (om det skulle gå bort eller mot objekt)./*
Wallbots kod
Stacey Kuznetsov
6 maj, 2009
för att göra saker interaktiva, våren ' 09
Detta är den grundläggande koden till driva robotic rörlighet för 2 sevo motors baserat på input
från 4 ljussensorer. Förslaget stöder flera inställningar, baserat på robot läge.
Röda robotar rör sig snabbt, mot objekt (när ljussensorer upptäcka mörker)
Gröna robotar flytta på medellång hastighet, från objekt (från mörkare områden)
Gul robotar flytta slowerly och slutar för att blinka när objekt upptäcks
Syftet med dessa robotar är att flytta på väggarna med hjälp av magnetiska hjul.
Stöds rörelsen omfattar höger, vänster och framåt riktningar. Flera
hastigheter genomförs baserat på robot läge.
Ljussensorer kalibrera auto-på omstart eller när översta sensorn är täckt
för mer än 3 sekunder.
*/
#include < Servo.h >
Höger och vänster servon
Servo servo1;
Servo servo2;
Ljussensorer
int topSensor = 0; 700
int leftSensor = 1; Tröskelvärdet är 400
int frontSensor = 2; 400
int rightSensor = 3; 300
Hårdkodad tröskelvärden (används inte eftersom vi auto-kalibrera)
int topThreshhold = 400.
int leftThreshhold = 550;
int frontThreshhold = 200.
int rightThreshhold = 650;
Aktuella robot typ (röd grön eller gul)
int STATE = 0;
Statliga värden
int rött = 0;
int grön = 1;
int ORANGE = 2;
Stift för att driva topp tri-color LED
int redPin = 5;
int greenPin = 6;
Värden att hålla sensormätningar
int fronten;
int rätt;
int kvar;
int topp;
Auto-kalibrera ljussensor tröskelvärden
void calibrate() {
Serial.println("CALIBRATING");
långa int val = 0;
för (int jag = 0; jag < 5; i ++) {
Val += analogRead(frontSensor);
Delay(10);
}
frontThreshhold = (värde /5) - 80.
Val = 0;
för (int jag = 0; jag < 5; i ++) {
Val = val + analogRead(topSensor);
Serial.println(analogRead(topSensor));
Serial.println(val);
Delay(10);
}
topThreshhold = (värde /5) -200;
Val = 0;
för (int jag = 0; jag < 5; i ++) {
Val += analogRead(rightSensor);
}
rightThreshhold = (värde /5) - 100.
Val = 0;
för (int jag = 0; jag < 5; i ++) {
Val += analogRead(leftSensor);
}
leftThreshhold = (värde /5) - 100.
Skriva ut tröskelvärden för debug
Serial.Print ("top:");
Serial.println(topThreshhold);
Serial.Print ("rätt:");
Serial.println(rightThreshhold);
Serial.Print ("vänster:");
Serial.println(leftThreshhold);
Serial.Print ("front:");
Serial.println(frontThreshhold);
}
void setup()
{
slå på stift 13 för debug
pinMode (13, OUTPUT);
digitalWrite 13, hög.
setup sensor stift
för (int jag = 0; jag < 4; i ++) {
pinMode (i, ingång);
}
Serial.BEGIN(9600);
Calibrate();
Generera en slumpmässig stat
STATE = random (0, 3);
setColor(STATE);
}
MOTORISKA FUNKTIONER
void turnLeft()
{
Serial.println("left");
Start();
Delay(20);
för (int jag = 0; jag < 20; i ++) {
servo2.write(179);
servo1.write(1);
Delay(20);
}
Stop();
Delay(20);
}
void turnRight() {
Serial.println("Right");
Start();
Delay(20);
för (int jag = 0; jag < 20; i ++) {
servo2.write(1);
servo1.write(179);
Delay(20);
}
Stop();
Delay(20);
}
void goForward (int del = 20) {
Serial.println("forward");
Start();
Delay(20);
för (int jag = 0; jag < 20; i ++) {
servo1.write(179);
servo2.write(179);
Delay(del);
}
Stop();
Delay(20);
}
void stop() {
servo1.detach();
servo2.detach();
Delay(10);
}
void start() {
servo1.attach(10);
servo2.attach(9);
}
Uppsättning färg på översta tri-color LED utifrån aktuella tillstånd
Annullera setColor (int färg) {
om (färg == RED) {
digitalWrite (greenPin, 0);
analogWrite (redPin, 180);
}
annars om (färg == GREEN) {
digitalWrite (redPin, 0);
analogWrite (greenPin, 180);
}
annars om (färg == ORANGE) {
analogWrite (redPin, 100);
analogWrite (greenPin, 100);
}
}
Blinka den gula färgen (när roboten är förvirrad)
void blinkOrange() {
för (int jag = 0; jag < 5; i ++) {
analogWrite (redPin, 100);
analogWrite (greenPin, 100);
Delay(300);
digitalWrite (redPin, 0);
digitalWrite (greenPin, 0);
Delay(300);
}
analogWrite (redPin, 100);
analogWrite (greenPin, 100);
}
void loop()
{
toppen = analogRead(topSensor);
långa int tid = millis();
medan (analogRead(topSensor) < topThreshhold) {
Delay(10); medan det finns en arm våg från användaren inte gör något
}
om ((millis()-time) > 3000) {
om sensorn var täckt i mer än 3 sekunder, kalibrera
Calibrate();
}
om top sensorn täcktes, ändra vi status
om (top < topThreshhold) {
STATEN (STATLIGT + 1) = %3.
setColor(STATE);
Serial.Print ("ändrade tillstånd:");
Serial.println(State);
}
Läs de andra sensorerna
höger = analogRead(rightSensor);
vänster = analogRead(leftSensor);
Front = analogRead(frontSensor);
om (statligt == RED) {
gå mot objekt
om (främre < frontThreshhold) {
goForward();
} else om (rätt < rightThreshhold) {
turnRight();
} else om (vänster < leftThreshhold) {
turnLeft();
} annat {
goForward();
}
}
om (statligt == GREEN) {
gå bort från objekt
om (främre < frontThreshhold) {
int dir = random(0,2);
om (dir == 0 & & r > rightThreshhold) {
turnRight();
} else om (dir == 1 & & vänster > leftThreshhold) {
turnLeft();
}
} else om (rätt < rightThreshhold) {
om (vänster > leftThreshhold) {
turnLeft();
} annat {
goForward();
}
} else om (vänster < leftThreshhold) {
om (rätt > rightThreshhold) {
turnRight();
} annat {
goForward();
}
} annat {
goForward();
}
Delay(200);
}
om (statligt == ORANGE) {
bara flytta om det finns ingen hand rörelser-annars blinkar
int dir = random (0, 3);
om (vänster < leftThreshhold || rätt < rightThreshhold ||
främre < leftThreshhold) {
blinkOrange();
} annat {
om (dir == 0) {
goForward();
} else om (dir == 1) {
turnRight();
} else om (dir == 2) {
turnLeft();
}
Delay(1000);
}
Delay(10);
}
}