|
| 1 | +# Tosi Köyhän Miehen logiikkasimu Arduinolle |
| 2 | + |
| 3 | +plc.h/plc.cpp yhdessä IOExpander-laajennuspiirilevyn kanssa toteuttaa pienen avoimen logiikkasimulaattorin. |
| 4 | +Määriteltyjä toimintoja on mahdollista muokata tarpeen mukaan sekä toteuttaa kokonaan uusia toimintoja. |
| 5 | +Seuraavassa lyhyt läpikäynti ohjelman ominaisuuksista ja toiminnasta. |
| 6 | + |
| 7 | +## PLC:n konfigurointi |
| 8 | + |
| 9 | +Konfigurointi tehdään asettamalla tiedoston "plcconfig.h" sisältämät #define -määritykset haluttuihin arvoin. |
| 10 | +Niiden merkitys on seuraava: |
| 11 | + |
| 12 | +TIMERTICK: ( oletusarvo #define TIMERTICK 1000 ) |
| 13 | +Logiikkaohjelman käyttämien ajastimien ja pulssigeneraattoreiden aikaresoluutio millisekunteina. |
| 14 | +Ohjelma ei mitenkään testaa annetun arvon järkevyyttä, joten kannattaa varoa laittamasta liian pientä arvoa. |
| 15 | +Totuus selviää kyllä kokeilemalla. |
| 16 | + |
| 17 | +SPICLOCK: ( oletusarvo #define SPICLOCK 1000000 ) |
| 18 | +Tuloja ja lähtöjä ohjaavien siirtorekisterien kellotaajuus. Oletusarvo on 1MHz eikä tätä ole normaalisti tarvetta muuttaa. |
| 19 | + |
| 20 | +BITSPACE: ( oletusarvo #define BITSPACE 32 ) |
| 21 | +Logiikan bittimuuttujille varattu muistitila. Jokainen muuttuja vie yhden bitin verran tilaa muistissa (mikä yllätys). |
| 22 | +Ohjelma pystyy siis käsittelemään bittejä 8 * BITSPACE määrän, eli oletusarvoisesti 256 bittiä (signaalia). |
| 23 | +Huomaa, että fyysiset tulosignaalit luetaan bittimuuttujiin 0...15 ja fyysiset lähtösignaalit kirjoitetaan bittimuuttujista 16...31. |
| 24 | +Huomaa myös, että mikäli BITSPACE > 32, kaikki ohjelman signaaliviittaukset muuttuvat 8-bittisistä referensseistä 16-bittisiksi eikä tätä ole kunnolla testattu: |
| 25 | + |
| 26 | + #if BITSPACE <= 32 |
| 27 | + typedef uint8_t logicBit; // type for bit variable references |
| 28 | + #else |
| 29 | + typedef uint16_t logicBit; |
| 30 | + #endif |
| 31 | + |
| 32 | +INTSPACE: ( oletusarvo #define INTSPACE 16 ) |
| 33 | +Logiikan numeerisille muuttujille varattu tila. Kaikki numeeriset muuttujat ovat etumerkittömiä 16-bittisiä kokonaislukuja ( uint16_t ). Muuttujatilaa kannattaa varata riittävästi, mutta ei liioitellusti koska RAM-muisti on kortilla pikku Arduinossa. Kunkin logiikkamodulin tarvitsema tilavaraus on mainittu sen esittelyssä. |
| 34 | + |
| 35 | +MAXTIMERS: ( oletusarvo #define MAXTIMERS 8 ) |
| 36 | +Tilavaraus logiikan ajastimille. Varaus tehdään samalla periaatteella kuin yllä. |
| 37 | + |
| 38 | +MAXCOMPONENTS: ( oletusarvo #define MAXCOMPONENTS 64 ) |
| 39 | +Tilavaraus komponenttilistalle. Määrittelemässäsi logiikkaohjelmassa voi olla enintään näin monta yksittäistä modulia. Älä ylitä tätä lukemaa! |
| 40 | +Kaikki Arduinon setup():issa luodut logiikkalohkot lisätään yksinkertaiseen jonolistaan, josta ne suoritetaan peräjälkeen jokaisella loop():in kierroksella. Toteutus on tehty näin yksinkertaisuuden ja suoritustehokkuuden takia. Joudut kuitenkin olemaan lievästi huolellinen, eli laskemaan, että määrittelemäsi lohkot mahtuvat listalle. Jokainen lohko siis vaatii yhden listaelementin. |
| 41 | + |
| 42 | +INVERT_INPUTS: ( oletusarvo #define INVERT_INPUTS ) |
| 43 | +Mikäli määritys INVERT_INPUTS on tehty, jokainen tulosignaali käännetään ympäri, eli looginen '1' muuttuu '0':ksi ja päinvastoin. |
| 44 | +HUOMAA, että IOExpanderin tulosignaali on aktiivinen alaspäin, eli ledi valaisee kun tulosignaalin tila on '0'. |
| 45 | +Kun signaali on '1' tai kytkemätön, ledi ei pala. Ohjelmaan välittyy kuitenkin kyseinen tila, eli kytkemätön tulo luetaan '1'-tilaiseksi. Useimmiten tämä ei ole toivottua, vaan signaali halutaan tulkita niin, että se on '1' kun ledi valaisee. Siispä invertoidaan tulot jolloin ajatus toteutuu. Jos invertointia EI haluta käyttää, riittää että tämä #define kommentoidaan pois: //#define INVERT_INPUTS |
| 46 | + |
| 47 | +## Arduino |
| 48 | + |
| 49 | +PLC haluaa expanderikortille Arduino Micron. Ole tarkkana minkä kapineen kortille länttäät, koska kaikki eBay-tavara yms ei ole originaalispeksin mukaista. Käytetyn Ardun pinnijaon pitää olla 1:1 originaali Arduino Micron kanssa - esim. Arduino Nano EI KÄY. Micro on valittu koska vain siitä saa välttämättömän SPI-väylän suoraan ulos pinneistä. Ardu asennetaan siten, että sen USB-liitin tulee kohti piirilevyn ulkoreunaa. Moduli nvoi juottaa suoraan kiinni tai mikäli haluaa varmistella, niin voi käyttää myös korokeheadereita jolloin Ardun saa vielä irtikin. |
| 50 | +Arduinon voi ohjelmoida etuykäteen, tai se onnistuu myös piiri kiinnitettynä jolloin sitä varten irroitettavuutta ei tarvita. |
| 51 | + |
| 52 | +## Sähköiset kytkennät |
| 53 | + |
| 54 | +1. Syöttöjännite ( n. 12V) kytketään kortin "alareunassa" keskellä olevaan pieneen riviliittimeen. Positiivinen johto vasemmalle, maa oikealle. Liitäntä on suojattu väärää napaisuutta vastaan. |
| 55 | +2. Anturit kytketään vasemman reunan 3-pinnisiin pistoliittimiin. Liittimet on merkitty silkkipainoon [+ s -] ja samassa järjestyksessä signaalit ovat: +: +5V syöttö anturille; s: tulosignaali (+5V <-> 0V); -: 0V syöttö anturille. Tulosignaali aktivoituu kun s-pinni maadoitetaan - pinniin. s-pinnin kytkeminen + pinniin ei tee mitään, mutta VARO oikosulkemasta + ja - pinnejä keskenään. |
| 56 | +3. Lähdöt kytketään oikean reunan 2-pinnisiin liittimiin. Oletus on, että kuorma on solenoideja tms joiden napaisuudella ei ole väliä, mutta jos on, niin lähdön +-napa on piirilevyn ulkoreunasta sisäänpäin katsoen oikeanpuoleinen pinni. Vasen menee kytkinfetille ja siitä maahan. VARO siis oikosulkemasta oikeanpuoleisia pinnejä maahan koska niissä on koko ajan jännite ja laitteessa ei ole ylivirtasuojausta (toivottavasti käyttämässäsi virtalähteessä on). |
| 57 | + |
| 58 | +## Lisäkytkennät |
| 59 | + |
| 60 | +Ardu Micron normaalit digitaaliset ja analogiset I/O-piirit on tuotu expanderille Ardumodulin viereen juotosreikiin. |
| 61 | +Digitaalisignaalit D4 ... D10 on tuotu suoraan 0,1" reikäriviin jonka viimeinen reikä (D10 puoleinen pää) on maajännite. Tähän voi kolvata johtimia suoraan tai laittaa headerin protojohtoja varten. |
| 62 | +Vastaavasti analogisignaalit A0 ... A5 on tuotu Ardun vasemmalle puolelle kukin 3-reikäiseen headerpaikkaan. Headerin pinni 1 (neliötäppä, oikeanpuoleinen) on +5V syöttö esim potikalle, pinni 3 (vasen) on maa. Analogisignaali luetaan keskipinnistä 2 ja siihen on kytketty pieni RC-suoto nappaamaan pahimmat jännitepiikit pois. HUOMAA kuitenkin, että analogisignaalit kohisevat aina eikä logiikkaohjelman analogitulolohkossa ole varsinaista suodatusta koska se on raskasta puuhaa prosessorille. Älä siis kuvittele, että signaalit olisivat ideaalisen rauhallisia, vaikka olisit kytkenyt pelkän potikan tuloon. |
| 63 | +Juotostäppä Aref edellisten vasemmalla puolella on kytketty (yllätys) prosessorin analogireferenssiin. Sitä voi käyttää datalehden mukaisesti mikäli taretta ilmenee. |
| 64 | +Edellisen vieressä on toinenkin tuotostäppä, merkattu D201. Se on kytketty Arduinon digitaalilähtöön D13, joka puolestaan on kytketty Ardumodulin lediin. |
| 65 | +Piirilevyn laidasta Ardun toisella puolella löytyy vielä täppä "SS" joka on kytketty signaaliin RX_LED/SS. |
| 66 | + |
| 67 | +Edellisten lisäksi expanderilta löytyy liitinpaikat I2C-väylälle ja SPI-väylän laajennukselle, tarkoituksena mahdollistaa useampien expanderien kytkeminen ryhmään. Näitä ei ole testattu mitenkään, joskaan ei ole mitään erityistä syytä miksi eivät toimisi. Joka niitä tarvitsee osaa varmaan käyttää niitä ilman erityisempää ohjeistusta tässä. Ardun oikealta puolelta löytyy 2 kpl juotos-oikosulkutäppiä jotka merkattu "I2C TERM.". Juottamalla nämä umpeen saadaan voimaan I2C-väylän 4,7kohm ylösvetoterminointi. |
0 commit comments