Moduł IoT AVR-IoT WA

Moduł IoT AVR-IoT WA

Urządzenia Internetu Rzeczy – IoT, to bardzo często układy pozwalające na odczyt danych z różnych czujników. Jeżeli to konieczne, mają również wbudowane funkcje sterowania elementami wykonawczymi. Jednak największym wyzwaniem w całej konstrukcji jest łącze radiowe zapewniające połączenie z aplikacją odbierającą i przetwarzającą dane. W artykule zaprezentujemy rozwiązanie proponowane przez firmę Microchip.

Ze względu na wykonywane funkcje urządzenia IoT muszą spełniać kilka podstawowych wymagań:

  • pobór mocy powinien być na bardzo niskim poziomie – umożliwiającym długotrwałe zasilanie bateryjne;
  • muszą zapewniać połączenie radiowe z Internetem lub specjalnym koncentratorem danych. Transmisja radiowa musi być zabezpieczona przed nieuprawnionym dostępem – podsłuchaniem czy modyfikacją przesyłanych danych. W praktyce oznacza to, że przesyłane dane wymagają odpowiedniego kodowania;
  • przesyłane dane powinny mieć możliwość dalszej obróbki: gromadzenia, wizualizacji lub analizy. Gromadzenie i obróbka danych jest często wykonywana przez aplikacje chmurowe;
  • produkcja i eksploatacja powinny odbywać się jak najniższym kosztem.

Jednym z głównych problemów w implementacji urządzeń IoT jest zapewnienie odpowiedniego połączenia radiowego, szczególnie w obszarach mało zamieszkanych, gdzie nie ma niezbędnej infrastruktury. Dlatego są rozwijane systemy takie jak LoRaWan pozwalające małym kosztem uzyskiwać zasięgi ponad 20 km. Łącze LoRaWan, do przesyłania danych do aplikacji chmurowych, wymaga specjalnych koncentratorów (gateway) podłączonych do Internetu. Niestety, u nas technologia LoRaWAN nie jest popularna, nie ma rozbudowanej sieci koncentratorów i dość trudno jest ją stosować.

Spora część urządzeń IoT stosowanych w domach, fabrykach czy biurach jest w zasięgu lokalnej sieci Wi-Fi. Ta sieć zapewnia bezpośredni dostęp do Internetu i odpowiedni poziom bezpieczeństwa przy stosowaniu szyfrowania WPA2. Jest też, ze względu na dużą popularność, relatywnie tania, ale ma ograniczony zasięg.

Standard Wi-Fi rozwiązuje problemy z łącznością, ale jednocześnie stawia spore wymagania sprzętowe i programowe urządzeniom IoT, które powinny być proste i tanie. Połączenie z Internetem wymaga stosowania protokołów TCP/IP i trzeba mieć na pokładzie moduł radiowy pracujący w odpowiednich pasmach. Niezależnie od szyfrowania standardu Wi-Fi, musimy też zapewnić algorytmy szyfrowania swoich danych. Przykładem gotowego rozwiązania sprzętowego i programowego spełniającego wymagania urządzenia IoT pracującego w sieci Wi-Fi jest moduł firmy Microchip AVR-IoT WA pokazany na fotografii tytułowej.

Moduł AVR-IoT WA

Jest to platforma demonstracyjna z 8-bitowym mikrokontrolerem AVR, zaprojektowana do testowania rozwiązań IoT korzystających z technologii Wi-Fi. Zastosowane rozwiązania sprzętowe można podzielić na trzy główne bloki:

  • mikrokontroler ATmega4808,
  • układ szyfrujący ATECC608A,
  • moduł kontrolera Wi-Fi WINC1510.

Możliwość testowania różnych funkcji zapewniają dwa wbudowane czujniki:

  • czujnik temperatury MCP9808 z interfejsem I2C,
  • czujnik natężenia światła z fototranzystorem TMT6000 – pomiar natężenia jest wykonywany przez przetwornik analogowo cyfrowy mikrokontrolera.

Dzięki umieszczonemu na płytce złączu mikroBUS, możliwe jest dołączenie jednego spośród 450 modułów rozszerzeń Click oferowanych przez firmę MikroElektronika. Pozwalają one w prosty sposób rozszerzać funkcjonalność AVR-IoT WA na przykład o dodatkowe czujniki. Wybór jest naprawdę duży – od czujników gazu, smogu, ciśnienia, temperatury czy wilgotności, poprzez czujniki (mierniki) prądu, pola magnetycznego, żyroskopy, akcelerometry i wiele innych.

Moduł jest standardowo zasilany napięciem 5 V z interfejsu USB, ale ma możliwość pracy bateryjnej. Zastosowany układ MCP73871 umożliwia ładowanie i nadzór nad ogniwem Li-Ion/Li-Poly o maksymalnym napięciu 4,2 V. Ogniwo automatycznie zasila moduł przy zaniku napięcia z USB.

Rysunek 1. Rozmieszczenie elementów na płytce modułu AVR-IoT WA

Mikrokontroler ATmega4808

Mikrokontroler ATmega4808 jest wyposażony w szybki 8-bitowy rdzeń AVR ze sprzętowym układem mnożenia. Może być taktowany sygnałem o częstotliwości do 20 MHz i ma wbudowane 48 kB pamięci programu Flash, 6 kB pamięci danych SRAM i 256 bajtów pamięci EEPROM. Wyposażenie w układy peryferyjne nie odbiega od standardu przyjętego w produktach Microchipa. Należy tu wspomnieć o 10 bitowym przetworniku ADC z własnym źródłem napięcia referencyjnego, komplecie interfejsów komunikacyjnych (UART, SPI, I2C), układach CMP (Capture/Compare/PWM) i odpowiedniej ilości liczników. Układ może być zasilany w szerokim zakresie napięć –od 1,8 do 5 V. Ma wbudowane 3 tryby oszczędzania energii: Idle, Stand-by i Power Down.

Moduł Wi-Fi ATWIN1500

Układ ATWINC1500 firmy Microchip jest zintegrowanym kontrolerem przeznaczonym do pracy w sieci IEEE 802.11 b/g/n (Wi-Fi). Według zapewnień producenta jest zoptymalizowany do pracy w urządzeniach IoT. Jest to idealne rozwiązanie dla małych układów mikroprocesorowych, które potrzebują funkcji sieciowych. ATWINC1500 łączy się poprzez interfejs SPI z dowolnym MCU. Ma zintegrowany wzmacniacz mocy (PA), niskoszumny wzmacniacz LNA, switch, moduł zarządzania energią, oraz zintegrowaną antenę umieszczoną na płytce drukowanej. Dostępna jest też wersja z mikro złączem RF co-ax (U.FL) do podłączenia zewnętrznej anteny. Wyposażony jest w wewnętrzną pamięć Flash o pojemności 4 MB do przechowywania oprogramowania systemowego Atmel Software Framework. Oprogramowanie jest darmowe i można je pobrać/uaktualniać na przykład poprzez framework MPLAB Harmony. Oprogramowanie wspiera protokoły: DHCP, DNS, TCP/IP (IPv4), UDP, HTTP i HTTPS. Układy wyposażone w ten moduł i tanie mikrokontrolery 8-bitowe mogą bez problemu pracować z protokołami sieciowymi i realizować połączenia internetowe.

ATECC608A CryptoAuthentication

Układ ATECC608A CryptoAuthentication realizuje zaawansowane funkcje kryptografii krzywej eliptycznej (ECC). Dzięki wbudowanym funkcjom ECDH i ECDSA urządzenie jest idealne dla szybko rozwijającego się rynku IoT, ponieważ zapewnia pełny zakres zabezpieczeń, na który składają się: poufność, integralność danych i uwierzytelnianie. Może być stosowany w systemach z MCU lub MPU z algorytmami szyfrowania/deszyfrowania. Podobnie jak wszystkie produkty Microchip CryptoAuthentication, nowy ATECC608A zawiera bardzo bezpieczne sprzętowe przechowywanie kluczy kryptograficznych i kryptograficzne środki zaradcze, które eliminują potencjalne backdoory związane ze słabymi punktami oprogramowania. Do komunikacji z mikrokontrolerem zastosowano standardowy interfejs I2C. Układ ATECCC608A zapewnia niskie zużycie energii i pracuje w dość szerokim zakresie napięć zasilania – od 2 do 5,5 V.

Programator/debuger

