Valami változatos, valami a szokásostól eltérő? Ok, gombot már nagyon tudunk kezelni. Természetesen mindez működik bármivel, ami kicsit is gombhoz hasonlóan működik:
A dolog úgy is működik, ha:
Ha a kanállal hozzáérsz az alufóliához, az ott egy kapcsoló, és máris kész egy elektromos dob!
Az A-star nagyon pici villanyokat használ. Ez azt jelenti, hogy akkor is működne, ha a gomb nem tökéletesen érintkező két fémdarab lenne, hanem a villany picit nehezebben tudna rajta átmenni.
Vajon akkor a mondjuk két kézzel a GND-t meg a 0-ás portot összekötöd, akkor azt ugyanúgy érzékeli, mint egy gombnyomást? Képzeld, van, akinél igen! A testünk jó része vízből áll, emiatt nagyjából átmegy rajta a villany. Persze nem olyan tökéletesen könnyen, mintha fémből lennénk, de azért nagyjából...
Sajnos, nem mindenkinél működik ez így. A száraz bőrön már nehezebben megy a dolog. Ezért bevetünk egy pici trükköt:
(Mivel ez bónusz projekt, az alapkészlet nem tartalmazza ezt az ellenállást, de bármely alkatrészboltban beszerezhető, pld. TME, Farnell, SOS Electronic, stb.)
void setup() {
pinMode(0,INPUT); // nincs pullup
Keyboard.begin(); // indítsuk el az USB kezelését
}
void loop() {
if (digitalRead(0)==0) {
Keyboard.press(' ');
delay(100); // most nem figyelünk 100ms-ig
while(digitalRead(0)==0) {
delay(10);
}
Keyboard.release(' ');
}
}
No most, ha a GND és a 0-ás port közti két kilógó drótot pld. vízbe mártod, azt már érzékeli a mikrovezérlő, és nyomja a szóközt/dobot.
De ha a két kezeddel megfogod a két drót végét, az is megy.
Ha az egyik társad megfogja az egyik drótot, Te meg a másikat, és eközben a szabad kezetekkel tapsoltok, akkor mindkettőtökön átmegy a villany, és érzékel.
Sok egyéb anyaggal is érdemes kísérletezni. Bármi, amiben van egy kicsi nedvesség, működhet, mint például:
Itt egy alma-érzékelő:
Az egyik kezeddel fogd meg az almátlan drótot. A másikkal az alma megérintését érzi a mikrovezérlő.
De ugyanígy működik már az előző részben készített alufóliás dob is csak úgy, hogy kézzel hozzáérsz. (Természetesen a másik kezeddel a GND-t fogni kell.)
Vagy izé, magyarul szenvencer? Most jól megmagyaráztam! Ez egy olyan doboz, amit arra használnak a zenészek, hogy egy ismétlődő zenei minta hangjait automatikusan lejátssza. Hogy a dolog "élőnek" tűnjék, ezt hozzá lehet kötni egy igazi szintihez, vagy bármi máshoz. A trükk az, hogy mindegy, mit nyomunk a szintin, minden esetben a következő hang jön a sequencerből.
Hogy ez nekünk miért jó? Mert így mondjuk egyetlen bemenettel, egyetlen almán tudunk boci-boci tarkát játszani. Egyszerűen csak annyi kell, hogy összekombináljuk ezt az érintéses dolgot az előző oldalon lévő boci-boci tarka progival úgy, hogy a következő hangot az érintéskor játssza le.
Mivel a ritmust most mi adjuk - minden érintéskor egy hang - ezért a hangok közti szünetre nincs szükség.
const int TONE_C='c'; // a c gombot kell megnyomni a C hanghoz
const int TONE_E='b'; // a b gombot kell megnyomni az E hanghoz
const int TONE_G='m'; // az m gombot kell megnyomni a G hanghoz
void setup() {
pinMode(0,INPUT);
Keyboard.begin(); // indítsuk el az USB kezelését
}
void sound(int frequency) {
while (digitalRead(0)!=0) {
// nincs érintés, nem csinálunk semmit
delay(10);
}
Keyboard.press(frequency); // gomb lenyom
delay(100); // most nem figyelünk 100ms-ig a prell miatt
while(digitalRead(0)==0) {
// megvárjuk, míg elengedi
delay(10);
}
Keyboard.release(frequency); // gomb elenged
}
void loop() {
// boci-boci tarka
sound(TONE_C);
sound(TONE_E);
sound(TONE_C);
sound(TONE_E);
sound(TONE_G);
sound(TONE_G);
}
Hogy ebből mi lesz? Kezdődik a loop() egy sound() hívással. A sound() viszont vár egy érintésre, és csak azután küldi be a gépbe a gombnyomást. Utána megvárja, amíg elengedted, és beküldi a gomb elengedését is, majd a sound()-nak vége van, megy tovább a loop() a következő sound()-ra, stb. Minden érintés egy hang.