Problema con uno sketch 00

Salve a tuttiiii :slight_smile:

volevo portare le vostre attenzioni su questo mio piccolo inconveniente. Ho collegato arduino ad un servo motore, potenziometro e a un led. Il mio scopo era di far accendere il LED entro certi valori del potenziometro ovviamente con il movimento del servo motore. Fin qui non ho avuto problemi.

i problemi stanno insorgendo adesso che voglio far lampeggiare il LED. Ho fatto vari e vari tentativi‚Ķ l‚Äôunico risultato accettabile √® stato solo di far lampeggiare il led per mezzo secondo a discapito del movimento non pi√Ļ ‚Äúfluido‚ÄĚ del servomotore che inizia a muoversi a scatti. come posso risolvere la cosa? forse devo cambiare anche circuito oltre che lo sketch?

Intanto vi allego lo sketch del mio esperimento…

#include <Servo.h>
#define LED1 13

Servo myservo;

int potpin = 0;
int val;
void setup()
{
myservo.attach(9);
pinMode(LED1, OUTPUT);

}

void loop()
{
val = analogRead(potpin);
val = map(val, 0, 1023, 0, 179);
myservo.write(val);
delay(15);

if(val >=0 && val<80)
{
digitalWrite(LED1, HIGH);
}
else {
digitalWrite(LED1, LOW);

}
}

Quello che hai allegato non è sicuramente lo sketch che usi per far lampeggiare il led, giusto? Se nello sketch che stai usando hai messo come penso un delay è normale che poi vada tutto a salti.

Parti studiando l'esempio BlinkWithoutDelay e poi pubblica lo sketch riveduto e corretto

leo72: Quello che hai allegato non è sicuramente lo sketch che usi per far lampeggiare il led, giusto? Se nello sketch che stai usando hai messo come penso un delay è normale che poi vada tutto a salti.

Parti studiando l'esempio BlinkWithoutDelay e poi pubblica lo sketch riveduto e corretto

ma il delay c'è in questo sketch, perché dovrebbe pubblicarne un altro?

[quote author=Michele Menniti link=topic=113463.msg853352#msg853352 date=1341824940]

leo72: Quello che hai allegato non è sicuramente lo sketch che usi per far lampeggiare il led, giusto? Se nello sketch che stai usando hai messo come penso un delay è normale che poi vada tutto a salti.

Parti studiando l'esempio BlinkWithoutDelay e poi pubblica lo sketch riveduto e corretto

ma il delay c'è in questo sketch, perché dovrebbe pubblicarne un altro? [/quote] Forse quello che voleva dire Leo è che deve fare uno sketch senza delay perché è quest'ultima funzione che fa muovere a scatti il servo.

Ciao

Perché lui parla di far lampeggiare il led ma con lo sketch che ha pubblicato non lo fa di certo. Lo accende o spenge a seconda della lettura del potenziometro. Vedo sì un delay di 15 ms ma non credo che con 15 ms lui intenda far lampeggiare il led in maniera visibile all'occhio umano Al max dà noia solo al servo, come dici.

leo72: Perché lui parla di far lampeggiare il led ma con lo sketch che ha pubblicato non lo fa di certo. Lo accende o spenge a seconda della lettura del potenziometro. Vedo sì un delay di 15 ms ma non credo che con 15 ms lui intenda far lampeggiare il led in maniera visibile all'occhio umano Al max dà noia solo al servo, come dici.

appunto, lui sta dicendo che il servo va a scatti e non riesce a far lampeggiare il led, a me sembra che la cosa sia compatibile con quello sketch, però potrei sbagliarmi :~

l'unico risultato accettabile è stato solo di far lampeggiare il led per mezzo secondo

parla di far lampeggiare il led mezzo secondo. Poi non so, potrei sbagliarmi.

ciao

il delay(15) che si legge in questo sketch √® il tempo associato al servomotore, cio√® ‚Äúaspetta 15ms affinch√® il servomotore raggiunga la posizione‚ÄĚ (probabilmente si pu√≤ omettere).

quello che ho erroneamente postato non √® lo sketch che ho usato per far lampeggiare il LED, purtroppo ho fatto miliardi di prove e alla fine non lo trovo pi√Ļ. Cerco di spiegarmi meglio‚Ķ

la prima prova è stata aggiungere allo sketch postato un delay(500); sotto la linea di codice digitalWrite(LED1, HIGH); con esiti fallimentari perchè il delay incide sul servo rallentandone i movimenti di mezzo secondo quando (val >=0 && val<80). :expressionless:

quindi vedendo l‚Äôesempio ‚Äúblinkwhitoutdelay‚ÄĚ potrei giungere a soluzione‚Ķ ok :slight_smile: proviamoooo

Con il delay blocchi tutto, non va bene. Devi fare un check usando i millis, come già detto: la strada è quella.

Grazie ai consigli di leo72 e degli altri utenti sono riuscito a far ciò che volevo.

Ho scalato la prima pietra di una grande montagna.

vi copio lo sketch :slight_smile: in caso volete suggerirmi qualche altro piccolo accorgimento tecnico. Vi ringrazio ancora :slight_smile:

#include <Servo.h>
#define LED1 13

Servo myservo;

int potpin = 0;
int val;
int ledState = LOW;
long previousMillis = 0;
long interval = 200;

void setup()
{
myservo.attach(9);
pinMode(LED1, OUTPUT);

}

void loop()
{
val = analogRead(potpin);
val = map(val, 0, 1023, 0, 179);
myservo.write(val);
delay(15);
unsigned long currentMillis= millis();

if(val >=0 && val<80)
{
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;

if(ledState == LOW)
ledState = HIGH;
else
ledState = LOW;

digitalWrite(LED1, ledState);
}
}else {digitalWrite(LED1, LOW);}
}

