Arduino ir mygtukai: laidų taupymas

Posted: 2013-06-24 in Darbeliai
Žymos:, ,

Jei sekėte mano Arduino „pamokėles“ apie mygtukus, tai jau žinote, kaip galima pagauti mygtukų nuspaudimus. Ką su tuo daryti — visai kitas klausimas.

Tačiau iki šiol tyrinėjom paprastą atvejį, kai vienam mygtukui skiriamas vienas Arduino (ar tai AVR procesoriaus) elektrodas. Bet kokiame nors visko pilname projekte tų elektrodų gali būti tiesiog per mažai. Tad įsivaizduokime, kad norime „pataupyti“ elektrodų ir prie vieno kaip nors „prikabinti“ kelis mygtukus. Ar tai įmanoma? O kaip jūs manote?

Jeigu kažkas tokio būtų neįmanoma, būtų mažų mažiausiai keista.

Vienas iš variantų — speciali I²C klaviatūra. Kaip žinote, I²C magistralė naudoja du laidelius informacijos apsikeitimui. Bet šitas dalykas yra visai iš kitos kategorijos ir jo neaptarinėsime.

Pats paprasčiausias būdas — pasinaudoti kuriuo nors vienu (arba daugiau, jei labai reikia daug mygtukų) analoginiu įvesties elektrodu. Principas paprastas: kiekvienas mygtukas prie analoginio elektrodo prijungiamas per skirtingos reikšmės rezistorių ir nuskaitomos reikšmės. Skirtingi rezistoriai į analoginį elektrodą įleidžia skirtingo dydžio įtampą ir programoje gauname skirtingas reikšmes. Paprastas bandymas man parodė, kad analoginis nuskaitymas yra pakankamai tikslus, kad galėtume prie vieno elektrodo prikabinti apie 20 mygtukų (jei ne daugiau).

Yra vienas apribojimas: galima vienu metu nuspausti tik vieną mygtuką. Nuspaudus du reikšmė bus kažokia kitokia, arba vieno iš mygtukų. Tad jeigu jūsų projekte reikia galimybės nuskaitinėti kelių mygtukų nuspaudimus vienu metu, tai šis metodas netiks.

Taip pat su šiuo metodu neišnaudosite pertraukimų. Jie įmanomi tik su skaitmeninėmis įvestimis. Na, nebent pridėsite dar vieną laidelį, kuris ves į skaitmeninį įvadą. Tad tuo atveju pertraukimą sukels signalas į skaitmeninį įvadą, o pertraukimo kodas galės nuskaityti analoginį.

Jeigu pabandysite naudoti Arduino bibliotekos analogRead funkciją, ji iš analoginio elektrodo grąžins atsitiktines reikšmes. Na, tos „atsitiktinės“ bent jau mano atveju svyravo apie 400, plius-minus kokie 20. Kad šito nebūtų, reikia pull up arba pull down rezistoriaus. Galima išnaudoti vidinį pull up rezistorių, tik tuomet analogRead visuomet grąžins maždaug 750 reikšmę, o mygtukais galėsite tarsi lygiagrečiai tam vidiniam rezistoriui jungti 200-680 Ω reikšmių rezistorius. Na, mažesnės reikšmės, nei 20 kΩ, kad susidarytų skirtumas.

Man šiuo atveju atrodo prasmingiau panaudoti išorinį pull down rezistorių. Analoginį įvadą aš prijungiau 100 kΩ reikšmės rezistoriumi prie „žemės“. Reikšmė iš karto tapo lygi nuliui, „plaukiojimai“ baigėsi. Kas toliau?

Pirmą mygtuką jungiu tiesiai prie 5 V, o kitą kontaktą — į analoginį įvadą. Šį mygtuką paspaudus grąžinama visiškai stabili reikšmė 1023. Na, vidinis AVR analoginis-skaitmeninis keitiklis grąžina reikšmes nuo 0 iki 1023, tokia jo skiriamoji geba. Duodu jam tiesiai 5 V įtampą ir jis rodo maksimalią reikšmę. Viskas logiška.

Antrąjį mygtuką jungiu į analoginį įvadą per 10 kΩ rezistorių. Grąžinama reikšmė 932–934, po kelių bandymų. Irgi gan stabilu.

Trečiąjį mygtuką jungiu per 10 kΩ rezistorių prie pirmojo mygtuko 10 kΩ rezistoriaus. Krūvoje sudėjus išeina 20 kΩ. Grąžinama reikšmė — 852–855.

Ketvirtasis mygtukas bendroje sumoje jau jungiamas per 30 kΩ ir grąžinama reikšmė — 786–788.

Penktasis mygtukas: 40 kΩ ir grąžinama reikšmė apie 730.

Kaip matote, kitimas nėra tiesinis. Norint lygių tarpų tarp reikšmių reikėtų priderinti kitokius rezistorius.

Trumpa funkcija, kuri pagal šias reikšmes grąžina mygtuko numerį arba nulį, jei nė vienas iš mygtukų nebuvo paspaustas:

int kokiaKnopke() {
	int val = analogRead(0);
	if (val == 1023) {
		return 1;
	} else if (val > 920 && val < 940) {
 		return 2;
 	} else if (val > 840 && val < 860) {
 		return 3;
 	} else if (val > 780 && val < 800) {
 		return 4;
 	} else if (val > 720 && val < 740) {
		return 5;
	} else {
		return 0;
	}
}

Tai maždaug šitaip. O štai čia mano Arduino ir prototipinės plokštės su mygtukais vaizdas:
Arduino Uno R3 ir prototipinė plokštė su mygtukais bei rezistoriais | Darau, blė

Parašykite komentarą

Brukalų kiekiui sumažinti šis tinklalapis naudoja Akismet. Sužinokite, kaip apdorojami Jūsų komentarų duomenys.