Arduino - poäng/valdeltagandet kontroll (2 / 3 steg)
Steg 2: DCC packet mottagare - grundläggande krets
Uppdaterad 23 mars 2016:
Lade till nuvarande bemärkelse krets att skydda valdeltagandet spolar och H-bryggenheter etc från över strömmen.
int analogPin = 7.
CONST int Power_shut_off = 19. A5 som digital
pinMode (Power_shut_off, OUTPUT);
digitalWrite (Power_shut_off, hög);
I void loop():
amp = analogRead(analogPin);
om (amp > 5) {
Serial.println(amp); }
om (amp > 200) {/ / ca 2 ampere
digitalWrite (Power_shut_off, låg); }
När 2 ampere överskrids, stänger den spets 120 av strömmen (12 volt eller 15 volts matning) till valdeltagandet.
_____________________________________________________________________
Från en utmärkt tutorial av Geoff Bunza i Modelljärnväg hobby Magazine forum. Det beskrev hur en Arduino Pro Mini (en låg kostnad Arduino ombord) kunde vara trådbunden och programmerad att svara på funktionstangenterna på en styrenhet för DCC. Detta öppnar upp en vida världen kontrollalternativ för animeringar, ljud och andra alternativ på en DCC utrustad modelljärnväg.
Jag har gjort denna krets att fånga DCC paket från min Arduino baserade kommando Station
(se instructable). Kommandot stationen har också ändrats så att valdeltagandet kontroll (8 växlar så långt).
Grundläggande tillbehör dekoder packet är:
0 10AAAAAA 0 1AAACDDD 0 EEEEEEEE 1
Från att analysera paketet används av Lenz (kompakt / Atlas) för poäng kontroll, jag har använt följande binära paketformat för byte 1 och 2:
tunAddr = 1
Valdeltagandet 1a: 1000 0001 1111 1000 / valdeltagandet 1b: 1000 0001 1111 1001
Valdeltagandet 2a: 1000 0001 1111 1010 / valdeltagandet 2b: 1000 0001 1111 1011
Valdeltagandet 3a: 1000 0001 1111 1100 / valdeltagandet 3b: 1000 0001 1111 1101
Valdeltagandet 4a: 1000 0001 1111 1110 / valdeltagandet 4b: 1000 0001 1111 1111
tunAddr = 2
------------------------------------------------------------------------------------------------------------
Valdeltagandet 5a: 1000 0010 1111 1000 / valdeltagandet 5b: 1000 0010 1111 1001
Valdeltagandet 6a: 1000 0010 1111 1010 / valdeltagandet 6b: 1000 0010 1111 1011
Valdeltagandet 7a: 1000 0010 1111 1100 / valdeltagandet 7b: 1000 0010 1111 1101
Valdeltagandet 8a: 1000 0010 1111 1110 / valdeltagandet 8b: 1000 0010 1111 1111
-----------------------------------------------------------------------------------------------------------
Valdeltagandet 9a: 1000 0011 1111 1000 / valdeltagandet 9b: 1000 0011 1111 1001
osv...
Genom manipulation av den binära paketen, kan vi extrahera det valdeltagandet krävs och skickar en puls av 350 ms.
T.ex.
tittar på första byte:
0x80 i HEX = 1000 0000 i binär
tunAddr = (Msg -> Data [0] - 0x80).
titta på andra byte:
0x8f8 i HEX = 1111 1000 i binär och sedan skifta bitvis >> 1 att undanröja sista biten
F1A på:
om (tunAddr == 1) {
om (((Msg -> Data[1]) - 0xf8 >> 1) + 1) == 1 & & (Msg -> Data [1] & 0x01) == 1) {
digitalWrite (FunctionPin1a, 1);
Delay(350);
digitalWrite (FunctionPin1a, 0); }
Diagrammet visar LED utgångar. Ersätta lysdioder med magnetventil drivrutiner e.g. TIP120 (2 av krävs för varje valdeltagandet) eller SN754410 Quad drivrutin (nätaggregat 2 valdeltagandet per IC).
Alla digitala utgångar används parvis för att producera en puls som bränder valdeltagandet solenoider via motor förare eller power darlington transistorer. Koden kan ändras för att matcha de drivrutiner som används från en '1' puls till en '0' puls.
Hämta NMRA biblioteket här
Hämta Arduino koden: