Controle van uw Robot met behulp van een Wii Nunchuck (en een Arduino) (3 / 4 stap)

Stap 3: programmeren


The Wii Nunchuck is nu aangesloten op de Arduino i2c poort. Voor degenen onder u (waaronder ikzelf) die niet echt begrijpen wat dat middelen niet fret, maar wees gerust, het is een goede zaak. Als u wilt weten meer van de nitty gritty details kunnen deze worden gevonden (hier)

(dank aan Tsjaad op windmeadow.com voor het doen van het onderzoek en schrijven echt gemakkelijk begrepen Arduino code om te interageren met de Wii nunchuck, het programma hieronder zijn vrijwel onveranderd code bevat).

Wat het doet

  • Het programma wordt standaard met behulp van de joystick nunchucks voor controle. Als je de stick naar voren duwen zal je robot gaan vooruit, omkeren, achteruit, enzovoort.
  • Als u ingedrukt houdt de 'Z'-knop (de grote knop aan de voorzijde). Je robot zal nu gebaseerd op de helling van de nunchuck. Tilt vooruit om vooruit te gaan...
  • Tot slot als het niet behoorlijk werkt stuurt het programma de toestand van de nunchucks knoppen, joystick en versnellingsmeters, elke seconde via USB-poort van de Arduino. (gewoon open het foutopsporingsvenster op 9600 om deze gegevens te bekijken)

Voor die geinteresseerd in alleen al het gaat.

Kopiëren en plakken

  • Kopieer de code van de Arduino van onderaf
  • Plak deze in de Arduino-ontwikkelomgeving.
  • uploaden en beginnen te spelen

Met behulp van de Code in uw eigen programma

  • Eerst de nunchuck initialiseren door te bellen naar nunchuck_init ();
  • Volgende elke keer dat u wilt bijwerken noemen de waarden van de nunchuck in uw schets readNunchuck();
  • Naast rechtstreekse toegang noemen de waarden getNunValue(Variable Constant); (ex. YAXIS)
  • Tot slot als u wenst te gebruiken de versnellingsmeter, maar hebben het geschaald naar een aantal Gs (dwz. 1 g = 1 kracht van de zwaartekracht). u kunt bellen getXGs(); getYGs(); of getZGs();

