logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak wygląda program pod Motorfader?

ganiaczniedoganiacz 07 Lis 2011 23:05 1410 9
REKLAMA
  • #1 10114874
    ganiaczniedoganiacz
    Poziom 10  
    Witam, ostatnio zaciekawiła mnie kwestia kontrolerów midi, a że tworzenie muzyki to moje hobby od paru lat to chcę sobie zrobić jakiś kontroler. I tu przyszła mi do głowy kwestia z potencjometrami suwakowymi, które potrafią się "same regulować".
    Piszę trochę w BASCOM-ie i za nic nie potrafię wymyślić programu pod sterowanie nimi. Problem leży w tym że nie wiem jak napisać w tym środowisku (nie najlepszym) program do obsługi takiego potencjometru przez UART (Atmegi8) w obie strony, jednoczesne odbieranie danych i wysyłanie z uwzględnieniem tego że:
    1. PC wyśle wartość
    2. Silniczek ustawia potencjometr
    3. Tak cały czas w automatyzacjach etc.
    4. Lecz gdy w trakcie pracy lub nie, porusze nim on prześle mi dane do PC

    Non stop co mi nie przyjdzie do głowy to nie będzie działać prawidłowo. Zwracam się z prośbą o pomoc w ustaleniu koncepcji, jak ten program ma działać, o jakie instrukcje mają zostać oparte, bo nie potrafię napisać tego prawidłowo.

    Potencjometr sterowany jest mojej konstrukcji i jest to potencjometr 10k liniowy z dołączonym w ciekawy sposób silniczkiem DC. I musi tak pozostać.
  • REKLAMA
  • #2 10115559
    arnoldziq
    VIP Zasłużony dla elektroda
    Jeżeli nie możesz zastosować silnika krokowego, to pozostaje Ci mierzenie rezystancji na potencjometrze.
  • #3 10115907
    arktik1
    Poziom 27  
    Myślę że każdy potencjometr powinien być stereo.
    Jeden kanał powinien działać z urządzeniem audio a drugi powinien dostarczać informacji do ADC , Uc o pozycji potencjometru. Dane do PC mógł byś przesyłać za pomocą RS232 lub innego.
    To w programie Uc musisz uwzględnić kiedy i w jaki sposób dane będą przesyłane do PC.
    No i musisz mieć program który będzie odbierał i wysyłał dane z PC, chyba że będziesz to robił z terminala, co moim zdaniem jest bez sensu.
    Sam układ nastawiania potencjometru w Uc można zrobić na kilka sposobów.
    Odczytujesz dane z potencjometru i porównujesz je z danymi zapisanymi w programie.
    Jeśli wartość zmiennej położenia jest równa wartości zmiennej zapisanej, to zostawiasz silnik w spokoju, jeśli nie to włączasz silnik i ustawiasz wartość taką samą jak zapisana.
    Robisz to np raz na sekundę.
    Jeśli ruszysz potencjometrem ręcznie to program zauważa różnicę między zmiennymi i automatycznie modyfikuje wartości zmiennej zapisanej i po ustawieniu przesyła dane do PC.
    To tylko jeden ze sposobów.
  • REKLAMA
  • #4 10116553
    ganiaczniedoganiacz
    Poziom 10  
    Wiem na jakiej zasadzie ma poruszać się potencjometr. Właśnie patent ze sprawdzaniem wartości z ADC z wpisaną zmienną. Tyle że problem wygląda tak:

    1. Odbieram wartości z PC (UART MIDI) i ADC i dzielę wartość z ADC przez 8 (bo maksymalna wartość w midi to 127.
    2. Sprawdzam w jakim położeniu jest potencjometr i to co dostałem z komputera to tak manewruję silniczkiem by wyrównać.
    3. A jeżeli już chcę ruszyć suwakiem i zmienić wartość w kompie to on może rozpoznać to jako pozycję którą silnik ma zaraz przestawić do pierwotnej.

    Najprostszy model jaki mi dzisiaj wpadł do głowy to taki:
    Mam powiedzmy 2 takie potencjometry z silnikami i chcę napisać program tak aby:
    Jak poruszę potencjometrem 1 to 2 się przesunie automatycznie i jak poruszę 2 to 1 się dostosuje. Pomocy jak by to miało wyglądać (Program)
  • #5 10117659
    arktik1
    Poziom 27  
    Przykładowy kawałek kodu, który odpowiada za dopasowywanie potencjometru 2 do 1.
    
    If Pot2 < Pot1 Then
    Silnikprawo = 1
    Silniklewo = 0
    End If
    ...
    If Pot2 > Pot1 Then
    Silniklewo = 1
    Silnikprawo = 0
    End If
    ...
    If Pot2 = Pot1 Then
    Silniklewo = 0
    Silnikprawo = 0
    End If
    

    Oczywiście brakuje rzeczy, które odpowiadają za konfiguracje, sprawdzanie i inne.
  • REKLAMA
  • #6 10120011
    ganiaczniedoganiacz
    Poziom 10  
    Ha! Tylko pamiętaj że to dotyczy TYLKO zmiany położenia 1 potencjometra.
    Jeżeli poruszę pierwszym to drugi się przesunie ale jeżeli poruszę drugim to pierwszy już się nie przesunie bo zauważ że program posiada zmienne pracy silnika tylko jednego potencjometru.

    A ja muszę napisać program tak by można było to wykonywać na każdym potencjometrze na zmianę bo potem jeden potencjometr w programie i ogólnie zastąpię UART-em tylko na potencjometrach to najlepiej widać.
  • REKLAMA
  • #7 10120643
    arktik1
    Poziom 27  
    Piszesz"Ha! Tylko pamiętaj że to dotyczy TYLKO zmiany położenia 1 potencjometra"
    Oczywiście, przecież napisałem"Przykładowy kawałek kodu, który odpowiada za dopasowywanie potencjometru 2 do 1. "
    Niestety nie napiszę kodu za ciebie i podejrzewam że nikt tu tego nie zrobi.
    To bardzo pracochłonne.
    Napisz cokolwiek a potem będziemy poprawiać.
  • #8 10123432
    ganiaczniedoganiacz
    Poziom 10  
    Tyle to ja wiem. Niestety nie jestem w stanie napisać programu bez jakiejkolwiek wskazówki. Oczywiście że nikt tego za mnie nie zrobi ale może znajdzie się ktoś kto WYJAŚNI co jest w tym kluczowe.
    A jeżeli bym dodał jakąś zmienną która jest wspólna dla każdego potencjometru albo wpisywanie wartości do pamięci? Która koncepcja była by lepsza?
  • #9 10123956
    szelus
    Poziom 34  
    Musisz się jeszcze zastanowić, jak całość ma się zachowywać, gdy jednocześnie komputer będzie podsyłał nowe położenie a ty będziesz ręcznie przestawiał potencjometr. Logiczne rozwiązanie tego konfliktu wydaje mi się dość kluczowe dla ustalenia algorytmu działania.

    Ogólnie, to wyobrażałbym to sobie mniej-więcej tak:
    1. Masz zmienną np. zadana_wartosc, do której odbierasz komunikaty control change.
    2. Masz drugą zmienną biezaca_wartosc, gdzie trzymasz zmierzone ustawienie potencjometru.
    3. Masz flagę np. nowy_komunikat.
    4. Po odbraniu komunikatu wpisujesz wartość do zadana_wartosc i ustawiasz flagę.
    5 W programie głównym (itp.) porównujesz zadana_wartosc z biezaca_wartosc. Jeżeli są różne i ustawiona jest flaga nowy_komunikat, to przechodzisz do ustawiania potencjometru aż wartości się wyrównają, kasujesz flagę i wracasz do pętli porównującej. Zakładam tutaj, ze priorytet ma motoryzacja.
    6. Jeżeli w pętli wykryjesz, że nastawy się różnią i flaga nowy_komunikat nie jest ustawiona, to zakładasz, że potencjometr został przesunięty ręcznie. Ustawiasz wartosc_zadana na równą wartosc_biezaca i wysyłasz komunikat control change.

    Jeżeli priorytet miałby mieć ruch ręczny, to raczej też się da zrobić, ale byłoby bardziej skomplikowane - trzeba by np. mierzyć prąd silnika, aby sprawdzić, czy ktoś trzyma suwak, albo mierzyć czas - czy prędkość zmian potencjometru od silnika jest zgodna z oczekiwaniem itp.
  • #10 10126645
    ganiaczniedoganiacz
    Poziom 10  
    Nareszcie twórcza odpowieć. Dięki wielkie myślę że coś z tym zrobię chociarz nie ukrywam że wolałbym ręczny ruch potencjometru jako priorytet lecz ten program a właściwie atmega musi zmieścić jeszcze więcej funkcji.

    A jak zrobić żeby flaga była ustawiana dopiero po odebraniu komunikatu?

    Dodano po 2 [godziny] 35 [minuty]:

    Przepraszam za odgrzewanie tematu, napisałem program i chciałbym by ktoś go sprawdził, poprawił i powiedział co nie tak i jak to rozwiązać.:

    Kod: text
    Zaloguj się, aby zobaczyć kod
REKLAMA