Czy jest duży skok między prototypowaniem na Pi a użyciem mikrokontrolera?

25

To pytanie dotyczy między innymi tego, czy istnieje duża krzywa uczenia się między używaniem Pythona na Raspberry Pi do prototypowania punktu końcowego a użyciem mikrokontrolera.

Niewątpliwie istnieje znaczna poprawa zużycia energii (kosztem zmniejszonej przepustowości procesora), więc istnieją dobre powody, aby przyjąć podejście MCU dla produktu, który musi być zasilany z baterii.

Jednym z potencjalnych powodów pozostania przy komputerze jednopłytkowym z systemem Linux jest to, że nie ma nowego oprogramowania do nauki (powyżej Python lub podobnego), zakładając, że aplikacja może być napisana w języku wysokiego poziomu (w którym powinno być dużo standardu biblioteki).

Na wbudowanej platformie programistycznej prawdopodobne są C ++ (mbed lub arduino) lub micropython. Mam wrażenie, że nie różnią się one znacznie i nie są bardziej złożone niż pisanie kodu do uruchomienia pod Linuksem - chociaż platformy mają indywidualne zalety. Czy przegapiłem coś, co jest istotne dla programisty?

W szczególności pytam o punkty końcowe IoT - więc nie jest konieczne posiadanie pełnych zasobów systemu Linux dla aplikacji, którymi jestem zainteresowany. Warto również podkreślić, że względy mocy i opóźnienia sprawiają, że implementacja mcu jest trudnym wymaganiem w tego typu aplikacjach.

Sean Houlihane
źródło

Odpowiedzi:

12

Uzupełnienie kompleksowej odpowiedzi George'a i pkt. 2) obsługa sprzętu. Nawet jeśli pożądany sprzęt (np. Ethernet, WiFi, karta SD) zostanie dodany do mikrokontrolera / Arduino za pomocą osłon lub podobnych kart rozszerzeń, biblioteki do ich obsługi obciążają małą pamięć (tj. ATMEGA328 (typowy kontroler Arduino) ma 32KB FLASH i 2Kb RAM). Może to stanowić poważne ograniczenie, szczególnie w przypadku łączenia wielu funkcji (sieć, wyświetlacz, karta SD).

Kilka przykładów ze świata Arduino:

Obsługa karty SD i prostego systemu plików (FAT):

  • Karty SD (nieznany rozmiar kodu, ale prawdopodobnie nie tak duży, jeśli używany jest sprzętowy SPI), co najmniej 512 bajtów bufora pamięci RAM
  • Petit FAT FS wymaga ~ 2..4 kB FLASH i ~ 44 bajtów RAM

Za pomocą wyświetlacza matrycowego:

Ethernet ze stosem protokołów TCP / IP:

  • uIP : Wymagania dotyczące pamięci RAM w zakresie typowego rozmiaru pakietu (> 1 kB), jednak jednoukładowe kontrolery Ethernet zwykle są dostarczane z wbudowanym buforem, który może pomieścić kilka maksymalnych rozmiarów ramek Ethernet.

    Możliwe jest uruchomienie implementacji uIP z zaledwie 200 bajtami pamięci RAM, ale taka konfiguracja zapewni wyjątkowo niską przepustowość i pozwoli na niewielką liczbę jednoczesnych połączeń. ( Źródło. )

  • Stos IP z protokołami TCP i UDP dla Arduino : minimum 128 kB pamięci zewnętrznej

  • IP przez interfejs szeregowy: SerialIP ~ 9 kB FLASH i „wystarczająca” pamięć RAM

Podsumowując, programowanie z tymi ograniczeniami wymaga całkiem odmiennego podejścia i wymaga optymalizacji w odniesieniu do przestrzeni programowej i rozmiaru kodu (FLASH), danych wykonawczych (RAM) i szybkości wykonania. Ta odpowiedź ładnie się ułożyła.