Aanhangsel 1 - _SERB_WiiNunchuckControl.pde

 //START OF NUNCHUCK PREAMBLE - For more in depth information please visit the original source of this code http://www.windmeadow.com/node/42 //------------------------------------------------- /* * Wiring Details * white - ground * red - 3.3+v - 5 volts seems to work * green - data - Analog 4 * yellow - clock - Analog 5 */ #include #include #undef int #include uint8_t outbuf[6]; // array to store arduino output int cnt = 0; // counter used for nunchuck comunication int ledPin = 13; int nunchuckValues[] = {0,0,0,0,0,0,0,0,0,0}; //An array to store the nuncheck values /* * The index of each value within the nunchuckValues[] array * ie. XSTICK value is stored at nunchuckValues[XSTICK] (0) */ #define XSTICK 0 //The joystick values #define YSTICK 1 #define XAXIS 2 //The three accelerometer values #define YAXIS 3 #define ZAXIS 4 #define ZBUTTON 5 //Front button values (0 when pressed) #define CBUTTON 6 #define XAXISDELTA 7 //Change in accelerometer data from last read; #define YAXISDELTA 8 #define ZAXISDELTA 9 //Nunchuck G calculating Constants /* * For scaling the raw values from the nunchuck into G values * Details on callibration and the maths can be found at * http://www.wiili.org/index.php/Motion_analysis (Copied from http://www.wiili.org/index.php/Motion_analysis) Zero Points x_0 = (x_1 + x_2) / 2\,y_0 = (y_1 + y_3) / 2\,z_0 = (z_2 + z_3) / 2\, One G points 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} */ /* Not all of these are used and could be deleted (kept to make interpretting math's * Easier 0-Zero G Value 1-Value when laying on table 2-Value when resting on nose * 3-Value when resting on side (left side up) */ #define X0 500 #define X1 500 #define 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 OF NUNCHUCK PREAMBLE - For more in depth information please visit the original source of this code http://www.windmeadow.com/node/42 //------------------------------------------------------ //-------------------------------------------------------------------------- // START OF ARDUINO CONTROLLED SERVO ROBOT (SERB) PREAMBLE #include #define LEFTSERVOPIN 10 #define RIGHTSERVOPIN 9 #define MAXSPEED 10 //due to the way continuous rotation servos work maximum speed is reached at a much lower value than 90 (this value will change depending on your servos) (for Parallax servos) Servo leftServo; Servo rightServo; int leftSpeed = 100; //sets the speed of the robot (left servos) //a percentage between -MAXSPEED and MAXSPEED int rightSpeed = 100; //sets the speed of the robot (both servos) //a percentage between -MAXSPEED and MAXSPEED int speed = 100; //used for simple control (goForward, goBackward, goLeft, and goRight //a percentage between 0 and MAXSPEED // END OF ARDUINO CONTROLLED SERVO ROBOT (SERB) PREAMBLE //-------------------------------------------------------------------------- long lastPrint; //a long variable to store the time the wiimote state was last printed #define PRINTINTERVAL 1000 //the number of milliseconds between outputting the nunchuck state over the usb port #define DEADBAND 20 //A percentage away from center that is interpretted as still being zero void setup(){ Serial.begin(9600); //Starts the serial port (used for debuging however makes servos jumpy) nunchuck_init (); // send the nunchuck initilization handshake serbSetup(); // adds the servos and prepares all SERB related variables lastPrint = millis(); } void loop(){ readNunchuck(); //Reads the current state of the nunchucks buttons and accelerometers if(!getNunValue(ZBUTTON)){ moveWiiAcelerometer(); //moves the wii deoending on the nunchucks acceleration values }else{ moveWiiJoystick(); } if((millis() - lastPrint) > PRINTINTERVAL){ //If a second has passed since last printing nunchuck values print them printData(); //print nunchuck values Serial.println(); //add an enter lastPrint = millis(); //store current time as 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 in a speed and a direction input (like a joystick) and translates it to speed commands void moveDifferential(int speed1, int direction1){ speed1 = deadBandFilter(speed1); direction1 = deadBandFilter(direction1); setSpeedLeft(speed1 + direction1); setSpeedRight(speed1 - direction1); } int deadBandFilter(int value){ if(value > -DEADBAND && value < DEADBAND){value = 0;} else{ if(value > 0){value = value - DEADBAND * 100 / (100-DEADBAND);} else{value = value + DEADBAND * 100 / (100-DEADBAND);} } return value; } //START OF NUNCHUCK ROUTINES //------------------------------------------------------------------------------------------------------- //Calculates and returns the xAxis acceleration in Gs float getXGs(){ return ((float)getNunValue(XAXIS) - X0) / (X3 - X0); } //Calculates and returns the yAxis acceleration in Gs float getYGs(){ return ((float)getNunValue(YAXIS) - Y0) / (Y2 - Y0); } //Calculates and returns the zAxis acceleration in Gs float getZGs(){ return ((float)getNunValue(YAXIS) - Z0) / (Z1 - Z0); } //START OF NUNCHUCK Reading CODE - For more in depth information please visit the original source //of this code http://www.windmeadow.com/node/42 //--------------------------------------------------------------- void readNunchuck(){ Wire.requestFrom (0x52, 6); // request data from nunchuck while (Wire.available ()) { outbuf[cnt] = nunchuk_decode_byte (Wire.receive ()); // receive byte as an integer digitalWrite (ledPin, HIGH); // sets the LED on cnt++; } // If we recieved the 6 bytes, then go print them if (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[CBUTTON] = 0; // byte outbuf[5] contains bits for z and c buttons // it also contains the least significant bits for the accelerometer data // so we have to check each bit of byte outbuf[5] if ((outbuf[5] >> 0) & 1) { nunchuckValues[ZBUTTON] = 1; } //checking if Z button is pressed (0=pressed 1=unpressed) if ((outbuf[5] >> 1) & 1) { nunchuckValues[CBUTTON] = 1; } //checking if C button is pressed (0=pressed 1=unpressed) if ((outbuf[5] >> 2) & 1) { tempNun_xAxis += 2; } //adding second least significant bit to x_axis if ((outbuf[5] >> 3) & 1) { tempNun_xAxis += 1; } //adding least significant bit to x_axis if ((outbuf[5] >> 4) & 1) { tempNun_yAxis += 2; } //adding second least significant bit to y_axis if ((outbuf[5] >> 5) & 1) { tempNun_yAxis += 1; } //adding least significant bit to x_axis if ((outbuf[5] >> 6) & 1) { tempNun_zAxis += 2; } //adding second least significant bit to z_axis if ((outbuf[5] >> 7) & 1) { tempNun_zAxis += 1; } ////adding least significant bit to 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 (); // send the request for next bytes} int getNunValue(int valueIndex){ return nunchuckValues[valueIndex];} void nunchuck_init (){ Wire.begin (); // join i2c bus with address 0x52 Wire.beginTransmission (0x52); // transmit to device 0x52 Wire.send (0x40); // sends memory address Wire.send (0x00); // sends sent a zero. Wire.endTransmission (); // stop transmitting} void send_zero () { Wire.beginTransmission (0x52); // transmit to device 0x52 Wire.send (0x00); // sends one byte Wire.endTransmission (); // stop transmitting} // Encode data to format that most wiimote drivers except// only needed if you use one of the regular wiimote driverschar nunchuk_decode_byte (char x) { x = (x ^ 0x17) + 0x17; return x;} //END OF NUNCHUCK CODE - For more in depth information please visit the //original source of this code http://www.windmeadow.com/node/42 //--------------------------------------------------------------- //------------------------------------------------------------------------//START OF ARDUINO CONTROLLED SERVO ROBOT (SERB) ROUTINES /* * sets up your arduino to address your SERB using the included routines*/void serbSetup(){ setSpeed(speed); pinMode(LEFTSERVOPIN, OUTPUT); //sets the left servo signal pin //to output pinMode(RIGHTSERVOPIN, OUTPUT); //sets the right servo signal pin //to output leftServo.attach(LEFTSERVOPIN); //attaches left servo rightServo.attach(RIGHTSERVOPIN); //attaches right servo goStop();} /* * sets the speed of the robot between 0-(stopped) and 100-(full speed) * NOTE: speed will not change the current speed you must change speed * then call one of the go methods before changes occur.*/ void setSpeed(int newSpeed){ if(newSpeed >= 100) {newSpeed = 100;} //if speed is greater than 100 //make it 100 if(newSpeed <= 0) {newSpeed = 0;} //if speed is less than 0 make //it 0 speed = newSpeed * MAXSPEED / 100; //scales the speed to be //between 0 and MAXSPEED} /* * sets the speed of the robots rightServo between -100-(reversed) and 100-(forward) * NOTE: calls to this routine will take effect imediatly*/ void setSpeedRight(int newSpeed){ if(newSpeed >= 100) {newSpeed = 100;} //if speed is greater than 100 //make it 100 if(newSpeed <= -100) {newSpeed = -100;} //if speed is less than -100 make //it -100 rightSpeed = newSpeed * MAXSPEED / 100; //scales the speed to be //between -MAXSPEED and MAXSPEED rightServo.write(90 - rightSpeed); //sends the new value to the servo} /* * sets the speed of the robots leftServo between -100-(reversed) and 100-(forward) * NOTE: calls to this routine will take effect imediatly*/ void setSpeedLeft(int newSpeed){ if(newSpeed >= 100) {newSpeed = 100;} //if speed is greater than 100 //make it 100 if(newSpeed <= -100) {newSpeed = -100;} //if speed is less than -100 make //it -100 leftSpeed = newSpeed * MAXSPEED / 100; //scales the speed to be //between -MAXSPEED and MAXSPEED leftServo.write(90 + leftSpeed); //sends the new value to the servo} /* * sends the robot forwards */void goForward(){ leftServo.write(90 + speed); rightServo.write(90 - speed);} /* * sends the robot backwards */void goBackward(){ leftServo.write(90 - speed); rightServo.write(90 + speed);} /* * sends the robot right */void goRight(){ leftServo.write(90 + speed); rightServo.write(90 + speed);} /* * sends the robot left */void goLeft(){ leftServo.write(90 - speed); rightServo.write(90 - speed);} /* * stops the robot */void goStop(){ leftServo.write(90); rightServo.write(90);} //END OF ARDUINO CONTROLLED SERVO ROBOT (SERB) ROUTINES//--------------------------------------------------------------------------- //START OF PRINT ROUTINES (can delete if not using)//--------------------------------------------------------------- //Prints the Nunchucks last read data (must call NUN_readNunchuck(); before callingvoid 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");} //END OF PRINT ROUTINES//-------------------------------------------------------------------- 

