Arduino Uno ja Laajennettu IO

Tervehdys!
Foorumia on tullut lueskeltua säännöllisen epäsäännöllisesti ja nyt sain sitten luotua tunnukset itelleni ja ajattelin jakaa kanssanne “pikku” projektin jota tuossa on tullut muutama vuosi rakenneltua. :slight_smile:

Hommahan lähti liikenteeseen harrasteauton sähköjen uusimisella.
Projektin kohteen tuollainen 1992 Corolla :slight_smile:
Linkki: i402.photobucket.com/albums/pp10 … 09-036.jpg

Siinä tuli sitten rakennellessa tuli mieleen että valojen ohjauksen voisi toteuttaa Arduinolla…
No niihän siinä sitten kävi että mopo karkasi niin sanotusti lapasesta. :unamused:

Tällä hetkellä siis kaikki muu paitsi moottorin ohjaus on tulossa ohjattavaksi Arduinolla.
Moottorin ohjaus toteutettu Megasquirtilla.

Tällä hetkellä järjestelmä koostuu 3 arduino Unosta ja 1 arduno megasta, jotka kommunikoivat keskenään I2C väylän välitykselä.

  1. Pääohjainlaite
    • Tähän on liitetty suurin osa antureita ja toiminlaitteista.
  2. Moottoritila
    • Lukee tietoja Megalta sekä etupään parkkitutkalta.
  3. Mittaristo
    • Mittaristoon lisätty 16x2 LCD näyttö ja mittarit vaihdettu servo ohjatuksi, pois lukien nopeus- ja kierroslukumittari.
  4. Hälytin
    • GSM seuranta/ohjaus ja takapään parkkitutkan lukeminen.

Läheskään kaikki toimintoja ei ole valmiina saati testattu autossa.


Mutta sitten sitten otsikon mukaiseen aiheeseen. :slight_smile:

Arduino Unossa ei IO riitä mitenkään ohjaamaan koko autonsähköjä joten IO tarvitaan lisää…
No ei siinä sitten kun tutkimaan internetin ihmeellistä maailmaan ja IO päädyn laajentamaan seuraavin kompontein:

  • Digitaali tuloja HC165 siirtorekisterillä.
  • Analogi tuloja CD4051 multiplexerillä.
  • Digitaali lähtöjä HC595 siirtorekisterillä.
  • PWM lähtöjä TCL5940 led ohjaimella.

Lisäksi lisäkorttien päälekkäin pinoaminen ei tullut johdottamisen ja tilankäytön takia kysymykseen.
Joten kun iTead Studiolta saa 5cm x 10cm piirilevyjä 10kpl parilla kympillä niin päädyin piirtämään piirilevyt itse.
Linkki:
store.iteadstudio.com/index.php? … cts_id=507

Piirilevy piirtämisessä päädyn Eagle ohjelmistoon sen laajan komponentti kirjaston takia sekä se tuntuin sopivan omaan käyttöön. :slight_smile:

Mutta Summa summarum tällä hetkellä toimivaksi todetussa kokoopanossa Arduino Unon IO on saatu laajennettua pääohjainlaitteen kanssa seuraaviin lukemiin :

  • Digital Input 64 kpl
  • Analog Input 48 kpl
  • Digital Output 32kpl (64kpl tulossa)
  • PWM Output 32kpl
    Niin näin ohjaus ja lukeminen vaatii Arduinosta 9 pinniä :slight_smile:

IO laajennuksen lisäksi jouduin varsinaiset laitteiden ohjauskortin joissa lähtökohtana oli IRF9450 ja IRF540 fetit.

Tässäpä pari kuvaa pääohjainlaitteen nykyisestä tilasta.
IO laajennus puoli:
i402.photobucket.com/albums/pp10 … lieyg6.jpg
“HV” puoli:
i402.photobucket.com/albums/pp10 … ehqxo5.jpg

Mutta piirilevy suunnitelusta ja ohjelmoinnista lisää myöhemmin… jos nyt jotain kiinnostaa. :unamused:

Tosiaan lähti mopo vähän lapasesta :smiley:
On kyllä hieno projekti, pistä ihmeessä lisää infoa mitä olet tehnyt!
Olet vissiin pyyhkimienkin ohjauksen hoitanut tuon kanssa? Oletko tehnyt säädettävän tihkun?
Ei edes tiedä mitä kaikkea kysyisi, mahdollisuuksia tuolla systeemillähän on vaikka mihin :slight_smile:

Taas on työt häirinnyt harrastamista, nin pääsi vastaus venähtämään :confused:

Tällä hetkellä testattu toimintoja on valojen, jäähdytys ja sisätila puhaltimien ohjaus.

Pyyhkijöitäkin olen ohjannut, mutta pyyhkijöiden pysäytys oikeaan kohtaan on vielä työn alla.
“Parkki” anturia on kytketty normaaliin digitaali tuloon ja kun vanhassa ohjelmassa kierto aika oli 100ms.
Tästä johtuen pyyhkjät pysähtyivät vähän mihin sattuu.

Helpoin tuo olis ratkaista käyttämällä intruptia mutta lukemani perusteella tuo TLC5940 kirjasto estää niiden käytön.
Pitäisi kokeillaa jos Arduinon PinChangInterupt toimisi tuossa.
Ja jos ei muuta täytyy koittaa ohjelman kiertoaika saada minimoitua.

Säädettävää tihkuakin olen miettinyt mutta en vielä toiteuttanut.
Alkuun varmaan nopeuteen perustuva versio.


Jatketaan sitten miten järjestelmä lähti rakentumaan.

Arduinon IO lajennuskorttien lähtökohta oli että tarvittavat ohjaus signaalit johdotetaan kortilta kortille.
Tämän johdosta ohjauskortit voi järjestyksellä ei ole väliä. Esim: DI , AI, DO, DO, AI ja niin edespäin.

No esimmäistä kortti erää suunnitellessa ajattelin että voin käyttää yhtä Arduinon lähtöä jolla ohjaan seuraavia

  • HC595 “latch” (HC595 ohjaustulo jolla sarja muotinen data siirretään lähtöihin)
    ja
    -HC165 “load” (ohjaus tulo jolla tulojen tilan siirretään sarja muotiseen dataan).
    Myöhemmin totesin että en saanut piirejä toimimaan oikein yhdellä lähdöllä niin siirryin käyttämään kahta lähtöä.

HC595 ja HC165 vaativat SPI pinnien lisäksi ainoastaan “latch” / “load” ohjaukset.
Seuraavassa kuvat miten olen toteuttanut piirien kytkennät IO-korteilla.

HC595
https://www.dropbox.com/s/nja7v1iym9xstse/HC595_ctrl.jpg?dl=0
“P01”:llä valitaan onko kysessä ensimmäinen Digital Output kortti.

HC165
https://www.dropbox.com/s/zf4f99v0cjuj6av/HC165_ctrl.jpg?dl=0
“J1”:llä valitaan onko kysessä ensimmäinen Digital Input kortti.


Tiedonsiirto HC595, HC165 ja TLC5940 piireille tapahtuu SPI väylän avulla.
Ja kun jokaisella piirillä on oma “latch”/“load” ohjaus niin voi piireillä käyttää yhteisiä kello ja data linjoja.

Käytettävät Arduinon lähdö lähtivät määräytymään TLC5940 piirin ohjaustulojen mukaan.
https://playground.arduino.cc/Learning/TLC5940

SPI:n SCLK ja MOSI lähtöjen lisäksi Arduinon TLC5940 kirjasto tarvitsee seuraavat lähdöt:

  • pwmClock, UNO (3) - GSCLK, TLC5940 (18)
  • pwmLacth, UNO (9) - XLAT, TLC5940 (24)
  • pwmBlank, UNO (10) - BLANK, TLC5940 (23)

Linkin takaa löytyy kuva miten olen toteuttanut TLC5940 kytkennän IO kortilla.
https://www.dropbox.com/s/vc8yhuw330socjc/TLC5940_ctrl.jpg?dl=0
“J1”:llä valitaan onko kysessä ensimmäinen PWM ohjaus kortti.


Analogia tuloja laajensin CD4051 multiplexerillä.
Yksi on sijoitettu samalle kortille kun Arduino tällä on saatu laajennettua vapaana olevat Analog tulot 4 --> 8. (A4 ja A5 on varattu I2C väylälle).
Tämän lisäksi pystyn hyödyntämään CD4051 tulojen valinnassa yhtä HC595 siirtorekisteriä.

Seuraavassa kuvassa on Analog Input kortin kytkennästä.
https://www.dropbox.com/s/998ydm4op6jguvs/CD4051_ctrl.JPG?dl=0
Kuvan mukaisella kytkennällä voidaan lukea haluttu Analog tulon tila pelkästään kirjoittamalla “IC1”:lle halutun tulon numero.

Esimerkiksi jos halutaan lukea kuvassa olevan “IC3”:n tulon “X7” tila.
-Kirjoitetaan “IC1”:lle numero 7 tämä on binäärinä: B00 000 111
-Oikealta lukien ensimmäisellä kolmella bitillä (0-2) ohjataan IO-korteilla olevia CD4051 multiplexereitä ja seuraavalla kolmella bitillä (3-5) Arduino kortilla olevaan CD4051 multiplexeriä.
-IO koretilla on valittuna tulo “X7” mutta kun bitit 3-5 on “0” niin Arduinolla olevalla kortilla on valittu “X0”

Kuva CD4051 totuustaulusta jonka perusteella tulon valinta tapahtuu:
https://www.dropbox.com/s/sx1tou1ug3ajlw2/CD4051_truth_table.JPG?dl=0

Tämän kerran päätteeksi vielä Eagle piirikaavio tällä erää viimeisimmästä Arduino kortista.
https://www.dropbox.com/s/xoeomnpv7g3d5nm/cpu_V3.10-18.09.2016.sch?dl=0

Lisäksi ohjelman pätkä jolla luen ja kirjoitan IO-korttien tiloja sekä tulostan nämä tiedot Arduino “sarjaporttiin”.
https://www.dropbox.com/s/3pz863uq78ffdoy/MAIN_CPU_id.10_v4.10-2017-05-31-2026.7z?dl=0

Ohjelma tulostaa seuraavanlaisen näkymän TeraTerm ohjelmaan.
https://www.dropbox.com/s/d6ahtsuv7c3u8hl/TeraTerm_001.JPG?dl=0

Mutta ohjelmasta ja HW:sta sitten lisää myöhemmin :slight_smile: