Különleges I/O-k



Az Arduino függvények között található néhány speciális ki/bemenet kezelő függvény, most ezekről
esik néhány szó.
Először nézzük a hang kiadásra szolgáló utasításokat: 
tone() – egy bizonyos frekvenciájú négyszögjelet továbbít a megadott lábon.

pl.: tone(pin,freki,időtartam);
pin : a használandó kimenet
freki: a megadott frekvencia Hertzben
időtartam: az adott hang kitartási ideje

Ehhez az utasításhoz közvetlenül csatlakozik a noTone() utasítás ami a hangkiadást szünteti meg az adott lábon.

Pl.: noTone(pin);
pin: a leállítandó kimenet.

Tehát a hangképzés négyszögjellel történik ami 50%-os kitöltésű. Egyszerre csak egy hangot lehet
meghívni, és egyszerre csak egy pin lehet aktív.
31Hz alatt nem lehet hangot kibocsájtani valamint a hangkiadás zavarja a PWM csapokat.

Egy példa:
//hangok frekvencia értékeinek definiálása
#define NOTE_B0 31
#define NOTE_C1 33
#define NOTE_CS1 35
#define NOTE_D1 37
#define NOTE_DS1 39
#define NOTE_E1 41
#define NOTE_F1 44
#define NOTE_FS1 46
#define NOTE_G1 49
#define NOTE_GS1 52
#define NOTE_A1 55
#define NOTE_AS1 58
#define NOTE_B1 62
#define NOTE_C2 65
#define NOTE_CS2 69
#define NOTE_D2 73
#define NOTE_DS2 78
#define NOTE_E2 82
#define NOTE_F2 87
#define NOTE_FS2 93
#define NOTE_G2 98
#define NOTE_GS2 104
#define NOTE_A2 110
#define NOTE_AS2 117
#define NOTE_B2 123
#define NOTE_C3 131
#define NOTE_CS3 139
#define NOTE_D3 147
#define NOTE_DS3 156
#define NOTE_E3 165
#define NOTE_F3 175
#define NOTE_FS3 185
#define NOTE_G3 196
#define NOTE_GS3 208
#define NOTE_A3 220
#define NOTE_AS3 233
#define NOTE_B3 247
#define NOTE_C4 262
#define NOTE_CS4 277
#define NOTE_D4 294
#define NOTE_DS4 311
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_FS4 370
#define NOTE_G4 392
#define NOTE_GS4 415
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494
#define NOTE_C5 523
#define NOTE_CS5 554
#define NOTE_D5 587
#define NOTE_DS5 622
#define NOTE_E5 659
#define NOTE_F5 698
#define NOTE_FS5 740
#define NOTE_G5 784
#define NOTE_GS5 831
#define NOTE_A5 880
#define NOTE_AS5 932
#define NOTE_B5 988
#define NOTE_C6 1047
#define NOTE_CS6 1109
#define NOTE_D6 1175
#define NOTE_DS6 1245
#define NOTE_E6 1319
#define NOTE_F6 1397
#define NOTE_FS6 1480
#define NOTE_G6 1568
#define NOTE_GS6 1661
#define NOTE_A6 1760
#define NOTE_AS6 1865
#define NOTE_B6 1976
#define NOTE_C7 2093
#define NOTE_CS7 2217
#define NOTE_D7 2349
#define NOTE_DS7 2489
#define NOTE_E7 2637
#define NOTE_F7 2794
#define NOTE_FS7 2960
#define NOTE_G7 3136
#define NOTE_GS7 3322
#define NOTE_A7 3520
#define NOTE_AS7 3729
#define NOTE_B7 3951
#define NOTE_C8 4186
#define NOTE_CS8 4435
#define NOTE_D8 4699
#define NOTE_DS8 4978

// dal tömb létrehozása( a lejátszandó hangok tárolására)
int dal[] = {
NOTE_C4, NOTE_G3,NOTE_G3, NOTE_A3, NOTE_G3,NOTE_B2
, NOTE_B3, NOTE_C4};

//hossz tömb a hangok hosszát adja meg
int hossz[] = {4, 8, 8, 4,4,4,4,4 };

