INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Nunchuck+Ardurino
22.10.2015, 15:07
Beitrag #1
Nunchuck+Ardurino
Hi
bräuchte da mal hilfe, und zwar möchte ich mit dem Nunchuk ein RC car Bruschlessmotor steuern und zwar wie folgt:

C+ analogstick vorn = Geschwindigkeit erhöhen nur der Regler soll ca nur bis zu hälfte regeln quasi Geschwindikeitsdrosselung
Z+ analogstick vorn = normale regelung der geswindigkeit bis zum Anschlag also ohne Begrenzung
C oder Z + analogstick hinten normal bremsen

Analogstick links oder rechts jeweils ein digitaler ausgang ( Stromstoßschaltung)

Und nach möglichkeit eine erkennung für Funkabruch vom Nunchuck
Habe zwar schon viel probiert aber so habe ich das nicht hinbekommen aus diversen Programmen konnte ich ma grad ein Servo steuern was auch schon sehr schwierig für mich war.

Über Monitoring konnte ich folgenden werte auslesen:
Grundstellung des Analogstick auf beide Achsen 128
Analogstick Links 0, Analokstick rechts 255, Analogistick hoch 255, Analogstick runter 0, C+Z Taste jeweils 0

Ich hoffe es findet sich einer der eine Lösung hat.

Mit freundlichen Gruss Maik
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.10.2015, 15:13
Beitrag #2
RE: Nunchuck+Ardurino
Hi,
zeig doch mal, was Du bisher gemacht hast. Außerdem solltest Du sagen, was momentan konkret Dein Problem ist.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.10.2015, 15:35
Beitrag #3
RE: Nunchuck+Ardurino
PHP-Code:
#include <Wire.h>

int ledPin 13;
int servoPin 9;      // Control pin for servo motor

int pulseWidth 0;    // Amount to pulse the servo
int refreshTime 20;  // the time in millisecs needed in between pulses
long lastPulse;
int minPulse 700;   // minimum pulse width
int loop_cnt=0;

void setup()
{
 
Serial.begin(19200);
 
pinMode(servoPinOUTPUT);  // Set servo pin as an output pin
 
pulseWidth minPulse;      // Set the motor position to the minimum

 
nunchuck_setpowerpins(); // use analog pins 2&3 as fake gnd & pwr
 
nunchuck_init(); // send the initilization handshake
 
Serial.print("NunchuckServo ready\n");
}

void loop()
{
 
checkNunchuck();
 
updateServo();   // update servo position

 
if( nunchuck_zbutton() )      // light the LED if z button is pressed
   
digitalWrite(ledPinHIGH);
 else
   
digitalWrite(ledPin,LOW);

 
delay(1);        // this is hear to give a known time per loop
}


void checkNunchuck()
{
 if( 
loop_cnt 100 ) {  // loop()s is every 1msec, this is every 100msec
   
   
nunchuck_get_data();
   
nunchuck_print_data();

   
float tilt nunchuck_accelx();    // x-axis, in this case ranges from ~70 - ~185
   
tilt = (tilt 70) * 1.5;        // convert to angle in degrees, roughly  
   
pulseWidth = (tilt 9) + minPulse// convert angle to microseconds
   
   
loop_cnt 0;  // reset for
 
}
 
loop_cnt++;
 
}

// called every loop().
// uses global variables servoPin, pulsewidth, lastPulse, & refreshTime
void updateServo()
{
 
// pulse the servo again if rhe refresh time (20 ms) have passed:
 
if (millis() - lastPulse >= refreshTime) {
   
digitalWrite(servoPinHIGH);   // Turn the motor on
   
delayMicroseconds(pulseWidth);  // Length of the pulse sets the motor position
   
digitalWrite(servoPinLOW);    // Turn the motor off
   
lastPulse millis();           // save the time of the last pulse
 
}
}


//
// Nunchuck functions
//

static uint8_t nunchuck_buf[6];   // array to store nunchuck data,

// Uses port C (analog in) pins as power & ground for Nunchuck
static void nunchuck_setpowerpins()
{
#define pwrpin PORTC3
#define gndpin PORTC2
   
DDRC |= _BV(pwrpin) | _BV(gndpin);
   
PORTC &=~ _BV(gndpin);
   
PORTC |=  _BV(pwrpin);
   
delay(100);  // wait for things to stabilize        
}

// initialize the I2C system, join the I2C bus,
// and tell the nunchuck we're talking to it
void nunchuck_init()
{
 
Wire.begin();                      // join i2c bus as master
 
Wire.beginTransmission(0x52);      // transmit to device 0x52
 
Wire.write(0x40);            // sends memory address
 
Wire.write(0x00);            // sends sent a zero.  
 
Wire.endTransmission();      // stop transmitting
}

