sto costrue un auto telecomandata non riesco a programmare le FRECCIE

Buongiorno, è da un pò che sto costruendo un camion telecomandato tramite bluetooth dallo smartphone, inviando alla scheda una precisa lettera che corrisponde ad un comando che la scheda esegue. Non riesco a programmare le frecce di direzione, so far lampeggiare il led, ma non riesco a trovare il modo per fare partire il lampeggio quando arriva una lettera "D" per esempio e fermare il lampeggio quando svolto. inoltre vorrei mettere un lampeggiante tipo quelli da cantiere, ma non trovo il modo per farlo partire e fermarlo quando voglio io. Sia il lampeggiante che le frecce le faccio con dei LED arancioni La domanda cruciale è: esiste un modo per realizzare queste 2 cose?

grazie in anticipo ;) Federico

Buongiorno, essendo il tuo primo post, nel rispetto del regolamento, ti chiedo cortesemente di presentarti QUI ([u]spiegando bene quali conoscenze hai di elettronica e di programmazione[/u] ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il su citato REGOLAMENTO ... Grazie.

Guglielmo

fedebo2013: Buongiorno, è da un pò che sto costruendo un camion telecomandato tramite bluetooth dallo smartphone, non riesco a programmare le frecce di direzione, so far lampeggiare il led, ma non riesco a trovare il modo per fare partire il lampeggio quando arriva una lettera "D" per esempio e fermare il lampeggio quando svolto. inoltre vorrei mettere un lampeggiante tipo quelli da cantiere, ma non trovo il modo per farlo partire e fermarlo quando voglio io. La domanda cruciale è: esiste un modo per realizzare queste 2 cose?

grazie in anticipo ;) Federico

Magari oltre a presentarti spiega un pò meglio. Almeno io, non ho capito nulla.

fedebo2013: esiste un modo per realizzare queste 2 cose?

Sì, se dai i dettagli dello sketch che ci si possa ragionare. E se l' hai trovato in rete il link da dove viene.

ExperimentUno:
Sì, se dai i dettagli dello sketch che ci si possa ragionare. E se l’ hai trovato in rete il link da dove viene.

sotto ti metto solo la parte del led lampeggiante che simula il lampeggiante da cantiere, non ho ancora scritto la parte delle frecce di direzione ma dovrebbero essere uguali penso.

    case 'O':                       //in teoria il led collegato dovrebbe lampeggiare al infinito
      digitalWrite(lamp,HIGH);
      delay(500);
      digitalWrite(lamp,LOW);
      delay(500);
    break;
     case 'o':                       //in teoria il led collegato dovrebbe smettere di lampeggiare
      digitalWrite(lamp,LOW);
    break;

qui sotto trovi il codice del intero programma se mi sai dire anche se la parte che regola il servomotore è corretta ti ringrazio.

#include <Servo.h>
 
Servo myservo;
char sen = 'a';
int p=90,vel = 0;   
const int avv=5;              //avanti
const int ret=6;             //retro
const int cl=3;             //clacson
const int lamp=2;          // lampeggiante
const int ana=4;           //anabaglianti
const int abb=7;          //abaglianti

void setup() 
{       
  Serial.begin(9600);  
myservo.attach(9);
 pinMode(5,OUTPUT);
 pinMode(6,OUTPUT);
pinMode(cl,OUTPUT);
pinMode(lamp,OUTPUT);
pinMode(4,OUTPUT);
pinMode(7,OUTPUT);

}

void loop(){
  
  if(Serial.available() > 0){ 
    sen = Serial.read(); 
    
   //Serial.println(sen);
    switch(sen){
   case 'A':                      //il veicolo si muove in avanti
      analogWrite(avv,vel); 
      digitalWrite(ret,LOW);
      break;
   case 'R':                      //il veicolo si muove indietro
      analogWrite(ret,vel); 
      digitalWrite(avv,LOW);
      break;
   case 'a':                      //il veicolo si ferma
      digitalWrite(ret,LOW); 
      digitalWrite(avv,LOW);
      break;
    case 'C':                 //il veicolo emette un rumore
      tone(cl,50);
      delay(300);
      tone(cl,700);
      delay(300);
      break;
    case 'c':               
      noTone(cl);
      break;
    case 'N':                       //si accendono gli anabaglianti
      digitalWrite(ana,HIGH);
      break;
    case 'n':                         //si spengono gli anabaglianti
      digitalWrite(ana,LOW);
      break;
    case 'B':                           //si accendono gli abaglianti
      digitalWrite(abb,HIGH);
      break;
    case 'b':                           //si spengono gli abaglianti
      digitalWrite(abb,LOW);
      break;
    case 'O':                       //in teoria il led collegato dovrebbe lampeggiare al infinito
      digitalWrite(lamp,HIGH);
      delay(500);
      digitalWrite(lamp,LOW);
      delay(500);
    break;
     case 'o':                       //in teoria il led collegato dovrebbe smettere di lampeggiare
      digitalWrite(lamp,LOW);
    break;
    
    default:                              //settaggio della velocita del veicolo
       
         if(sen=='9'){
        vel = 255;
       
      }
      else{ 
        if((sen >= 48) && (sen <= 57)){ 
         vel = (sen - 48)*25;       
        }
      }
      }
   if(sen=='D'){                        //il veicolo gira a destra
     myservo.write(p-5);
    p=p-5;
   }
    if(sen=='S'){                     //il veicolo gira a sinistra
     myservo.write(p+5);
    p=p+5;
   }
   if(sen=='H'){                 //i gradi dello sterzo tornano a 0
     myservo.write(90);
     p=90;
   }
//Serial.println(p);
   
  }
}

Ho corretto il tuo codice

#include <Servo.h>
 
Servo myservo;
char sen = 'a';
byte p=90,vel = 0;
/* Non ti servono variabili per indicare dei piedini
 * Usa nomi più esplicativi. 
 */

#define avv 5;                          // avanti-
#define ret 6;                          // retro
#define cl 3;                           // clacson
#define lamp 2;                         // lampeggiante
#define ana 4;                          // anabaglianti
#define abb 7;                          // abaglianti
long prev_millis;
bool lampeggiante;
bool state;

void setup() 
{       
    Serial.begin(9600);  
    myservo.attach(9);
    /* usa i define per controllare le costanti assegnate in giro al programma
    * Ti evita estenuanti ricerche.
    */
    pinMode(avv,OUTPUT);
    pinMode(ret,OUTPUT);
    pinMode(cl,OUTPUT);
    pinMode(lamp,OUTPUT);
    pinMode(ana,OUTPUT);
    pinMode(abb,OUTPUT);
}
void blink() {
    if ((prev_millis +500) = millis())
    {   if (lampeggiante)
        {
            digitalWrite(lamp, state);
            state = ~state;
        }
        prev_millis = millis();
    }
}

