Skocz do zawartości

Przeszukaj forum

Pokazywanie wyników dla tagów 'Arduino'.

  • Szukaj wg tagów

    Wpisz tagi, oddzielając przecinkami.
  • Szukaj wg autora

Typ zawartości


Kategorie forum

  • Elektronika i programowanie
    • Elektronika
    • Arduino, ESP
    • Mikrokontrolery
    • Raspberry Pi
    • Inne komputery jednopłytkowe
    • Układy programowalne
    • Programowanie
    • Zasilanie
  • Artykuły, projekty, DIY
    • Artykuły redakcji (blog)
    • Artykuły użytkowników
    • Projekty - roboty
    • Projekty - DIY
    • Projekty - DIY (początkujący)
    • Projekty - w budowie (worklogi)
    • Wiadomości
  • Pozostałe
    • Oprogramowanie CAD
    • Druk 3D
    • Napędy
    • Mechanika
    • Zawody/Konkursy/Wydarzenia
    • Sprzedam/Kupię/Zamienię/Praca
    • Inne
  • Ogólne
    • Ogłoszenia organizacyjne
    • Dyskusje o FORBOT.pl
    • Na luzie
    • Kosz

Szukaj wyników w...

Znajdź wyniki, które zawierają...


Data utworzenia

  • Rozpocznij

    Koniec


Ostatnia aktualizacja

  • Rozpocznij

    Koniec


Filtruj po ilości...

Data dołączenia

  • Rozpocznij

    Koniec


Grupa


Znaleziono 228 wyników

  1. 1. Wprowadzenie Od dawna zafascynowany jestem kaligrafią, nie tylko w kontekście naszego języka ojczystego, ale także innych bardziej egzotycznych jeżyków. Mimo wielokrotnych prób zmierzenia się z tym tematem od strony praktycznej doszedłem do wniosku, że forma biernego obserwatora daje mi więcej satysfakcji niż sam udziel w procesie kaligrafowania. Może to niektórym wydawać się dziwne, może nie, no cóż, tak mam. Po pewnym czasie w mojej głowie narodziła się myśl, a raczej pytanie. Czy jestem w stanie zbudować maszynę do kaligrafii? Uprzedzając nieco fakty - odpowiedź brzmi: tak. Więc zapraszam do zapoznania się, z krótką historią mojego plotera. Po przejrzeniu zasobów sieci zdecydowałem się na ploter CNC, jako urządzenie, które spełni moje wymagania. W przyszłości może będzie dodatkowo rozbudowane i zyska funkcję na przykład laserowego grawera. Na początek, krótko o samym urządzeniu. Jak podaje Wikipedia ploter to komputerowe urządzenie peryferyjne, służące do pracy z dużymi płaskimi powierzchniami, mogące nanosić obrazy, wycinać wzory, grawerować itp. Plotery są również używane do kreślenia map. Są to urządzenia z powiedzeniem używane od lat w różnych gałęziach przemysłu. Pod naszymi strzechami, czyli w domu przeciętnego Kowalskiego się ich jednak nie widuje ponieważ funkcję tego typu urządzenia pełni drukarka, gdyż raczej na co dzień nie ma konieczności "generowania" pisma ręcznego na dużym formacie. Jest to pewien skrót myślowy, ale mam nadzieje, że większość osób rozumie o co mi chodzi. Założenia są takie, że urządzenia ma być stosunkowo tanie, łatwe w budowie i obsłudze. 2. Projekt i Thingiverse Thingiverse to serwis, w którym ludzie dzielą się swoimi projektami różnych maszyn, urządzeń, czy gadżetów, które można następnie wydrukować we własnym zakresie na drukarce 3D. Tak też postanowiłem zrobić, wykorzystać jeden z bardzo wielu istniejących już projektów na którego bazie zbuduję swój ploter. Konkretnie z projektu "Drawing Robot - Arduino Uno + CNC Shield + GRBL", który sam bazuje na innym tego typu projekcie. 2.1. Oryginalny projekt, źródło: thingiverse.com/thing:2349232 Do projektu zostały wykorzystane części stworzone na drukarce 3D, w przypadku gdy ktoś nie ma dostępu do tego typu urządzenia polecam skorzystać z ogłoszeń społeczności związanej z drukiem 3D. Takie usługi powinny być dostępne na miejscu we wszystkich większych miastach, a koszt to w tym przypadku to do kilkudziesięciu złotych. Nie zapominajmy to też, o naszej forumowej braci. 3. Części i narzędzia Po za wydrukowanymi częściami będą potrzebne jeszcze: Elementy elektroniczne, elektryczne Silnik krokowy NEMA 17 - 2 sztuki. Stalowy pręt o średnicy 8mm (oś X, Y) - 4 sztuki, w moim przypadku jest to 4x po 400mm. Stalowy pręt o średnicy 3mm (oś Z) - 2 sztuki, 2x 8mm. Stalowy pręt gwintowany o średnicy 8mm - 1 sztuka. Łożysko liniowe LM8UU - 8 sztuk. Serwomechanizm SG-90 - 1 sztuka. Sprężynka od długopisu lub gumka recepturka - od jednej do kilku sztuk w zależności od użytego uchwytu. Koło zębate GT2, 16 zębów - 2 sztuki. Łożysko 624zz - 5 sztuk. Pasek zębaty GT2 - w zależności od długości zastosowanych prętów dla osi X i Y, w moim przypadku wystarczyło 2000mm. Arduino Uno - 1 sztuka. Sterownik CNC Shield dla Arduino Uno - 1 sztuka. Zworki - 6 sztuk. Sterownik silnika krokowego A4988 - 2 sztuki. Zasilacz 12V minimum 2A - 1 sztuka. Przyciski krańcowe - 4 sztuki, opcjonalnie, zabezpieczenie osi X i Y z obu stron. Gniazdo DC - 1 sztuka. Nakrętki M8 - 4 sztuki. M4 - 5 sztuk. M3 - 7 sztuk. Śruby M4 x 35mm - 5 sztuk. M3 x 20mm - 1 sztuka. M3 x 16mm - 13 sztuk. M3 x 6mm - 4 sztuki. Podkładki M8 - 4 sztuki. M3 - 4 sztuki. Inne Przewody do silników krokowych, kupne czy też zrobione własnoręcznie. Wszelkie narzędzia, które mogą się przydać pod czas budowy, jak na przykład piła do przycięcia stalowych prętów, cążki do metalu, czy stacja lutownicza, ale to raczej oczywiste. 4. Elektronika i mechanika Sercem urządzenia jest Arduino Uno z płytką rozszerzeń CNC, w której osadzone są 2 sterowniki A4988. Płytkę rozszerzeń wpinamy zgodnie z opisem pinów, powinny być one opisane na obu płytkach. Tak samo postępujemy z A4988 dla osi X i Y. 4.1. Diagram połączeń elektrycznych z CNC Shield. 4.2. Zmontowany układ, gotowy do pracy. Ploter wykorzystuje system CoreXY do poruszania karetką. Według opinii krążących w internecie taki system jest bardziej precyzyjny i prostszy do wykonania w porównaniu do starowania osiami X i Y niezależnie. Nie jestem ekspertem i ciężko mi stwierdzić czy tak rzeczywiście jest. Bez względu na to czy ma to odzwierciedlenie w rzeczywistości, to dość spora część tego typu maszyn budowanych przez hobbystów wykorzystuje właśnie CoreXY, jeśli nie mamy do czynienia z dużymi obciążeniami karetki. 4.3. Wizualizacja układu CoreXY. 4.4. Schemat ruchu układu CoreXY. 5. Oprogramowanie Oprogramowanie Arduino zostało wykonane zgodnie z poniższym poradnikiem: https://electricdiylab.com/grbl-cnc-shield-z-axis-servo-migrbl/ Należy jedynie pamiętać, że przez samym zaprogramowaniem mikro kontrolera należy w pliku config.h zmienić linie: // #define COREXY // Default disabled. Uncomment to enable. na #define COREXY // Default disabled. Uncomment to enable. czyli usunąć komentarz, przez co zostanie włączona opcję COREXY ponieważ właśnie takiego starowania używa ploter. W przeciwnym wypadku nasza maszyna będzie działać, ale wszystko co stworzy będzie obrócone o 45 stopni. 6. Efekt końcowy Tak oto prezentuje się efekt końcowy, wymaga jeszcze kilku końcowych szlifów, jak dobór odpowiednich sprężyn, przetestowanie różnych podkładek do pisania, piór, długopisów, wykonanie nowego "trzymaka", dodaniu kilku trytytek, ect. Mimo tych drobnych aspektów maszyna działa bardzo dobrze i jestem zaskoczony jej dokładnością. 6.1. Wybrane ujęcia gotowego plotera. 6.2. Film obrazujący pracę plotera. Film ukazuje również problemy z dociskiem długopisu spowodowane nierównym podłożem.
  2. Cześć Chcę sobie zrobić prosty tachometr na bazie podczerwieni. Czy ten odbiornik będzie dobry? http://electropark.pl/odbiorniki-podczerwieni/2880-odbiornik-podczerwieni-38khz-tsop31238.html a taki nadajnik http://electropark.pl/diody-ir-podczerwieni/1529-ir-tsal6400-dioda-nadawcza-ir-25st.html Na wirującym elemencie będzie naklejony biały pasek, który powinien odbijać podczerwień. Czy te elementy będą działać ze sobą? Jaki może być zasięg takiego tachometru? Jaka dokładność jeżeli pomiary będą w przedziale 1400-3000 rpm? A może polecicie coś lepszego? Będę używał ardunino uno do sterowania i liczenia rpm. Dziękuję
  3. W zeszłym roku, jakoś przed świętami Bożego Narodzenia kupiłem gniazdka zdalnie sterowane za pomocą pilota na 433MHz. Kupiłem je głównie z myślą, żeby nie musieć się schylać każdorazowo przy wyłączaniu oświetlenia na choince. Któregoś dnia wpadłem na pomysł, żeby dorobić do tego sterowanie z pomocą smartfona i szczerze wątpiłem, że mi się uda. Ale się udało! W elektronice nie siedzę jakoś długo, raczej jest to dodatkowa "pasja" uzupełniająca programowanie, którym zawodowo się zajmuję. Tak się złożyło, że szybko uciekłem od Arduino Pro Mini na rzecz płytek prototypowych z ESP8266. Przed tym projektem zrobiłem przetarcie w projektowaniu PCB za pomocą płytki zrobionej w interfejsie webowym EasyEDA. Na PCB osadziłem stabilizator napięcia i diodę. Jedyne do czego tej płytki użyłem, to mruganie tą diodą i testowanie programowania układu. Były to dobre pierwsze kroki, które pozwoliły przesiąść się na KiCAD'a. Kupiłem moduły do 433Mhz dla Arduino i zacząłem pisać prototypowy kod Dzięki modułom mogłem wyśledzić, co jest nadawane "w eter" i podsłuchać kody, które są przesyłane gdy na pilocie wciskamy przyciski, gdyż płytka PCB pilota nie mówiła nic (zdjęcie powyżej). Szybko okazało się, że gotowe wzory implementacji są w internecie a protokół, jaki jest używany znany jest z gniazdek Kaku Power Switch oraz Nexa Power Switch, który bazuje na kodzie manchester. Podsłuchane kody zadziałały na płytce prototypowej, czas było to przenieść na docelowe ESP8266 / ESP-12. Przyszedł czas na przeniesienie się na własne PCB Zaprojektowałem płytkę PCB, w roli modułu radiowego użyłem RFM110W, który ładnie pasował i nie powiększał znacząco wymiarów płytki. Przylutowany powierzchniowo nie odstaje od PCB i wydaje się być jej integralną częścią. Urządzenie zasilane jest z gniazda microUSB, z którego prąd wędruje do stabilizatora napięcia a następnie do pozostałych części urządzenia - czyli modułu ESP12 oraz RFM110W. Na płytce pozostało miejsce na pin-socket odbiornika, natomiast praktyka pokazała, że podsłuchanie kodów lepiej zrealizować osobnym urządzeniem, więc gniazdo to nie jest wykorzystywane. Software - czyli najbardziej czasochłonna sprawa Program pisałem kilka razy, początkowo korzystając z biblioteki Blynk, którą porzuciłem na rzecz MQTT (PubSubClient). Protokół MQTT pozwala na uniwersalną komunikację, potrafi przechowywać stany w "tematach", działa podobnie do chatów, gdzie w tematach możemy publikować wiadomości. Napisałem również aplikację na peceta w C#, do sterowania gniazdami. Efekt końcowy Jak się podoba?
  4. Cześć! Mam taki problem: próbuje podłączyć duży przycisk tact switch(12x12mm) do Arduino i sprawdzić czy jest naciśnięty. Wykorzystuję do tego taki kod: void setup() { pinMode(2, INPUT_PULLUP); } void loop() { if(digitalRead(2) == LOW) { Serial.println("CLICKED!"); } } i tak podłączyłem układ Wydaję mi się, że wszystko jest dobrze. Jednak, gdy podłączam płytkę do komputera, monitor portu szeregowego sugeruje, że cały czas naciskam przycisk. Problem znika po zmianie przycisku na mały (tact switch 6x6mm).
  5. Sam tytuł mówi prawie wszystko na temat tej zabawki. Co do genezy to od jakiegoś czasu miałem chęć zrobić pada opartego o arduino. Sam pad nie miał służyć do grania a bardziej do sterowania czymś innym. Całość najpierw powstała w SimulIDE Tak jak widać do każdego przycisku są przypisane diody czyli 4 po lewej jedna po prawej (plus led na pinie13) i cztery diody sygnalizacyjne na środku. Po dostarczeniu zasilania diody zaświecają się jedna po drugiej a naszym celem jest wcisnąć odpowiadający danej diodzie przycisk co powoduje jej zgaszenie. Jeśli nie wciśniemy przycisku lub wciśniemy go po czasie zapala się dioda sygnalizacyjna. Możemy pominąć trzy diody a przy czwartej jest game over . W raz z postępem rozgrywki diody gasną i zapalają się coraz szybciej. Cel był taki żeby rozgrywka była możliwie krótka a stopień trudności narastał dając nam odczuć wyraźną zmianę. tak wygląda efekt końcowy. Chciałem kupić diody w kształcie kwadrat 12x12mm ale nie było ich w sklepie więc trudno. Za brakujące elementy zapłaciłem 7 zł resztę miałem. W załączniku przesyłam plik do simulIDE wraz z kodem (całym). Można skompilować i wgrać bezpośrednio z simulIDE i zobaczyć jak to działa w symulacji. void setup() { Serial.begin(9600); DDRC = 15; // A0..A3 Output DDRB = 48; //D8...D11 INPUT, D12 and D13 Output PORTB = 15; //D8...D11 High impedance DDRD = 60; //D2...D5 OUTPUT PORTD = 192; //D6 D7 High impedance PCICR = 5; // enable pin change interrupt bank 0 and 2 PCMSK0 = 15; //enable pin change interrupt PCINT0...PCINT3/D8...D11 PCMSK2 =192; // enable pin change interrupt D6 D7 } void loop() { start(randomPin,ledOn,ledOff); } ISR(PCINT0_vect) { for (byte i=0; i<4; i++) { if (bitRead(PINB,i)==0 && bitRead(PIND,2+i)==1) {score++; bitClear(PORTD, 2+i);} } } ISR(PCINT2_vect) { for (byte i=0; i<2; i++) { if (bitRead(PIND,i+6)==0 && bitRead(PINB,i+4)==1) {score++; bitClear(PORTB,i+4);} } } Polecam zrobienie podglądu w rejestry (jeśli ktoś wcześniej tego nie robił) z poziomu simulIDE naprawdę bardzo przydatna sprawa. I to by było na tyle. A co do samego refleksu to udało mi się zgasić ponad 100 diod. Pin_interruptPad.zip
  6. W innym wątku opisałem jak wykonałem zdalny moduł otwierania bramy współpracujący z sterownikiem HB5, tutaj przedstawię jak przy pomocy modułów radiowych 433Mhz można odczytać kod nadawany przez pilot oraz nadać go powtórnie w celu sterowania bramą. Do całej zabawy potrzebna będzie nam biblioteka RCSwitch.h oraz jakaś płytka kompatybilna z Arduino. Wgrywamy przykład ReceiveDemo_Simple uruchamiamy monitor portu szeregowego i wciskamy przycisk na naszym pilocie powinien pojawić nam się kod który wysyła nasz pilot. W ten oto prosty sposób odczytaliśmy kod do naszego sterownika, który następnie możemy nadać. Na samym początku miałem plan zrobić tylko pilot do bramy ale projekt rozrósł się i tak oto na swoim pokładzie posiada: czujnik temperatury wilgotności oraz ciśnienia BME280 wyświetlacz oled SSD 1306 zegar czasu rzeczywistego DS1307 Wszystkie powyższe moduły komunikują się z mikrokontrolerem poprzez magistralę szeregową i2c co znacznie uprościło konstrukcję i pozwoliło uniknąć zbędnego okablowania. Do przewijania ekranów i wyświetlania tylu informacji wykorzystałem bibliotekę OLEDDisplayUi.h której działanie widać na poniższym filmie. Zostało przygotowanych 5 ekranów (Zegar analgoowy, zegar cyfrowy, temperatura, wilgotność i ciśnienie) a po wciśnięciu przycisku jest wyświetlany napis “BRAMA” oraz zostaje nadany kod otwarcia/zamknięcia bramy. Aby uniknąć konieczności ustawiania zegara, czas synchronizuje się automatycznie z moim domowym serwerem NTP, za każdym razem gdy mikrokontroler znajdzie się w zasięgu sieci WIFI. Najwięcej czasu zajęła mi rzecz która wydawała się najprostsza czyli ustawienie strefy czasowej tak przynajmniej mi się wydaje. Zobaczymy za kilka tygodni. Zasięg pilota jest bardzo zadowalający, urządzenie jest zamontowane wewnątrz pojazdu w centralnej części konsoli w Fordzie Focusie a otwarcie bramy z 150m nie stanowi dla niego problemu Obudowa została zaprojektowana w sketchupie oraz wydrukowana z PLA, lato w samochodzie przeżyła lecz temperatury zrobiły swoje i w niektórych miejscach można było zauważyć odkształcenia. W planach jest wydruk z PET-G lub ABS. Poniżej kilka zdjęć jak wszystko zostało upchnięte: Przygotowana została również mniejsza wersja do Forda Fiesty z Arduino Pro Mini, montuje się ją w centralnej części kokpitu, w miejsce gdzie można włożyć karty do bankomatu. Oczywiście kod programu udostępniam: OLEDAuto.zip
  7. Jako że wpadł do mnie na warsztat NVR z wyjściem RS485 oraz kilka kamer analogowych postanowiłem na testy zbudować sobie kamerkę z PTZ, no może bez Z. Na początek wyjaśnię co to jest PTZ skrót rozwijamy jako Pan Tilt Zoom, system wykorzystywany w kamerach do obracania kamerą oraz jeśli kamera posiada taką funkcjonalność regulacji ogniskowej. Głodnych wiedzy odsyłam do https://en.wikipedia.org/wiki/Pan–tilt–zoom_camera Zaczęło się od tego że znalazłem na stronie thingverse parę projektów: https://www.thingiverse.com/thing:107957 https://www.thingiverse.com/thing:2467743 Wydrukowałem jeden z nich i po szybkim złożeniu konstrukcji podłączeniu pod arduino nano, oraz napisaniu testowego programu wyszło coś takiego: Serwa które użyłem to Serwo TowerPro SG-90. Aby ruszyć dalej trzeba było zapoznać się z protokołem który wykorzystywany jest w komunikacji rejestrator -> kamera, padło na protokół Pelco-D. Znalazłem manual z 1999 roku dotyczący tego protokołu i całość prac programistycznych poszła dosyć sprawnie. pelco-d.pdf Szybkie podłączenie modułu rs485 do Arduino Nano i mojego nvr’a, krótki program i zaczynamy debug komunikacji. Przykład danych które odbieram poniżej: 255 4 0 4 39 0 47 SUM: 47 255 4 0 4 39 0 47 SUM: 47 255 4 0 4 39 0 47 SUM: 47 255 4 0 2 39 0 45 SUM: 45 255 4 0 2 39 0 45 SUM: 45 255 4 0 2 39 0 45 SUM: 45 Pierwszy bajt to synchronizacja, drugi to adres kamery, trzeci i czwarty to bajty w których przekazywane są polecenia, nas najbardziej interesuje bajt czwarty, gdzie 4 to obrót w lewo a 2 to obrót w prawo, dodatkowo w bajcie piątym i szóstym przekazywane są informacje o prędkości, a bajt siódmy to suma kontrolna. Teraz wystarczyło połączyć 2 programy w jeden i można kamerkę powiesić w warsztacie no i nie do końca. Od tego momentu natrafiłem na pewną trudność. Okazało się że biblioteka Servo.h oraz SoftwareSerial.h korzystają z tego samego timera, co objawiało szarpaniem serwami przy jakiejkolwiek komunikacji po rs485. ehh…. Znalazłem inną bibliotekę ServoTimer2.h która według wielu źródeł powinna usunąć opisywaną trudność, więc po przerobieniu programu tak aby korzystał z nowej biblioteki, nic nie uległo zmianie Więc postanowiłem obejść problem programowo. //Look for incoming data from Pelco-D controller if (RS485Serial.available() > 0) { servo1.detach(); servo2.detach(); Wyłączając serwa na czas odczytu danych po rs485. Od tej pory wszystko zaczęło działać płynnie. Tak jak na poniższym filmie. Dodatkowo dorobiłem kontaktron na drzwi do warsztatu, tak aby kamera przy otwarciu drzwi ustawiała się na wchodzącego, a po zadanym czasie z powrotem kierowała się na okno. Program przewiduje obroty kamerą w wszystkie strony z uwzględnieniem prędkości wysyłanej z NVR’a, scan kamerą po pomieszczeniu, oraz presety. switch (data) { case 0x00 : break; case 0x02 : pulseWidth1 = pulseWidth1 + turnRate1; break; // right case 0x04 : pulseWidth1 = pulseWidth1 - turnRate1; break; // left case 0x10 : pulseWidth2 = pulseWidth2 - turnRate2; break; // down case 0x08 : pulseWidth2 = pulseWidth2 + turnRate2; break; // up case 0x0C : pulseWidth1 = pulseWidth1 - turnRate1; pulseWidth2 = pulseWidth2 + turnRate1; break; // left-up case 0x0A : pulseWidth1 = pulseWidth1 + turnRate1; pulseWidth2 = pulseWidth2 + turnRate1; break; // right-up case 0x14 : pulseWidth1 = pulseWidth1 - turnRate1; pulseWidth2 = pulseWidth2 - turnRate2; break; // left-down case 0x12 : pulseWidth1 = pulseWidth1 + turnRate1; pulseWidth2 = pulseWidth2 - turnRate2; break; // right-down case 0x1B : scan = 1; break;// scan on case 0x1D : scan = 0; break;// scan off case 0x07 : // presets if (byteReceived[5] == 1) // drukarka { pulseWidth1 = 90; pulseWidth2 = 140; } else if (byteReceived[5] == 2) // tv { pulseWidth1 = 35; pulseWidth2 = 140; } else if (byteReceived[5] == 3) // drzwi { pulseWidth1 = drzwiS1; pulseWidth2 = drzwiS2; } else if (byteReceived[5] == 4) // okno { pulseWidth1 = oknoS1; pulseWidth2 = oknoS2; } break; } W planach mam funkcjonalność ustawiania presetów z rejestartora, lecz nie było mi to potrzebne w tej chwili, a dostęp do ardiuno mam na wyciągnięcie ręki, więc zawsze mogę go przeprogramować. Zastanawiała mnie również żywotność serwomechanizmów, jak narazie cała konstrukcja wisi już ponad pół roku, do warsztatu wchodzę przynajmniej 5 razy dziennie, w soboty i niedziele licznik wejść myślę że dobija do jakiś 20 i jak dotychczas nic złego im się nie dzieje. Poniżej udostępniam również kod do arduino gdyby ktoś chciał się również pobawić. Lista użytych elementów: Arduino nano Nano Expansion Adapter Serwomechanizmy moduł RS485 Kod źródłowy: PTZ_rs485.zip
  8. Jako że w tym roku moja posiadłość dorobiła się bramy otwieranej z pilota z sterownikiem HB5 postanowiłem dorobić do niej sterowanie poprzez web’a czyli mój smart home oparty na Domoticzu. Założenia projektu: sterowanie z strony www odczyt stanów bramy (otwieranie, zamykanie, otwarta, zamknięta, stan nieznany) sygnalizacja otwarcia furtki komunikacja poprzez RS485 Użyte elementy: arduino nano Nano Expansion Adapter ESP8266 2x moduł RS485 stepdown do zasilanie arduino nano moduł przekaźników kilka rezystorów Konieczne było zastosowanie drugiego mikrokontrolera ze względu na oddalenie bramy od domu o 100m. Więc zastosowałem Arduino Nano oraz ESP8266. Tak prezentował się biurkowy testowy zestaw: W arduino nano w celu odczytania napięć podawanych na siłowniki oraz stanów krańcówek, zastosowałem dzielniki napięć na rezystorach, które podłączyłem do wejść analogowych. Taki zabieg umożliwia programowe ustawienie poziomów przy których ma nastąpić wykrycie zmiany stanu oraz przekazanie danych do drugiego mikrokontrolera. Do komunikacji poprzez RS485 została wykorzystana biblioteka RS485_protocol.h oraz SoftwareSerial.h. Dane wysyłane są jako tablica pierwsza wartość to adres urządzenia a druga i trzecia to wartość którą chcemy przesłać na drugą stronę. ESP8266 po odebraniu danych wysyła je do domoticza, ustawiając odpowiednie wartości przełączników i alarmów. Tutaj troszkę odbiegnę od tematu, domoticz ma możliwość wysyłania zdjęć z kamery, wykorzystałem to w ten sposób, że jeśli wykryte zostanie otwarcie furtki to otrzymuję maila z zdjęciem intruza Komunikacja w drugą stronę odbywa się w najprostszy możliwy sposób, czyli na ESP został uruchomiony prosty web serwer, po otwarciu strony np: http://ip/brama zostaje nawiązana komunikacja z arduino nano i wysłane polecenie otwarcia bramy. Teraz powrócimy jeszcze do Arduino Nano, wyzwolenie otwarcia i zamknięcia bramy następuje poprzez przekaźnik, który podłączony jest w sterowniku HB5 pod wejście przeważnie służące do podłączenia przycisku znajdującego się gdzieś przy bramie. Sterownik HB5 posiada jeszcze kilka fajnych funkcjonalności które warto wykorzystać. 1. Wejście pod fotokomórkę która uniemożliwia zamknięcie bramy jeśli wiązka podczerwienie jest przerwana przez obiekt znajdujący się w bramie. 2. Możliwość podłączenia akumulatorów, niestety żelowe akumulatory nie przeżyły u mnie zimy, więc w tym roku postanowiłem sklecić pakiet z ogniw 18650 6s4p wraz z bms’em który zabezpiecza ogniwa przed nadmiernym rozładowaniem oraz przeładowaniem. Po odłączeniu zasilania brama otwiera się troszkę wolniej niż zazwyczaj ale w sytuacjach awaryjnych to nie przeszkadza. W teorii powinienem zrobić pakiet 7s bo wtedy zakresy napięć pokrywają się z zakresem pracy standardowych akumulatorów żelowych (2x12v), ale cena BMS’a 6s (2$) a 7s (10$) zaważyła o wyborze tańszego rozwiązania, które działa już kilka miesięcy. Standardowo kody źródłowe: Sterownik Brama.zip W razie jakikolwiek pytań, bo temat jest ciekawy i dość obszerny służę pomocą
  9. Arduino jest taką fajną platformą, że chyba podoba się tylko osobom zainteresowanym. Dlatego też moja żona zawsze skacze z radości, gdy dokupuje sobie nowe przekaźniki, czujniki czy też „cholerne kable walające się po szafkach”. Ja natomiast uwielbiam wykonywania przedmiotów użytkowych, mających zastosowanie w życiu codziennym. Wiem, że system podlewający zioła nie jest niczym nowym i skomplikowanym, jednakże wbrew pozorom dla człowieka nie mającego wiele wspólnego z programowaniem i elektroniką, może być kłopotliwe. Tym bardziej, że informacje ułatwiające złożenie takiego zestawu są rozproszone w sieci i nie znalazłem jeszcze dobrego tutorial -a po polsku. Dlatego postaram się opisać to jak najdokładniej, aby ktoś taki jak ja mógł to zrozumieć Projekt na początku miał kilka założeń: Znalezienie doniczki, która będzie dobrze wyglądała (nie zostanie skazana na banicję przez innego mieszkańca) Doniczka musi mieć zbiorniki na wodę na tyle duże, żebym nie musiał martwić się podlewaniem ziół w kuchni, które umierały mi bardzo szybko – albo za mało wody albo odwrotnie. System podlewania ma być indywidualny dla każdego rodzaju z ziół i działać raz lub dwa dziennie. Wszystko musi być najtańsze jak się da. Projekt musi dobrze wyglądać. Znalezienie odpowiedniej doniczki, która zmieści się na szafce (i będzie dobrze wyglądać) okazał się niemożliwy do zrealizowania. Nic takiego na rynku nie ma, dlatego też musiałem zrobić ją sam. Najkorzystniejszym cenowo materiałem okazało się PCV o grubości 3 mm. Występuje w kolorze białym i czarnym, są sklepy internetowe gdzie możemy zamówić już przycięte formatki. Poniżej pokazuję projekt doniczki i rozpisane wielkości formatek. Formatki z PCV potrzebne do wykonania doniczki ze zbiornikiem wody (wymiary w mm, grubość 3 mm): 183 x 200 mm – 2 szt 400 x 180 mm – 2 szt 400 x 200 mm – 1 szt 392 x 120 mm – 3 szt Zdjęcia i projekt: Elementy kleimy najpierw kropelką/super glue lub innym klejem kontaktowym. Później uszczelniamy połączenia poprzez nakładanie kleju do rur PCV (z atestem dla instalacji wodnej) za pomocą strzykawki. Po prostu nabieramy klej i grubą warstwę wciskamy w szczeliny. Klej schnie 24h, a każdy z elementów trzeba zabezpieczyć oddzielnie, co więcej nie ma możliwości aby zrobić to już po złożeniu doniczki – nie będziemy mieć dostępu do niektórych krawędzi. Dlatego uszczelniać klejem do PCV należy etapami. Na końcu warto zrobić test szczelności, w moim przypadku robiłem 3 poprawki. Również warto przed wklejeniem tylnej ściany doniczki zamontować do niej pompki wody oraz wyprowadzić okablowanie na zewnątrz. W moim przypadku po prostu wywierciłem dziurę, którą uszczelniłem klejem do PCV. Pompki mogą być dowolne, pracujące z odpowiednim napięciem dla naszego źródła zasilania (u mnie 5V) Ponieważ doniczka z PCV nie spełnia przynajmniej dwóch punktów z założeń projektu. Musiałem wykombinować osłonkę, która będzie wodoodporna i umożliwi dolewanie wody od góry pojemnika. Padło na hexagonalną sklejkę, akurat najdroższy z elementów tego projektu. Formatki, osłonka drewniana (wymiary w mm, grubość 15 mm): 220 x 215 – 2 szt 415 x 215 – 1 szt 415 x 40 – 1 szt 415 x 190 – 1 szt 50 x 415 – 1 szt 35 x 415 – 1 szt Wszystko jest połączone na konfirmaty bo tak mi pasowało wizualnie. Można zastosować też wkręty lub po prostu ją skleić na kołki. Elementy elektroniczne: Wemos D1 mini (lub inna płytka oparta na ESP8266, np. NodeMCU) Czujnik wilgotności gleby Przekaźnik z logiką 3,3V Moduł z zasilaniem 5v i 3,3V Pompki akwarystyczne zasilane z 5V Przetwornik ADC - ADS1115 Tylna ściana doniczki specjalnie ma niepełne plecy, aby łatwo było zamontować całą elektronikę. Do sterowania wykorzystałem D1 Mini oparty na ESP8266 ze względu na wbudowane wifi. Ponieważ wykorzystuje 3 sztuki czujników wilgotności gleby, niezbędny był przetwornik ADS1115, który może odczytywać sygnał ADC dla czterech urządzeń. To ma znaczenie bo D1 Mini mógłby obsługiwać tylko jeden z nich, więc musiałbym w projekcie wykorzystać aż 4 takie urządzenia. Dodatkowo wprowadziłem zewnętrzny układ zasilania (pompki nie dawały rady przy natężeniu prądu z D1) oraz przekaźniki uruchamiające pompki w zależności od wilgotności. Sterowanie oparłem na gotowym rozwiązaniu ESP Easy z którego korzystam już przy innych czujnikach i które trochę już znam. Tak jak pisałem wcześniej, nie potrafię programować i nie to mnie kręci w tej platformie. Natomiast ESP Easy posiada web UI i ogólnie jest łatwo konfigurowalne bez znajomości języka programowania. W tym projekcie jedyne czego trzeba się nauczyć to reguły, banalnie proste do zrozumienia. Instalacja i konfiguracja jest dobrze opisana na stronie głównej projektu: https://www.letscontrolit.com/wiki/index.php/ESPEasy Tak wygląda strona z urządzeniami w ESP po odpowiedniej konfiguracji. Pierwsze trzy to czujniki wilgotności, kolejne trzy to przełączniki do sterowania przekaźnikami uruchamiającymi pompki. Jest jedna rzecz, której nie znalazłem w żadnym poradniku dotyczącym przygotowania systemu do podlewania kwiatków. Jest to kalibracja czujników. Powinno to być oczywiste i logiczne, jednak dla mnie nie było. Na początku przyjąłem, że wartości maksymalne przetwornika należy przyjąć jako referencyjne i na podstawie tego określać procent wilgotności gleby. Mój błąd był większy niż moje samozadowolenie. Dopiero po ciemnej stornie anglojęzycznego internetu znalazłem informacje o kalibracji i jej sposobie. Należy sprawdzić jego wskazania w suchej ziemi oraz w mokrej. Więc najlepszym sposobem jest wysuszenie odpowiedniej ilości w piekarniku: Zanotowaniu wskazań dla wysuszonej i ostygniętej ziemi ( przesypałem ją do słoika żeby odpowiednio wsadzić czujnik). A później powtórzeniu pomiarów dla ziemi mokrej ale bez stojącej gleby. Później wystarczy wpisać nasze wskazania w webUI ESP Easy, która ma już dwupunktową kalibrację dla przetwornika ADS1115 i wskazaniu naszych pomiarów. Przy pomiarze gdzie była sucha ziemia wpisujemy 0, przy mokrej 100. Dzięki temu mamy od razu podany wynik w procentach. Ostatnim etapem jest napisanie reguł sterujących podlewaniem. W moim przypadku codziennie o 7.00 rano dokonywany jest pomiar wilgotności gleby, jeśli wilgotność jest niższa niż 55% (lub 45% w przypadku jednego z nich) uruchamiana jest pompka na czas kilku sekund. Później odczekuje 30 sek i znowu dokonuje pomiaru. Jeśli wilgotność jest niższa, znowu dostarczana jest woda. Algorytm powtarza się łącznie 3 razy dla każdego z czujników. Wystarcza to spokojnie aby utrzymać odpowiednią wilgotność gleby. Oczywiście można było się pokusić o wprowadzenie zmiennych zależnych od odchylenia od normy. Nawet nie byłoby to bardzo trudne, jednakże całość miała być prosta. Reguły: On Clock#Time=All,07:00 do // codziennie o 7.00 rano wykoanć taskrun,1 // pomiar z zadania nr 1 if [Z1#Analog]<55 // sprawdzić czy jest niższy niż 55 pulse,14,0,20000 // jeśli jest to uruchomić pompkę na 20 sek, jeśli nie nie podejmuje zadań endif timerSet,1,30 // timer uruchominy na 30 sek aby woda mogła wsiąknąć taskrun,1 // pomiar z zadania nr 1 if [Z1#Analog]<55 // itd... pulse,14,0,10000 endif timerSet,2,30 taskrun,1 if [Z1#Analog]<55 pulse,14,0,8000 endif endon taskrun,2 if [Z2#Analog]<55 pulse,13,0,10000 endif timerSet,3,30 taskrun,2 if [Z2#Analog]<55 pulse,13,0,5000 endif timerSet,4,30 taskrun,2 if [Z2#Analog]<55 pulse,13,0,5000 endif endon taskrun,3 if [Z3#Analog]<45 pulse,12,0,10000 endif timerSet,5,30 taskrun,3 if [Z3#Analog]<45 pulse,12,0,5000 endif timerSet,6,30 taskrun,3 if [Z3#Analog]<45 pulse,12,0,5000 endif endon Pewnie kilka rzeczy zrobiłem w sposób trudniejszy niż można było to zrobić albo niezgodnie ze sztuką ale chyba to w tej całej zabawie jest najfajniejszego.
  10. Cześć, Jak włączyć/wyłączyć zasilanie pasożytnicze na czujniku DS18B20? Z góry dziękuję. PS.: Przepraszam jeśli dałem temat w złej kategorii...
  11. Co może zrobić uczeń podstawówki, kiedy nie można w szkole używać telefonów? Specjalny kalkulator! Tak, wiem że urządzenie jest trochę przekombinowane - za pare zł mam nowy kalkulator z kiosku, ale to nie jest zwykły kalkulator.Ten kalkulator, albowiem, robiłem ja Budowa Urządzenie posiada wyświetlacz TFT 1.8" ze slotem na kartę pamięci, z której możemy odtwarzać zdjęcia. Do wprowadzania informacji posłużyła mi klawiatura 4x4 w formie naklejki. Całość napędza Arduino Pro Mini, które przeprogramowałem na korzystanie z wewnętrznego kwarcu 8Mhz i wyłączenie BOD. Energię dostarcza akumulator Lipo wyjęty z tableta, ładowany przez dolutowanie się do akusa. Napięcie obniża stabilizator AMS1117 na 3,3v, co rozwiązało kwestię napięcia logiki (TFT ma 3.3v, arduino normalnie 5v) oraz zużycia energii. Wyświetlacz, do programowania, można zdejmować. Po prawej stronie dostrzegamy przełącznik włączający urządzenie, zaś pod TFT znajduje się przycisk funkcyjny. Obudowy nie chciałem robić, gdyż chciałem wzbudzić zainteresowanie wśród kolegów Funkcje Kalkulator ma funkcję liczenia. Wow. Potrafi dzielić, mnożyć, dodawać i odejmować liczby dziesiętne, dodatnie i ujemne - ale nie umie wykonywać kolejności działań (dlatego według kalkulatora 2+2x2=8). ALE. Oprócz kalkulatora, utworzyłem aplikację paint - służy do malowania piksel po pikselu. Dobre na nudne lekcje polskiego. Po włączeniu urządzenia, wyświetla nam się lista dostępnych aplikacji. Oprócz niedokończonego snejka, jest jeszcze "czwarta aplikacja" - ściąga Wyświetla ona wzory z fizyki, chemii i matematyki oraz prawa dynamiki Newtona. Kalkulator może również w progmemie przechować jedno kolorowe zdjęcie, i wyświetlić je po 8x naciśnięciu przycisku Równa się. Taki kalkulator to fajna rzecz, z racji tego że można go używać w szkole bez ograniczeń i da się na nim pobawić. W ostateczności przeglądać memy, po włożeniu karty SD. Pozdrawiam, Leoneq :3
  12. Budowa tego projektu zaczęła się od tego, że znajomy zapytał, czy bym czegoś nie wymyślił, ponieważ on posiada w domu piec na ekogroszek z zasobnikiem na węgiel i czasem zapomina dosypywać węgla i gaśnie mu w piecu. Wykonałem więc nadajnik z ultradźwiękowym czujnikiem odległości HC-SR04 , który przekazuje dane do odbiornika bezprzewodowo za pomocą modułu nRF24L01. Gotowy odbiornik i nadajnik wygląda tak, jak na zdjęciu niżej. Do budowy wykorzystałem: Dwie sztuki Arduino Pro Mini 328 - 5V/16MHz Dwie sztuki moduł radiowy nRF24L01 Ultradźwiękowy czujnik odległości HC-SR04 Buzzer z generatorem 5V 12mm Zestaw diod LED 5mm Rezystory 100 ohm, 110 ohm i 190 ohm Dwie sztuki Stabilizator LDO 3,3V Dwie sztuki Kondensator elektrolityczny 10uF/50V Dwie sztuki Zasilacz impulsowy 5V / 1,2A Obudowy plastikowe Całość zmontowałem na płytkach z OSH Park MySensor 3.3V Pro Mini or 5V Pro Mini Diody LED i buzzer zamontowałem na płytce uniwersalnej. Schemat nadajnika. Schemat odbiornika. Kod programu Arduino nadajnika. #include <SPI.h> #include "RF24.h" int msg[1]; const uint64_t pipe = 0xF0F0F0F0A1LL; RF24 radio(9,10); #define trigPin 3 #define echoPin 4 void setup(){ Serial.begin (9600); pinMode(trigPin, OUTPUT); //Pin, do którego podłączymy trig jako wyjście pinMode(echoPin, INPUT); //a echo, jako wejście radio.begin(); radio.openWritingPipe(pipe); radio.setPALevel(RF24_PA_MAX); //Maxymalna moc nadajnika } void loop(){ long czas, dystans; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); czas = pulseIn(echoPin, HIGH); dystans = czas / 58; Serial.print(dystans); Serial.println(" cm"); msg[0] = dystans; radio.write(msg, 1); // Wysylanie wartosci ze zmiennej msg delay(500); } Kod programu do odbiornika. #include <SPI.h> #include "RF24.h" const uint64_t pipe = 0xF0F0F0F0A1LL; RF24 radio(9,10); int msg[1]; void setup(){ //Serial.begin (9600); pinMode(3, OUTPUT); //led czerwona pinMode(4, OUTPUT); //led zolta pinMode(5, OUTPUT); //led pierwsza zielona pinMode(6, OUTPUT); //led druga zielona pinMode(7, OUTPUT); //led trzecia zielona pinMode(8, OUTPUT); // buzer radio.begin(); radio.openReadingPipe(1,pipe); radio.startListening(); } void loop(){ if(radio.available()){ radio.read(msg, 1); Serial.print(msg[0]); Serial.println(" cm"); if (msg[0] >= 57) { //odlegolsc max kiedy wlacza sie buzer digitalWrite(3, HIGH); digitalWrite(4, LOW); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(8, HIGH); delay(5000); digitalWrite(3, HIGH); digitalWrite(4, LOW); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(8, LOW); delay(1800000); } else { digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, HIGH); digitalWrite(8, LOW); } if (msg[0] >= 43 && msg[0] <57) { digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(8, LOW); } if (msg[0] >= 29 && msg[0] < 43) { digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(8, LOW); } if (msg[0] >= 15 && msg[0] < 29) { digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, LOW); digitalWrite(8, LOW); } if (msg[0] >= 15 && msg[0] < 2) { digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, HIGH); digitalWrite(8, LOW); } } delay(500); } Kod programu odbiornika, jest napisany tak, że gdy poziom węgla spadnie do 57 cm od góry, włącza się buzer na 5 sekund i świeci czerwona dioda i jeżeli nie dosypiemy węgla, buzer włączy się znowu za pół godziny na 5 sekund, po dosypaniu węgla trzeba nacisnąć przycisk reset, który wyprowadziłem za pomocą przycisku na obudowie lub odczekać pół godziny. Zasobnik na węgiel wygląda tak. Zmontowany nadajnik z ultradźwiękowym czujnikiem odległości HC-SR04. Nadajnik jest zamontowany na górze metalowego zasobnika na węgiel, przed montażem zostały wywiercone 2 otwory w zasobniku, tak aby pasowały wystające okrągłe elementy czujnika HC-SR04. Zmontowany układ na płytce MySensors dostępnej w OSH Park, długość to około 10 cm. Ponieważ zastosowałem 5 diod, które informują o stanie węgla, to 57 cm podzieliłem na 4, co daje około 14 cm i gdy poziom węgla spadnie o 14 cm gasną kolejne diody, aż do 57 cm i wtedy świeci się czerwona dioda i włącza buzer na 5 sekund. Program możemy dowolnie modyfikować, aby dostosować do wysokości pojemnika na węgiel. Działanie całości widać na poniższym filmie. Całość działa już 2 lata bez awarii i na czas dosypywania ekogroszku, nadajnik jest zdejmowany i czasem przedmuchany z pyłu.
  13. Niskobudżetowy zegar Nixie Każdy elektronik chyba kiedyś widział urządzenie oparte o lampy Nixie. Z racji ich uroku, niepowtarzalnego wyglądu i chęci zrobienia czegoś "wow", i ja taki zbudowałem. Działanie lamp Nixie: Dla tych, którzy nie wiedzą co lampy Nixie, już służę pomocą: lampy Nixie zostały wynalezione w latach 60. ubiegłego wieku. Pierwsza firma która je produkowała tak je nazwała i się ta nazwa przyjęła. Były też to pierwsze wyświetlacze cyfrowe. Ich działanie polega na jonizowaniu się gazu (neonu z domieszkami) wokół katody z przyłożonym napięciem ok. 180V. Zjonizowany gaz powoduje świecenie się, i układa się wokół katody (w tym przypadku cyfry). Na żywo wygląda to bezcennie, lecz należy pamiętać że to wysokie napięcie. Budowa: Ale może najpierw coś o mnie: nazywam się Leon, mam 14 lat, chodzę do 8 klasy podstawówki i interesuję się elektroniką, informatyką, itp. Mam też drukarkę 3D - nie wykorzystałem jej w konstrukcji z racji jej awarii (czekam jeszcze na nowego rampsa ). Przechodząc już do zegara: z racji mojego stosunkowo młodego wieku, nie mam zbyt dużo pieniędzy na projekty więc chciałem na całość przeznaczyć ok. 100 zł zebranych od dziadków. Dlatego miało wyjść tanio i dobrze. Założenia z góry były jasne: multiplexowanie 1 sterownikiem, użycie 4 lamp, oraz materiałów z odzysku. Zacząłem od zrobienia przetwornicy step-up na 200V prądu stałego. Skorzystałem z tego schematu, który się sprawdził dość dobrze. Potem przyszedł mi sterownik 74141, oraz neonówka - mogłem już sprawdzić czy wszystko działa, i działało za pierwszym razem (możecie zacząć budować bunkier na apokalipsę). Następnie przeszedłem do zrobienia płytki głównej - goła atmega 328 z kwarcem 16mhz, ze sterownikiem na jednej płytce. Od razu zamontowałem moduł czasu RTC DS1302 (najtańszy) który lekko zmodyfikowałem - piny dałem z drugiej strony, a na górze zamontowałem koszyczek na dużą baterię od biosa. Do tego doszedł stabilizator 7805 i sterownik katod lamp. Całość wyszła całkiem schludnie - jestem z tego zadowolony. Na końcu doszły mi tranzystory do sterowania anodami lamp. Zastosowałem tu klucz z NPN MPSA42 oraz PNP MPSA92. I tutaj, podczas testów zrobiłem błąd - z racji małego protoboarda zrobiło się zwarcie, przez które zjarałem mój pierwszy rezystor w życiu (!), a tranzystory jakoś działały dalej. Po naprawieniu usterki 1 lampa działała - mogłem wyświetlić wszystkie cyfry od 0 do 9. Mogłem też zmierzyć, że napięcie zapłonu wynosi 180V i obniża się do 140V napięcia pracy. Teraz zostało mi zrobić podstawki - model pod lampy IN-12 do druku mogę udostępnić, ale z racji uszkodzenia płyty musiałem je zrobić sam. Wziąłem więc starą pokrywkę od farby, wyciąłem prostokąty, markerem zaznaczyłem miejsca na piny wdg. datasheetu, mini wiertarką wywierciłem otwory. Musiałem przygotować też same piny do podstawek - użyłem tu rozwierconych pinów z podstawek precyzyjnych, a następnie młotkiem wbiłem we wcześniej przygotowaną podstawę. Elektronika była gotowa, więc zacząłem programować. Po chwili dodałem mikrofon elektretowy, aby po klaśnięciu zegar się sam wyłączył, i od razu przeświecił wszystkie cyfry w celu uniknięcia efektu zatrucia katod. Zauważyłem też, że cewka w przetwornicy się dość mocno grzeje - dałem więc kapkę pasty termoprzewodzącej z domieszkami złota i przykleiłem radiator. Została mi już najgorsza część - obudowa. Normalnie bym takową wydrukował, ale że nie mogłem, wyciąłem ze sklejki listewki które pomalowałem szprejem na czarny mat. Wywierciłem otwory, poskręcałem śrubami M2,5. Wyszło źle, krzywo, niedokładnie - po prostu do d.... , pewnie dlatego że to była moja pierwsza obudowa ze sklejki, i z pewnością wydrukuję później obudowę (post zaktualizuję). Z daleka, jak patrzymy na zegar, wygląda on ciekawie - czarna bryła, lampy rosyjskiej produkcji i to klaśnięcie - wszystko to sprawia, że zegar dodaje niepowtarzalny klimat do pokoju. Zegar robiłem cały tydzień szkolny. Działanie zegara: Zegar wyposażyłem w klawiaturę 3 przycisków - "+", "-", oraz "prog". Przytrzymując przycisk prog możemy nastawić zegar, klikając odpowiednio + i -, oraz kliknąć prog ponownie by nastawić kolejną cyfrę. Podczas zwykłego działania, kliknięcie + spowoduje wyświetlanie się minut oraz sekund, a - będzie wyświetlał godziny i minuty. Dodatkowo, jeżeli podczas uruchamiania zegara przytrzymamy przycisk +, zostanie wywołany efekt "slot machine". Całość programowałem w środowisku Arduino, za pomocą programatora USBASP. Lista zakupów: 4x lampy IN-12 - ok. 10zł/sztuka, 50zł całość (+przesyłka) konwerter step-up - jakieś 20zł za całość sterownik, neonówka i przesyłka - 20zł tranzystory z drobiazgami - 20zł ----------------------------------------------------------------------- Za całość zapłaciłem jakieś 110zł. Resztę elementów już miałem. Dość nieźle, kiedy najtańsze zegary były chyba za ok. 300zł. Cudem jest fakt, że przeżyłem - akurat teraz mnie nic nie kopnęło, ale wcześniej doświadczyłem mocy napięcia gniazdkowego (długa historia). Sam zegar przyniósł mi dużo pochwał, szacunek u kolegów, 6 z fizyki na semestr - to tak jak te cudowne aplikacje na androida Od siebie jeszcze powiem, że na pewno zegar rozbuduję i wzbogacę o nowe funkcje. Co dalej? Mam w planach kalkulator domowej roboty, z kolegą zbudowałem już działający prototyp urządzenia podlewającego rzeżuchę. Oczywiście zachęcam do budowy zegara, ale należy pamiętać o wysokim napięciu. Pozdrawiam, Leoneq :3
  14. Witam, zabieram się za budowę robota podwodnego wykorzystując Arduino, robot niewielki, 3 silniki DC i mam kilka pytań co do kwestii komunikacji i sterowania: 1. Czy za pomocą arduino UNO oraz modułu sterowania silnikami 4-kanałowym uda mi się sterować silnikami DC ? I jak zasilić taki shield wraz z UNO czy wystarczy zasilanie z odpowiedniego akumulatora Li-lon ? 2. Jak rozwiązać kwestie sterowania robotem? Rozwiązanie bezprzewodowe wydaje mi się bezsensowne pod wodą przez zakłócenia fal ( może się mylę). Natomiast nie wiem do końca jak rozwiązać sterowanie przewodowe, czy za pomocą pada np. od PS2 i skrętki? 3. Czy jest kamera arduino która spełni swoje zadanie i jak przesłać dane do PC lub urządzenia? Czytałem, że wystarczy kamerka internetowa na USB przerobiona na RJ45 i podpięta do PC, ale do końca nie jestem pewny czy na długim kablu takie rozwiązanie się sprawdzi. Czy LAN będzie najlepszym rozwiązaniem czy też może inny pomysł? Jeśli ethernet to jaki moduł wystarczy ? Dzięki za wszystkie rady :)
  15. Cześć, potrzebuję pomocy z zasilaniem robota. Robot to linefollower oparty na arduino. -podwozie https://abc-rc.pl/product-pol-7655-Podwozie-robota-2WD-RT-4-140mm-2-silniki-z-enkoderami-platforma-mobilna.html -sterownik silników DC https://abc-rc.pl/product-pol-6196-Modul-sterownika-L298N-do-silnikow-DC-i-krokowych-Arduino.html. Najpierw myślałem o zwykłym koszyku na baterie AA ale po czasie odszedłem od tego bo w póżniejszych projektach i tak predzej czy poziej bym musiał przejść na akumulatorki które można ładować. Myślałem nad 2 celami Li-ion tylko nie wiem jak zaprojektować te zasilanie. Na pewno trzeba będzie obniżyć napięcie całego koszyka z celami i kontrolowac napiecie cel by nie spadło do poziomu gdy już będą nie do odratowania. O czymś jeszcze trzeba pomyśleć? Proszę o pomoc w zaprojektowaniu tego zasilania.
  16. Cześć Ostatnio zepsułem swoją kartę RFID. Mając moduły PN532 oraz RC522 chciałem ją sobie sklonować. Problem pojawił z wgraniem UID na kartę. Posiadam 7 bitowe ID a potrafie zmienić jedynie 4 bitowe ID na karcie. Biblioteki Adafruit oraz PN532 umożliwiają jedynie odczytanie informacji z karty. Znacie jakieś biblioteki które umożliwiają sklonowanie kart z 7 bitowym UID? Widziałem pare filmików na YT gdzie arduino z PN532 "klonuje" karty lecz poza całym widowiskiem nie udało mi się znaleźć żadnego kodu który by to umożliwiał. Dzięki wielkie za wszelką pomoc
  17. AJAX umożliwia przekazywanie danych pomiędzy klientem a serwerem WWW bez konieczności przeładowania strony. Dodając do tego timer w JavaScript możemy uzyskać świeże dane na stronie generowanej przez ESP8266. Na początek stwórzmy w PHP najprostszą stronę WWW prezentującą aktualną godzinę pobieraną z serwera (nie "JavaScriptovy" czas z przeglądarki - w końcu docelowo chcemy pobierać dane z czujników podłączonych do "serwera WWW" postawionego na ESP8266): <? if ($_REQUEST["time"]) { echo date("G:i:s"); exit; } ?> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>AJAX test</title> </head> <body> <span id="time"></span> <script> myTimer(); var myVar = setInterval(myTimer, 1000); function myTimer() { var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { document.getElementById("time").innerHTML = this.responseText; } }; xhttp.open("GET", "test.php?time=1", true); xhttp.send(); } </script> </body> </html> Timer co sekundę przywołuje funkcję myTimer(); var myVar = setInterval(myTimer, 1000); a ta pobiera zawartość podstrony test.php?time=1 i wstawia ją do elementu o nazwie "time" (document.getElementById("time").innerHTML = this.responseText;). Mamy tu tylko jeden przekazywany parametr. Co zrobić, by aktualizować kilka różnych wartości? Przywykłem do podstrony przekazującej parametry rozdzielone znakiem ; (odczyt1;odczyt2;odczyt3). Dzięki JavaScriptowej funkcji split możemy podzielić taki ciąg znaków na tablice, a potem przydzielić jej części do elementów SPAN o określonym ID. <? if ($_REQUEST["time"]) { echo date("d.m.y;G:i:s"); exit; } ?> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>AJAX test</title> </head> <body> Date: <span id="date"></span><br> Time: <span id="time"></span> <script> myTimer(); var myVar = setInterval(myTimer, 1000); function myTimer() { var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { var str = this.responseText; var values = str.split(";"); document.getElementById("date").innerHTML = values[0]; document.getElementById("time").innerHTML = values[1]; } }; xhttp.open("GET", "test.php?time=1", true); xhttp.send(); } </script> </body> </html> Działa! PHP po zainstalowania serwera np NGINX możemy uruchomić na Raspberry Pi. W połączeniu (komenda system()) z zewnętrznym skryptem Python lub programem w C korzystającym z WiringPi otrzymamy stronę z odczytami czujników hostowaną na Raspberry Pi! Spróbujmy wreszcie zaprogramować mikrokontroler ESP8266. Podłączmy najpierw czujnik BME280. /* I2C D4 - SCL D3 - SDA */ #include <ESP8266WiFi.h> #include <WiFiClient.h> #include <ESP8266WebServer.h> #include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_BME280.h> char* ssid = "Weather"; //const char *password = ""; ESP8266WebServer server(80); Adafruit_BME280 bme; void setup() { Serial.begin(9600); Wire.begin(D3, D4); Wire.setClock(100000); if (!bme.begin(0x76)) //changed from default I2C adress 0x77 { Serial.println("Nie odnaleziono czujnika BMP085 / BMP180"); while (1) { } } IPAddress apIP(192, 168, 1, 1); WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0)); // WiFi.softAP(ssid, password); WiFi.softAP(ssid); server.on("/", handleRoot); server.on("/sensors", handleSensors); server.begin(); } void loop() { server.handleClient(); } void handleRoot() { String content = "<html> <head><title>Weather</title></head><body>"; content += "<DIV style=\"display:table; font-size: large;\"><DIV style=\"border-style: solid;\">BME280:<BR>Temperature: <span id=\"tempBME\"></span>C<br>Humidity: <span id=\"humBME\"></span>%<br>Pressure: <span id=\"presBME\"></span>Pa<br></DIV>"; content += "<script>myTimer();var myVar = setInterval(myTimer, 1000);function myTimer() {var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { var str = this.responseText; var values = str.split(\";\"); document.getElementById(\"tempBME\").innerHTML = values[0]; document.getElementById(\"humBME\").innerHTML = values[1]; document.getElementById(\"presBME\").innerHTML = values[2];} }; xhttp.open(\"GET\", \"sensors\", true); xhttp.send();}</script>"; content += "</body></html>"; server.send(200, "text/html", content); } void handleSensors() { String content = String(bme.readTemperature()) + ";" + String(bme.readHumidity()) + ";" + String((int)bme.readPressure()) + ";"; server.send(200, "text/html", content); } Rozdzielanie danych przecinkiem czy średnikiem nie jest sposobem "zbyt profesjonalnym". Przy dużej ilości zmiennych łatwo też o pomyłkę. Dlatego lepiej wtedy stosować bardziej odpowiednie formaty danych: JSON czy XML. Ze względu na "bliskość" JSON z JavaScript skupię się tylko na nim. Gotowa biblioteka ArduinoJson wygeneruje dane za nas. Więcej informacji znajdziemy w rozdziale Serialize with ArduinoJson dokumentacji technicznej. /* I2C D4 - SCL D3 - SDA */ #include <ESP8266WiFi.h> #include <WiFiClient.h> #include <ESP8266WebServer.h> #include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_BME280.h> #include <ArduinoJson.h> //https://github.com/bblanchon/ArduinoJson char* ssid = "Weather"; //const char *password = ""; ESP8266WebServer server(80); Adafruit_BME280 bme; void setup() { Serial.begin(9600); Wire.begin(D3, D4); Wire.setClock(100000); if (!bme.begin(0x76)) //changed from default I2C adress 0x77 { Serial.println("Nie odnaleziono czujnika BMP085 / BMP180"); while (1) { } } IPAddress apIP(192, 168, 1, 1); WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0)); // WiFi.softAP(ssid, password); WiFi.softAP(ssid); server.on("/", handleRoot); server.on("/sensors", handleSensors); server.begin(); } void loop() { server.handleClient(); } void handleRoot() { String content = "<html> <head><title>Weather</title></head><body>"; content += "<DIV style=\"display:table; font-size: large;\"><DIV style=\"border-style: solid;\">BME280:<BR>Temperature: <span id=\"tempBME\"></span>C<br>Humidity: <span id=\"humBME\"></span>%<br>Pressure: <span id=\"presBME\"></span>Pa<br></DIV>"; content += "<script>myTimer();var myVar = setInterval(myTimer, 1000);function myTimer() {var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { var str = this.responseText; var values = JSON.parse(str); document.getElementById(\"tempBME\").innerHTML = values.temp; document.getElementById(\"humBME\").innerHTML = values.hum; document.getElementById(\"presBME\").innerHTML = values.press;} }; xhttp.open(\"GET\", \"sensors\", true); xhttp.send();}</script>"; content += "</body></html>"; server.send(200, "text/html", content); } void handleSensors() { String content; StaticJsonBuffer<400> jsonBuffer; JsonObject& root = jsonBuffer.createObject(); root["temp"] = bme.readTemperature(); root["hum"] = bme.readHumidity(); root["press"] = (int)bme.readPressure(); root.printTo(content); server.send(200, "text/html", content); } Strona prezentować się będzie tak samo jak poprzednio. Zyskamy za to wygodny i czytelny sposób dopisywania nowych danych root["temp"] = bme.readTemperature(); oraz ich odczytywania w kodzie źródłowym strony: document.getElementById(\"tempBME\").innerHTML = values.temp; Nie przejmujemy się już numeracją elementów długiej tablicy. Sytuację możemy też odwrócić tworząc stronę WWW, której formularz sterować będzie pracą naszego fizycznego urządzenia. Oczywiście nadal niekonieczne będzie przeładowanie strony, by wysłać dane. #include <ESP8266WiFi.h> #include <WiFiClient.h> #include <ESP8266WebServer.h> char* ssid = "Weather"; //const char *password = ""; int ledValue = 0; ESP8266WebServer server(80); void setup() { Serial.begin(9600); IPAddress apIP(192, 168, 1, 1); WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0)); // WiFi.softAP(ssid, password); WiFi.softAP(ssid); server.on("/", handleRoot); server.begin(); pinMode(D1, OUTPUT); analogWriteRange(100); //http://esp8266.github.io/Arduino/versions/2.0.0/doc/reference.html analogWriteFreq(500); } void loop() { server.handleClient(); analogWrite(D1, ledValue); } void handleRoot() { if (server.hasArg("ledVal") && server.arg("ledVal").toInt() >= 0 && server.arg("ledVal").toInt() <= 100) { ledValue = server.arg("ledVal").toInt(); Serial.print("ledVal "); Serial.println(ledValue); server.send(200, "text/html", ""); return; } //https://www.w3schools.com/howto/howto_js_rangeslider.asp //https://stackoverflow.com/questions/9713058/send-post-data-using-xmlhttprequest String content = "<!DOCTYPE html>" "<html>" "<head>" "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">" "<title>Luminosity setter</title>" "<style>" ".slidecontainer {" "width: 1024px;" "margin: 0 auto;" "text-align: center;" "}" ".slider {" " -webkit-appearance: none;" " width: 100%;" " height: 25px;" " background: #d3d3d3;" " outline: none;" " opacity: 0.7;" " -webkit-transition: .2s;" " transition: opacity .2s;" // " margin-left: 20px;" // " margin-right: 20px;" "}" ".slider:hover {" " opacity: 1;" "}" ".slider::-webkit-slider-thumb {" " -webkit-appearance: none;" " appearance: none;" " width: 25px;" " height: 25px;" " background: #4CAF50;" " cursor: pointer;" "}" ".slider::-moz-range-thumb {" " width: 25px;" " height: 25px;" " background: #4CAF50;" " cursor: pointer;" "}" "</style>" "</head>" "<body>" "<div class=\"slidecontainer\">" " <input type=\"range\" min=\"0\" max=\"100\" value=\"" + String(ledValue) + "\" class=\"slider\" id=\"myRange\">" " <p>Value: <span id=\"demo\"></span>%</p>" "</div>" "<script>" "document.getElementById(\"demo\").innerHTML = document.getElementById(\"myRange\").value;" "document.getElementById(\"myRange\").oninput = function() {" " document.getElementById(\"demo\").innerHTML = this.value;" "var data = new FormData();" "data.append('ledVal', this.value);" "var xhr = new XMLHttpRequest();" "xhr.open('POST', '/', true);" "xhr.onload = function () {" " console.log(this.responseText);" "};" "xhr.send(data);" "}" "</script>" "</body>" "</html>"; server.send(200, "text/html", content); } W tym przypadku przesunięcie suwaka na stronie sterującej wywoła natychmiastową zmianę jasności diody LED podłączonej odpowiednim rezystorem do pinu D1.
  18. Ostatnio mając chwilę czasu postanowiłem spróbować jakiegoś symulatora arduino a , że na forbocie czytałem kiedyś o SimulIDE więc pobrałem przetestowałem chwilę nawet mi się spodobało ale postanowiłem poszukać jeszcze jakiejś alternatywy i znalazłem wersję online thincercad, który jest bardzo kolorowy ale jakoś mi nie podpasował więc wróciłem do SimulIDE. W trakcie zapoznawania się z programem trafiłem na książkę: Arduino Internals (osobiście bardzo polecam). Jeden z rozdziałów był poświęcony metodzie Charlieplexing. Dzięki , której do arduino (lub do innego mikrokontrolera) można podpiąć imponującą liczbę diod led. Ilość diod określana jest wzorem: n * (n-1) gdzie n to liczba pinów jakie chcemy poświęcić. Czyli np. 3 * (3-1) = 6. Czyli 6 diod jakie można indywidualnie zaświecić mając do dyspozycji tylko 3 piny cyfrowe. Taki też układ stał się przedmiotem symulacji w SimulIDE. Tak to wygląda od strony połączenia. Na początek pomyślałem , że zaświecę każda diodę pojedynczo jedna po drugiej w kolejności jak na schemacie void setup() { } void loop() { pinMode(8, INPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); // led1 digitalWrite(10, HIGH); digitalWrite(9, LOW); delay(1000); //led2 digitalWrite(10, LOW); digitalWrite(9, HIGH); delay(1000); // led3 pinMode(8, OUTPUT); digitalWrite(8, HIGH); digitalWrite(9, LOW); pinMode(10, INPUT); delay(1000); // led4 digitalWrite(9, HIGH); digitalWrite(8, LOW); delay(1000); digitalWrite(9, LOW); //led5 pinMode(10, OUTPUT); pinMode(9, INPUT); digitalWrite(10, HIGH); digitalWrite(8, LOW); delay(1000); //led6 digitalWrite(8, HIGH); digitalWrite(10, LOW); delay(1000); digitalWrite(8, LOW); } sam skecz miałem zmodyfikować ale patrząc na zakładki w SimulIDE zobaczyłem , że jest opcja podglądu w rejestry wiec je wpisałem Tutaj akurat ledy są wyłączone. Bardzo ładnie widać jak zmieniają się wartości rejestrów przy włączonej symulacji. W zasadzie to można by powiedzieć , że dostajemy gotowca wystarczy tylko włączyć tryb debugowania i przechodzić linijka po linijce (w powyższym kodzie przy przechodzeniu z linijki na linijkę widać , że są momenty kiedy diody zaświecają nie dokładnie tak jak powinny i widać to w wartościach rejestru). Więc postanowiłem napisać skecz ustawiając wartości rejestrów. int HighLow[6] = {4,2,1,2,4,1}; int InOut[6] = {6,6,3,3,5,5}; void setup() { } void loop() { for (int i=0; i<6; i++) { PORTB = HighLow[i]; DDRB = InOut[i]; delay(500); } } Wyszło tego o wiele mniej i dokładniej (w trybie debugowania wszystko działa tak jak powinno). Na koniec postanowiłem przetestować jeden i drugi kod pod kontem wydajności. unsigned long score = 0; void setup() { Serial.begin(9600); } void loop() { while (millis() < 1000) { pinMode(8, INPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); // led1 digitalWrite(10, HIGH); digitalWrite(9, LOW); //delay(1000); //led2 digitalWrite(10, LOW); digitalWrite(9, HIGH); //delay(1000); // led3 pinMode(8, OUTPUT); digitalWrite(8, HIGH); digitalWrite(9, LOW); pinMode(10, INPUT); //delay(1000); // led4 digitalWrite(9, HIGH); digitalWrite(8, LOW); //delay(1000); digitalWrite(9, LOW); //led5 pinMode(10, OUTPUT); pinMode(9, INPUT); digitalWrite(10, HIGH); digitalWrite(8, LOW); //delay(1000); //led6 digitalWrite(8, HIGH); digitalWrite(10, LOW); //delay(1000); digitalWrite(8, LOW); score++; } Serial.println(score); while(1); } to prawie ten sam kod w pętli while plus zmienna score i na koniec while(1) int HighLow[6] = {4,2,1,2,4,1}; int InOut[6] = {6,6,3,3,5,5}; unsigned long score = 0; void setup() { Serial.begin(9600); } void loop() { while (millis() < 1000) { for (int i=0; i<6; i++) { PORTB = HighLow[i]; DDRB = InOut[i]; //delay(500); } score++; } Serial.println(score); while(1); } Analogicznie w tym przykładzie tutaj wyniki. 318267 do 10870... czyli ponad 29 razy szybciej. I tutaj moje pierwsze pytanie: Czy sam test jest przeprowadzony obiektywnie albo inaczej czy ArduinoIDE czy też funkcje w nim zawarte tak bardzo zwalniają wykonywanie operacji? czy ja coś źle zrobiłem :). I drugie pytanie czy ktoś mógł by wykonać ten sam test na arduino Due lub Stm32f103 Blue Pill korzystając z pierwszego kodu? Bardzo był bym ciekaw jakie były by wyniki. W załączniku dodaje plik projektu do SimulIDE. CharliePlexing.zip
  19. Witam, Dopiero zaczynam moją przygodę z Arduino i mam zamiar zrealizować projekt systemu sterowania rozjazdami na mojej makiecie kolejowej. Każdy rozjazd ma być przesuwany za pomocą zamontowanego pod makietą serwomechanizmu SG90 (razem 10 serwomechanizmów). Każde serwo reagować ma na zmianę pozycji swojego przełącznika dwupozycyjnego - w momencie przełączenia, zmienić pozycję o około 30 stopni i w niej pozostać, przy zmianie pozycji przełącznika do pierwotnej - serwo również ma wrócić do pozycji pierwotnej. Dodatkowo, przy każdym przełączniku mają być dwie diody, zawsze świecić ma się jedna z nich w zależności od pozycji, w jakiej znajduje się dany serwomechanizm. Posiadam Arduino Uno, oraz Adafruit servo shield pozwalający na podłączenie do 16 serw. Stąd moje pytanie do bardziej doświadczonych kolegów: czy przy użyciu Adafruit mogę coś takiego zrobić? Czy w ogóle przełączniki dwupozycyjne z dźwignią są do zastosowania w tego typu projekcie? Uwagi dotyczące połączeń i zaprogramowania mile widziane, za każdą pomoc z góry dziękuję
  20. 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.
  21. Dzień dobry, W swoim pierwszym wpisie, chciałbym przedstawić własną wersję sterownika światła sterowanego za pomocą aplikacji na androida. Sam sterownik składa się z: NodeMCU MODUŁ 2 PRZEKAŹNIKÓW 5V Dwóch przycisków Wspomagając się powyższym rysunkiem, zmontowałem całość korzystając z płytki uniwersalnej. NodeMCU łączy się z lokalną siecią WiFi. Do sterowania wykorzystuje bibliotekę aREST udostępniając funkcje on, off i get przyjmujące jako parametr numer przekaźnika. Kod w wersji skróconej i zdjęcia urządzenia do podejrzenia poniżej. // Rest and esp library #include <ESP8266WiFi.h> #include <aREST.h> // WiFi parameters const char* ssid = "ssid"; const char* password = "password"; const int SWITCH1 = 5; const int SWITCH2 = 16; const int RELAY1 = 12; const int RELAY2 = 14; const unsigned long INTERVAL = 500; bool relay1State = LOW; bool relay2State = LOW; bool switch1State = LOW; bool switch2State = LOW; unsigned long currentMillis = 0; unsigned long switch1Millis = 0; unsigned long switch2Millis = 0; aREST rest = aREST(); const int LISTEN_PORT = 80; WiFiServer server(LISTEN_PORT); int onControl(String value); int offControl(String value); int getControl(String value); void setup(void) { rest.set_id("10"); rest.set_name("Light Switches"); Serial.begin(115200); pinMode(SWITCH1, INPUT); pinMode(SWITCH2, INPUT); pinMode(RELAY1, OUTPUT); pinMode(RELAY2, OUTPUT); digitalWrite(RELAY1, !relay1State); digitalWrite(RELAY2, !relay2State); rest.variable("light1", &relay1State); rest.variable("light2", &relay2State); rest.function("on", onControl); rest.function("off", offControl); rest.function("get", getControl); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("Light Switches connected"); server.begin(); Serial.println("Light Switches address"); Serial.println(WiFi.localIP()); } void loop() { currentMillis = millis(); if (currentMillis - switch1Millis >= INTERVAL && digitalRead(SWITCH1)) { switch1State = !switch1State; if(switch1State==HIGH){ digitalWrite(RELAY1, LOW); relay1State = !LOW; } if(switch1State==LOW){ digitalWrite(RELAY1,HIGH ); relay1State = !HIGH; } switch1Millis = currentMillis; } if (currentMillis - switch2Millis >= INTERVAL && digitalRead(SWITCH2)) { switch2State = !switch2State; if(switch2State==HIGH){ digitalWrite(RELAY2, LOW); relay2State = !LOW; } if(switch2State==LOW){ digitalWrite(RELAY2,HIGH); relay2State = !HIGH; } switch2Millis = currentMillis; } WiFiClient client = server.available(); if (!client) { return; } while (!client.available()) { delay(10); } rest.handle(client); } int onControl(String value) { if (value=="0") { digitalWrite(RELAY1, LOW); relay1State = !LOW; switch1State = HIGH; return 0; } if (value=="1") { digitalWrite(RELAY2, LOW); relay2State = !LOW; switch2State = HIGH; return 0; } return -100; } int offControl(String value) { if (value=="0") { digitalWrite(RELAY1, HIGH); relay1State = !HIGH; switch1State = LOW; return 0; } if (value=="1") { digitalWrite(RELAY2, HIGH); relay2State = !HIGH; switch2State = LOW; return 0; } return -100; } int getControl(String value) { if (value=="0") { return relay1State; } if (value=="1") { return relay2State; } return -100; } Aplikacja składa się z czterech ekranów. Pierwszy to przełączanie żarówki przez przytrzymanie odpowiadającego jej pola na ekranie. Dwa kolejne odpowiadają za włącznie i wyłączenie wszystkich żarówek jednocześnie. Ostatni odpowiada za dodawanie i usuwanie połączeń, czyli wprowadzamy nazwę, adres urządzenia i numer przełącznika. Problemy i dalszy rozwój Jestem zadowolony z działania sterownika jedyny problem, jaki zaobserwowałem to przełączanie się przekaźników podczas podłączania innych urządzeń do przedłużacza, do którego jest wpięty. W aplikacji do bieżącej funkcjonalności chcę dodać włącznie wcześniej zdefiniowanych grup żarówek. I dodać nową funkcjonalności w postaci sterowania taśmami led, możliwość włączenia komputera, a także zakładkę gromadzącą wartości z czujników. Cały kod i aplikacja znajduje się w moim repozytorium
  22. Cześć, poszukuję osoby która podjęła by się wykonania kilku mechanizmów do gry typu escape room. Urządzenia są raczej proste, bazujące głównie na klawiaturach, czujnikach magnetycznych czy przekaźnikach. Jest tu pełna dowolność co do wykorzystywanej platformy (Arduino, STM). Pomysły są gotowe, kwestia wykonania samego mechanizmu/urządzenia, zamknięciu go w obudowie i zamontowaniu na miejscu - w escape roomie w BIelsku Białej. Możliwość dłuższej współpracy, zapewniam wprowadzenie do tematu i pomoc przy realizacji. Wynagrodzenie do ustalenia w zależności od stopnia złożoności i trudności mechanizmu. Zapraszam do kontaktu, opowiem więcej o zleceniu :) Pozdrawiam, Kamil
  23. Witam serdecznie, robię coś "ala inteligentny dom" i brakowało mi gpio na malince. Podłączyłem mcp23017 i działa:) Działa jako wyjście:/ Jak zrobić żeby działało jako wyjście? A takie ważniejsze i chyba trudniejsze pytanie (jak dla mnie) to: Jak połączyć malinkę z arduino przez usb?? tak żeby arduino działało jako we/wy?? Nie liczę na gotowca, ale jakieś wskazówki. Nie jestem też jakimś tam hiper, biper, diker informatykiem. Skoro potrafiłem podłączyć mcp23017 i "ledami mrugać" to myślę że arduino podłączę jako we/wy do malinki;) Pozdrawiam serdecznie;) p.s. Zapomniałem dodać, że to wszystko obsługuję na domoticz.
  24. Witam. Chcialbym poprosic o pomoc w dokonczeniu kodu do mojego malego projektu. Mianowicie chcialbym zrobic szafke zamykana silnikiem krokowym sterowanym przez arduino. Do mojego projektu wykorzystalem mechanizm osi Z z mojej starej drukarki 3D wraz z silnikiem i stepstickiem, ktory ma byc sterowany za pomoca arduino Nano. Po wcisnieciu przelacznika (takiego od swiatla w pokoju) w pozycji gornej na pin 13 w arduino zostaje podany stan wysoki co prowadzi do obracania sie silnika w prawo i tym samym uniesienie klapy od szafki. Zas wylacznik w pozycji dolnej podaje stan niski na pin 13 co sprawia, ze silnik sie kreci w lewo i zamyka klape. Tyle udalo mi sie zrobic. Schody zaczely sie gdy musze dodac przelaczniki typu endstop aby arduino wiedzialo kiedy ma zatrzymac silnik, poniewaz w tej chwili pracuje nieustannie albo w jedna albo w druga strone. Nie mam pojecia co nalezy dopisac lub co zmienic w istniejacym kodzie aby to dzialalo jak nalezy. Z gory dziekuje za pomoc. Oto moj kod : // Sterownik silnika krokowego do zamykania szafki // Arduino nano + silnik nema ze stepstickiem int Index; const int buttonPin = 13; // Przelacznik bistabilny int buttonState = 0; // Status przelacznika void setup() { pinMode(8, OUTPUT); //Enable pinMode(2, OUTPUT); //Step pinMode(5, OUTPUT); //Direction pinMode(buttonPin, INPUT); //Wylacznik digitalWrite(8,LOW); } void loop() { // Odczyt stanu przelacznika: buttonState = digitalRead(buttonPin); // Jesli przelacznik jest w pozycji gornej -5V- to stan wynosi HIGH - Obrot silnika w prawo: if (buttonState == HIGH) digitalWrite(5,HIGH); for(Index = 0; Index < 200; Index++) { digitalWrite(2,HIGH); delayMicroseconds(500); digitalWrite(2,LOW); delayMicroseconds(500); } // Odczyt stanu przelacznika: buttonState = digitalRead(buttonPin); // Jezeli przelacznik jest w pozycji dolnej -GND- to stan wynosi LOW - Obrot silnika w lewo: if (buttonState == LOW) digitalWrite(5,LOW); for(Index = 0; Index < 2000; Index++) { digitalWrite(2,HIGH); delayMicroseconds(500); digitalWrite(2,LOW); delayMicroseconds(500); } }
  25. Witam, mam problem z zasileniem arduino oraz serwomechanizmu. Otóż wymyśliłem to tak, że użyję akumulator Li-Po 1s w połączeniu z przetwornicą step-up (maksymalny prąd to 2A). Jednak po włączeniu wszystkiego serwo oraz arduino wariują. Natomiast gdy podłącze arduino do komputera poprzez usb a serwo do baterii lub zasilacza to wszystko działa poprawnie. Dodam też, że prędkość i kąt wychylenia serwa są sterowane poprzez moduł BT i gdy wszystko jest zasilane jest właśnie z baterii lub jednego zasilacza(atx) to moduł wysyła informacje z dużo wyższą częstotliwością (dioda TX miga znacznie szybciej i widać to na monitorze portu szeregowego).
×
×
  • Utwórz nowe...