GAS TT 10 anni con voi

Ben arrivato! Fai login o registrati per fruire di tutte le funzionalità del forum e del sito.
Se eri già registrato e non ti ricordi la password usa questo link per recuperare l'accesso.
Sito e forum dedicati al fermodellismo, il nostro hobby viene praticato in molte maniere diverse, tutte ugualmente valide: hai un plastico? oppure sei un collezionista? oppure un semplice appassionato? Non esitare a scrivere nel forum, tutti gli interventi sono benvenuti... Postate foto e video del vostro plastico e chiedete aiuto per ogni problema o curiosità inerente al nostro hobby.

Gestione precedenze su 3 binari con Arduino

Tutto ciò che è elettricità applicata al fermodellismo.

Moderatori: lorelay49, cararci, MrMassy86, adobel55

Messaggio
Autore
Avatar utente
Edgardo_Rosatti
Socio GAS TT
Messaggi: 4932
Iscritto il: venerdì 28 ottobre 2011, 0:59
Nome: Edgardo
Regione: Lombardia
Città: Muggiò
Età: 59
Stato: Non connesso

Gestione precedenze su 3 binari con Arduino

#1 Messaggio da Edgardo_Rosatti »

Questa discussione nasce per risolvere i problemi di circolazione ferroviaria del modulo "Và e Vèn" di 58dedo:

Traforo Vàevèn - Fonte www.scalatt.it/forum

Il modulo in oggetto è un cappio di ritorno, in particolare un cappio di ritorno sinistro.
Tale cappio, al suo interno ha due deviatoi nascosti in ingresso sul binario pari che rendono possibile lo stazionamento di 3 convogli.
I due deviatoi posti in uscita saranno tallonabili senza motore e sfocieranno nel binario dispari. Anch'essi non visibili.

La scheda qui proposta è in grado di gestire manualmente i vari enti dell'impianto; 2 deviatoi, 3 sezionamenti e 3 sensori di presenza a raggi infrarossi.
La gestione dei deviatoi e dei sezionamenti avverrà tramite l'uso di relè comandati da un pulsante del tipo normalmente aperto in modalità ON-OFF.
In pratica ci saranno 5 pulsanti; premi una volta accendi, premi una seconda volta spegni.

I 3 sensori saranno collegati direttamente alle porte di ingresso analogiche di Arduino.

I moduli pre assemblati utilizzati sono:
- Aruino NANO; https://www.amazon.it/AZDelivery-Atmega ... C83&sr=8-1
- LM2596 DC-DC converter HW-411; https://www.amazon.it/Yizhet-Convertito ... C96&sr=8-2
- MH-Sensor-Series Flying-Fish. https://www.amazon.it/AZDelivery-ultras ... r=8-1&th=1

Infine, per la visualizzazione dei dati è stato utilizzato un display LCD da 20 colonne per 4 righe del tipo I2C:
https://www.amazon.it/Serial-Screen-Dis ... 102&sr=1-1

Schema elettrico:
Schema elettrico
Schema elettrico
Circuito stampato:
Progetto PCB
Progetto PCB
PCB:
PCB da assemblare
PCB da assemblare
Circuito sperimentale su bredboard:
Bredboard
Bredboard
Display LCD:
Display LCD I2C 20x4
Display LCD I2C 20x4
Il funzionamento del circuito in modalità manuale legge la pressione dei pulsanti, i quali, tramite una funzione di "stato" attivano o meno i vari relè e visualizzano sul display il risultato: "ON" e "OFF" per i sezionamenti dei 3 binari e "Corr" e "Nonc" per i 2 deviatoi.
I 3 sensori IR sono collegati direttamente a 3 porte di ingresso di Arduino, i cui risultati vengono anch'essi visualizzati sul display (B1, B2 e B3) tramite simboli su caratteri speciali.

Attualmente, la modalità automatica non è stata ancora implementata nel software.

Entro il fine settimana verrà assemblato il circuito e potremo effettuare i primi test sul modulo.

Il circuito funziona a 12 VCC tramite un piccolo alimentatore dedicato e con una piccola modifica potrà essere usato anche sul modulo "Castellaccio" di Cararci.

Software:

Codice: Seleziona tutto

