Nunchuck-muis naar WASD keyboard

Projecten die niet passen in bovenstaande onderwerpen
Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Nunchuck-muis naar WASD keyboard

Berichtdoor nicoverduin » 15 Nov 2016, 20:50

Met koepel heb je misschien nog mazzel. Aan mij had je een verkeerde gehad:) daarom vinden sommigen mij vervelend en lastig:) lekker boeiend. Ik zou alleen beginnen bij wat tutorials. En als je die niet begrijpt gewoon vragen erover stellen. Dan ben je de eerste!!!
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Advertisement

Gebruikers-avatar
Berichten: 18
Geregistreerd: 14 Nov 2016, 22:19
Woonplaats: Groningen

Re: Nunchuck-muis naar WASD keyboard

Berichtdoor Klavkjir » 15 Nov 2016, 22:58

Bedankt, zal ik zeker even gaan doen.

Gebruikers-avatar
Berichten: 18
Geregistreerd: 14 Nov 2016, 22:19
Woonplaats: Groningen

Re: Nunchuck-muis naar WASD keyboard

Berichtdoor Klavkjir » 21 Dec 2016, 00:04

Hallo!

Ruim een maand later, heb ik dan eindelijk mijn ProMicro (Leonardo) van oom Ali in de bus gekregen.
Nu ben ik er wat mee aan het rommelen, in de hoop dat de Nunchuck met de code uit dit topic meteen zou werken, maar tevergeefs.

De vraag die ik jullie nu wil stellen is; waarom werkt deze CPP code niet icm mijn Leonardo en mijn Nunchuck?
Weer even voor de context, ik ben student Communicatie en werk aan een project met een Oculus Rift.

Code: Alles selecteren
//Brian Krukoski
//April 2012
//red-+5, white-gnd, green-sda, yllw-clck
#include <Keyboard.h>
#include <Wire.h>
#include "nunchuck_funcs.h"
#include <HID.h>
 
int loop_cnt=0;
 
// parameters for reading the joystick:
int range = 40;               // output range of X or Y movement
int threshold = range/10;      // resting threshold
int center = range/2;         // resting position value
 
boolean mouseIsActive = false;    // whether or not to control the mouse
int lastSwitchState = LOW;        // previous switch state
 
void setup() {
  // initilization for the Wiichuck
  nunchuck_init();
  // take control of the mouse:
  Mouse.begin();
  Serial.begin(9600);
}
void loop() {
  if( loop_cnt > 10 ) { // every 10 msecs get new data
    loop_cnt = 0;
    nunchuck_get_data();
    int sensorReading = analogRead(A0);
    Serial.println(sensorReading);
    delay(1);
 
    //right and left click control
    int leftState = nunchuck_cbutton();
    if (leftState) Mouse.press(MOUSE_RIGHT); else Mouse.release(MOUSE_RIGHT); //Switched with Left
    int rightState = nunchuck_zbutton();
    if (rightState) Mouse.press(MOUSE_LEFT); else Mouse.release(MOUSE_LEFT);  //Switched with Right
 
    // read the x axis
    int xReading = nunchuck_joyx(); //calls on nunchuck_funcs library for x axis reading
    xReading = map(xReading, 38, 232, 0, range); // 38 and 232 arbitrarily determined through experimentation, maps to 0 and preset range
    int xDistance = xReading - center;
    if (abs(xDistance) < threshold) //if absolute value of xDistance is less than predefined threshold....
      {
        xDistance = 0;
      }
 
    // read the y axis
    int yReading = nunchuck_joyy(); //calls on nunchuck_funcs library for y axis reading
    yReading = map(yReading, 38, 232, 0, range); // 38 and 232 arbitrarily determined through experimentation, maps to 0 and preset range
    int yDistance = yReading - center;
    if (abs(yDistance) < threshold) //if absolute value of yDistance is less than predefined threshold....
      {
        yDistance = 0;
      }
 
 // move the mouse if the readings were above 0
    if ((xDistance != 0) || (yDistance != 0)) {
      Mouse.move(xDistance, -yDistance, 0); // -yDistance ensures inverted style joystick
    }
  }
  nunchuck_print_data(); //prints nunchuck data to serial monitor for debugging purposes
  loop_cnt++;
  delay(1);
 
}


// move the mouse if the readings were above 0
if ((xDistance != 0) || (yDistance != 0)) {
Mouse.move(xDistance, -yDistance, 0); // -yDistance ensures inverted style joystick
}
}
nunchuck_print_data(); //prints nunchuck data to serial monitor for debugging purposes
loop_cnt++;
delay(1);

}


Het rode gedeelte heb ik vervangen door een stukje code van Nicoverduin;

Code: Alles selecteren
if (xDistance != 0) {                           // Bij geen beweging niets doen             
    if (xDistance > 0) {
        Keyboard.press('W');                    // Stuur 'W'
    } else {
        Keyboard.press('S');                    // Stuur 'S'
    }
    delay(100);                                 // ff wachten
    Keyboard.releaseAll();                      // alle toetsen los
}
if (yDistance != 0) {                           // Bij geen beweging niets doen
    if (yDistance > 0) {                     
        Keyboard.press('A');                    // stuur 'A'
    } else {
        Keyboard.press('D');                    // stuur 'D'
    }
    delay(100);                                 // ff wachten
    Keyboard.releaseAll();                      // alle toetsen los
}



Ik kan hem gewoon uploaden, maar er gebeurt niks.
Met een muis-emulatie programmaatje, doet de Nunchuck het wel. De werking kunnen we dus uitsluiten.

Wie kan mij helpen, wat gaat er hier dan toch mis?!

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Nunchuck-muis naar WASD keyboard

Berichtdoor Koepel » 21 Dec 2016, 01:57

Kun je vertellen waar je die Nunchuck library vandaan gedownload hebt ? Dan probeer ik om het te compileren.

Ik heb zelf een Pro Micro, en in de Arduino.cc IDE 1.6.13 kies ik de "Arduino/Genuino Micro".

Welke pinnen van je Pro Micro heb je gebruikt voor de I2C ? Pin 2 is de SDA en pin 3 is de SCL.
Dit zijn de aansluitingen : http://www.pighixxx.com/test/2016/07/pro-micro-pinout/.
Heb je een 5V 16MHz Pro Micro, en is de soldeerbrug linksboven gesoldeerd ?

Als ik het goed begrijp, dan gebruik je alleen de 5V en GND, en SDA en SCL, en verder helemaal geen pinnen ?

Volgens mij is het ook nodig om #include <Mouse.h> te doen en is de #include <HID.h> niet nodig.

Je kunt gegevens van de Nunchuck naar de seriële monitor sturen, en je kunt een test sketch maken die iets met het toetsenbord en de muis doet. Dat is hoe je stap voor stap naar iets toe werkt.
Ik kan met de muis en toetsenbord doen wat ik wil, en dat werkt allemaal.

Hiermee kun je testen dat je inderdaad een 16MHz Pro Micro hebt:
Code: Alles selecteren
// Test speed of Pro Micro clone.
// Select the Arduino Micro in the IDE (that is a 16MHz ATmega32U4).
// Keep your watch next to the Pro Micro and check if the leds blinks every second.

void setup()
{
  pinMode( LED_BUILTIN_TX, OUTPUT);
  pinMode( LED_BUILTIN_RX, OUTPUT);
}

void loop()
{
  digitalWrite( LED_BUILTIN_TX, LOW);
  digitalWrite( LED_BUILTIN_RX, LOW);
  delay( 200);
  digitalWrite( LED_BUILTIN_TX, HIGH);
  digitalWrite( LED_BUILTIN_RX, HIGH);
  delay( 800);
}

Gebruikers-avatar
Berichten: 18
Geregistreerd: 14 Nov 2016, 22:19
Woonplaats: Groningen

Re: Nunchuck-muis naar WASD keyboard

Berichtdoor Klavkjir » 22 Dec 2016, 18:50

Koepel schreef:Kun je vertellen waar je die Nunchuck library vandaan gedownload hebt ? Dan probeer ik om het te compileren.

Ik heb zelf een Pro Micro, en in de Arduino.cc IDE 1.6.13 kies ik de "Arduino/Genuino Micro".

Welke pinnen van je Pro Micro heb je gebruikt voor de I2C ? Pin 2 is de SDA en pin 3 is de SCL.
Dit zijn de aansluitingen : http://www.pighixxx.com/test/2016/07/pro-micro-pinout/.
Heb je een 5V 16MHz Pro Micro, en is de soldeerbrug linksboven gesoldeerd ?

Als ik het goed begrijp, dan gebruik je alleen de 5V en GND, en SDA en SCL, en verder helemaal geen pinnen ?

Volgens mij is het ook nodig om #include <Mouse.h> te doen en is de #include <HID.h> niet nodig.

Je kunt gegevens van de Nunchuck naar de seriële monitor sturen, en je kunt een test sketch maken die iets met het toetsenbord en de muis doet. Dat is hoe je stap voor stap naar iets toe werkt.
Ik kan met de muis en toetsenbord doen wat ik wil, en dat werkt allemaal.

Hiermee kun je testen dat je inderdaad een 16MHz Pro Micro hebt:
Code: Alles selecteren
// Test speed of Pro Micro clone.
// Select the Arduino Micro in the IDE (that is a 16MHz ATmega32U4).
// Keep your watch next to the Pro Micro and check if the leds blinks every second.

