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)
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