Na płytce modułu AVR-IoT WA umieszczono programator/debuger PICkit On-Board (PKOB nano) zapewniający pełną obsługę programowania pamięci programu Flash i debugowania przez programy Microchip Studio lub Microchip MPLAB IDE. Debugger również działa jako urządzenie interfejsu pamięci masowej, umożliwiając uproszczone programowanie przez przeciąganie i upuszczanie plików.

Rysunek 2. USB-CDC wbudowany w debugger

Wbudowany PICkit On-Board ma zaimplementowane kompozytowe urządzenie USB, które zawiera standardową klasę urządzeń komunikacyjnych (CDC) rozpoznawanych przez hosta USB jako wirtualny port szeregowy. Może służyć do strumieniowego przesyłania dowolnych danych w obu kierunkach między komputerem hostem, a MCU na płytce (rysunek 2). Może też być używane do konfiguracji sieci Wi-Fi, lub do innych celów, na przykład przy debugowaniu kodu, czy jako kanał do przesyłania danych z aplikacji.

Testy modułu – pierwsze kroki

Moduł jest dystrybuowany z wgraną aplikacją demonstracyjną i po skonfigurowaniu sieci Wi-Fi jest gotowy do testów. Jak już wspomniałem – programator/debugger ma wbudowaną funkcję pamięci masowej. Po połączeniu kablem z portem USB komputera system operacyjny powinien wykryć moduł AVR-IoT WA jako dysk pamięci masowej o nazwie Curiosity z zapisanymi plikami (rysunek 3).

Rysunek 3. Dysk pamięci masowej Curiosity

Po kliknięciu na plik click-me.htm w przeglądarce internetowej otwiera się strona https://bit.ly/3CyTO8K przeznaczona do konfigurowania i testowania modułu. Pierwszą czynnością, którą powinniśmy zrobić, jest aktualizacja oprogramowania firmware modułu do najnowszej wersji (rysunek 4).

Rysunek 4. Inicjowanie pobierania najnowszego oprogramowania firmware

Po kliknięciu na przycisk Get the latest Firmware zostaniemy przeniesieni na stronę Git Hub z plikiem AVR-IoT-WA-4.1.1.hex zawierający skompilowany plik najnowszej dostępnej wersji oprogramowania modułu przeznaczonej do łączenia się a chmurą Amazon AWS (rysunek 5).

Rysunek 5. Strona GitHub z plikiem AVR-IoT-WA-4.1.1.hex

Po kliknięciu na AVR-IoT-WA-4.1.1.hex zostanie on pobrany i zapisany na dysku komputera. Na tej stronie jest też dostępny spakowany program źródłowy (Source code), który można pobrać w taki sam sposób. Będzie przydatny później do testowania i dostosowania programu do własnych potrzeb. Pobrany plik przeciągamy i upuszczamy na dysk Curiosity. Proces aktualizacji przebiega dalej automatycznie bez potrzeby wykonywania żadnych dodatkowych czynności.

Kolejny krok to konfiguracja połączenia z siecią Wi-Fi. Można go wykonać na kilka sposobów. Jednym z nich jest wykorzystanie do tego celu witryny internetowej https://bit.ly/3CyTO8K otwieranej po kliknięciu na click-me.htm. W lewym dolnym rogu jest wyświetlane okno konfiguracji sieci. Wpisujemy tu SSD sieci, wybieramy rodzaj szyfrowania i zgodny z nim klucz (hasło). Po wpisaniu tych danych klikamy na przycisk Download Configuration. Witryna generuje plik wifi.cfg, który jest potem automatycznie przesyłany do folderu pobierania. Ten plik należy przenieść i upuścić na dysk Curiosity. Zostało to pokazane na rysunku 6.

Rysunek 6. Konfiguracja połączenia Wi-Fi

Przykładowa zawartość pliku została pokazana na rysunku 7.

Rysunek 7. Przykładowa zawartość pliku wifi.cfg
Rysunek 8. Moduł z przydzielonym adresem w sieci lokalnej LAN

Jeżeli konfiguracja jest poprawna, to moduł powinien się połączyć z routerem Wi-Fi, który przydzieli mu adres IP w sieci lokalnej LAN. Proces nawiązywania połączenia z siecią Wi-Fi trwa kilkadziesiąt sekund i jest sygnalizowany miganiem niebieskiej diody na płytce. Po nawiązaniu połączenia dioda świeci się światłem ciągłym.
Taki sposób konfiguracji jest szybki, wygodny i łatwy. W dokumentacji modułu opisano jeszcze dwa kolejne sposoby. Pierwszy korzysta z wirtualnego portu COM (CDC) programatora/debugera płytki modułu. Niezbędny tu jest pogram terminala znakowego. Na rysunku 9 jest pokazany ekran terminala PuTTY z komendą konfiguracji połączenia Wi-Fi. Za pomocą terminala można też sprawdzić wersję softu, wykonać restart, nawiązać ponowne połączenie Wi-Fi itp.

Rysunek 9. Ustawianie parametrów połączenia Wi-Fi za pomocą wirtualnego portu COM i terminala znakowego PuTTY

Ostatnią metodą połączenia z Wi-Fi jest zaawansowany tryb Software Access Point (Soft AP), wbudowany w moduł ATWINC. Ta metoda jest dobra, jeśli użytkownik korzysta tylko z urządzenia mobilnego, takiego jak telefon komórkowy lub tablet zamiast laptopa lub komputera. W tryb Soft AP można wejść naciskając i przytrzymując przycisk SW0.

Po prawidłowym połączeniu się z siecią Wi-Fi moduł nawiązuje połączenie z chmurą Amazon AWS. Jeżeli to połączenie się powiedzie to następuje przesyłanie danych pomiarowych: temperatury i natężenia oświetlenia do aplikacji chmurowej i można je obrabiać i wyświetlić.

Na stronie https://bit.ly/3CyTO8K uruchamianej po kliknięciu na plik click-me.htm wyświetlany jest interaktywny wskaźnik faz działania aplikacji składający się z elementów sygnalizacyjnych:

  • połączenia modułu z portem USB komputera,
  • połączenia z siecią Wi-Fi,
  • połączenia z chmurą,
  • przesłania danych do chmury.
Rysunek 10. Wskaźnik poprawności działania aplikacji

Poprawnie działająca aplikacja powinna sygnalizować poprawność każdego z etapów tak jak to zostało pokazane na rysunku 10. Pod wskaźnikiem są wyświetlane wykresy wartości pomiarów temperatury i natężenia światła przesyłanych do chmury co 1 sekundę jak to zostało pokazane na rysunku 11.

Rysunek 11. Wykresy wielkości pomiarowych z aplikacji chmurowej

W czasie testowania modułu wykonałem aktualizację firmware i konfigurację połączenia Wi-Fi. Moduł połączony z Wi-Fi połączył się z chmurą i przesyłał dane. Jedyną wątpliwość budziły pomiary temperatury zawyżone o ok. 10°C. W temperaturze otoczenia ok +21°C aplikacja wyświetlała temperaturę ok +33°C. W czasie ogrzewania czujnika palcem wykres reagował wzrostem temperatury do ok +34°C. Również czujnik natężenia oświetlenia reagował na zmiany oświetlenia, chociaż w tym przypadku trudno było określić czy prawidłowo mierzył jego poziom.

Co dalej?

Wszystkie płyty rozwojowe AVR-IoT WA są wstępnie zarejestrowane na koncie Sandbox AWS Cloud firmy Microchip. Konto jest skonfigurowane wyłącznie do celów testowych i demonstracyjnych. Wszyscy, którzy zakupili firmowe moduły i testują technologię Microchipa mogą z niego korzystać bez ograniczeń. Jednak nie ma możliwości gromadzenia danych i ich obróbki w dowolnym czasie. Pełne możliwości aplikacji chmurowej można wykorzystywać po migracji na własne prywatne konto utworzone w chmurze AWS.

Programy demonstracyjne dostarczane przez producentów sprzętu są atrakcyjne, ale często trudne do praktycznego zastosowania. Główną przeszkodą jest brak dokumentacji i przewodników niezbędnych do dostosowania dla własnych potrzeb. Łatwiej jest napisać wszystko od nowa niż wkładać mnóstwo pracy w zrozumienie jak działa czyjś program.

