Styra reläer med ett webbinterface

Webbinterfacet har jag skrivit med php och det är krångligt att få till en bra USB-kommunikation därifrån. Därför valde jag en lite annorlunda väg som visar sig fungera riktig bra, även om flera skulle vara inne på samma webbsida samtidigt.

Varje kommando som användaren skickar genom att klicka på en växel eller ett spår skrivs med php in i en mysql-databas. Samtidigt har jag på min raspberry pi ett python-skript som kontinuerligt letar efter nya rader i databasen, tolkar dessa och skickar rätt kommando via USB till Arduino-kortet.

För att minska belastningen av SD-kortet sparas denna tabell i databasen enbart i minnet. Det görs med kommandot engine=memory. Nackdelen med att ha tabeller enbart i minnet är att innehållet försvinner när datorn stängs av. Men eftersom kommandos bara sparas i den en mycket kort tid, tills python-skriptet har läst och tagit bort raden ut tabellen, är det i det här fallet inget problem.

För att få till en bra svarstid fick jag göra en liten anpassning på Arduino-kortet. Dels kommunicerar jag med 115200 baud (standard är 9600) och så satte jag den seriella timeouten till 50ms, standard är 1000ms.

void setup() {
Serial.begin(115200);
Serial.setTimeout(50);


}

Skillnaden mellan 9600 baud och 115200 baud märks faktiskt inte, mina kommandos är bara några enstaka tecken. Däremot blev det stor skillnad när jag ändrade Serial.setTimeout till 50ms. Denna tid specificerar hur många millisekunder Arduino-kortet fortsätter väntar på data efter att sista tecknet har tagits emot. Med andra ord, sålänge den var satt till 1000ms blev det alltid en fördröjning på 1s mellan att kommandot skickades tills den utfördes. Med 50ms, som fortfarande är tillräcklig lång, känns det som ingen fördröjning alls.

Skuggbangårdens styrsystem

Själva styrsystemet inklusive ett webbgränssnitt till skuggbangården är numera på plats. Min Raspberry Pi används både som webserver och som huvudcontroller till det USB-anslutna Arduino-kortet, som i sin tur ställer reläerna till växlarna och spåren samt skickar tillbaka information om vilka spår som är upptagna och vilka som är lediga.

 Stora reläkortet med de blåa kablarna och totalt 16 reläer uppe till vänster på bilden används för att styra växlarna. Det lite mindre med röda kablar och 8 reläer nedanför styr strömmen till de 7 spåren. Det lite ensamma reläet är min huvudströmbrytare som slår på eller av all ström till loken för hela skuggbangården. Det kan till exempel användas som nödstopp ifall man vill stoppa ett eller flera tåg oberoende på var de befinner sig. Det lilla kortet längst nere till höger är egentligen bara en strömfördelare.

Det mest spännande kortet, i mitten, består av 2 stycken 16-kanal multiplexer (74HC4067), ett 8-bitars skiftregister (74HC595), en Arduino Nano samt några motstånd och kopplingstrådar. Jag har använd mig av både multiplexer och 74HC595 dels för att lära mig båda teknikerna och dels för att de har sina för och nackdelar. Ena multiplexer används för att styra reläerna till växlarna och det andra för att kunna koppla in upp till 16 analoga sensorer/värden (0-5V) till en analog ingång. 8-bitars skiftregistrer styr reläerna till spåren. Nackdelen med multiplexern jämfört med skiftregistret är att de kräver fler digitala utgånger från Arduinon samt att bara ett relä kan vara aktiv åt gången. Med skiftregistret kan flera reläer vara aktiva samtidigt, vilket är trevligt om man vill sätta på eller stänga av elen till flera spår oberoende av varandra. När det gäller växlarna så är det fullt tillräckligt att bara kunna styra ett relä åt gången. För att styra en växel slår jag på ett relä, väntar 100ms, och stänger sedan av reläet igen. 100ms är mer än tillräcklig med tid för växlarna att reagera och växla enligt önskemål.