Ponieważ pytanie dotyczy konkretnie platformy mbed, warto zauważyć, że zawiera ona funkcje najbardziej odpowiednie dla Internetu Rzeczy, a mianowicie łączność wraz z szyfrowaniem, uwierzytelnianiem i autoryzacją. Podobno oferuje wsparcie sprzętowe dla Bluetooth Low Energy i IPv6 za pośrednictwem bezprzewodowej sieci osobistej o niskiej mocy. Chociaż te funkcje łączności są dostępne tylko na wymienionych płytach rozwojowych z typowo> = 128 kB FLASH i> = 16 kB RAM. Z drugiej strony mniejsze płyty programistyczne obejmują systemy z tak małymi mikrokontrolerami jak ARM Cortex-M0 + Core z 16KB Flash, 4KB RAM (tj. Niewiele więcej niż średniej wielkości Arduinos) bez dedykowanej łączności.

Ghanima
źródło
Ograniczenia zasobów były największą luką w moich założeniach - łatwo zapomnieć, że większość ludzi rozwija się bez tych problemów przez większość czasu.
Sean Houlihane
20

To zależy od tego, co próbujesz zrobić.

  1. Największą luką jest to, że wspomniany mikrokontroler (taki jak Arduino) nie obsługuje wielozadaniowego systemu operacyjnego, takiego jak Linux. Oznacza to, że jeśli twoja aplikacja zależy od wielozadaniowości lub wielowątkowości, uruchomienie Arduino może być znacznie trudniejsze lub nawet niemożliwe.

  2. Druga luka to wsparcie sprzętowe. Na przykład Raspberry Pi obsługuje kamery, USB audio, Ethernet, WiFi po wyjęciu z pudełka. Żadna z tych funkcji nie jest obsługiwana bezpośrednio przez Arduino i chociaż możesz używać różnych osłon (takich jak host USB, Ethernet lub WiFi), korzystanie z nich nie jest tak proste, jak korzystanie z sieci na Raspberry Pi.

  3. Trzecią luką są dostępne zasoby. Większość mikrokontrolerów nie zbliża się nawet do zasobów oferowanych przez Raspberry Pi. Na przykład, nawet pierwszy Raspberry Pi oferował procesor działający z częstotliwością 700 MHz z 256 MB pamięci RAM i może być używany z pamięcią 32 GB. Typowe Arduino Uno oparte na ATMEGA328 działa z częstotliwością 16 MHz i ma 32 KB pamięci i 2 KB pamięci RAM.

Korzystanie z Raspberry Pi jest zdecydowanie łatwiejsze dla programistów pochodzących z komputerów PC. Główne zalety korzystania z mikrokontrolerów to:

  • koszty (chiński klon Arduino Nano kosztuje mniej niż 2 USD za sztukę z wysyłką)
  • pobór mocy (mikrokontrolery można bardzo dobrze zoptymalizować pod kątem niskiego zużycia energii - ważne, jeśli trzeba korzystać z baterii);
  • dostępność w czasie rzeczywistym, tj. zdolność reagowania na zmianę sygnału w czasie rzeczywistym;
  • rozmiar (Arduino Mini jest dwa razy węższy niż Raspberry Pi Zero, a jeśli nie potrzebujesz tak wielu pinów, rozmiar ATTINY85 jest mniejszy niż grosz i działa bez kryształu).

Jeśli żadne z nich nie jest ważne, korzystanie z Raspberry Pi zdecydowanie ma sens.

George Y.
źródło
3
Moc baterii i brak wielkich wymagań dotyczących zasobów to sterowniki do korzystania z mcu - więc zakładam, że procesor 10-100 MHz wystarczy. Ważny punkt przy korzystaniu z urządzeń peryferyjnych, chociaż SPI jest prawdopodobnie mcu odpowiednikiem USB.
Sean Houlihane
2
Samo autobus nie wystarczy. Rozważ użycie Wi-Fi w Linuksie, twoja aplikacja nie wymaga żadnej konkretnej wiedzy na ten temat, ten sam kod, który działa z Ethernetem, będzie działał z interfejsem WiFi. Tak nie jest w przypadku mikrokontrolerów, trzeba użyć różnych bibliotek, nauczyć się z nich korzystać i zmienić kod.
George Y.
1
OK, nie zdawałem sobie sprawy, że korzystanie z innej biblioteki stanowiłoby dużą barierę.
Sean Houlihane
2
Jeśli nie potrzebujesz wielu szpilek, możesz dostać ATtiny4 o wielkości ziarenka ryżu: P
Nick T
1
jego najwyraźniej niewiele mniejszy niż Attiny85 :) ale masz rację, jeśli myślimy, że nie DIP, nawet 85 to opuszek palca.
George Y.
9

TAK, to duży skok od programowania w Pythonie do programowania przy użyciu typowych narzędzi językowych opartych na języku C na mikrokontrolerze. W rzeczywistości w wielu przypadkach może być konieczne napisanie części, jeśli nie wszystkich, aplikacji w języku asemblera.

Jak już wskazano w innych odpowiedziach, mikrokontrolery są bardzo ograniczone pod względem zasobów, a zatem tracisz wszystkie wygody systemu operacyjnego Linux i wszystkie narzędzia, które możesz uruchamiać lokalnie. Iteracja z Arduino IDE jest bardzo wolna w porównaniu do uruchamiania lokalnych skryptów.

Chociaż mam duże doświadczenie zawodowe z mikrokontrolerami i mikroprocesorami, wolę prowadzić moje osobiste projekty przy użyciu sprzętu RPi z niektórymi Arduinos do krytycznych rzeczy w czasie rzeczywistym. Zajmowałem się także Beagle Bone Black i pod pewnymi względami jest to wygodniejsze niż używanie RPi z jednym lub kilkoma Arduinos.

CyberFonic
źródło
9

Tak, duża różnica

Różnica jest jak w dzień iw nocy, zarówno w odniesieniu do sprzętu, jak i oprogramowania. Brak ważnego porównania.

Kiedy używać którego

Użyj Arduino, jeśli ...

  • Ograniczenia przestrzenne sprawiają, że Pi jest niemożliwe.
  • Zużycie energii przez Pi byłoby zbyt duże.
  • Problemem są pieniądze (szczególnie, jeśli potrzebujesz kilku lub wielu pojedynczych kontrolerów w swoim projekcie, z których każdy wykonuje tylko bardzo prostą logikę).
  • Chcesz być grzeczny i szorstki i pracować na znacznie niższym poziomie dla zabawy lub zdobywania wiedzy.
  • Potrzebujesz ekstremalnej prostoty i / lub 100% zdefiniowanego zachowania w czasie rzeczywistym i zerowej szansy, że coś poza twoją kontrolą zabije Twój program.
  • Nie potrzebujesz ethernetowej, trudnej funkcjonalności hosta USB (tj. Dostępu do dysków twardych; używanie go po stronie klienta, np. Jako urządzenia HID, jest OK) i tak dalej. Większość z nich można dopasować do Arduino (bardzo wolno), ale ma to wysokie koszty pod względem pamięci RAM / EPROM, a także funkcjonalności. Ponieważ nie ma zapobiegawczej wielozadaniowości, odblokowywanie zadań bardzo szybko się komplikuje.
  • Nie przeszkadza ci proste IDE Arduino lub znacznie głębsze kopanie (tj. Samodzielne budowanie programów) i - jeśli nie wybierasz urządzenia przesyłającego USB, takiego jak Pro Micro - kupionego lub samodzielnie wykonanego zestawu programistycznego /palnik.

We wszystkich innych przypadkach Pi jest znacznie bardziej przyjazny dla użytkownika. Pi to po prostu kolejny (wolny) komputer.

Nie zrozum mnie źle. Posiadam Pi i używam go do kilku usług Linux w mojej sieci. Często też programuję Arduinos (głównie Pro Micros). Oba są świetne, lubię je tak samo, ale mają bardzo różne scenariusze użytkowania.

Na twoje pytanie dotyczące trudności - jest względne. Jedynym trudnym dla mnie Arduino było debugowanie problemów z taktowaniem, szczególnie w połączeniu z wątpliwą elektroniką (tj. Zakłócenia elektromagnetyczne, zbyt długie kable itp.). Jeśli jesteś biegły w swoim wybranym języku (tj. C dla Arduino IDE), powinieneś być w stanie włamać się do wszystkich bibliotek, które zatrudniasz. Mimo to zawsze będzie bardziej skomplikowane niż Pi, w którym możesz na przykład użyć wybranego języka skryptowego do rzeczy, które nie są krytyczne pod względem czasowym - zawsze będą one łatwiejsze do opracowania i debugowania.

AnoE
źródło
Nie pytam, która jest najlepsza platforma programistyczna - mój przypadek użycia wymaga mcu, głównie z powodu ograniczeń mocy. Widzę jednak, że pytanie nie było zbyt jasne w tej kwestii.
Sean Houlihane
W porządku, wystarczy pierwsza część odpowiedzi. Jeśli chcesz, pozwolę reszcie stać się „dodatkiem”.
AnoE
7

Uważam, że jest kilka punktów, które nie zostały jeszcze wyraźnie określone.

Środowisko programistyczne jest zupełnie inne. Możesz faktycznie opracować oprogramowanie Pi na Pi - możesz nawet użyć GUI, jeśli chcesz. Wbudowane są zaawansowane narzędzia do debugowania, a także bardzo dużo tego, co jest dostępne dla dowolnego systemu komputerowego.

Kontrolery będą musiały zostać opracowane / emulowane na osobnym komputerze, a następnie przesłane do kontrolera w celu ostatecznego przetestowania.

Pi może działać praktycznie w dowolnym języku, w którym chcesz go zaprogramować, mikrokontrolery zwykle mają jeden lub dwa.

Pi może obsługiwać wiele systemów operacyjnych (w tym Windows IoT i kilka systemów specjalnych), wbudowane kontrolery zwykle nie uruchamiają „Systemu operacyjnego”.

Także jeśli chodzi o środowisko wykonawcze / system operacyjny - uruchomienie Pi zajmuje kilka sekund - jeśli chcesz coś zrobić w ciągu tych pierwszych kilku sekund, pi nie będzie dla ciebie działać. Ponadto, chyba że zastosujesz jakieś ekstremalne środki, aby zapobiec jakiemukolwiek zapisywaniu w pamięci, naprawdę nie powinieneś po prostu wyłączać zasilania, musisz wykonać „Wyłączenie” i trochę poczekać. Może to również ograniczyć niektóre zastosowania.

Kolejny punkt po wdrożeniu, o którym nie wspominałem. Nie jestem pewien, w jaki sposób jestem absolutnie pewien, że odpowiednio zabezpieczyłem Pi - że żadna agencja nie umieściła gdzieś małego fragmentu kodu, który w niektórych okolicznościach umożliwia nieautoryzowany dostęp - bez usuwania go ze wszystkich sieci i wyłączania wszystkich mechanizmów dostępu bezprzewodowego . Mikrokontrolery są dość łatwe do zabezpieczenia, ponieważ piszesz prawie cały kod działający na tym urządzeniu.

Oczywiście, zawsze możesz opracować własny obraz Pi bez prawdziwego systemu operacyjnego i przejąć całą płytę / procesor, co prawie uczyniłoby z niego potężny / drogi mikrokontroler ze wszystkimi powiązanymi zaletami / wadami. Ktoś prawdopodobnie już to zrobił, ale ostatnio czegoś takiego nie szukałem.

Bill K.
źródło
WRT twój ostatni akapit, tak, to się nazywa bare-metal i niewiele osób to robi, ale technicznie jest to możliwe ... witamy na stronie!
Ghanima
3

Różnica między tworzeniem aplikacji za pomocą Pi może być bardzo różna lub nieco podobna do tworzenia aplikacji za pomocą mikrokontrolera ze względu na różnice sprzętowe, a także różnice w łańcuchu narzędzi programistycznych.

Dostępna jest szeroka gama mikrokontrolerów, które są od 8 do 64 bitowych procesorów i mają od kilku K pamięci RAM do kilku gigabajtów pamięci RAM. Bardziej wydajne mikrokontrolery zapewniają bardziej wrażenia podobne do Pi. Mikrokontrolery o mniejszych zdolnościach nie.

I nawet w przypadku Pi istnieją duże różnice między programowaniem dla systemu operacyjnego Windows 10 IoT a programowaniem dla Raspian, Mate lub innego systemu operacyjnego opartego na Linuksie. Windows 10 IoT wymaga komputera programistycznego korzystającego z zestawu narzędzi Visual Studio ze zdalnym debuggerem ukierunkowanym na środowisko Universal Windows Program (UWP). Programowanie dla Raspian lub Mate można faktycznie wykonać na Pi za pomocą narzędzi dostępnych na Pi.

Protokół ograniczonej aplikacji jest używany w przypadku małych, ograniczonych urządzeń używanych w środowisku Internetu rzeczy. Aby zapoznać się z różnorodnością sprzętu i oprogramowania mikrokontrolera, ta strona implementacji protokołu CoAP przedstawia środowisko, na które jest kierowana. Wspomina o systemie operacyjnym Contiki, o którym słyszałem niejasno, oraz o bardziej znanych systemach operacyjnych, takich jak iOS, OSX i Android. Wspomniane języki programowania to Java, JavaScript, C, C #, Ruby, Go, Erlang, Rust i Python.

Łańcuch narzędzi używany do programowania z mikrokontrolerem różni się w zależności od producenta, a także od tego, jakie zasoby są dostępne ze społeczności programistów i inicjatyw typu open source. W niektórych przypadkach otrzymujesz asembler krzyżowy, w innych dostajesz kompilator krzyżowy C, aw innych dostajesz ładny łańcuch narzędzi ze wszystkimi dzwonkami, gwizdkami i emulatorami i podobny do łańcucha narzędzi Visual Studio dla IoT Windows 10.

Rzeczywiste środowisko programistyczne dla mikrokontrolera może wymagać użycia programatora EEPROM i narzędzi programowych do utworzenia nowego obrazu i przekazania go do urządzenia lub urządzenie może mieć niezbędną łączność, aby umożliwić pobranie nowego obrazu za pośrednictwem połączenia szeregowego lub połączenie sieciowe.

Mam wrażenie, że większość mikrokontrolerów ma kompilator krzyżowy C, chociaż kompilator może obsługiwać tylko starsze standardy, takie jak K&R, a może C98. Kompilatory krzyżowe typu C często mają niestandardowe słowa kluczowe dla funkcji specyficznych dla mikroprocesora, na przykład słowa kluczowe fari neardla wskaźników ze starymi procesorami 8080 i 8086 z ich segmentowaną pamięcią.

Istnieją również języki specjalne, które są ukierunkowane na mikrokontrolery, takie jak język programowania FORTH . Języki te często mają konstrukcję wykonawczą ukierunkowaną na goły metal, dzięki czemu nie ma innego systemu operacyjnego niż język wykonawczy.

System operacyjny może wahać się od praktycznie nieistniejącego systemu Linux po gołą kostkę, aż po specjalistyczny system operacyjny, taki jak freeRTOS lub Windows Embedded lub w pełni funkcjonalny Linux lub Microsoft Windows. Zobacz ten projekt SourceForge MINIBIAN dla Raspberry Pi . Zobacz także ten eBook, Baking Pi: Operating Systems Development, który opisuje rozwój podstawowego systemu operacyjnego dla Raspberry Pi w asemblerze.

Ten artykuł z Visual Studio Magazine, Programowanie Internetu rzeczy za pomocą Visual Studio , zawiera omówienie wielu różnych dostępnych urządzeń, a następnie omówienie korzystania z Visual Studio IDE do programowania w systemach Linux i Windows.

Obecnie dostępny jest ogromny i rozwijający się świat gotowych, programowalnych, możliwych do podłączenia w sieci urządzeń mikrokontrolera. Na bardzo niskim poziomie masz wiele prostych 16- i 32-bitowych urządzeń różnych tradycyjnych producentów układów, takich jak Texas Instruments. (Grałem trochę z zestawem programistycznym SensorTag i sprawia mi to wiele radości, dlatego myślę, że Watch DevPack może być również świetnym zestawem narzędzi do nauki.)

Niektóre bardziej znane urządzenia mikrokontrolera to Arduino, BeagleBoard i Raspberry Pi. Wszystkie te środowiska mają szerokie wsparcie społeczności i są gotowe do podłączenia do ogromnej liczby gotowych zewnętrznych czujników, silników, serwomechanizmów i wszystkiego innego, co możesz sobie wyobrazić. Adafruit, superstore do nauki elektroniki założone przez Limor „Ladyada” Fried, zapewnia wszelkiego rodzaju urządzenia peryferyjne dla tych płyt, wraz z własną linią lekkich płyt rozwojowych z piórami.

...

Najciekawszym uniwersum urządzeń dla programistów znających Microsoft .NET Framework i Visual Studio mogą być środowiska zgodne z Windows 10 IoT Core. Są to urządzenia z procesorami x86 i ARM, które obsługują aplikacje Universal Windows Platform (UWP) napisane w różnych językach, w tym C #, Visual Basic, Python i Node.js / JavaScript. Rdzeń IoT systemu Windows 10 obsługuje urządzenia, w tym Raspberry Pi, Arrow DragonBoard 410C, Intel Joule i Compute Stick i MinnowBoard. Istnieją również interesujące platformy produktowe, takie jak poręczny Askey TurboMate E1.

Konkretny przykład aplikacji mikrokontrolera

Jest to obraz płytki mikrokontrolera z automatycznego ekspresu do kawy. Wydaje się, że jest to standardowy element automatycznych ekspresów do kawy produkowanych w Chinach. Strona internetowa producenta jest wydrukowana na płytce drukowanej.

Obraz składa się z dwóch widoków. Widok po lewej stronie jest z tyłu płyty zawierającej mikrokontroler i obwody podtrzymujące. Widok z prawej strony to przód tablicy z ekranem LCD i zestawem przycisków, które służą do ustawiania aktualnego czasu i wykonywania czynności takich jak programowanie czasu rozpoczęcia itp.

Widok z prawej strony mieści się w uchwycie, który następnie wpasowuje się w otwór z przodu ekspresu do kawy. Przełączniki na dolnej płytce drukowanej są uruchamiane przełącznikami wahacza. Wyświetlacz LCD, który wydaje się być specjalnym przeznaczeniem, służy do wyświetlania aktualnego czasu i statusu, a także do wyświetlania interfejsu użytkownika podczas zmiany ustawień ekspresu do kawy. Czerwona dioda LED służy do wskazania, kiedy ekspres do kawy faktycznie robi kawę oraz do wskazania, kiedy zostanie to zrobione przez wyłączenie podświetlenia.

wprowadź opis zdjęcia tutaj

Mikrokontrolerem jest ELAN Microelectronics Corp EM78P447NAM (arkusz danych), który jest 8-bitowym mikrokontrolerem. Niektóre podstawowe statystyki pokazują, jakie to małe i minimalne urządzenie, jednak działa dobrze zgodnie z przeznaczeniem. Celem jest opracowanie oprogramowania, które jest następnie pobierane do pamięci ROM raz w ramach produkcji.

• Niskie zużycie energii:

* Less then 2.2 mA at 5V/4MHz

* Typically 35 µA, at 3V/32KHz

* Typically 2 µA, during sleep mode

• 4K × 13 bitów na pamięci ROM układu

• Trzy bity ochronne, aby zapobiec włamaniu kodów pamięci OTP

• Jeden rejestr konfiguracji w celu dostosowania do wymagań użytkownika

• 148 × 8 bitów w rejestrach układów scalonych (SRAM, rejestr uniwersalny)

Richard Chambers
źródło
2
Nie sądzę, że rozwiązuje to pytanie. Pewnie, niektóre produkty nie są dobrze zapakowane, ale dotyczy to również SBC.
Sean Houlihane
1
@SeanHoulihane, co starałem się zrobić z tą odpowiedzią, to zapewnić punkt widzenia mikrokontrolera na pytanie, w szczególności, że istnieje szeroka gama urządzeń, które spełniają etykietę mikrokontrolera. Krajobraz systemu operacyjnego to coś więcej niż Linux, a język programowania to coś więcej niż python lub C.
Richard Chambers
1
Dla mnie mówisz tylko, że świat MCU to bałagan. Co, moim zdaniem, wprowadza w błąd.
Sean Houlihane
1
@SeanHoulihane Przykro mi, że masz wrażenie, że z mojego postu wynika, że ​​świat MCU to bałagan. Inna interpretacja jest taka, że ​​świat MCU jest jedną z wielu wspaniałych alternatyw i możliwości, jednak czytelnik wnosi do swoich narracji własne uprzedzenia i uprzedzenia.
Richard Chambers