Stap 12: Oorlogsmachine kanon
U wilt de oorlogsmachine? In dit voorbeeld is gebaseerd op de Predator kanon maar maakt gebruik van een motor die is aangesloten op een transistor te draaien van de vaten kanon. Wanneer u de knop vuur wordt de motor ingeschakeld. Er is een diode 1N4004 om te voorkomen dat terug spanning van de motor de controller uitgang pins schadelijk.
Een oorlogsmachine kanon aanzienlijk groter is dan een Predator kanon en groter, krachtiger servo's zou vereisen, dus ik heb individuele TIP 120 transistoren getoond op het bedradingsschema.
Voor de montage van het kanon verkoopt Servocity pan/tilt mechanismen die perfect voor deze toepassing zijn zou-
http://www.servocity.com/html/spt200_pan___tilt_system.html
/*
* Voorbeeld 8
* Iron Man War Machine kanon
* Deze maakt gebruik van een gemodificeerde Wii nunchuck als een hoofd bijhouden invoerapparaat waarmee een animatronic Iron Man War Machine kanon
* Adafruit Wave shield is gebruikt voor geluidseffecten
* Honus 2010
* Wii nunchuck lezen code aangepast/uitgebreid vanaf nunchuck code door Tod E. Kurt en Windmeadow Labs
* 2007 Tod E. Kurt, http://todbot.com/blog/
* De Wii Nunchuck lezen code is overgenomen uit Windmeadow Labs, http://www.windmeadow.com/node/42
*/
#include "Wire.h" / / de draad bibliotheek
int controlPin1 = 7; Controle pin voor geluidseffecten board met z-knop
int transistorPin1 = 13; Controle pin voor kanon LED met z-knop
int transistorPin2 = 12; Controle pin voor het gebruik van de servo 1 c knop
int transistorPin3 = 11; Controle pin voor het gebruik van de servo 2 c knop
int transistorPin4 = 10; Controle pin voor kanon motor met z-knop
int servoPin1 = 9; Controle pin voor servo 1 met behulp van de versnellingsmeter x-as
int servoPin2 = 8; Controle pin voor het gebruik van de servo 2 versnellingsmeter y-as
int pulseWidth1 = 0; Bedrag aan de pols van de servo 1
int pulseWidth2 = 0; Bedrag aan de servo 2 pulse
int refreshTime = 20; de tijd in millisecs nodig tussen servo pulsen
lange lastPulse1;
lange lastPulse2;
int minPulse = 700; minimale servo pulsbreedte
int loop_cnt = 0;
Boole button_down = false;
niet-ondertekende lange start;
VOID Setup
{
Serial.begin(19200);
pinMode (controlPin1, OUTPUT); Controle pin 1 stellen als uitvoerapparaat
pinMode (transistorPin1, OUTPUT); Transistor pin 1 stellen als uitvoerapparaat
pinMode (transistorPin2, OUTPUT); Transistor pin 2 stellen als uitvoerapparaat
pinMode (transistorPin3, OUTPUT); Transistor pin 3 stellen als uitvoerapparaat
pinMode (transistorPin4, OUTPUT); Transistor pin 4 stellen als uitvoerapparaat
pinMode (servoPin1, OUTPUT); Servo pin 1 stellen als uitvoerapparaat
pinMode (servoPin2, OUTPUT); Servo pin 2 stellen als uitvoerapparaat
pulseWidth1 = minPulse; Stel de positie van de servo tot het minimum
pulseWidth2 = minPulse; Stel de positie van de servo tot het minimum
nunchuck_init(); Stuur de handdruk initilization
Serial.Print ("NunchuckServo ready\n");
}
void loop
{
checkNunchuck1();
updateServo1(); Update servo 1 positie
checkNunchuck2();
updateServo2(); Update 2 servo positie
Als (nunchuck_cbutton()) {}
digitalWrite (transistorPin2, hoge); transistor pin 2 inschakelen als c-knop wordt ingedrukt
digitalWrite (transistorPin3, hoge); transistor pin 3 inschakelen als c-knop wordt ingedrukt
}
else {}
digitalWrite (transistorPin2, laag); transistor pin 2 uitschakelen
digitalWrite (transistorPin3, laag);
}
Als (nunchuck_zbutton())
{
Als (! button_down) / / als net gedrukt werd dit doen
{
digitalWrite (controlPin1, hoge); geluidseffect inschakelen
button_down = true;
Start = millis();
}
anders als (millis() - start > 1200) / / als de timer is verstreken hiervoor
{
digitalWrite (transistorPin1, hoge); kanon LED inschakelen
digitalWrite (transistorPin4, hoge); kanon motor inschakelen
}
}
anders / / als knop omhoog doen dit is
{
button_down = false;
digitalWrite (controlPin1, laag); geluidseffect uitschakelen
digitalWrite (transistorPin1, laag); kanon LED uitschakelen
digitalWrite (transistorPin4, laag); kanon motor uitschakelen
}
delay(1); Dit is hier een bekende tijd per lus te geven
}
VOID checkNunchuck1()
{
Als (loop_cnt > 100) {/ / lus () s is elke 1msec, dit is elke 100msec
nunchuck_get_data();
nunchuck_print_data();
zweven tilt = nunchuck_accelx(); x-as, in dit geval varieert van ~ 70 - ~ 185
kantelen (tilt - 70) = * 1,5; omzetten in hoek in graden, ruwweg
pulseWidth1 = (kantelen * 9) + minPulse; hoek omzetten in microseconden
loop_cnt = 0; Reset voor
}
loop_cnt ++;
}
elke loop genoemd.
Gebruik globale variabelen servoPin, pulsewidth, lastPulse, & refreshTime
VOID updateServo1()
{
Pulse de servo opnieuw als rhe refresh tijd (20 ms) hebt uitgevoerd:
Als (millis() - lastPulse1 > = refreshTime) {}
digitalWrite (servoPin1, hoge); De servo inschakelen
delayMicroseconds(pulseWidth1); Lengte van de pols stelt u de positie van de servo
digitalWrite (servoPin1, laag); De servo uitschakelen
lastPulse1 = millis(); opslaan van het tijdstip van de laatste puls
}
}
VOID checkNunchuck2()
{
Als (loop_cnt > 100) {/ / lus () s is elke 1msec, dit is elke 100msec
nunchuck_get_data();
nunchuck_print_data();
zweven tilt = nunchuck_accely(); y-as, in dit geval varieert van ~ 70 - ~ 185
kantelen (tilt - 70) = * 1,5; omzetten in hoek in graden, ruwweg
pulseWidth2 = (kantelen * 9) + minPulse; hoek omzetten in microseconden
loop_cnt = 0; Reset voor
}
loop_cnt ++;
}
elke loop genoemd.
Gebruik globale variabelen servoPin, pulsewidth, lastPulse, & refreshTime
VOID updateServo2()
{
Pulse de servo opnieuw als rhe refresh tijd (20 ms) hebt uitgevoerd:
Als (millis() - lastPulse2 > = refreshTime) {}
digitalWrite (servoPin2, hoge); De servo inschakelen
delayMicroseconds(pulseWidth2); Lengte van de pols stelt u de positie van de servo
digitalWrite (servoPin2, laag); De servo uitschakelen
lastPulse2 = millis(); opslaan van het tijdstip van de laatste puls
}
}
//
Functies van de Nunchuck
//
statische uint8_t nunchuck_buf [6]; matrix voor het opslaan van gegevens van de nunchuck,
initialiseren van de I2C-systeem, join de I2C-bus,
en nunchuck vertellen dat we aan het praten
VOID nunchuck_init()
{
Wire.begin(); Join i2c bus als meester
Wire.beginTransmission(0x52); verzenden naar apparaat 0x52
Wire.send(0x40); stuurt geheugenadres
Wire.send(0x00); stuurt verzonden een nul.
Wire.endTransmission(); stoppen met het verzenden van
}
Een verzoek om gegevens verzenden met de nunchuck
was "send_zero()"
VOID nunchuck_send_request()
{
Wire.beginTransmission(0x52); verzenden naar apparaat 0x52
Wire.send(0x00); stuurt één byte
Wire.endTransmission(); stoppen met het verzenden van
}
Gegevens ontvangen terug van de nunchuck,
geeft als resultaat 1 op succesvolle Lees. geeft als resultaat 0 op mislukking
int nunchuck_get_data()
{
int cnt = 0;
Wire.requestFrom (0x52, 6); aanvraaggegevens uit nunchuck
terwijl (Wire.available ()) {}
Ontvangen bytes als integer
nunchuck_buf [cnt] = nunchuk_decode_byte(Wire.receive());
CNT ++;
}
nunchuck_send_request(); verzoek tot volgende gegevenslading sturen
Als we de 6 bytes ontvangen, ga dan afdrukken
Als (cnt > = 5) {}
return 1; succes
}
keren 0; storing
}
Afdrukken van de invoergegevens die we hebben ontvangen
accel gegevens is 10 bits lang
zodat wij 8 bits lezen, dan moeten zullen we toevoegen
op de laatste 2 bits. Dat is waarom ik
Ze vermenigvuldigen met 2 * 2
VOID nunchuck_print_data()
{
statische int i = 0;
int joy_x_axis = nunchuck_buf [0];
int joy_y_axis = nunchuck_buf [1];
int accel_x_axis = nunchuck_buf [2]; // * 2 * 2;
int accel_y_axis = nunchuck_buf [3]; // * 2 * 2;
int accel_z_axis = nunchuck_buf [4]; // * 2 * 2;
int z_button = 0;
int c_button = 0;
nunchuck_buf [5] van de byte bevat bits voor knoppen z en c
het bevat ook de minst significante bits voor de versnellingsmeter-gegevens
dus we hebben om te controleren van elke bit van byte outbuf [5]
Als ((nunchuck_buf [5] >> 0) & 1)
z_button = 1;
Als ((nunchuck_buf [5] >> 1) & 1)
c_button = 1;
Als ((nunchuck_buf [5] >> 2) & 1)
accel_x_axis += 2;
Als ((nunchuck_buf [5] >> 3) & 1)
accel_x_axis += 1;
Als ((nunchuck_buf [5] >> 4) & 1)
accel_y_axis += 2;
Als ((nunchuck_buf [5] >> 5) & 1)
accel_y_axis += 1;
Als ((nunchuck_buf [5] >> 6) & 1)
accel_z_axis += 2;
Als ((nunchuck_buf [5] >> 7) & 1)
accel_z_axis += 1;
Serial.Print(i,DEC);
Serial.Print("\t");
Serial.Print("Joy:");
Serial.Print(joy_x_axis,DEC);
Serial.Print(",");
Serial.Print (joy_y_axis, DEC);
Serial.Print ("\t");
Serial.Print("ACC:");
Serial.Print (accel_x_axis, DEC);
Serial.Print(",");
Serial.Print (accel_y_axis, DEC);
Serial.Print(",");
Serial.Print (accel_z_axis, DEC);
Serial.Print("\t");
Serial.Print("but:");
Serial.Print (z_button, DEC);
Serial.Print(",");
Serial.Print (c_button, DEC);
Serial.Print("\r\n"); newline
i ++;
}
Coderen gegevens opmaken dat meeste wiimote bestuurders behalve
alleen nodig als u een van de regelmatige wiimote stuurprogramma's gebruiken
char nunchuk_decode_byte (char x)
{
x = (x ^ 0x17) + 0x17;
return x;
}
Deze eigenschap retourneert de status zbutton: 1 = ingedrukt, 0 = notpressed
int nunchuck_zbutton()
{
retourneren ((nunchuck_buf [5] >> 0) & 1)? 0: 1; Voodoo
}
Deze eigenschap retourneert de status zbutton: 1 = ingedrukt, 0 = notpressed
int nunchuck_cbutton()
{
retourneren ((nunchuck_buf [5] >> 1) & 1)? 0: 1; Voodoo
}
Deze eigenschap retourneert een waarde voor x-as joystick
int nunchuck_joyx()
{
keren nunchuck_buf [0];
}
Deze eigenschap retourneert een waarde voor y-as joystick
int nunchuck_joyy()
{
terug van nunchuck_buf [1];
}
Deze eigenschap retourneert een waarde van de x-as versnellingsmeter
int nunchuck_accelx()
{
keren nunchuck_buf [2]; FIXME: Dit laat uit 2-bits van de gegevens
}
Deze eigenschap retourneert een waarde van y-as versnellingsmeter
int nunchuck_accely()
{
keren nunchuck_buf [3]; FIXME: Dit laat uit 2-bits van de gegevens
}
Deze eigenschap retourneert een waarde van de z-as versnellingsmeter
int nunchuck_accelz()
{
keren nunchuck_buf [4]; FIXME: Dit laat uit 2-bits van de gegevens
}