Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
Laagri Kool
Pärli Kilusk
5.a
Praktiline töö
Arduino arendusplatvormiga Uurimistöö
Juhendajad: Sven Kilusk, Aet Mikli
Harjumaa 2017
Sisukord
1. Sissejuhatus 3
2. Arvutid ja programmeerimine 4
3. Arendusplatvorm Arduino 6 3.1 Tutvustus 6 3.2 Ajalugu ja populaarsus 6 3.3 Erinevad Arduino tooted 7 3.4 Arduino programmeerimiskeel 7
4. Autoparkla automaatika 8 4.1 Lähteülesanne 8 4.2 Makett ja riistvara 8
4.2.1 Autoparkla 8 4.2.2 Sisendid 9 4.2.3 Väljundid 9 4.2.4 Juhtelektroonika 9 4.2.5 Elektriskeem 10
4.3 Programmeerimine 10 4.3.1 Algoritm 10 4.3.2 Programm 12 4.3.3 Kasutatud käsud 12
5. Kokkuvõte 14
6. Kasutatud kirjandus 15
7. Lisa (programmi väljatrükk, autoparkla automaatika) 16
2
1. Sissejuhatus
Tänapäeval on raske ette kujutada inimest, kes ei oska arvutit kasutada. Arvuti on praegu
hädavajalik pea kõikidel ametikohtadel. Aga et arvuti töötaks, on arvutile loodud programmid.
Programme on igasuguseid. On olemas erinevaid programmeerimiskeeli, millega programmi
kirjutada ja ka erinevaid seadmeid, mille peal programmi katsetada. Üks neist on arendusplatvorm
Arduino.
Selle uurimistöö teema on Arduino programmeerimine. Kuna koostaja käib robootikaringis, kus
tegeldakse LEGO Mindstorms’iga, siis sooviti tutvuda ka muude robotite/arendusplatvormidega.
Kõigepealt räägitakse töös üldiselt programmeerimisest ja robootikast, siis tutvustatakse Arduino
arendusplatvormi - selle ajalugu, populaarsust, erinevaid Arduino tooteid ja programmeerimiskeelt.
Praktiliseks osaks on programmeeritud autoparkla automaatika.
Töö käigus õpiti C++ keeles programmeerima. Saadi teada, et see programmeerimiskeel on väga
erinev graafilisest LEGO Mindstorms’ist.
3
2. Arvutid ja programmeerimine
Esimeseks programmeerijaks loetakse Ada Lovelace’i, kes sündis Inglismaal kakssada aastat tagasi.
Ta taipas, et masin on suuteline lahendama probleeme, kui sellele ette anda üksikasjalik juhis -
programm (1,8).
Kahjuks polnud sel ajal arvuteid, millel ta oma mõtet oleks katsetada saanud.
Programmeerimine on koodi kirjutamine, mis ütleb arvutile, mida teha. Programm ongi see kood,
mis luuakse. Kõik sülearvutid, tahvelarvutid, telefonid ja lauaarvutid vajavad programme, et neid
saaks kasutada. Mõnikord on programmi vaja kindla ülesande lahendamiseks. Selleks on vaja läbi
mõelda, milliseid samme peab programm tegema - neid samme kutsutakse algoritmiks (1,8).
Et panna arvuti mingit ülesannet teostama, peab andma talle täpse info, kuidas seda teha. Selleks, et
arvuti käsust aru saaks ja selle täidaks, tuleb leida keel, mille abil on võimalik inimese ja arvuti
suhtlus. Seda keelt nimetatakse programmeerimiskeeleks. Esimene programmeerimiskeel oli
assembler. Seda keelt oli väga ebamugav kasutada. See keel oli mõeldud käskude jada
ühendamiseks. Aja jooksul keeled arenesid. Praegu on olemas väga palju erinevaid keeli, näiteks
Phyton, Java, C++ (2,86).
C keele arendas välja Dennis Ritchie aastal 1970. Kuigi see oli loodud UNIX
operatsioonisüsteemile, kasvas õige pea ka teiste operatsioonisüsteemikasutajate huvi
C keele vastu. C keel on suurepärane keskkond, koodi lihtsuse ja laia võimaluste hulga tõttu. Selle
tõttu on ta esimene kõrgtaseme keel saadaval kõikidele uutele arvutitele, mikrokontrolleritest kuni
suurarvutiteni (3).
Igal arvutil on sisendid ja väljundid. Sisendite abil on võimalik arvutisse sisestada andmeid.
Sisendid on näiteks arvutihiir, klaviatuur ja puutetundlik ekraan. Väljundid on selleks, et arvuti
saaks midagi öelda/näidata. Väljundid on näiteks kõlar ja arvuti ekraan (1,9).
4
Arvutil on vaja mälu, et seal informatsiooni hoida. Programm loetakse mälust ja muudetakse
kodeeritud käskudeks. Mälus salvestatud juhiste abil töödeldakse sisendina vastu võetud teave.
Seda teeb seade, mida nimetatakse protsessoriks, mis on arvuti aju. Protsessor töötab
kahendsüsteemis esitatud numbrite järgi. Kahendsüsteemis öeldakse numbri 1 kohta “tõene” ja
numbri 0 kohta “väär” (4).
5
3. Arendusplatvorm Arduino
3.1 Tutvustus
Arduino on mikroprotsessori arendusplaat (Pilt 1). Selle külge saab panna igasuguseid sisendeid,
näiteks valgus-, heli- ja teisi andureid. Edasi reageerib Arduino vastavalt koodile ja käivitab
väljundi, näiteks mootori, ekraani jne (8).
Arduino on avatud lähtekoodiga, seetõttu on nende arendusplaatide hind väga soodne võrreldes
LEGO Mindstorms’iga. Samas eeldab Arduino kasutamine rohkem teadmisi elektroonikast.
Pilt 1. Arendusplaat Arduino UNO (foto tootja kodulehelt)
3.2 Ajalugu ja populaarsus
Arduino loodi 2005. aastal Itaalias Ivera linnas. Idee sai alguse vajadusest piisava võimekuse ja
odava hinnga arendusplaadi järele, mille abil õpilased saaksid teha elektroonikaprojekte (5).
6
Arduino populaarsus tõuseb ning on praegu väga heal tasemel. Sellest annab ettekujutuse “Google”
otsingupopulaarsus (Joonis 1).
Joonis 1. Arduino/Lego Mindstorms otsingupopulaarsus (allikas Google Trends)
3.3 Erinevad Arduino tooted
Arduino arendusplaatidest on saadaval palju mudeleid, mille abil on võimalik koostada erineva
eesmärgi ja raskusega projekte.
Arduinoga alustajatele sobivad odavamad ja lihtsamad UNO, 101, Pro ja neile sarnased, kuid
väiksemad Mini, Micro ja Nano. Suuremate projektide jaoks sobivad Mega, Zero ja Due (5).
3.4 Arduino programmeerimiskeel
Arduino programmeerimiskeel on lihtsustatud C++ keel. Selle abil luuakse mikroprotsessorile kood
(6).
7
4. Autoparkla automaatika
4.1 Lähteülesanne
Praktiliseks osaks uurimistööst oli autoparkla automaatika programmeerimine. Koostaja tegi
algoritmi ja tööprogrammi, mille testimiseks valmistas juhendaja autoparkla mudeli.
● Autoparkla automaatika ülesandeks on pidada arvestust parklas olevate vabade kohtade üle
ning näidata vastavat numbrit ekraanil.
● Vabade kohtade arvu muudetakse vaid siis, kui auto on värava täielikult läbinud.
● Süsteem ei tohi reageerida väravat läbivatele jalakäijatele.
● Kui vabu kohti pole, peab tõkkepuu sulguma.
● Tõkkepuu peab avanema väljuvatele autodele.
● Vabade kohtade arv peab olema parklaoperaatori poolt muudetav.
4.2 Makett ja riistvara
4.2.1 Autoparkla
Tööprogrammi testimiseks valmistas juhendaja autoparkla mudeli.
Parkla mudel koosneb parkla-alast kuuele autole, parklamajast, haljasalast ja tänavaosast.
Parklamaja sisse on paigutatud Arduino arendusplaat ning enamik elekroonikast. Kasutatud on ka
mudelautosid ja nukku (Pilt 2).
8
Pilt 2. Autoparkla makett (Foto autor - Pärli Kilusk)
4.2.2 Sisendid
Autoparkla mudelil on 4 sisendit. Need on 2 optilist andurid, mis jälgivad autosid ja 2
parklaoperaatori nuppu.
4.2.3 Väljundid
Mudelil on 11 väljundit. Need on: 2 LED lampi (näitavad andurite olekut), valjuhääldi, tõkkepuu
servomootor, infotabloo 7 segmenti.
4.2.4 Juhtelektroonika
Juhtelektroonikana kasutatakse arendusplaati Arduino UNO. Arendusplaadil on sisendite/väljundite
klemmid, mikroprotsessor ning mälu, kus hoitakse tööprogrammi.
9
4.2.5 Elektriskeem
Juhendaja koostas autoparkla mudeli elektriskeemi, kus on märgitud kõik sisendid ja väljundid ja
nende nimetused (Joonis 2). Elektriskeem oli vajalik programmi koostamiseks, et määrata sisendeid
ja väljundeid.
Joonis 2. Autoparkla elektriskeem (koostaja Sven Kilusk)
4.3 Programmeerimine
4.3.1 Algoritm
Enne programmeerimist koostati algoritm, et oleks lihtsam programmeerida. Algoritm on lihtne
tegevuste jada, mis näitab täpselt, mida programm tegema peab (1,12). Alguses koostati algoritm
autode sisenemise ja väljumise puhul. Seejärel lisati tõkkepuu juhtimine ning vabade kohtade
kuvamine ekraanil. Lisati ka operaatori nuppude võimalus ning helisignaalid. Algoritmi
joonistamiseks kasutati programmi Draw.io (Joonis 3).
10
Joonis 3. Autoparkla automaatika algoritm (koostaja Pärli Kilusk)
11
4.3.2 Programm
Et autoparkla mudel töötaks, on koostatud programm, kasutades Arduino IDE tarkvara (Pilt 3).
Autoparkla tööprogramm on uurimistöö lõpus toodud välja eraldi lisana.
Pilt 3. Aduino IDE ekraanitrükk (autor Pärli Kilusk)
4.3.3 Kasutatud käsud
Programmis on kasutatud erinevaid käske. Käsud on täpsed juhised mingi ülesande täitmiseks. Siin
on mõned tavalisemad käsud lahti seletatud.
Programmis on kasutatud käsku “tone”. Selle käsuga saab panna Arduino helisignaali tegema, kui
selle küljes on valjuhääldi. Selle käsu juurde on lisatud helikõrgus hertsides ja heli kestvus
millisekundites.
Veel on programmis käsk “void”. Sellega saab määrata alamprogramme. Almprogramm on väike
eraldi programm programmis.
12
Tihti on kasutatud käske “if” ja “else” (“kui” ja “muidu”). Nende käskudega saab kontrollida mingi
sisendi või väljundi olekut.
Programmis on veel käsk “DigitalWrite(A2,HIGH)”. Selle käsuga saab panna väljundis 2 LED
lambi põlema. Sellele käsule on vastupidine käsk “DigitalWrite(A2,LOW)”, mis kustutab lambi.
Programmis on kasutatud ka käsku “switch”. See käsk on nagu pikk if-else käskude jada, kus
kontrollitakse ühe ja sama muutuja olekut (7,21). On kasutatud ka käsku “delay”. Selle käsuga saab panna mudeli pausile, mille kestvus määratakse
millisekundites.
13
5. Kokkuvõte
Uurimistöös räägiti Arduino arendusplatvormist, selle ajaloost, populaarsusest, erinevatest Arduino
toodetest ja Arduino programmeerimiskeelest.
Praktiliseks osaks uurimistööst oli autoparkla automaatika programmeerimine. Selles osas on kirjas,
mida peab automaatika tegema, protsessi sisenditest ja väljunditest, juhtelektroonikast ja
elektriskeemist.
Uurimistöö tulemusena õpiti koostama algoritme, kasutades “Draw.io” tarkvara.
Samuti õpiti kasutama Arduino IDE tarkvara, mille abil koostati autoparkla automaatika
tööprogramm.
Koostaja leidis ka, et Arduino arendusplaat on soodsa hinnaga. Seetõttu võib selle jättagi
valmistatud autoparkla mudelisse.
14
6. Kasutatud kirjandus
1. Max Wainewright “Noor progeja. Üksikasjalik programmeermisõpik.”, 2016
2. Larousse’i noorteentsüklopeedia “Matemaatika ja informaatika”,2001
3. http://digi.physic.ut.ee/mw/images/9/99/Progemine.pdf
4. http://mikroprotsessoridjakontrollerid.weebly.com/mikroprotsessor.html
5. Selena Lubi “Arduino stardikomplekti õppematerjalid”, 2016
6. https://www.am.ee/node/2193
7. Leivo Sepp “Robootika?... See on imelihtne!”, 2013
8. http://kodu.ut.ee/~alop/Arduino_Robot.pdf
15
7. Lisa (programmi väljatrükk, autoparkla automaatika) #include <Servo.h> // Lae "servo" teek (library) Servo myservo; // Anna servomootorile nimi "myservo" int ValAndAnaloog; // Defineeri muutuja (välimine andur, analoog) int SisAndAnaloog; // Defineeri muutuja (sisemine andur, analoog) int Vabukohti; // Defineeri muutuja (vabade kohtade arv parklas) int ServoAsend; // Defineeri muutuja (tõkkepuu asend kraadides) boolean ValAnd; // Defineeri muutuja (välimine andur, digitaal) boolean SisAnd; // Defineeri muutuja (sisemine andur, digitaal) void setup() { pinMode(2, OUTPUT); // Määra pin 2 digitaalväljundiks, displei segment pinMode(3, OUTPUT); // Määra pin 3 digitaalväljundiks, displei segment pinMode(4, OUTPUT); // Määra pin 4 digitaalväljundiks, displei segment pinMode(5, OUTPUT); // Määra pin 5 digitaalväljundiks, displei segment pinMode(6, OUTPUT); // Määra pin 6 digitaalväljundiks, displei segment pinMode(8, OUTPUT); // Määra pin 8 digitaalväljundiks, displei segment pinMode(9, OUTPUT); // Määra pin 9 digitaalväljundiks, displei segment pinMode(10, OUTPUT);// Määra pin 10 digitaalväljundiks, piezo summer myservo.attach(11); // Määra pin 11 digitaalväljundiks (servole) pinMode(12, INPUT); // Määra pin 12 digitaalsisendiks (nupp+) pinMode(13, INPUT); // Määra pin 13 digitaalsisendiks (nupp-) pinMode(A0, INPUT); // Määra pin A0 analoogsisendiks (välimine andur) pinMode(A1, INPUT); // Määra pin A1 analoogsisendiks (sisemine andur) pinMode(A2, OUTPUT); // Määra pin A2 digitaalväljundiks (välimine LED) pinMode(A3, OUTPUT); // Määra pin A3 digitaalväljundiks (sisemine LED) Vabukohti = 6; // Määra vabade kohtade algarv parklas KuvaVabukohti(); // Mine alamprogrammi "KuvaVabukohti" ServoAsend = 90; // Määra tõkkepuu algasend (üleval myservo.write(ServoAsend); // Paiguta servo) delay(1000); Meloodia(); // Mängi algusmeloodiat (alamprogramm "Meloodia") } void loop() { myservo.write(ServoAsend); // Paiguta servo KuvaVabukohti(); // Mine alamprogrammi "KuvaVabukohti" KontrolliAndureid(); // Mine alamprogrammi "KontrolliAndureid" Tingimus1(); // Kontrolli algoritme alamprogrammis "Tingimus1" }
16
void Tingimus1 () // Määra alamprogramm "Tingimus1" { KontrolliAndureid(); // Kutsu välja alamprogramm "Kontrolli andureid" switch (ValAnd) // Kontrolli muutuja "ValAnd" olekut { case true: // juhul kui (true), siis Tingimus2(); // kutsu välja alamprogramm "Tingimus2" break; case false: // juhul kui (false), siis Tingimus3(); // kutsu välja alamprogramm "Tingimus3" break; } } void Tingimus2 () { KontrolliAndureid(); switch (SisAnd) { case true: Tingimus5(); break; case false: Tingimus1(); break; } } void Tingimus3 () { KontrolliAndureid(); switch (SisAnd) { case true: Tingimus4(); break; case false: Tingimus10(); break; } } void Tingimus4 () { KontrolliAndureid(); switch (ValAnd) { case true:
17
Tingimus11(); break; case false: Tingimus3(); break; } } void Tingimus5 () { KontrolliAndureid(); switch (!ValAnd) { case true: Tingimus6(); break; case false: Tingimus2(); break; } } void Tingimus6 () { KontrolliAndureid(); switch (!SisAnd) { case true: Vabukohti = Vabukohti - 1; // vähenda vabade kohtade arvu tone(10, 500, 100); // tee 1 piiks if (Vabukohti < 0) { // kui vabu kohti on alla nulli, Vabukohti = 0; // anna väärtuseks 0 } Tingimus9(); break; case false: Tingimus5(); break; } } void Tingimus7 () { KontrolliAndureid(); switch (!SisAnd)
18
{ case true: Tingimus8(); break; case false: Tingimus4(); break; } } void Tingimus8 () { KontrolliAndureid(); switch (!ValAnd) { case true: Vabukohti = Vabukohti + 1; // suurenda vabade kohtade arvu tone(10, 500, 100); // tee 1 piiks delay(150); // tee paus 150 millisekundit tone(10, 500, 100); // tee 1 piiks if (Vabukohti > 6) // kui vabu kohti on üle kuue, { Vabukohti = 6; // anna väärtuseks } break; case false: Tingimus7(); break; } } void Tingimus9 () { switch (Vabukohti) { case 0: // Kui vabu kohti on 0, for (ServoAsend = 90; ServoAsend >7; ServoAsend -= 1) { // lase tõkkepuu alla myservo.write(ServoAsend); delay(15); } break; } }
19
void Tingimus10 () { switch (Vabukohti == 0 && ServoAsend == 90) { case true: // Kui vabu kohti pole ja tõkkepuu on üleval, for (ServoAsend = 90; ServoAsend > 7; ServoAsend -= 1) { //lase tõkkepuu alla myservo.write(ServoAsend); delay(15); } break; case false: Tingimus16(); break; } } void Tingimus11 () { switch (ServoAsend == 7) { case true: // Kui tõkkepuu on all, for (ServoAsend = 7; ServoAsend < 90; ServoAsend += 1) { //tõsta tõkkepuu üles myservo.write(ServoAsend); delay(15); } myservo.write(ServoAsend); Tingimus7(); break; case false: Tingimus7(); break; } } void Tingimus12 () { switch (digitalRead(13)) // Kui nupp1 vajutatakse alla, { case true: Tingimus13(); break;
20
case false: Tingimus14(); break; } } void Tingimus13 () { switch (!digitalRead(13)) // Kui nupp1 läheb algasendisse, { case true: Vabukohti = Vabukohti - 1; // Vähenda vabade kohtade arvu tone(10, 500, 100); // tee 1 piiks if (Vabukohti < 0){ // kui vabu kohti on alla nulli, Vabukohti = 0; // anna väärtuseks 0 } break; case false: Tingimus13(); break; } } void Tingimus14 () { switch (digitalRead(12)) // Kui nupp2 vajutatakse alla, { case true: Tingimus15(); break; } } void Tingimus15 () { switch (!digitalRead(12)) // kui nupp2 läheb algasendisse, { case true: Vabukohti = Vabukohti + 1; // suurenda vabade kohtade arvu tone(10, 500, 100); // tee 1 piiks delay(150); // tee paus 150 millisekundit tone(10, 500, 100); // tee 1 piiks if (Vabukohti > 6){ // kui vabu kohti on üle kuue, Vabukohti = 6;// anna väärtuseks 6
21
} break; case false: Tingimus15(); break; } } void Tingimus16 () { switch (Vabukohti > 0 && ServoAsend == 7) // Kui vabu kohti on rohkem kui 0 ja tõkkepuu on all, { case true: for (ServoAsend = 7; ServoAsend < 90; ServoAsend += 1) { // tõsta tõkkepuu üles myservo.write(ServoAsend); delay(15); } break; case false: Tingimus12(); break; } } void KuvaVabukohti () // Määra alamprogramm "KuvaVabukohti" { switch (Vabukohti) // kontrolli muutuja "Vabukohti" väärtust { case 0: // juhul kui vabu kohti on 0: digitalWrite(2, HIGH); // displei segmendi lülitamine digitalWrite(3, HIGH); // displei segmendi lülitamine digitalWrite(4, HIGH); // displei segmendi lülitamine digitalWrite(5, HIGH); // displei segmendi lülitamine digitalWrite(6, HIGH); // displei segmendi lülitamine digitalWrite(8, HIGH); // displei segmendi lülitamine digitalWrite(9, LOW); // displei segmendi lülitamine break; case 1: // juhul kui vabu kohti on 1: digitalWrite(3, HIGH); // displei segmendi lülitamine digitalWrite(4, HIGH); // displei segmendi lülitamine digitalWrite(5, LOW); // displei segmendi lülitamine digitalWrite(2, LOW); // displei segmendi lülitamine digitalWrite(6, LOW); // displei segmendi lülitamine digitalWrite(8, LOW); // displei segmendi lülitamine digitalWrite(9, LOW); // displei segmendi lülitamine break;
22
case 2: // juhul kui vabu kohti on 2: digitalWrite(2, HIGH); // displei segmendi lülitamine digitalWrite(3, HIGH); // displei segmendi lülitamine digitalWrite(9, HIGH); // displei segmendi lülitamine digitalWrite(6, HIGH); // displei segmendi lülitamine digitalWrite(5, HIGH); // displei segmendi lülitamine digitalWrite(8, LOW); // displei segmendi lülitamine digitalWrite(4, LOW); // displei segmendi lülitamine break; case 3: // juhul kui vabu kohti on 3: digitalWrite(2, HIGH); // displei segmendi lülitamine digitalWrite(3, HIGH); // displei segmendi lülitamine digitalWrite(9, HIGH); // displei segmendi lülitamine digitalWrite(4, HIGH); // displei segmendi lülitamine digitalWrite(5, HIGH); // displei segmendi lülitamine digitalWrite(8, LOW); // displei segmendi lülitamine digitalWrite(6, LOW); // displei segmendi lülitamine break; case 4: // juhul kui vabu kohti on 4: digitalWrite(2, LOW); // displei segmendi lülitamine digitalWrite(8, HIGH); // displei segmendi lülitamine digitalWrite(9, HIGH); // displei segmendi lülitamine digitalWrite(3, HIGH); // displei segmendi lülitamine digitalWrite(4, HIGH); // displei segmendi lülitamine digitalWrite(6, LOW); // displei segmendi lülitamine digitalWrite(5, LOW); // displei segmendi lülitamine break; case 5: // juhul kui vabu kohti on 5: digitalWrite(2, HIGH); // displei segmendi lülitamine digitalWrite(8, HIGH); // displei segmendi lülitamine digitalWrite(9, HIGH); // displei segmendi lülitamine digitalWrite(4, HIGH); // displei segmendi lülitamine digitalWrite(5, HIGH); // displei segmendi lülitamine digitalWrite(3, LOW); // displei segmendi lülitamine digitalWrite(6, LOW); // displei segmendi lülitamine break; case 6: // juhul kui vabu kohti on 6: digitalWrite(2, HIGH); // displei segmendi lülitamine digitalWrite(8, HIGH); // displei segmendi lülitamine digitalWrite(6, HIGH); // displei segmendi lülitamine digitalWrite(5, HIGH); // displei segmendi lülitamine digitalWrite(4, HIGH); // displei segmendi lülitamine digitalWrite(9, HIGH); // displei segmendi lülitamine digitalWrite(3, LOW); // displei segmendi lülitamine
23
break; } } void KontrolliAndureid () { ValAndAnaloog = analogRead(A0); // Anna muutujale väärtus analoogsisendist SisAndAnaloog = analogRead(A1); // Anna muutujale väärtus analoogsisendist if (ValAndAnaloog > 120) { digitalWrite(A2, HIGH); // Välimise LEDi lülitamine ValAnd = true; } else { digitalWrite(A2, LOW); // Välimise LEDi lülitamine ValAnd = false; } if (SisAndAnaloog > 120) { digitalWrite(A3, HIGH); // Sisemise LEDi lülitamine SisAnd = true; } else { digitalWrite(A3, LOW); // Sisemise LEDi lülitamine SisAnd = false; } } void Meloodia () // Määra alamprogramm "Meloodia" { tone(10, 262, 250); // Mängi noot delay(325); // Tee paus tone(10, 196, 125); delay(162); tone(10, 196, 125); delay(162); tone(10, 220, 250); delay(325); tone(10, 196, 250); delay(900); tone(10, 247, 250); delay(325); tone(10, 262, 250);
24