sunnuntai 12. helmikuuta 2017

KEHITYSTÄ IV

Nyt uskoin tuolle joutilaalle Arduino MICROlle löytäväni käyttöä tässä hiukan laajemmassa näppäinprojektissa. Minulla oli tavoitteena liittää yhteen Arduino, 16 painikkeen näppäimistö ja LCD-näyttö. Tavoitteena oli tehdä kiinteämpi kytkentä ja toteutus, ajatuksena käyttää sitä myöhemmin ja monipuolisemmin.
     Ensimmäinen testikytkentähässäkkä oheisessa kuvassa.
     Sinisen valon oikealla puolella oleva pieni printti on Arduino Micro. Jonkin aikaa näytti hyvältä, mutta sitten tämä mikrokontrolleri sai kyllikseen. Mitä ilmeisimmin syynä oli tuon LCD-näyton liika kuormitus. (Kohta siitä lisää.)
  
Siirryin sitten Arduino LEONARDOon, ja sellaiseen malliin, missä ei liittimiä ole valmiina, vaan kaikki ulkoiset kytkennät tehdään juottamalla kontrollerin piirilevyyn. 
     Testeissä nousi esiin, että 5V regulaattori kävi varsin kuumana, joten tuo arvio Micron rikkoutumisesta lienee oikeaan osunut. LCD-näyttö imi noin 160mA virran 5 voltin jännitteestä. Toisessa kuvassa valmis toteutus näkyy vinosti takaa. Jouduin nimittäin lisäämään laitteen takaosaan alumiinilevyn juuri tuon 5V:n regulaattorin jäähdytystä varten.

Regulaattoripiirit (7809 9V ja 7805 5V) sekä niihin liittyvät suodatinelektrolyyttikondensaattorit ovat alimmalla Vero-levyllä. Samoin rinnan-/sarjapiirit (74HCT165), kuten myös liittimet ulkoisia kytkentöjä varten. Tämän levyn päälle liittyy liittimien välityksellä Arduino LEONARDO ja ylimpänä toinen koelevy, missä on 16 kpl painikkeita sekä kaksi 8 x 10kohm:in vastushybridipiiriä digitaalitulojen kuormitusta varten

Arduino on alaspäin olevilla piikeillä pohjalevyn liittimissä
Päällekkäisrakenne ilmenee oheisesta kuvasta. Noita pieniä liittimiä olen saanut tuhoamistani Arduinoista. Aina tulee sähellettyä! Onneksi kamaa voi kierrättää.
     Vasemmalla näkyvässä vihreän liittimen kautta on laitteen syöttö (12 VDC) ja kolmantena 5 V:n lähtö joitain muita (tulevaisuudessa) tuota syöttöä tarvitsevia laitteita varten. 
     Seuraavana kaksi urospiikkiä, jotka on liitetty Arduinon sarjaliikennepinneihin (D0 RX ja D1 TX). Tässä olen samalla tehnyt ristikytkennän, joten liitettäessä tämä laite toiseen  
     Arduinoon, voi käyttää suoraa parijohdinta. Sitten on kolme naaraspinniä, jotka on liitetty vapaana oleviin digitali I/O:n (D11, D12 ja D13). Viimeisenä neljä (4) naaraspinniä analogiatuloihin (A0 .. A3). Vain neljä on liitetty, koska sopivaa kuuden (6) pinnin liitintä ei ollut. Noilla neljälläkin pärjää aika pitkälle.

Lopputulos näyttää seuraavalta: ihan oikealta ITEprototyypiltä.

Näytön yläriville Arduino on ilmaissut asenteensa tätä minun blogiprojektiani kohtaan ja alarivilla vasemmalla painikkeen numero (1 .. 16) ja oikealla vastaava bittijono (bitin paikka). YouTube-videolla (antinarduvideo37.youtube.com) on pieni esittely näppäimistöstä. Siinä numerot vaihtuvat välillä1 .. 16, eli painikkeen numero näkyy vasemmalla ja vastaavasti paikka bittijonossa oikealla.



 
Painikeryhmän kaavio ohessa. Siihen on merkitty kunkin painikkeen numeerinen arvo (0 .. 15). Tässä toteutuksessa ne ovat ainoastaan painikkeita, jotka voidaan erottaa toisistaan. Myöhemmin ne saavat varsinaisia toimintoja. Seuraavassa koko hässähän kytkentä:
Ja lopuksi tämän kertaisen sovelluksen ohjelma. Tästä ohjelmasta olen jättänyt pois kaiken sellaisen, mikä ei liity juuri tähän toteutukseen.

OHJELMA 37
/***************************************
* Ohjelma 37
* 09.02.2017
* Bitit ja painikkeen numero
**************************************/

// MÄÄRITTELYT:
// LCD-näyttö
#include <LiquidCrystal.h>
LiquidCrystal lcd(3, 2, 7,6,5,4);
boolean Arr_DATA[16];
int Int_Numero = 0;

// ALIOHJELMAT
// LCD aliohjelman määrittelyt
void Fun_LCD(int start, int rivi, int paikka, int data){
// Näytön valintasekvenssi
    int Seq_LCD = start;
    switch (Seq_LCD){
case 2:
    lcd.setCursor(paikka, rivi);
    lcd.print("LAITAN TAAS HANTTIIN");
    Seq_LCD = 0;
break;
case 11:
    lcd.setCursor(paikka, rivi);
    lcd.print(data);
    Seq_LCD = 0;
break;
}// Valintasekvenssin loppu
}// Funktion LCD loppu

// Funktio Parallel IN serial OUT (Rinnan sisään, sarjassa ulos)
// SarjaIN_Ali_v1.No4Tam17
void Fun_LueRsSu(int PL, int CP, int Data){
    pinMode(PL, OUTPUT); // pinnin numero kutsussa
    pinMode    (CP, OUTPUT); // pinnin numero kutsussa
    pinMode    (Data, INPUT);// pinnin numero kutsussa
// Rinnakkaisdatan siirto
    digitalWrite(PL, LOW);
    digitalWrite    (PL, HIGH);
    for(int i = 0; i < 16; i ++){Arr_DATA[i] = 0;}// tyjennys
        for(int j = 0; j < 16; j++){ // luku
        Arr_DATA[j] = digitalRead(Data);
        digitalWrite(CP, HIGH);
        digitalWrite(CP, LOW);
    }// sarjaluennan loppu
}// Funtion loppu

// ASETUKSET:
void setup(){
    Serial.begin(9600);
    lcd.begin(20,2);
    lcd.clear();
// Tekstit näyttöön, suoritetaan kerran
    Fun_LCD(2,0,0,0);
}// Asetuksen loppu

// PÄÄLOOPPI
void loop(){
    Fun_LueRsSu(8, 9, 10);
    for(int No = 0; No < 16; No++){ // Numeron näyttö
        if(Arr_DATA[15-No] == 1){
        Int_Numero = No + 1;
            if(Int_Numero < 10){ // Numerot 0 .. 9
                Fun_LCD(11,1,1,Int_Numero);
                lcd.setCursor(0,1);
                lcd.print(" "); // Tyjennetään kymppien paikka
            }else{
                Fun_LCD(11,1,0,Int_Numero);
            } // else if loppu
            }// if loppu
    }// for loppu
    for(int No = 0; No < 16; No++){ // bittien näyttö
        lcd.setCursor(No + 4, 1);
        lcd.print(Arr_DATA[No]);
    }// for loppu

    delay(1);
} // Pääohjelma LOPPU

Ei kommentteja:

Lähetä kommentti