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: Circuito stampato: PCB: Circuito sperimentale su bredboard: Display LCD: 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);
}