L'unica cosa che non capisco è unsigned long currentMillis= millis(); messo prima dell'if

Usa i tag [code ] e [/code ] per incapsulare il codice. :wink:

CurrentMillis la puoi dichiarare insieme alle altre variabili.
PreviousMillis va messa come unsigned long altrimenti dopo un po’ di tempo va in overflow prima di CurrentMillis e sbaglia i calcoli.
La funzione map restituisce un valore tra 0 e 179, quindi non c’è bisogno di controllare che val sia >= 0.
Inoltre esiste un metodo pi√Ļ efficace, al posto dell‚ÄôIF, per cambiare lo stato di una variabile. Ho riportato l‚Äôesempio nel tuo listato.

#include <Servo.h>
#define LED1 13

Servo myservo;  

int potpin = 0;  
int val; 
int ledState = LOW;
unsigned long currentMillis;
unsigned long previousMillis = 0;
long interval = 200;

void setup()
{
  myservo.attach(9);  
  pinMode(LED1, OUTPUT);
}

void loop()
{
  currentMillis= millis(); //registro il valore di millis
  val = analogRead(potpin);            
  val = map(val, 0, 1023, 0, 179);     
  myservo.write(val);                  
  delay(15);                           

  if(val<80)  //val varia tra 0 e 179, non c'è bisogno di controllare se val è maggiore di 0 
  {
    if(currentMillis - previousMillis > interval) { // se è passato tot tempo...
      previousMillis = currentMillis; // azzero il contatore

      // if(ledState == LOW) 
      //   ledState = HIGH;
      // else
      //   ledState = LOW;
      ledState != ledState; //inverte il valore di ledstate, se HIGH diventa LOW e viceversa
      digitalWrite(LED1, ledState);
    }
  }
  else {
    digitalWrite(LED1, LOW);
  }

}

P.S. Lo scritto nell’IDE, e compila, ma non l’ho caricato sull’Arduino non avendone uno libero per altre sperimentazioni.

sono felice che vada già bene così :-D ma proverò anche il tuo consiglio-sketch :-)

grazie ancora cmq

ho messo unsigned long currentMillis= millis(); perch√® se lo dichiaro tra le variabili (nel mio sketch) non funziona pi√Ļ... :blush:misteri della scienza

credo sia perché nella dichiarazione variabili assume un valore una tantum, mentre nel loop viene aggiornato ad ogni ciclo

Ciaoooooo

sto riscontrando un piccolo problema di natura tecnica con questo sketch quando aggiungo un altro LED (quindi due LED).

Lampeggiano e tutto ma con intensit√† luminosa diversa, cio√® uno √® pi√Ļ luminoso dell'altro. Inizialmente ho pensato ad un problema di LED allora ne ho cambiati parecchi ma senza grossi risultati, per√≤ ho notato che come invertivo i collegamenti quello meno luminoso diventava luminoso e viceversa...

come mai? devo modificare lo sketch o è un problema circuitale??

grazie

Ti sei ricordato di mettere in output anche il pin a cui è collegato il secondo Led? pinMode(pin_del_secondo_led, OUTPUT);

YESSSSS :-)

Ok. Allora metti per favore il codice completo che stai usando

Grazie leo72 ma ho già risolto il problema, c'era qualcosa attaccato o nella breadboard o nel piedino del LED. Prima come stavo staccando tutto per provare un altro "progetto" ho notato questo pezzo gi gomma appiccicato al led... tutto qui quindi

problem solving