Gerelateerde Artikelen

Androino! Controle van een Arduino vanaf uw Android-apparaat met behulp van een goedkope bluetooth-module.

Androino! Controle van een Arduino vanaf uw Android-apparaat met behulp van een goedkope bluetooth-module.

Dit instructable toont je hoe om te lezen van sensor-waardes van een Arduino met uw Androïde apparaat met behulp van een seriële goedkoop bluetooth-apparaat dat u voor onder $10 op dealextreme of ebay bestellen kunt.In het volgende voorbeeld gebruikt
Controle van een Arduino met uw iPhone

Controle van een Arduino met uw iPhone

Hey!Dit Instructable toont je hoe om te controleren van een Arduino met een iPhone zonder te programmeren van uw eigen applicatie van iOS. We gonna een LED flash maar u kunt ook een heleboel andere dingen mee doen!We zullen met behulp van een Arduino
Controle van een Arduino met een horloge (TI eZ430 Chronos)

Controle van een Arduino met een horloge (TI eZ430 Chronos)

het horlogeDe Texas Instruments eZ430 Chronos is een coole gadget. Het heeft bidirectionele radiocommunicatie, en een gehele bos van sensoren: temperatuur, druk, versnelling.Het is in feite een development kit voor de MSP-430 (een low-power microcont
Controle van een Arduino met uw telefoon.

Controle van een Arduino met uw telefoon.

In dit Instructable zal ik laten zien hoe om te controleren uw spullen met uw telefoon en de arduino board. Ik heb alles gecontroleerd uit rookmachines ook Kerstmis licht is met dit programma.Video:Sorry dat de video is nogal vreemd, want mijn camera
Controle van een Arduino met PHP

Controle van een Arduino met PHP

hier is hoe te maken van je Arduino doen meer dan het internet zonder een ethernet of wifi schild. Dit is een eenvoudige manier om uw project bestuurbaar overal in de wereld!Stap 1: Platform CompatabilityDeze methode werkt niet onder Windows. Ik kan
Controle van een arduino project via een aanpasbare android / Iphone app met Blynk en Wemos D1: de 2016 SUPER NOOB vriendelijke manier

Controle van een arduino project via een aanpasbare android / Iphone app met Blynk en Wemos D1: de 2016 SUPER NOOB vriendelijke manier

Het doel van dit instructable is om je te leren hoe wifi aangesloten arduino projecten de eenvoudigste en snelste manier mogelijk te maken. Als u een arduino project die u wilt vanaf beheren kunt uw smartphone en dat kostte slechts 4 eurs in hardware
Maak een eenvoudige draadloze RF robot met behulp van Arduino!

Maak een eenvoudige draadloze RF robot met behulp van Arduino!

UPDATE: IK HEB JOYSTICK-CONTROLE TOEGEVOEGD AAN DEZE ROBOT. GELIEVE TE VERWIJZEN NAAR DE STAP 7, ALS U WILT BEPALEN UW ROBOT VIA JOYSTICK.HalloDit is mijn eerste instructable en in deze tutorial, I 'm gonna Toon u hoe te bouwen van een eenvoudige dra
Het bouwen van een Robot met behulp van MSP430 Launchpad

Het bouwen van een Robot met behulp van MSP430 Launchpad

In dit Instructable gaan we aan het bouwen van een kleine robot met behulp van MSP430 Launchpad van TI. De robot zal gebruik maken van twee gericht gelijkstroommotoren en differentiële aandrijfsysteem zal tewerkstellen.De intelligentie is voorzien va
Maak een Web aangesloten Robot (voor ongeveer $500) (met behulp van een Arduino en Netbook)

Maak een Web aangesloten Robot (voor ongeveer $500) (met behulp van een Arduino en Netbook)

dit Instructable zal u tonen hoe te bouwen van uw eigen Web aangesloten Robot (met behulp van een Arduino micro-controller en de Asus eee pc).Waarom zou u een Web aangesloten Robot willen? Om mee te spelen natuurlijk. Rijd uw robot van hele kamer of
Remote Controlled Arduino Robot met behulp van Wixel Transceivers

Remote Controlled Arduino Robot met behulp van Wixel Transceivers

UPDATE JAN 2012: dit project werd gekenmerkt op de Pololu website onder Resources/Community projecten.  http://www.Pololu.com/resources/communityprojectsINTRODUCTIEIn dit project, gebruik ik twee Pololu Wixel transceivers op afstand bedienen van een
Draadloos bedienen een Robot met behulp van de Arduino en RF Modules!

Draadloos bedienen een Robot met behulp van de Arduino en RF Modules!

/*Bewerken van 05/05/2016Hey jongens, ik druk bezig geweest met college en kon niet antwoorden naar commments. De meeste van jullie wilde de code en schema's gedaan een beetje beter dus ik heb het schema op Eagle 7.2.0 gemaakt en geüpload alles op Gi
Controle van uw Robot met behulp van de mobiele telefoon

Controle van uw Robot met behulp van de mobiele telefoon

DEZE hele TUTORIAL IS ook beschikbaar op mijn WEBSITEHallo zal wereld in deze post ik u tonen hoe om te controleren van de robot met behulp van de mobiele telefoon. Besturen van een robot met behulp van de mobiele telefoon is niet zo ingewikkeld als
Obstakel te vermijden Robot met behulp van IR Module geïnterfacet met een boord van Mediatek LinkIt

Obstakel te vermijden Robot met behulp van IR Module geïnterfacet met een boord van Mediatek LinkIt

In deze Intructable zal u worden kunnen te maken een obstakel vermijden Robot met behulp van IR module met L293D en Mediatek Linkit een boord.Stap 1: vereisten L293D Motor Driver IC.2 IR Sensor Modules.Chassi voor Bot.Mediatek LinkItOne-Board2 100 RP
Oprichting van een wandelende robot met behulp van polycaprolactone

Oprichting van een wandelende robot met behulp van polycaprolactone

Video over hoe ik een wandelende robot met behulp van polycaprolactone gemaakt. Polycaprolactone is een interessante kunststof, waardoor u snel maken van prototypes. Het gesmolten bij 60-65 ° C. Voor het smelten van polycaprolactone, gebruikte ik war