Paso 8: Diseño de Software
El rover es un obstáculo, evitando robot que poco a poco para evitar un obstáculo cercano y congelar si es completamente incapaz de moverse, que debe prevenir daños. El software para el robot es una básica máquina de estado, que de control claro y sencillo. Después de inicializar las direcciones GPIO, continuamente se detectará el Edison, procesar y reaccionar sin cesar. En este caso, la salida única del robot es un cambio en la dirección del motor. Los sensores IR tienen salidas de limpieza digitales que son alta o baja, lo que los convierte en simples eventos que fácilmente pueden ser almacenados como un estado booleano. Debido a la naturaleza de corto alcance de los sensores, el software del robot es meramente reactivo a eventos externos. Si está equipado con un IR o telémetro ultrasónico, el robot sería capaz de determinar proactivamente una ruta, que haría más interesante comportamiento. Cuando empezar, sugiero trabajar con un solo tipo de sensor y aprender cómo puede procesar los datos de él. Una vez que estés a gusto trabajando con un solo tipo de entrada, poco a poco añadir más sensores y prueba de ellos en el camino. Este enfoque es mucho más metódico, pero le ahorrará el dolor de cabeza de tratar de integrar muchos sensores diferentes al mismo tiempo, que puede ser difícil de depurar.
INTEL Introducción a robótica 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 / / delantera izquierda #define PIN_SENSOR_FRONT_R 1 #define PIN_SENSOR_REAR_L 2 / / trasera izquierda #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 boolean STATE_IDLE 4 sensorFrontLActive = false; Boolean sensorFrontRActive = false; Boolean sensorRearLActive = false; Boolean sensorRearRActive = false; driveTime int = 4000; curTime larga sin signo milisegundos = 0; sin firmar largo lastTime = 0; int currentState = STATE_FORWARD; int lastState = STATE_IDLE; motorSpeed bytes = 64; máximo es de 255 void setup() {pinMode (PIN_MOTOR1IN1, salida) pinMode (PIN_MOTOR1IN2, salida) pinMode (PIN_MOTOR2IN1, salida); pinMode (PIN_MOTOR2IN2, salida); pinMode (PIN_SENSOR_FRONT_L, entrada); pinMode (PIN_SENSOR_FRONT_R, entrada); pinMode (PIN_SENSOR_REAR_L, entrada); pinMode (PIN_SENSOR_REAR_R, entrada);} / / rutina de configuración final void loop() {getSensorInput(); / / registro de la cruda situación de la currentState de detectores IR = processSensorData(); / / decidir que estado entrar / * curTime = millis(); / / pequeña prueba de rutina para funcionar a través de los Estados si (curTime - lastTime > driveTime) {lastTime = curTime; currentState ++; if (currentState > 4) {currentState = 0;}} * / Si (currentState! = lastState) {/ / sólo actualizar el controlador, si algo ha cambiado lastState = currentState; switch (currentState) {caso STATE_FORWARD: moveForward(); break; caso STATE_REVERSE: moveReverse(); break; caso STATE_IDLE: idle(); break; caso STATE_TURNING_L: moveLeft(); break; caso STATE_TURNING_R: moveRight(); break; default: / / idle si processSensorData() hizo un idle() error; break;} / / fin SWITCHCASE} / / fin IF currentState} / / fin principal bucle void getSensorInput() {sensorFrontLActive =! digitalRead(PIN_SENSOR_FRONT_L); / / guardar la lógica no estado de la digitalRead() porque los sensores están activos BAJA sensorFrontRActive =! digitalRead(PIN_SENSOR_FRONT_R); sensorRearLActive =! digitalRead(PIN_SENSOR_REAR_L); sensorRearRActive =! digitalRead(PIN_SENSOR_REAR_R); } / / FIN función getSensorInput() int processSensorData() {//If allí no es entrada, sólo avanzar si (! sensorFrontLActive & &! sensorFrontRActive & &! sensorRearLActive & &! sensorRearRActive) {vuelta STATE_FORWARD;} / y si algo está delante del robot, si (sensorFrontLActive & & sensorFrontRActive) {vuelta STATE_REVERSE;} //If algo está a la derecha mientras se mueve hacia adelante, girar a la izquierda si (currentState == STATE_FORWARD & & sensorFrontRActive) {vuelta STATE_TURNING_L;} //If algo está a la izquierda mientras se mueve hacia adelante , vuelta derecha if (currentState == STATE_FORWARD & & sensorFrontLActive) {vuelta STATE_TURNING_R;} //If algo está a la derecha mientras se mueve en reversa, girar a la derecha si (currentState == STATE_REVERSE & & sensorFrontLActive) {vuelta STATE_TURNING_R;} //If algo es sólo el de la izquierda mientras se mueve en reversa, girar a la izquierda si (currentState == STATE_REVERSE & & sensorFrontLActive) {vuelta STATE_TURNING_L;} //If todos los sensores están activos , inactivo en lugar de si (sensorFrontLActive & & sensorFrontRActive & & sensorRearLActive & & sensorRearRActive) {vuelta STATE_IDLE;} / * acelerar (no implementado) si no se detecta ningún obstáculo, por defecto a una velocidad lenta si algo es detectado! Si algo está delante del robot mientras marcha atrás, acelera! Si algo se detecta detrás del robot, la velocidad de! * / < Br >} / / END FUNCTION processSensorData() void moveForward() {/ / izquierda = hacia delante, derecha = inversa digitalWrite (PIN_MOTOR1IN1 alta); digitalWrite (PIN_MOTOR1IN2, bajo); analogWrite (PIN_MOTOR1PWM, motorSpeed); digitalWrite (PIN_MOTOR2IN1, alto); digitalWrite (PIN_MOTOR2IN2, bajo); analogWrite (PIN_MOTOR2PWM, motorSpeed);} void moveReverse() {/ / izquierda = atrás, derecha = adelante digitalWrite (PIN_MOTOR1IN1, LOW); digitalWrite (PIN_MOTOR1IN2, alto); analogWrite (PIN_MOTOR1PWM, motorSpeed); digitalWrite (PIN_MOTOR2IN1, bajo); digitalWrite (PIN_MOTOR2IN2 ALTO); analogWrite (PIN_MOTOR2PWM, motorSpeed); } void moveLeft() {/ / izquierda = atrás, derecha = inversa digitalWrite (PIN_MOTOR1IN1, bajo); digitalWrite (PIN_MOTOR1IN2 alta); analogWrite (PIN_MOTOR1PWM, motorSpeed); digitalWrite (PIN_MOTOR2IN1, alto); digitalWrite (PIN_MOTOR2IN2, bajo); analogWrite (PIN_MOTOR2PWM, motorSpeed);} void moveRight() {/ / izquierda = hacia delante, derecha = adelante digitalWrite (PIN_MOTOR1IN1, alto); digitalWrite (PIN_MOTOR1IN2, bajo); analogWrite (PIN_MOTOR1PWM, motorSpeed); digitalWrite (PIN_MOTOR2IN1, bajo); digitalWrite (PIN_MOTOR2IN2 alta); analogWrite (PIN_MOTOR2PWM, motorSpeed);} void idle() {/ motor entradas baja digitalWrite (PIN_MOTOR1IN1 ALTO); digitalWrite (PIN_MOTOR1IN2, bajo); digitalWrite (PIN_MOTOR1PWM, bajo); digitalWrite (PIN_MOTOR2IN1, alto); digitalWrite (PIN_MOTOR2IN2, bajo); digitalWrite (PIN_MOTOR2PWM, bajo); }