Styra din Robot med en Wii Nunchuck (och en Arduino) (3 / 4 steg)

Steg 3: programmering



The Wii Nunchuck är nu ansluten till den Arduino i2c port. För er (inklusive jag själv) som inte riktigt förstår vad att medel inte fret, bara vara säker, det är en bra sak. Om du vill veta mer av de praktiska och tråkiga detaljerna finns de (här)

(stort tack till Tchad i windmeadow.com för forskningen och skriva verkligen lätt förstod Arduino kod att interagera med Wii nunchuck, innehåller programmet nedan hans koden praktiskt taget oförändrad).

Vad den gör

  • Programmet kommer som standard med nunchucks styrspaken för kontroll. Om du trycker minnet fram kommer att din robot gå framåt, bakåt, bakåt och så vidare.
  • Om du håller ner knappen "Z" (den stora en på framsidan). Din robot nu flyttar baserat på lutningen på nunchuck. Tilt framåt gå vidare...
  • Slutligen om det inte riktigt fungerar sänder programmet staten knapparna nunchaku, joystick och accelerometrar, varje sekund över den Arduino USB-port. (bara öppna fönstret debug på 9600 se dessa data)

För de intresserade helt enkelt att få det att gå.

Kopiera och klistra in

  • Kopiera den Arduino koden nedan
  • Klistra in den i utvecklingsmiljön Arduino.
  • Ladda upp och börja spela

Med hjälp av koden i ditt eget Program

  • Först initiera nunchuck genom att anropa nunchuck_init ();
  • Nästa varje gång du vill uppdatera kallar värdena för nunchuck i din skiss readNunchuck();
  • Vid direkt tillgång kallar värdena getNunValue(Variable Constant); (ex. YAXIS)
  • Slutligen om du vill använda accelerometern men har det skalas till ett antal Gs (dvs. 1 g = 1 styrkan av gravitation). Du kan ringa getXGs(); getYGs(), eller getZGs();

Tillägg 1 - _SERB_WiiNunchuckControl.pde

BÖRJAN av NUNCHUCK INGRESSEN - för mer djupgående information besök ursprungliga källan till denna kod http://www.windmeadow.com/node/42
//-------------------------------------------------
/*
* Ledningar Detaljer
* vit - jorda
* röd - 3.3 + v - 5 volt verkar fungera
* grön - data - Analog 4
* gul - klocka - Analog 5
*/

#include #include #undef int #include uint8_t outbuf [6]. matrisen att lagra arduino utgång int cnt = 0; räknare för nunchuck comunication int ledPin = 13. int nunchuckValues [] = {0,0,0,0,0,0,0,0,0,0}. En matris att lagra nuncheck värden / * * index för varje värde i arrayen nunchuckValues [] * dvs. XSTICK värdet lagras vid nunchuckValues [XSTICK] (0) * / #define XSTICK 0 //The joystick värden #define YSTICK 1 #define XAXIS 2 //The tre accelerometer värden #define YAXIS 3 #define ZAXIS 4 #define ZBUTTON 5 //Front knappen värden (0 när du trycker) #define c-knappen 6 #define XAXISDELTA 7 //Change i accelerometer data från senaste Läs; #define YAXISDELTA 8 #define ZAXISDELTA 9 //Nunchuck G beräkning av konstanter / * * för skalning raw värdena från nunchuck till G-värden * detaljer på kalibreringsmönstret och matematik finns på * http://www.wiili.org/index.php/Motion_analysis (kopierad från http://www.wiili.org/index.php/Motion_analysis) noll poäng x_0 = (x_1 + x_2) / 2\, y_0 = (y_1 + y_3) / 2\, z_0 = (z_2 + z_3) / 2\ En G poäng x = \frac{x_{raw}-x_0} {x_3 - x_0} y = \frac{y_{raw}-y_0} {y_2 - y_0} z = \frac{z_{raw}-z_0} {z_1 - z_0} * / / * inte alla av dessa används och kunde tas bort (höll för att göra interpretting matematik * lättare 0 G värde 1-värde noll när handpåläggning tabell 2-värde när de vilar på näsan * 3-värde när de vilar på sidan (vänster sida upp) * / #define X0 500 #define X1 500 # definiera X2 500 #define X3 711 #define Y0 465 #define Y1 481 #define Y2 621 #define Y3 449 #define Z0 578 #define Z1 785 #define Z2 575 #define Z3 582 //END av NUNCHUCK INGRESSEN - för mer djupgående information besök denna kod http://www.windmeadow.com/node/42 ursprungliga källa / /---/ /---/ / START av ARDUINO kontrollerade SERVO ROBOT (SERBISKT) ingress #include #define LEFTSERVOPIN 10 #define RIGHTSERVOPIN 9 #define MAXOMDR 10 //due till kontinuerlig rotation servon arbeta som högsta hastighet är nåddes vid en mycket lägre värde än 90 (detta värde ändras beroende på din servon) (för Parallax servon) Servo leftServo; Servo rightServo; int leftSpeed = 100; Anger hastigheten på roboten (vänster servon) //a andel mellan - MAXOMDR och MAXOMDR int rightSpeed = 100; Anger hastigheten på roboten (båda servon) //a andel mellan - MAXOMDR och MAXOMDR int hastighet = 100; används för enkel kontroll (goForward, goBackward, goLeft och goRight //a andel mellan 0 och MAXOMDR / / slutet av ARDUINO kontrollerade SERVO ROBOT (serbiska) ingress / /---lång lastPrint; //a länge variabel för lagring av tidpunkten som wiimote staten var sista tryckta #define PRINTINTERVAL 1000 //the antalet millisekunder mellan mata nunchuck staten över usb port #define DÖDBAND 20 //A procentsatsen från centrum som är tolkas som fortfarande noll void setup() {Serial.begin(9600); //Starts den seriella porten (används för debuging men gör servon jumpy) nunchuck_init (); Skicka nunchuck initilization handslag serbSetup(); lägger till servon och förbereder alla serbiska relaterade variabler lastPrint = millis(); } void loop() {readNunchuck(); //Reads det aktuella läget för nunchaku knappar och accelerometrar om ()! getNunValue(ZBUTTON)) {moveWiiAcelerometer(); //moves wii deoending på nunchucks accelerationsvärdena} annat {moveWiiJoystick();} if((millis() - lastPrint) > PRINTINTERVAL) {//If en sekund förflutit sedan senaste utskrift nunchuck värden skriva ut dem printData(); //print nunchuck värden Serial.println(); //add en retur lastPrint = millis(); //store aktuell tid som lastPrint}} void moveWiiAcelerometer() {moveDifferential(getYGs() * (float)100,getXGs()*(float)100);} void moveWiiJoystick() {moveDifferential(map(getNunValue(YSTICK) , 30,220,-100,100),map(getNunValue(XSTICK),30,220,-100,100)); } //Takes i en hastighet och en riktning ingång (som en joystick) och översätter till hastighet kommandon void moveDifferential (int ET1, int direction1) {ET1 = deadBandFilter(speed1); direction1 = deadBandFilter(direction1), setSpeedLeft (speed1 + direction1), setSpeedRight (speed1 - direction1);} int deadBandFilter (int value) {om (värde > - DÖDBAND & & värdet < DÖDBAND) {värde = 0;} annat {if(value > 0) {värde = värde - DÖDBAND * 100 / (100-DÖDBAND);} annat {värde = värde + DÖDBAND * 100 / (100-DÖDBAND);}} returvärde;} //START av NUNCHUCK rutiner / /---//Calculates och returnerar xAxis acceleration i Gs flyta getXGs() {return ((float)getNunValue(XAXIS) - X0) / (X-3 - X 0).} //Calculates och returnerar yAxis acceleration i Gs float getYGs() {återvända ((float)getNunValue(YAXIS)-Y0) / (Y2 - Y0);} //Calculates och returnerar zAxis accelerationen i Gs float getZGs() {återvända ((float)getNunValue(YAXIS)-Z0) / (Z1 - Z0);} //START av NUNCHUCK behandlingen kod - mer djupgående information vänligen besök den ursprungliga källa //of denna kod http://www.windmeadow.com/node/42 / /---void readNunchuck() {Wire.requestFrom (0x52 , 6); begära data från nunchuck samtidigt (Wire.available ()) {outbuf [cnt] = nunchuk_decode_byte (Wire.receive ()); / / få byte som ett heltal digitalWrite (ledPin, hög); / / sätter LED på cnt ++;} / / om vi fått 6 byte, gå sedan skriva ut dem om (cnt > = 5) {nunchuckValues [XSTICK] = outbuf [0]; nunchuckValues [YSTICK] = outbuf [1]; int tempNun_xAxis = outbuf [2] * 2 * 2; int tempNun_yAxis = outbuf [3] * 2 * 2; int tempNun_zAxis = outbuf [4] * 2 * 2; nunchuckValues [ZBUTTON] = 0;
nunchuckValues [c-knappen] = 0;

byte outbuf [5] innehåller bitar för z- och c-knapparna
den innehåller också de minst signifikanta bitarna för accelerometer data
så vi måste kontrollera varje bit av byte outbuf [5]
om ((outbuf [5] >> 0) & 1) {nunchuckValues [ZBUTTON] = 1;} //checking om Z-knappen trycks (0 = pressad 1 = Kolfiberförstärkt)
om ((outbuf [5] >> 1) & 1) {nunchuckValues [c-knappen] = 1;} //checking om C-knappen trycks (0 = pressad 1 = Kolfiberförstärkt)
om ((outbuf [5] >> 2) & 1) {tempNun_xAxis += 2;} //adding näst minst signifikanta lite till x_axis
om ((outbuf [5] >> 3) & 1) {tempNun_xAxis += 1;} //adding minst signifikanta lite till x_axis
om ((outbuf [5] >> 4) & 1) {tempNun_yAxis += 2;} //adding näst minst signifikanta lite till y_axis
om ((outbuf [5] >> 5) & 1) {tempNun_yAxis += 1;} //adding minst signifikanta lite till x_axis
om ((outbuf [5] >> 6) & 1) {tempNun_zAxis += 2;} //adding näst minst signifikanta lite till z_axis
om ((outbuf [5] >> 7) & 1) {tempNun_zAxis += 1;} ///adding minst signifikanta lite till x_axis

nunchuckValues [XAXISDELTA] = tempNun_xAxis - nunchuckValues [XAXIS];
nunchuckValues [XAXIS] = tempNun_xAxis;
nunchuckValues [YAXISDELTA] = tempNun_yAxis - nunchuckValues [YAXIS];
nunchuckValues [YAXIS] = tempNun_yAxis;
nunchuckValues [ZAXISDELTA] = tempNun_zAxis - nunchuckValues [ZAXIS];
nunchuckValues [ZAXIS] = tempNun_zAxis;
}
CNT = 0;
send_zero (); skicka begäran om nästa byte
}

int getNunValue (int valueIndex) {
återgå nunchuckValues [valueIndex];
}

void nunchuck_init () {
Wire.BEGIN (); gå med i2c bussen med adress 0x52
Wire.beginTransmission (0x52); överföra till enhet 0x52
Wire.send (0x40); skickar minnesadress
Wire.send (0x00); skickar skickade en nolla.
Wire.endTransmission (); stoppa överföring
}

void send_zero () {
Wire.beginTransmission (0x52); överföra till enhet 0x52
Wire.send (0x00); skickar en byte
Wire.endTransmission (); stoppa överföring
}

Koda data om du vill formatera som de flesta wiimote förare utom
behövs endast om du använder en av de regelbundna wiimote förarna
char nunchuk_decode_byte (char x) {
x = (x ^ 0x17) + 0x17;
återvändande x;
}

SLUTET av NUNCHUCK-koden - för mer djupgående information vänligen besök den
ursprungliga källan av denna kod http://www.windmeadow.com/node/42
//---------------------------------------------------------------

//------------------------------------------------------------------------
BÖRJAN AV ARDUINO KONTROLLERADE SERVO ROBOT (SERBISKA) RUTINER

/*
* sätter upp din arduino att ta itu med din serbiska med hjälp av de medföljande rutinerna
*/
void serbSetup() {
setSpeed(speed);
pinMode (LEFTSERVOPIN, OUTPUT); Anger den vänstra servo signal stiftet
att mata
pinMode (RIGHTSERVOPIN, OUTPUT); anger rätt servo signalen pin
att mata
leftServo.attach(LEFTSERVOPIN); fäster vänster servo
rightServo.attach(RIGHTSERVOPIN); fäster rätt servo
goStop();
}

/*
* Anger hastigheten av roboten mellan 0-(stopped) och 100-(full hastighet)
* Obs: hastighet ändras inte den aktuella hastigheten måste du ändra hastighet
* sedan ringa gå metoder innan förändringar sker.
*/
void setSpeed (int newSpeed) {
om (newSpeed > = 100) {newSpeed = 100;} //if hastighet är större än 100
göra det 100
om (newSpeed < = 0) {newSpeed = 0;} //if hastighet är mindre än 0 gör
det 0
hastighet = newSpeed * MAXOMDR / 100; skalar hastigheten för att vara
mellan 0 och MAXOMDR
}

/*
* Anger hastigheten av robotar rightServo mellan-100-(reversed) och 100-(forward)
* Obs: samtal till denna rutin kommer att gälla omedelbart
*/
void setSpeedRight (int newSpeed) {
om (newSpeed > = 100) {newSpeed = 100;} //if hastighet är större än 100
göra det 100
om (newSpeed < = -100) {newSpeed = -100;} //if hastighet är mindre än -100 gör
det -100
rightSpeed = newSpeed * MAXOMDR / 100; skalar hastigheten för att vara
mellan - MAXOMDR och MAXOMDR
rightServo.write (90 - rightSpeed); skickar det nya värdet till servo
}

/*
* Anger hastigheten av robotar leftServo mellan-100-(reversed) och 100-(forward)
* Obs: samtal till denna rutin kommer att gälla omedelbart
*/
void setSpeedLeft (int newSpeed) {
om (newSpeed > = 100) {newSpeed = 100;} //if hastighet är större än 100
göra det 100
om (newSpeed < = -100) {newSpeed = -100;} //if hastighet är mindre än -100 gör
det -100
leftSpeed = newSpeed * MAXOMDR / 100; skalar hastigheten för att vara
mellan - MAXOMDR och MAXOMDR
leftServo.write (90 + leftSpeed); skickar det nya värdet till servo
}

/*
* skickar roboten framlänges
*/
void goForward() {
leftServo.write (90 + hastighet);
rightServo.write (90 - hastighet);
}

/*
* skickar roboten bakåt
*/
void goBackward() {
leftServo.write (90 - hastighet);
rightServo.write (90 + hastighet);
}

/*
* skickar roboten rätt
*/
void goRight() {
leftServo.write (90 + hastighet);
rightServo.write (90 + hastighet);
}

/*
* skickar roboten vänster
*/
void goLeft() {
leftServo.write (90 - hastighet);
rightServo.write (90 - hastighet);
}

/*
* stannar roboten
*/
void goStop() {
leftServo.write(90);
rightServo.write(90);
}
SLUTET AV ARDUINO KONTROLLERADE SERVO ROBOT (SERBISKA) RUTINER
//---------------------------------------------------------------------------

STARTA om PRINT rutiner (kan ta bort om du inte använder)
//---------------------------------------------------------------

