Stap 1: Krijgen de Controller van de Xbox communiceren aan de Arduino
Sluit het USB-Host schild op de Arduino. Voor nu zijn macht de Arduino met je computer. Vervolgens sluit de Xbox 360™ Wireless Gaming Receiver for Windows®. Zodra deze verbindingen zijn gemaakt met het laden van de code hieronder in de Arduino waarmee de Arduino sturende bewerkingen op basis van input van de controller uit te voeren.
Er is overvloed van notatie om te helpen begrijpen wat er gaande is.
Arduino Code
// ****************************** RC Power wielen Jeep *
// *****************************
/*
OVERZICHT
Een 12v dual-motor macht wielen Jeep Orkaan zal station hebben
en besturing op afstand bestuurde via Arduino.
HARDWARE
Macht wielen Jeep Orkaan
Arduino UNO R3
Schakelingen USB2.0 Host Shield http://www.circuitsathome.com/products-page/arduino-shields/usb-host-shield-2-0-for-arduino
Pololu eenvoudige motorcontroller 18v25 http://www.pololu.com/catalog/product/1381/resources
Pololu JRK motorcontroller 12v12 http://www.pololu.com/catalog/product/1393/resources
Pololu generieke Lineaire Actuator 4".6"/s http://www.pololu.com/catalog/product/2333
Xbox 360 Wireless USB-Adapter
Xbox 360 draadloze Controller
HARDWARECONFIGURATIE
* +-------+ +---------------+ USB +-----------------+
* | Arduino +---> | USB Host schild +---> | XBOX USB Receiver| *** / >< / *** draadloze Controller voor de XBOX
* +-+-----+ +---------------+ +-----------------+
* |
* | TX (TTL serieel)
* |
* |------------------|
* | |
* v v Rx Rx
* +----------+ +----------+
* | Pololu SMC + | Pololu Jrk|
* +----------+ +----------+
* Master Slave
* + +
* | |
* | |
* v v
* +--------+ +--------+
* | Dubbele 12v| | Lineaire |
* | Motoren | | Actuator|
* +--------+ +--------+
*
* NOTA 'S
* Buiten met line-of-sight heeft het draadloze controlemechanisme van de Xbox een geweldig bereik. Het maximale bereik
* heeft niet volledig getest, maar ik heb meer dan 50ft zonder merkbaar kwaliteitsverlies in signaal.
*
* Alles zit aan boord van de Jeep. Alle TTL seriële verbindingen zijn hard-wired in de Arduino
* en motor controllers. De Xbox-ontvanger is aangesloten op een metalen paal antenne-stijl.
*
* De huidige lineaire actuator is mogelijk te langzaam. Het 110 pond van geweld, maar op.6"/ s. er kan verplaatsen
* is een snellere model dat 22 pond @ 1.5" /s http://www.pololu.com/catalog/product/2345 doet
*
*/
*** Bevat voor de Circuits USB-Shield ***
#include < XBOXRECV.h > / / Xbox 360 draadloze ontvanger
USB-exemplaar maken? USB-SHIELD
USB Usb;
Maak een instantie van de Xbox-ontvanger ingangen genaamd XboxRCV
XBOXRECV XboxRCV(&Usb); USB-SHIELD
Deze volgende constanten bytes deel uitmaken van de Pololu Protocol
Const byte pololuCommandByte = 170;
Const byte smcDeviceNumber = 13;
Const byte smcSpeedDataByte3 = 0;
Const byte smcFWDbyte = 5;
Const byte smcREVbyte = 6;
Const byte jrkDeviceNumber = 11;
char smcSpeed; Eindsnelheid
lange int leftStickX; Xbox linker analoge Stick waarde
VOID Setup {}
Serial.begin(9600); Serial baud-rate aan 9600
Programma stoppen totdat schild is aangesloten
USB. Init zal terugkeren -1 voor shield verbroken en 0 als verbonden
Als (Usb.Init() == -1) {/ / als USB-shield deed niet initialiseren voor welke reden dan ook...
while(1); stoppen zolang schild verbroken wordt gemeld
}
}
void loop {}
Usb.Task();
Laten we het proces van de input van de Xbox
if(XboxRCV.Xbox360Connected[0]) {}
START van de opdracht van de exitSafeStart van knop verzendt aan SMC
if(XboxRCV.getButtonClick(start,0)) {}
// *******************************
* exitSafeStart *
// *******************************
Nodig om motoren verbonden aan SMC te verplaatsen
Moet worden aangeroepen wanneer de domeincontroller opnieuw is opgestart en na elke fout
Pololu Protocol: 0xAA (170) | apparaatnummer | 0x03 (3)
Serial.write(pololuCommandByte);
Serial.write(smcDeviceNumber);
Serial.write(3);
}
/ * De Xbox-triggers bevatten waarden van 0 - 255. De SMC accepteert een laag
snelheid resolutiewaarde als een percentage, 0% - 100% (hoge resolutie is
een 2-byte int). De volgende twee regels kaarten de controller voor de uitvoer van een
negatieve waarde voor L2 (omgekeerde) en positief voor R2 (vooruit). Deze twee
waarden worden vervolgens opgeteld om de uiteindelijke snelheid en richting. Dit is
zodat beide triggers kunnen simultaneosly worden gehouden zonder dat de waarden
oscilleren tussen Forward en Reverse
*/
char XboxL2 = map((XboxRCV.getButtonPress(L2,0)), 0, 255, 0,-100);
char XboxR2 = map((XboxRCV.getButtonPress(R2,0)), 0, 255, 0, 100);
Som van de toegewezen ingangen samen om een eindsnelheid en richting
smcSpeed = XboxL2 + XboxR2;
/ * De voorbeeldcode voor de Xbox controller gaf een deadzone van-7500 naar 7500.
Deze code onderhoudt dat dode zone voor nu (ik wil het
verstelbare terwijl de schets wordt uitgevoerd). */
leftStickX = map(XboxRCV.getAnalogHat(LeftHatX,0),-32768, 0, 32767 3880); Analoge stick verplaatst
Stel de dode band in de linker analoge stick. Zou graag dit als verstelbaar
Als ((leftStickX > = 1500) & & (leftStickX < = 1983)) {}
leftStickX = 1400;
}
}
Als u geen triggers/stokken worden vervoerd; dan centreren en nul
else {}
leftStickX = 1400;
smcSpeed = 0;
}
*** GERESERVEERD "HEARTBEAT" ***
"Heartbeat" stuurt een seriële commando elke x seconden als een "keep-alive" naar de SMC en JRK
domeincontrollers. Het zal ook voorkomen dat dubbele opdrachten overstromingen de seriële buffer (ideaal
voordeuitvoering Xbee).
// *******************************
* DE SERIËLE OPDRACHTEN VERZENDEN *
// *******************************
/ * Gereserveerd voor seriële opdrachten verzonden naar motor controllers aan te passen
optie parameters. Ook voor het verwerken van de reactie van degenen
opdrachten, indien van toepassing. */
DEZE SECTIE STUURT DE SNELHEID EN RICHTING OPDRACHTEN NAAR HET SMC
// *******************************
* setMotorSpeed *
// *******************************
/*
http://www.Pololu.com/docs/0J44/6.2.1
De Pololu SMC kunt een volledige snelheid resolutiewaarde (-3200 tot 3200), echter dit is niet nodig
(nog) sinds de Xbox controller analoge triggers alleen uitgang van 0 tot 255. De onderstaande tabellen worden gekopieerd
rechtstreeks uit de handleiding gekoppeld hierboven. We gebruiken een lage resolutie snelheid waarde uitgedrukt in
percentage (0 tot 100).
"Alternatieve interpretatie: de toegestane waarden voor de tweede snelheid gegevensbyte zijn 0 tot en ¢ â'¬â €œ100,
dus u de eerste snelheid gegevensbyte negeren kunt (altijd instelt op 0), en overwegen de
tweede gegevensbyte gewoon als het percentage van de snelheid. Bijvoorbeeld, om de motor op te rijden
53% snelheid, gebruikt u byte1 = 0 en byte2 = 53. "
Motor uit
Byte Byte 1 gegevens Byte 2 gegevens Byte 3 gegevens gegevensbyte 4 commando
Pololu alternatieve gebruik 0xAA (170)-apparaatnummer 0x05 (5) 0 (altijd) snelheid %
Motor omgekeerde (byte 2 gegevenswijzigingen)
Byte Byte 1 gegevens Byte 2 gegevens Byte 3 gegevens gegevensbyte 4 commando
Pololu alternatieve gebruik 0xAA (170)-apparaatnummer (6) 0x06 (altijd) 0% snelheid
*/
smcSpeed moet een getal van-100 tot 100
Stuur eerst de Pololu SMC opdracht byte
Serial.write(pololuCommandByte);
Vervolgens stuur het apparaatnummer SMC
Serial.write(smcDeviceNumber);
Hier, laten we bepalen de snelheid en richting.
Als (smcSpeed < 0) / / Let's omkeren aangezien de snelheid negatief is
{
Serial.write(6); motor omgekeerde opdracht
smcSpeed = - smcSpeed; smcSpeed positief b/c de opdracht vindt alleen positieve getallen maken
}
anders
{
Serial.write(5); motor vooruit opdracht
}
Serial.write(smcSpeedDataByte3); Altijd nul (voor nu) vanwege het protocol dat wordt gebruikt
Nu laten we verzenden de werkelijke snelheid
Serial.write(smcSpeed);
delay(1); Voor stabiliteit
VOLGENDE SECTIE STUURT DE POSITIE NAAR DE LINEAIRE ACTUATOR VIA DE JRK
// *******************************
* setJRKPos *
// *******************************
/ * http://www.pololu.com/docs/0J38/4.e
Pololu protocol, hex: 0xAA, apparaat nummer, 0x40 + lage 5 bits richten, de doelstelling van hogere 7 bits
Hier is wat C-voorbeeldcode die de juiste seriële bytes genereert,
gegeven een geheel getal "doel" dat geldt het gewenste doel (0 - 4095) en een array genaamd serialBytes:
1 serialBytes [0] = 0xC0 + (doel & 0x1F); Opdracht byte houdt de lagere 5 bits van doel.
2 serialBytes [1] = (target >> 5) & 0x7F; Gegevensbyte bezit de bovenste 7 bits van doel. */
Serial.write(pololuCommandByte);
Serial.write(jrkDeviceNumber);
Serial.write (0x40 + (leftStickX & 0x1F));
Serial.write ((leftStickX >> 5) & 0x7F);
delay(1); Voor stabiliteit
}