BARC Jeep - en XBOX kontrollerad Power Wheels (1 / 7 steg)
Steg 1: Skaffa Xbox-handkontrollen kommunicerar till Arduino
Anslut USB Host Shield på Arduino. För nu är power Arduino med er dator. Nästa kontakt Xbox 360™ Wireless Gaming Receiver for Windows®. När dessa anslutningar görs ladda koden visas nedan till Arduino som tillåter Arduino ska utföra styrning baserat på input från registeransvarige.
Det finns gott om notation för att förstå vad som pågår.
Arduino kod
// ****************************** RC Power Wheels Jeep *
// *****************************
/*
ÖVERSIKT
En 12v dubbla-motor Power Wheels Jeep orkan har enheten
och styrning-fjärrstyrd via Arduino.
HÅRDVARA
Power Wheels Jeep orkanen
Arduino UNO R3
Kretsar USB Host Shield 2.0 http://www.circuitsathome.com/products-page/arduino-shields/usb-host-shield-2-0-for-arduino
Pololu enkel Motor Controller 18v25 http://www.pololu.com/catalog/product/1381/resources
Pololu JRK Motor Controller 12v12 http://www.pololu.com/catalog/product/1393/resources
Pololu generiska linjära ställdon 4".6"/s http://www.pololu.com/catalog/product/2333
Xbox 360 trådlös USB-Adapter
Xbox 360 trådlös handkontroll
MASKINVARUKONFIGURATIONEN
* +-------+ +---------------+ USB +-----------------+
* | Arduino +---> | USB Host Shield +---> | XBOX USB Receiver| *** / >< / *** XBOX trådlös handkontroll
* +-+-----+ +---------------+ +-----------------+
* |
* | TX (TTL följetong)
* |
* |------------------|
* | |
* v Rx v Rx
* +----------+ +----------+
* | Pololu SMC + | Pololu Jrk|
* +----------+ +----------+
* Master Slave
* + +
* | |
* | |
* v v
* +--------+ +--------+
* | Dubbla 12v| | Linjära |
* | Motors || Actuator|
* +--------+ +--------+
*
* ANTECKNINGAR
* Utomhus med line-of-sight har trådlös Xbox-handkontrollen en awesome utbredning. Max räckvidd
* har inte testat, men jag har gått över 50ft utan märkbar förlust i signalen.
*
* Allt sitter på jeepen. Alla TTL seriella anslutningar är fastprogrammerade till Arduino
* och motor controller. Xbox mottagaren är ansluten till en metall pole antenn-stil.
*
* Det nuvarande linjärt ställdonet kan vara för långsam. Det kan röra 110lbs av kraft men på 6"/ s. det
* är en snabbare modell som gör 22lbs @ 1,5"/ s http://www.pololu.com/catalog/product/2345
*
*/
*** Inkluderar för kretsar USB Shield ***
#include < XBOXRECV.h > / / Xbox 360 trådlös mottagare
Att skapa USB-instans? USB-SKÖLD
USB Usb;
Skapa en instans av Xbox mottagaren ingångar kallas XboxRCV
XBOXRECV XboxRCV(&Usb); USB-SKÖLD
Konstanterna nästa ingår byte av Pololu-protokollet
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; Sluthastighet
långa int leftStickX; Xbox vänster Analog Stick värde
void setup() {
Serial.BEGIN(9600); Seriella överföringshastigheten till 9600
Stoppa programmet tills sköld är ansluten
USB. Init kommer tillbaka -1 för shield bortkopplad och 0 om ansluten
om (Usb.Init() == -1) {/ / om USB sköld inte initieras av någon anledning...
While(1); stoppa som sköld rapporteras frånkopplad
}
}
void loop() {
Usb.Task();
Låt oss behandla Xbox indata
IF(XboxRCV.Xbox360Connected[0]) {
STARTKOMMANDO knappen skickar exitSafeStart till SMC
IF(XboxRCV.getButtonClick(start,0)) {
// *******************************
* exitSafeStart *
// *******************************
Behövs för att möjliggöra motorer anslutna till SMC att flytta
Måste anropas när controller startas om och efter alla fel
Pololu protokoll: 0xAA (170) | enhetsnumret | 0x03 (3)
Serial.write(pololuCommandByte);
Serial.write(smcDeviceNumber);
Serial.write(3);
}
/ * Xbox triggers ange värden från 0 - 255. SMC kommer att acceptera en låg
upplösningsvärde hastighet i procent, 0% - 100% (hög upplösning är
en 2-byte heltal). De följande två raderna kartor den registeransvarige att mata en
negativt värde för L2 (omvänd) och positivt för R2 (framåt). Dessa två
värden summeras sedan för att ge den slutliga hastighet och riktning. Detta är
så att båda utlösare kan hållas gång utan att orsaka värdena
att svänga mellan framåt och bakåt
*/
char XboxL2 = map((XboxRCV.getButtonPress(L2,0)), 0, 255, 0 -100);
char XboxR2 = map((XboxRCV.getButtonPress(R2,0)), 0, 255, 0, 100);
Summera de mappade ingångarna tillsammans för att ge en slutlig hastighet och riktning
smcSpeed = XboxL2 + XboxR2;
/ * Exempelkoden för Xbox-handkontrollen gav en deadzone av-7500 till 7500.
Denna kod upprätthåller den döda zonen för nu (jag skulle vilja göra det
justerbar medan skissen är igång). */
leftStickX = map(XboxRCV.getAnalogHat(LeftHatX,0),-32768, 32767, 0, 3880); Analog pinne flyttade
Som döda bandet i vänster analog styrspak. Tycker att detta vara justerbar
om ((leftStickX > = 1500) & & (leftStickX < = 1983)) {
leftStickX = 1400;
}
}
Om inga utlösare/pinnar är att flytta, sedan centrera och noll
annat {
leftStickX = 1400;
smcSpeed = 0;
}
*** RESERVERAD "HEARTBEAT" ***
"Heartbeat" kommer att skicka en seriella kommando var x: e sekund som en "keep-alive" till SMC och JRK
kontrollanter. Det kommer också att förhindra kommandon från översvämningar seriell bufferten (perfekt
för Xbee genomförande).
// *******************************
* SKICKA SERIELLA KOMMANDON *
// *******************************
/ * Reserverad för seriell kommandon skickas till motor-styrenheter för att justera
option parametrarna. Också att bearbeta svar från de
kommandon i tillämpliga fall. */
DET HÄR AVSNITTET SKICKAR KOMMANDONA HASTIGHET OCH RIKTNING TILL SMC
// *******************************
* setMotorSpeed *
// *******************************
/*
http://www.Pololu.com/docs/0J44/6.2.1
Pololu SMC kan använda en full hastighet upplösningsvärde (-3200 till 3200), men detta behövs inte
(ännu) sedan Xbox-handkontrollen analoga triggers endast utgång 0 till 255. Den nedan tabeller kopieras
direkt från manualen länkade ovan. Vi kommer att använda en låg upplösning hastighet värde uttryckt i
procent (0 till 100).
"Alternerar tolkning: de tillåtna värdena för den andra hastighet data byten är 0Ã⠢ â'¬â €œ100,
så du kan ignorera den första hastighet data byten (alltid sätta den till 0), och anser att den
andra databyte till enkelt att procentsatsen hastighet. Till exempel att köra motorn på
53% hastighet, skulle du använda byte1 = 0 och byte2 = 53. "
Motorn fram
Kommandot Byte Data Byte 1 Data Byte 2 Data Byte 3 databyte 4
Pololu alternativa användning 0xAA (170) enhetsnumret 0x05 (5) 0 (alltid) hastighet %
Motoriska omvänd (data byte 2 ändringar)
Kommandot Byte Data Byte 1 Data Byte 2 Data Byte 3 databyte 4
Pololu alternativa användning 0xAA (170) enhetsnumret 0x06 (6) 0 (alltid) hastighet %
*/
smcSpeed bör vara ett tal mellan -100 och 100
Skicka först Pololu SMC kommandobyte
Serial.write(pololuCommandByte);
Nästa, skicka SMC enhetsnumret
Serial.write(smcDeviceNumber);
Här, låt oss fastställa hastighet och riktning.
om (smcSpeed < 0) / / Låt oss vända eftersom hastigheten är negativt
{
Serial.write(6); motoriska omvänd kommando
smcSpeed = - smcSpeed; göra smcSpeed positiva b/c av kommandot kan bara läsa positiva tal
}
annat
{
Serial.write(5); motoriska framåt kommando
}
Serial.write(smcSpeedDataByte3); Alltid noll (för tillfället) på grund av det protokoll som används
Nu låt oss skicka den faktiska hastigheten
Serial.write(smcSpeed);
Delay(1); För stabilitet
NÄSTA AVSNITT SKICKAR POSITIONEN TILL DET LINJÄRA STÄLLDONET VIA JRK
// *******************************
* setJRKPos *
// *******************************
/ * http://www.pololu.com/docs/0J38/4.e
Pololu protokoll, hex: 0xAA, enhet nummer, 0x40 + mål låg 5 bitar, rikta hög 7 bitar
Här är några C exempelkod som kommer att generera rätt seriella byte,
med tanke på ett heltal "target" som håller den önskat mål (0 - 4095) och en matris kallas serialBytes:
1 serialBytes [0] = 0xC0 + (mål & 0x1F); Kommandobyte innehar de lägre 5 bitarna av målet.
2 serialBytes [1] = (mål >> 5) & 0x7F; Databyte innehar de övre 7 bitarna av målet. */
Serial.write(pololuCommandByte);
Serial.write(jrkDeviceNumber);
Serial.write (0x40 + (leftStickX & 0x1F));
Serial.write ((leftStickX >> 5) & 0x7F);
Delay(1); För stabilitet
}