Hacer un arrastre zombi Robot con patas cortadas (20 / 22 paso)

Paso 20: Código: agregar Control

En el paso anterior define una rutina de rastreo básico y discutían sobre cómo usar interpolación para mover los servos sin problemas. Ahora, ¿qué pasa si usted quiere controlar el Zombot?

Hay infinidad de maneras de implementar esto, tanto en el hardware y el software. Opté por manejarlo mediante conexión en serie de Arduino, que quiere decir que será realmente trivial para controlar el robot de forma inalámbrica vía Bluetooth, o como lo estoy haciendo en el momento de depurar, simplemente mediante el cable USB.

Esto no es la manera más elegante de alcanzar estos resultados, pero es que fácil de leer y entender, así como flexible.

Como antes de que se atribuyo el código completo más abajo, pero voy a ir a través de los puntos clave aquí.

Protocolo de comunicación

He decidido establecer mi protocolo de comunicación de la siguiente manera.

  • Cada paquete de datos (instrucciones) del controlador del robot es una cadena de caracteres que consta de dos partes, separadas por un ":" carácter.

    • El "comando" es lo primero y le dice al robot que hacer (por ejemplo: empezar a moverse)
    • El "argumento" viene en segundo lugar y proporciona información adicional
  • Cada paquete de datos empieza con un "[" y termina con un "]"

Definir Variables globales

Además de las variables previamente definidas, ahora necesitamos configurar algunas variables que se utilizarán en nuestro protocolo de comunicación vía serie.

 char inDataCommand[10]; //array to store command char inDataArg[10]; //array to store command argument int inDataIndex = 0; //used when stepping through characters of the packet boolean packetStarted = false; //have we started receiving a data packet (got a "[" boolean argStarted = false; //have we received a ":" and started receiving the arg boolean packetComplete = false; //did we receive a "]" boolean packetArg = false; //are we reading the arg yet, or still the command 

Definir las funciones

Un comando de lectura de la serie

Esta función puede ser llamada para comprobar la interfaz en serie para los comandos recibidos.

Comprueba los entrada seriales bytes (caracteres) uno por uno, tirarlas a la basura a menos que sean un "[" que indica el inicio de un comando.

Una vez que se ha iniciado un comando, cada byte se almacena en la variable de "comando" hasta un ":" o "]" se recibe. Si un ":" es recibido, empezamos a almacenar los siguientes bytes en la variable de "argumento" hasta un "]" se recibe.

Si en cualquier momento un "[" se recibe durante la lectura de la instrucción de otra, que la instrucción anterior se descarta. Esto nos impide quedar atascado si alguien nunca transmite un "]" carácter fin de comando y quería enviar un nuevo comando.

Una vez que se ha recibido un comando completo se llama a la función "processCommand", que será realmente interpreto y la acción del comando.

 void SerialReadCommand() { /* This function checks the serial interface for incoming commands. It expects the commands to be of the form "[command:arg]" where 'command' and 'arg' are strings of bytes separated by the character ':' and encapsulated by the chars '[' and ']' */ if (Serial.available() > 0) { char inByte = Serial.read();; //incoming byte from serial if (inByte == '[') { packetStarted = true; packetArg = false; inDataIndex = 0; inDataCommand[inDataIndex] = '\0'; //last character in a string must be a null terminator inDataArg[inDataIndex] = '\0'; //last character in a string must be a null terminator } else if (inByte == ']') { packetComplete = true; } else if (inByte == ':') { argStarted = true; inDataIndex = 0; } else if (packetStarted && !argStarted) { inDataCommand[inDataIndex] = inByte; inDataIndex++; inDataCommand[inDataIndex] = '\0'; } else if (packetStarted && argStarted) { inDataArg[inDataIndex] = inByte; inDataIndex++; inDataArg[inDataIndex] = '\0'; } if (packetStarted && packetComplete) { //try and split the packet into command and arg Serial.print("command received: "); Serial.println(inDataCommand); Serial.print("arg received: "); Serial.println(inDataArg); //apply input processUserInput(); packetStarted = false; packetComplete = false; argStarted = false; packetArg = false; } else if (packetComplete) { //this packet was never started packetStarted = false; packetComplete = false; argStarted = false; packetArg = false; } } } 

Procesar un comando

Una vez que ha recibido un comando válido (y opcionalmente un argumento), tienen que ser producido, por lo que podemos tomar la acción apropiada.

Por el momento no he necesitado más de un byte de información para definir un comando, por lo que basta con mirar el primer byte de comando. Usando este byte como argumento para un switch() declaración nos permite realizar una función definida por el byte de comando.

En este ejemplo estamos buscando el carácter "w", "s" o "c".

Si se recibe la "w", los cuadros de animación se sobrescriben con una nueva animación que define un movimiento de "mariposa".

Si se recibe la "s", los cuadros de animación se sobrescriben con una nueva animación que define un movimiento de "arrastre".

Si se recibe la "c", los cuadros de animación son todo listo para la misma posición, con eficacia parando todo el movimiento.

Puesto que uno no puede volver a asignar todos los valores en una matriz a la vez, primero definir una nueva matriz temporal para cada servo, que contiene los nuevos cuadros, después utilice "memcpy" para copiar los valores de ubicación de la matriz de marco real en memoria.

 void processUserInput() { /*for now all commands are single chars (one byte), can expand later if required char commandByte = inDataCommand[0]; if (commandByte != '\0') { switch (commandByte) { case 'w': { //synchronised forwards (butterfly) numFrames = 4; int newRS[] = {0,1000,1000,0}; int newRE[] = {0,0,1000,1000}; int newLE[] = {0,0,1000,1000}; int newLS[] = {0,1000,1000,0}; int newLN[] = {1000,1000,0,1000}; int newRN[] = {0,1000,1000,1000}; memcpy(crawlGaitRS, newRS,numFrames); memcpy(crawlGaitRE, newRE,numFrames); memcpy(crawlGaitLE, newLE,numFrames); memcpy(crawlGaitLS, newLS,numFrames); memcpy(crawlGaitLN, newLN,numFrames); memcpy(crawlGaitRN, newRN,numFrames); break; } case 's': { //crawl stroke, 180 degrees out of phase numFrames = 4; int newRS[] = {0,1000,1000,0}; int newRE[] = {0,0,1000,1000}; int newLE[] = {1000,0,0,1000}; int newLS[] = {0,0,1000,1000}; int newLN[] = {1000,1000,0,1000}; int newRN[] = {0,1000,1000,1000}; memcpy(crawlGaitRS, newRS,numFrames); memcpy(crawlGaitRE, newRE,numFrames); memcpy(crawlGaitLE, newLE,numFrames); memcpy(crawlGaitLS, newLS,numFrames); memcpy(crawlGaitLN, newLN,numFrames); memcpy(crawlGaitRN, newRN,numFrames); break; } case 'c': { //turn left crawlGaitRS[] = {250,250,250,250}; crawlGaitRE[] = {250,250,250,250}; crawlGaitLE[] = {250,250,250,250}; crawlGaitLS[] = {250,250,250,250}; crawlGaitLN[] = {250,250,250,250}; crawlGaitRN[] = {250,250,250,250}; break; } } } } 

Bucle principal

La única adición en el bucle principal es una llamada para verificar la entrada del usuario en cada iteración del bucle.

 //get user input using the SerialReadCommand function we wrote SerialReadCommand(); 

Artículos Relacionados

Hacer de un simple Robot con modelado 3D

Hacer de un simple Robot con modelado 3D

introducciónLa idea de este proyecto empezó cuando yo estaba estudiando y dado una asignación con la breve llama titulado "articulación". La idea era crear un objeto que demuestra la articulación (movimiento y articulaciones) mediante una impres
Cómo hacer una bebida verter Robot con Makeblock

Cómo hacer una bebida verter Robot con Makeblock

¿Tengo un robot que podría verter cerveza o bebida para usted, cómo suena como? Esto es una forma de Makeblock Ultimate Kit de Robot. Con su imaginación y DIY, podría tener su propio transformador de robot.Paso 1: Montaje de plataforma de la base Lis
Cómo hacer un teléfono móvil y un ordenador controlado 3D impreso Robot con Arduino - IoBot.

Cómo hacer un teléfono móvil y un ordenador controlado 3D impreso Robot con Arduino - IoBot.

Si está buscando una manera de controlar un Arduino basado en dispositivos, esta instrucción le mostrará cómo hacerlo mediante la construcción de robots sencillos.La IoBot puede controlarse mediante la aplicación móvil y ordenador vía LAN o Cable USB
Construir un Robot muy pequeño: hacer el mundo más pequeño de ruedas Robot con una pinza.

Construir un Robot muy pequeño: hacer el mundo más pequeño de ruedas Robot con una pinza.

Construir un robot de 1/20 pulgada cúbica con una pinza que puede recoger y mover pequeños objetos. Es controlado por un microcontrolador Picaxe. En este momento, creo que esto puede ser más pequeño robot con ruedas del mundo con una pinza. Cambiará
Hacer un Robot con cámara Color reconocimiento

Hacer un Robot con cámara Color reconocimiento

Hola! Esto es para el grupo de 18 años.Este instructivo le guiará a través de un robot con reconocimiento de color usando una cámara y un servo. El robot que va a construir tiene servos para los brazos también, pero no son necesarios. Use su imaginac
Aire suave Robots con LEGOs

Aire suave Robots con LEGOs

este proyecto es un seguimiento de mi proyecto Air-Powered suave pinza robótica, basado en una investigación por el grupo de Whitesides de la Universidad de Harvard. He conseguido muchos comentarios positivos en ese proyecto, pero una repetida pregun
Traje de robot con LED

Traje de robot con LED

las razones de por qué yo quería hacer un robot traje son complejas. Para hacer el cuento largo, quería un traje que podría utilizar para entretener a mis compañeros mientras ellos cuidadosamente preparaban para los exámenes finales. Pero no quería c
Robots con un Beat

Robots con un Beat

he visto una Charla Ted sobre robots con un sentido de sentimiento. Guy Hoffman muestra su nuevo producto, un robot que "sentiría el ritmo de la música" de un iPod.I acoplado decidió que haría mi propia. Hice una versión rudimentaria de su robot
Cómo hacer una estrella de madera con un 2 x 4 de 24 pulgadas

Cómo hacer una estrella de madera con un 2 x 4 de 24 pulgadas

Este tutorial le mostrará cómo hacer una estrella madera de 22 a 24" con solo 8 pies 1 x 4 o 2 x 4.Hace dos años que mi esposa decidió que le gustaría tener una estrella de madera colgado sobre la chimenea. He intentado encontrar información en la we
Micro Robot Con Adafruit Gemma

Micro Robot Con Adafruit Gemma

En este instructable les muestro como construir un pequeño robot con el micro controlador de Adafruit se llama Gema. Solamente mostraré como armarlo y controlar los motores, les dejo la tarea de colocarle algún sensor para hacerlo siga la luz o cualq
Línea siguiente SRK Robot con piezas impresas 3d

Línea siguiente SRK Robot con piezas impresas 3d

El Robot SRK + línea siguiente es hermano pequeño del Robot siguientes MRK + línea. Utiliza un tipo diferente de junta y otro tipo de motor. (El ruido de los motores que es lo que me imagino que un escarabajo gigante parecería, por lo tanto, El Beetl
Máscara robot con ojos de Neopixel, iPhone boca y cambiador de la voz

Máscara robot con ojos de Neopixel, iPhone boca y cambiador de la voz

Este año para Halloween, hemos decidido hacer una mascara de robot para nuestro hijo mayor. Hay unos pocos componentes electrónicos diferentes que trabajan juntos para realizar la máscara final. Se utilizaron anillos neopixel y un arduino para el con
Odometría barato para tu robot con ruedas!

Odometría barato para tu robot con ruedas!

Durante el año pasado he estado construyendo un robot con ruedas grandes y quería implementar odometría en él.Pero no quiero gastar mucho dinero en él, por lo que he encontrado una manera DIY.En este Instructable le mostrará un método de bajo presupu
Enfriar el ROBOT: con poderes mágicos de LED

Enfriar el ROBOT: con poderes mágicos de LED

BienvenidosEste es mi Instructable sobre cómo construir un Robot fresco con poderes mágicos de LED.Este diseño es completamente mio no baso lo apagado de cualquier persona más planes. Apenas empecé haciendo en Google Sketchup y evolucionó en lo que e