Przeszukaj forum
Pokazywanie wyników dla tagów 'arduino'.
Znaleziono 525 wyników
-
W tym projekcie chciałbym opisać krok po kroku proces podłączenia licznika samochodowego od Forda Galaxy do naszego Arduino. Potrzebne elementy: Zasilacz 12V Arduino Przewody męsko-żeńskie Licznik samochodowy Zestaw wskaźników od Forda Galaxy posiada 2 wtyczki - czerwoną oraz czarną. Nas w tym projekcie interesuje tylko czerwona wtyczka gdyż znajdują się w niej piny zasilające oraz dostarczające dane do silników krokowych w liczniku. Najpierw zajmijmy się zasilaniem. Do pinu 3 oraz do pinu 4 na liczniku wpinamy 2 przewody i podłączamy je do minusa na naszym zasilaczu a kolejne 2 przewody wpięte w pin 14 oraz w pin 15 podłączamy do +. Jako zasilacz może nam posłużyć zwykły zasilacz komputerowy kub jakikolwiek o napięciu 12V. Dalej zajmijmy się podłączeniem silniczków od wskazówek. obrotomierz - 10 pin prędkościomierz - 27 pin wskaźnik poziomu paliwa - 21 pin wskaźnik temperatury cieczy - 23 pin (pin 1 jest w lewym dolnym rogu wtyczki) Następnie przewody te wpinamy w wejścia cyfrowe do Arduino. W moim przypadku obrotomierz wpiąłem w wejście oznaczone 2, prędkościomierz w wejście nr 3, wskaźnik poziomu paliwa 4 a temp. cieczy w wejście 5. Jeżeli po podpięciu zasilania licznik zadziała (wskazówki ustawią się w położeniu 0 oraz włączy się podświetlenie) to możemy przejść do konfiguracji. Pobieramy oprogramowanie SimHub i instalujemy je. Po uruchomieniu programu przechodzimy do zakładki Arduino a następnie klikamy na zakładkę "My hardware". Wybieramy "Single Arduino" i klikamy "Open arduino setup tool". Następnie definiujemy w jakie wejścia wpięliśmy nasze wskaźniki. Wybieramy z jakiego arduino korzystamy (w moim przypadku jest to UNO) oraz wybieramy port komunikacyjny. Gdy wszystko mamy już zrobione klikamy Upload to arduino i czekamy aż program zostanie wgrany na Arduino. Jeżeli program wgrał się poprawnie przechodzimy do zakładki "Gauges" i kalibrujemy nasz licznik. Wartości liczbowe są indywidualne dla każdego licznika ale to co musimy ustawić do każdego licznika to MAX Tachometer RPM na 7 (jeżeli zakres na tarczy obrotomierza jest inny to podajemy maksymalną liczbę, jeśli jest to 5 to podajemy 5) oraz tachometer cylinders na 6. Warto zaznaczyć opcję "Always use tachometer full range" jednak jeśli sprawia ona problemy możemy ją wyłączyć. Resztę wartości musimy ustawić tak, żeby wskazówka poprawnie wskazywała położenie min i max. Niestety nie ma uniwersalnych wartości i prędkościomierz u mnie wskazuje poprawnie 240 km/h przy wartości 222 (speedo gauge maximum output) jednak w innym liczniku może być to wartość ciut większa lub mniejsza. Na samym końcu wybieramy grę w którą chcemy zagrać z zakładki "Games". Następnie uruchamiamy naszą grę i cieszymy się rozgrywką z naszym licznikiem. Ktoś mi może powiedzieć "Przecież można napisać kod", zgodzę się z tym tylko ja gram od ETS 2 przez Dirt 4 na Forzie kończąc. O wiele łatwiej jest jednym kliknięciem zmienić grę w simhubie niż pisać osobny kod eksportujący dane z telemetrii do Arduino. Jeżeli ktoś potrzebuje tylko licznika do jednej gry to ma to sens jednak w moim przypadku mija się to z celem. Koszt takiego licznika może zamknąć się w okolicach 50 zł. Możemy wykorzystać klona arduino (klon nano możemy kupić za mniej niż 15zł), a licznik możemy znaleźć na portalach aukcyjnych za ok 20zł. Jest to niedrogi i fajny bajer a na dodatek jest bardzo praktyczny. Poniżej znajdują się zdjęcia i gif pokazujący pracę urządzenia.
-
Zdalnie sterowany samochodzik pilotem IR
BeeKeyPro opublikował temat w Projekty - DIY (początkujący)
Witam. Budowę auta na pilota planowałem już od dawna, ale nie wiedziałem jak się do tego zabrać. Dopiero niedawno gdy miałem okazje wykonać projekt z tego filmu, dowiedziałem się jak to zrobić. I tak oto powstało takie auto na pilota: Auto na pilota Użyte komponenty i moduły: Arduino UNO Moduł sterownika silników DC L293D Akumulatorki Li-Ion 18650 + koszyk Silnik DC z przekładnią + koła (x4) Odbiornik IR Rezystor 68Ω Kondensator 100µF Przełącznik I/O Pilot IR (ja użyłem ten pilot) Na samym początku musiałem zbadać kody które odbiornik odbiera po wciśnięciu danego przycisku na pilocie, więc napisałem i wgrałem taki kod: #include <IRremote.h> const int RECV_PIN = A0; void setup() { Serial.begin(9600); IrReceiver.begin(RECV_PIN, ENABLE_LED_FEEDBACK); Serial.println("Odbiornik IR gotowy."); } void loop() { if (IrReceiver.decode()) { Serial.print("Kod: "); Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX); IrReceiver.resume(); } Okazało się, że odbiornik odbiera losowe sygnały gdy klikam ten sam przycisk. Problem rozwiązał ,,filtr na zasilaniu odbiornika". (problem szczegółowo opisywany i rozwiązywany jest w tym wątku): Ustaliłem sposób w jaki będą działać przyciski i zająłem się budową auta: Instrukcja obsługi pilota Auto budowałem w podobny sposób jak na filmie do którego linkowałem na początku tego opisu. Dlatego nie będę też opisywał tutaj tego jakie kroki wykonałem, żeby je zbudować. Lepiej zajrzyjmy do kodu. 😄 #include <IRremote.hpp> #include <AFMotor.h> AF_DCMotor motorM1(4); AF_DCMotor motorM2(3); AF_DCMotor motorM3(2); AF_DCMotor motorM4(1); const int RECV_PIN = A0; int speed=200; void setup() { IrReceiver.begin(RECV_PIN); motorM1.setSpeed(speed); motorM2.setSpeed(speed); motorM3.setSpeed(speed); motorM4.setSpeed(speed); } void loop() { if (IrReceiver.decode()) { if(IrReceiver.decodedIRData.decodedRawData == 0xBF40FF00){ // JAZDA W PRZÓD motorM1.run(FORWARD); motorM2.run(FORWARD); motorM3.run(FORWARD); motorM4.run(FORWARD); } if(IrReceiver.decodedIRData.decodedRawData == 0xE619FF00){ // JAZDA W TYŁ motorM1.run(BACKWARD); motorM2.run(BACKWARD); motorM3.run(BACKWARD); motorM4.run(BACKWARD); } if(IrReceiver.decodedIRData.decodedRawData == 0xF807FF00){ // SKRĘT W LEWO motorM1.run(FORWARD); motorM2.run(FORWARD); motorM3.run(BACKWARD); motorM4.run(BACKWARD); } if(IrReceiver.decodedIRData.decodedRawData == 0xF609FF00){ // SKRĘT W PRAWO motorM3.run(FORWARD); motorM4.run(FORWARD); motorM2.run(BACKWARD); motorM1.run(BACKWARD); } if(IrReceiver.decodedIRData.decodedRawData == 0xEA15FF00){ // STOP motorM3.run(RELEASE); motorM4.run(RELEASE); motorM2.run(RELEASE); motorM1.run(RELEASE); } IrReceiver.resume(); } } I tak jak widać po kodzie, sterowanie tym autem jest uciążliwe. W klasycznych autach na pilota, jak klika się przycisk (jazda w przód) to auto jedzie póki nie puścisz przycisku. Tutaj jak klikam przycisk, to auto jedzie do momentu w którym nie nacisnę innego przycisku, lub przycisku stop. Jak wie ktoś jak wykonać taki kod, który pozwoli sterować autem tak jak w klasycznych autach, to był bym wdzięczny jakby podpowiedział pod tym opisem. 🙂 Podczas pisania kodu, napotkałem jeszcze jeden problem. Biblioteka AFMotor gryzła się z IRremote, przez co nie mogłem sterować silnikami M1 i M2, więc w kodzie mogłem używać tylko jednej z tych bibliotek. Rozwiązanie problemu też znajduje się w tym wątku: Na koniec najlepsza część, czyli filmik: Choć kod i schemat połączenia wszystkiego były wykonane przeze mnie to dużo inspirowałem się tym filmem. Dziękuje za przeczytanie całego DIY i z góry przepraszam, jeśli się je dziwnie czytało, ale zupełnie nie wiedziałem jak się do niego zabrać. 😉 Czekam z niecierpliwością na wasze uwagi. Pozdrawiam. 🙂 -
Dzień dobry mam pytanie czy za pomocą bibliotki arduino ble i arduino uno r4 wifi można emulować urządzenie HID (Human Interface Device, jeśli czegoś nie pomyliłem) jeżeli tak, to czy ktoś chciał by mi z tym pomóc?
-
Miałem pewne obiekcje z umieszczeniem wpisu we właściwym dziale. Bo z jednej strony konkurencja w DIY jest spora i niektóre projekty są bardzo zaawansowane - z drugiej jednak nie jest to znowu takie "mini". Tak więc umieszczam tu, najwyżej Administracja zdecyduje inaczej 🙂 Dzisiaj więc coś prostszego - czyli projekt który zajął mi niewiele ponad weekend, co jednak nie znaczy że nie trzeba było trochę pokombinować... ale zacznę od początku. Otóż grupa uczestników zajęć teatralnych w WTZ stwierdziła, że muszą koniecznie i bezwzględnie zagrać "A niech to gęś kopnie" Guśniowskiej. Tekst faktycznie ciekawy, został dostosowany (nie przeze mnie na szczęście) dla potrzeb uczestników o dość specyficznym sposobie pojmowania świata, przyjęte zostały założenia scenografii... no i teraz się zaczęło "ethanak pomóż" 🙂 W jednej z ostatnich scen bardzo ważną rolę odgrywa kuchenka, na której zwierzątka przygotowują sobie obiadek. No i tak: jako że scenografia to tekturowe pudełka, cała obudowa musi wyglądać jak takie pudełko; musi być widoczny płomień, najchętniej regulowany; na kuchence można postawić naczynie (nie wiem, pewnie też tekturowe, ale to na szczęście nie moja działka); ponieważ w ferworze gotowania zwierzątka urywają gałkę, trzeba to przewidzieć w konstrukcji; trzeba róœnież przewidzieć możliwość łatwego "zdmuchnięcia" płomienia przez osobę o ograniczonych możliwościach ruchowych; i najważniejsze - urządzenie musi być tanie a prohekt umożliwiać szybką realizację. Na początek poszły poszukiwania pudełka. Na szczęście okazało się, że mogę dostać pudełko - koszyczek po owocach. Jest na tyle wytrzymałe że powinno przeżyć obchodzenie się z nim na scenie, a postawione dnem do góry ma coś w rodzaju wzmocnionych nóżek (to powinno wyjaśnić dlaczego obudowa urządzenia jest tekturowa). Teraz przyszła kolej na elektronikę. Jak zwykle trzeba było sięgnąć do szuflady i zdecydować, czego można użyć. A więc: Arduino Pro Mini (klon) - używany poprzednio w jakimś projekcie, sprawny całkowicie; LEDy WS2812 luzem (o tym później); Enkoder obrotowy z przyciskiem; Duży przycisk z podświetleniem (niepodłączonym - podświetlenie mogłoby przeszkadzać); różnej maści diody, wyłączniki, śrubki, przewody, jednostronna płytka uniwersalna i (najważniejsze) - moje ulubione złącza; przetwornica step-up MT 3608; buzzer bez generatora a przede wszystkim różnokolorowe filamenty. Postanowiłem, że urządzenie będzie zasilane z dwóch baterii AA. Również ne bardzo chciało mi się lutować pojedyncze ledy, tak więc doszedł zakup dwóch elementów: Pierścień LED RGB koszyk na 2 baterie AA Mając to wszystko mogłem zabrać się do pracy. Ponieważ podłączenie pierścienia do Arduino było oczywiste, w czasie gdy drukowały się elementy mocujące mogłem zająć się programem. Zrobiłem następujące założenia: po włączeniu (lub na żądanie, po wciśnięciu przycisku enkodera w trybie oczekiwania) urządzenie mierzy napięcie baterii i w zależności od niego zapala na trzy sekundy trzy diody - kolory diod oznaczają "nowe", "sprawne", "do wymiany"; po przekręceniu gałki w prawo (co najmniej o dwa skoki enkodera) uruchomiona zostaje symulacja zapalarki (błyska na biało jedna z diod, a buzzer imituje iskrę) a po chwili zapalają się na niebiesko diody pierścienia na średnim poziomie jasności; przekręcanie gałki w prawo to zwiększenie jasności niebieskich diod oraz wprowadzenie "iskierek" (im wyższy poziom tym więcej), w lewo to zmniejszenie jasności do zera i (jeśli przez dwie sekundy nikt nie kręci gałką) "fuknięcie" wygaszanego płomienia i przejście do stanu oczekiwania na włączenie; wyrwanie gałki powoduje zapalenie diod symulujące niekontrolowany płomień; wciśnięcie przycisku "stop" (ten duży) przy działającym płomieniu to również "fuknięcie" i wygaszenie. Kod w załączniku: Geskuchenka.zip Trochę bardziej skomplikowane było opracowanie dającej się wyrwać gałki. W końcu stanęło na tym, że na oś enkodera został wciśnięty wydrukowany z polipropylenu sześciokąt ze stożkowatym zakończeniem ułatwiającym trafienie przy wkładaniu, a płytka z zamocowaną gałką (mocowana na wcisk) ma występ przyciskający ramię krańcówki z rolką. Na zdjęciu co prawda słabo to widać, ale można się zorientować. I jeszcze ciekawostka: sześciokąt tak się dopasował do ośki enkodera, że wciśnięcie go (a przede wszystkim wyciągnięcie) było dość trudne ze względu na ciśnienie powietrza... pomogło przewiercenie go według osi 🙂 Po zmontowaniu całości okazało się (zgodnie z przewidywaniami) że patrząc z boku nie widać płomienia. Stąd ta dziwna konstrukcja nad ledami (powinna być wydrukowana z naturalnego TPU, ale akurat mi się skończył, użyłem PLA). Tak wygląda wnętrze kuchenki (przed wklejeniem szufladki na luźne kabelki od gałki i zamocowaniem taśm): A oto kuchenka w całej okazałości: I jeszcze którki filmik z działania: No i... trzeba będzie zaprosić do teatru 🙂
-
Firma Arduino głównie jest znana ze swoich płytek deweloperskich o tej samej nazwie. W sprzedaży jest wiele rodzajów Arduino, ale czy wiedziałeś, że Arduino ma w swojej ofercie sterowniki PLC? Arduino Opta jest to sterownik micro PLC wyprodukowany we współpracy z firmą Finder, która specjalizuje się w projektowaniu i produkcji komponentów elektromechanicznych, takich jak przekaźniki. Chociaż projekt miał swoją premierę już dość dawno, to do tej pory nie był pokazywany szerzej na Forbocie. Mam nadzieję, że ten artykuł opisujący moje pierwsze uruchomienie tego sterownika będzie pomocny dla osób, które chcą rozpocząć przygodę z Arduino Opta. W tym artykule przedstawię Ci: Czym właściwie jest Arduino Opta? Twoje pierwsze kroki z tym sterownikiem. Jakie funkcje i możliwości oferuje? Projekt: implementacja sterowania temperaturą w terrarium. Arduino Opta PLC. Źródło zdjęcia. Czym właściwie jest Arduino Opta? Sterownik charakteryzuje się swoją małą skalą. Mikro PLC oznacza, że jest to urządzenie wyprodukowane w standardzie zwykłego sterownika, ale w mniejszej skali - np. mniej wejść i/lub wyjść, mniej funkcjonalności. Takie rozwiązania sprawdzą się w mniej skomplikowanych aplikacji. A jakie parametry cechują sterownik? Generalna specyfikacja PLC. Źródło zdjęcia. Sterownik jest certyfikowany, co oznacza, że można go stosować w przemyśle - ograniczeniem są parametry techniczne, takie jak pamięć, klasa ochrony IP, itp. Sterownik na pewno nie ma problemu z szybkością przez swój dwurdzeniowy procesor STM32. Parametry wejść analogowych. Źródło zdjęcia. Parametry wejść cyfrowych i wyjść przekaźnikowych. Źródło zdjęcia. Maksymalny prąd wyjściowy na pojedyncze wyjście sterownika wynosi 10 A. W sterowniku zastosowano wyjścia przekaźnikowe, które są o wiele wolniejsze od tranzystorowych. Przez to czas przełączania stanu wyjść jest rzędu milisekund, ale w zamian możliwe jest przełączanie stosunkowo wysokich prądów, przy jednoczesnej izolacji sygnałów. Po więcej informacji nt. danych technicznych odsyłam do dokumentacji sterownika. Pierwsze kroki z Arduino Opta: micro PLC Producent oferuje bezpłatny kurs, który wprowadzi Cię w podstawy sterowników logicznych, a także pokaże jak możesz stworzyć swoje pierwsze programy. Są to świetne materiały dla początkujących. Dowiecie się czym są sterowniki PLC, jakie są języki programowania lub jak odczytywać wartości analogowe z czujnika temperatury. Dodatkowo kurs wprowadzi Cię w techniki łączenia ze sobą kilku sterowników za pomocą standardu Modbus TCP/IP. Dla zainteresowanych polecam mój bliźniaczy artykuł, w którym omówiłem dokładniej czym są sterowniki PLC. Pomoże Ci przy pierwszych uruchomieniach programów na Arduino Opta. A teraz dość gadania i przejdźmy do praktyki! W poniższym artykule testuję Arduino PLC Starter Kit, który możecie zakupić na Botlandzie. Na zestaw składają się: sterownik Arduino Opta WiFi. moduł DIN Simul8 (przełączniki). moduł DIN Celcius (płytka grzewcza wraz z czujnikiem temperatury). Co oferuje Arduino Opta? Sterownik z dedykowanym środowiskiem programistycznym Arduino PLC IDE to naprawdę potężne narzędzie. Nie sposób w jednym artykule zmieścić wszystkich dostępnych możliwości, dlatego poniżej znajdziesz skrót tych najważniejszych, a potem przejdziemy do realnego wykorzystania Arduino Opta. Do testów oscyloskopu i trybów debugowania wykorzystałem środowisko Arduino PLC IDE. WiFi i Bluetooth zostały przetestowane w Arduino IDE. Wszystkie adresy ukryłem - lepiej dmuchać na zimne 🙂. a) Proste programowanie i diody Sterownik zaprogramujemy za pomocą USB-C w bardzo szybki i przyjemny sposób. Do dyspozycji na sterowniku mamy kilka diod, których zachowanie możemy zaprogramować w taki sposób, jaki chcemy. b) Cyfrowy oscyloskop W Arduino PLC IDE możemy śledzić konkretne wartości włączając oscyloskop i dodając do niego interesującą nas zmienną. Wygenerowany wykres możemy analizować i pobrać. Dodanie do oscyloskopu zmiennej sens_temp_cels, która symuluje temperaturę. Widok oscyloskopu. c) WiFi Wykorzystuję Arduino Opta WiFi, więc głupio byłoby nie przetestować jego tytułowej funkcjonalności. Na początku połączyłem się z moim domowym WiFi za pomocą przykładu Scan Network Advanced. Wykrycie dostępnych sieci WiFi i wypisanie ich na Serial Monitor. Udane połączenie z moją siecią WiFi. Do połączenia wykorzystałem ten przykład. Czas na rozmowę! Wykorzystuję przykład WiFiAdvancedChatServer, dzięki któremu mogę stworzyć chat server i wysyłać wiadomości do sterownika. Za pomocą laptopa połączę się bezprzewodowo z serwerem i wyślę wiadomość. Sterownik będzie połączony z moim komputerem stacjonarnym za pomocą przewodu, na którym wyświetlę odebraną wiadomość. Przykład musiałem lekko zmodyfikować, aby wyświetlał znaki, a nie pełne wiadomości. Wtedy lepiej działało 😉. Połączenie do WiFi i utworzenie chat server. Strona Arduino Opta. Połączenie do serwera za pomocą komendy telnet <IP> i wpisanie wiadomości. Strona laptopa. Odebrana wiadomość i rozłączenie klienta. Strona Arduino OPTA. d) Ethernet i Modbus Niestety nie byłem w stanie przetestować tych funkcjonalności, dlatego odsyłam do materiałów od Finder 🙂. e) Bluetooth Low Energy Oprócz WiFi jest także możliwość połączenia się ze sterownikiem za pomocą Bluetooth! Skan pobliskich urządzeń z włączonym Bluetooth. Opta wykrył mój telefon. Wykorzystałem przykład Arduino BLE Scan. f) Live debug mode Środowisko Arduino PLC IDE oferuje podglądanie stanu zmiennych na żywo. Było to bardzo przydatne, gdy tworzyłem algorytm do sterowania terrarium, który przedstawię w dalszej części tego artykułu. Podgląd zmiennych na żywo. Aktywowane zmienne są podświetlone. Wyświetlany jest także odliczony czas timera obok jego wyjścia ET. g) Debugowanie Wykonywany kod można debugować, zaznaczając odpowiednie punkty stopu. Wynik debugowania. W prawym dolnym rogu możemy zauważyć status sterownika HALTED, co oznacza, że przez debugowanie został zatrzymany. Twój pierwszy projekt wykorzystując Opta! W imię zasady Learning-by-doing i w celu przedstawienia możliwości sterownika wymyślmy problem, na podstawie którego krok po kroku przeprowadzę Cię przez podstawy programowania tej jednostki. Zaprojektujmy program sterujący ogrzewaniem terrarium. Nie jestem ekspertem zoologii. Użycie algorytmu na żywych jednostkach na własną odpowiedzialność! System ma działać zgodnie z następującymi zasadami: Standardowe ogrzewanie: Terrarium jest ogrzewane co minutę, aby utrzymać temperaturę 27°C, gdy drzwi są zamknięte. Zamknięcie zrealizujemy za pomocą symulacji krańcówki - wykorzystamy przełącznik. Zakładamy, że jeżeli drzwi są otwarte, to zmienna drzwi = 1. Jeżeli są zamknięte, to drzwi = 0. Reakcja na otwarcie drzwiczek: W stanie otworzonego terrarium niemożliwe jest załączenie grzałki. Jeśli drzwiczki zostaną otwarte i zamknięte, system natychmiast podnosi temperaturę do 30°C. Tryb manualny: Użytkownik może włączyć ogrzewanie ręcznie za pomocą przełącznika. Grzałka działa w tym trybie, dopóki przełącznik nie zostanie zwolniony. Informacja dla programisty: Po podłączeniu sterownika do komputera i włączeniu terminala powinny co 5 sekund pojawiać się informacje o: Temperaturze. Stanie drzwi (otwarte/zamknięte). Informacje mogą pojawić się także po wciśnięciu przycisku na PLC (USER). Zaprojektowany algorytm powinien uwzględniać bezpieczeństwo i zapewniać płynne przełączanie między trybami pracy. Włączenie grzałki powinno być zasygnalizowane włączeniem LED 1 na PLC. Połączenie układu Zanim zabierzemy się do programowania musimy wykonać odpowiednie połączenia między sterownikiem a modułami. Starter Kit oferuje przewody, za pomocą których możemy wszystko połączyć. Poniżej znajduje się schemat, w jaki sposób należy połączyć układ: Schemat połączeniowy dla naszego ćwiczenia. Powyższy układ połączono następująco: +24 V połączono razem między modułami. Osobne połączenia wykonano dla GND. Wyjście przełączników w DIN SIMUL8: nr 1 → I1. nr 8 → I2. Do wyjścia przekaźnikowego nr 1 podłączono na wejście +24 V. Wyjście z niego podłączono do INPUT HEAT 1. Gdy wyjście będzie aktywne, to rozpocznie się grzanie płytki. OUTPUT VOLTAGE w Din Celcius połączono do I7. Tym wejściem będziemy odczytywali temperaturę. Kolory przewodów: Czerwony - +24 V. Czarny - GND. Niebieski - sygnały logiczne/informacyjne. Znaczenie wejść i wyjść, i zmienne odpowiadające za nie: I1 - grzanie manualne (grzanie_manual). I2 - otworzenie drzwiczek (drzwi). I7 - temperatura terrarium (temperatura_terrarium). Przycisk USER na PLC - wysłanie informacji o stanie układu (info). Wyjście nr 1 - załączenie grzania terrarium (grzalka). LED STATUS 1 - informacja o załączeniu grzania (led_grzanie). Jeżeli uruchamiasz sterownik po raz pierwszy, to skorzystaj z lekcji Getting Started na stronie Arduino. Lekcja nauczy Cię jak skonfigurować sterownik i upewnić się, że wszystko działa. Oprogramowanie 1. Deklaracja zmiennych Zacznijmy od zadeklarowania wejść i wyjść. Robi się to w tabeli, co gwarantuje przejrzystość i czytelność. Konfiguracja wejść programowalnych. I7 ustawiamy jako wartość analogową o rozdzielczości 12 bitów. Konfiguracja wyjść programowalnych. Konfiguracja LED. Konfiguracja przycisku USER umieszczonego na PLC. Arduino OPTA umożliwia dodanie kilku programów, które będą równolegle wykonywane. Przyda nam się to, bo nasz projekt będzie się składał z: Pętli głównej odpowiedzialnej za: Pracę manualną. Pracę automatyczną. Przełączanie między pracą automatyczną a manualną. Wykrycie otworzenia terrarium. Załączanie grzałki. Skryptu, który będzie przeliczał wartość wyjściową czujnika temperatury na temperaturę wyrażoną w stopniach Celsjusza. Skryptu wyświetlającego informację o stanie układu. 2. Tryb manualny Sprawa jest prosta - załączając I1 włączamy grzałkę. Dodajmy nowy program: Dodawanie nowego programu. Po wybraniu New program wyskoczy okno: Wybieramy język LD, czyli najpopularniejszy język programowania PLC. Program nazwiemy main. Istnieją 4 rodzaje programów: Opisy typów programów. Źródło zdjęcia. Wybierzemy Fast, bo będzie to nasz główny program, w którym będą odbywały się najważniejsze rzeczy. Wyskoczy nam okno programu: Poświęćmy chwilę na wyjaśnieniu jak działa język LD. Język drabinkowy korzysta ze styków i cewek. Styki symbolizują wejścia, a cewki wyjścia. Rodzaje styków i cewek: -| |- - styk normalnie otwarty. Aktywuje się, gdy przypisana zmienna wynosi 1. -| / |- - styk normalnie zamknięty. Aktywuje się, gdy przypisana zmienna wynosi 0. -| S |- - styk set. Po aktywacji zmienna pozostaje aktywna do momentu resetu. -| R |- - resetuje zasetowany styk. -| P |- - styk wykrywający zbocze narastające zmiennej. -| N |- - styk wykrywający zbocze opadające zmiennej. -( )- - cewka normalnie otwarta. Aktywacja poprzez 1 na wejściu. -( / )- cewka normalnie zamknięta. Aktywacja poprzez 0 na wejściu. Po dwukrotnym naciśnięciu na styk pojawi się okno, w którym możemy skonfigurować go, np. przypisać do niego zmienną: Konfiguracja styku. Nie zapominajmy o diodzie, która ma nas informować o grzaniu. Cewkę dodamy poprzez wciśnięcie ikony coil: Ikona Coil. Bądź poprzez wciśnięcie prawego przycisku myszki i wybranie odpowiedniej opcji: Opcja dodania Coil. A oto nasz tryb manualny: Dobrym nawykiem jest stosowanie markerów. Są to zmienne w pamięci, w których przechowuje się wynik operacji logicznej. Wynik załączenia grzania przypiszmy do markera, a następnie za pomocą markera ustawmy odpowiednie cewki. Utwórzmy zmienną lokalną: Dodanie zmiennej lokalnej. Zmienna lokalna. I przenieśmy przypisanie wyjść do następnej linijki za pomocą markera. Dodanie kolejnej linijki kodu. Tryb manualny W taki sposób zbudowaliśmy nasz pierwszy funkcjonalny program! Aby go przetestować, należy przesłać go do sterownika. Opcja wysłania programu do sterownika. Po przesłaniu programu możemy włączyć podgląd (watch) i zobaczyć jak się zachowują nasze zmienne: Watch. Należy uniemożliwić grzanie, gdy drzwiczki są otwarte: Styk NC blokuje przepływ sygnału do cewek. Widzimy, że przy otwartych drzwiach grzałka nie działa. 3. Pobranie informacji o temperaturze Aby pobrać informację o temperaturze wewnątrz terrarium, posłużymy się poradnikiem. W skrócie: Poniżej przedstawiam program w języku ST do przeliczania wartości z czujnika na temperaturę: Dodajemy nowy program i nowe zmienne globalne. 4. Zamknięcie drzwiczek Teraz zajmijmy się grzaniem do 30 stopni, gdy drzwiczki zostaną zamknięte. Dodajmy następujące instrukcje w main: Jeżeli zamkną się drzwi (zbocze opadające na zmiennej drzwi), to ustawi się flaga drzwi_N_flaga (potrzebna do dalszej części kodu). Jeżeli osiągniemy 30 stopni, to resetujemy flagę. Dodatkowo tworzymy nowy tryb grzania (tryb_drzwi_N). Napiszmy skrypt w języku ST, który będzie obsługiwał zmienną tryb_drzwi_N: Jeżeli flaga zamknięcia drzwi jest aktywna, to włączamy tryb grzania. Jeżeli osiągnięto temperaturę 30 stopni, to włączamy odpowiednią flagę, a w main wyłączamy drzwi_N_flaga. 5. Standardowe ogrzewanie Stwórzmy tryb standardowego grzania. W tym celu stwórzmy zmienną odliczanie, dzięki której będziemy sygnalizować, czy mamy odliczać minutę do grzania. Dodatkowo utworzymy program w trybie Init, który wykona się tylko raz przy włączeniu sterownika. Wystartujemy w nim odliczanie. Zawartość programu Init. Zmienna jest typu bool. W zastosowaniach przemysłowych praca maszyny musi się odbyć po jawnym sygnale operatora, więc nasze rozwiązanie nie jest zgodne ze sztuką. Jednak na cele edukacyjne i hobbystyczne to nam ułatwia sprawę. Do mierzenia czasu służą timery. Aby go dodać klikamy opcję New Block: Dodanie bloku. W Object browser wyszukujemy timer TON. TON działa w następujący sposób: Opis timera TON. Źródło zdjęcia: Arduino PLC IDE. Obsługa trybu standardowego. Powyższy kod działaja w następujący sposób: Jeżeli odliczanie jest załączone i nie osiągnięto temperatury 27 stopni, to odliczamy 60 sekund. Po odliczeniu czasu wyłączamy odliczanie (reset) i załączamy tryb standardowy. Jeżeli osiągniemy 27 stopni, to załączamy znowu odliczanie i ściągamy flagę trybu standardowego. Dodajemy program, który obsłuży flagi i wykryje przekroczenie 27 stopni. Zauważ, że jest on bardzo podobny do trybu drzwi. Dodajemy włączenie grzałki pod wpływem trybu standardowego. Dodatkowo widoczne jest zabezpieczenie, w którym przy otworzonych drzwiach nie ma możliwości grzania - styk NC drzwi. Jeżeli dotrwałeś do tego momentu, to chciałbym Ci serdecznie pogratulować. Właśnie stworzyliśmy system ogrzewania do terrarium! Działanie programu. Przedstawiłem tryb manualny i reakcję na zamknięcie drzwi. Czerwona dioda na DIN CELSIUS sygnalizuje grzanie. 6. Informacja dla programisty Stwórzmy ostatnią część projektu, jakim jest wyświetlanie co pewien czas, bądź na żądanie, pewnych parametrów związanych z algorytmem. Wykorzystamy bardzo ciekawą funkcjonalność narzędzia Arduino PLC IDE - połączenie Sketcha z Arduino IDE i algorytmu sterowania z Arduino PLC IDE. Shared variables to zmienne, które będą wymieniane między algorytmem sterowania, a Sketchem. W Shared Variables w Outputs wpisujemy zmienne, które chcielibyśmy śledzić: Tworzymy nowy skrypt o nazwie do_zmiennych_OUT, w którym będziemy przypisywali wartości do zmiennych w Sketchu: Następnie tworzymy skrypt, który co wciśnięcie przycisku lub co 5 sekund wyświetli informacje o statusie algorytmu: Program do przesyłu informacji. Funkcja, która umożliwia wysłanie informacji do odbiornika. Przetestujmy wyświetlanie informacji w Serial monitor w Arduino IDE: Nasz program jest skończony! Podsumowanie To była bardzo długa i intensywna bitwa… Ale udało się! Poznaliśmy razem dużo możliwości sterownika. WiFi, Bluetooth, równoległość wykonywania operacji, sterowanie temperaturą, wyświetlanie informacji to tylko niektóre z możliwości tego PLC. Trzeba przyznać, że to potężna jednostka, która ma ogrom potencjalnych zastosowań. To naprawdę wszechstronne urządzenie, które może ułatwić wiele zadań i sprawdzić się w różnych projektach. Jest łatwe w obsłudze i daje dużo możliwości, co czyni je świetnym wyborem do nowoczesnych rozwiązań. ________ Informacja: zestaw z Arduino Opta na potrzeby niniejszego artykułu dostarczyła firma Botland - oficjalny dystrybutor Arduino.
- 3 odpowiedzi
-
- 4
-
-
- Elektronika
- Programownie
-
(i 1 więcej)
Tagi:
-
Trochę cheat gadżet przede wszystkim dla licealistów którzy są leniwi tak jak ja. Dużo czasu w trakcie liczenia zadań zajmują same operacje matematyczne przy których także łatwo się pomylić. Najprostszym rozwiązaniem jest kalkulator naukowy lecz są one zabronione w szkole oraz na maturze. Stworzyłem więc własny kalkulator który tylko z pozoru wygląda jak prosty lecz ma ukryte funkcje. Oczywiście nie wygląda on idealnie ale to kwestia wydrukowania obudowy oraz zmiany klawiatury. Nawet użytkownik nie zapoznany z kalkulatorem nie odkryje specjalnych funkcji ponieważ wymagają one wciśnięcia specjalnej konfiguracji klawiszy. Kalkulator posiada takie funkcje jak Dodawanie Mnożenie Dzielenie Odejmowanie Obliczanie dowolnych potęg Obliczanie pierwiastka dowolnegos stopnia Obliczanie pierwiastków funkcji kwadratowej Obliczanie wszystkich funkcji trygomoterycznych Obliczanie logarytmu o dowolnej podstawie Całość zaprogramowana jest na arduino nano.
-
Witam, taki luźny temat mi przyszedł do głowy z racji tego że mam kilka starych komputerów stacjonarnych zacząłem sie zastanawiać czy można by je wykorzystać do podobnych celów jak np raspberry pi. Oczywiście biorąc pod uwagę gabaryty "skrzynki" rozważam np jakąś instalacje stacjonarną typu grow box itp. Wiadomo pojawia się kwestia wejść i wyjść. Czy na plycie głównej jest coś co można wykorzystać w tym celu? Ewentualnie złącza usb dają chyba duże możliwości w tym zakresie, tylko jak to ugryźć programowo. Wiecie coś o takich projektach/wykorzystaniu komputera stacjonarnego? Doradźcie coś jak temat ugryźć bo nawet google za dużo nie podpowiada w tym temacie. Zapraszam wszystkich do dyskusji. Pozdrawiam
-
Taki mały projekcik - coś dla bezwzrokowców. Czyli nie tylko dla niewidomych i słabowidzących, ale również dla tych, którzy nie mają ochoty albo możliwości gapienia się na wyświetlacz... Czyli coś w rodzaju wypasionego termometru albo (jak kto woli) mini-stacji pogodowej. Ale zacznę może od genezy projektu. Szukając pewnego sprzętu do domu natrafiłem na osobę poszukującą mówiącego termometru pokojowego. Ktoś tam rzucił jakimiś linkami... z ciekawości zajrzałem. No i oczywiście pierwszy do Altix. Termometr co prawda niedrogi, ale za yi jak zwykle w tej firmie "kłopoty ze stanem magazynowym". Kolejne ceny wyglądały raczej mało zachęcająco... Jako że taki "gadający termometr z prognozą pogody" stanowi integralną część mojego "wygodnego domu" zacząłem zastanawiać się, czy coś podobnego (tylko bez tej "wygodnodomowej" otoczki) mogłoby się komuś przydać. No i po dłuższym zastanowieniu wyszło mi coś takiego: W moim przypadku sprawdza się to idealnie, tak że pewnie znaleźli by się zainteresowani... Przede wszystkim musi być to urządzenie DIY. Z uwagi na możliwości zastosowania różnych podzespołów raczej nie byłoby możliwe zaprojektowanie PCB czy obudowy - poza tym urządzenie powinno być możliwe do zbudowania przez początkującego adepta sztuki elektroniki (z możliwością wsadzenia tego na płytkę stykową włącznie). Dodatkowo wszystkie elementy muszą być dostępne w handlu, a przede wszystkim tanie! Wybrałem ESP32 jako "serce" urządzenia. Powodów było kilka, ale najważniejsze było to, że mam dobrze przetestowany syntezator mowy właśnie na ESP. Również ceny modułów są atrakcyjne. Jednocześnie nie mogę wymagać umiejątności użerania się z wersjami bibliotek (które lubią gryźć się albo z definicją płytki, albo ze sobą). Co prawda źródła programu dla Arduino powinny być dostępne, ale warto zadbać o to, aby ktoś kto nie ma zielonego pojęcia o programowaniu mógł wrzucić soft na płytkę i skonfigurować całość. Tak że wymagana by była równioeż wersja binarna, możliwa do prostego załadowania z pomocą esptool (Linux, Mac) czy FlashTool (Windows). Z wstępnych założeń wyszło mi coś takiego: Trzy typy komunikatów: Najkrótszy to tylko godzina i temperatura. Dłuższy to godzina, data, temperatura oraz dodatkowe parametry zależne od możliwości zastosowanych podzespołów (np. ciśnienie i wilgotność) Najdłuższy to ten sam co dłuższy, ale wzbogacony o dane ściągnięte z Internetu Postanowiłem wykorzystać serwis open-meteo.com. Tak więc zgodnie z możliwościami serwisu dane muszą zawierać bieżące warunki pogodowe oraz skróconą prognozę pogody. Uznałem, że rozwiązanie które mam w domu powinno się sprawdzić - czyli prognoza na dziś i jutro, lub po którejś godzinie na jutro i pojutrze. Konieczna jest też możliwość ustawienia wszystkiego co się da za pomocą terminala serial - po to, aby nie było trzeba robić jakichś zależności w czasie kompilacji. Jeśli chodzi o elektronikę, uznałem, że podstawową płytką będzie ESP32 DevKit. Ma wystarczającą ilość pamięci (zarówno RAM jak i Flash), wszystkie potrzebne interfejsy a co ważniejsze - jest tania i dostępna. Konieczny jest również jakiś wzmacniacz I2S - czyli znów najtańsza opcja: MAX98357. Dla niewtajemniczonych: monofoniczny dekoder I2S zawierający wzmacniacz mocy do 3W. Cena jest również zachęcająca, z dostępnością nie ma problemu. Do tego jeden przycisk (dwa to o jeden za dużo), jakiś zasilaczyk 5V o mocy wystarczającej na zasilenie wzmacniacza - i to wszystko. Jako czujniki postanowiłem dopuścić następujące: W pomieszczeniu - BMP180, BMP280, DS18B20. Na zewnątrz - DHT22, DHT11, DS18B20 z możliwością bezprzewodowego połączenia. Oczywiście można nie podłączać któregoś z urządzeń - w najprostszym (najtańszym) przypadku można zastosować tylko DS18B20 do pomiaru temperatury w pomieszczeniu, czas oraz warunki bieżące dla lokalizacji pobierać z Internetu. DHT11 oczywiście nie powinien być stosowany, ale po prostu taki mam 🙂 Jednocześnie w razie potrzeby byłbym w stanie dorobić BME280 jako czujnik wewnętrzny (jak to słusznie @mkwiatkowski zauważył, odczyt wilgotności może być potrzebny przy pracującej klimatyzacji). Dodatkowym wyposażeniem może być zegarek DS3231 (jeśli istnieje możliwość utraty połączenia z Internetem). Można również dodać detektor IR aby sparować urządzenie z dowolnym pilotem. Prace zacząłem już jakiś czas temu, ale nie chciałem nic pisać dopóki nie uzyskałem pewności, że zadanie jest wykonalne. W tej chwili działają wszystkie moduły, urządzenie sobie gada, coś tam mierzy, nawet serwer www wystawia do bieżących ustawień... Tylko pytanie: czy ktoś to wykorzysta? Czy przypadkiem nir planuję zrobienia kawału dobrej, nikomu niepotrzebnej roboty? Bo co prawda pisząc program musiałem rozwiązać kilka dość interesujących (z punktu widzenia Arduinowo-ESPowego programisty) problemów, ale więcej nie przewiduję, a czego trzeba to już się nauczyłem 🙂 I dla zachęty: plik mp3 z prognozą pogody (nagrany na pececie, ale to taki sam syntezator jak na ESP32): meteo.zip Prosiłbym o wypowiedzi czy dalsza praca ma sens. czy mam sobie darować i zająć się czymś bardziej pożytecznym. A może jakieś pomysły?
-
Witam wszystkich czytelników. Zainspirowałem się w wakacje postem użytkownika @Krzysiek97, który przedstawił swoją kierownice do gier na bazie arduino leonardo: Kierownica PC - wersja 2. Z racji tego że lubię grać w gry wyścigowe i symulatory postanowiłem zbudować własną kierownicę z dodatkowymi akcesoriami. Nie chciałem przerabiać starej gotowej kierownicy do komputera, więc wpadłem na pomysł aby zbudować całe stanowisko. Materiał o tym stanowisku/ projekcie znajduję się na moim kanale na YT do którego was zapraszam Kierownica do komputera na bazie arduino Chciałem aby w tym stanowisko znajdowała się kierownica o kącie obrotu 900 stopni, sprzęgło, gaz, hamulec, 8 biegów + wsteczny (8 biegów ponieważ tyle mają niektóre samochody np. w Forza Horizon 4), hamulec ręczny, 2 joystiki (do sterowania maszynami w Farming Simualtor), button matrix 4x5 = 20 przycisków (przypisanych do rożnych akcji w grach) i zegary do wyświetlania prędkości i obrotów. Tak więc gdzieś w połowie lipca zacząłem szukać potrzebne części. Pierwszym problemem z którym się spotkałem była niewystarczająca ilość wejść w arduino leonardo. Ktoś na tym forum podsunął mi płytki Nucleo 64 na STM32, obawiałem się jednak czy programy które wcześniej znalazłem w internecie będą z nimi współpracować. Bawiłem się naco wcześniej arduino lecz nucleo nie stąd moja niepewność ponieważ zaczynałem dopiero wtedy zabawę z tym wszystkim. Zdecydowałem się jednak zostać przy arduino i zakupiłem 3 płytki, po jednej dla każdego programu który obsługuję inną część stanowiska, ponieważ i tak nie ma prgoramu który ogarnie wszystkie moje rzeczy na raz. A więc tak: Arduino Leonardo - program EMC Utility Lite (z początku korzystałem z RFR Whell Configuration elcz sprawiał on problemy) - obsługuję kierownicę, pedały, hamulec ręczny - Link do programu EMC, Jak zainstalować program Pierwsze Arduino Pro Micro - program MMJoy2 - obsługuję button matrix i 2 joysticki - Link do programu MMJoy2, Jak zainstalować program Drugie Arduino Pro Micro - program SimHub - obsługuję zegary/wyświetlacze - Link do programu SimHub Zamówiłem też 20 guzików (push button) 10 styczników krańcowych 2 Joysticki 2 wyświetlacze Tm1638, 1 wyświetlacz Max7219 (zamówiłem też sterownik silnika BTS7960 lecz na razie nie zakładałem FFB). Rzeczy które miałem w domu to: 2 potencjometry 10k Ohm, stycznik krańcowy ls-11s, kable kawałki plastiku, materiału i gumy. Za postawę stanowiska posłużyła mi deska rozdzielcza i fotel od mazdy mx-5 i kierownica od mazdy 626. Całość jest przyspawana do rurki i przykręcona do euro palety. Z racji tego że deska pochodzi z anglika to nie mogłem zamontować zwykłych zegarów w miejscu poduszki pasażera. Zamieszczam tutaj schematy podłączeń danych elementów: Drugim problemem który chce tu opisać, było przeniesienie/ zczytanie obrotu z kierownicy do arduino. Na początku chciałem wykorzystać enkoder optyczny z swojej starej drukarki, lecz gubił się on często i nie działał dokładnie, więc kupiłem enkoder inkrementalny 600ppr. Nie będę się już tak rozpisywał co jak i gdzie jest skręcone dlatego wszystko pokazane i omówione jest w filmiku do którego link jest na początku posta. Więc to jest dodatkowy materiał dla ciekawych. Podsumowując: koszt budowy stanowiska zamknął się dla mnie w kwocie 300zl, czas realizacji od pierwszego pomysłu do zbudowania całości i upewnienia się że wszystko jest sprawne to 6 miesięcy. Tak oto prezentuję się kierownica i jej działanie w grze Forza Horizon 4 Na koniec pytanie głownie do administratora, czy i kiedy będzie znowu dostępny konkurs Opisz elektroniczne DIY i odbierz 50 zł rabatu do Botland?
- 10 odpowiedzi
-
- 6
-
-
Witam, Szukam czegos do nauki elektroniki/programowania dla dziewczyni zaraz osmio letniej. Natknalem sie na scratch ktory pewnie wdrozymy ale corka chciala tez pobudowac roboty 🙂 tak natknalem sie na forbota. Szczerze fajnie by bylo jakbyscie pisali od jakiego wieku, co polecacie.. 😉 z wstepnego przejrzenia kurs podstaw elektroniki jest za bardzo teoretyczny na ten wiek. Arduino i raspherry pi tez chyba za wczesnie. Zaatanawiam sie nad micro.bit ale tez nie wiem czy to nie za wczesnie dla 7-8 latki... Myslalem o nauce lutowania i budowania tym sposobem czegos i przy okazji uczenia sie troche. Co myslicie o takim pomysle? Czy sa jakies zestawy dla dzieci tego typu? na youtubie mignal mi kanal gdzie ktos z corka 7 letnia lutuje.. Osobiscie nie znam sie na tym wiec bede uczyl sie z corka (programowac umiem, kiedys cos tam polutowalem ale daleko do stwierdzenia ze cos umiem czy moge przekazac jakas wiedze) Z gory dziekuje za sugestie i pozdrawiam
- 7 odpowiedzi
-
- Elektronika
- Arduino
- (i 2 więcej)
-
Witam, podczas wykonywania zadań w części #6 2 kursu arduino na tej stronie dotyczącego wyświetlaczy 7 segmentowych natknąłem się na problem. Mianowicie, niektóre znaki (0, 2, 3, C) nie są wyświetlane tak jak należy, czy to podczas własnoręcznego ustawiania segmentów tak jak jest w kursie, czy podczas korzystania z biblioteki SevSeg. Wszystkie podłączenia oraz kody są zrobione tak jak w kursie oraz dokładnie sprawdzone. w załącznikach podane kolejno zdjęcia wyświetlania liczb 23,04,78. Tak jak widać, niektóre liczby są wyświetlane poprawnie, a niektóre nie. Będę wdzięczny za udzielenie pomocy lub rad związanych z tym problemem
- 1 odpowiedź
-
- Arduino
- wyświetlacz
-
(i 1 więcej)
Tagi:
-
Nie wiem z jakiego powodu, Monitor Portu Szeregowego zaczął wyświetlać w każdej linii godzinę. Wygląda to tak jak na obrazku poniżej. Jak można to wyłączyć i jak można to włączyć?
- 4 odpowiedzi
-
#define L_PWM A5 #define L_DIR 4 #define R_PWM 6 #define R_DIR 9 #define led 13 #define przycisk 2 #define PWM_MAX 165 #define buzzer 10 #define lSensor A1 #define rSensor A0 bool jedzie = false; #define granica 940 void setup() { // put your setup code here, to run once: Serial.begin(9600); pinMode(L_DIR, OUTPUT); pinMode(L_PWM, OUTPUT); pinMode(R_DIR, OUTPUT); pinMode(R_PWM, OUTPUT); pinMode(przycisk, INPUT_PULLUP); pinMode(buzzer, OUTPUT); pinMode(lSensor, INPUT_PULLUP); pinMode(rSensor, INPUT_PULLUP); } void loop() { // put your main code here, to run repeatedly: if (digitalRead(przycisk) == LOW){ jedzie = true; } if (jedzie == true){ leftMotor(50); rightMotor(50); if (digitalRead(lSensor) == LOW || digitalRead(rSensor) == LOW){ rightMotor(-50); leftMotor(-50); digitalWrite(buzzer, 1); delay(1000); rightMotor(-50); leftMotor(50); digitalWrite(buzzer, 0); delay(250); } } } void leftMotor(int V){ if(V > 0){ V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(L_DIR, 1); analogWrite(L_PWM, V); } else{ V = abs(V); V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(L_DIR, 0); analogWrite(L_PWM, V); } } void rightMotor(int V){ if(V > 0){ V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(R_DIR, 0); analogWrite(R_PWM, V); } else{ V = abs(V); V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(R_DIR, 1); analogWrite(R_PWM, V); } } void stopMotors(){ analogWrite(L_PWM, 0); analogWrite(R_PWM, 0); } boolean leftSensor(){ if (analogRead(lSensor) > granica){ return 1; } else { return 0; } } boolean rightSensor(){ if(analogRead(rSensor) > granica){ return 1; } else { return 0; } } (Lewy silnik mam odwrócony, więc zamieniłem 1 z 0 i 0 z 1.)
-
Często pojawia się konieczność użycia pakietu płytko w konkretnej wersji. Szczególnie dla ESP32, gdzie różne wersje pakietów mogą działać inaczej, a wersje maior w ogóle nie są ze sobą kompatybilne - jest to wręcz niezbędne. Artuino IDE oczywiście pozwala zainstalować dowolną wersję pakietu, ale tylko jedną konkretną, a proces instalacji wcale nie jest taki szybki. Dodatkowo jeśli dokonaliśmy jakichś zmian w katalogu pakietu (w moim przypadku to dodanie nowych układów partycji i modyfikacja boards.txt) zaczyna być to niespecjalnie wygodne... Postanowiłem więc zrobić prosty przełącznik wersji. Działa dla ESP32, ale można go oczywiście zmodyfikować tak, aby działał dla dowolnych płytek. Rozwiązanie jest niestety linux-only, ale po drobnych zmianach (ścieżki, polecenia powinny działać tak samo) powinno ruszyć na Macu. A na pewno nowoczesny Windows pozwoli na zrobienie podobnego przełącznika... pozwoli, prawda? Kod jest stosunkowo prosty: #!/bin/bash #położenie docelowego pakietu ESP32 dstitem=${HOME}/.arduino15/packages/esp32 #tu są różne wersje srcdir=${HOME}/.arduinoESP32 if [ -n "$1" ]; then if [ "$1" = "off" ] ; then #przygotowanie do instalacji rm ${dstitem} echo "Gotowy do instalacji nowej wersji" exit 0 fi if [ "$1" = "show" ] ; then if a=$(readlink ${dstitem}) ; then basename $a else echo "Brak skonfigurowanej wersji" fi exit 0 fi # parametr to numer wersji src=${srcdir}/$1 if [ ! -d ${src} ] ; then echo "Brak wersji $1" else ln -sfn ${src} ${dstitem} echo "Ustawiona wersja $1" fi else #bez parametrów listuje zawartość katalogu ls ${srcdir} fi Jak tego użyć? Trzeba utworzyć plik o zawartości jak wyżej (ja nadałem mu nazwę espversion) i nadać mu prawa do wykonywania. Skrypt najlepiej utworzyć w katalogu gdzie przechowujemy własne polecenia (np. ~/bin/). Następnie trzeba sobie stworzyć katalog, który będzie zawierał wszystkie wersje pakietów. Ja utworzyłem do tego celu katalog ~/.arduinoESP32. Następnie należy kolejno zainstalować potrzebne wersje, a po instalacji przenieść zawartość pakietu do odpowiedniego miejsca. Przykładowo: po instalacji wersji 3.0.4 należy wykonać coś w stylu: mv ~/.arduino15/packages/esp32 ~/.arduinoESP32/3.0.4 Pamiętać należy, że przed jakąkolwiek próbą instalacji nowej wersji należy usunąć link ~/.arduino15/packages/esp32 - jeśli tego nie zrobimy, wersja zostanie nadpisana! Mamy więc teraz następujące możliwości: Listowanie dostępnych wersji: espversion Pokazanie która wersja jest aktualnie wybrana: espversion show Przygotowanie do instalacji nowej wersji (usunięcie linku): espversion off Zmiana wersji: espversion <numer_wersji> Tak więc teraz można sobie zmieniać wersje w locie, np: espversion 2.0.17 włączy wersję 2.0.17, o ile taką mamy przygotowaną. Pamiętać równie należy, że przy przełączaniu wersji Arduino IDE powinien być wyłączony! Jeśli ktoś korzysta z mojego pyrduino, należy przed kompilacją wydać polecenie: ardu -clean I to tyle. Przyjemnego przełączania życzy ethanak
-
Witam, chciałbym pochwalić się moim pierwszym wrzuconym tu projektem: Stacją pogodową! Użyłem tutaj tych elementów elektronicznych: Arduino UNO (klon) czujnik wilgotności i temperatury DHT11 LCD 2x16 konwerter I2C W nazwie projektu, DHT11 wzięło się właśnie z nazwy czujnika temperatury i wilgotności. Nie wiem czy mogę nazwać to stacją pogodową bo wyświetla temperaturę i wilgotność tylko z jednego miejsca. 🙂 Do wyświetlania użyłem wyświetlacz LCD 2x16 z konwerterem I2C, głównie z tego powodu że jest on łatwy w obsłudze i jest mało podłączania. Użył bym wyświetlacza TFT bo ładniej by to wszystko wyglądało, ale uczę się dopiero programowania i dalej mam problem z wyświetlaniem wartości na TFT. Ta stacja ma dwie funkcje, pomiar temperatury i pomiar wilgotności. Tutaj jest ilustracja podłączania modułów i czujników do Arduino. Nazywam to prototypem sami wiecie czemu. Niestety ale nie mam gdzie wkładać moich projektów, przez co wyglądają jak prototypy. Kod który użyłem nie jest skomplikowany. Na samym początku tworzy się znak stopnia, w void setup() wyświetlamy napisy temperatura i wilgotność, a potem wyświetlamy wartości temperatury i wilgotności gdzie przydaje nam się stworzony na początku kodu znak stopnia. Tutaj jest kod który użyłem do projektu: #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2); byte znak_stopnia[8] = { 0b00111, 0b00101, 0b00111, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000 }; int gate=11; volatile unsigned long duration=0; unsigned char i[5]; unsigned int j[40]; unsigned char value=0; unsigned answer=0; int z=0; int b=1; void setup() { lcd.init(); lcd.backlight(); lcd.print("Temperatura"); lcd.setCursor(0,1); lcd.print("Wilgotnosc"); lcd.createChar(1, znak_stopnia); lcd.setCursor(14,0); lcd.write(1); lcd.print("C"); lcd.setCursor(13,1); lcd.print("%"); } void loop() { delay(1000); while(1) { delay(1000); pinMode(gate,OUTPUT); digitalWrite(gate,LOW); delay(20); digitalWrite(gate,HIGH); pinMode(gate,INPUT_PULLUP); duration=pulseIn(gate, LOW); if(duration <= 84 && duration >= 72) { while(1) { duration=pulseIn(gate, HIGH); if(duration <= 26 && duration >= 20){ value=0;} else if(duration <= 74 && duration >= 65){ value=1;} else if(z==40){ break;} i[z/8]|=value<<(7- (z%8)); j[z]=value; z++; } } answer=i[0]+i[1]+i[2]+i[3]; if(answer==i[4] && answer!=0) { lcd.setCursor(12,0); lcd.print(i[2]); lcd.setCursor(11,1); lcd.print(i[0]); } z=0; i[0]=i[1]=i[2]=i[3]=i[4]=0; } } Nie jest on cały robiony przeze mnie bo ja go tylko zmodyfikowałem oryginalny kod i projekt pochodzi z tego filmu na YouTube. Użyta jest tu użyta biblioteka LiquidCrystal_I2C którą pewnie wszyscy i tak mają. 🙂 I teraz najciekawsza część tego wpisu, czyli film na którym testuje moją stacje! (Polecam obejrzeć w prędkości 2x) Jak można zobaczyć na filmie, temperatura wynosiła 30 stopni. Po przyłożeniu rozgrzanego grotu od lutownicy temperatura wzrosła do 38 stopni, natomiast wilgotność zaczęła spadać. Przez to że cały czujnik się nagrzał to nawet i po oddaleniu grotu od czujnika temperatura jeszcze wzrosła o 2 stopnie. Niestety ale przez to że za bardzo skupiłem się na nagrywaniu to delikatnie stopiłem plastik z czujnika, ale na szczęście nie zakłóca to pomiarów. 🙂 To tyle z mojej strony, bardzo Ci dziękuję jeśli przeczytałeś to całe. Będzie mi bardzo miło gdy napiszesz opinie i uwagi, nie tylko odnośnie projektu i kodu ale też odnośnie tego jak napisałem ten artykuł. Bardzo dziękuję i pozdrawiam! 😄
-
Witam. Dzisiaj chciałem po raz pierwszy wgrać jakiś kod do Attiny85 używając klona Arduino UNO jako programatora. Zainstalowałem AttinyCore w tym wszystkie potrzebne sterowniki. (z tego poradnika i po zainstalowaniu robiłem wszystko co jest w tym filmie) Po kliknięciu przycisku Burn bootloader (w sekcji tools) wystąpił błąd: Failed chip erase: uploading error: exit status 1 Wszystko było robione na Arduino IDE wersji 2.3.2 Zdjęcia tego jak to podłączałem Podłączałem to wszystko według tego schematu (schemat pochodzi z filmu o którym pisałem powyżej): Wybrałem takie same opcje jakie zostały wybrane w tym filmie oraz płytkę: ,,ATTiny 45/85 (Obtiboot)" (chodzi o te opcje otoczone czerwoną linią): Kod który zrobiłem na pewno jest dobry bo po kliknięciu w przycisk ,,Verify" kompilator nie wykrywa żadnych błędów, ale na wszelki wypadek pokażę go tutaj: void setup() { pinMode(1, OUTPUT); } void loop() { digitalWrite(1, HIGH); delay(100); digitalWrite(1, LOW); delay(100); } Na samym końcu pokażę jeszcze kilka zdjęć które mogą się przydać (screeny robione przy podpiętym Arduino): Mam nadzieję że podałem wystarczająco dużo informacji Z góry dziękuję za poświęcony czas! 🙂
-
Sprzedam płytkę - klon Arduino UNO R3 CH340 Mikrokontroler: ATmega328P SMD Nowa, cena 20 zł Gwarancja rozruchowa: 7 dni Wysyłka: paczkomat - 12 zł kurier - 15 zł pobranie - 25 zł Mam 8 szt. Zainteresowanych proszę o kontakt w wiadomości prywatnej.
-
POMOC Arduino i błędne odczyty z odbiornika podczerwieni
Mariusz_Nadolny opublikował temat w Arduino i ESP
Cześć, chciałem zrobić jakiś prosty program używający odbiornika podczerwieni. Mam jednak problem z tym, że źle odbierane są dane. Używam tego klasycznego kodu: #include <IRremote.h> IRrecv irrecv(2); decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); } void loop() { if (irrecv.decode(&results)) { Serial.print(results.value); Serial.println(" "); irrecv.resume(); } } To są dane jakie widzę po wciskaniu jednego przycisku: więc jak widać wartości dla jednego przycisku są różne, a transfer tej liczby na hex w ogóle nie działa. Sprawdzałem czy piny gnd, 5v i 3,3v nadają odpowiedni stan na wyjście pinów i zdaje się, że tak (nie potrafię dobrze posługiwać się arduinowym językiem, więc wysyłam link do poradnika, z którego korzystałem https://learn.andoyaspace.no/ebook/the-cansat-book/common/getting-started/software-start-up-and-test-of-arduino-uno/). Nie mam pojęcia dlaczego to co robię nie działa. Jeżeli ktoś ma jakiś pomysł to z wielką przyjemnością poczytam, bo flustruje mnie to, że nie potrafię nic z tym zrobić :). Dodam jeszcze, że Arduino jest oryginalne, a odbiornik, z którego korzystam to TSOP31236. Robiłem to parę miesięcy temu i wtedy wszystko działało.- 1 odpowiedź
-
- 2
-
-
- pomoc
- Początkujący
- (i 3 więcej)
-
Cześć, Stworzyłem prosty układ z unipolarnym silnikiem krokowym JK42HS40, który steruję za pomocą sterownika DRV8834. Układ zasilam trzema bateriami AA przez regulowaną przetwornicę 3,6V S9V11MA. Niestety, napotkałem problem – układ nie działa poprawnie. Z wyjść sterownika do silnika nie płynie żaden prąd, a silnik nie reaguje na komendy. Załączam schemat połączeń oraz kod, z którego korzystam. Na schemacie zamiast przetwornicy znajduje się model stabilizatora liniowego, gdyż nie mogłem znaleźć takiej części w aplikacji Będę wdzięczny za wszelkie sugestie i pomoc w rozwiązaniu tego problemu. To mój drugi prototyp, który samodzielnie wykonałem, więc prosiłbym o wyrozumiałość i porady dla początkującego. #include <AccelStepper.h> // Define the pins for STEP and DIR #define DIR_PIN 7 #define STEP_PIN 8 // Create an instance of the AccelStepper class AccelStepper stepper(AccelStepper::DRIVER, STEP_PIN, DIR_PIN); void setup() { stepper.setMaxSpeed(1000); // Set maximum speed in steps per second stepper.setAcceleration(500); // Set acceleration in steps per second^2 } void loop() { // Move one full revolution forward stepper.moveTo(200); // 200 steps forward stepper.runToPosition(); // Move to position delay(1000); // Move one full revolution backward stepper.moveTo(-200); // 200 steps backward stepper.runToPosition(); // Move to position delay(1000); } Dzięki!
- 6 odpowiedzi
-
- Arduino
- silnik krokowy
-
(i 1 więcej)
Tagi:
-
Dzień dobry, od niedawna próbuję stworzyć grę, chodzi o to że diody migają na lewo i prawo, a gracz ma wcisnąć przycisk aby miganie się zatrzymało. W zależności od tego na jakiej diodzie LED gracz zatrzyma, dostanie punkty (wyświetlane na LCD). I teraz chodzi o to że muszę w jednym kodzie sprawdzać czy przycisk nie został naciśnięty, i kontrolować miganie diod LED. Gdyby była opcja dwóch funkcji void loop to problem by był rozwiązany. Więc, czy można w jednym kodzie mieć dwie funkcje loop? Jeśli tak to proszę powiedzieć jak tego użyć, a jeśli nie to jak wykorzystać jedną funkcję loop do tego co chcę zrobić. Z góry dziękuję! 🙂
- 67 odpowiedzi
-
- Arduino
- Początkujący
-
(i 2 więcej)
Tagi:
-
Witam, próbowałem dzisiaj podłączyć wyświetlacz TFT dotykowy SPI ILI9341 do Arduino. Spróbowałem podłączyć z takiego zdjęcia z internetu i ekran się tylko zaświecił, kod się dało przegrać ale na wyświetlaczu nic się nie pojawiało. Potem zobaczyłem że jest więcej metod podłączania. I czy ktoś może mógłby mi wysłać zdjęcie/tabelkę prawidłowego podłączania wyświetlacza do Arduino? Wcześniej jak chciałem podłączyć zrobiłem to w! taki sposób jaki możecie zobaczyć na obrazku: i kod wgrałem ten: #include <Adafruit_GFX.h> #include <Adafruit_TFTLCD.h> #include <TouchScreen.h> #define LCD_CS A3 #define LCD_CD A2 #define LCD_WR A1 #define LCD_RD A0 #define LCD_RESET A4 #define BLACK 0x0000 #define BLUE 0x001F #define RED 0xF800 #define GREEN 0x07E0 #define CYAN 0x07FF #define MAGENTA 0xF81F #define YELLOW 0xFFE0 #define WHITE 0xFFFF #define YP A1 #define XM A2 #define YM 7 #define XP 6 #define TS_MINX 940 #define TS_MINY 160 #define TS_MAXX 160 #define TS_MAXY 970 TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET); #define BOXSIZE 40 #define PENRADIUS 3 #define MINPRESSURE 10 #define MAXPRESSURE 1000 bool change = 0; bool touch = 0; void setup() { pinMode(A5, OUTPUT); digitalWrite(A5, LOW); Serial.begin(9600); tft.reset(); tft.begin(0x9325); tft.setTextColor(WHITE); tft.setTextSize(3); tft.fillScreen(BLACK); } void loop() { if (change == 0 && touch == 0) { digitalWrite(A5, LOW); tft.fillCircle(120, 160, 50, RED); tft.setCursor(95, 150); tft.println("LED"); change = 1; delay(200); } if (change == 0 && touch == 1) { digitalWrite(A5, HIGH); tft.fillCircle(120, 160, 50, GREEN); tft.setCursor(95, 150); tft.println("LED"); change = 1; delay(200); } TSPoint p = ts.getPoint(); pinMode(XM, OUTPUT); pinMode(YP, OUTPUT); if (p.z > MINPRESSURE && p.z < MAXPRESSURE) { p.x = map(p.x, TS_MINX, TS_MAXX, tft.width(), 0); p.y = map(p.y, TS_MINY, TS_MAXY, tft.height(), 0); Serial.print("("); Serial.print(p.x); Serial.print(", "); Serial.print(p.y); Serial.println(")"); if (p.x > 70 && p.x < 170) { if (p.y > 110 && p.y < 210) { change = 0; touch = !touch; } } } } Tu są zdjęcia jak to podłączyłem: Mało na nich nich widać niestety, więc tu jest jeszcze zdjęcie ,,poglądowe": Gdyby było za mało informacji proszę napisać Z góry dziękuję za odpowiedzi! 😄
- 14 odpowiedzi
-
Dzień dobry, jak zasilić Arduino bateriami? Z góry dziękuję za odpowiedzi! 🙂
-
Dzień dobry, od wczoraj testuje wyświetlacz TFT. Wszystko idzie dobrze, ale nie wiem jak mam wyświetlić zmienną int na takim wyświetlaczu. Bardzo proszę o odpowiedź. Z góry dziękuję! 😄
- 17 odpowiedzi
-
- elektronika
- int
-
(i 3 więcej)
Tagi:
-
Witam, Zrobiłem sterownik do dwóch silników krokowych w oparciu o Arduino+Iduino ST1113 i 2x TB6660, wszystko działa jak należy do momentu przejścia na zasilanie arduino z przetwornicy napięcia StepDown 34>>5v. Co ciekawe całość działa poprawnie, tzn. silniki reagują na sterowanie przyciskami na LCD keypad shield ale nie wyświetlają się dane na wyświetlaczu (jest czysty i podświetlony). Gdy ten sam układ zasilę z komputera przez wejście USB w arduino znaki na wyświetlaczu są prawidłowe. Proszę o pomoc, czy do podłączenia zasilania z przetwornicy impulsowej potrzebuję jakiegoś dodatkowego modułu?
-
Witam serdecznie, Borykam się z dziwnym dla mnie problemem, otóż zbudowałem sobie pojazd rc składający się z czterech silników, arduino, nakładki od iduino i modułu esp32 wroom do komunikacji wifi z telefonem. Do sterowania użyłem aplikacji z google play, który wysyła 5 zapytań GET; "GET /?State=F", "GET /?State=B","GET /?State=L","GET /?State=R", "GET /?State=S". Kolejno są to : przód, tył, lewo, prawo i stop. Sygnały schodzą na esp jak i są przekazywane na arduino dopóki układ jest zasilany z kabla usb. Niestety gdy uruchomię z zasilania bateryjnego, to silniki na sygnały nie reaguję, podobnie jest gdy obwód jest zasilany z kabla usb, a przełączę przycisk zasilania bateryjnego, to wywala komunikację z komputerem. Kod sterujący silnikami w zależności od otrzymanej komendy, a pod nim kod z esp32, który odbiera sygnały z telefonu i przekazuje na arduino. Wydaje mi się, że jest kwestia zasilania, ale nie dam sobie ręki uciąć, może ktoś miał podobny problem? Z góry dziękuję za odpowiedzi. #include <AFMotor.h> // Inicjalizacja motor shield AF_DCMotor motor1(1); // Motor 1 podłączony do kanału M1 AF_DCMotor motor2(2); // Motor 2 podłączony do kanału M2 AF_DCMotor motor3(3); // Motor 3 podłączony do kanału M3 AF_DCMotor motor4(4); // Motor 4 podłączony do kanału M4 void setup() { Serial.begin(9600); // Komunikacja z ESP32 Serial.println("Arduino is ready to receive commands"); } void loop() { if (Serial.available()) { char command = Serial.read(); Serial.print("Received command: "); Serial.println(command); switch (command) { case 'F': // Ruch do przodu Serial.println("Moving forward"); motor1.setSpeed(255); // Maksymalna prędkość motor1.run(FORWARD); motor2.setSpeed(255); motor2.run(FORWARD); motor3.setSpeed(255); motor3.run(FORWARD); motor4.setSpeed(255); motor4.run(FORWARD); break; case 'B': // Ruch do tyłu Serial.println("Moving backward"); motor1.setSpeed(255); motor1.run(BACKWARD); motor2.setSpeed(255); motor2.run(BACKWARD); motor3.setSpeed(255); motor3.run(BACKWARD); motor4.setSpeed(255); motor4.run(BACKWARD); break; case 'R': // Skręt w prawo Serial.println("Turning right"); motor1.setSpeed(255); motor1.run(FORWARD); motor2.setSpeed(255); motor2.run(BACKWARD); motor3.setSpeed(255); motor3.run(FORWARD); motor4.setSpeed(255); motor4.run(BACKWARD); break; case 'L': // Skręt w lewo Serial.println("Turning left"); motor1.setSpeed(255); motor1.run(BACKWARD); motor2.setSpeed(255); motor2.run(FORWARD); motor3.setSpeed(255); motor3.run(BACKWARD); motor4.setSpeed(255); motor4.run(FORWARD); break; case 'S': // Stop Serial.println("Stopping"); motor1.setSpeed(0); motor1.run(RELEASE); motor2.setSpeed(0); motor2.run(RELEASE); motor3.setSpeed(0); motor3.run(RELEASE); motor4.setSpeed(0); motor4.run(RELEASE); break; default: Serial.println("Unknown command"); break; } } } #include <WiFi.h> // Nazwa i hasło sieci Wi-Fi const char* ssid = "RC_CONNECTION"; const char* password = "12345678"; // Inicjalizacja serwera WiFiServer server(80); // Piny dla Serial1 const int RX_PIN = 16; const int TX_PIN = 17; void setup() { Serial.begin(115200); Serial1.begin(9600, SERIAL_8N1, RX_PIN, TX_PIN); // Używamy Serial1 do komunikacji z Arduino // Ustawienie ESP32 jako Access Point WiFi.softAP(ssid, password); Serial.println("Access Point utworzony:"); Serial.print("SSID: "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.softAPIP()); // Uruchomienie serwera server.begin(); } void loop() { WiFiClient client = server.available(); // Sprawdzenie, czy są klienci if (client) { Serial.println("New connection"); String currentLine = ""; // do trzymania danych z klienta while (client.connected()) { if (client.available()) { char c = client.read(); Serial.write(c); // Wysyła komendę do komputera przez Serial if (c == '\n') { // Przetwarzanie żądania GET Serial.println("Processing request:"); Serial.println(currentLine); // Wysłanie komendy do Arduino przez Serial1 if (currentLine.indexOf("GET /?State=F") >= 0) { Serial1.println("F"); } else if (currentLine.indexOf("GET /?State=B") >= 0) { Serial1.println("B"); } else if (currentLine.indexOf("GET /?State=R") >= 0) { Serial1.println("R"); } else if (currentLine.indexOf("GET /?State=L") >= 0) { Serial1.println("L"); } else if (currentLine.indexOf("GET /?State=S") >= 0) { Serial1.println("S"); } // Wysłanie odpowiedzi do klienta client.println("HTTP/1.1 200 OK"); client.println("Content-type:text/html"); client.println(); client.println("Komenda otrzymana"); client.println(); break; } else if (c != '\r') { currentLine += c; } } yield(); // Dodanie yield() w celu uniknięcia resetowania przez watchdog } client.stop(); Serial.println("Client Disconnected"); } delay(10); // Dodanie niewielkiego opóźnienia, aby odciążyć procesor }
- 3 odpowiedzi
-
- ESP32-wroom
- Motor Shield
- (i 3 więcej)