Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Arduino
Forum - C/C++ - Arduino

Avatar
pocho183 (Normal User)
Rookie


Messaggi: 30
Iscritto: 22/02/2013

Segnala al moderatore
Postato alle 22:19
Martedì, 18/06/2013
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)

Codice sorgente - presumibilmente C++

  1. #define MAX_COMMANDS 10
  2. #define BUFFER_SIZE 8
  3. #define COMMAND_CODE_LEN 2
  4. #define COMMAND_ARGUMENT_LEN 4
  5. #include <Servo.h>
  6.  
  7. Servo myservo;
  8.  
  9. char header='#';
  10. char footer='$';
  11. char commandBuffer[BUFFER_SIZE];
  12. bool hasToParse=false;
  13. int pointer=0;
  14.  
  15. int sensorPin = A0;
  16. int servoPin  = 9;
  17.  
  18. int sensorValue = 0;
  19. int servoGrad = 90;
  20. int tolleranza = 40;
  21.  
  22. //STRUTTURE E TYPEDEF
  23. typedef void (*serialFunction)(char *argument); //definisco per comodità un typedef per un puntatore a funzione
  24. typedef struct serialCommand{
  25.         char commandCode[COMMAND_CODE_LEN];
  26.         char commandArgument[COMMAND_ARGUMENT_LEN];
  27.         serialFunction callback;
  28. };
  29.  
  30.  
  31. void setup() {
  32.   pinMode( sensorPin, INPUT);
  33.   myservo.attach( servoPin );
  34.   myservo.write( servoGrad );
  35.   Serial.begin(9600);
  36.   Serial.println("\n-----------------MENU------------------\n");
  37.   Serial.println(" Inserire un comando #XXYYYY$ ");
  38.   Serial.println(" #000000$  attiva modalita\' automatica");
  39.   Serial.println(" #010000$  attiva modalita\' manuale");
  40.   Serial.println(" #010030$  muoviti in senso orario di 30 gradi");
  41.   Serial.println(" #020030$  muoviti in senso antiorario di 30 gradi ");
  42.  
  43.   serialCommand activateAutomaticMode;
  44.   strcpy(activateAutomaticMode.commandCode, "00");
  45.   strcpy(activateAutomaticMode.commandArgument,"0000");
  46.   activateAutomaticMode.callback,callback_activateAutomaticMode;
  47.  
  48.   serialCommand activateManualMode;
  49.   strcpy(activateManualMode.commandCode,"01");
  50.   strcpy(activateManualMode.commandArgument,"0000");
  51.   activateManualMode.callback,callback_activateManualMode;
  52.  
  53. }
  54.  
  55.  
  56. //ESEMPIO DI COMANDI
  57. //---------------------------------------------------
  58. void callback_activateAutomaticMode(char *a)
  59. {
  60.   funzioneAutomatica;
  61.  
  62. }
  63.  
  64. void callback_activateManualMode(char *a)
  65. {
  66.         //do something
  67.  
  68. }
  69.  
  70. //---------------------------------------------------
  71.  
  72.  
  73. void serialHandler(){
  74. //legge dalla seriale scrivendo nel commandBuffer, se arriva un sequenza di byte che rispetta il protocollo deciso allora setta hasToParse=1
  75.   if( Serial.available()>0 ) {
  76.     while(pointer<7) {
  77.     commandBuffer[pointer]= Serial.read();
  78.     pointer++;
  79.     }
  80.     if ( commandBuffer[0]=='#' ) {
  81.       if ( commandBuffer[7]=='$' ) {
  82.         hasToParse=true;
  83.       }
  84.     }
  85.   }
  86. }
  87.  
  88. void commandParser(){
  89. //verifica se esiste un comando con lo stesso commandCode dei primi due byte ricevuti.
  90.   if (( commandBuffer[1]=='0') &&( commandBuffer[2]=='0') ) {
  91.     callback_activateAutomaticMode();
  92.   }
  93.   if (( commandBuffer[1]=='0') &&( commandBuffer[2]=='1')) {
  94.     callback_activateManualMode();
  95.   }
  96.  
  97. }
  98.  
  99.  
  100. void loop(){
  101.  
  102.         serialHandler();
  103.         if(hasToParse) commandParser();
  104.  
  105. }
  106.  
  107. void funzioneAutomatica() {
  108.   while(1) {
  109.   sensorValue = analogRead(sensorPin);
  110.   if ( sensorValue < (512-tolleranza) )
  111.   {
  112.     if (servoGrad < 180) servoGrad=servoGrad+2;
  113.   }
  114.  
  115.   if ( sensorValue > (512+tolleranza) )
  116.   {
  117.     if (servoGrad > 0) servoGrad=servoGrad-2;
  118.   }
  119.  
  120.   myservo.write( servoGrad );
  121.  
  122.   delay(100);
  123.   }
  124.  
  125. }


PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 10:47
Mercoledì, 19/06/2013
"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.......

PM Quote