// Send a request for data to the nunchuck
// was "send_zero()"
void nunchuck_send_request()
{
 
Wire.beginTransmission(0x52);      // transmit to device 0x52
 
Wire.write(0x00);            // sends one byte
 
Wire.endTransmission();      // stop transmitting
}

// Receive data back from the nunchuck,
// returns 1 on successful read. returns 0 on failure
int nunchuck_get_data()
{
 
int cnt=0;
 
Wire.requestFrom (0x526);      // request data from nunchuck
 
while (Wire.available ()) {
   
// receive byte as an integer
   
nunchuck_buf[cnt] = nunchuk_decode_byte(Wire.read());
   
cnt++;
 }
 
nunchuck_send_request();  // send request for next data payload
 // If we recieved the 6 bytes, then go print them
 
if (cnt >= 5) {
   return 
1;   // success
 
}
 return 
0//failure
}

// Print the input data we have recieved
// accel data is 10 bits long
// so we read 8 bits, then we have to add
// on the last 2 bits.  That is why I
// multiply them by 2 * 2
void nunchuck_print_data()
{
 static 
int i=0;
 
int joy_x_axis nunchuck_buf[0];
 
int joy_y_axis nunchuck_buf[1];
 
int accel_x_axis nunchuck_buf[2]; // * 2 * 2;
 
int accel_y_axis nunchuck_buf[3]; // * 2 * 2;
 
int accel_z_axis nunchuck_buf[4]; // * 2 * 2;

 
int z_button 0;
 
int c_button 0;

 
// byte nunchuck_buf[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 ((nunchuck_buf[5] >> 0) & 1)
   
z_button 1;
 if ((
nunchuck_buf[5] >> 1) & 1)
   
c_button 1;

 if ((
nunchuck_buf[5] >> 2) & 1)
   
accel_x_axis += 2;
 if ((
nunchuck_buf[5] >> 3) & 1)
   
accel_x_axis += 1;

 if ((
nunchuck_buf[5] >> 4) & 1)
   
accel_y_axis += 2;
 if ((
nunchuck_buf[5] >> 5) & 1)
   
accel_y_axis += 1;

 if ((
nunchuck_buf[5] >> 6) & 1)
   
accel_z_axis += 2;
 if ((
nunchuck_buf[5] >> 7) & 1)
   
accel_z_axis += 1;

 
Serial.print(i,DEC);
 
Serial.print("\t");

 
Serial.print("joy:");
 
Serial.print(joy_x_axis,DEC);
 
Serial.print(",");
 
Serial.print(joy_y_axisDEC);
 
Serial.print("  \t");

 
Serial.print("acc:");
 
Serial.print(accel_x_axisDEC);
 
Serial.print(",");
 
Serial.print(accel_y_axisDEC);
 
Serial.print(",");
 
Serial.print(accel_z_axisDEC);
 
Serial.print("\t");

 
Serial.print("but:");
 
Serial.print(z_buttonDEC);
 
Serial.print(",");
 
Serial.print(c_buttonDEC);

 
Serial.print("\r\n");  // newline
 
i++;
}

// Encode data to format that most wiimote drivers except
// only needed if you use one of the regular wiimote drivers
char nunchuk_decode_byte (char x)
{
 
= (0x17) + 0x17;
 return 
x;
}

// returns zbutton state: 1=pressed, 0=notpressed
int nunchuck_zbutton()
{
  return ((
nunchuck_buf[5] >> 0) & 1) ? 1;  // voodoo
}

// returns zbutton state: 1=pressed, 0=notpressed
int nunchuck_cbutton()
{
  return ((
nunchuck_buf[5] >> 1) & 1) ? 1;  // voodoo
}

// returns value of x-axis joystick
int nunchuck_joyx()
{
 return 
nunchuck_buf[0];
}

// returns value of y-axis joystick
int nunchuck_joyy()
{
 return 
nunchuck_buf[1];
}

// returns value of x-axis accelerometer
int nunchuck_accelx()
{
 return 
nunchuck_buf[2];   // FIXME: this leaves out 2-bits of the data
}

// returns value of y-axis accelerometer
int nunchuck_accely()
{
 return 
nunchuck_buf[3];   // FIXME: this leaves out 2-bits of the data
}

// returns value of z-axis accelerometer
int nunchuck_accelz()
{
 return 
nunchuck_buf[4];   // FIXME: this leaves out 2-bits of the data

[/code]

Und mein problem ist eigentlich das ich bei der Programmierung nicht so recht durchsehe und nur eigentlich mir aus Beispielen versuche das hinzubekommen.

Was ich bis jetzt alleine hinbekommen habe ist eine Lampe aus und an zuschalten.
JuHu.Bin nicht so der Programmierer aber ich benötige das füe ein Projekt und da der Nunchuk richtig gut in der Hand liegt war die meine wahl. Dachte es wäre auch einfacher. Mit ner SPS S7 komme ich recht gut zurecht. Aber C++ ist nicht so meine Welt.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.10.2015, 15:43
Beitrag #4
RE: Nunchuck+Ardurino
Hi,
das klingt so, als ob Du Dir da was aus dem Internet zusammenkopiert hast und gar nicht wirklich weißt, was Du da machst. Es fehlen halt die Grundlagen. Die kann Dir keiner so auf die Schnelle geben. Da solltest Du mal ganz klein anfangen.
Dein Programm zeigt ja schon, wie Du den Controller lesen kannst. An Deiner Stelle würde ich erstmal versuchen, etwas zu machen, was komplett auf Deinem Mist gewachsen ist. Versuch' doch erstmal die eingebaute LED (Pin 13) per Nunchuck ein- und auszuschalten.
Dann sehen wir weiter.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.10.2015, 17:08
Beitrag #5
RE: Nunchuck+Ardurino
PHP-Code:
#include <Nunchuk.h>
#include <Wire.h>
#define BAUDRATE 19200
int ledpin 13;             // LedPin wird hinzugefügt
Nunchuk nunchuk Nunchuk();
               
void setup()
{
  
Serial.begin(BAUDRATE);
  
nunchuk.init();
  
pinMode(ledpin,OUTPUT);        // LedPin wird Funtion hinzugefügt   
}

void loop()
{
  
nunchuk.update();
  
  if(
nunchuk.zButton==1){    // zButton 1 =  ledpin 1
  
digitalWrite(ledpin,1);
}
  if(
nunchuk.zButton==0){    // zButton 0 = ledpin 0
  
digitalWrite(ledpin,0);
}


So hat hingehauen ist für mich eine echte Umstellung auch mit den ganzen Klammern und so aber macht irgendwie auch spass an sowas zu basteln
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.10.2015, 17:25
Beitrag #6
RE: Nunchuck+Ardurino
Hi,
so, das ist ja schonmal was. Als nächstes versuch mal das:
Zitat:Analogstick links oder rechts jeweils ein digitaler ausgang ( Stromstoßschaltung)
Damit's einfach bleibt, mach mal nur links und mit nur einem Ausgang. Das kann wieder LED13 sein.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.10.2015, 12:50
Beitrag #7
RE: Nunchuck+Ardurino
Irgenwie funktioniert das nicht so wie es soll, hab erstma einfachhalber den zButton genommen ums auszutesten.
PHP-Code:
#include <Nunchuk.h>
#include <Wire.h>
#define BAUDRATE 19200
int ledpin 13;             // LedPin wird hinzugefügt
int merker 0;              // Merker wird hinzugefügt
Nunchuk nunchuk Nunchuk();
               
void setup()
{
  
Serial.begin(BAUDRATE);
  
nunchuk.init();
  
pinMode(ledpin,OUTPUT);        // LedPin wird Funtion hinzugefügt   
  
digitalWrite(nunchuk.zButtonHIGH);
}

void loop()
{
  
// Taste drücken bei dunkler LED
  
nunchuk.update();
  
  if(
digitalRead (nunchuk.zButton)==LOW && merker==0)
  {    
   
digitalWrite(nunchuk.zButton,HIGH);
   
merker=1;
   while(
digitalRead(nunchuk.zButton)==LOWdelay(10); //die Abarbeitung "Einfangen"
}

 
// Taste drücken bei heller LED
  
if (digitalRead(nunchuk.zButton)==LOW && merker==1)
{
  
digitalWrite(nunchuk.zButton,LOW);
  
merker=0;
  while(
digitalRead(nunchuk.zButton)==LOWdelay(10);     //die Abarbeitung "Einfangen"
}

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.10.2015, 13:22
Beitrag #8
RE: Nunchuck+Ardurino
Hi,
ich meinte eigentlich was anderes, aber ok, machen wir eben das.
Also erst einmal kann man digitalWrite nur auf Output-Pins machen. Für alles andere ist es Quatsch. Außerdem kommt die LED in Deinem Coding gar nicht vor.
Das mit dem "merker" ist wahrscheinlich eine richtige Idee. Was Du eigentlich willst ist folgendes:
1. Tue nur dann was, wenn der Zustand des Buttons 1 ist, aber vorher 0 war.
2. In dem Fall wird die LED invertiert.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Motoren anhand von Wii Nunchuck bedienen? Cyberxgirl 1 420 10.06.2015 08:20
Letzter Beitrag: Thorsten Pferdekämper
  HC-05 Ardurino Bluethooth werte übertragen RFID ChrisBeer222 0 655 10.04.2015 23:16
Letzter Beitrag: ChrisBeer222

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste