Intro till Robotics (8 / 10 steg)
Steg 8: Software Design
Rover är ett hinder att undvika robot som övergår gradvis till undvika ett närliggande hinder och frysa om det inte helt går att flytta, som bör förhindra skador. Programvaran för roboten är en grundläggande tillståndsdator, vilket gör för enkel och tydlig kontroll. Efter initieringen GPIO anvisningarna, kommer Edison kontinuerligt känsla, process, och reagera oändligt. I det här fallet är robotens enda utdata en förändring i motor riktning. IR-sensorer har rent digitala utgångar som är antingen hög eller låg, vilket gör att omvandla dem till enkla händelser som lätt kan lagras som en boolesk stat. Pågrund kort räckvidd av sensorer är robot software enbart reaktiv till yttre händelser. Om utrustad med en IR eller ultraljud avståndsmätare, skulle roboten kunna aktivt bestämma en väg som skulle göra för mer intressant beteende. När börjar, föreslår jag att arbeta med en enda typ av sensor och lära sig hur väl du kan bearbeta data från den. När du är bekväm att arbeta med en enda typ av ingång, långsamt lägga till sensorer och testa dem längs vägen. Detta tillvägagångssätt är mycket mer metodiskt, men sparar huvudvärk av försöker integrera många olika sensorer samtidigt, vilket kan vara svårt att felsöka.
Intellekten Intro till Robotics Demo
#define PIN_MOTOR1IN1 4
#define PIN_MOTOR1IN2 5
#define PIN_MOTOR1PWM 6
#define PIN_MOTOR2IN1 7
#define PIN_MOTOR2IN2 8
#define PIN_MOTOR2PWM 9
#define PIN_SENSOR_FRONT_L 0 / / främre vänster
#define PIN_SENSOR_FRONT_R 1
#define PIN_SENSOR_REAR_L 2 / / bak vänster
#define PIN_SENSOR_REAR_R 3
#define STATE_TURNING_L 0
#define STATE_TURNING_R 1
#define STATE_FORWARD 2
#define STATE_REVERSE 3
#define STATE_IDLE 4
booleska sensorFrontLActive = false;
booleska sensorFrontRActive = false;
booleska sensorRearLActive = false;
booleska sensorRearRActive = false;
int driveTime = 4000; millisekunder
osignerade långa curTime = 0;
osignerade långa lastTime = 0;
int currentState = STATE_FORWARD;
int lastState = STATE_IDLE;
byte motorSpeed = 64; Max är 255
void setup() {
pinMode (PIN_MOTOR1IN1, OUTPUT);
pinMode (PIN_MOTOR1IN2, OUTPUT);
pinMode (PIN_MOTOR2IN1, OUTPUT);
pinMode (PIN_MOTOR2IN2, OUTPUT);
pinMode (PIN_SENSOR_FRONT_L, indata);
pinMode (PIN_SENSOR_FRONT_R, indata);
pinMode (PIN_SENSOR_REAR_L, indata);
pinMode (PIN_SENSOR_REAR_R, indata);
} / / END SETUP RUTIN
void loop() {
getSensorInput(); spela in raw status av IR-detektorerna
currentState = processSensorData(); besluta vilka staten att gå in
/ * curTime = millis(); liten test rutin att köra igenom staterna
om (curTime - lastTime > driveTime) {
lastTime = curTime;
currentState ++;
om (currentState > 4) {
currentState = 0;
}
}*/
om (currentState! = lastState) {/ / endast uppdatera drivrutinen om något har förändrats
lastState = currentState;
Växla (currentState) {
fall STATE_FORWARD:
moveForward();
bryta;
fall STATE_REVERSE:
moveReverse();
bryta;
fall STATE_IDLE:
Idle();
bryta;
fall STATE_TURNING_L:
moveLeft();
bryta;
fall STATE_TURNING_R:
moveRight();
bryta;
standard: / / idle om processSensorData() gjorde ett misstag
Idle();
bryta;
} / / END SWITCHCASE
} / / END IF currentState
} / / END MAIN LOOP
void getSensorInput() {
sensorFrontLActive =! digitalRead(PIN_SENSOR_FRONT_L); spara den logiska inte läget för digitalRead() eftersom sensorerna är aktiv låg
sensorFrontRActive =! digitalRead(PIN_SENSOR_FRONT_R);
sensorRearLActive =! digitalRead(PIN_SENSOR_REAR_L);
sensorRearRActive =! digitalRead(PIN_SENSOR_REAR_R);
} / / END funktionen getSensorInput()
int processSensorData() {
Om det finns någon input, bara gå framåt
om (! sensorFrontLActive & &! sensorFrontRActive & &! sensorRearLActive & &! sensorRearRActive) {
återvända STATE_FORWARD;
}
Om något är framför roboten, omvänd
om (sensorFrontLActive & & sensorFrontRActive) {
återvända STATE_REVERSE;
}
Om något är till höger medan du flyttar framåt, sväng vänster
om (currentState == STATE_FORWARD & & sensorFrontRActive) {
återvända STATE_TURNING_L;
}
Om något är till vänster när du flyttar fram, sväng höger
om (currentState == STATE_FORWARD & & sensorFrontLActive) {
återvända STATE_TURNING_R;
}
Om något är till höger medan du flyttar bakåt, sväng höger
om (currentState == STATE_REVERSE & & sensorFrontLActive) {
återvända STATE_TURNING_R;
}
Om något är bara på vänster medan du flyttar i omvänd, sväng vänster
om (currentState == STATE_REVERSE & & sensorFrontLActive) {
återvända STATE_TURNING_L;
}
Om alla sensorer är aktiv, inaktiv på plats
om (sensorFrontLActive & & sensorFrontRActive & & sensorRearLActive & & sensorRearRActive) {
återvända STATE_IDLE;
}
/*
(inte genomfört)
Accelerera om inga hinder upptäcks, Använd en långsam hastighet om något hittas!
Om något är framför roboten samtidigt vända, påskynda!
Om något upptäcks bakom roboten, påskynda!
* / < br >
} / / END funktionen processSensorData()
void moveForward() {/ / vänster = fram, höger = bakåt
digitalWrite (PIN_MOTOR1IN1, hög);
digitalWrite (PIN_MOTOR1IN2, låg);
analogWrite (PIN_MOTOR1PWM, motorSpeed);
digitalWrite (PIN_MOTOR2IN1, hög);
digitalWrite (PIN_MOTOR2IN2, låg);
analogWrite (PIN_MOTOR2PWM, motorSpeed);
}
void moveReverse() {/ / vänster = bakåt, höger = framåt
digitalWrite (PIN_MOTOR1IN1, låg);
digitalWrite (PIN_MOTOR1IN2, hög);
analogWrite (PIN_MOTOR1PWM, motorSpeed);
digitalWrite (PIN_MOTOR2IN1, låg);
digitalWrite (PIN_MOTOR2IN2, hög);
analogWrite (PIN_MOTOR2PWM, motorSpeed);
}
void moveLeft() {/ / vänster = bakåt, höger = bakåt
digitalWrite (PIN_MOTOR1IN1, låg);
digitalWrite (PIN_MOTOR1IN2, hög);
analogWrite (PIN_MOTOR1PWM, motorSpeed);
digitalWrite (PIN_MOTOR2IN1, hög);
digitalWrite (PIN_MOTOR2IN2, låg);
analogWrite (PIN_MOTOR2PWM, motorSpeed);
}
void moveRight() {/ / vänster = fram, höger = framåt
digitalWrite (PIN_MOTOR1IN1, hög);
digitalWrite (PIN_MOTOR1IN2, låg);
analogWrite (PIN_MOTOR1PWM, motorSpeed);
digitalWrite (PIN_MOTOR2IN1, låg);
digitalWrite (PIN_MOTOR2IN2, hög);
analogWrite (PIN_MOTOR2PWM, motorSpeed);
}
void idle() {/ / motor ingångar låg
digitalWrite (PIN_MOTOR1IN1, hög);
digitalWrite (PIN_MOTOR1IN2, låg);
digitalWrite (PIN_MOTOR1PWM, låg);
digitalWrite (PIN_MOTOR2IN1, hög);
digitalWrite (PIN_MOTOR2IN2, låg);
digitalWrite (PIN_MOTOR2PWM, låg);
}