Go Down

Topic: Codice nunchuck servo (Read 868 times) previous topic - next topic

ninjo

Salve ragazzi, sono alle prese da poco con arduino e stavo provando a fare funzionare il nunchuck con i servo DF05BB, solo che quando collego l'alimentazione, eseguono si i movimenti del nunchuck, ma hanno delle microinterfenze e si muovono da soli come in preda ad attacchi epilettici. Visto che ho adottato questo codice preso da internet, e adattato in base ai miei collegamenti, mi potreste dire se ho fatto qualche errore?

ps: da notare che due funzioni nel codice le ho commentate pensando che non fossero utili, anche perchè le ho provate e non mi funzionavano mentre ora cosi va ma c'è quel problema sopra descritto


Code: [Select]
#include <Wire.h>
#include <string.h>
#include <stdio.h>
#include <Servo.h>
Servo myservo;
Servo myservo2;
uint8_t outbuf[6];

int cnt = 0;
int ledPin = 13;

int servoPin = 7;
int servoPin2 = 6;

int pulseWidth = 0;
int pulseWidth2 = 0;

long lastPulse = 0;
long lastPulse2 = 0;

int z_button = 0;
int c_button = 0;

int refreshTime = 20;

int minPulse = 1000;
int minPulse2 = 500;

int dtime=10;

#define pwbuffsize 10
long pwbuff[pwbuffsize];
long pwbuffpos = 0;
long pwbuff2[pwbuffsize];
long pwbuffpos2 = 0;

void setup()
{
  Serial.begin (9600);
  Wire.begin ();
  nunchuck_init ();
  pinMode(servoPin, OUTPUT);
  pinMode(servoPin2, OUTPUT);
  myservo.attach(A3);
  myservo2.attach(A2);
  pulseWidth = minPulse;
  pulseWidth2 = minPulse2;
  Serial.print ("Finished setup\n");
}

void nunchuck_init()
{
  Wire.beginTransmission (0x52);
  Wire.write (0x40);
  Wire.write (0x00); 
  Wire.endTransmission ();
}

void send_zero()
{
  Wire.beginTransmission (0x52);
  Wire.write (0x00);
  Wire.endTransmission ();
}

int t = 0;

void loop()
{
  t++;
  long last = millis();

  if( t == 1) {

    t = 0;

    Wire.requestFrom (0x52, 6);

    while (Wire.available ()) {
      outbuf[cnt] = nunchuk_decode_byte (Wire.read ());
      digitalWrite (ledPin, HIGH);
      cnt++;
    }

    if (cnt >= 5) {

      printNunchuckData();

      int z_button = 0;
      int c_button = 0;

      if ((outbuf[5] >> 0) & 1)
        z_button = 1;
      if ((outbuf[5] >> 1) & 1)
        c_button = 1;

      switch (c_button) {
      case 1:
        switch (z_button) {
        case 0:
          break;
        case 1:
         // muovi();
          break;
        }
        break;
      case 0:
        switch (z_button) {
        case 0:
          delay(10000);
          break;
        case 1:
          delay(3000);
          break;
        }
        break;
      }
    }

    cnt = 0;
    send_zero();

  } // if(t==)

// updateServo();
  myservo.write(outbuf[1]);
  myservo2.write(outbuf[0]);
  //printNunchuckData();
  //delay(dtime);
}


/*void updateServo() {

  if (millis() - lastPulse >= refreshTime) {

    digitalWrite(servoPin, HIGH);
    delayMicroseconds(pulseWidth);
    digitalWrite(servoPin, LOW);

    digitalWrite(servoPin2, HIGH);
    delayMicroseconds(pulseWidth2);
    digitalWrite(servoPin2, LOW);

    lastPulse = millis();
  }
}*/

int i=0;
void printNunchuckData()
{
  int joy_x_axis = outbuf[0];
  int joy_y_axis = outbuf[1];
  int accel_x_axis = outbuf[2]; // * 2 * 2;
  int accel_y_axis = outbuf[3]; // * 2 * 2;
  int accel_z_axis = outbuf[4]; // * 2 * 2;

  int z_button = 0;
  int c_button = 0;

  if ((outbuf[5] >> 0) & 1)
    z_button = 1;
  if ((outbuf[5] >> 1) & 1)
    c_button = 1;
  if ((outbuf[5] >> 2) & 1)
    accel_x_axis += 2;
  if ((outbuf[5] >> 3) & 1)
    accel_x_axis += 1;

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

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

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

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

  Serial.print ("Y: ");
  Serial.print (joy_y_axis, DEC);
  Serial.print ("\t");

  Serial.print ("AccX: ");
  Serial.print (accel_x_axis, DEC);
  Serial.print ("\t");

  Serial.print ("AccY: ");
  Serial.print (accel_y_axis, DEC);
  Serial.print ("\t");

  Serial.print ("AccZ: ");
  Serial.print (accel_z_axis, DEC);
  Serial.print ("\t");

  Serial.print (z_button, DEC);
  Serial.print (" ");
  Serial.print (c_button, DEC);
  Serial.print ("\r\n");
  i++;
}

char nunchuk_decode_byte (char x)
{
  x = (x ^ 0x17) + 0x17;
  return x;
}
/*
void muovi (){
  float tilt = (700 - outbuf[3]*2*2);
  float tilt2 = outbuf[2]*2*2;

  tilt = (tilt);
  pulseWidth = (tilt * 5) + minPulse;

  tilt2 = (tilt2-288);
  pulseWidth2 = (tilt2 * 5) + minPulse2;

  pwbuff[pwbuffpos] = pulseWidth;
  pwbuff2[pwbuffpos2] = pulseWidth2;

  if( ++pwbuffpos == pwbuffsize ) pwbuffpos = 0;
  if( ++pwbuffpos2 == pwbuffsize ) pwbuffpos2 = 0;


  pulseWidth=0;
  pulseWidth2=0;

  for( int p=0; p<pwbuffsize; p++ ){
    pulseWidth += pwbuff[p];
    pulseWidth2 += pwbuff2[p];
  }

  pulseWidth /= pwbuffsize;
  pulseWidth2 /= pwbuffsize;

}*/

cyberhs

Potrebbe essere un problema di alimentazione (insufficiente).

I servo vengono alimentati con i 5V di Arduino? Se è così ti conviene alimentarli in modo indipendente.

ninjo

Si li alimento a 5v. Infatti ho notato che collegando un servo è tutto ok, ma quando collego anche l'altro cominciano i problemi. Scusa che intendi per alimentarli in modo indipendente?

nid69ita

Intende che devi collegare i servo a delle batterie o a un alimentatore esterno, NON ad Arduino.
my name is IGOR, not AIGOR

ninjo

Devo comprare una shield apposita per i servo? E se ne volessi collegare 5, 6?

cyberhs

Con la libreria Servo puoi scegliere qualsiasi pin di Arduino.

Non è necessaria nessuna shield, hai solo bisogno di un alimentatore da 5V 1A (meglio 2A) che alimenti i Servo.

Collega tra loro le masse di Arduino e del nuovo alimentatore, mentre il positivo lo colleghi ai due servo.

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy