Paso 14: Listado de código el controlador de robot
/ * Bot Bluetooth Boom-pinza. Meta en la vida... Sigue los comandos enviados por arte de magia en el aire! O desde USB :) Escrito por Scott Beasley - 2015 gratis para usar o modificar. Disfrutar. * / #include / / vario tiempo demoras para conducción y servo #define TURNDELAY 475 #define TURNDELAY45 235 / / comandos de chip controlador de servo #define SETSPEED 0 x 01 #define SETPOS 0 x 04 / * área de Globals. * / / / Crear los objetos servo motor, interfaz con SoftwareSerial Serial_servo (10, 11); SoftwareSerial Serial_motors (10, 12); void setup () {/ / cambiar el baudio si es diferente de abajo Serial.begin (9600); / / conexión Bluethooth Serial_servo.begin (9600); Serial_motors.Begin (19200); detener (); set_servo_speed (0, 10); Establecer el movimiento servo velocidad set_servo_speed (1, 10); para mover un poco más suave (de home_boom); home_gripper (); Delay (500); } void loop () {comando byte = 0, val = 0; / / el siguiente deba permanecer intacto durante la vida de la / / sesión así que ellos se hacen 'static'. Esto nos mantiene de / / que tienen como variables globales estáticas byte dist = 1; Comienzo con corto mueve velocidad estática byte = 1; velocidad lenta static byte speed_offset = 40; Static byte turn_style = 1; y con vueltas duro estático byte boom_val = 60; Static byte gripper_val = 60; Si (Serial.available () > 0) {/ / leer el entrada comando byte = Serial.read ();} switch (comando) {caso 'w': go_forward (speed_offset); //Serial.println ("va adelante"); si (dist == 1) {delay (750); (alto);} else if (dist == 2) {delay (1250); (alto);} break; caso 'z': go_backward (speed_offset); //Serial.println ("ir hacia atrás"); si (dist == 1) {retardo (750), detener ();} else if (dist == 2) {retardo (1250), detener ();} break; caso 'a' : go_left (speed_offset, turn_style); retardo (TURNDELAY); detener (); Serial.println ("dando vuelta izquierda"); rotura; de caso ': go_right (speed_offset, turn_style); retardo (TURNDELAY); detener (); Serial.println ("Girar derecha"); rotura; caso 'q': go_left (speed_offset, turn_style); retardo (TURNDELAY45); detener (); Serial.println ("dando vuelta izquierda"); rotura; caso 'e': go_right (speed_offset, turn_style); retardo (TURNDELAY45); detener (); Serial.println ("Girar derecha"); rotura; caso 'h': detener (); Serial.println ("detener"); rotura; caso ' >': / / movimiento de pinza X envía servo ajuste val = Serial.read (); gripper_val = val; Limitamos el valor real movemovent límites de la configuración set_gripper (val); Serial.println ("GripperX"); rotura; caso ' ^': / / movimiento de pinza Y envía servo ajuste val = Serial.read (); boom_val = val; Limitamos el valor real movemovent límites de la configuración set_boom (val); Serial.println ("GripperY"); rotura; caso 'c': gripper_val = 60; boom_val = 60; home_boom (); home_gripper (); Serial.println ("GripperHome"); rotura; caso 'v': / / establecer la velocidad se moverá al bot; 1 = más lento, 3 = velocidad más rápida = Serial.read (); Si (velocidad == 1) {speed_offset = 40; / / lenta} else if (velocidad == 2) {speed_offset = 20; / / Med} else if (velocidad == 3) {speed_offset = 0; / / rápido!} //Serial.println ("Set speed"); rotura; caso sería ': / / establecer cuánto se moverá al bot; 1 = corto, 2 medio, / / 3 = continua dist = Serial.read (); Serial.println ("movimiento distancia set"); rotura; caso ' t ': / / Set de la manera que el bot hace giros, una rueda (suave) o dos (duro) turn_style = Serial.read (); Serial.println ("estilo de la vuelta"); rotura; caso '+': / / velocidad sistema de teléfono velocidad ++; Si (velocidad > = 4) velocidad = 1; Si (velocidad == 1) {speed_offset = 40; / / lenta} else if (velocidad == 2) {speed_offset = 20; / / Med} else if (velocidad == 3) {speed_offset = 0; / / rápido! } break; caso '-': / / Dist se movió desde teléfono dist ++; Si (dist > = 4) dist = 1; Serial.println ("movimiento distancia set"); rotura; caso ',': / / pinza abierta desde teléfono gripper_val += 10; Si (gripper_val > = 179) gripper_val = 179; set_gripper (gripper_val); Serial.println ("conjunto de la pinza"); rotura; caso '.': / / cierre pinza de teléfono gripper_val-= 10; Si (gripper_val < = 0) gripper_val = 0; set_gripper (gripper_val); Serial.println ("conjunto de la pinza"); rotura; caso '0': / / disminuir el auge del teléfono boom_val += 10; Si (boom_val > = 179) boom_val = 179; set_boom (boom_val); Serial.println ("juego de la pluma"); rotura; caso '1': / / aumentar el auge del teléfono boom_val-= 10; Si (boom_val < = 0) boom_val = 0; set_boom (boom_val); Serial.println ("juego de la pluma"); rotura; 255 del caso: / / enviado después de que agarre todos los comandos (Serial.flush); rotura; } Serial.flush (); Delay(125); } void go_forward (speed_offset bytes) {//Serial.println ("va adelante..."); Serial_motors.Write ((byte) 1 + speed_offset); Serial_motors.Write ((byte) 128 + speed_offset); } void go_backward (speed_offset bytes) {//Serial.println ("ir hacia atrás..."); Serial_motors.Write ((byte) 127 - speed_offset); Serial_motors.Write ((byte) 255 - speed_offset); } void go_left (speed_offset bytes, turn_style bytes) {//Serial.println ("ir izquierdo..."); Si (turn_style == 1) Serial_motors.write ((byte) 1 + speed_offset); más Serial_motors.write ((byte) 64); Apague el motor izquierdo (giro suave) Serial_motors.write ((byte) 255 - speed_offset); } void go_right (speed_offset bytes, turn_style bytes) {//Serial.println ("va derecho..."); Serial_motors.Write ((byte) 127 - speed_offset); Si (turn_style == 1) Serial_motors.write ((byte) 128 + speed_offset); más Serial_motors.write ((bytes) 192); Apagar el motor adecuado (giro suave)} void frenar () {//Serial.println ("alto!"); Serial_motors.Write ((byte) 0); } / / Establecer una posición de servos / servo_id es el número de servo (0-7) / ángulo es la posición abs desde 500 a 5500 void move_servo (int servo_id, int ángulo) {unsigned buff char [6] = {0 x 80, 0 x 01, SETPOS, 0 x 00, 0 x 00, 0 x 00}; unsigned unsigned char data_hi, data_low int temp; temp = ángulo & 0x1f80; data_hi = temp >> 7; data_low = ángulo & 0x7f; buff [3] = servo_id; //servo número buff [4] = data_hi; //data1 buff [5] = data_low; //data2 () Serial_servo.write Buff, 6); Serial_servo.Flush (); } void set_servo_speed (int servo_id, int velocidad) {unsigned buff char [5] = {0 x 80, 0 x 01, SETSPEED, 0 x 00, 0 x 00}; si la velocidad (velocidad > 127) = 127; buff [3] = lowByte (servo_id); buff [4] = lowByte (velocidad); Serial_servo.Write (buff, 5); Serial_servo.Flush (); } void set_boom (ángulo de byte) {move_servo (0, mapa (ángulo, 0, 179, 2500, 4000));} void set_gripper (ángulo de byte) {move_servo (1, mapa (ángulo, 0, 179, 2500, 4000));} void home_boom () {move_servo (0, 3000);} void home_gripper () {move_servo (1, 3000);}