void setup(){
}
void loop(){
// nyolc a tömb elemeinek száma 0-tol 7-ig, ezeket olvassuk be a tone-ba
for(int i=0;i<8;i++){
tone(8,dal[i]);
// a hang mindaddig lejátszód míg a noTone-val ki nem kapcsoljuk, vagy új hangot nem kezdünk el
delay(1300/hossz[i]);
noTone(8);
}
while(true);
}

A nyolcas kimenetre tegyünk egy buzzert, vagy minihangszórót.

Azt hiszem a progit nem kell különösebben elmagyaráznom, a hang kitartást delay-al oldottam meg
mert valahogy nem akart rendesen működni tone utasításon belül.

A hangskála Brett Hagman munkája, róla a következő oldalon tudhatsz meg többet: https://code.google.com/p/rogue-code/wiki/ToneLibraryDocumentation#Ugly_Details


Különleges i/o-k közé tartoznak a shift regiszterek működtetését könnyítő utasítások:
shiftOut() – minden meghívásnál 1bájt (8bit) továbbítását végzi az adott shift regiszterbe.
Paraméterei: shiftOut(adatpin,órapin,bitsorrend, bitértékek)
adatpin – az arduino a shift regiszter felé adatokat továbbító kimenete
órapin – az órajelet továbbító kimenet
bitsorrend – a bitek beolvasási sorrendje, ez lehet MSBFIRST legmagasabb helyi értékű bit először vagy LSBFIRST legalacsonyabb helyi értékű bit először .
Bitértékek – 8 bites bináris szám.

A shift regiszter használatáról már írtam cikket ezt megtaláljátok itt:

Párhuzamos-soros  konverter 140415

 *Analóg bemenet ledes  kijelzéssel 140416


A bináris számkezelésbe meg nem akarok nagyon belemenni, ez elméletként több helyen is megtalálható, talán még annyit leegyszerűsítve: az MSBFIRST a bináris szám baloldali értékével kezdi a beolvasást az LSBFIRST pedig a jobb oldalival.


Ide tartozik a következő függvény is: shiftIn() – 8bit-et olvas be az adott shift regiszterből.

Paraméterei: bitérték = shiftIn(adatpin, órapin, bitsorrend);
a paraméterek ugyan azok mint shiftOut() függvénynél csak itt a függvény visszatérési értéke a bitérték byte típusú változóban.


Ide tartozik a pulseIn() függvény is, ha egy adott láb állapota a függvényben megadottra vált
akkor elkezdi mérni az eltelt időt mindaddig míg a láb értéke meg nem változik, impulzus mérés.

pl.: idő = pulseIn(láb,érték);
láb: a mérendő bemenet
érték: két érték lehet, HIGH vagy LOW. Ha HIGH van beállítva a függvény megvárja míg a láb

értéke magas szintre nem vált akkor indítja az időmérést, a mérés mindaddig folyik míg a láb értéke
LOW szintre kerül, a LOW-nál fordítva.

idő: a mért idő a szintváltások között, impulzus hossz.

Megadható egy harmadik érték is a zárójelen belül, ez határozza meg a mérés időtartalmát. Ezt mindig ezredmásodpercben kell megadni. Ha nem adunk meg semmit akkor egy másodpercig mér.


long ido; //nagyon fontos a mért érték ezredmásodpercben van ezért long típust kell használni
void setup(){
pinMode(4,INPUT);
pinMode(13,OUTPUT);
Serial.begin(9600);
}
void loop(){
ido=0;
ido = pulseIn(4,HIGH,5000000); //a mérési idő kiterjesztése
//kiíratás a soros monitorra
Serial.println(ido);
//ha két másodpercnél tovább van lenyomva a gomb
if(ido>2000000){
digitalWrite(13,HIGH);
delay(2000);
digitalWrite(13,LOW);
}
}


Ezt a progit lehetne gombok tartósan lenyomva tartásának érzékelésére használni, egyetlen hátránya
csak akkor fejezi be a mérést ha már felengedtük a gombot, így nekünk kell eltalálni a nyomva tartás időtartalmát.