chi mi aiuta a capire una cosa con servi e nunchuck??

Salve, sto provando questo sketch per muovere 2 servi tramite gli accelerometri del nunchuck, ma vorrei modificarne il senso di rotazione e magari anche la corsa… mi aiutate a comprendere quali sono le stringhe di questi parametri??

#include <Wire.h>
#include <string.h>
#include <stdio.h>

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 (19200);
    Wire.begin ();
    nunchuck_init ();
    pinMode(servoPin, OUTPUT);
    pinMode(servoPin2, OUTPUT);

    pulseWidth = minPulse;
    pulseWidth2 = minPulse2;
    Serial.print ("Finished setup\n");
}

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

void send_zero()
{
    Wire.beginTransmission (0x52);
    Wire.send (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.receive ());
            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();

    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;

}

se ho capito cosa intendi con corsa e rotazione basta solo usare una funzione map ;) http://arduino.cc/en/Reference/Map

comunque queste sono le righe:

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

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

in pratica va a scrivere direttamente in questa maniera il segnale.. mah mi pare un metodo poco efficiente per 2 motivi: 1. si può usare la libreria servo inclusa nell'IDE di arduino che usando i timer interni non va a bloccare il programma 2. si potrebbe usare direttamente un digitalWrite() in pwm perchè con ampiezza di 5V i segnali PPM (quello da dare ai servi) e PWM che esce da arduino così "di fabbrica" si equivalgono

usare digitalWrite e delayMocroseconds non è preciso quanto usare i timer o il pwm interno e inoltre blocca il programma durante la modifica..

i valori comunque vengono impostati nella funzione muovi()

questo sistema non assicura la creazione di un buon PPM a causa dei tempi in gioco. Usa la libreria Servo, c'è anche negli esempi ufficiali.

ok, proverò con la libreria servo, ma intanto, in questo sketch sapreste dirmi come invertire il senso di rotazione dei servi!? Mi spiego... adesso muovendo il nunchuck in senso orario il servo mi ruota in senso antiorario, vorrei cambiare questo senso

Non riesco a interpretare bene il codice...

con la seriale guardi il valore massimo e minimo che manda il nunchuk (es. tutto a sinistra =30 tutto a destra =180) fai la media e ti calcoli il valore medio8che è uguale al valore medio del servo, quini sai valore medio, massimo e minimo.

poi in teroia dalla funzione in cui legge il valore del nuncku fai in modo che "sputi " fuori il valore opposto: se legge 180 returna 30..

inlinea torica dovrebbe essere pensandoci velocemente (valore_max+valore_min-valore) cosa che secondo me puoi fare qua:

int joy_x_axis = outbuf[0];
    int joy_y_axis = outbuf[1];
    int accel_x_axis = outbuf[2];  
    int accel_y_axis = outbuf[3]; 
    int accel_z_axis = outbuf[4];

trasformandolo così

int joy_x_axis = outbuf[0];
    int joy_y_axis = outbuf[1];
    int accel_x_axis = outbuf[2]*(valore_max+valore_min-valore);  
    int accel_y_axis = outbuf[3]*(valore_max+valore_min-valore); 
    int accel_z_axis = outbuf[4]*(valore_max+valore_min-valore);

poi boh può essere una castronata

oppure in una maniera più semplice sai che il segnale pwm oscilla tra 500us e 2500us quindi per ogni valore

delayMicroseconds(map(pulseWidth, 0, 2500, 2500, 0));

così hai invertito il tempo ;)

però usa la libreria servo realmente e ricorda che accetta i valori in gradi (quindi da 0 a 180) quindi il codice sarebbe invece di

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

diventa

Servo.write(map(pulseWidth, 0, 2500, 180, 0));

così non fai altre modifiche...