W tym przypadku jest inaczej. Microchip zadał sobie wiele trudu, żeby umożliwić projektantom łatwe tworzenie i testowanie własnych aplikacji. Pierwsze kroki można stawiać we wspomnianym już testowym koncie Sandbox AWS Cloud. Krótki samouczek jak się do tego zabrać, znajduje się na dole strony https://bit.ly/3CyTO8K (rysunek 12).

Rysunek 12. Modyfikacja projektu

Pobieranie, otwieranie i kompilacja kodów źródłowych

Spakowany kod źródłowy source code.zip można pobrać z GitHub. Do pracy z nim będzie nam potrzebne środowisko projektowe i kompilator. Użytkownicy mikrokontrolerów AVR często używali środowiska Atmel Studio i kompilatora AVR GCC. Microchip po przejęciu Atmela konsekwentnie integruje swoje programy narzędziowe i środowisko MPLAB X IDE z mikrokontrolerami AVR i SAM. Jest co prawda możliwość używania Atmel Studio, które teraz nazywa się Microchip Studio, ale nie wiadomo, czy to środowisko będzie rozwijane. Dlatego użyjemy środowiska projektowego MPLAB X IDE w wersji V5.30 i najnowszej dostępnej wersji kompilatora XC8 w wersji bezpłatnej. Kod źródłowy zawiera gotowy projekt dla MPLAB IDE i pozostaje tylko jego otwarcie i skompilowanie.

Pierwszą modyfikacją będzie możliwość przesyłania dodatkowej informacji, którą będzie odczytywany stan przycisku SW0. Zaczynamy od odnalezienia funkcji sendToCloud() w pliku application_manager.c (listing 1).

Listing 1. Funkcja SentToCloud() przed modyfikacją

// This will get called every 1 second only
// while we have a valid Cloud connection
static void sendToCloud(void)
{
static char json[PAYLOAD_SIZE];
static char publishMqttTopic[PUBLISH_TOPIC_SIZE];
int rawTemperature = 0;
int light = 0;
int len = 0;
memset((void*)publishMqttTopic, 0, sizeof(publishMqttTopic));
sprintf(publishMqttTopic, "%s/sensors", cid);
// This part runs every CFG_SEND_INTERVAL seconds
if (shared_networking_params.haveAPConnection){
rawTemperature = SENSORS_getTempValue();
light = SENSORS_getLightValue();
len = sprintf(json,"{\"Light\":%d,\"Temp\":%d.%02d}",
light,rawTemperature/100,abs(rawTemperature)%100);
}
if (len >0){
CLOUD_publishData((uint8_t*)publishMqttTopic ,(uint8_t*)json, len);
if (holdCount){
holdCount--;
}else{
ledParameterYellow.onTime = LED_BLIP;
ledParameterYellow.offTime = LED_BLIP;
LED_control(&ledParameterYellow);
}
}
}

Jest ona odpowiedzialna za przesyłanie danych z czujników do chmury AWS. Wartość zmiennych rawTemperature (temperatura z czujnika) i light (natężenie światła z czujnika) jest formatowana przez funkcję sprintf i umieszczana w tablicy json (listing 2).

Listing 2. Zapisywanie tablicy json wartościami temperatury i natężenia światła

len = sprintf(json,"{\"Light\":%d,\"Temp\":%d.%02d}",
light,rawTemperature/100,abs(rawTemperature)%100);

Żeby wysyłać stan przycisku SW0 trzeba zmodyfikować fragment pokazany na listingu 2 tak, jak to zostało pokazane na rysunku 13.

Rysunek 13. Zmodyfikowana funkcja SentToCloud

Dodajemy definicję zmiennej uint8_t sw0 = SW0_GetValue() != 0; i modyfikujemy zapisywanie tablicy json:

len = sprintf(json,"{\"Light\" :%d,\"Temp\":%d.%02d,\"Switch 0\"
:%u}",light,rawTemperature/100,abs
(rawTemperature)%100, sw0);

Po skompilowaniu kodu i zaprogramowaniu pamięci powinniśmy zobaczyć dodatkowy wykres Switch 0 pokazujący stany SW0 (zwarty/rozwarty) (rysunek 14).

Rysunek 14. Działanie zmodyfikowanego programu

