Pokaż wiadomości

Ta sekcja pozwala Ci zobaczyć wszystkie wiadomości wysłane przez tego użytkownika. Zwróć uwagę, że możesz widzieć tylko wiadomości wysłane w działach do których masz aktualnie dostęp.


Wiadomości - Maciej_ZG

Strony: [1]
1
Cytuj
Zbyt przewymiarowany. Malinę widziałbym w znacznie bardziej wymagających scenariuszach, jak symulacja samego pulpitu, czy komunikacja przez LAN.
Ale jak działa i zbytnio się nie grzeje, to pół biedy.

Mi tu chodziło o bardziej generyczne rozwiązanie (polecam zajrzeć do kodu co udostępniłem). Malina robi za proxy pomiędzy różnymi transportami (TCP i UART) i formatami danych (binarny maszyny + inne w fazie testowania). Arduina są niezależne i realizują wymagane funkcję. Oczywiście można byłoby zoptymalizować / zmienić na np ESP32 / cokolwiek, ale mi głównie chodziło o logiczne rozdzielenie funkcji. Nikomu nie narzucam swojego rozwiązania.

2
Ja mam pulpit zbudowany na bazie 1xRaspberry PI + 6xArduino Nano. Raspberry komunikuje się z PC po UART, a z Arduinami po I2C. Jest osobny wątek do komunikacji z PC i do komunikacji z Arduinami. Jak na razie to rozwiązanie się sprawdza.
Soft na Raspberry leży na Githubie : https://github.com/maciejszymanskizg/custom_desktop_control/tree/main

Wsady do Arduino też mogę udostępnić w tym repo jakby ktoś był zainteresowany.

3
U mnie nie ma różnicy czy to sceneria doświadczalna czy inna, także rzeczywiście może być problem z komunikacją.
Co do samego ruchu wskazówek - wszystko zależy jaką dostaniemy "deltę" pomiędzy obecnie ustawioną wartością manometru a odebraną z Maszyny.
I tak jak zauważyłem wcześniej - modyfikacja tablicy akceleracji ma tu duże znaczenie.

Obecnie korzystam z takich wartości :
static unsigned short defaultAccelTable[][2] = {
  {   20, 2000 },
  {   40, 1600 },
  {   80, 1200 },
  {  100, 600 },
  {  150, 400 },
};

i ruch jest dużo płynniejszy.

Myślę że do każdego z manometrów przydałaby się osobna tablica a dane do niej trzeba by obliczyć na podstawie największej możliwej zmiany wartości w ciągu 1 sekundy.

4
A jak odbierasz dane ? przez UART czy jakoś inaczej ?

Ja mam całe rozwiązanie oparte na proxy z UART na I2C (https://github.com/maciejszymanskizg/custom_desktop_control), więc dane odbieram z interrupt handlera dla przychodzących danych I2C.

5
Ja też korzystam w swoim pulpicie od EU07 z tych samych silniczków i mam podobne problemy.
Funkcja update (https://github.com/clearwater/SwitecX25/blob/master/SwitecX12.cpp#L147) wykonuje ruch (advance) co określony czas (microDelay), który pochodzi z tabeli defaultAccelTable. Można pobawić się z wartościami w tej tabeli, bo mają one wpływ na płynność ruchu, ale chyba najważniejszym jest odpowiednie skorelowanie odbioru danych z funkcją ruchu. Jeśli dane przychodzą np. z I2C poprzez kod wykonywany z przerwania - można pokusić się o użycie właśnie advance zamiast update (a przynajmniej ja mam taki plan).

Jest jeszcze "blokująca" funkcja stepTo() ze stałym delayem pomiędzy krokami.

Duży wpływ na płynność mają też dane z samego symulatora. Jako że dostajemy je co pewien interwał czasowy, poszczególne dane mają również swój "skok", który może powodować widoczne szarpanie zamiast płynnej zmiany wartości.
Aktualnie walcze z tym problemem u siebie, jak będę miał coś wystarczająco satysfakcjonującego - podziele się rozwiązaniem.


Strony: [1]