void setup()
{
  pinMode( LED_BUILTIN_TX, OUTPUT);
  pinMode( LED_BUILTIN_RX, OUTPUT);
}

void loop()
{
  digitalWrite( LED_BUILTIN_TX, LOW);
  digitalWrite( LED_BUILTIN_RX, LOW);
  delay( 200);
  digitalWrite( LED_BUILTIN_TX, HIGH);
  digitalWrite( LED_BUILTIN_RX, HIGH);
  delay( 800);
}

Ten eerste weer mijn hatelijke dank voor je antwoord!

In mijn Arduino IDE heb ik 'Leonardo' geselecteerd. De code heb ik geupload en het LEDje knippert inderdaad om de seconde.
Ik neem dus aan dat het dan de 16MHz versie betreft.

Van de Arduino heb ik de volgende pinnen gebruikt;

Pin2 -> Nunchuck Data
Pin3 -> Nunchuck CLK

*De soldeerbrug heb ik niet gesoldeerd (er staat 'J1' bij). Waar is deze voor?

De Nunchuck Library die ik gebruik, heet Nunchuck_funcs https://github.com/todbot/wiichuck_adapter/blob/master/firmware/WiichuckDemo/nunchuck_funcs.h

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Nunchuck-muis naar WASD keyboard

Berichtdoor Koepel » 22 Dec 2016, 19:19

Het forum liep vast, terwijl ik een goed antwoord had geschreven. Dat gebeurt vaker, en het is dan ook niet meer bij de Concepten te vinden :( Het meeste was trouwens een herhaling van ik al geschreven had. Sorry.

Wat is nu je vraag ?
Kun je vertellen wat je aan het bestand "nunchuck_funcs.h" hebt gewijzigd om het te laten compileren ?
En kun je een sketch geven die compileert ?

Gebruikers-avatar
Berichten: 18
Geregistreerd: 14 Nov 2016, 22:19
Woonplaats: Groningen

Re: Nunchuck-muis naar WASD keyboard

Berichtdoor Klavkjir » 22 Dec 2016, 23:45

Vervelend dat je antwoord verloren is gegaan. Toch heb ik al erg veel aan je hulp.

Mijn vraag is eigenlijk; hoe kan ik de sketch eerder in dit topic gebruiken om mijn Nunchuck te emuleren als W, A, S, D, linker- en rechtermuis.
Ik begrijp niet helemaal wat je bedoelt met het veranderen en compileren van het Nunchuck_funcs.h bestand.
De sketch die eerder in dit topic is gebruikt, heb ik gekopieerd en geplakt in mijn eigen IDE en heb de libraries ervoor gedownload.

Dit is wat ik tot nu toe heb. Het werkt alleen niet (goed)..

Code: Alles selecteren
//Brian Krukoski
//April 2012
//red-+5, white-gnd, green-sda, yllw-clck
#include <Keyboard.h>
#include <Wire.h>
#include <nunchuck_funcs.h>
#include <HID.h>
#include <Mouse.h>

int loop_cnt = 0;

// parameters for reading the joystick:
int range = 40;               // output range of X or Y movement
int threshold = range / 10;    // resting threshold
int center = range / 2;       // resting position value

boolean mouseIsActive = false;    // whether or not to control the mouse
int lastSwitchState = LOW;        // previous switch state

void setup() {
  // initilization for the Wiichuck
  nunchuck_init();
  // take control of the mouse:
  Mouse.begin();
  Serial.begin(9600);
}
void loop() {
  if ( loop_cnt > 10 ) { // every 10 msecs get new data
    loop_cnt = 0;
    nunchuck_get_data();
    int sensorReading = analogRead(A0);
    Serial.println(sensorReading);
    delay(1);

    //right and left click control
    int leftState = nunchuck_cbutton();
    if (leftState) Mouse.press(MOUSE_RIGHT); else Mouse.release(MOUSE_RIGHT); //Switched with Left
    int rightState = nunchuck_zbutton();
    if (rightState) Mouse.press(MOUSE_LEFT); else Mouse.release(MOUSE_LEFT);  //Switched with Right

    // read the x axis
    int xReading = nunchuck_joyx(); //calls on nunchuck_funcs library for x axis reading
    xReading = map(xReading, 38, 232, 0, range); // 38 and 232 arbitrarily determined through experimentation, maps to 0 and preset range
    int xDistance = xReading - center;
    if (abs(xDistance) < threshold) //if absolute value of xDistance is less than predefined threshold....
    {
      xDistance = 0;
    }

    // read the y axis
    int yReading = nunchuck_joyy(); //calls on nunchuck_funcs library for y axis reading
    yReading = map(yReading, 38, 232, 0, range); // 38 and 232 arbitrarily determined through experimentation, maps to 0 and preset range
    int yDistance = yReading - center;
    if (abs(yDistance) < threshold) //if absolute value of yDistance is less than predefined threshold....
    {
      yDistance = 0;
    }

    if (xDistance != 0) {                           // Bij geen beweging niets doen
      if (xDistance > 0) {
        Keyboard.press('W');                    // Stuur 'W'
      } else {
        Keyboard.press('S');                    // Stuur 'S'
      }
      delay(100);                                 // ff wachten
      Keyboard.releaseAll();                      // alle toetsen los
    }
    if (yDistance != 0) {                           // Bij geen beweging niets doen
      if (yDistance > 0) {
        Keyboard.press('A');                    // stuur 'A'
      } else {
        Keyboard.press('D');                    // stuur 'D'
      }
      delay(100);                                 // ff wachten
      Keyboard.releaseAll();                      // alle toetsen los
    }
    nunchuck_print_data(); //prints nunchuck data to serial monitor for debugging purposes
    loop_cnt++;
    delay(1);
  }
}

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Nunchuck-muis naar WASD keyboard

Berichtdoor Koepel » 23 Dec 2016, 00:04

Ik heb Arduino.cc IDE 1.8.0 met een Pro Micro clone. Ik kies als board "Arduino/Genuino Micro".
Het bestand "nunchuck_funcs.h" heb ik van die link die jij gaf, en dat heb ik aan mijn project toegevoegd.

Dat compileert niet. Dus als het bij jou wel compileert, dan is er iets mis. Misschien heb je "nunchuck_funcs.h" twee keer.
Om het wel te laten compileren, heb ik de functie nunchuck_setpowerpins() leeggehaald, alleen de delay(100); heb ik laten staan.

Heb je de #include "nunchuck_funcs.h" gewijzigd naar #include <nunchuck_funcs.h> ? Dus dan staat dat bestand in de "libraries" map ?

In de sketch kun je "#include <HID.h>" weghalen. Dat is niet nodig.

Daarna zou je de gegevens van de nunchuck naar de seriele monitor kunnen schrijven, zodat je kunt zien of het werkt.
Je kun ook een paar Mouse.move doen met delay er tussen om te zien of dat werkt.
Als die beide werken, dan pas kun je de sketch gaan proberen of het met elkaar werkt.

In setup() heb je natuurlijk ook een Keyboard.begin() nodig.
https://www.arduino.cc/en/Reference/KeyboardBegin

De soldeerjumper verbindt de usb_5V met de VCC. Zonder die soldeerjumper werkt de ATmega32U4 op een iets lagere spanning.

Gebruikers-avatar
Berichten: 18
Geregistreerd: 14 Nov 2016, 22:19
Woonplaats: Groningen

Re: Nunchuck-muis naar WASD keyboard

Berichtdoor Klavkjir » 24 Dec 2016, 14:05

Sorry voor mijn late reactie..
Ik heb 4 nunchuck libraries (voor verschillende projecten), maar slechts één Nunchuck_funcs.h bestand. Die "setpowerpins" regel heb je waar weggehaald?
Hoe kan ik de gegevens van de nunchuck naar de seriele monitor sturen?

Goed punt van die jumper, zal ze zo direct even verbinden met een druppeltje tin.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Nunchuck-muis naar WASD keyboard

Berichtdoor Koepel » 24 Dec 2016, 14:35

De nunchuck_setpowerpins() is een functie, en die zit in het bestand nunchuck_funcs.h, en dat heb ik gedownload van die link die jij gaf. Dus als jij dat wel kunt compileren voor een "Arduino/Genuino Micro" en ik niet, dan is er echt iets mis.

Bij deze regel:
Code: Alles selecteren
 int leftState = nunchuck_cbutton();
zou je een bericht naar de seriële monitor kunnen sturen dat die knop is ingedrukt. En dan kijken of het werkt.

Deze code is voor een knop:
Code: Alles selecteren
    int leftState = nunchuck_cbutton();
    if (leftState) Mouse.press(MOUSE_RIGHT); else Mouse.release(MOUSE_RIGHT); //Switched with Left

Iemand dacht slim te zijn door de if-statement op één regel te zetten, maar dat vind ik helemaal niet slim.
Als je dat anders doet, kun je eenvoudig een Serial.println() toevoegen.
Code: Alles selecteren
    int leftState = nunchuck_cbutton();
    if( leftState)             //Switched with Left ?
    {
      Mouse.press(MOUSE_RIGHT);
      Serial.println( "cbutton ingedrukt");   // <--- toegevoegd
    }
    else
    {
      Mouse.release(MOUSE_RIGHT);
    }

VorigeVolgende

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 33 gasten