• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Komunikacja pomiędzy dwoma Arduino.
#11
Użyłbym I2C bo wszystko spina się dwoma drutami. Jak potrzebne większe prędkości to USART. W przypadku ARM sprawa prosta, linie TX slave ustawia się w OC(OD) i po robocie, w AVR trzeba dodać bramki OC np 74HC07.

Nie pokazałeś programu a ide o zakład, że da się wszystko ogarnąć jednym AVR o ile wystarczy PWMów. Jeśli jest ich za mało, można dać PWM po I2C. Łatwiej jest pisać soft na jeden uC niż na kilka.
 
Odpowiedź
#12
Kurczę jeżeli dałoby radę ogarnąć tego drona na jednym mikro to by był ogarnięty Smile siedziała nad nim wisieńka wydziału która aktualnie pracuje w kluczowych firmach w Polsce, ja jestem po prostu kontynuatorem roboty. Ten dron był pracą magisterską dla 3 studentów. Mogę załatwić program ale wątpię by coś to dało. Problem tkwi w różnicach parametrycznych poszczególnych silników oraz kwestiach mechanicznego osadzenia silników bldc (luzy itp.). Zostałbym w tym wypadku przy i2c ale jak to zrobić skoro 4x dostępne dla MEGA ? Jak nie I2C to USART?

p.s nie ma problemu w oprogramowaniu komunikacji po prostu nie chce w**bać się w gówn* i wybrać odpowiedni interfejs
 
Odpowiedź
#13
Jeżeli do sterowania silnikami wykorzystujesz gotowe regulatory ESC dedykowane do silników,
to nie wiem po co chcesz umieszczać dodatkowo moduły pomiędzy nimi a Arduino MEGA?

Na procku takim samym jaki jest w Arduino MEGA jest zbudowany kontroler lotu ArduPilot APM 2.8.
Mam takowego i steruje mi dronem bez żadnych dodatkowych kombinacji z modułami.
APM wysyła sygnały PWM do regulatorów ESC i nic więcej nie potrzeba.

Przed APM'em miałem MultiWi328p na Atmedze 328 i też to latało bez problemu.

[Obrazek: mw328p.jpg]

Problem pojawił mi się z pamięcią gdy zacząłem się bawić z GPS'em dlatego zmieniłem na lepszy.

Wydaje mi się, że PWM to sprawdzona metoda sterowania pomiędzy kontrolerem a ESC.
Ładowanie dodatkowych procków tylko skomplikuje cały system i prawdopodobieństwo jakiejś awarii modelu w powietrzu też może wzrosnąć.

Rozwiązania u Ciebie szukałbym w poprawieniu kodu który napisałeś na Arduino MEGA a nie komplikowania sobie sprzętu.
Jeżeli pomogłem, to poproszę o punkt reputacji Big Grin
 
Odpowiedź
#14
(30-12-2018, 02:44)owerel209 napisał(a): Zostałbym w tym wypadku przy i2c ale jak to zrobić skoro 4x dostępne dla MEGA ? Jak nie I2C to USART?
Jakie 4 I2C dla Mega? Tam jest jeden I2C, nie zmienia to faktu po co kilka I2C?

Co do pozostałych możliwości to juz wymieniłem wszystkie rozsadne rozwiązania. Wszystko zależy od wymaganej szybkości transmisji, której nie jesteś w stanie nawet oszacować.

Gwarantuję też, że na jednym AVR da się zrobić nie tylko sterowanie regulatorami ale także i same regulatory (poza końcówką mocy oczywiście) dla 4 silników BLDC (Mega ma tylko 12 PWM, w ARM nie byłoby problemu).
Niewątpliwie platforma sprzętowa została wybrana źle i Arduino jest otoczone niepotrzebna elektroniką. Wystarczył by mały ARM choćby F103R8 gdzie 16 PWM to nie problem. Skoro sprzęt został wybrany źle, to i można zakładać, ze program jest napisany źle i dlatego autor tak broni się przed jego pokazaniem. Jeśli program napisany jest źle, to dodanie setki dodatkowych uC nic nie da, bo na nie program też będzie napisany źle.
 
Odpowiedź
#15
(30-12-2018, 13:01)ANT napisał(a): Rozwiązania u Ciebie szukałbym w poprawieniu kodu który napisałeś na Arduino MEGA a nie komplikowania sobie sprzętu.
Nie ja pisałem kod, nie mam do niego nawet wglądu nawet. Postawiony został przedemną temat i mam go rozwiązać na zaliczenie. Nawet jeżeli koncepcja jest zła muszę coś zrobić w tym kierunku niestety. 

Cytat:Gwarantuję też, że na jednym AVR da się zrobić nie tylko sterowanie regulatorami ale także i same regulatory (poza końcówką mocy oczywiście) dla 4 silników BLDC (Mega ma tylko 12 PWM, w ARM nie byłoby problemu).
Niestety mowa o hexacopterze. Postaram się zdobyć plik źródłowy i przedstawię go tutaj.
 
Odpowiedź
#16
owerel209 napisał(a):Nie ja pisałem kod, nie mam do niego nawet wglądu nawet.
Wcześniej czytam
owerel209 napisał(a):Witam, dostałem projekt na studiach związany z Arduino. Moją częścią projektu jest zaimplementowanie komunikacji pomiędzy Arduino Mega, a Arduino Nano.
Jakim cudem, chcesz zmodyfikować program nie mając go?

Ściemniasz coś kolego!
 
Odpowiedź
#17
Moze chodzi o teotetyczne rozwiazanie na kartce..fajne studia i zaliczenie..
Jak tak wyglada dzis ksztalcenie inzynierow, to ja dziekuje..;/

Wysłane z mojego SM-G950F przy użyciu Tapatalka
 
Odpowiedź
#18
(30-12-2018, 21:26)wchpikus napisał(a): Jak tak wyglada dzis ksztalcenie inzynierow, to ja dziekuje..;/
Często, bardzo często, wygląda znacznie gorzej. Do dyspozycji sa zestawy (proponuje usiąść) na 8051 :-) Piszą w ASM :-)
Ale, zdarza się (tak często jak 6 w lotka), ze mają zestawy na ARM.

Tam gdzie jest 8051, ok, brak kasy, chęci, wiedzy wykładowców.
Tam gdzie Arduinio? Tego nie rozumie. AVR jest drogi, nierozwojowy, Arduino nie wspiera debugowania. Po co więc Arduino?
Prosty program migający LEDem na przerwaniach, prześledzony debugerem, jest bardziej wartościowy niż jakiś zegarek z  dziesiątką dodatkowych układów (do LED, USB, klawiatury pojemnościowej, które w ARM już są) z blokującymi bibliotekami, których Arduinowiec nie rozumie, ba nawet nie próbuje zrozumieć, ne zagląda do nich, nie próbuje ich poprawić.
 
Odpowiedź
#19
Jeśli 40us dla jednego int (nie polecenia - cała paczka komunikacji może trwać nawet 10x tyle z jednym modułem) to za długo użyj SPI. I2C jest OK bo 2 kabelkami obsługuje wiele SLAVE, ale to trwa i jak jest więcej modułów to SLAVE najpierw musi wiedzieć, że do niego gadasz (dlatego 1 interfejs I2C wystarcza dla 6 slave), potem gadasz, potem kończysz, to więcej niż wysłanie 16bitów. SPI może być 10x szybsze przy przesyłaniu i SLAVE od razu wie, że z nim gadasz, ale to kosztuje 1 dodatkową IO + 1 na każdy SLAVE. Arduino ma zegar 16MHz, niektórych rzeczy nie przeskoczysz, jak ma zebrać dane z czujników, przeliczyć, wysłać nastawy to trochę to zajmie, jeden cykl zegara to 0.06us, byle jaka funkcja Arduino to już czas liczony w us.  Raczej nie sterowałbym tego 7 Arduino, jak już to zbierałbym tylko dane tymi 6 NANO, MEGA przeliczał i sterował bezpośrednio silnikami (w sensie sterownikami śliników) i to tylko wtedy jeśli pomiar prędkości silników jest czasochłonny lub jest za mało sprzętu w MEGA by mierzyć kilka silników. Wysłanie danych do sterowania może być dłuższe niż wysterowanie z MEGA przez PWM - slave najpierw musi dane odebrać, a potem wykonać, czas 6x. SPI nawet na 8MHz samo wysłanie 12 int do 6 slave to z 20us, wysterowanie 6PWM to z 2us. Koncepcja wg mnie bez sensu. Algorytm sterowania jest do bani to podzielenie obliczeń na 7 rdzeni może tylko pogorszyć sytuację i dodać plątaninę kabli, przecież jak SLAVE coś liczy to jeszcze musi dać znać, że skończył, Master musi to zsynchronizować dla 6 sztuk. Jak MEGA nie daje rady z obliczeniami to na pewno prościej jest użyć 1 procka 10x szybszego  (np. ESP32 240MHz, 32bity i  czasami nawet 1000x szybszy) niż 10 procków w zamian, szczególnie jak to ma latać i masa ma znaczenie. Jak praca ma być tylko teoretyczna to raczej użyj SPI.
Arduino jest dla hobbystów i jego główną zaleta jest to, że nie wymaga zrozumienia jak działa procesor. Przynajmniej przy kopiowaniu projektów. Samą płytkę można wykorzystać jak się chce i w czym się chce co jest związane z AVR - korzyć to cena dzięki produkcji w milionach. Jak ktoś woli to może sobie kupić płytki prototypowe po 300zł z Atmegą 32.
Mój kuzyn właśnie rozpoczął pracę w Anglii, tam też studiował, pracę dyplomową robił na Arduino. W pracy za wspomnienie o Arduino może dostać wpierdziel - oczywiście żart, praca na zachodzie to inna bajka,  ale temat Arduino jest faktycznie tabu.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#20
(02-01-2019, 14:32)kaczakat napisał(a): Jeśli 40us dla jednego int (nie polecenia - cała paczka komunikacji może trwać nawet 10x tyle z jednym modułem) to za długo użyj SPI.
Jak policzyłeś te 40us?
Mnie, przy 400kHz, dla przesłania 2 bajtów wychodzi 45us bez START i STOP:
1/(400000/(9*2))    400kHz / 9 bit na bajt * 2 bajty
Gdy dodam start i stop to 50us:
1/(400000/(9*2+2))
Cała ramka, razem z adresem 7-bit oraz start/stop to 75,5us:
1/(400000/(9*3+2))
Przypuśćmy, że chce adresować bajtem nr zapisywanego rejestru (choć może adres rejestru być zawarty w adresie slave jak w eeprom >256b <= 4k) wtedy wysyła łącznie 4 bajty co daje 95us:
1/(400000/(9*4+2))

Nie wyszło mi więc 40us dla 2 bajtów ii nie wiem dlaczego ma wyjść 10 razy dłużej dla całej ramki? Co by tam jeszcze przesyłał? CRC? Przecież Arduinowcy nie akceptują pojęcia CRC, dla nich to zbędny dodatek.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości