Granie melodii na silnikach DC

Ostatnio opisywałem szablon projektu na STM32 i konfigurację środowiska, więc teraz pora na jakiś praktyczny projekt. Będzie nim program grający melodie na silnikach. Kiedyś napisałem taki programik, żeby sprawdzić czy działa sterowanie silnikami w moim robocie. W tym czasie na Forbot.pl był konkurs na robota z akcentem świątecznym i Wśród nocnej ciszy w wykonaniu mojego robota wygrało.

Pojawiła się propozycja, żeby z okazji zwycięstwa zagrać na silnikach We are the champions, ale poległem na tym zadaniu. Problemem było to, że za słabo znam się na muzyce i bazowałem tylko na nutach znalezionych w necie i jak coś było nie tak, nie umiałem tego poprawić. Ostatnio wróciłem do tematu i postanowiłem opublikować i trochę opisać kod na STM32F4 Discovery.

Potrzebne elementy

Do wykonania projektu potrzebujemy:

  • Zestaw uruchomieniowy STM32F4 Discovery.
  • Moduł mostka H TB6612.
  • Silnik DC – w moim wypadku były to dwa silniki Pololu, ale może być jakikolwiek silnik i wystarczy jeden.
  • Zasilanie do silników – ja użyłem zasilacza laboratoryjnego.
  • Przewody połączeniowe.

Połączenia pinów pomiędzy modułem Discovery a mostkiem TB6612 obrazuje tabela.

Pin STM32F4 DiscoveryPin TB6612
PA00PWMA
PA01PWMB
PC00AIN1
PC01BIN1
PC02AIN2
PC03BIN2

Zasada działania

Dźwięki to fale akustyczne o odpowiedniej częstotliwości. Częstotliwości konkretnych dźwięków można znaleźć na stronie: link. Jeśli na silniki DC podamy sygnał PWM o pewnej częstotliwości, powstaną fale dźwiękowe. Jeżeli możemy sterować częstotliwością PWM, to możemy również sterować częstotliwością dźwięków wydawanych przez silnik. Program musi więc podawać na silnik sygnał o zmieniającej się częstotliwości, żeby wygenerować melodię.

Program

Program oparty jest na moim szablonie i wykorzystuje FreeRTOS. Składa się z drivera układu TB6612 znajdującego się w folderze src/hw/tb6612 i z tasku wykonującego główną logikę programu w folderze src/code/music_task. Jest jeszcze plik src/code/music_task/tone_freqs.h zawierający definicje częstotliwości poszczególnych dźwięków. Źródła są dostępne na moim GitHubie.

Driver silnika wykorzystuje Timer 2 w trybie PWM, 2 porty GPIO na wyjścia PWM i 4 porty GPIO do sterowania kierunkiem obrotów silnika. Driver udostępnia funkcję zadającą na oba silniki sygnał PWM o zadanym wypełnieniu i okresie w mikrosekundach przekazywanym w parametrze. Timer jest skonfigurowany tak, że jeden tick wynosi 1us, tak więc wartość okresu jest ustawiana jako wartość przepełnienia licznika (rejestr ARR). Do rejestrów sterujących wypełnieniem (CCR) wpisywana jest wartość okresu przesunięta o 3 bity w prawo, czyli podzielona przez 8, co daje 12.5% wypełnienia. Jeżeli silniki nie startują przy tym wypełnieniu, można je zwiększyć.

Plik music_task.c zawiera funkcję music_task, gdzie wykonuje się główna logika programu. W niej inicjalizowany jest driver silnika, a następnie w pętli wywoływana funkcja play z wybraną melodią przekazywaną jako parametr. Funkcja play czyta kolejne nuty z tablicy i ustawia odpowiednie częstotliwości na silniki.

Melodie są przechowywane w tablicach nut (tablice struktur note). Dla każdej nuty zdefiniowana jest częstotliwość odpowiadająca dźwiękowi np. C4, Gis5 itd. oraz długość np. półnuta, ósemka itd. W programie znajdują się wypełnione tablice dla trzech melodii – Marszu Imperialnego z Gwiezdnych Wojen, kolędy Wśród nocnej ciszy i We are the champions zespołu Queen.

Podsumowanie

Nie jestem muzykiem, więc aranżacje pozostawiają trochę do życzenia 🙂 Zaimplementowany przeze mnie sposób przechowywania zapisu nutowego jest dosyć ubogi. Nie przewiduje różnych opcji pauz, przedłużania dźwięków itp. Żeby zaimplementować wszystkie możliwe ficzery, które daje nam zapis nutowy raczej trzeba by było zmienić koncepcję funkcji play. Poza tym można by dodać granie przez oba silniki innych partii. Źródła są ogólnie dostępne, więc może ktoś będzie chciał się pobawić i stworzyć swoją bardziej rozbudowaną wersję.

Podobne wpisy

  • Maszyny stanów na tablicach

    Zastosowania tablic w C – wszystkie wpisy Tablice wskaźników na funkcje Maszyny stanów na tablicach Tablice przyspieszające wyszukiwanie elementów Jak korzystać z Lookup Table? Po lookup table i wyszukiwaniu elementów pora na kolejne zastosowanie tablic – maszyny stanu. Podobnie jak w poprzednich przypadkach, logikę warunkową zastąpimy wyczytywaniem odpowiednich indeksów z tablicy. W przypadku maszyn stanu…

  • C dla zaawansowanych

    Od jakiegoś czasu pracuję nad szkoleniem online C dla zaawansowanych. Ostatnio uruchomiłem stronę szkolenia: https://cdlazaawansowanych.pl/ Na razie możecie na niej przeczytać trochę jak będzie wyglądać ten program. Możecie także zapisać na mój newsletter i mieć pewność, że nie przegapicie żadnych informacji dotyczących szkolenia i otrzymacie najlepszą ofertę dołączenia. Przy okazji na listę mailową wrzucam różne…

  • Jakość oprogramowania – prezentacje z Embedded World

    Pod koniec lutego byłem na targach i konferencji Embedded World 2019. Poza relacją z samego wydarzenia (do przeczytania pod tym linkiem) postanowiłem opisać tematy poruszane na prezentacjach z części konferencyjnej. Było już więc o Embedded Security i o systemach operacyjnych czasu rzeczywistego. Dzisiaj pora na kolejny duży temat jakim jest jakość oprogramowania. Będzie więc o…

  • Zalety TDD

    Wprowadzenie do Test Driven Development – wszystkie wpisy Piramida testów – do czego służą poszczególne poziomy Miary jakości unit testów Mocki – radzenie sobie z zależnościami w testach Antywzorce unit testów Jak pisać dobre unit testy Kiedy nie stosować TDD Wymówki, aby nie pisać unit testów Zalety TDD Na czym polega TDD Dlaczego zainteresowałem się…

  • |

    Elektronika dla dzieci

    Z okazji dnia dziecka postanowiłem napisać artykuł o tym jak można zainteresować dzieci elektroniką i programowaniem. Niestety miałem pewną obsuwę i publikuję dopiero dzisiaj. W tekście opiszę zarówno produkty kierowane do przedszkolaków i uczniów podstawówki, jak i dla starszych – gimnazjalistów czy licealistów. Tematy takie jak elektronika i programowanie uchodzą za trudne. Poza tym szkoła…

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *