Muzyczny metronom przy użyciu Arduino i HMI

Miejsce dobre do dyskusji nad własnymi projektami - pochwal się wszystkim co samodzielnie stworzyłeś.
ODPOWIEDZ
EfrainKenson
-
Posty: 21
Rejestracja: 21 lip 2021, 7:01

Muzyczny metronom przy użyciu Arduino i HMI

Post autor: EfrainKenson » 02 sie 2021, 11:20

Artykuł Wprowadzenie

W niniejszym artykule opracowano metronom muzyczny oparty na ekranie Stone-STVC070WT. Ten schemat wykorzystuje ekran HMI Stone-STVC070WT jako platformę sterowania wyświetlaczem i płytkę Arduino jako terminal wyjściowy audio beat, aby stworzyć prosty i łatwy w użyciu metronom muzyczny.

Realizacja funkcji

1. Interfejs funkcjonalny Metronome UI, zapewniający funkcję dotykową;

2. Funkcja ustawiania częstotliwości, która może być regulowana od 40 do 120 razy/min z interwałem 10 poprzez dotknięcie przycisku;

3. Funkcja ustawiania beatu. Dotykając przycisku, 1/4, 2/4, 3/4 i 4/4 bity mogą być ustawione przez zawieszenie;

4. Funkcja kontroli odtwarzania, rozpoczęcie lub zatrzymanie wykonywania beatu;

5. Płyta Arduino napędza brzęczyk, aby zrealizować dźwięk bicia;

6. Komunikacja szeregowa realizuje wymianę informacji pomiędzy ekranem a Arduino.

Obrazek

Projekt oprogramowania terminala wykonawczego back-end

(1) Ton, który napędza brzęczyk do wytworzenia rytmu

Arduino posiada wbudowaną funkcję o nazwie tone( ), która jako parametry wejściowe przyjmuje piny sterownika oraz częstotliwość. Im wyższa częstotliwość, tym wyższy ton, a zasada działania to PWM.

Kod: Zaznacz cały

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

int pinBuzzer = 3; // Pin D3 is connected to the signal pin of the buzzer module

void setup()

{

PinMode (pinBuzzer, the OUTPUT);// Set the Pinbuzzer foot to output

}

void Beep(long fre,unsigned int on,unsigned int off)

{

Long frequency = MAC;// Frequency, in Hz

// Use the tone() function to emit the waveform with frequency

Tone (pinBuzzer, frequency);

Delay (on);// Wait 1000 milliseconds

NoTone (pinBuzzer);// Stop vocalizing

Delay (off);// Wait for 2000 milliseconds

}
Aby uzyskać efekt beatu, potrzebne są dwa dźwięki. Wybieramy reprezentatywne, 300Hz i 600Hz, domyślnie 600Hz jako mocne dudnienie.

(2) Ustaw prędkość bicia

W rzeczywistości bardzo łatwo jest obliczyć tempo Speed, głównie dlatego, że Speed jest ustawioną wartością, a metoda rytmu to głównie 1/4, 2/4, 3/4, 4/4, czyli ostatnie uderzenie każdego taktu przy wzmocnionej muzyce (600Hz) jest OK;

Na przykład, jeśli prędkość wynosi 120, a rytm jest 3/4, to czas trwania każdego taktu (włączając buczenie i ciszę) wynosi 60S ÷120=0,5s, a w każdej sekcji są 4 takty. Pierwsze 2 uderzenia to 300Hz pianissimo, a trzecie to 600Hz forte.

Kolejność tonów jest następująca:

Beep (300250250);

Bip (300250250);

Beep (600250250);

Funkcja jest ponownie enkapsulowana do użycia w kolejnych wydajnych Ustawieniach.

Kod: Zaznacz cały

void metronome(unsigned char metr,unsigned char speed)

{

unsigned char i;

Unsigned int on = 250;

Unsigned int off = 60000 / speed - 250;

for(i=0;i

{

Beep(300,on,off);

}

Beep(600,on,off);

}
(3) Komunikacja szeregowa

Zainicjuj port szeregowy funkcją Serial. Begin function, napisz port szeregowy jak funkcja odbiornika przerwania i funkcja parse, i zadeklaruj bufor odbiorczy portu szeregowego char Uart_RX_Buf[9];

Kod: Zaznacz cały

Serial.begin(115200);

void serialEvent()

{

If (Serial. The available () & gt;0)

{

char tmp = Serial.read();

//- Determined if a data packet is being received

if(Uart_Packet_IN)

{

Uart_RX_Buf[Uart_Current_Order++] = tmp;

< / span > < span > < span >The set length of the packet

if(Uart_Current_Order == 9)

{

// Check if the end-of-&& checksum is correct

Uart_Packet_Flag = 1;// A valid packet is received

Uart_Packet_IN = 0;//-- No longer in the receiving packet state

Uart_Current_Order = 0;// reset the number

}

//- Check if it is a data header

else if(tmp==Uart_Packet_Header)

{

Uart_Packet_IN = 1;

Uart_RX_Buf [0] = TMP;

Uart_Current_Order + +;

}

}
Instrukcja przetwarzania jest parsowana i wykonywana w następujący sposób:

Kod: Zaznacz cały

void process(void)

{

Uart0_Packet_Flag = 0;

The switch (Uart0_RX_Buf [5])

{

//-- Determinate whether it is speed or tempo

Case 0 x06:

{

Speed = Uart0_RX_Buf [8];

break;

}

//-- Determinate whether it is speed or tempo

Case 0 x07:

{

Metr = Uart0_RX_Buf [8];

break;

}

Default: break;

}
Badanie efektu działania systemu

Obrazek

ODPOWIEDZ