Stap 5: De Software laden
Pak de inhoud van dit archief naar de lege SD-kaart (oude SD kaart kleiner dan 2Gb speeciaal is) en plaatst u deze in de groef van de Pleo de. Niet inschakelen Pleo nog.
U moet ook de Arduino software laden. Daarvoor moet u download programma genaamd Arduino vanaf hier: http://arduino.cc/en/Main/Software. Installeren en uitvoeren van het programma van de Arduino en draaien. In het hulpprogramma -> bestuur en Tools -> Port menu's Selecteer het soort Arduino en seriële poort die is aangesloten. Nu copypaste dit code in de Arduino schets venster en het schrijven naar de Arduino geheugen (bestand -> uploaden naar i/o-Board).
#include#include
#undef int
#include
#define BAUD_RATE 9600 / / 19200 voor het programmeren, 115200 voor het werken met de Pleo, 9600 voor transmissie via xbee
#define LED_PIN 13 / / de pin de LED is aangesloten op
#define GROUND_PIN PC2
#define POWER_PIN PC3
#define POWER_ON_LED_PIN 13
#define RECEIVE_LED_PIN 12
#define DELTA 20 / / de joystick positie tolerantie
#define actie "gebrul van de spelen van de beweging" / / playes op Z anc C knoppen ingedrukt
#define J_TOP_LEFT "beweging spelen com_walk_fl_v1"
#define J_TOP "beweging spelen com_walk_fs_v1"
#define J_TOP_RIGHT "beweging spelen com_walk_fr_v1"
#define J_LEFT "beweging spelen hun_sniff_l" / /???
#define J_RIGHT "beweging spelen hun_sniff_r" / /???
#define J_BOTTOM_LEFT "beweging spelen com_walk_bl_v1"
#define J_BOTTOM "beweging spelen hun_exit" / /???
#define J_BOTTOM_RIGHT "beweging spelen com_walk_br_v1"
#define CMD_DISABLE_LOG "logboek uitschakelen alle"
#define MIN_X 316
#define MAX_X 730
#define MIN_Y 380
#define MAX_Y 630
uint8_t buf [6]; Global buffer voor het opslaan van gegevens van de nunchuck, bad, bad...
Setup alles
VOID Setup
{
pinMode (POWER_ON_LED_PIN, uitvoer);
pinMode (RECEIVE_LED_PIN, uitvoer);
digitalWrite (POWER_ON_LED_PIN, hoge);
vertraging (100); wachten op dingen te stabiliseren
Serial.begin (BAUD_RATE); uitgang voor seriële configureren
wait_for_pleo(); Pleo voor schoen opwaarts wachten
Wire.begin(); Join i2c bus met adres 0x52
power_on (PC3, PC2); PowerOn nunchuck
init_nunchuck(); Stuur de handdruk initilization
}
wacht op pleo te starten. Het is belangrijk dat XBee coördinator verbonden met arduino eerste is ingeschakeld
vervolgens moet het XBee knooppunt verbonden met Pleo worden ingeschakeld.
static void wait_for_pleo()
{
digitalWrite (RECEIVE_LED_PIN, hoge);
int wachten = 1;
int count = 0;
int lezen = 0;
terwijl (wachten)
{
Als (Serial.available())
{
lezen = Serial.read();
Als (Lees == ' >')
{
wachten = 0;
}
}
anders
{
vertraging (500);
Serial.Print ("");
}
}
opdracht (CMD_DISABLE_LOG, 500); uitschakelen Pleo loggen anders seriële wordt weggegooid en alles stopt met werken in een minuut
digitalWrite (RECEIVE_LED_PIN, laag);
}
VOID delay_read (int slaap)
{
int lezen;
terwijl (Serial.available())
{
lezen = Serial.read();
}
vertraging (slaap);
}
Hiermee schakelt u macht voor de nunchuck
statische nietige power_on (byte pwr, byte gnd)
{
DDRC | = _BV(pwr) | _BV(GND); uitgangen maken
PORTC & = ~ _BV(gnd);
PORTC | = _BV(pwr);
delay(100); wachten op dingen te stabiliseren
}
initialiseren van de Wii nunchuck
VOID init_nunchuck()
{
Wire.beginTransmission (0x52); verzenden naar apparaat 0x52
Wire.send (0x40); stuurt geheugenadres
Wire.send (0x00); stuurt geheugenadres
Wire.endTransmission(); stoppen met het verzenden van
}
verzenden van nul tot nunchuck maakt het sturen van de huidige essentiële gegevens terug
VOID send_zero()
{
Wire.beginTransmission (0x52); verzenden naar apparaat 0x52
Wire.send (0x00); stuurt één byte
Wire.endTransmission(); stoppen met het verzenden van
}
void loop
{
digitalWrite (RECEIVE_LED_PIN, laag);
Serial.Print (""); Ik weet niet waarom zonder deze regel de lus gewoon niet werkt.
int cnt = 0; aantal gelezen bytes van invoer
Wire.requestFrom (0x52, 6); 6 bytes voor aanvragen vanaf nunchuck
terwijl (Wire.available())
{
BUF [cnt ++] = decoderen (Wire.receive()); Ontvangen bytes als integer
}
Als (cnt > = 5)
{
process_buffer(); doet het werk
}
send_zero(); stuurt het verzoek om de volgende bytes
digitalWrite (RECEIVE_LED_PIN, hoge);
}
posities hoofd volgens het standpunt van de 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 ("gezamenlijke Verplaats 11");
Serial.Print (nh);
Serial.Print ("");
Serial.Print ("gezamenlijke Verplaats 12");
Serial.Print (nv);
Serial.Print ("");
delay_read (1000);
}
posities staart volgens het standpunt van de 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 ("gezamenlijke Verplaats 9");
Serial.Print (nh);
Serial.Print ("");
Serial.Print ("gezamenlijke Verplaats 10");
Serial.Print (nv);
Serial.Print ("");
delay_read (1000);
}
VOID opdracht (char cmd [], int slaap)
{
Serial.Print (cmd);
Serial.Print ("");
delay_read (slaap);
}
parseert retourneren uit nunchuck (6 bytes)
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;
Als (controleren (jx, jy, 53, 205))
{
opdracht (J_TOP_LEFT, 2000);
}
anders als (controleren (jx, jy, 123, 226))
{
opdracht (J_TOP, 2000);
}
anders als (controleren (jx, jy, 202, 202))
{
opdracht (J_TOP_RIGHT, 2000);
}
anders als (controleren (jx, jy, 25, 127))
{
opdracht (J_LEFT, 2000);
}
anders als (controleren (jx, jy, 128, 132))
{
Als ((bz == 1) & & (bc == 1))
{
position_head (ax, ay);
}
anders als ((bz == 0) & & (bc == 1))
{
position_tail (ax, ay);
}
anders als ((bz == 0) & & (bc == 0))
{
opdracht (actie, 4000);
}
}
anders als (controleren (jx, jy, 226, 130))
{
opdracht (J_RIGHT, 2000);
}
anders als (controleren (jx, jy, 54, 59))
{
opdracht (J_BOTTOM_LEFT, 2000);
}
anders als (controleren (jx, jy, 126, 30))
{
opdracht (J_BOTTOM, 2000);
}
anders als (controleren (jx, jy, 200, 57))
{
opdracht (J_BOTTOM_RIGHT, 2000);
}
anders
{
print_data (jx, jy, ax, ay, az, bz, v.Chr.); voor debug doeleinden alleen laat het hier
}
}
controleert of de joystick positie in de bepaalde positie met DELTA tolerantie
controle van int (int sx, int sy, int tx, ty int) {}
retourneren (abs (sx - tx)}
debug output van de nunchuck gegevens
VOID print_data (int jx, int jy, int ax, int ay, int az, int bz, int v.Chr.)
{
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 ("");
}
decodeert nunchuck gegevens, beroemde "formule", vind ik niet waarom het werkt
char decoderen (char x)
{
retourneren (x ^ 0x17) + 0x17;
}
Opmerking stelletje vertragingen in het programma. Pleo feedback niet geven dat de opdracht is voltooid. Ook zodra de opdracht wordt gegeven kan niet u het afbreken. En, zoals ik eerder al noemde, Pleo de servo's zijn echt traag om oververhitting. Dit alles betekent dat er een vertraging tussen de nunchuck verplaatsen en de Pleo verplaatsen.
Deze code werkt met andere robots door het herschrijven van de methoden van de position_head en position_tail te vertalen naar de opdrachten die specifiek zijn aan uw robot kunt u mod.
Dat is alles, mensen, heb je uw eigen afstandsbediening Pleo. Geniet van!