void loop(){
  blink();
  if(Serial.available() > 0){ 
    sen = Serial.read(); 
    
   //Serial.println(sen);
    switch(sen){
   case 'A':                            // il veicolo si muove in avanti
      analogWrite(avv,vel); 
      digitalWrite(ret,LOW);
      break;
   case 'R':                            // il veicolo si muove indietro
      analogWrite(ret,vel); 
      digitalWrite(avv,LOW);
      break;
   case 'a':                            // il veicolo si ferma
      digitalWrite(ret,LOW); 
      digitalWrite(avv,LOW);
      break;
    case 'C':                           // il veicolo emette un rumore
      tone(cl,50);
      delay(300);
      tone(cl,700);
      delay(300);
      break;
    case 'c':               
      noTone(cl);
      break;
    case 'N':                           // si accendono gli anabaglianti
      digitalWrite(ana,HIGH);
      break;
    case 'n':                           // si spengono gli anabaglianti
      digitalWrite(ana,LOW);
      break;
    case 'B':                           // si accendono gli abaglianti
      digitalWrite(abb,HIGH);
      break;
    case 'b':                           // si spengono gli abaglianti
      digitalWrite(abb,LOW);
      break;
    case 'O':                           // in teoria il led collegato dovrebbe
                                        // lampeggiare al infinito
      lampeggiante = 1;
    break;
     case 'o':                          // in teoria il led collegato dovrebbe
                                        // smettere di lampeggiare
      lampeggiante = 0;
    break;
    
    default:                            // settaggio della velocita del veicolo
       
         if(sen=='9'){
        vel = 255;
       
      }
      else{ 
        if((sen >= 48) && (sen <= 57)){ 
         vel = (sen - 48)*25;       
        }
      }
      }
   if(sen=='D'){                        // il veicolo gira a destra
     myservo.write(p-5);
    p=p-5;
   }
    if(sen=='S'){                       // il veicolo gira a sinistra
     myservo.write(p+5);
    p=p+5;
   }
   if(sen=='H'){                        // i gradi dello sterzo tornano a 0
     myservo.write(90);
     p=90;
   }
//Serial.println(p);
   
  }
}

Poi come dice Guido Van Rossum, un sorgente viene letto molto di più che eseguito. Per dire che ci vuole leggibilità.
Ammetto che non mi piace come indenta l’ IDE di Arduino, preferisco 4 spazi e non 2.
Notare i commenti e studia, le modifiche.
Il punto saliente è che ad ogni ciclo di loop, la seriale prende un carattere, e lo switch con la lettera “O” lo vede una sola volta.
Tu per farlo funzionare devi metterci un interruttore che si ricorda che è accesso. Poi visto che non lo vuoi solo acceso, ma anche lampeggiante, devi accollargli una funzione che lo faccia.
Però, non puoi fare che fa solo quello, devi dare spazio anche al resto del programma. Si fa quindi che ad ogni ciclo della loop si va a vedere se è passato mezzo secondo, nel caso si cambia stato alla uscita. Percui millis() è come guardare l’ orologio, si prende nota e si aspetta che sia passato il periodo voluto, altrimenti si lascia la funzione.

ExperimentUno:
Ho corretto il tuo codice

#include <Servo.h>

Servo myservo;
char sen = ‘a’;
byte p=90,vel = 0;
/* Non ti servono variabili per indicare dei piedini

  • Usa nomi più esplicativi.
    */

#define avv 5;                          // avanti-
#define ret 6;                          // retro
#define cl 3;                          // clacson
#define lamp 2;                        // lampeggiante
#define ana 4;                          // anabaglianti
#define abb 7;                          // abaglianti
long prev_millis;
bool lampeggiante;
bool state;

void setup()
{     
    Serial.begin(9600); 
    myservo.attach(9);
    /* usa i define per controllare le costanti assegnate in giro al programma
    * Ti evita estenuanti ricerche.
    */
    pinMode(avv,OUTPUT);
    pinMode(ret,OUTPUT);
    pinMode(cl,OUTPUT);
    pinMode(lamp,OUTPUT);
    pinMode(ana,OUTPUT);
    pinMode(abb,OUTPUT);
}
void blink() {
    if ((prev_millis +500) = millis())
    {  if (lampeggiante)
        {
            digitalWrite(lamp, state);
            state = ~state;
        }
        prev_millis = millis();
    }
}

