(Märklin) CAN-"asetinlaite" -projekti etenee -- hieman taustaa ja lisäyksiä

Keskustelua radan ja rakennusten sähköistämisestä. Digitaali / analogi järjestelmistä, vaihdemoottoreista ym.
Vastaa Viestiin
kari-g
Lämmittäjä
Viestit: 112
Liittynyt: 21.05.2007 22:38

(Märklin) CAN-"asetinlaite" -projekti etenee -- hieman taustaa ja lisäyksiä

Viesti Kirjoittaja kari-g » 19.02.2015 17:32

Lisäys 3.4.2016

Kun tämä tarina alkoi hieman aikaisemmin Rautatieasema:n puolella, niin laitan tähän muutaman ko sivuille (jotka siis nyt ovat kadonneet...) kirjoittamiani juttuja - selvyyden vuoksi. Saamani vastaukset olen jättänyt pois, koska minulla ei ole niihin copyleftejä eikä -rightejä.

==================================================

Aiheen kirjoittaja: junakerho
Aihe: CAN-väylä pienoisrautatien ohjaukseen
Lähetetty: 21.09.2013 22:33:24

Viesti:

Onko kukaan digijärjestelmien harrastaja/rakentaja tutustunut ns. CAN-väyläratkaisuun. CAN-väylä on alkujaan suunniteltu autovalmistajien tarpeisiin eli on siten erittäin luotettava ja häiriötön dataväylä.

Saksassa on parin-kolmen vuoden ajan ollut käynnissä ns. CAN-digital-Bahn -projekti (kts. http://can-digital-bahn.com, jossa on rustailtu yli kolmekymmentä erilaista CAN-väylää käyttävää signalointi/ohjaus- ym. laitetta pienoisrautatiekäyttöön.

Projektin lähtökohtana on ollut hyödyntää Märklin Mobile Station 2:ta 60653 ja keskusyksikköä 60113. "Tyhmä ohjain" 60653 kytkeytyy keskusyksikköön 60113 CAN-väylällä. 60113 siis dekoodaa 60653:lta tulevat komennot MM/DCC-muotoon ja yhdistää viestin rataan menevään sähkösyöttöön.

Keskusyksikössä on toinen liitin vapaana ja tähän voidaan liittää muita CAN-väylää käyttäviä laitteita. Ts. CAN-väylää pitkin tulevat viestit muuntuvat 60113:ssa MM/DCC-viesteiksi. Näin esim. voi ohjata vaihteissa olevia MM/DCC-dekoodereita - tai sitten käyttää väylään liitettyjä "dekoodereita". Itse asiassa Märklinin 60113:a ei tarvita lainkaan, jos CAN-väylää ei tarvitse yhdistää rataan. Väylään liitetyt laitteet osaavat viestiä toisilleen ilman erityistä "isäntää".

Märklin on vuonna 2008 julkaissut käyttämänsä CAN-väyläspeksin http://medienpdb.maerklin.de/produkte/p ... ll_1-0.pdf

//kari g
----
Kirjoittaja: junakerho
Päiväys: 13.11.2014 17:49:25

Viesti:

CAN-väylän soveltamisessa pienoisrautatien ohjaamiseen olen lähtenyt ehkä vähän epäortodoksiselle linjalle:
Arduino Uno & CAN shield & Märklin 60113 boksi - ohjaa vaihteita yms, Roco Multimaus puolestaan junia. Ts. radassani on kaksi erillistä DCC-väylää.

Arduino & CAN ratkaisussa käytän Railuino-kirjastoa (https://code.google.com/p/railuino/). Kokeilin jo yksinkertaisella testisoftalla miten vaihteet kääntyvät - toimii!
"Asetinlaitepöydän" painonappien liitäntä & ohjaussofta tulee olemaan oma kehitelmäni. Pöydän nappien (yksi nappi & 2 lediä / vaihde, 24 vaihdetta) ja suuntaledien ohjaukseen käytän Arduinon I2C-väylää & MCP23017SP -piirejä.

Railuino kirjasto toimii hienosti Arduino Unolla ja Watterott Electronic'ilta ostetulla "CANdiy-Shield V2 - CAN-Bus Shield" (Art.Nr.: 20110452, 15 €) ja siihen tarvittavalla Märklin-kaapelilla "Railuino Komponenten" (Art.Nr.: 20110460, 4,00 €).

//kari
-----

CAN-"asetinlaite" -projektini on nyt edennyt siihen vaiheeseen, että olen saanut vaihteet kääntymään (!!).

Testijärjestelmässä Arduino Uno:on on koplattu I2C-väylän kautta yksi MCP23017 & kaksi lediä & kaksi painonappia. CAN-shield on yhdistetty kaapelilla Märklinin MM2:een (60113 -purkki) ja siitä sitten DCC-sähköt vaihteiden dekoodereihin.

Tuleva asetinlaitteeni on nyt tämän näköinen.

Kuva

Vaihteiden ohjaamiseen käytän vain yhtä painonappia/vaihde. Indikaattoreina kaksi suorakulmaista keltaista lediä -- ledit näkyvät kuvassa vähän heikosti.

Kuva

Testilaitteisto on tämmöinen.
Märklin MM2 - yhdistetty punaisella kaapelilla CAN-shieldiin, jonka alla on Arduino Uno. Unoon liitetty 1x16 merkin näyttö. Kytkentälevyllä 1 kpl MCP23017, kaksi lediä, kaksi (kuvassa kolme) painonappia.

Kuva

Kun vaihde käännetään napilla, näkyy näytösä hetken aikaa vaihteen nro ja suunta. Sen jälkeen näyttöön palautuu **Odotustila**. Huom ko kuvassa ei (vielä) ole CAN-kaapeli kiinni, kun oli vasta pöytätestit menossa.

Kuva

Arduinon softasta sen verran, että vaihteiden ohjausohjelma & I2C-piirien käyttö nappien tunnistamiseen ja ledien ohjaamiseen on oma viritykseni - pieni tilakone. CAN/Märklin -softana on Jörg Pleumann'in Railuino-kirjasto. I2C:n Wire-kirjasto on Arduinon vakiotavaraa.
Pienenä vinkkinä asiasta innostuneille, että Watterott'in CAN-shield käyttää keskeytystä INT0. MCP23017-piireiltä tulee napin painalluksella keskeytys linjaan INT1. Kun vaihteita on 26 kpl niin nappien/ledien ohjaamiseen tarvitaan 4 kpl MCP23017-piirejä. Kytkentä tulee olemaan
tämmöinen (linkki korjattu 3.4.2016).

-----
Korjattu 2.5.2015 --- kytkentää olen joutunut useampaan kertaan muuttamaan kun olen miettinyt mikä on paras tapa liittää painonappi/ledi-yhdistelmään menevä johdotus.
-----

Joku tietenkin heti kysyy, että missäs tilassa vaihteet ovat kun sähköt kytketään. Tämä hoidetaan siten, että Arduinon käynnistyessä ajetaan ensin kaikki vaihteet "suoraan". Jos välillä on vaihteita ohjattu ilman Arduinoa, niin näin Arduinoon tallentuu oikea aloitustila.

Semmoinen havainto tuli vastaan kun testasin Märklin-purkkia DCC-asennossa, että vaihdeohjauksen "kantaosoite" ei ole 0x3800, vaikka Märklinin CAN speksi (CAN CS2 Protokoll - 2.0.doc, sivu 8 ) näin väittää, vaan 0x3800-1 (!). Siis jos kantaosoitteena käyttää 0x3800 ja yrittää kääntää vaihdetta nro 10, niin kääntyy vaihde 11 (!!). Testasin ko kummajaisuutta Pleumannin "Sniffer"-ohjelmalla, joka vain näyttää mitä CAN-väylässä liikkuu. Toden totta - kun MM2:lla kääntää vaihdettä 10, niin CAN-sanomassa näkyy datana 0x3809. Pleumann ei itse ollut tätä huomannut, kun hän ohjailee vaihteita Märklin-protokollalla.

Seuraavaksi taidan lisätä muutaman napin a'la Siemens SpDrS - ensiksi vaikkapa WGT eli Weichengruppentaste. Vaihteen kääntäminen tapahtuu painamalla WGT alas ja sitten haluttu vaihdenappi.

Joskus myöhemmin ehkä lisään kulkutien asetuksia/purkuja ym. hienouksia.

//kari

----

Sitten joku kysyi miten Arduinon kapasiteetti riittää. Tähän kysymykseen vastasin näin:

Kirjoittaja: junakerho
Päiväys: 22.02.2015 10:28:44

Viesti:

Yksi Uno riittää hyvin. Kun "ei tehdä mitään", ei Arduino myöskään tee oikeastaan mitään, odottelee vain tulisiko MCP23017 piireistä keskeytys.
Koodina suunnilleen näin:

volatile boolean nappia_painettu;

----
void setup()
{
...

for (i=0, i<4, i++) // neljä x MCP23017
{
...
i2C_Write (portti, IPOLA, 0xFF); // invert polarity of signal - A ports
// keskeytys kun portti kytketään +5V:iin
...
}

...
attachInterrupt(1, keskeytys, FALLING); // MCP23017 keskeytys -> INT.1
...

}
----

void keskeytys():
{
nappia_painettu = true:
}

----

loopin sisällä...

switch (tilatieto) // haaraudutaan tilatiedon mukaan

...
case tila_11_odotus; // tässä odotellaan että jotakin tapahtuisi...
if (nappia_painettu)
{
tilatieto = tila_12_keskeytetty;
}
break;
...

----

Keskeytys tulee kun jotakin nappia painetaan.
Näitä MCP23017 piirejä voi laittaa kahdeksan samaan I2C-väylään. Portteja on silloin yhteensä 8x16 = 128, mikä riittänee ainakin kotiratoihin. Kukin portti voi olla IN tai OUT, eli tutkia nappeja tai ohjata ledejä tms.
Tämä 26:n vaihteen softa on kooltaan 13626 tavua (maks 32256), muuttujat vievät 1108 tavua (54%).
Eli lisätoiminnoille on Arduino Uno:ssa vielä hyvin tilaa.

//kari

---

Kirjoittaja: junakerho
Päiväys: 23.02.2015 00:20:40

Viesti:

Tämä Arduinon ja CAN-väylän soveltaminen johtuu vain siitä, että haluan radan vaihteiden / opastimien jne toimivan ILMAN isoa tietokonetta (lue: PC).

Tarkoituksena on ajaa junia ihan käsin ohjaten (Roco Multimaus), ei automaatilla. Samoin vaihteiden kääntäminen ym lisätoiminnot (... kunhan ehditään...) tehdään "käsipelillä" nappeja painellen.

Tähän mennessä investoinnit ovat olleet:
-- Märklin 60653 & 60113 -- noin 120,-
-- Arduino Uno -- n. 20,-
-- Watterott CAN-shield -- 15,-
-- Kaapeli edelliseen -- 4,-
Lisäksi 26 painonappia, 52 lediä, 78 vastusta

Joten rahallisesti ollaan vielä kaukana LOCONET, Intellibox ym. systeemeistä.

//kari
------

Kirjoittaja: junakerho
Päiväys: 19.03.2015 14:17:48

Viesti:

CAN-asetinlaiteprojektini on nyt edennyt I2C-väylään liittyvien komponenttien asentamiseen.

Suunnittelin MCP23017-piirien sijoittelun/langoituksen verolevylle käyttäen http://fritzing.org sivuilta ilmaiseksi ladattavaa ohjelmistoa. Tämmöinen siitä tuli (kuva alla). Jotenkin on helpompaa (?) suunnitella ruudulla kuin paperilla. Ainakin tulee dokumentoitua paremmin ja Fritzing osaa kertoa IC-piiristä mikä nasta on mikäkin, niin ehkä ei tule niin paljon virheitä.

Hommasin rakentelua helpottamaan Saksasta Flikto.de -nimisestä kaupasta Arduinon päälle paremman ruuviliitin-shieldin Proto-Screwshield (Wingshield) R3 Kit for Arduino
ja vielä ihan mielenkiinnosta pienen realiaikakellon Adadfruit DS1307 Real Time Clock Breakout Board Kit, joka liittyy Arduinoon myös I2C-väylän kautta. On siis ihan tavallinen kello, eikä nopeutettu pienoisrautatiekello. Arduinon softalla voi tietenkin laittaa kellon lukemaan vauhtia maun mukaan.

Aikaan asetus menee Arduinon ohjelmalla "käsin koskematta", eli kelloon asettuu käännöshetkellä PC:n päiväys & kellon lukema. Kun kello on kerran laitettu aikaan, niin uusintoja ei tarvita, kun kellon pitäisi omalla patterillaan pelata jopa viisi vuotta.

Korjaus 22.3.2015 ---
Hyvin suunniteltu on puoliksi jne jne.
Nyt kävi niin, että suunniteltu piirilevy ei mahtunutkaan sille varattuun paikkaan - vaikka äkkiseltään olisi luullut.
Tässä nyt uusi versio - RTC muutettu eri paikkaan.

Korjaus 1.4.2015
RTC vielä kerran uuteen paikkaan. Lisätty 8-piikkiset "headerit" MCP23017:n viereen. Kun laitetaan liittimet, niin huolto/lisäys on helpompaa. Luulisin.

Kuva

//kari
-----

Kirjoittaja: junakerho
Päiväys: 19.08.2015 19:48:25

Viesti:

Paljon on vettä virrannut Vantaanjoessa jne ...
Nyt sitten olen kesätauon (?) jälkeen koodannut ja testannut ja koodannut ja testannut.

Ja se toimii !!

Arvokasta apua olen saanut jälkikasvulta, joka työskentelee isompien koodijuttujen parissa (LTE-mobiiliteknologia jne.).
Kun kysyin apua muutamaan funktiokutsua koskevaan ongelmaan, tuli vastauksena ettei laatimani koodipätkä "noudata hyvää ohjelmointitapaa".
Sitten vaan mietintä uusiksi, ja toden totta, uudella ryhmittelyllä hommasta tuli huomattavasti selkeämpi. Siis: kannattaa kysyä ammattikoodaajalta. MOT.

Eniten päänvaivaa aiheutti MCP23017:n keskeytyksen käsittely kun nappia painetaan pitkään. Lyhyt painallus toimi oikein, mutta pitkä painallua käänsi vaihteen takaisin alkuasentoon. Ts. MCP23017 aiheutti uuden keskeytyksen kun nappi palautui. Piti ottaa avuksi pieni Velleman HPS140i - "pocket scope", jolla näki hyvin miten keskeytyssignaali käyttäytyy. On muuten ihan kätsy laite kotinikkarin tarpeisiin.

Seuraavaksi alkaa koko komeuden liittäminen pöydän nappeihin ja ledeihin.
Sitten katsotaan miten i2C-väylä kestää DCC:n häiriösäteilyä.

Nyt ohjelman koko on 13906 tavua (maks 32256 tavua)
Dynaamista muistia käytetään 1131 tavua (maks 2048 tavua)

Nappien / ledien kytkentä testauksen myötä hieman muuttunut. Nyt se on
tämmöinen http://personal.inet.fi/kerho/junakerho ... _09_TT.pdf

//kari

Vastaa Viestiin