/*"Cappio Va e vien" di Edgardo Rosatti per Diego Sozzi GASTT 2022
  Sistema di gestione ferroviaria per una diramazione a tre binari
  www.scalatt.it
*/

#include <LiquidCrystal_I2C.h>

#include <Wire.h>

// Ricordati: A4 = SDA, A5 = SCL
// inizializzazione display 20x4 con indirizzo 0x27
LiquidCrystal_I2C lcd(0x27,20,4);

#define binario1 2 //definisce le costanti per porte I/O
#define binario2 3
#define binario3 4
#define deviatoio1 5
#define deviatoio2 6
#define pulsante1 7
#define pulsante2 8
#define pulsante3 9
#define modo 10
#define pulsante4 11
#define pulsante5 12
#define ledmodo 13
#define sensore1 A0
#define sensore2 A1
#define sensore3 A2

// caratteri personalizzati
byte binariooccupato[8]={
  0b01010,
  0b11111,
  0b01010,
  0b11111,
  0b01010,
  0b11111,
  0b01010,
  0b11111
};
byte binariolibero[8]={
  0b00000,
  0b00100,
  0b00100,
  0b01110,
  0b01110,
  0b01110,
  0b11111,
  0b00000
};

int valoremodo=LOW; //variabile lettura interruttore Manuale/Automatico

int stato1=LOW; //variabili stato pulsanti
int stato2=LOW;
int stato3=LOW;
int stato4=LOW;
int stato5=LOW;

void setup() {
  lcd.createChar(0,binariooccupato);
  lcd.createChar(1,binariolibero);
  lcd.init();
  lcd.setCursor(7,1);
  lcd.print("LCD I2C");
  lcd.setCursor(8,2);
  lcd.print("Test!");
  lcd.backlight();
  delay(500);
  lcd.noBacklight();
  delay(500);
  lcd.backlight();
  delay(500);
  lcd.noBacklight();
  delay(500);
  lcd.backlight();
  delay(500);
  lcd.clear();
//  Serial.begin(9600); //apri porta seriale con velocità di 9600 baud
  pinMode(binario1,OUTPUT); //modalità uscita per binari, deviatoi e pulsanti
  pinMode(binario2,OUTPUT);
  pinMode(binario3,OUTPUT);
  pinMode(deviatoio1,OUTPUT);
  pinMode(deviatoio2,OUTPUT);
  pinMode(pulsante1,INPUT);
  pinMode(pulsante2,INPUT);
  pinMode(pulsante3,INPUT);
  pinMode(modo,INPUT);
  pinMode(pulsante4,INPUT);
  pinMode(pulsante5,INPUT);
  pinMode(ledmodo,OUTPUT);
}

void loop() { //imposta la modalità di funzionamento del cappio (manuale o automatica)
  valoremodo=digitalRead(modo);
  if (valoremodo==HIGH){
    automatico();
  }
  else {
    manuale();
  }
}

void manuale() { //modalità manuale
  lcd.home();
  lcd.print("******MANUALE*******");
//  Serial.println("Manuale");
  digitalWrite(ledmodo,LOW);
  
  //leggiamo i tasti premuti e accendiamo i led relativi
  lcd.setCursor(0,1);  
  if(digitalRead(pulsante1)==HIGH) { //pulsante 1
//    Serial.println("The button 1 is pressed");
    stato1=!stato1;
    delay(200); 
  }
  if (stato1==HIGH) {
    digitalWrite(binario1,HIGH);
//    Serial.println("Binario 1 ON");
    lcd.print("Bin.1 ON ");
  }
  else {
    digitalWrite(binario1,LOW);
    Serial.println("Binario 1 OFF");
    lcd.print("Bin.1 OFF");
  }
  lcd.setCursor(0,2);
  if(digitalRead(pulsante2)==HIGH) { //pulsante 2
//    Serial.println("The button 2 is pressed");
    stato2=!stato2;
    delay(200); 
  }
  if (stato2==HIGH) {
    digitalWrite(binario2,HIGH);
//    Serial.println("Binario 2 ON");
    lcd.print("Bin.2 ON ");
  }
  else {
    digitalWrite(binario2,LOW);
//    Serial.println("Binario 2 OFF");
    lcd.print("Bin.2 OFF");
  }
  lcd.setCursor(0,3);
  if(digitalRead(pulsante3)==HIGH) { //pulsante 3
//    Serial.println("The button 3 is pressed");
    stato3=!stato3;
    delay(200); 
  }
  if (stato3==HIGH) {
    digitalWrite(binario3,HIGH);
//    Serial.println("Binario 3 ON");
    lcd.print("Bin.3 ON ");
  }
  else {
    digitalWrite(binario3,LOW);
//    Serial.println("Binario 3 OFF");
    lcd.print("Bin.3 OFF");
  }
  lcd.setCursor(10,1);
  if(digitalRead(pulsante4)==HIGH) { //pulsante 4
//    Serial.println("The button 4 is pressed");
    stato4=!stato4;
    delay(200); 
  }
  if (stato4==HIGH) {
    digitalWrite(deviatoio1,HIGH);
//    Serial.println("Deviatoio 1 ON");
    lcd.print("Dev.1 Nonc");
  }
  else {
    digitalWrite(deviatoio1,LOW);
//    Serial.println("Deviatoio 1 OFF");
    lcd.print("Dev.1 Corr");
  }
  lcd.setCursor(10,2);
  if(digitalRead(pulsante5)==HIGH) { //pulsante 5
//    Serial.println("The button 5 is pressed");
    stato5=!stato5;
    delay(200); 
  }
  if (stato5==HIGH) {
    digitalWrite(deviatoio2,HIGH);
//    Serial.println("Deviatoio 2 ON");
    lcd.print("Dev.2 Nonc");
  }
  else {
    digitalWrite(deviatoio2,LOW);
//   Serial.println("Deviatoio 2 OFF");
    lcd.print("Dev.2 Corr");
  }

  lcd.setCursor(10,3);
  if(analogRead(sensore1)<512) { //sensore 1
//    Serial.println("Sensore 1 ON");
    lcd.print("B1");
    lcd.write(byte(1));
  }
  else {
//    Serial.println("Sensore 1 OFF");
    lcd.print("B1");
    lcd.write(byte(0));
  }
    lcd.setCursor(13,3);
  if(analogRead(sensore2)<512) { //sensore 2
//    Serial.println("Sensore 2 ON");
    lcd.print("B2");
    lcd.write(byte(1));
  }
  else {
//    Serial.println("Sensore 2 OFF");
    lcd.print("B2");
    lcd.write(byte(0));
  }
  lcd.setCursor(16,3);
  if(analogRead(sensore3)<512) { //sensore 3
//    Serial.println("Sensore 3 ON");
    lcd.print("B3");
    lcd.write(byte(1));
  }
  else {
//    Serial.println("Sensore 3 OFF");
    lcd.print("B3");
    lcd.write(byte(0));
  }
}

void automatico() { //modalità automatica
  lcd.home();
  lcd.print("*****AUTOMATICO*****");
//Serial.println("Automatico");
  digitalWrite(ledmodo,HIGH);
}


ED

Avatar utente
IpGio
Socio GAS TT
Messaggi: 3546
Iscritto il: domenica 20 maggio 2018, 9:22
Nome: Giorgio
Regione: Lombardia
Città: Nerviano
Ruolo: co-amministratore
Stato: Non connesso

Re: Gestione precedenze su 3 binari con Arduino

#2 Messaggio da IpGio »

Mitico Edgardo... interessante applicazione di Arduino, su impianto ferromodellistico.
Grazie per la condivsione.
[253]
[36] IpGio
Giorgio Nihil difficile volenti
N/TT/H0-Ep.III-IT GASTT/FIMF
IpGio I plastici di Gio https://www.gtg3b.it

Avatar utente
58dedo
Socio GAS TT
Messaggi: 2393
Iscritto il: mercoledì 19 dicembre 2012, 17:17
Nome: Diego
Regione: Lombardia
Città: Rovellasca
Stato: Non connesso

Re: Gestione precedenze su 3 binari con Arduino

#3 Messaggio da 58dedo »

ragass, sabato pomeriggio vado a lezione di saldatura e componentistica [107] , mi auguro ti tornare imparato [106] e con la scheda completata e pronta per l'installazione sul modulo [101] [100]

Torna a “COLLEGAMENTI ELETTRICI”