sunnuntai 11. joulukuuta 2016

Joystick KY-023 ja KY-011

Tässä ohjelmajaksossa käsittelen joystick:in (KY-023) rajapintaa. Laite käsittää kaksi potentiometriä ( kumpikin arvoltaan noin 3,4 kilo-ohmia), jotka sijaitsevat mekaanisesti toisiinsa nähden ristikkäin. Voi siis ajatella, että toinen säätää pystysuuntaa ja toinen vaakasuuntaa. Näitä liikutellaan nupilla vapaasti näiden kahden suunnan välillä. Lisäksi yksikössä on kytkin, mikä toimii painamalla painiketta. Yksikkö on jousitettu siten, että kytkin on avoinna ja painike (melkein) keskiasennossa.

Potentiometrit on kytketty +5V:in ja maan (GND)väliin ja kytkimen painaminen oikosulkee lähtöpinnin maihin. Potentiometrin liuut kytketään analogiatuloihin ja kytkin digitaalituloon D2. Indikaattorina on puna/vihreä-LED (KY-011), joiden kirkkautta säädetään nupin asennolla. Painamalla kytkintä LEDit sammutetaan. Kahdella erillisellä LEDillä nupin asennon vaikutus olisi varmaan ollut selkeämpi. Värien kirkkausvaihtelut olisi olleet helpompi erottaa. (Ainakin tällaiselle puna- vihreä- värisokealle.)

OHJELMASTA
Ohjelma ei sisällä mitään kovin erikoista, mutta jotakin uutta. Painike on kytketty sisäisesti toisesta päästä maihin ja oikosulkee täten signaalitien. Tässä voi käyttää erillistä ylösvetovastusta, mutta voi asetuksissa konfiguroida käyttämään Arduinon sisäistä ylösvetoa (pinMode(Con_Kytkin, INPUT_PULLUP); Huomioitava on myös, että painettassa D2:n tulojännite muuttuu 5 → 0V eli ykkösestä nollaan, true → false. Siksi tulon tilan luku on käänteinen (Bol_Kytkin = !digitalRead(Con_Kytkin);) Siksi siinä on tuo huutomerkki (!).
Toinen huomioitava seikka on se, että analogiatuloja (potikat) ja analogialähtöjä (LEDit) ei tarvitse, eikä pidä määritellä asetuksissa. (Tosin analogiatulot voidaan määritellä myös digitaalisiksi. Toinen huomioitava seikka on, että kaikki digitaali-lähdöt eivät voi toimia analogialähtöinä.) Asetuksissa on myös myös pieni stabi-lointiviive ja siinä luetaan kertaluonteisesti joystick:in lepoitilan antamat jänniteen. Tässä tapauksessa ne olivat 500 (pysty) ja 505 (vaaka).

Pääohjelman aluksi luetaan painikkeen tila. Jos se on painettu, kirjoitetaan LEDien ohjausarvoiksi nollat (0) ja hypätään varsinaisen suoritusosan yli lähtöjen päivitykseen (analogWrite(LED, Arvo)); Arduinon C-ohjelmatyökalu sisältää goto label; - käskyn (nimi, tässä tapauksessa ohitus:), mutta sen käyttö EI OLE SUOSITELTAVAA!! Olen tässä yksinkertaisessa tapauksessa tuonut sen esimerkkinä esille, mutta ohjelman mutkistuessa se aiheuttaa todennäköisesti sekaannusta ja vaikeuksia. Suositeltavampaa on käyttää if(ehdot){toiminta; [}else if{ehdot ja toiminta; }else{toiminta;}] } tai varsin selkeätä rakennetta: switch (askel).. case(askel no.) .. break; Tällä saadaan selkeästi ohjelman suoritus rajoittumaan vain niihin tehtäviin, mitkä kyseisessä askeleessa pitää tehdä. Tämä tekee ohjelmasta suoritusnauharakenteisen.
     Suoritettavassa pääohjelmaosuudessa joystick:in ohjaamat jännitearvot muutetaan LEDien kirkkausarvoiksi. Koska lepotila ei ole muunnosalueen puolessa välissä (1024 / 2 = 512), pitää lepotilojen yläpuoliset ja alapuoliset arvot muuttaa erikseen analogisiksi lähtöarvoiksi (8-bittinen muunnos 0 .. 255). Yläpuoliset arvot välille 127 .. 255 ja alapuoliset välille 0 .. 126. Tähän käytetään käskyä lähtö = map(muuttuja, alku, loppu, alku, loppu).
     Lisäksi ohjelmassa on vielä vähennyslasku: Int_PystyOhjaus = 255 – Int_PystyOhjaus; Halusin, että vihreä kirkastuu ylöspäin ja punainen oikealle (kun stickin liittimet ovat itsestä pois päin). Nämä kaksi lausetta on tietysti tarpeettomia, jos joystick käännetään toisin päin.

OHJELMA 28
/***************************************
* Ohjelma 28
* 09.12.2016
* Joys stickin havainnointi
**************************************/

// MÄÄRITTELYT:
// IO- ja muistimääritykset
const int Con_Kytkin = 2;
boolean Bol_Kytkin = false;
int Int_KytkinViive = 0;
const int Ana_Vaaka = 0;
int Int_VaakaRaaka = 0;
int Int_VaakaPohja = 0;
int Int_VaakaOhjaus = 0;
const int Ana_Pysty = 1;
int Int_PystyRaaka = 0;
int Int_PystyPohja = 0;
int Int_PystyOhjaus = 0;
const int Con_LED_Pun = 3;
const intt Con_LED_Vih = 5;

// ASETUKSET:
void setup(){
Serial.begin(9600);
pinMode(Con_Kytkin, INPUT_PULLUP); // Sisäinen ylösveto
delay(20);
// Luetaan joystickin pohjalukemat vaaka ja pysty
Int_VaakaPohja = analogRead(Ana_Vaaka);
Int_PystyPohja = analogRead(Ana_Pysty);
}// Asetuksen loppu

// PÄÄLOOPPI
void loop(){

// Kytkimen luku
Bol_Kytkin = !digitalRead(Con_Kytkin);
// Painettaess sammutetaan LEDit
if(Bol_Kytkin == true){
Int_VaakaOhjaus = 0;
Int_PystyOhjaus = 0;
goto ohitus; } // Painettaessa hypätään mittausten yli

// Analogiamittaukset ja muunnokset
Int_VaakaRaaka = analogRead(Ana_Vaaka);
Int_PystyRaaka = analogRead(Ana_Pysty);
if(Int_VaakaRaaka >= Int_VaakaPohja){
Int_VaakaOhjaus = map(Int_VaakaRaaka,Int_VaakaPohja, 1023, 127, 255);
}else{
Int_VaakaOhjaus = map(Int_VaakaRaaka,0, Int_VaakaPohja, 0, 126);
}
Int_VaakaOhjaus = 255 - Int_VaakaOhjaus;
if(Int_PystyRaaka >= Int_PystyPohja){
Int_PystyOhjaus = map(Int_PystyRaaka,Int_PystyPohja, 1023, 127, 255);
}else{
Int_PystyOhjaus = map(Int_PystyRaaka,0, Int_PystyPohja, 0, 126);
}
Int_PystyOhjaus = 255 - Int_PystyOhjaus;
 ohitus:
analogWrite(Con_LED_Pun, Int_VaakaOhjaus);
analogWrite(Con_LED_Vih, Int_PystyOhjaus);
delay(1);
} // Pääohjelma LOPPU

Ei kommentteja:

Lähetä kommentti