Utskrifter av Nunchucks senast läste data (måste ringa NUN_readNunchuck(), innan ringer
void printData() {
Serial.Print ("XJoy ="); Serial.Print (getNunValue(XSTICK), DEC); Serial.Print ("\t");
Serial.Print ("YJoy ="); Serial.Print (getNunValue(YSTICK), DEC); Serial.Print ("\t");
Serial.Print ("XGs ="); Serial.Print (getXGs() * 1000, DEC); Serial.Print ("\t");
Serial.Print ("YGs ="); Serial.Print (getYGs() * 1000, DEC); Serial.Print ("\t");
Serial.Print ("ZGs ="); Serial.Print (getZGs() * 1000, DEC); Serial.Print ("\t");
Serial.Print ("ZBut ="); Serial.Print (getNunValue(ZBUTTON), DEC); Serial.Print ("\t");
Serial.Print ("YBut ="); Serial.Print (getNunValue(CBUTTON), DEC); Serial.Print ("\t");
}

SLUTET AV PRINT RUTINER
//--------------------------------------------------------------------

Se Steg
Relaterade Ämnen

Styra din Robot med hjälp av mobiltelefon

Denna hela handledning är också tillgänglig på min hemsidaHej kommer världen i detta inlägg jag att visa dig hur man styr roboten med hjälp av mobiltelefon. Styr en robot med hjälp av mobiltelefon är inte så komplicerat som ditt tänkande det är mycke...

Styr en Robot med en Wii Remote

Detta är ett roligt litet projekt som använder en Raspberry Pi en Finch Robot och en Wii Remote (AKA Wiimote), för att visa några av de saker du kan göra med en raspberry pi och/eller en Wii remote. Det använder Python och CWiiD biblioteket för att f...

Arduino Wii nunchuck och Wii motion plus med uppdaterad kod för IDE 1.0.2 och lysdioder

så, jag var försökande till hacka min Wii nunchuck eftersom jag vill styra motorer och lampor med Wii nunchuck.Det första problemet som jag hittade var hur man ansluta kontrollen utan adapter, jag planerar att göra en, menNär jag var forskande för nu...

Hur till spår din Robot med OpenCV

UPPDATERING: Låter göra robotar, mitt hem digital hackerspace, köptes av RobotShop. Jag vill inte gå in, men de nya ägarna förbjudit mig själv och de flesta veteran medlemmarna. Som sagt, de flesta av länkarna där kommer att brytas. Lyckligtvis kunde...

Hur att styra TV fungerar med Analog ingång och Arduino

har du någonsin velat använda en god gammal ratt för att styra din TV volym i stället för upprepade knappen trycka? Eller göra det kontrolleras av ljus? Vill du ha din fjärrkontroll att ersättas med en awesome arduino och låt den göra det hårda arbet...

Trådlöst styr en Robot med hjälp av Arduino och RF-moduler!

/*Redigera 05/05/2016Hej killar, jag har varit upptagen med college och kunde inte svara på commments. De flesta av y'all ville koden och scheman gjort lite bättre så jag har gjort scheman på Eagle 7.2.0 och laddat upp allt på Github.Här är länken: h...

Ansluta och styra din PC med Android-telefon

Hey guys har du hört talas om kontrollera din PC med din Android-telefon? Ingen rätt? Faktiskt slutade mitt tangentbord fungera och jag visste inte vad jag ska göra. Jag började använda virtuella tangentbord. Sedan jag fick veta om denna programvara...

SPELA med parallell PORT (gör din egen GUI med TURBO C att styra din ROBOT

Detta instructable är en del av min bok leka med parallellporten. på detta instructable kommer vi kommer att lära sig om Turbo c kommunikation med parallellporten. låter start...del krävs1. LED (lysdiod)2. hoppare ledningar3. bröd styrelse4. parallel...

Styra alla enheter med en Raspberry Pi och en relä modul

Målet med denna kompatibel är att visa hur du kommer igång med att inrätta en relä modul på din pi och kontrollera den. Mitt mål är att lägga till skript i min octopi att slå på och av LED-lampor, men ändå bestämmer dig för att så småningom bestämma...

Hur du styr din TV med en Arduino!

So. Detta Instructable visar dig hur man styr allt kontrollerbar av IR eller infrarött ljus.Detta inkluderar kameror, TV, DVD-spelare, videobandspelare, du fattar poängen.Jag kommer att visa dig hur man tar emot koderna och sedan hur man överföra dem...

Stärka din robot med sugru

I våra hackerspace www.MADspace.nl vi måste bygga en robot som har vunnit ett pris (se url: http://hackaday.io/project/740-mars). Men tyvärr materialet är svag och kan bryta när man kör roboten för hårt mot väggen. Med Sugru kan du göra stora stötfån...

Spåra dina fingrar med en Wii Remote

om du någonsin velat interagera med en dator genom att vifta med händerna i luften, kan du med en Wii remote, några IR lysdioder och lite reflekterande tejp. IR-kameran framför Wii remote är känslig för källor av IR-ljus.Om du skapar en IR-lysdioder...

Bokstavera tillgivenhet för din Valentine med choklad, lysdioder, Attiny13 och Arduino IDE

Ja, visst, du kunde ha ställt en post-it lapp med samma budskap inuti choklad rutan :) men det kommer inte att vara nästan lika cool, särskilt om din Valentine har en sweet spot för nördar. Kom att tänka på det: naturligtvis gör hon, annars vad hon g...

FÖRKOMPRIMERA din Aerogarden med 50% mer ljus och vatten flöde

The Aerogarden är en counter top hydroponiska trädgård. Jag har haft detta en i flera år och har vuxit örter, jalapeño paprika, körsbärstomater och sallat i det, men den har lämnat mig och ville ha en mer DIY strategi snarare än standarden byggsatser...

Hur man kontrollerar 3 servomotorer med tryckknapp växlar och en Arduino Uno

I detta projekt satte jag mig uppgiften att kontrollera förflyttning av 3 servomotorer genom att trycka på knappen växlar. Min avsikt är att använda dessa knappar för att styra en tre-servo robotarm rörelse.Vad jag vill ska hända:1. jag vill styra et...

Styr en Robot med en RC sändaren & mottagare

I detta instructable vi kommer gå igenom hur du ställer in en traditionell RC hobby sändare och mottagare med en RoboClaw motor controller att köra en robot runt (till exempel ServoCity.com's Runt Rovers).Steg 1: Tråd det upp. Motorer:Om du har mer ä...

Hur man styr en Robot med hjälp av en serieanslutning

här är instruktioner om hur man gör en seriell anslutning mellan en smaken Pi och Arduino använder en USB-kabel. När en seriell anslutning har fastställts, kan det användas för att styra vad du kan drömma upp. I detta fall använt jag Pi som fjärrkont...

Hur du styr din TV med din telefon + AnyMote

Du har att blanka smartphone i ena handen, och en gammal, skrymmande plast remote i den andra, medan en annan 2 eller 3 fjärrkontroller vänta på sin tur i soffan.Detta stopp av steg tutorial ska show dig hur till vända din iPhone eller Android-telefo...

Styra Nao Robot med hjälp av en Xbox-handkontroll

I detta instructable kommer jag visa hur man simulera NAO robot i lusthuset simulator och Robot operativsystem (ROS). ROS är ett open source ramverk för utveckling och forskning inom robotteknik. Det ger rika uppsättning verktyg och bibliotek för att...