Paso 11: Añadir el código en el Arduino
Estoy pegando mi código a continuación. Cada sensor se muestrea, y el robot se mueve dependiendo del sensor que detecta una mano humana, y si es rojo, verde o amarillo (debe moverse lejos o hacia objetos)./*
Código Wallbots
Stacey Kuznetsov
06 de mayo de 2009
para hacer cosas interactivas, primavera ' 09
Este es el código básico para conducir movimiento robótico de 2 motores de sevo basado en entrada
de 4 sensores de luz. Movimiento admite varias opciones, basados en el modo de robot.
Robot rojo moverse rápido, hacia los objetos (cuando los sensores de luz detectan oscuridad)
Mover robots verde a velocidad media, lejos de objetos (lejos de las áreas más oscuras)
Amarillo robots mover slowerly y dejar de parpadear cuando se detectan objetos
El propósito de estos robots es mover las paredes usando ruedas magnéticas.
Movimiento de apoyo incluye, direcciones izquierdas y hacia adelantadas. Varios
velocidades se implementan basados en el modo de robot.
Los sensores de luz auto-calibran en el reinicio o cuando se cubre el sensor superior
durante más de 3 segundos.
*/
#include < Servo.h >
Servos de derecha e izquierdos
Servo1 servo;
Servo servo2;
Sensores de luz
int topSensor = 0; 700
int leftSensor = 1; Umbral es 400
int frontSensor = 2; 400
int rightSensor = 3; 300
Umbrales de codificado (no se usa porque auto-calibre)
int topThreshhold = 400;
int leftThreshhold = 550;
int frontThreshhold = 200;
int rightThreshhold = 650;
Tipo de robot actual (gree rojo o amarillo)
int estado = 0;
Valores de estado
int rojo = 0;
int verde = 1;
int naranja = 2;
Pernos para manejar el LED superior tri-color
redPin int = 5;
int greenPin = 6;
Valores para mantener las lecturas del sensor
int frente;
int derecha;
int izquierda;
int cima;
Umbrales de sensor de luz automático-calibre
void calibrate() {}
Serial.println("calibrating");
largo int val = 0;
para (int i = 0; i < 5; i ++) {}
Val += analogRead(frontSensor);
Delay(10);
}
frontThreshhold = (val 5) - 80;
Val = 0;
para (int i = 0; i < 5; i ++) {}
Val val = analogRead(topSensor);
Serial.println(analogRead(topSensor));
Serial.println(Val);
Delay(10);
}
topThreshhold = (val 5) -200;
Val = 0;
para (int i = 0; i < 5; i ++) {}
Val += analogRead(rightSensor);
}
rightThreshhold = (val 5) - 100;
Val = 0;
para (int i = 0; i < 5; i ++) {}
Val += analogRead(leftSensor);
}
leftThreshhold = (val 5) - 100;
Imprimir valores umbral para depuración
Serial.Print ("top:");
Serial.println(topThreshhold);
Serial.Print ("derecho:");
Serial.println(rightThreshhold);
Serial.Print ("izquierda:");
Serial.println(leftThreshhold);
Serial.Print ("delante:");
Serial.println(frontThreshhold);
}
void setup()
{
convertir el pin 13 para depuración
pinMode (13, salida);
digitalWrite (13, HIGH);
configuración de pines del sensor
para (int i = 0; i < 4; i ++) {}
pinMode (, entrada);
}
Serial.Begin(9600);
Calibrate();
generar un estado aleatorio
Estado = al azar (0, 3);
setColor(STATE);
}
FUNCIONES MOTORAS
turnLeft() vacío
{
Serial.println("left");
Start();
Delay(20);
para (int i = 0; i < 20; i ++) {}
servo2.Write(179);
servo1.Write(1);
Delay(20);
}
STOP();
Delay(20);
}
{} void turnRight()
Serial.println("Right");
Start();
Delay(20);
para (int i = 0; i < 20; i ++) {}
servo2.Write(1);
servo1.Write(179);
Delay(20);
}
STOP();
Delay(20);
}
void goForward (int del = 20) {}
Serial.println("forward");
Start();
Delay(20);
para (int i = 0; i < 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);
}
El color del LED tri-color superior basado en el estado actual del sistema
void colores (int color) {}
Si (color == rojo) {}
digitalWrite (greenPin, 0);
analogWrite (redPin, 180);
}
else if (color verde de ==) {}
digitalWrite (redPin, 0);
analogWrite (greenPin, 180);
}
else if (color naranja de ==) {}
analogWrite (redPin, 100);
analogWrite (greenPin, 100);
}
}
Parpadea el color amarillo (al robot se confunde)
void blinkOrange() {}
para (int i = 0; i < 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()
{
Top = analogRead(topSensor);
int largo = millis();
mientras que (analogRead(topSensor) < topThreshhold) {}
Delay(10); mientras que hay una onda de brazo del usuario no hacen nada
}
Si ((millis()-time) > 3000) {}
Si el sensor fue cubierto por más de 3 segundos, volver a calibrar
Calibrate();
}
Si se cubre el sensor superior, cambiar estado
Si (superior < topThreshhold) {}
ESTADO = (ESTADO + 1) 3 %;
setColor(STATE);
Serial.Print ("Estado cambió:");
Serial.println(State);
}
Leer los otros sensores
derecha = analogRead(rightSensor);
izquierda = analogRead(leftSensor);
frente = analogRead(frontSensor);
Si (estado == rojo) {}
ir hacia los objetos
Si (frente < frontThreshhold) {}
goForward();
} else if (derecha < rightThreshhold) {}
turnRight();
} else if (izquierda < leftThreshhold) {}
turnLeft();
} else {}
goForward();
}
}
Si (estado == verde) {}
ir lejos de objetos
Si (frente < frontThreshhold) {}
dir int = random(0,2);
Si (dir == 0 & & right > rightThreshhold) {}
turnRight();
} else if (dir == 1 & & izquierda > leftThreshhold) {}
turnLeft();
}
} else if (derecha < rightThreshhold) {}
Si (izquierda > leftThreshhold) {}
turnLeft();
} else {}
goForward();
}
} else if (izquierda < leftThreshhold) {}
Si (derecha > rightThreshhold) {}
turnRight();
} else {}
goForward();
}
} else {}
goForward();
}
Delay(200);
}
Si (estado == naranja) {}
mueve sólo si hay que ninguna mano movimientos-parpadean
int dir = al azar (0, 3);
Si (izquierda < leftThreshhold || derecha < rightThreshhold ||
frente < leftThreshhold) {}
blinkOrange();
} else {}
Si (dir == 0) {}
goForward();
} else if (dir == 1) {}
turnRight();
} else if (dir == 2) {}
turnLeft();
}
Delay(1000);
}
Delay(10);
}
}