Przyrząd do grania bluesa Projekt zaliczeniowy z przedmiotu Programowanie Mikrokontrolerów Artem Poliszczuk 1 Opis działania urządzenia W ramach projektu skonstruowano urządzenie pozwalające na granie bluesa za pomocą ruchów dłonią (bądź czymkolwiek innym). Konstrukcja została oparta na mikrokontrolerze Atmega 328P podłączonym do platformy Arduino Uno. Ruch wykrywany był przez ultradźwiękowy czujnik ruchu, z którego sygnał był przekazywany poprzez mikrokontroler do brzęczyka. W zależności od odległości przedmiotu od czujnika ruchu, brzęczyk emitował inny sygnał dźwiękowy odpowiadający jednej ze składowych bluesowej skali G. Ponadto układ był wyposażony w trzy diody: żółtą, zieloną oraz czerwoną. Żółta dioda zapalała się w momencie, gdy w odległości od czujnika, pozwalającej na emisję dźwięku, nie znajdował się żaden przedmiot. Zakres tej odległości ustawiono na przedział [3cm, 28cm] od czujnika. Każdemu elementowi skali przypisany był odpowiedni odcinek o długosci 3cm 1. Diody zielona oraz czerwona były przypisane do poszczególnych dźwięków tak, by grając po kolei elementy skali zapalały się one naprzemiennie. 2 Elementy użyte do zbudowania układu Do zbudowania układu użyto następujących elementów: platforma Arduino Uno mikrokontroler Atemga 328P ultradźwiękowy czujnik odległości HC-3R04 brzęczyk TMB12A05 1 Prócz najniższego dźwięku, rozpoczynającego się najdalej - jemu był przypisany odcinek o długości 7cm 1
diody (żółta, zielona, czerwona) dwa oporniki 1kΩ przewody płytka stykowa (breadboard) 3 Efekt końcowy oraz schemat budowy układu Na poniższych zdjęciach widać zbudowany układ. Rysunek 1: Budowa układu. Widok z góry 2
Rysunek 2: Budowa układu. Widok z boku W rozdziale DODATEK umieszczono schemat układu. Część opisującą platformę Arduino Uno pobrano ze strony producenta. 4 Kod Kod programu składał się z następujących funkcji: funkcji setup() ustawiającej piny podłączone do poszczególnych elementów układu na stan wejścia lub wyjścia, funkcji microsecondstocenimeters() otrzymującej w postaci argumentu czas, który upłynął między emisją i rejestracją sygnału dźwiękowego przez czujnik i zwracającej odległość między czujnikiem i przeszkodą, funkcji play(), która przypisywała wartości zwróconej przez funkcję microsecondstocenimeters()dźwięk odpowiadający długości fali zdefiniowanej w pliku nagłówkowym pitches.h oraz odpowiednią konfigurację diod, ponadto funkcja play() dbała o to, by przerywać emitowanie dźwięku jedynie wówczas, gdy zmieni się odległość pomiędzy czujnikiem i przeszkodą. Funkcja play() była realizowana wewnątrz funkcji loop() tworzącej pętlę. 4.1 Kod programu #i n c l u d e p i t c h e s. h c o n s t u n s i g n e d i n t t p i n =2; 3
const unsigned i n t epin =4; const unsigned i n t green =7; const unsigned i n t red =6; const unsigned i n t yellow =8; const unsigned i n t buzzerpin =12; void play ( long cm, long old cm ) ; void setup ( ){ pinmode ( tpin, OUTPUT) ; pinmode ( epin, INPUT ) ; pinmode ( green, OUTPUT) ; pinmode ( red, OUTPUT) ; pinmode ( yellow, OUTPUT) ; pinmode ( buzzerpin, OUTPUT) ; void loop ( ){ long duration, cm, old cm ; d i g i t a l W r i t e ( tpin, LOW) ; delaymicroseconds ( 2 ) ; d i g i t a l W r i t e ( tpin, HIGH ) ; delaymicroseconds ( 1 0 ) ; d i g i t a l W r i t e ( tpin, LOW) ; old cm=cm ; duration=p u l s e I n ( epin, HIGH ) ; cm=microsecondstocentimeters ( duration ) ; play (cm, old cm ) ; long microsecondstocentimeters ( long microseconds ) { return microseconds /29/2; // p r z e k s z t a l c e n i e czasu na o d l e g l o s c // predkosc dzwieku : 29 mikrosekund /cm // sygnal l e c i tam i z powrotem, // d l a t e g o nas i n t e r e s u j e polowa o d l e g l o s c i 4
void play ( long cm, long old cm ){ i f ( old cm!=cm){ notone ( 1 2 ) ; i f (cm>3 && cm<=6){ d i g i t a l W r i t e ( red, HIGH ) ; tone (12, NOTE G3 ) ; i f (cm>6 && cm<=9){ d i g i t a l W r i t e ( red, LOW) ; d i g i t a l W r i t e ( green, HIGH ) ; tone (12, NOTE F3 ) ; i f (cm>9 && cm<=12){ d i g i t a l W r i t e ( red, HIGH ) ; tone (12, NOTE D3 ) ; i f (cm>12 && cm<=15){ d i g i t a l W r i t e ( red, LOW) ; d i g i t a l W r i t e ( green, HIGH ) ; tone (12, NOTE CS3 ) ; i f (cm>15 && cm<=18){ d i g i t a l W r i t e ( red, HIGH ) ; tone (12, NOTE C3 ) ; i f (cm>18 && cm<=21){ d i g i t a l W r i t e ( red, LOW) ; d i g i t a l W r i t e ( green, HIGH ) ; tone (12, NOTE AS2 ) ; 5
i f (cm>21 && cm<=28){ d i g i t a l W r i t e ( red, HIGH ) ; tone (12, NOTE G2 ) ; { d i g i t a l W r i t e ( red, LOW) ; d i g i t a l W r i t e ( yellow, HIGH ) ; delay ( 3 0 0 ) ; 4.2 Kod pliku nagłówkowego pitches.h #d e f i n e NOTE B0 31 #d e f i n e NOTE C1 33 #d e f i n e NOTE CS1 35 #d e f i n e NOTE D1 37 #d e f i n e NOTE DS1 39 #d e f i n e NOTE E1 41 #d e f i n e NOTE F1 44 #d e f i n e NOTE FS1 46 #d e f i n e NOTE G1 49 #d e f i n e NOTE GS1 52 #d e f i n e NOTE A1 55 #d e f i n e NOTE AS1 58 #d e f i n e NOTE B1 62 #d e f i n e NOTE C2 65 #d e f i n e NOTE CS2 69 #d e f i n e NOTE D2 73 #d e f i n e NOTE DS2 78 #d e f i n e NOTE E2 82 #d e f i n e NOTE F2 87 #d e f i n e NOTE FS2 93 #d e f i n e NOTE G2 98 #d e f i n e NOTE GS2 104 #d e f i n e NOTE A2 110 #d e f i n e NOTE AS2 117 6
#d e f i n e NOTE B2 123 #d e f i n e NOTE C3 131 #d e f i n e NOTE CS3 139 #d e f i n e NOTE D3 147 #d e f i n e NOTE DS3 156 #d e f i n e NOTE E3 165 #d e f i n e NOTE F3 175 #d e f i n e NOTE FS3 185 #d e f i n e NOTE G3 196 #d e f i n e NOTE GS3 208 #d e f i n e NOTE A3 220 #d e f i n e NOTE AS3 233 #d e f i n e NOTE B3 247 #d e f i n e NOTE C4 262 #d e f i n e NOTE CS4 277 #d e f i n e NOTE D4 294 #d e f i n e NOTE DS4 311 #d e f i n e NOTE E4 330 #d e f i n e NOTE F4 349 #d e f i n e NOTE FS4 370 #d e f i n e NOTE G4 392 #d e f i n e NOTE GS4 415 #d e f i n e NOTE A4 440 #d e f i n e NOTE AS4 466 #d e f i n e NOTE B4 494 #d e f i n e NOTE C5 523 #d e f i n e NOTE CS5 554 #d e f i n e NOTE D5 587 #d e f i n e NOTE DS5 622 #d e f i n e NOTE E5 659 #d e f i n e NOTE F5 698 #d e f i n e NOTE FS5 740 #d e f i n e NOTE G5 784 #d e f i n e NOTE GS5 831 #d e f i n e NOTE A5 880 #d e f i n e NOTE AS5 932 #d e f i n e NOTE B5 988 #d e f i n e NOTE C6 1047 #d e f i n e NOTE CS6 1109 #d e f i n e NOTE D6 1175 7
#d e f i n e NOTE DS6 1245 #d e f i n e NOTE E6 1319 #d e f i n e NOTE F6 1397 #d e f i n e NOTE FS6 1480 #d e f i n e NOTE G6 1568 #d e f i n e NOTE GS6 1661 #d e f i n e NOTE A6 1760 #d e f i n e NOTE AS6 1865 #d e f i n e NOTE B6 1976 #d e f i n e NOTE C7 2093 #d e f i n e NOTE CS7 2217 #d e f i n e NOTE D7 2349 #d e f i n e NOTE DS7 2489 #d e f i n e NOTE E7 2637 #d e f i n e NOTE F7 2794 #d e f i n e NOTE FS7 2960 #d e f i n e NOTE G7 3136 #d e f i n e NOTE GS7 3322 #d e f i n e NOTE A7 3520 #d e f i n e NOTE AS7 3729 #d e f i n e NOTE B7 3951 #d e f i n e NOTE C8 4186 #d e f i n e NOTE CS8 4435 #d e f i n e NOTE D8 4699 #d e f i n e NOTE DS8 4978 8
5 DODATEK 9 Rysunek 3: Schemat budowy układu