Remote Control Pleo med Wii Nunchuck (5 / 5 steg)
Steg 5: Ladda programvaran
Extrahera innehållet i arkivet till Tom SD-kortet (gamla SD kort mindre än 2Gb är preferrable) och sätt in det i Pleo's SD kortplats. Inte aktivera Pleo ännu.
Du måste också ladda programvaran till Arduino. För att du kommer att behöva ladda ner program som heter Arduino från här: http://arduino.cc/en/Main/Software. Installera och kör programmet Arduino och köra den. I Verktyg -> styrelse och verktyg -> menyer väljer du typ av Arduino och Port för seriell den är ansluten till. Nu copypaste kodas detta till Arduino skiss fönster och skriva den till Arduino minne (Arkiv -> Lägg upp på i/o-styrelsen).
#include#include
#undef int
#include
#define BAUD_RATE 9600 / / 19200 för programmering, 115200 för att arbeta med Pleo, 9600 för överföring via xbee
#define LED_PIN 13 / / pin LED är kopplad till
#define GROUND_PIN PC2
#define POWER_PIN PC3
#define POWER_ON_LED_PIN 13
#define RECEIVE_LED_PIN 12
#define DELTA 20 / / joysticken läge tolerans
#define ACTION "motion spela vråla" / / playes på Z anc C knappar tryckte
#define J_TOP_LEFT "motion spela com_walk_fl_v1"
#define J_TOP "motion spela com_walk_fs_v1"
#define J_TOP_RIGHT "motion spela com_walk_fr_v1"
#define J_LEFT "motion spela hun_sniff_l" / /???
#define J_RIGHT "motion spela hun_sniff_r" / /???
#define J_BOTTOM_LEFT "motion spela com_walk_bl_v1"
#define J_BOTTOM "motion spela hun_exit" / /???
#define J_BOTTOM_RIGHT "motion spela com_walk_br_v1"
#define CMD_DISABLE_LOG "log inaktivera alla"
#define MIN_X 316
#define MAX_X 730
#define MIN_Y 380
#define MAX_Y 630
uint8_t buf [6]. globala buffert för att lagra nunchuck data, bad, bad...
ställer in allt
void setup()
{
pinMode (POWER_ON_LED_PIN, OUTPUT);
pinMode (RECEIVE_LED_PIN, OUTPUT);
digitalWrite (POWER_ON_LED_PIN, hög);
fördröjning (100); vänta på saker att stabilisera
Serial.BEGIN (BAUD_RATE); Konfigurera seriell utgång
wait_for_pleo(); vänta på Pleo till stöveln upp
Wire.BEGIN(); gå med i2c bussen med adress 0x52
power_on (PC3, PC2); PowerOn nunchuck
init_nunchuck(); Skicka initilization handslag
}
väntar på pleo att starta upp. Det är viktigt att XBee samordnare ansluten till arduino är aktiverat på första
sedan bör noden XBee ansluten till Pleo vara aktiverat.
statisk void wait_for_pleo()
{
digitalWrite (RECEIVE_LED_PIN, hög);
int vänta = 1;
int count = 0;
int läsa = 0;
medan (vänta)
{
om (Serial.available())
{
Läs = Serial.read();
om (Läs == ' >')
{
vänta = 0;
}
}
annat
{
fördröjning (500).
Serial.Print ("");
}
}
kommando (CMD_DISABLE_LOG, 500); Inaktivera Pleo loggning annars seriell blir skrotade och allt slutar fungera på en minut
digitalWrite (RECEIVE_LED_PIN, låg);
}
void delay_read (int sömn)
{
int läsa;
samtidigt (Serial.available())
{
Läs = Serial.read();
}
fördröjning (sömn);
}
vänder på power för nunchuck
statisk void power_on (byte pwr, byte gnd)
{
DDRC | = _BV(pwr) | _BV(GND); göra utgångar
PORTC & = ~ _BV(gnd);
PORTC | = _BV(pwr);
Delay(100); vänta på saker att stabilisera
}
initiera nunchuck
void init_nunchuck()
{
Wire.beginTransmission (0x52); överföra till enhet 0x52
Wire.send (0x40); skickar minnesadress
Wire.send (0x00); skickar minnesadress
Wire.endTransmission(); stoppa överföring
}
Skicka noll till nunchuck gör det skicka dess nuvarande viktiga data tillbaka
void send_zero()
{
Wire.beginTransmission (0x52); överföra till enhet 0x52
Wire.send (0x00); skickar en byte
Wire.endTransmission(); stoppa överföring
}
void loop()
{
digitalWrite (RECEIVE_LED_PIN, låg);
Serial.Print (""); Jag vet inte varför utan denna linje loopen fungerar bara inte.
int cnt = 0; antal byte som läses från ingång
Wire.requestFrom (0x52, 6); begäran 6 byte från nunchuck
samtidigt (Wire.available())
{
BUF [cnt ++] = dekryptera (Wire.receive()); ta emot byte som ett heltal
}
om (cnt > = 5)
{
process_buffer(); gör jobbet
}
send_zero(); skicka begäran om nästa byte
digitalWrite (RECEIVE_LED_PIN, hög);
}
positioner huvud enligt joystick position
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 ("gemensamma flytta 11");
Serial.Print (nh);
Serial.Print ("");
Serial.Print ("gemensamma flytta 12");
Serial.Print (nv);
Serial.Print ("");
delay_read (1000);
}
positioner svans enligt joystick position
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 ("gemensamma flytta 9");
Serial.Print (nh);
Serial.Print ("");
Serial.Print ("gemensamma flytta 10");
Serial.Print (nv);
Serial.Print ("");
delay_read (1000);
}
Annullera kommando (char cmd [], int sömn)
{
Serial.Print (cmd);
Serial.Print ("");
delay_read (sömn);
}
tolkar återvända från nunchuck (6 byte)
void process_buffer()
{
int jx = buf [0];
int jy = buf [1].
int ax = buf [2] > 2) & 0x03);
int ay = buf [3] > 4) & 0x03);
int az = buf [4] > 6) & 0x03);
int bz = buf [5] & 1.
int bc = (buf [5] >> 1) & 1;
om (kolla (jx, jy, 53, 205))
{
kommando (J_TOP_LEFT, 2000);
}
annars om (kolla (jx, jy, 123, 226))
{
kommando (J_TOP, 2000);
}
annars om (kolla (jx, jy, 202, 202))
{
kommando (J_TOP_RIGHT, 2000);
}
annars om (kolla (jx, jy, 25, 127))
{
kommando (J_LEFT, 2000);
}
annars om (kolla (jx, jy, 128, 132))
{
om ((bz == 1) & & (bc == 1))
{
position_head (ax, ay);
}
annars om ((bz == 0) & & (bc == 1))
{
position_tail (ax, ay);
}
annars om ((bz == 0) & & (bc == 0))
{
kommando (ACTION, 4000);
}
}
annars om (kolla (jx, jy, 226, 130))
{
kommando (J_RIGHT, 2000);
}
annars om (kolla (jx, jy, 54, 59))
{
kommando (J_BOTTOM_LEFT, 2000);
}
annars om (kolla (jx, jy, 126, 30))
{
kommando (J_BOTTOM, 2000);
}
annars om (kolla (jx, jy, 200, 57))
{
kommando (J_BOTTOM_RIGHT, 2000);
}
annat
{
print_data (jx jy, ax, ay, az, bz, f.Kr.); endast för debug lämna det här
}
}
kontrollerar om joystick placerar är i viss position med DELTA tolerans
int check (int sx, int sy, int tx, int ty) {
tillbaka (abs (sx - tx)}
debug utmatning av nunchuck's data
void print_data (int jx, int jy, int ax, int ay, int az, int bz, int f.Kr.)
{
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 ("");
}
dekrypterar nunchuck data, berömda "formel", jag hittade inte varför det fungerar
char dekryptera (char x)
{
tillbaka (x ^ 0x17) + 0x17;
}
Observera massa förseningar i programmet. Pleo ger inte feedback att kommandot har slutförts. Också när kommandot ges kan inte du avbryta den. Och, som jag nämnt tidigare, Pleos servon är riktigt långsam att undvika överhettning. Allt detta innebär att det finns en fördröjning mellan nunchuck flytta och Pleo flytta.
Denna kod ska fungera med andra robotar genom att skriva position_head och position_tail metoder att översätta till din robot kommandon kan du mod.
Det är allt, gott folk, har du din alldeles egna fjärrstyrda Pleo. Njut!