Bónusz projekt: Jöhet valami alternatív?

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!

Csak egy érintés!

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.)

Amikor sima INPUT a bemenet típusa, akkor a rajta lévő villany határozza meg, hogy az A-star 0 vagy 1-es értéket olvas a digitalRead-del. A 10 Mohmos ellenállás azért kell, hogy amennyiben nem érintünk meg semmit, a bemenet "lazán" 5V-ra legyen kötve. Ha nem érintjük meg, akkor így 1-et kapunk, ha pedig megérintjük és a kezünkkel a GND-vel összekötjük a bemenetet, akkor az 0V körüli villanyt tesz a portra, és 0-át fogunk kapni a digitalRead() függvénytől.
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(' ');        
    }
}

A kilógó két drótot a két kezeddel egyszerre megérintve érzékel

Érints meg!

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ő:

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.)

Sequencer

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.

Pacsi-pacsi tarka