Kolejna modyfikacja pozwoli na sterowanie zielonej diody LED umieszczonej na module z poziomu strony internetowej https://bit.ly/3CyTO8K. Zielony LED jest używany do sygnalizacji nawiązania poprawnego połączenia z chmurą. Najpierw wyłączamy tą sygnalizację. W pliku application_manager.c odszukujemy funkcję MAIN_dataTask() i komentujemy fragment odpowiedzialny za sterowanie zieloną diodą LED – listing 3.

Listing 3. Wyłączenie sterowania zieloną diodą LED

// Green LED if we are in Access Point
if (!shared_networking_params.amConnectingSocket){
if(CLOUD_checkIsConnected()){
//wylaczenie sterowania zelonym LED
//ledParameterGreen.onTime = SOLID_ON;
//ledParameterGreen.offTime = SOLID_OFF;
//LED_control(&ledParameterGreen);
}else if(shared_networking_params.haveDataConnection == 1){
ledParameterGreen.onTime = LED_BLINK;
ledParameterGreen.offTime = LED_BLINK;
LED_control(&ledParameterGreen);
}

W funkcji receivedFromCloud() zostały przygotowane wszystkie mechanizmy odbierania polecenia toggle i nic tam już nie trzeba robić. Funkcja getToggle zwraca wartość 0 lub 1 po każdym odebraniu polecenia z chmury. Na końcu funkcji MAIN_dataTask() dodajemy fragment zapalający lub gaszący zieloną diodę LED zależnie od tego co zwróci funkcja getToogleState() – listing 4. Panel sterujący diodą został pokazany na rysunku 15.

Rysunek 15. Sterowanie diodą LED z poziomu „chmury”
Listing 4. Fragment funkcji MAIN_dataTask() zapalający lub gaszący zieloną diodę LED

if(!getToggleState()) {
ledParameterGreen.onTime = SOLID_ON;
ledParameterGreen.offTime = SOLID_OFF;
LED_control(&ledParameterGreen);
} else {
ledParameterGreen.onTime = SOLID_OFF;
ledParameterGreen.offTime = SOLID_ON;
LED_control(&ledParameterGreen);
}

Podsumowanie

Moduł Microchip AVR-IoT WA to kompletne rozwiązanie sprzętowo-programowe przeznaczone do aplikacji IoT korzystającej z łączności Wi-Fi. Dane z czujników są przesyłane do chmury AWS (Amazon), gdzie mogą być wizualizowane i ewentualnie archiwizowane i przetwarzane. Producent zrobił bardzo wiele, żeby zaproponowane rozwiązania można było wdrożyć tak szybko jak to możliwe. Do dyspozycji mamy kompletny moduł i program przykładowy z kodami źródłowymi. Do stawiania pierwszych kroków, testowania wbudowanych funkcji i modyfikacji aplikacji Microchip udostępnia swoją bezpłatną usługę w chmurze AWS. Korzystając z tych możliwości jesteśmy w stanie, w relatywnie krótkim czasie, skonfigurować połączenie Wi-Fi, przetestować funkcje przesyłania danych pomiarowych, a potem zmodyfikować samodzielnie program tak by wysyłał stan SW0 i odbierał z chmury polecenia zapalania i gaszenia diody LED umieszczonej na module.

Te testy można traktować jako wstęp do pełnego zastosowania modułu. Na GitHub są umieszczone samouczki pokazujące jak założyć sobie własne konto w chmurze AWS i przystosować moduł do własnych celów bez ograniczeń stawianych przez konto Microchipa. Wszystko to pokazuje, że producent zaoferował nam znacznie więcej niż tylko moduł z programem demonstracyjnym. Kody źródłowe oraz kopalnia wiedzy na GitHub pozwalają wejść w świat chmurowych aplikacji IoT i korzystać z nich bez ograniczeń.

Microchip oferuje tez wersję modułu z mikrokontrolerem rodziny PIC24 oraz wersje oprogramowanie firmware przeznaczone do połączenia z chmurą Google.

Tomasz Jabłoński, EP

Artykuł ukazał się w
Elektronika Praktyczna
październik 2021
Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik listopad 2024

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio listopad - grudzień 2024

Świat Radio

Magazyn krótkofalowców i amatorów CB

Automatyka, Podzespoły, Aplikacje październik 2024

Automatyka, Podzespoły, Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna listopad 2024

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Elektronika dla Wszystkich listopad 2024

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów