Go Down

Topic: Aiuto per un vecchio appassionato (Read 3835 times) previous topic - next topic

Patrick_M


diciamo che la cosa migliore sarebbe anche dichiarare la i all'interno del for così non ti rimane una variabile in giro per il programma ;)
Code: [Select]

for (byte i=0; i<255; i++)
 {
 analogWrite(TRENO,i);
 delay(10);
 }
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

zoomx

Credo che dopo il ciclo vada aggiunto
Code: [Select]
marcia=1;

Datman

#62
Dec 10, 2018, 02:08 pm Last Edit: Dec 10, 2018, 03:13 pm by Datman
marcia=1; serve per far lampeggiare la croce di S. Andrea, quindi deve essere messo prima del for(), in modo che inizi a lampeggiare alla partenza del treno.

Marco, non ci hai detto come piloti il treno: che cosa hai messo tra l'uscita 10 di Arduino e le rotaie? Se è un relè, non puoi pilotarlo in PWM! Devi usare un mosfet o un transistor.
Con l'avviamento progressivo il codice diventa così:
Code: [Select]
/* Descrizione:
- Parte il treno e si lampeggia la croce di S. Andrea, finché il treno entra nella galleria.
- In galleria, il treno chiude il contatto reed e il treno si ferma. Si spegne la croce di S. Andrea.
- Dopo 2 minuti, riprende a lampeggiare la croce di S. Andrea e il treno riparte.
*/
const byte    REED = 8;  // pin di input a cui è collegato il contatto reed verso massa.
const byte  LED_A = 13; // led A della croce di S. Andrea
                                    // N.B.: Il pin 13 lampeggia all'accensione per la presenza del bootloader.
const byte  LED_B = 11; // led B della croce di S. Andrea
const byte TRENO = 10; // Treno pilotato dal pin digitale 10


// Variabili globali
byte statoReedPrec = 0; // stato precedente del contatto reed
byte marcia=0; // Stato del treno.
unsigned long t1; // millis() per i 2 minuti di attesa.

void setup()
{
pinMode(LED_A, OUTPUT);
pinMode(LED_B, OUTPUT);
pinMode(TRENO, OUTPUT);
pinMode(REED, INPUT);
pinMode(REED, INPUT_PULLUP); // Resistenza di pullup interna per mettere il pulsante verso massa.
            // Il contatto reed verso massa è anche comodo perché non devi portare fuori il +V.
            // Metti un condensatore da 1uF (meglio se con 100 ohm in serie) tra il pin di ingresso e
            // massa come antirimbalzo (un contatto reed fa meno rimbalzi).

marcia=1;
for (byte i=0; i<255; i++) // Il treno parte accelerando.
 {
 analogWrite(TRENO,i);
 if(millis()%1000<500) {digitalWrite(LED_B, LOW); digitalWrite(LED_A, HIGH);} // spegne il LED B e accende il LED A.
    else                  {digitalWrite(LED_A, LOW); digitalWrite(LED_B, HIGH);} // spegne il LED A e accende il LED B.
 delay(10);
 }
}


void loop()
{
if(!digitalRead(REED) && statoReedPrec==1) // Nel momento in cui il treno arriva sul reed
  {
  statoReedPrec=0;
  digitalWrite (TRENO, LOW); marcia=0; // Ferma il treno.
  t1=millis(); // prende il tempo.
  }
if(digitalRead(REED)) statoReedPrec=1;
if(millis()-t1>120000) // Se sono passati 2 minuti
  {
  marcia=1;
  for (byte i=0; i<255; i++) // Il treno riparte accelerando.
    {
    analogWrite(TRENO,i);
    delay(10);
    if(millis()%1000<500) {digitalWrite(LED_B, LOW); digitalWrite(LED_A, HIGH);} // spegne il LED B e accende il LED A.
    else                  {digitalWrite(LED_A, LOW); digitalWrite(LED_B, HIGH);} // spegne il LED A e accende il LED B.
    }
  }

if(marcia) // Se il treno è in movimento, la croce di S. Andrea lampeggia.
  {
  if(millis()%1000<500) {digitalWrite(LED_B, LOW); digitalWrite(LED_A, HIGH);} // spegne il LED B e accende il LED A.
  else                  {digitalWrite(LED_A, LOW); digitalWrite(LED_B, HIGH);} // spegne il LED A e accende il LED B.
  }
else {digitalWrite(LED_A, LOW); digitalWrite(LED_B, LOW);}
} // END loop()
Hi,I'm Gianluca from Roma.I play&work with electronics since I was16(1984).
After 25yrs of maintenance on cameras&video mixers,since 2013myJob is HDTVstudios design.
Since Jan2015 IPlayWith Arduino:bit.ly/2F3LPWP
Thanks 4 a Karma if U like my answer

zoomx

@Datman
lo volevo scrivere che durante il for non ci sarebbe stato lampeggio ma il ciclo senza delay sarebbe stato eseguito moooolto velocemente per cui ho lasciato perdere.

Con la modifica che hai fatto al ciclo for invece possono andare assieme.

PEr quanto riguarda la variabile marcia, per come hai scritto il codice, è ininfluente la posizione prima o dopo il ciclo for in quanto viene usata solo dopo.

Sarebbe stato diverso se fosse stato utilizzato un timer e il relativo interrupt. Avvii il timer e i led lampeggiano per i fatti loro, fermi il timer e i led non lampeggiano più.
Esempio qui
http://www.hobbytronics.co.uk/arduino-timer-interrupts
e qui (alla fine!)
https://forum.arduino.cc/index.php?topic=276106.0

Bisogna scegliere però il Timer giusto. Visto che il Timer0 è usato da delay(), millis() e micros() rimangono il Timer1 se non si usa Servo e il Timer2 se non si usa Tone().

Datman

Sì, ma si può modificare il programma e togliere il delay nel for facendo lampeggiare le luci :)
Basta comandare il treno con la variabile marcia e con una variabile vel (tra 1 e 255). Ci sto pensando... :)
Hi,I'm Gianluca from Roma.I play&work with electronics since I was16(1984).
After 25yrs of maintenance on cameras&video mixers,since 2013myJob is HDTVstudios design.
Since Jan2015 IPlayWith Arduino:bit.ly/2F3LPWP
Thanks 4 a Karma if U like my answer

Datman

#65
Dec 10, 2018, 04:03 pm Last Edit: Dec 18, 2018, 05:05 pm by Datman
Funziona? :-)
P.s.: C'è anche il rallentamento, perciò il contatto reed dovrà essere messo all'inizio della galleria, altrimenti il treno si fermerà fuori.

Un consiglio: poiché scriviamo da sinistra verso destra, il treno dovrebbe camminare da destra verso sinistra (in senso orario visto dall'alto), in maniera che la scritta che porta si legga dal primo all'ultimo carattere, anziché al contrario.
Code: [Select]
/* Descrizione:
- Parte il treno e lampeggia la croce di S. Andrea, finché il treno entra nella galleria.
- In galleria, il treno chiude il contatto reed e il treno si ferma. Si spegne la croce di S. Andrea.
- Dopo 2 minuti, riprende a lampeggiare la croce di S. Andrea e il treno riparte.
*/

const byte  REED = 8;  // pin di input a cui è collegato il contatto reed verso massa.
const byte LED_A = 13; // led A della croce di S. Andrea
                                    // N.B.: Il pin 13 lampeggia all'accensione per la presenza del bootloader.
const byte LED_B = 11; // led B della croce di S. Andrea
const byte TRENO = 10; // Treno pilotato dal pin digitale 10


byte statoReedPrec = 0; // stato precedente del contatto reed
byte marcia=1;     // Stato del treno. Il treno partirà nel loop accelerando.
byte marciaPrec=0; // Stato precedente del treno.
unsigned long t1;  // annota millis() per i 2 minuti di attesa.
unsigned long t2;  // annota millis() per l'accelerazione e la frenatura del treno.
byte vel=5;    // Velocità del treno durante l'avviamento e la frenatura.

void setup()
{
pinMode(LED_A, OUTPUT);
pinMode(LED_B, OUTPUT);
pinMode(TRENO, OUTPUT);
pinMode(REED, INPUT);
pinMode(REED, INPUT_PULLUP); // Resistenza di pullup interna per mettere il pulsante verso massa.
            // Il contatto reed verso massa è anche comodo perché non devi portare fuori il +V.
            // Metti un condensatore da 1uF (meglio se con 100 ohm in serie) tra il pin di ingresso e
            // massa come antirimbalzo (un contatto reed fa meno rimbalzi).
delay(12); // Per evitare che millis() sia minore di 11.
}

void loop()
{
if(marcia==1) // Se marcia=1 accelera fino a 255.
  {
  if(marciaPrec==0) {t2=millis()-11; marciaPrec=1;}
  if(vel<=245 && millis()-t2>10)
    {vel+=10; analogWrite(TRENO,vel); t2=millis();}
  }
else          // Se marcia=0 rallenta fino a 5 e ferma il treno.
  {
  if(marciaPrec==1) {t2=millis(); marciaPrec=0;}
  if(vel>=15 && millis()-t2>10)
  {vel-=10; t2=millis(); if(vel>5) analogWrite(TRENO,vel); else analogWrite(TRENO,0);}
  }

// ----- Croce di S. Andrea -----
if(vel>5) // Se il treno cammina, lampeggiano alternativamente a 1Hz.
  {
  if(millis()%1000<500) {digitalWrite(LED_B, LOW); digitalWrite(LED_A, HIGH);} // spegne il LED B e accende il LED A.
  else                  {digitalWrite(LED_A, LOW); digitalWrite(LED_B, HIGH);} // spegne il LED A e accende il LED B.
  }
else {digitalWrite(LED_A, LOW); digitalWrite(LED_B, LOW);} // Se il treno è fermo, spegne entrambe.
// ------------------------------
 
if(!digitalRead(REED) && statoReedPrec==1) // Nel momento in cui il treno arriva sul reed
  {
  statoReedPrec=0;
  marcia=0; // Ferma il treno.
  t1=millis(); // prende il tempo.
  }
if(digitalRead(REED)) statoReedPrec=1;
if(millis()-t1>120000) marcia=1; // Se sono passati 2 minuti, riparte.

} // END loop()
Hi,I'm Gianluca from Roma.I play&work with electronics since I was16(1984).
After 25yrs of maintenance on cameras&video mixers,since 2013myJob is HDTVstudios design.
Since Jan2015 IPlayWith Arduino:bit.ly/2F3LPWP
Thanks 4 a Karma if U like my answer

ArTex

Eccomi quà,

famiglia quasi a letto... Che fatica!

Ho pilotato l'uscita con il vecchio e caro Mosfet IRF520... Per la vetrina và tutto ok, tanto il treno "sgomma in galleria"...

A casa ne ho montato uno uguale sotto l'albero e ho messo pure una stazione.... A casa si fanno le cose più serie! HAhahha!

Ora faccio un pò di esperiementi solo che a quanto pare si è bruciato il mosfet! Sarà che l'ho riciclato troppe volte...

Il tempo di cambiarlo e giocherò con l'ide.

Ciao Marco

ArTex

Domandina...

Ma dall'uscita Vin quanti A possono uscire? Missà che per pigrizia ho fatto una frittura mista...

Grazie Marco

P.S. Il treno vetrina funziona alla grande, quello di casa è durato solo 4h

Etemenanki

... non bisognerebbe MAI far passare le alimentazioni attraverso arduino, si rischia sempre di friggere qualcosa, fosse anche solo una pista ... masse in comune, positivi in comune, antrebbero sempre presi direttamente dall'alimentatore, con cavetti di sezione adeguata ... meglio ancora, se sono presenti motori o carichi e non si ha un secondo alimentatore, disaccoppiare il positivo che va ad arduino e quello che va ai carichi con un paio di diodi e condensatori filtro dopo ogni diodo ... e ricordarsi anche che i "comuni" diodi tipo 1N4007 e simili reggono al massimo 1A, se il carico ne richiede di piu, serve usare diodi che reggano piu corrente, o alla disperata mettere piu diodi in parallelo ...
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

maubarzi

Il max di 200mA totali penso valga un po' per tutto, mA + o mA -. Magari ne regge 400 ma per puro c...
Penso anche io che prendere come regola di non passare mai per arduino per alimentare qualcosa sia una buona prassi. 2 led ok, ma già se ne devi usare 10...

Comunque pensa al lato positivo, a casa hai implementato un treno a vapore ;)
Nessuna buona azione resterà impunita!

Preistoria -> medioevo -> rinascimento -> risorgimento -> rincoglionimento!

Datman

Il video stava su tinypic e non c'è più! :( Volevo rivederlo...
Hi,I'm Gianluca from Roma.I play&work with electronics since I was16(1984).
After 25yrs of maintenance on cameras&video mixers,since 2013myJob is HDTVstudios design.
Since Jan2015 IPlayWith Arduino:bit.ly/2F3LPWP
Thanks 4 a Karma if U like my answer

Go Up