Paso 5: Cargar el Software
Extraer el contenido de este archivo en la tarjeta SD vacía (antigua tarjeta SD más pequeño que 2Gb es preferrable) e inserte en la ranura de SD de Pleo. No encienda Pleo todavía.
También deberá cargar el software de Arduino. Para eso necesita descargar el programa llamado Arduino desde aquí: http://arduino.cc/en/Main/Software. Instalar y ejecutar el programa de Arduino y ejecutarlo. En la herramienta -> tablero y herramientas -> menús Seleccione el tipo de Arduino y puerto serie a que está conectado. Ahora copypaste este código en el Arduino sketch ventana y escribirlo en el Arduino memoria (archivo -> subir a placa de E/S).
#include#include
#undef int
#include
#define BAUD_RATE 9600 / / 19200 para programación, 115200 para trabajar con Pleo, 9600 para transmisión a través de xbee
#define LED_PIN 13 / / el pin del LED está conectado a
#define GROUND_PIN PC2
#define POWER_PIN PC3
#define POWER_ON_LED_PIN 13
#define RECEIVE_LED_PIN 12
#define DELTA 20 / tolerancia de la posición de la palanca de mando
#define acción "movimiento rugido de juego" / playes en botones de anc C Z presionado
#define J_TOP_LEFT "movimiento juego com_walk_fl_v1"
#define J_TOP "movimiento juego com_walk_fs_v1"
#define J_TOP_RIGHT "movimiento juego com_walk_fr_v1"
#define J_LEFT "movimiento juego hun_sniff_l" / /???
#define J_RIGHT "movimiento juego hun_sniff_r" / /???
#define J_BOTTOM_LEFT "movimiento juego com_walk_bl_v1"
#define J_BOTTOM "movimiento juego hun_exit" / /???
#define J_BOTTOM_RIGHT "movimiento juego com_walk_br_v1"
#define CMD_DISABLE_LOG "registro deshabilitar todas"
#define MIN_X 316
#define MAX_X 730
#define MIN_Y 380
#define MAX_Y 630
uint8_t buf [6]; global buffer para almacenar datos del nunchuck, malo, malo...
configurar todo
void setup()
{
pinMode (POWER_ON_LED_PIN, salida);
pinMode (RECEIVE_LED_PIN, salida);
digitalWrite (POWER_ON_LED_PIN, alto);
Delay (100); Espere que las cosas se estabilicen
Serial.Begin (BAUD_RATE); configurar salida serie
wait_for_pleo(); Espere en Pleo arrancar
Wire.Begin(); Únete a bus i2c con dirección 0x52
power_on (PC2, PC3) PowerOn el nunchuck
init_nunchuck(); enviar el protocolo de inicialización
}
espera pleo arrancar. Es importante que esté Coordinador XBee conectado a arduino en primera
luego el nodo de XBee conectado a Pleo debe activarse.
Static void wait_for_pleo()
{
digitalWrite (RECEIVE_LED_PIN, alto);
int espera = 1;
int cuenta = 0;
int leer = 0;
al mismo tiempo (esperar)
{
Si (Serial.available())
{
leer = Serial.read();
Si (leer == ' >')
{
esperar = 0;
}
}
otra cosa
{
Delay (500);
Serial.Print ("");
}
}
comando (CMD_DISABLE_LOG, 500); desactivar el Pleo lo contrario registro serial consigue trashed y todo deja de funcionar en un minuto
digitalWrite (RECEIVE_LED_PIN, bajo);
}
void delay_read (int sueño)
{
int leer;
mientras (Serial.available())
{
leer = Serial.read();
}
demora (sueño);
}
se convierte en energía para el nunchuck
power_on vacío estático (pwr byte, byte gnd)
{
DDRC | = _BV(pwr) | _BV(GND); hacer salidas
PORTC & = ~ _BV(gnd);
PORTC | = _BV(pwr);
Delay(100); Espere que las cosas se estabilicen
}
inicializar el nunchuck
void init_nunchuck()
{
Wire.beginTransmission (0x52); transmitir al dispositivo 0x52
Wire.Send (0 x 40); envía la dirección de memoria
Wire.Send (0 x 00); envía la dirección de memoria
Wire.endTransmission(); interrumpir la transmisión
}
envío cero a nunchuck es enviar sus datos vitales actuales nuevo
void send_zero()
{
Wire.beginTransmission (0x52); transmitir al dispositivo 0x52
Wire.Send (0 x 00); envía un byte
Wire.endTransmission(); interrumpir la transmisión
}
void loop()
{
digitalWrite (RECEIVE_LED_PIN, bajo);
Serial.Print (""); No sé por qué sin esta línea el bucle no está trabajando.
int cnt = 0; número de bytes leídos de la entrada
Wire.requestFrom (0x52, 6); Reciba 6 bytes del nunchuck
mientras (Wire.available())
{
buf [cnt ++] = descifrar (Wire.receive()); recibe byte como un número entero
}
Si (cnt > = 5)
{
process_buffer(); hace el trabajo
}
send_zero(); enviar la solicitud de los siguientes bytes
digitalWrite (RECEIVE_LED_PIN, alto);
}
cabeza de posiciones según la posición del joystick
void position_head (int x, int y)
{
int nh = ((x - 320) * 13 / 41) - 65;
¿NH = nh nh = nh > 65? 65: nh;
int nv = ((380 - y) * 15 / 25) + 75;
¿NV = nv nv = nv > 75? 75: nv;
Serial.Print ("mover el empalme 11");
Serial.Print (nh);
Serial.Print ("");
Serial.Print ("mover el empalme 12");
Serial.Print (nv);
Serial.Print ("");
delay_read (1000);
}
cola de posiciones según la posición del joystick
void position_tail (int x, int y)
{
int nh = ((x - 320) * 18 / 41) - 90;
¿NH = nh nh = nh > 90? 90: nh;
int nv = ((380 - y) * 18 / 25) + 90;
¿NV = nv nv = nv > 90? 90: nv;
Serial.Print ("mover conjunto 9");
Serial.Print (nh);
Serial.Print ("");
Serial.Print ("joint mover 10");
Serial.Print (nv);
Serial.Print ("");
delay_read (1000);
}
anular comandos (char cmd [], int sueño)
{
Serial.Print (cmd);
Serial.Print ("");
delay_read (sueño);
}
analiza retorno de nunchuck (6 bytes)
void process_buffer()
{
int jx = buf [0];
int jy = buf [1];
int ax = buf [2] > 2) & 0 x 03);
int y = buf [3] > 4) & 0 x 03);
int az = buf [4] > 6) & 0 x 03);
int bz = buf [5] y 1;
int bc = (buf [5] >> 1) y 1;
Si (Compruebe (jx, jy, 53, 205))
{
comando (J_TOP_LEFT, 2000);
}
else if (verificar (jx, jy, 123, 226))
{
comando (J_TOP, 2000);
}
else if (verificar (jx, jy, 202, 202))
{
comando (J_TOP_RIGHT, 2000);
}
else if (verificar (jx, jy, 25, 127))
{
comando (J_LEFT, 2000);
}
else if (verificar (jx, jy, 128, 132))
{
Si ((bz == 1) & & (bc == 1))
{
position_head (ax, ay);
}
else if ((bz == 0) & & (bc == 1))
{
position_tail (ax, ay);
}
else if ((bz == 0) & & (bc == 0))
{
comando (acción, 4000);
}
}
else if (verificar (jx, jy, 226, 130))
{
comando (J_RIGHT, 2000);
}
else if (verificar (jx, jy, 54, 59))
{
comando (J_BOTTOM_LEFT, 2000);
}
else if (verificar (jx, jy, 126, 30))
{
comando (J_BOTTOM, 2000);
}
else if (verificar (jx, jy, 200, 57))
{
comando (J_BOTTOM_RIGHT, 2000);
}
otra cosa
{
print_data (jx, jy, ax, ay, az, bz, a.c.); sólo con fines de depuración lo dejo aqui
}
}
comprueba si la posición de la palanca de mando está en la posición dada con tolerancia DELTA
int comprobar (int sx, sy de int, int tx, ty int) {}
volver (abs (sx - tx)}
resultado de la depuración de los datos del nunchuck
void print_data (int jx, jy int, ax de int, int, int az, int bz, int a. c.)
{
Serial.Print (jx, DEC);
Serial.Print ("");
Serial.Print (jy, DEC);
Serial.Print ("");
Serial.Print (ax, DEC);
Serial.Print ("");
Serial.Print (ay, DEC);
Serial.Print ("");
Serial.Print (az, DEC);
Serial.Print ("");
Serial.Print (bc, DEC);
Serial.Print ("");
Serial.Print (bz, DEC);
Serial.Print ("");
Serial.Print ("");
}
descifra los datos del nunchuck, famosa "fórmula", no encontré por qué está trabajando
descifrar los caracteres (char x)
{
devolver (x ^ 0x17) + 0x17;
}
Nota montón de retrasos en el programa. Pleo no proporciona información que el comando se ha completado. También una vez que el comando no puede anularlo. Y, como mencioné antes, servos de Pleo son realmente lentas evitar el sobrecalentamiento. Todo esto significa que hay un retraso entre el movimiento del nunchuck y Pleo movimiento.
Puede mod este código para trabajar con otros robots por reescribir los métodos position_head y position_tail para traducir a comandos específicos de tu robot.
Eso es todo, amigos, ya tienes tu propio control remoto Pleo. ¡ Disfrute!