Decoder funzioni con ATtiny85
-
- Assistente di Stazione
- Messaggi: 1767
- Iscritto il: martedì 7 marzo 2006, 7:26
Decoder funzioni con ATtiny85
E' forse meglio aprire un topic ad hoc per questa applicazione sempre basata su micro tiny85.
Obiettivo è collegare un segnale in modo che risponda ad un indirizzo DCC e poi tramite F1 proietti luce verde, tramite F2 proietti luce rossa; lasciando entrambe le funzioni attive verrà proiettata luce gialla (entrambi i led accesi).
Per realizzare il decoder avremo bisogno di un micro tiny85, un optoisolatore per interfacciare il binario e due led (o un segnale). Costo totale dell'HW necessario alla realizzazione del decoder circa 4€.... non male ....
Qui si trova lo schema dell'optoisolatore
https://rudysmodelrailway.files.wordpre ... matic1.png
questo è lo schema complessivo: e questo è lo sketch:
int decoderAddress = 15; // This is the decoder address.
#define F1_pin 3 // Available pin numbers: 0,1,3,4,5
#define F2_pin 4
#include <DCC_Decoder.h>
#define kDCC_INTERRUPT 0
byte Func[4]; //0=L4321, 1=8765, 2=CBA9, 3=F20-F13, 4=F28-F21
byte instrByte1;
int Address;
byte forw_rev=1; //0=reverse, 1=forward
boolean RawPacket_Handler(byte pktByteCount, byte* dccPacket) {
Address=0;
if (!bitRead(dccPacket[0],7)) { //bit7=0 -> Loc Decoder Short Address
Address = dccPacket[0];
instrByte1 = dccPacket[1];
}
else if (bitRead(dccPacket[0],6)) { //bit7=1 AND bit6=1 -> Loc Decoder Long Address
Address = 256 * (dccPacket[0] & B00000111) + dccPacket[1];
instrByte1 = dccPacket[2];
}
if (Address==decoderAddress) {
byte instructionType = instrByte1>>5;
switch (instructionType) {
case 2: // Reverse speed
forw_rev=0;
break;
case 3: // Forward speed
forw_rev=1;
break;
case 4: // Loc Function L-4-3-2-1
Func[0]=instrByte1&B00011111;
break;
case 5: // Loc Function 8-7-6-5
if (bitRead(instrByte1,4)) {
Func[1]=instrByte1&B00001111;
}
else { // Loc Function 12-11-10-9
Func[2]=instrByte1&B00001111;
}
break;
}
if (Func[0]&B00000001) digitalWrite(F1_pin,HIGH); else digitalWrite(F1_pin,LOW);
if (Func[0]&B00000010) digitalWrite(F2_pin,HIGH); else digitalWrite(F2_pin,LOW);
}
}
void setup() {
DCC.SetRawPacketHandler(RawPacket_Handler);
DCC.SetupMonitor( kDCC_INTERRUPT );
pinMode(0, OUTPUT);
pinMode(1, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
}
void loop() {
DCC.loop();
}
Obiettivo è collegare un segnale in modo che risponda ad un indirizzo DCC e poi tramite F1 proietti luce verde, tramite F2 proietti luce rossa; lasciando entrambe le funzioni attive verrà proiettata luce gialla (entrambi i led accesi).
Per realizzare il decoder avremo bisogno di un micro tiny85, un optoisolatore per interfacciare il binario e due led (o un segnale). Costo totale dell'HW necessario alla realizzazione del decoder circa 4€.... non male ....
Qui si trova lo schema dell'optoisolatore
https://rudysmodelrailway.files.wordpre ... matic1.png
questo è lo schema complessivo: e questo è lo sketch:
int decoderAddress = 15; // This is the decoder address.
#define F1_pin 3 // Available pin numbers: 0,1,3,4,5
#define F2_pin 4
#include <DCC_Decoder.h>
#define kDCC_INTERRUPT 0
byte Func[4]; //0=L4321, 1=8765, 2=CBA9, 3=F20-F13, 4=F28-F21
byte instrByte1;
int Address;
byte forw_rev=1; //0=reverse, 1=forward
boolean RawPacket_Handler(byte pktByteCount, byte* dccPacket) {
Address=0;
if (!bitRead(dccPacket[0],7)) { //bit7=0 -> Loc Decoder Short Address
Address = dccPacket[0];
instrByte1 = dccPacket[1];
}
else if (bitRead(dccPacket[0],6)) { //bit7=1 AND bit6=1 -> Loc Decoder Long Address
Address = 256 * (dccPacket[0] & B00000111) + dccPacket[1];
instrByte1 = dccPacket[2];
}
if (Address==decoderAddress) {
byte instructionType = instrByte1>>5;
switch (instructionType) {
case 2: // Reverse speed
forw_rev=0;
break;
case 3: // Forward speed
forw_rev=1;
break;
case 4: // Loc Function L-4-3-2-1
Func[0]=instrByte1&B00011111;
break;
case 5: // Loc Function 8-7-6-5
if (bitRead(instrByte1,4)) {
Func[1]=instrByte1&B00001111;
}
else { // Loc Function 12-11-10-9
Func[2]=instrByte1&B00001111;
}
break;
}
if (Func[0]&B00000001) digitalWrite(F1_pin,HIGH); else digitalWrite(F1_pin,LOW);
if (Func[0]&B00000010) digitalWrite(F2_pin,HIGH); else digitalWrite(F2_pin,LOW);
}
}
void setup() {
DCC.SetRawPacketHandler(RawPacket_Handler);
DCC.SetupMonitor( kDCC_INTERRUPT );
pinMode(0, OUTPUT);
pinMode(1, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
}
void loop() {
DCC.loop();
}
Ultima modifica di Luca Regoli il venerdì 25 marzo 2016, 12:40, modificato 2 volte in totale.
-
- Assistente di Stazione
- Messaggi: 1767
- Iscritto il: martedì 7 marzo 2006, 7:26
Re: Decoder funzioni con ATtiny85
L'anodo del led verde è collegato al pin 3, mentre l'anodo del led rosso al pin 4. Il comune catodo verrà collegato a massa sul pin apposito dell'ATTiny85
Re: Decoder funzioni con ATtiny85
E l'alimentazione ?
Dopo aver letto il data sheet del 6N137 consiglierei di cambiare le resistenze.
Dopo aver letto il data sheet del 6N137 consiglierei di cambiare le resistenze.
-
- Assistente di Stazione
- Messaggi: 1767
- Iscritto il: martedì 7 marzo 2006, 7:26
Decoder funzioni con ATtiny85
Per ora, visto che è un prototipo da laboratorio, l'alimentazione proviene dalla presa usb del pc che utilizzo per caricare lo sketch. Va da sè che, aldilà dell'entusiasmo che ci porta a pronunciare "funziona!!!!", ora serve una fase di reingegnerizzazione del circuitino dell'optoisolatore dal quale va prelevato anche la tensione di alimentazione. Pensavo di spillare sia la 5v che una 12v per pilotare le strip di led x l'illuminazione delle carrozze inserendoci anche un bel condensatore tampone.
Che il circuito dell'optoisolatore abbia qualche problemino, me ne ero accorto in quanto la resistenza da 1k sull'ingresso dcc scalda troppo... Ci hai già lavorato? Che resistenza consigli?
Che il circuito dell'optoisolatore abbia qualche problemino, me ne ero accorto in quanto la resistenza da 1k sull'ingresso dcc scalda troppo... Ci hai già lavorato? Che resistenza consigli?
Re: Decoder funzioni con ATtiny85
Lo uso da tempo questo schema e ne ho una ventina in funzione.
Io uso una 4.7k, in ingresso, non ho mai avuto problemi.
Io uso una 4.7k, in ingresso, non ho mai avuto problemi.
Re: Decoder funzioni con ATtiny85
Infatti il data sheet mostra che 3 mA nel LED bastano per farlo funzionare, anche se consigliano un minimo di 6 mA.
http://www.mouser.com/ds/2/38/V02-0940E ... 844836.pdf fig.2 a pag. 14
La resistenza sul pin 7 non serve a niente, si collega direttamente a Vcc.
Volendo mettere l'optocoupler con uscita logica ce ne sono altri piu' piccoli e che consumano meno, come questo
http://www.mouser.com/ds/2/149/FODM8061-95625.pdf
ma nel decoder di DCCworld citato prima l'optocoupler non c'e' e funziona benissimo lo stesso.
http://www.mouser.com/ds/2/38/V02-0940E ... 844836.pdf fig.2 a pag. 14
La resistenza sul pin 7 non serve a niente, si collega direttamente a Vcc.
Volendo mettere l'optocoupler con uscita logica ce ne sono altri piu' piccoli e che consumano meno, come questo
http://www.mouser.com/ds/2/149/FODM8061-95625.pdf
ma nel decoder di DCCworld citato prima l'optocoupler non c'e' e funziona benissimo lo stesso.
-
- Assistente di Stazione
- Messaggi: 1767
- Iscritto il: martedì 7 marzo 2006, 7:26
Re: Decoder funzioni con ATtiny85
Benissimo grazie, appena ho un attimo la cambio!Glifo ha scritto:Lo uso da tempo questo schema e ne ho una ventina in funzione.
Io uso una 4.7k, in ingresso, non ho mai avuto problemi.
Re: Decoder funzioni con ATtiny85
ma nel decoder di DCCworld citato prima l'optocoupler non c'e' e funziona benissimo lo stesso.[/quote]
Si è vero funziona molto bene anche senza l'opto,e risparmi spazio.
Se hai spazio, con l'opto è meglio per 2 motivi, il primo un segnale sicuramente migliore all'ingresso del pic, e il secondo la separazione galvanica ,che non fa mai male.
Si è vero funziona molto bene anche senza l'opto,e risparmi spazio.
Se hai spazio, con l'opto è meglio per 2 motivi, il primo un segnale sicuramente migliore all'ingresso del pic, e il secondo la separazione galvanica ,che non fa mai male.
-
- Manovratore
- Messaggi: 553
- Iscritto il: sabato 17 novembre 2007, 22:28
- Interesse per i treni reali: Si
- Interesse per i treni in modello: Si
- Località: Torino
- Contatta:
Re: Decoder funzioni con ATtiny85
Piuttosto che complicarsi la vita con un fotoaccoppiatore, io realizzerei una alimentazione x rendere autonoma la scheda. A tal riguardo consiglio per raddrizzare il Dcc un ponte rettificatore della famiglia MBS un condensatore al tantalio da 47 uF 25 V. La tensione raddrizzata si applica a Vin e gnd, il segnale DCC si preleva invece da una rotaia e tramite una resistenza da 2,2K e zener da 5 V ( tra segnale e massa) si applica al pin del micro. Costo della cosa circa 2-3 euro ma vantaggio enorme
Ciao
Despx
Ciao
Despx
Progettista di: KDCCX, KBoosterX, K652, KLed, KDec, K652toPluX16, KUPS.
Sito web: http://www.despx.it
Sito web: http://www.despx.it
-
- Assistente di Stazione
- Messaggi: 1767
- Iscritto il: martedì 7 marzo 2006, 7:26
Re: Decoder funzioni con ATtiny85
Grazie Paolo del contributo!
Non capisco però una cosa: consigli di mandare al Vin del micro la tensione proveniente dal raddrizzatore: sul pcb c'è un regolatore 7805, non scalderà un pò troppo sparandogli dentro circa14volts (considerando 16v del dcc meno la perdita del ponte)? Consigli una resistenza sull'ingresso Vin? Metto cmq subito in cantiere il tuo schema per provarlo e vedere se riesco a fare a meno dell'optoisolatore.
Siccome stavo pensando di comandare una striscia di led (quelli cinesi che si vendono al metro) x illuminare le carrozze, l'idea che avevo era quella di porre dopo il ponte un condensatore e un 7812 e da li inviare a Vin x l'alimentazione del tiny e per avere la 12 v per alimentare la striscia tramite un transistor pilotato da un'uscita. Probabilmente con una resistenza al posto del regolatore si risolve lo stesso visti bassi assorbimenti in gioco....
Farò un pò di prove, ma dammi la tua opinione; probabilmente hai già risolto il problema con una soluzione migliore!
Ciao!
Non capisco però una cosa: consigli di mandare al Vin del micro la tensione proveniente dal raddrizzatore: sul pcb c'è un regolatore 7805, non scalderà un pò troppo sparandogli dentro circa14volts (considerando 16v del dcc meno la perdita del ponte)? Consigli una resistenza sull'ingresso Vin? Metto cmq subito in cantiere il tuo schema per provarlo e vedere se riesco a fare a meno dell'optoisolatore.
Siccome stavo pensando di comandare una striscia di led (quelli cinesi che si vendono al metro) x illuminare le carrozze, l'idea che avevo era quella di porre dopo il ponte un condensatore e un 7812 e da li inviare a Vin x l'alimentazione del tiny e per avere la 12 v per alimentare la striscia tramite un transistor pilotato da un'uscita. Probabilmente con una resistenza al posto del regolatore si risolve lo stesso visti bassi assorbimenti in gioco....
Farò un pò di prove, ma dammi la tua opinione; probabilmente hai già risolto il problema con una soluzione migliore!
Ciao!