In het vorige verhaaltje over het robotwagentje met de nRF24 maakte ik gebruik van een joystick-module en een joystick-module uit een Play Station 3-controller om de wagen te besturen.
Wat ik raar vond (ik heb in het verleden vaker met, traditionele joysticks gewerkt) is dat de x en y waarden voor tussenliggende posities (schuin naar links, recht, naar voren of naar achteren) een beetje vreemd zijn. Bijvoorbeeld: voor de stand “naar rechts-boven” is in onderstaande afbeelding de x-waarde 1023 en voor de y-waarde 0, terwijl ik eigenlijk x = 768 en y = 256 verwacht, zoals die uit een normale joystick komen.

Maar … ik had nog een Nunchuk liggen!

Een Nunchuk (eigenlijk oosterse vechtstokken) , een uitbreiding van de Wii-mote voor de besturing van een Wii spelcomputer, heeft een met de duim bestuurbare analoge joystick, twee met de wijsvinger te bedienen drukknoppen (een C-knop en een Z-knop) en een drie-assige accelerometer. Deze joystick produceert de x- en y-waarden die ik verwacht (wel tussen 0 en 256 en niet tussen 0 en 1024, maar dat is nauwkeurig genoeg)

Met alleen een joystick kan de wagen acht verschillende richtingen op gestuurd worden, maar zoals je kunt zien zijn er met de Mecanum wielen meer bewegingen uit te voeren. Ik kom, naast de hieronder linker afbeelding getoonde 8, op 18 (t.n.t.) in totaal. Door nu naast de joystick te bewegen ook een van de knoppen in te drukken zijn er dus 24 (8 x 3) bewegingen aan te sturen. Wanneer beide knoppen tegelijk ingedrukt worden komen er nog eens 8 eventuele bewegingen bij!


In een ver verleden gekocht en toen het stekkertje eraf geknipt om ‘m met een Arduino te verbinden. Vier draadjes komen eruit: wit, rood, groen en geel. Ik heb het destijds vast ergens genoteerd, maar nu kon ik dat niet meer vinden: welk draadje is welke aansluiting? Uitproberen dus?
Aan de gele en de groene draad zat een 2-pins connector, dus gegokt dat dat de aansluiting voor de I2C (SDA en SCL naar A4 en A5 op de Arduino) zouden kunnen zijn. Dan zou volgen dat de rode de Vcc en de witte de Gnd zouden moeten zijn. En dat klopte gelukkig: ik heb blijkbaar een ‘originele’ Nunchuk! De volgende kleurtjes zijn in ieder geval van toepassing.
Rood – Vcc
Wit – Gnd
Groen – SDA – A4 op Arduino
Geel – SCL – A5 op Arduino
En zo wordt de Nunchuk dan ook op een Arduino Nano aangesloten om e.e.a. uit te testen.
#include <Wire.h>
#include <ArduinoNunchuk.h>
ArduinoNunchuk nunchuk = ArduinoNunchuk();
void setup() {
Serial.begin(19200); //initialize serial
nunchuk.init(); //initialize de nunchuck
}
void loop() {
nunchuk.update(); //haal de gegevens uit de nunchuck
Serial.print(nunchuk.analogX, DEC); //print de waarden in decimalen
Serial.print(' ');
Serial.print(nunchuk.analogY, DEC);
Serial.print(' ');
/*
Serial.print(nunchuk.accelX, DEC);
Serial.print(' ');
Serial.print(nunchuk.accelY, DEC);
Serial.print(' ');
Serial.print(nunchuk.accelZ, DEC);
Serial.print(' ');
*/
Serial.print(nunchuk.zButton, DEC);
Serial.print(' ');
Serial.println(nunchuk.cButton, DEC);
}
De code om de Nunchuk uit te lezen (hierboven) is kort en simpel. De waarde van de Nunchuck worden d.m.v. de functie nunchuk.update() uitgelezen. Alleen met de x- en y-waarde en die van de twee knoppen wordt doorgegaan. Met de waardes van de accelerometer doen we hier niets, want deze worden niet gebruikt.
Het programma van zowel de besturing als van de wagen moet vervolgens aangepast worden.
#include <SPI.h>
#include "printf.h"
#include "RF24.h"
#include <Wire.h>
#include <ArduinoNunchuk.h>
ArduinoNunchuk nunchuk = ArduinoNunchuk();
RF24 radio(9,10);
const byte rxAddr[6] = "00001";
struct Data_Package {
int valx;
int valy;
int butz;
int butc;
};
Data_Package data; //Create a variable with the above structure
void setup()
{
Serial.begin(9600);
Serial.print ("Robotwagen_besturing_2_Nunchuk.ino");
radio.begin();
radio.setRetries(15, 15);
radio.openWritingPipe (rxAddr);
radio.setPALevel(RF24_PA_MIN);
radio.stopListening();
nunchuk.init(); //initialize de nunchuck
}
void loop()
{
nunchuk.update(); //haal de gegevens uit de nunchuck
data.valx = nunchuk.analogX;
data.valy = nunchuk.analogY;
data.butz = nunchuk.zButton;
data.butc = nunchuk.cButton;
radio.write(&data, sizeof(Data_Package));
Serial.print("X = ");
Serial.print(data.valx);
Serial.print(' ');
Serial.print("Y = ");
Serial.println(data.valy);
Serial.print("Z = ");
Serial.print(data.butz);
Serial.print(' ');
Serial.print("C = ");
Serial.println(data.butc);
//delay(500); // slow transmissions down by 1/2 second
}
Het hele blok met Serial.print opdrachten kan er later natuurlijk uit: is alleen maar om te checken of de waardes overeenkomen.

