Go Down

Topic: problema nell'eseguire un programma da seriale (Read 3313 times) previous topic - next topic

biohazard91

ciao a tutti, ho provato a cercare ovunque ma non sono
riuscito a trovare una soluzione al mio problema, in poche parole
quando ricevo dei valori da seriale deve avviare un tipo di programma per
ogni comando.
vi posto il codice
Code: [Select]
void loop()
{
  Serial.println("Connesso ad Arduino");
  delay(500);
  if (Serial.available() > 0) { //Se sono presenti dati nel buffer
    ricezione_dato = Serial.read();
    delay(2);
   
    if (ricezione_dato == 'a') //se il comando è a indica lo stato della connessione
    { 
      ricezione_valore = Serial.read();
      if (ricezione_valore == 49) { //se il valore è uguale a 1
        delay(2);
        Serial.write("Eseguo A1");
       ledprova();
        }

void ledprova()
{ for( int value = 0; value <200; value++)
{ analogWrite(9, value);
delay(30);
}


il problema è che non vedo il fading del led ma da spento lo trovo acceso
e non mi spiego il motivo.
non c'è un'istruzione per eseguire il void ledprova fino alla fine prima di ritornare
a verificare se ci sono dati in arrivo?
eppure ho provato con un servo a farli fare un movimento da 0 a 180 sempre
con il for e funziona....
grazie

leo72

Il programma è incompleto, non si sa che cosa fa nel resto del loop.
Prova comunque a mettere una Serial.print di risposta  all'interno dei vari if per vedere se esegue o salta i blocchi di codice.

biohazard91

Nel resto del loop non fa altro che verificare quali dati gli arrivano nella seriale, il programma principale è quello svolto dai vari void, il mio problema è che non mi esegue i void correttamente. Comunque quel ledprova sarà sostituito da un programma che muoverà un motore passo passo, se ti serve altro per capire meglio dimmi pure.

nid69ita

Forse però è meglio se posti l'intero programma comunque.
Anche questo pezzo non ha senso scritto così:
Code: [Select]
void ledprova()
{ for( int value = 0; value <200; value++)
  { analogWrite(9, value);
    delay(30);
  }


Perchè manca almeno una graffa. A meno che hai proprio sbagliato a usare le graffe. Nel qual caso si spiegherebbe perchè non funziona il fade.
my name is IGOR, not AIGOR

nid69ita


non c'è un'istruzione per eseguire il void ledprova fino alla fine prima di ritornare
a verificare se ci sono dati in arrivo?


Guarda che il programma è già cosi. Quando chiami la ledprova(), finchè non finisce, Arduino non fa altro.
Anzi potresti perdere altri dati in arrivo sulla seriale mentre il programma esegue quel fade.

Hai provato senza tanti fronzoli a la sola ledfade() ?   Magari con quel tempo di attesa di 30 è troppo veloce e non riesci a percepire con la vista il fade.
my name is IGOR, not AIGOR

biohazard91

Mi sarò dimenticato di copiare anche quella graffa, comunque c'è nel void. Non riesco proprio a capire perché fa un questo modo. (appena sono a casa lo posto tutto)

biohazard91

ho provato a fare un brevissimo sketch per provare l'uscita di arduino(magari si era guastata),
ve lo posto
Code: [Select]
int led =10;

void setup(){}

void loop()
{
  for(int value = 0; value <= 255; value +=1)
  { analogWrite(led, value);
  delay(30);
  }
}

e caricandolo su arduino fa quello che deve fare però se questo stesso sketch( il loop)
lo vado a incollare su ledprova() e da seriale gli faccio arrivare un a1 mi trovo che
su seriale vedo che si ferma ad eseguire ledprova ma non vedo il fading e in più
a fine del programma chiamato ho il led acceso.
quindi, ricapitolando:
- invio a1
- vedo che parte il programma
- non vedo il fading
- finito il programma mi trovo l'uscita a 5v

boh, attendo la vostra opinione.
qua il programma completo

Code: [Select]
int led = 10;
int ricezione_dato;
int ricezione_valore;


void setup()
{
  Serial.begin(9600);

}

void loop()
{
  Serial.println("Connesso ad Arduino");
  delay(500);
  if (Serial.available() > 0) { //Se sono presenti dati nel buffer
    ricezione_dato = Serial.read();
    delay(2);
   
    if (ricezione_dato == 'a') //se il comando è s indica lo stato della connessione
    { 
      ricezione_valore = Serial.read();
      if (ricezione_valore == 49) { //se il valore è uguale a 1
        delay(2);
        Serial.write("Eseguo A1");
        ledprova();
        Serial.print("ledprova eseguito");
      }
      if (ricezione_valore == 50) { //se lo stato è uguale a 2
        delay(2);
          Serial.print("Eseguo a2");

     
      }
     
      if (ricezione_valore == 51) { //se lo stato è uguale a 3
        delay(2);
          Serial.print("Eseguo a3");

      }
     
      if (ricezione_valore == 52) { //se lo stato è uguale a 4
        delay(2);
          Serial.print("Eseguo a4");

      }
     
      if (ricezione_valore == 53) { //se lo stato è uguale a 5
        delay(2);
          Serial.print("Eseguo a5");

      }
     
      if (ricezione_valore == 54) { //se lo stato è uguale a 6
        delay(2);
          Serial.print("Eseguo a6);

      }
     
      if (ricezione_valore == 55) { //se lo stato è uguale a 7
        delay(2);
          Serial.print("Eseguo a7");

      }
     
      if (ricezione_valore == 56) { //se lo stato è uguale a 8
        delay(2);
          Serial.print("Eseguo a8");

      }
     }

void ledprova()
{
  for(int value = 0; value <= 255; value +=1)
  { analogWrite(led, value);
  delay(30);
  }
}

grazie.

alex16

Avrai il led spiritato, perché a parte due graffe mancanti e una doppia virgolette, a me lo sketch funziona

biohazard91

a me continua a non funzionare, ho provato anche con un motore
passo passo e non va, per ora mi va solo con un servo...
avete se no altre idee per sviluppare un progetto simile a questo?
non so più vosa fare....


nid69ita

Anche a me funziona, ma come detto da @alex16, ci sono 3 errori nel codice che hai postato.

Poi, scusa, forse non capisco cosa vuoi fare. A me il fade lo fa, da spento ad acceso al massimo. Ma poi rimane acceso perchè non lo spegni più.
Se ridai a1 allora lo spegne e fa il fade.
my name is IGOR, not AIGOR

biohazard91

#10
Aug 24, 2013, 04:07 am Last Edit: Aug 24, 2013, 04:18 am by biohazard91 Reason: 1
sisi, era solo per provare, infatti si chiama ledprova  :)
comunque ora funziona (avevo sbagliato un attimo nello sketch),
ora però ho un altro tipo di problema molto ambiguo, nel void
ledprova ho messo questo
Code: [Select]
void ledprova() {
for( value = 0; value <5; value++)
{ digitalWrite(led, HIGH);
delay(500);
digitalWrite(led, LOW);
delay(500);
}
}

e fa quello che deve fare ma il led stranamente si accende leggermente, come se non gli
arrivassero i 5 volt ma meno, invece con l'esempio blink sempre sullo stesso pin
e con lo stesso led si accende benissimo, ma si prende gioco di me arduino?  
o sono io che non sono in grado? mmmm..... :smiley-roll:
comunque se avete dei dubbi vi faccio un video lo metto su dropbox

PaoloP

Non hai impostato il pin mode in OUTPUT e il digitalWrite attiva la pull-up interna. Ecco perché il led è poco luminoso.
Imposta il pin come output e metti in serie al led una resistenza.

biohazard91


Go Up