Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Arduino Leonardo - Czy da się niezależnie podłączyć dwie płytki Arduino?

16 Gru 2016 19:29 972 13
  • Poziom 6  
    Zanim kupię chcę się dowiedzieć czy takie rozwiązanie jest możliwe. Chcę do portu usb podpiąć hub usb. Następnie do tego huba podpiąć kablami usb dwie płytki Arduino leonardo które nie będą ze sobą połączone - mają działać niezależnie. Czy to możliwe? Chciałbym w momencie uruchomienia aplikacji arduino do programowania, z listy podpiętych urządzeń wybierać płytkę nr 1 lub 2 i wgrywać na nie sketche. Druga sprawa to kwestia nasłuchiwania. Niby podczas nasłuchiwania portu również podaje się nr portu (numer płytki 1 lub 2) ale to tylko moja teoria :)

    Zastanawia mnie również temat samego huba
    1. On będzie kablem usb zasilał płytki więc czy musi mieć dodatkowe zasilanie żeby nie było zbyt dużych spadków napięcia na płytkach arduino?
    2. Czy komputer przez hub będzie w stanie rozróżnić dwie płytki w końcu sam hub jest podpięty do jednego portu usb w komputerze. Może lepiej będzie podpiąć płytki do osobnych wejść usb na płycie głównej?
  • Pomocny post
    Moderator Mikrokontrolery Projektowanie
    Tak, będzie to działać. W kompie zobaczysz po prostu dwa porty COM, każdy dla jednej z płytek. Nie ma znaczenia, że fizycznie laduje to w jednym porcie USB, protokół USB wszystko załatwia. Zasilanie huba jest zależne od sumarycznego poboru prądu. Jesli prąd pobierany przez płytki i huba nie przekracza specyfikacji to dodatkowe zasilanie nie jest potrzebne.
  • Poziom 6  
    Czyli tak jak podejrzewałem, dzięki :)

    A jeszcze jednak kwestia. Na Linuxie moją płytkę zawsze wykrywa jako ACM0 ale gdy podczas działającego komputera zresetuje Arduino, Arduino znajduję wtedy pod portem ACM1 . Gdy będę miał podłączone dwie płytki i z jakiegoś powoduje zresetuję jedną z nich to na pewno zostanie przypisany inny adres. Ciekawy jestem czy z perspektywy programu który będzie nasłuchiwał porty się nie pogubi która płytka jest która :) Jestem w stanie w jakiś sposób je identyfikować? albo nadać im coś w rodzaju aliasu żeby niezależnie od tego na którym porcie zostanie znaleziona dana płytka było wiadomo która to która?
  • Moderator Mikrokontrolery Projektowanie
    Komunikując się z nimi po czystym RS232 to nie ma możliwości identyfikacji, chyba,że ją umieścisz w protokole RS. Natomiast w Linuksie, podobnie jak w innych systemach, możesz wymusić przydzielanie portów na podstawie metadanych przesyłanych przez USB wykorzystywane do realizacji wirtualnego portu szeregowego.
  • Poziom 25  
    tmf napisał:
    Natomiast w Linuksie, podobnie jak w innych systemach, możesz wymusić przydzielanie portów na podstawie metadanych przesyłanych przez USB wykorzystywane do realizacji wirtualnego portu szeregowego.
    O ile są to rózne płytki arduino(uno, mega) to tak ale na podstawie jakich metadanych rozróżnisz dwa uno?
  • Moderator na urlopie...
    Jakoś PC u mnie zawsze rozróżnia kilka płytek podpiętych na raz, a każdej przydziela inny, stały (jeśli nie zmieniam sterowników) numer portu szeregowego (Windows).
  • Poziom 6  
    Nie mam jeszcze dwóch płytek ale na pewno zakupie drugą. Zaraz postaram się znaleźć jakieś info na temat protokołu RS może uda mi się znaleźć jakieś rozwiązanie ale w miedzy czasie przyszło mi do głowy inne rozwiązanie choć bardzo nieprofesjonalne (tak mi się wydaje). Mianowicie kazać płytce co nr 1s wyrzucać printem informację o numerze płytki np "plytk_nr_1". Zadaniem komputera będzie zbieranie informacji o tym która płytka jest podłączona i na jakim porcie.

    Obecnie moja aplikacja napisana w pythonie komunikuje się z arduino cały czas. W momencie uruchamiania sprawdza port standardowy w moim przypadku ACM0 ale w sytuacji kiedy nic nie znajdzie niech szuka dalej tzn ACM1, ACM2 itd. Dopisał bym tylko do niej aby w momencie znalezienia płytki sprawdzała która to.
  • Moderator na urlopie...
    Możesz tez na porty (ale uwaga - może to wpłynąć na inne urządzenia) wysyłać jakiś znak zachęty i wtedy płytka odpowie swoim numerkiem i od razu masz informacje że masz swoje urządzenie i wiesz gdzie ;)
  • Moderator Mikrokontrolery Projektowanie
    Podane przez kol. @piotrva możliwości detekcji są ok i często stosowane. Ale mają pewne wady - jeśli na porcie jest podpięte urządzenie, które nie jest w stanie poprawnie odpowiedzieć na wysłane dane, to może to być problematyczne. Ja bym skorzystał jednak z metadanych - unikalny numer seryjny można zaszyć w deskryptorze urządzenia USB. Każde urządzenie USB powinno taki SN mieć, można go odczytać w Linuksie i w Windows - jest on przesyłany po VID i PID urządzenia. Na tej podstawie, łącznie z VID i PID możemy użyć tych numerów do automatycznego rozpoznawania i przypisywania urządzenia do określonego portu. Możemy też znając UID wyszukiwać po nim urządzeń i w ten sposób łączyć się. Opcji jest wiele. Jeśli w Arduino do realizacji komunikacji po USB jest wykorzystywany FT232 to w nim te dane są zaszyte, istnieje więc możliwość identyfikacji każdej płytki. Także wystarczy pogrzebać pod linuksem w udev i będziesz miał to co chcesz.
    Inna sprawa, że skoro interesują cię nieco bardziej zaawansowane rzeczy to może czas na ewolucję i porzucenie frameworku Arduino oraz przejście na MCU ze sprzętowym USB?
  • Poziom 6  
    Mój projekt choć jest dosyć obszerny, jest bardzo prosty a to głównie dlatego, że wszystkie operacje wykonuje komputer i aplikacja w pythonie. Arduino działa bardziej jako pośrednik między prostą automatyką a programem który wykonuje wszystkie instrukcje. Użycie dwóch płytek Arduino zamiast jednej też jest uzasadnione. Tak samo mógłbym połączyć ze sobą dwie płytki aby się miedzy sobą komunikowały ale znów połączenie ich do komputera niezależnie również jest uzasadnione :)

    Dzięki chłopaki za podpowiedzi, wezmę wszystkie pod uwagę ale na pierwszy rzut wydaje mi się, że rozpoznawanie po PID będzie skuteczne i proste. Zaraz sprawdzę co wypluwa Linux odnośnie mojej płytki, zobaczę ile i jakie info uda mi się wyciągnąć.

    Znalazłem jeszcze coś takiego:
    Code:

    [Zagiewa@localhost ~]$ lsusb
    Bus 004 Device 002: ID 8087:8000 Intel Corp.
    Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 003 Device 002: ID 8087:8008 Intel Corp.
    Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
    Bus 001 Device 003: ID 2341:8036 Arduino SA Leonardo (CDC ACM, HID)
    Bus 001 Device 006: ID 12d1:1506 Huawei Technologies Co., Ltd. Modem/Networkcard
    Bus 001 Device 002: ID 045e:0745 Microsoft Corp. Nano Transceiver v1.0 for Bluetooth
    Bus 001 Device 004: ID 058f:6364 Alcor Micro Corp. AU6477 Card Reader Controller
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    [Zagiewa@localhost ~]$ lsusb -D /dev/bus/usb/001/003
    Device: ID 2341:8036 Arduino SA Leonardo (CDC ACM, HID)
    Couldn't open device, some information will be missing
    Device Descriptor:
    bLength 18
    bDescriptorType 1
    bcdUSB 2.00
    bDeviceClass 2 Communications
    bDeviceSubClass 0
    bDeviceProtocol 0
    bMaxPacketSize0 64
    idVendor 0x2341 Arduino SA
    idProduct 0x8036 Leonardo (CDC ACM, HID)
    bcdDevice 1.00
    iManufacturer 1
    iProduct 2
    iSerial 0
    bNumConfigurations 1
    Configuration Descriptor:
    bLength 9
    bDescriptorType 2
    wTotalLength 100
    bNumInterfaces 3
    bConfigurationValue 1
    iConfiguration 0
    bmAttributes 0x80
    (Bus Powered)
    MaxPower 500mA
    Interface Association:
    bLength 8
    bDescriptorType 11
    bFirstInterface 0
    bInterfaceCount 2
    bFunctionClass 2 Communications
    bFunctionSubClass 2 Abstract (modem)
    bFunctionProtocol 1 AT-commands (v.25ter)
    iFunction 0
    Interface Descriptor:
    bLength 9
    bDescriptorType 4
    bInterfaceNumber 0
    bAlternateSetting 0
    bNumEndpoints 1
    bInterfaceClass 2 Communications
    bInterfaceSubClass 2 Abstract (modem)
    bInterfaceProtocol 0 None
    iInterface 0
    CDC Header:
    bcdCDC 1.10
    CDC Call Management:
    bmCapabilities 0x01
    call management
    bDataInterface 1
    CDC ACM:
    bmCapabilities 0x06
    sends break
    line coding and serial state
    CDC Union:
    bMasterInterface 0
    bSlaveInterface 1
    Endpoint Descriptor:
    bLength 7
    bDescriptorType 5
    bEndpointAddress 0x81 EP 1 IN
    bmAttributes 3
    Transfer Type Interrupt
    Synch Type None
    Usage Type Data
    wMaxPacketSize 0x0010 1x 16 bytes
    bInterval 64
    Interface Descriptor:
    bLength 9
    bDescriptorType 4
    bInterfaceNumber 1
    bAlternateSetting 0
    bNumEndpoints 2
    bInterfaceClass 10 CDC Data
    bInterfaceSubClass 0 Unused
    bInterfaceProtocol 0
    iInterface 0
    Endpoint Descriptor:
    bLength 7
    bDescriptorType 5
    bEndpointAddress 0x02 EP 2 OUT
    bmAttributes 2
    Transfer Type Bulk
    Synch Type None
    Usage Type Data
    wMaxPacketSize 0x0040 1x 64 bytes
    bInterval 0
    Endpoint Descriptor:
    bLength 7
    bDescriptorType 5
    bEndpointAddress 0x83 EP 3 IN
    bmAttributes 2
    Transfer Type Bulk
    Synch Type None
    Usage Type Data
    wMaxPacketSize 0x0040 1x 64 bytes
    bInterval 0
    Interface Descriptor:
    bLength 9
    bDescriptorType 4
    bInterfaceNumber 2
    bAlternateSetting 0
    bNumEndpoints 1
    bInterfaceClass 3 Human Interface Device
    bInterfaceSubClass 0 No Subclass
    bInterfaceProtocol 0 None
    iInterface 0
    HID Device Descriptor:
    bLength 9
    bDescriptorType 33
    bcdHID 1.01
    bCountryCode 0 Not supported
    bNumDescriptors 1
    bDescriptorType 34 Report
    wDescriptorLength 101
    Report Descriptors:
    ** UNAVAILABLE **
    Endpoint Descriptor:
    bLength 7
    bDescriptorType 5
    bEndpointAddress 0x84 EP 4 IN
    bmAttributes 3
    Transfer Type Interrupt
    Synch Type None
    Usage Type Data
    wMaxPacketSize 0x0040 1x 64 bytes
    bInterval 1

    Ta informacja powinna być unikatowa i raczej niezmienna?
    Code:
     idProduct 0x8036 Leonardo (CDC ACM, HID)

    Podobnie chyba jak i ta?
    Code:
     idVendor 0x2341 Arduino SA

    Myślicie, że to wystarczy do identyfikacji?
  • Poziom 25  
    zagiewa napisał:
    Ta informacja powinna być unikatowa i raczej niezmienna?
    Code:
     idProduct 0x8036 Leonardo (CDC ACM, HID)

    Podobnie chyba jak i ta?
    Code:
     idVendor 0x2341 Arduino SA

    Myślicie, że to wystarczy do identyfikacji?

    Chyba nie przeczytałeś uważnie mojego porzedniego posta. Nie ma problemu jeśli są to różne płytki (uno i mega), znacznie trudniej jest je rozróżnić gdy są to dwie takie same płytki bo wtedy idVendor i idProduct są takie same. Można je rozróżnić najprawdopodobniej po iSerial ale nie mam tego jak sprawdzić. Długi numer jest widoczny po uruchomieniu polecenia z prawami administratora:
    iSerial 220 75439333535351512262
    Prawdopodobnie da się go użyć w udev.
  • Moderator Mikrokontrolery Projektowanie
    Nie ma znaczenia czy płytki są takie same, czy inne. Nr seryjny powinien być inny. Oczywiście po samym VID lub PID nie odróżnisz. Jeśli nr seryjny jest taki sam, to możesz go bez problemu zmienić.
  • Poziom 6  
    namok poszedłem za Twoją radą i rzeczywiście będąc zalogowanym jako root (administrator) polecenie podaje numery seryjne urządzeń iSerial ale co ciekawe w przypadku Arduino dalej podaje 0. Niemożliwe żeby płytka nie miała numeru seryjnego ale może nie da się jej odczytać? Zresztą pojawia się drugi problem... Nawet jeśli odczytał bym numer seryjny to aby to zrobić muszę mieć prawa administratora. Program działa na koście gość więc lipa. Muszę znaleźć inne rozwiązanie.
    Chyba niezmienną rzeczą jest jeszcze numer portu i numer podpiętego do niego urządzenia:
    Code:
    Bus 001 Device 003: ID 2341:8036 Arduino SA Leonardo (CDC ACM, HID)

    Teoretycznie każda nowo podpięta płytka będzie zyskiwała numer Device 004, 005 itd. Nie wiem tylko czy wypięcie płytki z jakiegoś powodu nie spowoduje przestawienia numeracji :/

    tmf jak mogę zmienić numer seryjny urządzenia?
  • Poziom 25  
    zagiewa napisał:
    namok poszedłem za Twoją radą i rzeczywiście będąc zalogowanym jako root (administrator) polecenie podaje numery seryjne urządzeń iSerial ale co ciekawe w przypadku Arduino dalej podaje 0.
    Może ja mam jakieś "lepsze" ;) podróby bo u mnie zarówno uno jak i mega mają numer iSerial. Sprawdzałem poleceniem(dla mega)
    Kod: bash
    Zaloguj się, aby zobaczyć kod


    Cytat:
    Zresztą pojawia się drugi problem... Nawet jeśli odczytał bym numer seryjny to aby to zrobić muszę mieć prawa administratora. Program działa na koście gość więc lipa. Muszę znaleźć inne rozwiązanie.
    Odpowiednie reguły zapisujesz w katalogu /etc/udev/rules.d i są one wykonywane przez udev który ma odpowiednie uprawnienia. Przykłady regół znajdziesz nawet na stronie arduino.cc(coprawda nie z iSerial).