Go Down

Topic: funzione for (Read 1 time) previous topic - next topic

teoxmega

May 18, 2014, 10:20 pm Last Edit: May 18, 2014, 11:10 pm by teoxmega Reason: 1
ciao, sto realizzando un braccio robotico composto da servomotori...
ho visto che si può utilizzare la funzione "for" per comandarli.
avrei l' intento di far muovere tutti i motori nello stesso momento, ma quando compilo lo sketch mi dice che il programma si aspetta un ; prima di una parentesi
Code: [Select]

(programma_finale:92: error: expected primary-expression before 'for'
programma_finale:92: error: expected `)' before 'for'
programma_finale:92: error: expected primary-expression before ')' token
programma_finale:92: error: expected `;' before ')' token
programma_finale:93: error: expected primary-expression before ')' token
programma_finale:93: error: expected `;' before ')' token
programma_finale:94: error: expected primary-expression before ')' token
programma_finale:94: error: expected `;' before ')' token
programma_finale:95: error: expected primary-expression before ')' token
programma_finale:95: error: expected `;' before ')' token
programma_finale:108: error: expected primary-expression before 'for'
programma_finale:108: error: expected `)' before 'for'
programma_finale:108: error: expected primary-expression before ')' token
programma_finale:108: error: expected `;' before ')' token
programma_finale:109: error: expected primary-expression before ')' token
programma_finale:109: error: expected `;' before ')' token
programma_finale:110: error: expected primary-expression before ')' token
programma_finale:110: error: expected `;' before ')' token
programma_finale:111: error: expected primary-expression before ')' token
programma_finale:111: error: expected `;' before ')' token

QUI AGGIUNGO IL PROGRAMMA
Code: [Select]

#include <Servo.h> //MANCA DA FARE L IMPOSTAZIONE
Servo myservo3;
Servo myservo5;
Servo myservo6;
Servo myservo9;
int VALPOS;
int POSIZIONEPINZA=A0;
int PotPin=A0;
int Pot3=A1;
int Pot5=A2;
int Pot6=A3;
int Pot9=A4;
int P1=7;
int P2=8;
int VAL;
int VAL2;
int VAL3;
int VAL4;
int VAL5;
int PINZACHIUSURA=2;
int PINZAAPERTURA=0;
int SELETTORE=4;
void setup() {
myservo3.attach(3);
myservo5.attach(5);
myservo6.attach(6);
myservo9.attach(9);  
pinMode (P1,INPUT);
pinMode (P2,INPUT);
pinMode (PINZACHIUSURA,OUTPUT);
pinMode (PINZAAPERTURA,OUTPUT);
pinMode (SELETTORE,INPUT);
}
void loop(){
    if(digitalRead(SELETTORE)==HIGH){
       VAL2=analogRead(Pot3);
       VAL2=map(VAL2,0,1023,0,180);
       myservo3.write(VAL2);
 
       VAL3=analogRead(Pot5);
       VAL3=map(VAL3,0,1023,0,90);
       myservo5.write(VAL3);
 
       VAL4=analogRead(Pot6);
       VAL4=map(VAL4,0,1023,50,150);
       myservo6.write(VAL4);
 
       VAL5=analogRead(Pot9);
       VAL5=map(VAL5,0,1023,0,180);
       myservo9.write(VAL5);
       
       if(digitalRead(P1)==HIGH){
          digitalWrite(PINZACHIUSURA,HIGH);
          digitalWrite(PINZAAPERTURA,LOW);
          if(analogRead(PotPin)<850){
             digitalWrite(PINZAAPERTURA,LOW);
             digitalWrite(PINZACHIUSURA,LOW);
          }
       }
       if(digitalRead(P2)==HIGH){
          digitalWrite(PINZAAPERTURA,HIGH);
          digitalWrite(PINZACHIUSURA,LOW);
          if(analogRead(PotPin)>1000){
             digitalWrite(PINZAAPERTURA,LOW);
             digitalWrite(PINZACHIUSURA,LOW);
          }
       }
       if((digitalRead(P2)==LOW)&&(digitalRead(P1)==LOW)){
           digitalWrite(PINZAAPERTURA,LOW);
           digitalWrite(PINZACHIUSURA,LOW);
       }
       if((digitalRead(P2)==HIGH)&&(digitalRead(P1)==HIGH)){
           digitalWrite(PINZAAPERTURA,LOW);
           digitalWrite(PINZACHIUSURA,LOW);
       }
    }
    if(digitalRead(SELETTORE)==LOW){
      VALPOS=0;
          digitalWrite(PINZACHIUSURA,LOW);
          digitalWrite(PINZAAPERTURA,HIGH);
          delay(150);
          digitalWrite(PINZACHIUSURA,LOW);
          digitalWrite(PINZAAPERTURA,LOW);
         
       (for(VAL = 90; VAL < 180; VAL += 1)) &&
       (for(VAL2 = 0; VAL2<=45; VAL2+=1)) &&    
       (for(VAL3 = 90; VAL3<=135; VAL3+=1)) &&    
       (for(VAL4 = 50; VAL4 <=140; VAL4+=1)){                                  
            myservo9.write(VAL);
            myservo5.write(VAL2);  
            myservo3.write(VAL3);  
            myservo6.write(VAL4);        
            delay(15);                      
       }
       digitalWrite(PINZACHIUSURA,HIGH);
       digitalWrite(PINZAAPERTURA,LOW);
       delay(150);
       digitalWrite(PINZACHIUSURA,LOW);
       digitalWrite(PINZAAPERTURA,LOW);
       
       (for(VAL4 = 140; VAL4 >=80; VAL4-=1)) &&    
       (for(VAL2 = 45; VAL2>=0; VAL2-=1))&&    
       (for(VAL3 = 135; VAL3>=90; VAL3-=1)) &&    
       (for(VAL = 180; VAL >= 90; VAL -= 1)){                                
            myservo6.write(VAL4);
            myservo5.write(VAL2);
            myservo3.write(VAL3);
            myservo9.write(VAL);
            delay(15);                      
       }        
         for(VAL4 = 80; VAL4 <=125; VAL4+=1){                                
             myservo6.write(VAL4);
             delay(15);
       }
          digitalWrite(PINZACHIUSURA,LOW);
          digitalWrite(PINZAAPERTURA,HIGH);
          delay(150);
          digitalWrite(PINZACHIUSURA,LOW);
          digitalWrite(PINZAAPERTURA,LOW);
          for(VAL4 = 125; VAL4 >=50; VAL4-=1){                                
              myservo6.write(VAL4);
              delay(15);
       }
     
    }
}  

potreste dirmi dove sbaglio? come posso aggiustare il mio programma per far in modo che i motori si muovano tutti nello stesso momento?

nid69ita

#1
May 18, 2014, 10:59 pm Last Edit: May 18, 2014, 11:16 pm by nid69ita Reason: 1
Ti invitiamo a presentarti qui: http://forum.arduino.cc/index.php?topic=113640.0
e a leggere il regolamento: http://forum.arduino.cc/index.php?topic=149082.0
- qui una serie di schede by xxxPighi per i collegamenti elettronici vari: http://forum.arduino.cc/index.php?topic=146152.0
- qui le pinout delle varie schede by xxxPighi: http://forum.arduino.cc/index.php?topic=151646.0
- qui una serie di link utili: http://forum.arduino.cc/index.php?topic=126861.0

Il codice devi postarlo racchiuso nei tag code (vedi sezione 7 del regolamento) altrimenti è facile che parte del codice venga visualizzato non completo.
Inoltre per il codice, usa il tasto CTRL+T dentro l'IDE, te lo ordina un pò meglio (lo rende più leggibile)
my name is IGOR, not AIGOR

nid69ita

#2
May 18, 2014, 11:03 pm Last Edit: May 18, 2014, 11:17 pm by nid69ita Reason: 1
Assolutamente NON puoi scrivere questo codice:
Code: [Select]
(for(VAL = 90; VAL < 180; VAL += 1)) &&
       (for(VAL2 = 0; VAL2<=45; VAL2+=1)) &&    
       (for(VAL3 = 90; VAL3<=135; VAL3+=1)) &&    
       (for(VAL4 = 50; VAL4 <=140; VAL4+=1)){                                  
            myservo9.write(VAL);
            myservo5.write(VAL2);  
            myservo3.write(VAL3);  
            myservo6.write(VAL4);        
            delay(15);                      
       }


Forse dovresti leggere prima un manuale sul C.
Vai su google e cerca   "programmare arduino Tiziana Marsella", trovi un buon pdf free in italiano.

Poi ha aperto un thread qui
http://forum.arduino.cc/index.php?topic=236046.msg1697457#msg1697457
sulla millis(). E non hai più postato su quel problema. Hai risolto ???
my name is IGOR, not AIGOR

pablos71


Poi ha aperto un thread sulla millis(). E non hai più postato su quel problema. Hai risolto ???

+1
bravo nid vai vai!!!  :D :D :D
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

teoxmega


Poi ha aperto un thread qui
http://forum.arduino.cc/index.php?topic=236046.msg1697457#msg1697457
sulla millis(). E non hai più postato su quel problema. Hai risolto ???



Ciao nid69ita, mi scuso per il mio modo di fare...
provvederò al più presto a modificare completamente il post in modo da adattarlo agli standard del forum....
capiscimi; è tutta la sera che cerco di compilare questo programma, ed ancora non ho risultati... so che quello è il modo piu sbagliato di tutti,
ma ho provato le cose più incredibili pur di far muovere questo braccio... non riesco a capire come posso fare con un solo for ad eseguire tutte le istruzioni...
ho pensato solo ora ad una soluzione al quanto "corretta" che però non porta comunque al risultato sperato
Code: [Select]
        for(VAL = 90; VAL < 180; VAL += 1){
            delay(15);
            for(VAL2 = 0; VAL2<=45; VAL2+=1){
                delay(15);
                for(VAL3 = 90; VAL3<=135; VAL3+=1)
                    delay(15);{   
                    for(VAL4 = 50; VAL4 <=140; VAL4+=1){ 
                        myservo9.write(VAL); 
                        myservo5.write(VAL2);
                        myservo3.write(VAL3);
                        myservo6.write(VAL4);
                        delay(15);                       
                        }
                    } 
                } 
        }     

in teoria dovrebbe fare quello che voglio....
riguardo al millis si, ho risolto ma ho avuto modo di tornare al pc con internet solo questa sera, provvedo anche a quella, mi scuso ancora

pablos71

#5
May 19, 2014, 12:04 am Last Edit: May 19, 2014, 12:50 am by pablos Reason: 1
i for messi in questo modo annidato non vanno bene
considera che il primo for ripete tutti i for che si trovano all'interno 90 volte, il secondo for fa 45 volte quello che è dentro alle sue graffe e così via, in questo modo resti dentro al for per 16.402.500 cicli loop  :smiley-eek-blue:
[OT] praticamente hai un ciclo eterno come le donne :)

o ti fai 4 for separati e ne muovi uno alla volta o se vuoi muovere tutti i servo contemporaneamente (cosa che non può essere fatta da un micro ma che può sembrare) è azionarli velocemente un po' uno e un po' l'altro (ciclicamente) è costruirti nel loop() o in un altra function() dei contatori che non sono dei veri e propri for, ma contano i cicli del main loop, i motori vengono mossi tutti e 4 in modo sequenziale

i conteggi da fare sui motori sono rispettivamente di
il primo di 90
il secondo di 45
il terzo di 45
il quarto di 90

per poi bloccarli con dei controlli IF, però si fermeranno prima il secondo e il terzo mentre il primo e il quarto continueranno essendo maggiore la quantità di movimento (è invitabile), a meno che non dimezzi i tempi di movimento del primo e del quarto (conti ogni 2 cicli loop) se proprio vuoi vederli muovere tutti insieme.

Non so se mi sono capito :)



L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

teoxmega

capisco... credo che a questo punto mi rassegnerò e farò muovere un braccio alla volta... grazie mille

tapirinho

guarda che applicare il consiglio di paolos non è cosa impossibile:
Code: [Select]
for(VAL = 90; VAL < 180; VAL += 1)
{
                       myservo9.write(VAL); 
                       if (VAL<=45)
                              myservo5.write(VAL);
                       if (VAL<=135)
                              myservo3.write(VAL);
                       if (VAL<=140)
                              myservo6.write(VAL);
                        delay(15);                       
                        }
                    } 
                } 
        }     

In questo modo i servo si muoveranno "contemporaneamente" finchè il servo5 non avrà finito. Poi continueranno gli altri 3 finchè servo3 non si fermerà e così via...
(se non ho capito male   :smiley-roll-sweat: )

teoxmega

non è comunque la stessa cosa che avevo in mente, poi per come ho costruito il braccio, un servo andrebbe da tutt' altra parte

pablos71

#9
May 23, 2014, 10:01 pm Last Edit: May 23, 2014, 10:03 pm by pablos Reason: 1
Quote
poi per come ho costruito il braccio, un servo andrebbe da tutt' altra parte

se sono 4 controlli separati il braccio va dove vuoi tu, non è che prende vita propria :)

Bhe, non ti resta che spiegarci cosa avevi in mente se hai voglia.
Fai conto che siamo dei bambini di 3a elementare e spiegaci bene.
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

paulus1969

#10
May 24, 2014, 10:40 am Last Edit: May 24, 2014, 10:42 am by paulus1969 Reason: 1
Puoi fare così, se ho capito bene quello che vorresti ottenere.
Ammettiamo di avere quattro motori.
Costruisci una funzione alla quale passi otto parametri:
motore1 angolo iniziale, motore1 angolo finale, motore2 angolo iniziale, motore2 angolo finale
motore3 angolo iniziale, motore3 angolo finale, motore4 angolo iniziale, motore4 angolo finale
se un motore deve rimanere fermo, basta fare coincidere angolo iniziale ed angolo finale
per ogni motore, dividi in 20 parti (o anche di più o di meno, fai tu, o lo passi come altro parametro) l'intervallo angolo finale - angolo iniziale e metti i risultati in quattro vettori
Fai partire un ciclo for composto da 20 iterazioni (se hai diviso in 20 parti gli angoli)
per ogni iterazione sposta ogni motore nella posizione i-esima del suo vettore posizioni prima calcolato
Avrai un movimento apparentemente simultaneo dei motori che partiranno e termineranno tutti insieme di muoversi.
Da notare che puoi anche creare dei movimenti che partono lenti, a metà sono più veloci ed alla fine tornano lenti, basta fare la divisione in 20 (o quelle che siano) parti in modo da avere angoli più ampi verso il centro dei vettori.

Go Up