Chcę napisać szkic, który można skompilować na różnych tablicach Arduino. Chcę wyświetlić na komputerze, która płyta jest aktualnie podłączona.
Oznacza to, że użytkownik łączy komputer za pomocą kabla USB z płytą Arduino / Teensy, w której uruchamia się mój szkic, a mój szkic informuje komputer za pośrednictwem portu szeregowego, która płyta jest podłączona. Na komputerze działa moja aplikacja C #, która odbiera te dane i wyświetla je.
Dlatego potrzebuję tablicy, która została wybrana po skompilowaniu szkicu:
Znalazłem kod na https://github.com/backupbrain/ArduinoBoardManager, ale nie daje poprawnych wyników (poza tym, że brakuje kilku płyt).
Oto fragment kodu:
static const uint8_t BOARD_MICRO= 0x04;
....
#elif defined(__AVR_Atmega32U4__) // Yun 16Mhz, Micro, Leonardo, Esplora
static const uint8_t BOARD = 0x04;
static const uint8_t NUM_BITS = 8;
static const uint16_t CPU = __AVR_Atmega32U4__;
static const unsigned long SRAM_SIZE = 2500;
static const unsigned long EEPROM_SIZE = 1000;
static const unsigned long FLASH_SIZE = 32000;
#elif defined(.....
Więc ten kod daje ten sam wynik (TABLICA = 0x04 = Mikro) dla Yun 16MHz, Micro, Leonardo y Esplora.
Czy jest jakiś sposób, aby uzyskać w moim kodzie C dokładnie ten ciąg, który użytkownik wybrał w menu kompilatora Arduino?
Odpowiedzi:
Dzięki pomocy Charliego Hansona i jantje znalazłem uniwersalne rozwiązanie!
Ponieważ szkoda, że każdy programista Arduino musi przejść ten sam ból, aby dowiedzieć się, jak uzyskać nazwę płyty, dlatego podam swój kod do wiadomości publicznej, aby każdy mógł go po prostu skopiować i wkleić.
Oto on:
Możesz nawet wstawić ten kod do nowego pliku nagłówka i #include go w swoim projekcie.
PD Jeśli chcesz dowiedzieć się więcej o płytce procesora, poszukaj pliku avr_cpunames.h
źródło
zauważ, że jest to mod systemu Windows, coś podobnego musi istnieć na Linuksie.
Pierwszy jest szybki i łatwy. Po prostu zmodyfikuj używane pliki platform.txt zgodnie z opisem poniżej. Wadą tego jest to, że będziesz musiał zmieniać pliki platform.txt w każdym wydaniu.
dodaj -DBOARD = \ "$ {build.board} \" do przepisu. Pozwoli to na
Który daje ci ciąg „ARDUINO_AVR_LEONARDO” (dla leonardo) w boardName.
Drugi sposób to przejście na lepsze IDE (jak już zaproponowali inni). Jako twórca wtyczki arduino eclipse radziłbym używać wtyczki arduino eclipse. We wtyczce arduino eclipse możesz to zrobić w następujący sposób: Kliknij prawym przyciskiem myszy projekt-> właściwości-> arduino-> zakładka „wstaw opcje kompilacji”
w polu dołącz do C i C ++.
Spowoduje to, że powyższy kod zostanie skompilowany
Adendum
Nie wiedziałem, że chcesz „miłego imienia”. Nie jestem pewien, czy można to naprawić w platformie.txt w arduino IDE. We wtyczce arduino eclipse zmień powyższą poprawkę w
aby uzyskać ładną nazwę (dla Leonarda „Arduino Leonardo”) w Zdefiniuj tablicę.
źródło
Dokładne nazwy w menu pochodzą z pliku deski.txt w twoim Arduino IDE (Arduino \ hardware \ arduino \ avr \ boards.txt). Myślę, że musisz sam przeanalizować plik i znaleźć tam wykrytą tablicę.
źródło
Jakiś czas temu zadałem powiązane pytanie .
Istnieje wewnętrzny plik * .h, który jest tworzony przez IDE i zawiera w sobie typ wybranej płyty. Lista możliwych opcji znajduje się w powiązanym pytaniu, ale tylko w przypadku płyt AVR. Uważam, że lista nie-AVR jest znacznie krótsza.
Wystarczy po prostu dodać kilka instrukcji warunkowych, aby przesłać PC poprawne informacje. Prosty przykład:
Jeśli chcesz odwołać się do typu planszy więcej niż raz w szkicu, użyj następującego formatu:
Ten ostatni jest znacznie bardziej uporządkowany, nawet jeśli potrzebujesz go tylko
__BOARD_TYPE
raz, ponieważ usuwa nieporęczny#ifdef
fragment z twoich funkcji.Będziesz oczywiście musiał napisać jedną dla każdej płyty, jakiej spodziewasz się użytkownik końcowy, i być może będziesz musiał zaktualizować tę listę, gdy pojawią się nowe modele.
źródło
Oryginalna odpowiedź jest nieaktualna, ponieważ dodano nowe tablice. Podstawowy test jest poprawny, ale nie jest jasne, skąd pochodzi lista desek.
Jeśli zlokalizujesz
boards.txt
plik i przejrzysz go (np.~\Library\Arduino\hardware\arduino\avr\boards.txt
Na komputerze Mac), każda płyta będzie miała wpis wzdłuż linii<BOARD>.build.board=<NAME>
, więc na przykład MKR1000 będzie miał linię:mkr1000.build.board=SAMD_MKR1000
Odpowiadająca #define mogą być generowane poprzedzając
<NAME>
zARDUINO_
więc w tym przykładzie następujący kod błędu dla MKR1000 pokładzie ...#if defined(ARDUINO_SAMD_MKR1000) #error
źródło