Trådlösa nunchuk kontrollerade animatronic docka (4 / 16 steg)
Steg 4: Koden
I det här steget kommer vi kompilera och ladda koden och testa våra ledningar.
1. Anslut arduino till datorn
2. öppna programmet Arduino 18. Om du inte redan har det, kan du hämta det från Arduino webbsidan:
http://Arduino.cc/en/main/Software
3. Kontrollera att du har korrekt styrelsen typ valt och rätt USB-porten markerad innan du fortsätter
4. Kopiera och klistra in koden som finns nedan. Denna kod är skriven med kod från användaren bradlight på detta forum och koden från min instruktör men jag vet inte vem som skrev det: http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1259091426
5. kompilera koden
6. om det finns inga fel (det inte ska finnas), ladda upp koden till arduino
7. När koden läses in ska du nu kunna styra servo luta nunchuck vänster, höger, upp eller ned. Om servo inte svarar, håll reset-knappen, synkronisera nunchuk, släpp sedan återställningsknappen. Jag har funnit att nunchuk måste synkroniseras innan koden börjar löpa eller servo fastnar. Det är därför min design inkluderar en momentan switch för en återställningsknapp.
#include < Wire.h >
#include < string.h >
#include < stdio.h >
uint8_t outbuf [6].
int cnt = 0;
int ledPin = 13.
int servoPin = 5;
int servoPin2 = 6;
int pulseWidth = 0;
int pulseWidth2 = 0;
lång lastPulse = 0;
lång lastPulse2 = 0;
int z_button = 0;
int c_button = 0;
int refreshTime = 20;
int minPulse = 1000;
int minPulse2 = 500.
int dtime = 10;
#define pwbuffsize 10
lång pwbuff [pwbuffsize];
lång pwbuffpos = 0;
lång pwbuff2 [pwbuffsize];
lång pwbuffpos2 = 0;
void setup()
{
Serial.BEGIN (19200);
Wire.BEGIN ();
nunchuck_init ();
pinMode (servoPin, produktionen);
pinMode (servoPin2, produktionen);
pulseWidth = minPulse;
pulseWidth2 = minPulse2;
Serial.Print ("färdiga setup\n");
}
void nunchuck_init()
{
Wire.beginTransmission (0x52);
Wire.send (0xF0);
Wire.send (0x55);
Wire.endTransmission ();
Delay(30);
Wire.beginTransmission(0x52);
Wire.send (0xFA);
Wire.endTransmission();
Delay(30);
Wire.requestFrom(0x52, 6);
Delay(30);
}
void send_zero()
{
Wire.beginTransmission (0x52);
Wire.send (0x00);
Wire.endTransmission ();
}
int t = 0;
void loop()
{
t ++;
äntligen = millis();
om (t == 1) {
t = 0;
Wire.requestFrom (0x52, 6);
medan (Wire.available ()) {
outbuf [cnt] = nunchuk_decode_byte (Wire.receive ());
digitalWrite (ledPin, hög);
CNT ++;
}
om (cnt > = 5) {
printNunchuckData();
int z_button = 0;
int c_button = 0;
om ((outbuf [5] >> 0) & 1)
z_button = 1;
om ((outbuf [5] >> 1) & 1)
c_button = 1;
växel (c_button) {
fall 1:
växel (z_button) {
fall 0:
bryta;
fall 1:
muovi();
bryta;
}
bryta;
fall 0:
växel (z_button) {
fall 0:
Delay(10000);
bryta;
fall 1:
Delay(3000);
bryta;
}
bryta;
}
}
CNT = 0;
send_zero();
} / / if(t==)
updateServo();
Delay(dtime);
}
void updateServo() {
om (millis() - lastPulse > = refreshTime) {
digitalWrite (servoPin, hög);
delayMicroseconds(pulseWidth);
digitalWrite (servoPin, låg);
digitalWrite (servoPin2, hög);
delayMicroseconds(pulseWidth2);
digitalWrite (servoPin2, låg);
lastPulse = millis();
}
}
int jag = 0;
void printNunchuckData()
{
int joy_x_axis = outbuf [0];
int joy_y_axis = outbuf [1].
int accel_x_axis = outbuf [2] * 2 * 2. // * 2 * 2;
int accel_y_axis = outbuf [3] * 2 * 2. // * 2 * 2;
int accel_z_axis = outbuf [4] * 2 * 2. // * 2 * 2;
int z_button = 0;
int c_button = 0;
om ((outbuf [5] >> 0) & 1)
z_button = 1;
om ((outbuf [5] >> 1) & 1)
c_button = 1;
om ((outbuf [5] >> 2) & 1)
accel_x_axis += 2.
om ((outbuf [5] >> 3) & 1)
accel_x_axis + = 1;
om ((outbuf [5] >> 4) & 1)
accel_y_axis += 2.
om ((outbuf [5] >> 5) & 1)
accel_y_axis + = 1;
om ((outbuf [5] >> 6) & 1)
accel_z_axis += 2.
om ((outbuf [5] >> 7) & 1)
accel_z_axis + = 1;
Serial.Print (i, DEC);
Serial.Print ("\t");
Serial.Print ("X:");
Serial.Print (joy_x_axis, DEC);
Serial.Print ("\t");
Serial.Print ("y");
Serial.Print (joy_y_axis, DEC);
Serial.Print ("\t");
Serial.Print ("AccX:");
Serial.Print (accel_x_axis, DEC);
Serial.Print ("\t");
Serial.Print ("AccY:");
Serial.Print (accel_y_axis, DEC);
Serial.Print ("\t");
Serial.Print ("AccZ:");
Serial.Print (accel_z_axis, DEC);
Serial.Print ("\t");
Serial.Print (z_button, DEC);
Serial.Print ("");
Serial.Print (c_button, DEC);
Serial.Print ("\r\n");
i ++;
}
char nunchuk_decode_byte (char x)
{
x = (x ^ 0x17) + 0x17;
återvändande x;
}
void muovi () {
flyta tilt = (700 - outbuf[3]*2*2);
flyta tilt2 = outbuf [2] * 2 * 2.
lutning = (lutning);
pulseWidth = (luta * 5) + minPulse;
Tilt2 = (tilt2-288);
pulseWidth2 = (tilt2 * 5) + minPulse2;
pwbuff [pwbuffpos] = pulseWidth;
pwbuff2 [pwbuffpos2] = pulseWidth2;
om (++ pwbuffpos == pwbuffsize) pwbuffpos = 0;
om (++ pwbuffpos2 == pwbuffsize) pwbuffpos2 = 0;