Buduję te sekwencery muzyczne .
Tyle że to nie jest dokładnie sekwencer, to fizyczny interfejs dla sekwencera. Sekwencer to aplikacja działająca na laptopie, z którym łączy się sekwencer, ta funkcja pozwala użytkownikowi tworzyć pętle perkusyjne w locie. To całkiem zabawne, ale wymaga laptopa, ponieważ sekwencer nie jest „wbudowany”.
Chciałbym zrobić sekwencjonowanie na moim urządzeniu.
Załóżmy teraz, że wiem, jak rozwiązać problem z klasą zgodności dla połączenia USB MIDI, i załóżmy, że mogę wymyślić, jak podłączyć arduino, aby wysyłać notatki MIDI z 5-pinowego portu DIN. Najbardziej niepokoi mnie dryf tempa w czasie z powodu niespójnego timingu w minutach w każdym przebiegu pętli zdarzeń.
Niektóre rzeczy, które znam:
Nie powinieneś polegać na
delay()
kontrolowaniu pętli tempa. Opóźnienie zatrzymuje wszystkie operacje oprogramowania układowego, a to nie może działać, ponieważ muszę sondować fizyczny interfejs użytkownika pod kątem zmian, gdy sekwencja jest uruchomiona.Obliczenia oparte na
millis()
są lepsze, ponieważ oprogramowanie układowe może nadal działać i działać po upływie określonego czasu.Mimo że żadna z moich fizycznych kontroli nie wyzwala procedur przerwania, niektóre operacje mogą opóźnić uruchomienie głównego
loop()
. Jeśli zaprojektuję funkcję, która czeka na dane wejściowe użytkownika, może to oczywiście powodować problem z brakiem „terminu” działania, jeślimillis()
liczenie się skończy. Wiem, że ten problem jest moim własnym projektem ...
Pytania:
A. Czy arduino oparte na AVR jest odpowiednim mikrokontrolerem do odpytywania interfejsu użytkownika i uruchomienia pętli czasowej o znaczeniu krytycznym? Wiem, że Arduino oparte na ARM jest teraz znacznie szybsze. Czy Teensy 3.0 byłby lepszą alternatywą? Oba są płytkami 3,3 V, więc jest to kolejny zestaw problemów do pracy ... ale na razie to zignoruję.
B. Czy powinienem podzielić zadanie na dwa mikroprocesory? Jeden do obsługi odpytywania i aktualizacji interfejsu użytkownika, drugi do krytycznej pętli pomiaru czasu.
do. Coś innego?
Moim głównym celem jest wcale nie używanie komputera. Chcę też obliczyć dla swinga, ale w tym przypadku swing nie znaczy nic, jeśli nie mam zablokowanego i dokładnego tempa. Dzięki za radę!
noInterrupts();
zatrzymuje drgania, ale także zatrzymuje wszystkie poszukiwane przerwania.Odpowiedzi:
Przerwania są twoim przyjacielem dla zadań wrażliwych na czas, ale tylko wtedy, gdy umieścisz krytyczne aspekty czasowe w przerwaniu i nie wystąpią żadne inne przerwania o wyższym priorytecie. Mikrokontrolery w Arduino opartym na „AVR” (np. ATmega328P) mają ustalone priorytety przerwań, jak wyszczególniono na stronie 58ff arkusza danych . Jeśli więc użyłeś TIMER2 COMPA jako krytycznego przerwania czasowego i żadnych innych przerwań, powinieneś być OK (ponieważ ma najwyższy priorytet). Jeśli chcesz również używać przerwań o niższym priorytecie, musisz upewnić się, że wszystkie z nich ponownie włączają przerwania globalne podczas wchodzenia w procedurę obsługi przerwań:
(s. 14 arkusza danych )
Różni się to nieco w przypadku Arduinos opartych na ARM, ponieważ ich rdzeń Cortex-M3 ma „Zagnieżdżony kontroler przerwania wektora”, w którym priorytety nie są ustalone (można ustawić w oprogramowaniu), a obsługa zagnieżdżonych przerwań jest normą. Tak więc w przypadku aplikacji o krytycznym czasie synchronizacja Arduino zapewni ARM zapewnia większą elastyczność. Nie sądzę jednak, aby było to naprawdę konieczne w przypadku Twojej aplikacji.
Większe pytanie dotyczy tego, jak łatwo można te rzeczy zaimplementować za pomocą bibliotek Arduino. Aby uzyskać najlepszą wydajność, prawdopodobnie będziesz musiał do pewnego stopnia kodować poza bibliotekami, przynajmniej dla bitów krytycznych dla timingu, tj. Całkowicie unikać opóźnień () lub millis ().
To, czy chcesz podzielić, zależy od tego, ile przetwarzania zamierzasz wykonać. Ponownie wyjście poza biblioteki może potencjalnie dać lepszą wydajność.
źródło
Można to przy odpowiednim programowaniu z całą pewnością wykonać na ATmega328P (w zależności od złożoności pętli bębna. Zakładam ~ 50 zdarzeń bębna w pętli. Czy to rozsądne?).
Zauważ, że powiedziałem ATmega328P , niekoniecznie Arduino .
Środowisko Arduino ma w tle wiele domyślnych rzeczy, co sprawia, że niezwykle deterministyczne programowanie (ponieważ będziesz potrzebować czegoś krytycznego pod względem czasu) jest trudne.
Prawdziwe pytanie, które musisz tutaj zadać, to jak bardzo jesteś zainteresowany programowaniem, a jak jesteś zainteresowany opracowaniem instrumentu?
Chociaż jestem całkiem pewien, że można zrobić wszystko, co chcesz na jednym ATmega (pętla perkusyjna, wiele wejść analogowych, LCD, przyciski, interfejs MIDI), prawdziwe pytanie brzmi: ile pracy trzeba wcisnąć wszystko? Ponownie, czy chcesz nauczyć się optymalizować osadzony kod MCU, czy budować instrumenty? Jest to dość łatwo po prostu przejść do szybszego MCU jeśli potrzebne, ale trzeba określić wydajność MCU czego potrzeba teraz , więc sześć miesięcy pracy w, nie zdają sobie sprawy, nie można zupełnie dostać wszystko do pracy tak szybko jak to potrzeba.
Gdybym był tobą, pierwszą rzeczą, którą bym zrobił, to żeby działał bez arduino (w zasadzie traktuj to jako surową ATmegę i użyj studia AVR lub podobnego). Następnie możesz znacznie efektywniej analizować, jakiej wydajności potrzebujesz i czy ATmega może nią zarządzać.
Kiedy uwolnisz się od arduino, będziesz mógł swobodniej korzystać z różnych MCU (są one na ogół bardziej podobne niż różne. Jeśli możesz znaleźć jeden z jego dokumentacji, prawdopodobnie możesz zrobić to samo dla innych).
Ostatnio dużo pracuję z urządzeniami ATxmega i są naprawdę fajne. Otrzymujesz trzy priorytety przerwania, które ułatwiają zarządzanie materiałami o krytycznym czasie. Są również bardzo przyjemne w pracy (Sane urządzenia peryferyjne! Wygodne struktury portów! Itd ...).
Istnieją również urządzenia LPC od NXP, które są oparte na ARM, a także niektóre urządzenia ARM firmy Atmel (używane w Arduino Due) lub MCU STM32 od ST. Każde z nich będzie miało znacznie większą wydajność niż ATmega, a nawet ATxmega.
Podstawową wadą większego, mocniejszego procesora jest cena, ale jeśli nie produkujesz tysięcy takich jednostek, koszty montażu i produkcji na jednostkę znacznie przewyższą różnicę kosztów (prawdopodobnie będzie to tylko kilka dolarów ), że jest to w zasadzie nieistotne.
źródło
Musiałem przeczytać na temat timerów, zanim zacząłem myśleć o dokładności taktowania (także zbudowanie sekwencera midi step z arduino, chociaż z pewnością wygląda to mniej fajnie niż te ^^). Ta seria artykułów była najbardziej pouczająca:
http://maxembedded.com/category/microcontrollers-2/atmel-avr/avr-timers-atmel-avr/
Obecnie myślę, że moim rozwiązaniem będzie uzyskanie precyzyjnego pomiaru czasu.
A. Użyj arduino AVR
B. Zachowaj zadanie na jednym mikroprocesorze
C. Mądrze używaj preskalerów, timerów i przerwań, aby uzyskać potrzebną precyzję.
AKTUALIZACJA
Korzystając z podstawowego samouczka midi dla Arduino i po zapoznaniu się z tym artykułem na temat timerów i prescalerów, wymyśliłem następujący kod. Kod używa trybu timera 1 i CTC do odtwarzania nuty midi co kwadrans i nuty co kwadrans (co powinno wynosić dokładnie 120 uderzeń / min). Niestety, to wciąż przychodzi nieco wolniej niż 120 uderzeń na minutę, chociaż jest to najbliższe, jakie dostałem ...
AKTUALIZACJA
Walczę z tym od około 24 godzin i wreszcie otrzymałem odpowiedzi z forum. Myślę, że kod, którego użyłem powyżej ^^ jest całkiem dobry. Używając ISR, trybu CTC i preskalerów itp. Po skontaktowaniu się z forum myślę, że rozwiązaniem nie jest osiągnięcie precyzji w sekwencerze midi, ale podłączenie całej konfiguracji sprzętowej (moich syntezatorów i samplerów) do tego samego zegar midi, niezależnie od tego, czy zegar pochodzi z Arduino.
źródło
W zależności od tego, jak stopniowo chcesz przejść z komputera na uwięzi do systemu opartego na µC, możesz rozważyć umieszczenie Raspberry Pi w tym pudełku (25-35 USD w sklepie ). W ten sposób możesz mieć pełny (choć słabo zasilany) komputer z systemem Linux z portami USB i pinami GPIO.
źródło