info sul void

Buongiorno a tutti,

per chiarirmi le idee, seguite il mio ragionamento e ditemi dove sbaglio.

il comando void con un suffisso setup identifica istruzioni necessarie a settare le porte e varie ed eventuali.

quando è seguito da loop indica che tutto quello che sta dentro le parentesi graffe viene ripetuto qualche milione di volte al sec all’infinito.
Questo è quanto ho letto nelle varie istruzione e libri che ho consultato.

Caricando un programmino chiamato "move_servo_simple (che allego) per capire come muovere dei servi, mi ritrovo un prog dove c’è un “void servoPulse” che praticamente impacchetta una serie di passi di programma che danno un parametro relativo alll’impulso che poi verrà trasmesso attraverso un pig digitale al servo mediante un passo di programma "for…).

tutto questo al di fuori del void loop di esecuzione.

avevo immaginato che appunto in questo caso il void servoPulse fosse un contenitore che identificasse il parametro in esso contenuto e che poi questo parametro potesse essere usato all’interno di qualsiasi altro void loop.

sto provando a generare un programma che “vorrebbe” pilotare un servo attraverso un piccolo joystick analogico che andrebbe a variare il “Myangle” nel for.
Per far questo ho provato ad inserire il pacchetto che muove il servo ma mi da errori sintattici assortiti che non riesco a togliere.

quindi sono giunto alla conclusione che sicuramente non ho ben chiare alcune cose.

sono nelle vostre mani

ciao a tutti

int servoPin = 7;
int myAngle;
int pulseWidth;



void servoPulse (int servoPin, int myAngle) 
{
  pulseWidth = (myAngle*10)+600; 
  digitalWrite (servoPin, HIGH);
  delayMicroseconds(pulseWidth);
  digitalWrite(servoPin, LOW);
 

             
}

void setup() {
  pinMode(servoPin, OUTPUT);
}

void loop() 
{
  {delay(1000);}  //weit for start
  for (myAngle=0; myAngle <= 160; myAngle++) 
   {
    servoPulse ( servoPin, myAngle);
    delay (10);   // rotation speed
}
{delay(1000);}  //weit for start
for (myAngle=160; myAngle>=0; myAngle--)
   {
    servoPulse ( servoPin, myAngle);
   delay(10);
 }

}

il void identifica delle procedure (come il setup o come il loop) che non devono restituire nulla.

se ad esempio vuoi che che arduino faccia la somma di due numeri e la comunichi via serial invece di fare tutto nel loop

void loop(){
int a=0;
int b=1;

Serial.println(a+b);
}

potresti pensare di demandare ad una sottoprocedura la somma dei due numeri. In quel caso quella procedura dovrà restituire un numero (intero in questo caso) quindi non potrà avere il void d'avanti ma un int perchè appunto deve restituire un intero:

void loop{
int a=0;
int b=1;

Serial.println(somma(a,b));
}


int somma (int n, int m){
return(n+m);
}

Questa è la base della programmazione che fa ricorso alla procedure. Se hai dubbi chiedi oppure leggiti un manuale base di C o di programmazione in generale.

grazie Uccio,

come prima cosa mi sono scaricato un libro sulla programmazione C sul sito http://www.tutorialpc.it/lingcmenu.asp. seguendo il tuo consiglio. spero che si tratti del linguaggio giusto.

Parla di linguaggio per MS DOS ma mi sembra che sia lo stesso, tra l'altro, mi appare dalle prime pagine alquanto ostico ma vedremo. Certo se togliamo il piacere di giocare con arduino la programmazione pura non mi affascina. :-X

La tua spiegazione è stata chiara il void identifica una procedura, cioè esegue una certa sequenza di eventi. Nel caso del setup assegna, nel loop fa leggere in sequenza le istruzioni all'infinito , ma con l'istruzione "void servoPulse"?? Cosa fa? Allora se ho capito bene ci deve essere un elenco di istruzioni possibili oltre setup e loop?

ciao e grazie delle dritte.

non esiste nessuna lista di procedure.
quelle che non possono mancare quando si programma arduino sono il setup e il loop. Parlando di programmazione generica invece non puo’ mancare il main (nel caso lo trovassi nel manuale).

Tutte le altre procedure le puoi scrivere tu!! Lo schema generale è questo:

nomeProcedura(parametro1, parametro2, … , parametroN) {

/corpo del programma/

}

dove è il tipo di dato che viene restituito alla fine della esecuzione. Puo’ essere un int, un char… qualsiasi cosa. Quindi nel corpo del programma ci sarà una riga return(var) dove var è una varibile dello stesso tipo di

Caso particolare: se scrivi una procedura che non deve restituire nulla allora il sarà void. E in questo caso non sarà necessaria neanche l’istruzione return nel corpo del programma.

Una volta creata la procedura, la richiami da qualsiasi altro punto del programma (dal loop, dal setup o da un’altra procedura) stando attento a passare i parametri giusti.

Spero di essere stato chiaro!
Divertiti! :slight_smile: e se hai domande fai pure!