Oppure

Loading
18/06/13 20:19
pocho183
Non so se è il posto giusto per discutere di arduino.
Sto facendo un programma che riesca a far girare un servomotore, in modalità automatica che controlla la luce tramite due sensori e in modalità manuale che inviando i gradi da tastiera permette la rotazione del servo.
Non me ne intendo molto, volevo postare il codice per vedere se c'era qualcuno che poteva aiutarmi a farlo funzionare.
N.B il codice è copiato su vari progetti trovati in rete.

lanciando il programma ottengo questo errore:
In function 'void commandParser()':
error: too few arguments to function 'void callback_activateAutomaticMode(char*)'
error: at this point in file

mi indica su questa riga:
void callback_activateAutomaticMode(char *a)

 #define MAX_COMMANDS 10
#define BUFFER_SIZE 8
#define COMMAND_CODE_LEN 2
#define COMMAND_ARGUMENT_LEN 4
#include <Servo.h>

Servo myservo;

char header='#';
char footer='$';
char commandBuffer[BUFFER_SIZE];
bool hasToParse=false;
int pointer=0;

int sensorPin = A0;
int servoPin  = 9;
 
int sensorValue = 0;
int servoGrad = 90;
int tolleranza = 40;

//STRUTTURE E TYPEDEF
typedef void (*serialFunction)(char *argument); //definisco per comodità un typedef per un puntatore a funzione
typedef struct serialCommand{
	char commandCode[COMMAND_CODE_LEN];
	char commandArgument[COMMAND_ARGUMENT_LEN];
	serialFunction callback;
};


void setup() {
  pinMode( sensorPin, INPUT);
  myservo.attach( servoPin );
  myservo.write( servoGrad );
  Serial.begin(9600);
  Serial.println("\n-----------------MENU------------------\n");
  Serial.println(" Inserire un comando #XXYYYY$ ");
  Serial.println(" #000000$  attiva modalita\' automatica");
  Serial.println(" #010000$  attiva modalita\' manuale");
  Serial.println(" #010030$  muoviti in senso orario di 30 gradi");
  Serial.println(" #020030$  muoviti in senso antiorario di 30 gradi ");
  
  serialCommand activateAutomaticMode;
  strcpy(activateAutomaticMode.commandCode, "00");
  strcpy(activateAutomaticMode.commandArgument,"0000");
  activateAutomaticMode.callback,callback_activateAutomaticMode;

  serialCommand activateManualMode;
  strcpy(activateManualMode.commandCode,"01");
  strcpy(activateManualMode.commandArgument,"0000");
  activateManualMode.callback,callback_activateManualMode;
  
}


//ESEMPIO DI COMANDI
//---------------------------------------------------
void callback_activateAutomaticMode(char *a)
{
  funzioneAutomatica;

}

void callback_activateManualMode(char *a)
{
	//do something

}

//---------------------------------------------------


void serialHandler(){
//legge dalla seriale scrivendo nel commandBuffer, se arriva un sequenza di byte che rispetta il protocollo deciso allora setta hasToParse=1
  if( Serial.available()>0 ) {
    while(pointer<7) {
    commandBuffer[pointer]= Serial.read();
    pointer++;
    }
    if ( commandBuffer[0]=='#' ) {
      if ( commandBuffer[7]=='$' ) {
        hasToParse=true;
      }
    }
  }
}

void commandParser(){
//verifica se esiste un comando con lo stesso commandCode dei primi due byte ricevuti.
  if (( commandBuffer[1]=='0') &&( commandBuffer[2]=='0') ) {
    callback_activateAutomaticMode();
  }
  if (( commandBuffer[1]=='0') &&( commandBuffer[2]=='1')) {
    callback_activateManualMode();
  }

}


void loop(){

	serialHandler();
	if(hasToParse) commandParser();

}

void funzioneAutomatica() {
  while(1) {
  sensorValue = analogRead(sensorPin);
  if ( sensorValue < (512-tolleranza) )
  {
    if (servoGrad < 180) servoGrad=servoGrad+2;
  }
 
  if ( sensorValue > (512+tolleranza) )
  {
    if (servoGrad > 0) servoGrad=servoGrad-2;
  }
 
  myservo.write( servoGrad ); 
 
  delay(100);
  }

}
 
 
aaa
19/06/13 8:47
"N.B il codice è copiato su vari progetti trovati in rete. " apprezzo l' onestà ma questo significherebbe che io devo studiare e capire ciò che tu non hai voglia, o probabilmente le basi teoriche per capire........ Mi dispiace ma io sono uno che ha sempre disprezzato questo modo di fare un pò...... casuale......... con arduino & co. quindi sicuramente non otterrai il mio aiuto. Metti che se studi la teoria dietro a quello che vuoi fare e riscrivi quel codice io sono anche disposto a darti una mano, ma correggere codice copiato qui e li proprio non ci tengo. In ogni caso il problema non è sulla riga void callback_activateAutomaticMode(char *a), ma su quella sotto. Per le chiamate a funzione servono () anche se non hanno parametri, spero per te che questo sia l' unico problema.......