![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh01ov6oAJDm8l2ZfMv1qhg2emeX8QTzfBqFNa9jq951lOHclmUcM_g-b3OINspbzUJqcILhx1M6zaVZ-o11oQFaYzesrzbLC5jOOqGOGUp6BCEguGgJD-CzYvhmFjy676ijvOKSJu-MG8n/s200/KY023mp.jpg)
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 (!).
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