void loop(){
  blink();
  if(Serial.available() > 0){
    sen = Serial.read();
   
  //Serial.println(sen);
    switch(sen){
  case ‘A’:                            // il veicolo si muove in avanti
      analogWrite(avv,vel);
      digitalWrite(ret,LOW);
      break;
  case ‘R’:                            // il veicolo si muove indietro
      analogWrite(ret,vel);
      digitalWrite(avv,LOW);
      break;
  case ‘a’:                            // il veicolo si ferma
      digitalWrite(ret,LOW);
      digitalWrite(avv,LOW);
      break;
    case ‘C’:                          // il veicolo emette un rumore
      tone(cl,50);
      delay(300);
      tone(cl,700);
      delay(300);
      break;
    case ‘c’:             
      noTone(cl);
      break;
    case ‘N’:                          // si accendono gli anabaglianti
      digitalWrite(ana,HIGH);
      break;
    case ‘n’:                          // si spengono gli anabaglianti
      digitalWrite(ana,LOW);
      break;
    case ‘B’:                          // si accendono gli abaglianti
      digitalWrite(abb,HIGH);
      break;
    case ‘b’:                          // si spengono gli abaglianti
      digitalWrite(abb,LOW);
      break;
    case ‘O’:                          // in teoria il led collegato dovrebbe
                                        // lampeggiare al infinito
      lampeggiante = 1;
    break;
    case ‘o’:                          // in teoria il led collegato dovrebbe
                                        // smettere di lampeggiare
      lampeggiante = 0;
    break;
   
    default:                            // settaggio della velocita del veicolo
     
        if(sen==‘9’){
        vel = 255;
     
      }
      else{
        if((sen >= 48) && (sen <= 57)){
        vel = (sen - 48)*25;     
        }
      }
      }
  if(sen==‘D’){                        // il veicolo gira a destra
    myservo.write(p-5);
    p=p-5;
  }
    if(sen==‘S’){                      // il veicolo gira a sinistra
    myservo.write(p+5);
    p=p+5;
  }
  if(sen==‘H’){                        // i gradi dello sterzo tornano a 0
    myservo.write(90);
    p=90;
  }
//Serial.println(p);
 
  }
}



Poi come dice Guido Van Rossum, un sorgente viene letto molto di più che eseguito. Per dire che ci vuole leggibilità.
Ammetto che non mi piace come indenta l' IDE di Arduino, preferisco 4 spazi e non 2.
**Notare** i commenti e studia, le modifiche.
Il punto saliente è che ad ogni ciclo di loop, la seriale prende un carattere, e lo switch con la lettera "O" lo vede una sola volta.
Tu per farlo funzionare devi metterci un *interruttore* che si ricorda che è accesso. Poi visto che non lo vuoi solo acceso, ma anche lampeggiante, devi accollargli una funzione che lo faccia.
Però, non puoi fare che fa solo quello, devi dare spazio anche al resto del programma. Si fa quindi che ad ogni ciclo della **loop** si va a vedere se è passato mezzo secondo, nel caso si cambia stato alla uscita. Percui **millis()** è come guardare l' orologio, si prende nota e si aspetta che sia passato il periodo voluto, altrimenti si lascia la funzione.

Grazie mille per le correzioni, scusa se ho guardato appena ora, adesso vado a cercarmi le funzioni che hai usato su internet per capire meglio la logica.

ho provato a compilare il programma ma mi da errore :

Arduino:1.6.8 (Windows 7), Scheda:"Arduino/Genuino Uno"

H:\federico\arduino\dumper\dumper_corretto\dumper_corretto.ino: In function 'void blink()':

dumper_corretto:37: error: lvalue required as left operand of assignment

if ((prev_millis + 500) = millis()){

^

exit status 1 lvalue required as left operand of assignment

Questo report potrebbe essere più ricco di informazioni con l'opzione "Mostra un output dettagliato durante la compilazione" abilitata in File -> Impostazioni

fedebo2013: if ((prev_millis + 500) = millis()){

Il confronto di uguale è == Singolo è assegnazione. if( test==0)

nid69ita: Il confronto di uguale è == Singolo è assegnazione. if( test==0)

aaah quel errore voleva dire quello, effetivamente non ha senso fare un assegnazione dove va fatta una condizione.

Purtroppo il compilatore C accetta una assegnazione in un if (perchè è una operazione lecita in C).

Nel caso specifico non può che dare proprio un errore, perché quel che c'è a sinistra dell'assegnamento non è una lvalue.