Arduino 10. nodarbība – Skaņa un melodija

Arduino – Pīkstulis, gaismas skaņa un melodija

Šajā nodarbībā iemācīsimies izmantot pīkstuli (buzzer), lai skaņa mainās atkarībā no gaismas daudzuma. Izgatavosim iekārtu, kas atskaņo melodiju.

Nepieciešamie komponenti

  1. Arduino kontrolieris (piem. Uno, Nano) ar USB kabeli
  2. Bredbords 400 punktu Half+
  3. Savienošanas vadi 10cm male-male 5 gab
  4. Pīkstulis (5V active buzzer)
  5. Rezistors 10KΩ 1 gab., 220Ω 1 gab.
  6. Fotorezistors 5506

Skaidrojums

Skaņas frekvence mainīsies atkarībā no fotorezistora apgaismojuma. Atkarībā no saņemtā gaismas daudzuma, caur fotorezistoru plūst strāva ar dažādu stiprumu, kurš tiks izmērīts pie Arduino mikrokontroliera analogās ieejas.

Slēgums

Slēdzam pie analogā pina A0, un digitālā pina D12.
Lietojam 10KΩ rezistoru pie fotorezistora.
Uzlīme uz pīkstuļa ir skaļuma ierobežošanai, to var noņemt. Svarīga ir pīkstuļa polaritāte (+).

Programma

Kā pieslēgt Arduino un kā lietot Arduino IDE programmu skatiet 1.nodarbībā

Atveram Arduino IDE programmu.
Fails – Jauns
Iekopējam kodu, tad Fails – Saglabāt. Pārbaudīt, tad Augšupielādēt.

/*
Gaismas mūzika
*/

int sensorValue;
int sensorLow = 1023;
int sensorHigh = 0;
const int ledPin = 13;

void setup() {
  pinMode(ledPin, OUTPUT); // ieslēdz iebūvēto LED
  digitalWrite(ledPin, HIGH);
  while (millis() < 5000) { // kalibrē 5 sekundes
    sensorValue = analogRead(A0);
    if (sensorValue > sensorHigh) {
      sensorHigh = sensorValue;
    }
    if (sensorValue < sensorLow) {
      sensorLow = sensorValue;
} }
  digitalWrite(ledPin, LOW); // izslēdz iebūvēto LED
}

void loop() {
  sensorValue = analogRead(A0); // nolasa fotorezistoru, analogais pins
int pitch =
map(sensorValue,sensorLow,sensorHigh, 50, 4000);
  tone(12,pitch,20); // funkcija tone - pīkstuļa pins,  frekvence, ilgums ms.
delay(10); }

Kad sāk skanēt, pārvietojam rokas virs fotorezistora, mēģinot izvilināt dažādas skaņas.

Papildu uzdevums 1

Izveidot slēgumu, lai varētu spēlēt dažādas melodijas.

Starp pīkstuli un digitālo pinu izmantojam rezistoru, lai strāvas stiprums uz to nepārsniegtu 0.025A (aprēķins: 5V / 0.025A = 200Ω, lietojam 220Ω rezistoru).

Programma

Melodija “Zvaniņš skan” (Jingle bells)


Notis pierakstām ar burtiem, bet pārtraukumus ar tukšumu.
Nots garumu liekam 2, bet notij ar tukšo vidu 4. Garumu arī tukšumiem, piem. 5.
Daudzums ir nošu un tukšumu skaits. Tempu (200) var mainīt pēc vēlmēm.

int skanPin = 12;
int daudzums = 26;
char notis[] = "eeeeeeegcde fffffeeeddedg ";
int notsgarums[] = {2, 2, 4, 2, 2, 4, 2, 2, 2, 2, 5, 1, 2, 2, 2, 3, 2, 2, 2, 3, 2, 2, 2, 2, 4, 9};
int temps = 200;

void speletToni(int tonis, int ilgums) {
for (long i=0; i < ilgums * 1000L; i += tonis * 2) {
digitalWrite(skanPin, HIGH);
delayMicroseconds(tonis);
digitalWrite(skanPin, LOW);
delayMicroseconds(tonis);
}
}

void speletNoti(char nots, int ilgums) {
char vardi[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
int toni[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 };

for (int i = 0; i < 8; i++) {
if (vardi[i] == nots) {
speletToni(toni[i], ilgums);
}
}

}

void setup() {
pinMode(skanPin, OUTPUT);
}

void loop() {
for (int i = 0; i < daudzums; i++) {
if (notis[i] == ' ') {
delay(notsgarums[i] * temps);
} else {
speletNoti(notis[i], notsgarums[i] * temps);
}

delay(temps / 2);
}
}

 

Papildu uzdevums 2

Izveidot jebkuru savu melodiju, labojot kodā 3 rindas:

int daudzums = 26; //nošu un tukšumu skaits
char notis[] = "eeeeeeegcde fffffeeeddedg ";
int notsgarums[] = {2, 2, 4, 2, 2, ... , 9};

Arduino sākumkomplekts nodarbībām 1-10 – 22.00€
Piegāde ar Latvijas pastu vai pakomātu (Omniva, DPD, PastaStacija) – 3.00€
Pasūtīšana un papildu info pa tālr.: 29216755 vai e-pastu: info[at]orient.lv