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 193 wyników

  1. Witam. Chcę zrobić kierownice tylko trochę bardziej rozbudowaną czyli: kierownica 900*, sprzęgło, hamulec, gaz, skrzynia biegów 8+R (8 ponieważ gram w forze i tam niektóre samochody mają 7 lub 8 biegów), hamulec ręczny, kierunkowskaz, do tego boczny panel z max 20 guzikami + 2 analogowe joysticki (do grania w farming simulator). Teraz moje pytanie, ponieważ jedno arduino leonardo nie starczy do tego projektu to co zrobić my mieć tyle wejść w arduino. Jest jakich shield rozszerzający czy dokupić drugie arduino leonrado lub jakieś mini które komunikuje się przez usb też? I czy 2 rożne lub te same arduino można spiąć w jedno tak aby tylko jedno wysyłało dane do pc? Czy jesli kupie 3 pozycyjny przelacznik ( 1, 0 ,2) to czy będzie on mógł rozłączyć kierunkowskazy w grze. W farming simulator aby wyłączyć np. lewy kierunek trzeba kliknąć jeszcze raz guzik którym się włączało. Lub czy dał radę taki przełącznik jak jest w skuterach (gdy przełącznik jest w pozycji środkowej trzeba kliknąć go do środka aby się wyłączył) Mam pobrany program wheelConfig lecz bez podłączonego arduino nie mam tam wszystkich opcji dostępnych więc pytanie czy obsłuży on to wszystko co wymieniłem na początku. (EMC Utility Pro jest płatne a nie mam paypala). Jeśli wheel config nie podoła wszystkiemu to np. jeśli zainstaluje program do obsługi tego "bocznego panelu" to nie będzie się on gryzł w grze z wheel configiem? Tutaj temat na którym trochę się wzoruję i schemat do podłączenia połowy rzeczy których chcę
  2. Witam, Mam problem i to dosyć spory, ponieważ zepsułem swoje arduino leonardo w taki sposób, że podłączyłem zły zasilacz i zamiast DC, arduino otrzymało 12V AC. Zwracam się z pomocą gdzie szukać problemu i czy w ogóle istnieje możliwość naprawy. Chciałbym sam naprawić uszkodzony element. Dlatego też pisze na forum o pomoc od czego zacząć sprawdzanie czy dany element jest okej czy też nie. Oczywiście o ile jest możliwość wskrzeszenia tego maleństwa. Z góry dzięki za pomoc :). Ja osobiście na pierwszy rzut oka nie widzę żadnych zmian ale wrzucam zdjęcie dla osób które może coś dostrzegą.
  3. Witam chciał bym zaprezentować , drugą "lepszą wersję " kierownicy do komputera opartej na Arduino Leonardo. Film pokazujący jak dziala kierownica i Force Feedback: Jest to wersja elektronicznie taka sama jak poprzednia, wszystko opisane wcześniej link do poprzedniej tutaj : W tej wersji zmieniłem obudowę na znacznie mniejszą , lżejszą , łatwa do zamocowania przy stole, biurku itp. Obudowa została wykorzystana z kupionej przeze mnie za 50 zł kierownicy Logitech Formula Force Ex o obrocie 180* i Force Feedback. Dzięki temu że kierownica miała już przekładnie i ogólnie jest prosta w budowie , bardzo łatwo i tanio można ją przerobić tak aby miala kąt skrętu taki jak ustawimy sobie w programie np 720*,900* i Force Feedback do tego kąta obrotu. Tutaj link do gotowego software na Arduino Leonardo , od razu mówię że na Arduino Uno nie zadziała , link do pobrania w opisie filmu: Ja zrobiłem to tak: Na początku przez środek starej przekładni , dodałem pręt gwintowany o średnicy 10mm ,do którego z jednej strony mocowana jest kierownica, a z drugiej enkoder z drukarki canon ip2770. Aby zamocować enkoder musiałem wyciąć dziure jak widać na zdjęciu poniżej : Aby enkoder nie tarł o blat , dodałem plastikowe podkładki : A tak wygląda już gotowa sama kierownica: Wyjścia enkodera i do silnika , zostały przerobione na standardowych wyjściach które były w kierownicy i wchodzą do dodatkowej skrzynki w której znajduje się reszta elektroniki czyli w sumie tylko Arduino Leonardo i sterownik silników BTS7960: Jeszcze pedal box został przerobiony na taki aby miał 3 jednakowe pedały więc musiałem dokupić drugie takie same i wyciąć jeden i dokleić tak jak na zcjeciach . Schemat podłączenia wszystkiego w linku do wcześniejszej wersji. Efekt końcowy (pedały jeszcze stare): To by było na tyle , jeśli czegoś ktoś potrzebuje , śmiało pisać
  4. Witam! Chciałbym zaprezentować Wam lodówkę, którą sam zrobiłem. Elementy z których zbudowałem lodówkę: Sklejka 6mm styropian 30mm Zestaw radiatorów Wentylatory Ogniwo Peltiera 5A Przekaźnik Arduino UNO Czujnik temperatury DS18B20 2 przełączniki Gniazdo DC 5,5x2,5mm Zasilana jest zasilaczem 12V 7A. Tak duży prąd potrzebny jest do zasilania 5A ogniwa Peltiera , 2 wentylatorów i LED'ów. Nie był potrzebny aż tak mocny, ale tylko taki miałem pod ręką. Do zasilania "zabezpieczenia" używam 2A ładowarki. niestety za późno zorientowałem się, że będzie potrzebne, przez co nie podpiąłem bezpośrednio do zasilacza. Niestety, kupując zasilacz o tak wysokim natężeniu prądu nie przewidziałem, że nie posiadam odpowiedniego kabla zasilającego. W domu znalazłem tylko taki, który da MAX 2,5A. Obudowa jest wykonana ze sklejki o grubości 6mm pomalowanej czarną matową farbą do drewna. Wyłożona jest styropianem o grubości 3cm a drzwiczki zrobione są z 4mm pleksy. Po między pleksą a styropianem jest uszczelka, która choć częściowo zapobiega uciekaniu zimna. Lodówka posiada magnesy dzięki którym drzwiczki są przyciśnięte do uszczelki. W środku zamontowałem LED'y w dwóch kolorach: białym zimnym i niebieskim. Niebieski zapala się gdy drzwiczki są zamknięte a biały, gdy są są otwarte. Z tyłu obudowy są dwa przełączniki. Jeden służy do włączania LED'ów a drugi włącza wentylatory i ogniwo Peltiera. Do chłodzenia lodówki użyłem modułu wentylatora z radiatorami przeznaczonego do ogniwa Peltiera. Niestety od zimnej strony ogniwa, mniejszy radiator nie ma wentylatora, więc musiałem go dokupić. Jego wymiary to 40mm x 40mm x10mm Obok przycisków jest otwór przez który wlatuje powietrze. Radiator z tyłu obudowy bardzo się grzał przez co musiałem wymyślić coś dzięki czemu temperatura była by stabilizowana i ograniczana. Wpadłem na pomysł aby przy temperaturze 45°C ogniwo było odłączone na 100 sekund(wentylatory wciąż pracują). W tym czasie wentylator chłodzi radiator. Do odłączenia zasilania ogniwa użyłem przekaźnika, Arduino UNO i czujnika temperatury DS18B20+. Chciałem użyć Nano, ale jak na złość wszystkie były uszkodzone. Do Arduino wgrałem odpowiedni program i podłączyłem wszystko na płytce stykowej. Dodatkowo temperaturę można sprawdzać na komputerze komunikując się z płytką przez interfejs UART. #include <OneWire.h> #include <DallasTemperature.h> OneWire oneWire(A3); //Podłączenie do A3 DallasTemperature sensors(&oneWire); //Przekazania informacji do biblioteki #define przekaznik 7 void setup(void) { pinMode(przekaznik, OUTPUT); Serial.begin(9600); sensors.begin(); //Inicjalizacja czujnikow } void loop(void) { sensors.requestTemperatures(); //Pobranie temperatury czujnika Serial.print("Temperatura radiatora to: "); Serial.println(sensors.getTempCByIndex(0)); delay(1000); if(sensors.getTempCByIndex(0) >45){//Jesli temperatura radiatira jest wyzsza niz 45 stopni digitalWrite(przekaznik, HIGH); delay(100000); digitalWrite(przekaznik,LOW); } } Niestety, na ten moment nie posiadam termometru, którym mógł bym sprawdzić różnicę temperatury. Ale po około 30 min pracy napój w puszce lekko się schłodził. Może nie jest bardzo wydajna ale mi wystarcza.
  5. Witam. Mam problem z wgraniem programu na klon Arduino Nano. wcześniej było wszysko ok do czasu tego błędu podczas wgrywania. avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0xa6 Dziwne jest też to że czasa,i końcówka błędu jest np. resp=0x4a lub resp=0x28 Gdy korzystałem z tego Arduino czuć było, że coś zaczęło śmierdzieć. Biorę także możliwość, że to ja coś uszkodziłem. Czy miał ktoś podobny problem. Da się to naprawić czy zostaje kosz?
  6. Czesc. Zmontowalem sobie uklad ktory bedzie sterowal silnikami: przod i tyl. Program wgrany do nadajnika i odbiornika, ladnie pieknie wszystko pokazane w monitorze portu szergowego, ze pozycje joysticka sa odczytane lecz silniki nie ruszaja sie. Moze mi ktos wytlumaczyc dlaczego tak sie dzieje? Zasilanie 2x 18650 przetwornica wyregulowane na 6V - silniki + arduino uno/ joystick shield + uno - zasilanie z portu usb. Silniki normalne kreca sie podpiete jak na schemacie i podanie tych wartosci co w kodzie, ale bez nrfa i joysticka wiec sa sprawne oraz mostek h. Sprawdzalem tez na innym joystick shieldzie i tez tez nie dziala Czasami mi w terminalu takie cos wyskakuje (zalacznik) To nie sa bledy? RF24 wersja 1.1.6 Kod Nadajnika (joystick shield+ uno): #include <SPI.h> #include "RF24.h" #define ce 9 #define csn 10 RF24 myRadio (ce, csn); byte addresses[][6] = {"0"}; struct package { int X=1; int Y=1; }; typedef struct package Package; Package data; void setup() { Serial.begin(115200); delay(100); myRadio.begin(); myRadio.setChannel(115); myRadio.setPALevel(RF24_PA_MIN); myRadio.setDataRate( RF24_250KBPS ) ; myRadio.openWritingPipe( addresses[0]); delay(100); } void loop() { myRadio.write(&data, sizeof(data)); Serial.print("X:"); Serial.print(data.X); Serial.print(" Y"); Serial.println(data.Y); data.X = analogRead(A0); data.Y = analogRead(A1); delay(100); } Kod odbiornika (uno + silniki): #include <SPI.h> #include "RF24.h" #define ce 9 #define csn 10 RF24 myRadio (ce, csn); struct package { int X=351; int Y=328; }; byte addresses[][6] = {"0"}; int OUT1 = 5; int OUT2 = 6; int OUT3 = 7; int OUT4 = 8; typedef struct package Package; Package data; void setup() { Serial.begin(115200); delay(1000); myRadio.begin(); myRadio.setChannel(115); myRadio.setPALevel(RF24_PA_MAX); myRadio.setDataRate( RF24_250KBPS ) ; myRadio.openReadingPipe(1, addresses[0]); myRadio.startListening(); pinMode(OUT1, OUTPUT); pinMode(OUT2, OUTPUT); pinMode(OUT3, OUTPUT); pinMode(OUT4, OUTPUT); } void loop() { if ( myRadio.available()) { while (myRadio.available()) { myRadio.read( &data, sizeof(data) ); } Serial.print("X:"); Serial.print(data.X); Serial.print(" Y"); Serial.println(data.Y); int X = data.X; int Y = data.Y; if(Y>400){ digitalWrite(OUT1,1); digitalWrite(OUT2,0); digitalWrite(OUT3,0); digitalWrite(OUT4,1); }else if(Y<200){ digitalWrite(OUT1,0); digitalWrite(OUT2,1); digitalWrite(OUT3,1); digitalWrite(OUT4,0); } else{ digitalWrite(OUT1,0); digitalWrite(OUT2,0); digitalWrite(OUT3,0); digitalWrite(OUT4,0); } } }
  7. Cześć, bawię się od dłuższego czasu "arducam". Mam surowy moduł OV7670 bez ramu i walcze z nim na arduino nano. Już wcześniej udało mi się za pomocą samej atmegi 328 wyciągnąć z tej kamerki obraz, ale wtedy powiedzmy że nie wnikałem w ustawianie rejestrów kamerki, ściągnałem gotowca, dopasowałem do swojego uC, wgrałem i jakoś to działało. Teraz chciałem podejść do tematu troche ambitniej i ogarnąć sobie ustawienia kamerki( zmiana rozdzielczości, naświetlenia itd), no i zacząłem bawić się interfejsem SCCB kamerki. No i pojawiły się kłopoty. Do komunikacji od strony arduino użyłem biblioteki Wire i skopiowałem kawałek kodu z githuba ArduCAM do odczytywania pojedynczego rejestru. No nie działało mi to, więc podpiąłem analizator stanów logicznych, i sie okazało że jedno z drugim za bardzo rozmawiać nie chce. Ogólnie sygnały wyglądaja dziwnie, w pewnych momentach zegar i2c ma częstotliwość 8mhz. Kamerka wystawia sygnały na szynie danych i VSYNC, HS czy PCLK, ale przy zakrywaniu obiektywu to co pojawia się na D[0:7] nie różni się niczym od tego co jest przy odkrytym obiektywie, i przez to zastanawiam się czy ta kamerka nie jest uszkodzona (mimo że sygnały z niej jakieś wychodzą). Przyznam się, że zapomniałem się że kamerka operuje na 3,3V i podałem zegar bezpośrednio z pinu arduino na pin OV7670 Podrzucam szkic i zrzut z analizatora dla odczytu rejestru 0x12. Ma ktoś jakieś doświadczenia w tym temacie? Co o tym myślicie? Pzdr i2c_test.rar
  8. Witam ponownie. Stanąłem przed kolejnym problemem. W mojej instalacji mianowicie znajduje się konduktometr. Dokładnie taki: https://de.aliexpress.com/item/2017-New-verison-CM-230-Conductivity-Meter-Conductivity-Conductivity-Tester-Monitor-Pure-water-meter-monitor-4/32787845538.html?spm=a2g0s.9042311.0.0.62f74c4d8N9nCQ Wszystko cacy tylko to ustrojstwo nadaje sygnałem w standardzie 4-20mA a jak wiadomo Arduino takowego nie posiada. Znacie jakiś sposób by podpiąć ten standard do Arduino? Znalazłem w sieci coś takiego: https://www.antratek.de/4-20ma-r-click?gclid=CjwKCAjw583nBRBwEiwA7MKvoEtQ-9ha0XTjF-PoOqQApiY-AhSTKSdmt9WJobyYYrahC8DUUneehRoCHEEQAvD_BwE można by to jakoś użyć do odczytu sygnału? Wcześniej zamówiłem taki przetwornik ale nie wiem czy to dokładne będzie. https://de.aliexpress.com/item/Current-To-Voltage-Module-0-4-20mA-To-0-3-3V-5V-10V-Voltage-Transmitter-Integrated/32824693659.html?spm=a2g0s.9042311.0.0.20dd4c4dCwbp2k
  9. Dzień dobry! Planuje zrobić instalacje oświetlenia LED i mam takie pytanie jak w tytule. Potrzebne mi to jest do obliczenia spadku napięcia i zastosowanie odpowiedniej grubości kabla. Za wszelką pomoc z góry dziękuje.
  10. Cześć. Chciałbym się z Wami podzielić projektem, który jak pewnie większość takich projektów – wziął się z pewnej potrzeby. Otóż mój znajomy, który miesza w domku jednorodzinnym ma garaż. Garaż jest otwierany elektrycznie za pomocą m.in. pilota zdalnego sterowania. Często zdarzało się, że w nocy brama garażowa była otwarta bo np. ktoś z domowników miał pilot do garażu w tylnej kieszeni spodni i… po prostu usiadł. Poprosił mnie o pomoc. Chciał po prostu wiedzieć kiedy brama jest otwarta a kiedy zamknięta. Ustaliliśmy, że do sygnalizacji wystarczy prosta dioda LED. Urządzenie pokazujące stan otwarcia bramy miało być w dwóch miejscach w domu: w sypialni i w salonie obok telewizora. Oczywiście nie ma mowy o ciągnięciu jakichś kabli po nowo wybudowanym domu, więc w grę wchodzi tylko komunikacja bezprzewodowa. Zasada działania miała być prosta: Kiedy brama garażowa jest otwarta na odbiornikach widać świecącą diodę w kolorze czerwonym. Gdy jest zamknięta – w zielonym. Układ składał się więc z nadajnika, czyli modułu z kontraktonem, który „wykrywał” czy drzwi są zamknięte, oraz dwóch modułów z diodą RGB, która – w zależności od położenia drzwi – świeciła w odpowiednim kolorze. Nadajnik zbudowany jest z mikrokontrolera – klona ATMEGi, tzn. LGT8F328D (miałem po prostu kilka sztuk), czujnika zamknięcia bramy – czyli kontraktonu i nadajnika radiowego. Wybór mikrokontrolera podyktowany był tym, że w zasadzie sam program jest banalnie prosty i jakoś specjalnie nie wymagający sprzętowo, ale potrzebowałem mikrokontrolera z interfejsem SPI (o czym piszę poniżej) i… taki mikrokontroler po prostu miałem na stanie. Na początku przeprowadziłem testy z prostym nadajnikiem 433MHz, niestety zasięg nie był imponujący i po prostu nie sprawdził się. Nadajnik był zasilany napięciem 5V, mogłem próbować oczywiście zasilić go większym napięciem (12V), ale wtedy układ nieco by się skomplikował… Postawiłem więc na moduł nRF24l01 (stąd potrzeba SPI). Całość zasilana przez zasilacz zewnętrzny 5V. nRF24l01 pracuje na napięciu 3,3V, więc oczywiście w module nie zabrakło LDO, dokładnie AMS1117 3.3V. Mikrokontroler oczywiście też pracuje na napięciu 3.3V, częstotliwość taktowania to 8MHz. Odbiorniki działają na tym samym mikrokontrolerze, również wyposażone są oczywiście w moduł radiowy nRF24L01, oraz diodę LED RGB. Zasada działania układu jest prosta. Nadajnik sprawdza wejście cyfrowe z kontraktonem. Jeżeli jest „1” – tzn. drzwi są zamknięte – wysyła komunikat o treści „ON” co 1 sekundę. Jeżeli są otwarte – wysyła „OFF” co jedną sekundę. Odbiorniki natomiast czekają na komunikat. Jeżeli dostają „ON” - dioda świeci na zielono, jeżeli „OFF” – na czerwono. Jeżeli w ciągu 5 sekund nie dostaną żadnego komunikatu – dioda świeci na niebiesko. W ten oto sposób wiadomo, że nadajnik działa (lub też nie). Prototyp na pro mini służący do testów: Jeżeli chodzi o montaż w garażu, to na bramie garażowej przykleiłem magnes, na naprzeciwko magnesu umieściłem kontrakton, czyli urządzenie mechaniczne, które w polu magnetycznym magnesu zwiera dwa przewody ze sobą. Jako obudowa nadajnika i odbiorników służy zwykła puszka elektryczna. Dla układu nadajnika i odbiorników zaprojektowałem płytkę PCB (tę samą dla nadajnika i odbiorników) i zamówiłem w jednej z chińskich firm zajmujących się produkcją płytek PCB. Po otrzymaniu płytek przylutowałem niezbędne komponenty, podłączyłem i… działa już parę miesięcy. Nadajnik: Odbiornik: Gotowy projekt: Kilka uwag do projektu płytki Schemat: Jest tam kilka elementów nadmiarowych, nie używanych, ale zaprojektowanych „na zapas”. Po pierwsze jest miejsce na rezonator kwarcowy (wraz z odpowiednimi kondensatorami)– nie przylutowany. Mikrokontroler korzysta z wbudowanego oscylatora. Działa stabilnie, więc po co przepłacać Można także zauważyć, że i nadajnik i odbiornik mają wlutowaną diodę LED RGB. Bezpośrednio na nadajniku też widać czy brama jest otwarta, czy zamknięta. W projekcie na wyjściach mikrokontrolera PD5, PD6 i PB1 są tranzystory BC639 – to w wypadku, gdyby okazało się, że dioda RGB LED jest zbyt ciemna – wtedy można podłączyć np. taką diodę 3W, wiadomo – bardziej wymagająca prądowo. Jest jeszcze wyprowadzenie kilku dodatkowych wyjść mikrokontrolera, bo… było miejsce, a płytka może się jeszcze przydać do czegoś innego. Na płytce PCB widać, że nawet przycisku RESET nie przylutowałem… ale jest na niego miejsce. Zamiast LGT8F328D można przylutować na płytkę ATMEGA328P (zwierając odpowiednie wyprowadzone piny mikrokontrolera) lub ATMEGA328PB – tutaj akurat zgodne elektrycznie z LGT. Kodu źródłowego nie publikuję, bo to zaledwie kilka linijek. Kod pisany w środowisku Arduino. Projekt zdecydowanie bardziej hardware’owy. Prosty i skuteczny.
  11. Dzień dobry mam problem z klonem arduboyem którego sam zbudowałem. Problem występuje podczas kompilacji programu i wyskakuje taki błąd. Gierkę pobierałem z tej strony https://github.com/TEAMarg/ID-46-Arduventure/releases/tag/v1.0 i przeniosłem folder ARDU_AB na pulpit z tymi plikami i podczas wgrywania wywala mi taki błąd. Mikro-kontroler to arduino nano wraz z oled 128x64. Z góry będę wdzięczny In file included from c:\program files\windowsapps\arduinollc.arduinoide_1.8.21.0_x86__mdqgnx93n4wtt\hardware\tools\avr\avr\include\avr\io.h:99:0, from c:\program files\windowsapps\arduinollc.arduinoide_1.8.21.0_x86__mdqgnx93n4wtt\hardware\tools\avr\avr\include\avr\pgmspace.h:90, from C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.21.0_x86__mdqgnx93n4wtt\hardware\arduino\avr\cores\arduino/Arduino.h:28, from C:\Users\macio\Documents\Arduino\libraries\ATMlib-master\src\ATMlib.h:5, from C:\Users\macio\Documents\Arduino\libraries\ATMlib-master\src\ATMlib.cpp:1: C:\Users\macio\Documents\Arduino\libraries\ATMlib-master\src\ATMlib.cpp: In function 'void TIMER4_OVF_vect()': C:\Users\macio\Documents\Arduino\libraries\ATMlib-master\src\ATMlib.cpp:4:24: error: 'OCR4A' was not declared in this scope ATMLIB_CONSTRUCT_ISR(OCR4A) ^ C:\Users\macio\Documents\Arduino\libraries\ATMlib-master\src\ATMlib.cpp:4:3: note: in expansion of macro 'ATMLIB_CONSTRUCT_ISR' ATMLIB_CONSTRUCT_ISR(OCR4A) ^ C:\Users\macio\Documents\Arduino\libraries\ATMlib-master\src\ATMlib.cpp: In member function 'void ATMsynth::play(const byte*)': C:\Users\macio\Documents\Arduino\libraries\ATMlib-master\src\ATMlib.cpp:112:3: error: 'TIMSK4' was not declared in this scope TIMSK4 = 0b00000000;// ensure interrupt is disabled ^ C:\Users\macio\Documents\Arduino\libraries\ATMlib-master\src\ATMlib.cpp:127:3: error: 'TCCR4A' was not declared in this scope TCCR4A = 0b01000010; // Fast-PWM 8-bit ^ C:\Users\macio\Documents\Arduino\libraries\ATMlib-master\src\ATMlib.cpp:128:3: error: 'TCCR4B' was not declared in this scope TCCR4B = 0b00000001; // 62500Hz ^ C:\Users\macio\Documents\Arduino\libraries\ATMlib-master\src\ATMlib.cpp:129:3: error: 'OCR4C' was not declared in this scope OCR4C = 0xFF; // Resolution to 8-bit (TOP=0xFF) ^ C:\Users\macio\Documents\Arduino\libraries\ATMlib-master\src\ATMlib.cpp:130:3: error: 'OCR4A' was not declared in this scope OCR4A = 0x80; ^ C:\Users\macio\Documents\Arduino\libraries\ATMlib-master\src\ATMlib.cpp: In member function 'void ATMsynth::stop()': C:\Users\macio\Documents\Arduino\libraries\ATMlib-master\src\ATMlib.cpp:152:3: error: 'TIMSK4' was not declared in this scope TIMSK4 = 0; // Disable interrupt ^ C:\Users\macio\Documents\Arduino\libraries\ATMlib-master\src\ATMlib.cpp: In member function 'void ATMsynth::playPause()': C:\Users\macio\Documents\Arduino\libraries\ATMlib-master\src\ATMlib.cpp:159:3: error: 'TIMSK4' was not declared in this scope TIMSK4 = TIMSK4 ^ 0b00000100; // toggle disable/enable interrupt ^ C:\Users\macio\Documents\Arduino\libraries\ATMlib-master\src\ATMlib.cpp: In function 'void ATM_playroutine()': C:\Users\macio\Documents\Arduino\libraries\ATMlib-master\src\ATMlib.cpp:424:9: error: 'TIMSK4' was not declared in this scope TIMSK4 = 0; // Disable interrupt ^ exit status 1 Błąd kompilacji dla płytki Arduino Nano.
  12. Od dawna interesowały mnie pomiary warunków meteorologicznych w mojej miejscowości, pierwsza stacja meteorologiczna, którą zbudowałem około roku 2010, wykonana była na mikrokontrolerze Atmega32. Do komunikacji z światem wykorzystywała moduł LAN Wiznet 7010a. Stacja ta była oprogramowana w języku BASCOM. Projekt który chcę zaprezentować dzisiaj działa już od roku 2018 i został oprogramowany w środowisku Arduino. Stacja została podzielona na 2 moduły, pierwszy pomiarowy oparty jest na klonie Arduino Nano oraz drugi odbiorczy którego sercem jest ESP8266 NodeMCU v3, służy on również do wyświetlania aktualnych pomiarów na wyświetlaczu LED dot matrix o wymiarach 8x56 punktów. Na pracach stolarskich się nie będziemy skupiać napiszę tylko że klatka meteorologiczna została wykonana z drewna sosnowego i umieszczona na wysokości 2 m. Moduł Pomiarowy Czujniki jakie zastosowałem to dwie sztuki DS18B20 pierwszy zajmuje się pomiarem temperatury przy gruncie na wysokości 5cm, drugi pełni rolę zapasowego czujnika temperatury na wypadek uszkodzenia się głównego czujnika BME280. Do pomiaru prędkości wiatru wykorzystuję wiatromierz firmy Maplin na jeden obrót wiatromierza przypadają 2 impulsy z kontaktronu który jest w nim zamontowany, producent dostarcza również odpowiedni wzór według którego można obliczyć rpm oraz prędkość wiatru w km/h. Dane mierzone przez wiatromierz możemy podzielić na dwie wartości, pierwsza to chwilowa prędkość, druga prędkość w porywach, aby uśrednić wartości mierzone program zlicza impulsy z 5s a następnie dokonuje odpowiednich obliczeń. Zebrane dane przesyłane są do drugiego urządzenia poprzez moduły radiowe które działają na częstotliwości 433,92 MHz. W tym celu zastosowana została biblioteka RCSwitch. Każda mierzona wartość jest wysyłana jako osobna transmisja. aby rozróżnić pomiary z konkretnych czujników mierzona wartość mnożona jest przez 100 a następnie dodawana jest liczba 100 000 dla pierwszego czujnika, 200 000 dla drugiego itd. Przykład kodu który realizuje tę funkcję poniżej: // temperatura sensor BME codetosend = temp * 100 + (1 * 100000); mySwitch.send(codetosend, 24); // wilgotnosc sensor BME codetosend = hum * 100 + (2 * 100000); mySwitch.send(codetosend, 24); Moduł Wewnętrzny Obudowa, która idealnie nadawała się do implementacji wewnętrznego modułu pochodzi z tunera IPTV Motorola VIP1910-9. Przedni panel został wykonany z ciemnego półprzepuszczalnego plastiku który idealnie nadaje się do umieszczenia w nim wyświetlacza. Sercem urządzenia jest układ ESP8266. "Moduł wewnętrzny" został również wyposażony w czujnik temperatury oraz wilgotności DHT22, dodatkowo w celu prezentacji zmierzonych wartości dołączone zostało 7 szt. modułów wyświetlacza LED dot matrix z układem MAX7219. Do obsługi tej matrycy zastosowałem bibliotekę Max72xxPanel.h która współpracuje z biblioteką Adafruit_GFX.h w ten sposób nie byłem zmuszony implementować do rozwiązania własnych czcionek. Matryca ta oprócz modułowej konstrukcji umożliwia również sterowaniem jasnością podświetlania, w tym celu aby uprzyjemnić użytkowanie w porach nocnych odbiornik został wyposażony w fotorezystor dzięki któremu potrafi określić natężenie oświetlenia otoczenia i odpowiednie ustawienie podświetlenia. Na wyświetlaczu w pierwszej kolejności wyświetlam aktualną godzinę oraz temperaturę wewnątrz pomieszczenia oraz wilgotność, po około jednej minucie wyświetlane są informacje odczytane z stacji meteo czyli temperatura wilgotność i ciśnienie, postanowiłem nie wyświetlać tutaj informacji dotyczących prędkości wiatru oraz temperatury przy gruncie. Decyzję tą podjąłem na podstawie użytkowania innego podobnego rozwiązania, akurat jak chcemy odczytać godzinę to wyświetlane są inne informacje. Dodatkowo w godzinach nocnych, które zostały ustawione w sztywnych ramach czasowych między 21:00 a 7:00 informacje odczytane z stacji meteo zostały okrojone tylko do temperatury. W projekcie zostały zastosowane 2 rodzaje animacji pierwsza z nich, przesuwa tekst z prawej strony wyświetlacza na lewą, z możliwością zatrzymania w interesujących momentach. Drugi rodzaj to pionowa animacja. Mikrokontroler również poprzez protokół NTP i bibliotekę time.h pobiera aktualną godzinę i datę. Za odbiór danych z pierwszego układu odpowiedzialny jest moduł radiowy którego obsługą tak jak w poprzednim module zajmuje się biblioteka RCswitch. Poniżej fragment programu który demonstruje w jaki sposób odbierane i dekodowane są dane: rc = mySwitch.getReceivedValue(); // czujnik temperatury powietrza BME280 if (abs(rc)>=50000&& abs(rc)<150000) { rc=(rc-100000)/100; if (rc > -50 and rc < 60) { temp1 = rc; Serial.print("Czujnik BME280 - temperatura: \t"); Serial.println(rc); matrix.drawPixel(55,0,1); matrix.write(); } } // czujnik wilgotności BME280 if (abs(rc)>=150000 && abs(rc)<250000) { rc=(rc-200000)/100; if (rc > 5 and rc <= 100) { hum = rc; Serial.print("Czujnik BME280 - wilgotnowsc: \t"); Serial.println(rc); matrix.drawPixel(55,1,1); matrix.write(); } } Dzięki zastosowaniu zewnętrznej anteny oraz odbiornika opartego na superheterodynie, zasięg w otwartym terenie to około 250 m. Po odebraniu danych z pierwszego układu poprzez moduł radiowy następuje przekazanie ich do serwera z systemem Domoticz. Domoticz to bardzo lekki system automatyki domowej, który pozwala monitorować i konfigurować różne urządzenia, przełączniki, czujniki takie jak temperatura, opady deszczu, wiatr, promieniowanie ultrafioletowe (UV), zużycie energii elektrycznej, zużycie gazu, zużycie wody i wiele więcej. Wykresy dostępne są również na stronie www http://meteo.palowice.net Poniżej film z działania odbiornika, smużenie animacji które występuje na filmiku ludzie oko nie rejestruje. Gdyby kogoś interesował kod to również zamieszczam: meteo.zip
  13. Witam . Mam pytanko odnośnie funkcji w której mogę przechować wartość w scope . Chodzi konkretnie o temperaturę. Próbowałem tak int Temperatura = (sensors.getTempCByIndex(0)); Ale obcina mi dziesiętne.
  14. 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.
  15. Miniaturowy Tetris z pięcioma przyciskami, głośniczkiem Piezo i ekranem Oled 128×64. To wszystko przy zaledwie sześciu dostępnych GPIO jednodolarowego Digisparka/ATtiny85. Moja wersja kodu dodaje kilka ulepszeń, które znacząco zmieniają odbiór całej gry (opisane niżej), a koszt budowy całego zestawu wynosi około 15 zł. ATtiny Tetris Gold Multi Button obsługuje narastający poziom trudności (przyspieszanie opadania wraz z usuwaniem kolejnych linii), informację o klocku pojawiającym się w kolejnej turze, podpowiedź o pozycji klocka w dolnej partii planszy, pełną pseudo-losowość doboru klocków, dźwięki i temat muzyczny z oryginalnej gry. Poniżej mój filmik prezentujący ten układ w działaniu: W filmie można zobaczyć krótkie urywki z rozgrywki, proces instalacji szkicu w urządzeniu oraz pełny, pięciominutowy gameplay. Sprzęt Jakiś czas temu zainteresowały mnie klasyczne gry retro dla ATtiny85, ale w repo Attiny-Arduino-Games wszystkie były zaledwie dwu-przyciskowe. Tetris wymagał nieco więcej logiki, ale i tak obsługiwało się go przez naciskanie lub przytrzymywanie jednego z tylko dwóch przycisków, co generowało błędy i nie było zbyt wygodne. Z czasem jednak pojawiła się w repo wersja Tetris Multi Button, w której rozwiązano ten problem wykorzystując odpowiednią kombinację rezystorów i przycisków, dzięki czemu podłączono trzy przyciski pod jeden pin mikrokontrolera. Nie posiadam czystego ATtiny85, ale miałem na stanie Digisparka z tym chipem i postanowiłem złożyć to urządzenie. To chyba pierwsze nagranie wideo takiego zestawu - w sieci brak w sieci brak filmów i opisów wykonania pełnej, pięcio-przyciskowej wersji. Żeby się nie pogubić podczas montażu , korzystając z rozpiski pinów Digisparka i ATtiny85 przeniosłem dostarczony ze sketchem poniższy schemat: na lekko chaotyczną wersję graficzną dla stykowej płytki prototypowej i Digisparka zasilanego baterią 9V: a przy okazji też dla czystego ATtiny85 zasilanego baterią 3V: Poszczególne przyciski odpowiadają za: start nowej gry lub restart aktualnie rozgrywanej, włączenie/wyłączenie układu, obrót, przyspieszenie opadania, przesunięcie w lewo, przesunięcie w prawo. Przytrzymanie przycisku opadania i włączenie restartu gry aktywuje tryb ducha, a przytrzymanie przycisku opadania razem z przyciskiem obrotu podczas restartu ustawia trudny poziom gry, wypełniając dodatkowo błędnie klockami część planszy. Po aktywacji tych opcji grę należy uruchomić przyciskiem przyspieszonego opadania. Wersja na czystym ATtiny85 potrzebuje tylko 3V, bo sketch jest pisany dla obniżonego do 8MHz taktowania zegara. Wersję dla Digisparka zasilam poprzez pin VIN 9V baterią i przy takim poborze wystarczy jej na baaardzo długo. Wymagane do działania 5V przenoszę dodatkowym, pustym goldpinem na lewą stronę płytki prototypowej za pomocą dziesięciocentymetrowego przewodu połączeniowego żeńsko-męskiego. Po zlutowaniu powyższego układu w połączeniu z gołym ATtiny85 i po ubraniu go w miniaturowy brelok do kluczy, koszt (bez baterii) zamknąłby się poniżej 15 złotych. Na Aliexpress ATtiny85 kosztuje 0,80$, ekran Oled 128×64 1.80$, mały piezo buzzer 0,17$, a reszta części to już koszty groszowe. Tym sposobem otrzymujemy pełną grę sterowaną w identyczny sposób, jak w wielkich automatach Arcade lata temu, a do tego zasilaną malutką baterią 3V. Do zestawu zamiast białego ekranu można wybrać ekran niebieski lub żółto-niebieski, ale ponieważ ten ostatni jest dzielony na dwie różne części z odstępem, to nie prezentuje się zbyt atrakcyjnie (co widać na powyższym filmie) i polecam jednokolorowy odpowiednik. Potencjalny brelok mógłby wyglądać tak, jak na obrazku poniżej: Kod Zmiany w kodzie, których dokonałem, nie są duże, ale znaczące w odbiorze gry. Poniżej różnice między moją wersją, dostępną na GitHubie, a oryginałem gry dla ATtiny85: Dodałem losowość doboru klocków – domyślnie ATtiny Tetris generuje tę samą sekwencję klocków w każdej nowej grze, bo użyta funkcja random korzysta w kółko z tej samej tablicy liczb losowych. Programiści nie aktywowali randomSeed, ponieważ wszystkie piny w układzie są już podłączone. Moja wersja przesuwa tablicę liczb pseudo-losowych po każdym rozpoczęciu gry inkrementując seed do EEPROMu i aktywując w ten sposób pełną pseudolosowość doboru klocków (powtarzają się tylko pierwsze dwa). Grając w oryginalną wersję, do piątej linii miałem już ustalony optymalny schemat położenia klocków, przez co gra stawała się nudna. Teraz jest już poprawnie i mam świadomość, że wykorzystanie EEPROMu w randomSeedowaniu ograniczy liczbę rozgrywek do zaledwie 99000 (podana liczba uwzględnia już obecny w kodzie zapis najlepszych wyników również do EEPROMu). Na starcie gry dodałem fragment tematu muzycznego z oryginalnej gry Tetris z 1986 roku – domyślnie brak jakiejkolwiek muzyki w grze. Po wybraniu trybu ducha temat muzyczny jest nieco dłuższy. Dodałem dźwięk opadającego klocka (tylko podczas swobodnego spadania) oraz inny dźwięk dla klocka, który kończy opadanie. Domyślnie dźwięki w tej grze pojawiają się sporadycznie – tylko podczas usunięcia pełnej linii klocków oraz na zakończenie gry. Naprawiłem część błędnie wyświetlanych fontów na ekranie startowym Domyślnie wyłączyłem tryb ducha, który wyświetla podpowiedź o docelowej pozycji klocka. Tryb ducha można aktywować sposobem opisanym powyżej pod konfiguracją przycisków. Ze swoimi zmianami musiałem się zmieścić w sześciu procentach wolnej pamięci. Obecnie pozostaje już tylko 1% wolnego Projekcik jest dość interesujący i co najważniejsze, w pełni użyteczny, więc możliwe, że znajdą się osoby chcące zbudować taki układzik. Jako dodatek zamieszczam więc proces instalacji. Instalacja Kod zabiera blisko 100% pamięci ATtiny85, więc na Digisparku nie mieści się bootloader i nie można uploadować sketcha poprzez USB – należy więc skompilować hexa i wgrać go za pomocą programatora ISP. Jako programatora użyłem Arduino wg poniższego schematu: Na Arduino trzeba wgrać dostępny w przykładach Arduino IDE sketch ArduinoISP. Aby poprawnie skompilować tę wersję dla Digisparka należy w Arduino IDE zastąpić dodatkowy adres URL dla menadżera płytek od Digistump JSONem dla czystego ATtiny85, a następnie wybrać płytkę ATtiny25/45/85, procesor ATtiny85, zegar Internal 8MHz. Następnie z menu szkic eksportować skompilowany program, który zostanie wtedy umieszczony w katalogu źródła sketcha. Na koniec zostaje już tylko wgranie hexa na Digisparka poprzez Arduino programem avrdude. Poniżej przykładowe polecenie kopiujące (z fusami) wykonane na macOS, ale w innych systemach wygląda podobnie: /Applications/Arduino.app/Contents/Java/hardware/tools/avr/bin/avrdude -C/Applications/Arduino.app/Contents/Java/hardware/tools/avr/etc/avrdude.conf -v -pattiny85 -cstk500v1 -P/dev/cu.usbmodem14101 -b19200 -Uflash:w:/Users/username/Documents/ATtiny-Tetris-Gold/ATtiny-Tetris-Gold.ino.tiny8.hex -U lfuse:w:0xF1:m -U hfuse:w:0xD5:m -U efuse:w:0xFE:m Jak przebiega taki proces można obejrzeć na końcu powyższego filmiku. Poniżej też zdjęcie "programatora" i układu obok siebie. W filmie i na zdjęciach do włączania układu korzystam z przełącznika suwakowego SS22T25, ale lepiej sprawdził się przełącznik prosty ESP1010. Napięcia na przyciskach są istotne i podczas gry trzeba uważać aby nie dotykać rezystorów Ten problem wyeliminuje się po zlutowaniu układu. Najlepszy wynik gry jest również zapisywany w EEPROMie. Ponieważ głośniczek jest podłączony do pierwszego pinu Digisparka, to dodatkowo otrzymujemy LEDowe sygnały świetlne w momencie odtwarzania dźwięków. Po zakończeniu gry Tetris natychmiast przechodzi w tryb uśpienia z minimalnym poborem prądu, jednak do Digisparka dodałem przełącznik włączający/wyłączający zasilanie dla układu – wersja opierająca się wyłącznie na ATtiny85 nie wymaga wykonania tego kroku. Gra chodzi bardzo płynnie, co widać na powyższym filmie, gdy przytrzymuję przycisk przyspieszonego opadania dla kilku klocków pod rząd. Miniaturowy ATtiny Tetris Gold jest bardzo regrywalny (nie nudzi się) i to niesamowite, że udało się go upchnąć na tanim ATtiny85 przy zachowaniu tak dużej funkcjonalności. Serdecznie polecam montaż tego prostego układu. Powiększenia układów i trochę więcej informacji można znaleźć na moim blogu: http://jm.iq.pl/tetris
  16. Witam mam problem z kompilacją gdyż wyskakuje mi taki błąd i nie wiem czemu tak się dzieje. Pomoże ktoś ? #include <Ultrasonic.h> // definicje dla HCSR04 #define TRIGGER_PIN 7 #define ECHO_PIN 4 Ultrasonic ultrasonic(TRIGGER_PIN, ECHO_PIN); // silnik lewy const int kierunekLewy=12; const int hamulecLewy=9; const int predkoscLewy=3; //silnik prawy const int kierunekPrawy=13; const int hamulecPrawy=8; const int predkoscPrawy=11; //ustawienia void setup() { Serial.begin(9600); pinMode(kierunekLewy,OUTPUT); pinMode(kierunekPrawy,OUTPUT); pinMode(hamulecLewy,OUTPUT); pinMode(hamulecPrawy,OUTPUT); pinMode(predkoscLewy,OUTPUT); pinMode(predkoscPrawy,OUTPUT); } //petla glowna programu void loop() { float cmMsec; long microsec = ultrasonic.timing(); cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM); doPrzodu(); delay(50); if (cmMsec<=30) { doTylu(); delay(500); } } void doPrzodu() { analogWrite(predkoscLewy,100); analogWrite(predkoscPrawy,105); //Lewy do przodu digitalWrite(kierunekLewy,HIGH); digitalWrite(hamulecLewy,LOW); //Prawy do przodu digitalWrite(kierunekPrawy,HIGH); digitalWrite(hamulecPrawy,LOW); } void doTylu() { analogWrite(predkoscLewy,200); analogWrite(predkoscPrawy,0); //Lewy do przodu digitalWrite(kierunekLewy,LOW); digitalWrite(hamulecLewy,LOW); //Prawy stop digitalWrite(kierunekPrawy,HIGH); digitalWrite(hamulecPrawy,HIGH); }
  17. #include <Servo.h> //Biblioteka odpowiedzialna za serwa Servo serwomechanizm; //Tworzymy obiekt, dzięki któremu możemy odwołać się do serwa int pozycja = 0; //Aktualna pozycja serwa 0-180 int zmiana = 6; //Co ile ma się zmieniać pozycja serwa? void setup() { serwomechanizm.attach(9); //Serwomechanizm podłączony do pinu 9 } void loop() { if (pozycja < 180) { //Jeśli pozycja mieści się w zakresie serwomechanizm.write(pozycja); //Wykonaj ruch } else { //Jeśli nie, to powrót na początek pozycja = 0; } pozycja = pozycja + zmiana; //Zwiększenie aktualnej pozycji serwa delay(200); //Opóźnienie dla lepszego efektu } Witam, jest to mój pierwszy post na forum oraz pierwszy tydzień zabawy z Arduino, dlatego z góry dziękuję za pomoc i komentarze, nawet jeśli problem jest banalny. Buduję model, w którym jednym z elementów jest rozdzielacz hydrauliczny z 3 serwami. Zadaniem serw jest pełne otwarcie zaworu oraz odczekanie zadanego czasu. Po jego upływie zawór zamyka się i znowu czekamy, aż upłynie zadany czas. Powyższy kod to kod z kursu do Aruduino (lekcja z zastosowaniem PWM). Kod działa i serwo pracuję non stop, otwiera i zamyka zawór, bez przerwy. Kombinowałem z funkcją delay jednak nic to nie dało, albo zrobiłem to źle. Czytałem, że musi zostać zastosowana tutaj jedna z funkcji arduino - millis(), ponieważ w trakcie pracy rozdzielacza inne elementy będą działać równolegle. Z tym również próbowałem, ale nie wyszło Przejdźmy do sprawy: jak zmodyfikować kod, aby - 1) Istniała możliwość pracy innych elementów w czasie pracy rozdzielacza 2) Serwa robiły pauzę na określony czas po otwarciu i zamknięciu zaworu
  18. Chciałbym zaprezentować oraz poddać opinii forumowiczom zaprojektowany przez naszą firmę układ, który to chcemy wprowadzić na rynek. Ktoś mógłby go nazwać uniwersalnym sterownikiem. My określamy go jako Swobodnie Programowalny Moduł Sterowania. Moduł ten może być programowany w języku C (przykładowo Atmel Studio) lub też w Arduino, gdyż układ ten jest zgodny z Arduino Mega2560 oraz dodatkowo używa znacznie więcej nóżek mikrokontrolera niż wykorzystano w rodzimym Arduino Mega2560. W załączniku można znaleźć opis wyprowadzeń płytki. Może zamiast się rozpisywać, przytoczę treść naszej ulotki na temat układu – znajdują się tu wszystkie najważniejsze cechy modułu: ” … Nasz moduł imponuje ilością interfejsów komunikacyjnych przewodowych i bezprzewodowych, mnogością wejść/wyjść cyfrowych i analogowych, wyjść przekaźnikowych oraz peryferiami nietypowymi jak dla tego typu modułów, takimi jak wyjście typu TRIAC, detektor przejścia przez zero, układ pomiaru prądu, wyjścia PWM, karta SD i wiele innych. Dodatkowym atutem naszego modułu jest to, że posiada złącze rozszerzeń, do którego możemy zaprojektować dowolny układ elektroniczny realizujący funkcje wykraczające poza te, które moduł oferuje w standardzie. Nasz układ elektroniczny można bardzo łatwo oprogramować. Wybierając nasz moduł sterowania dostajesz na jednej płycie: - 8 izolowanych wejść cyfrowych 12 – 24 VDC. - 8 izolowanych wyjść cyfrowych o wydajności 0,5 A, polaryzowanych dowolnie. - 6 analogowych wejść 0-10 V lub 0-20 mA. - 2 wyjścia analogowe 0-10 V lub 0-20 mA. - 6 wyjść przekaźnikowych 250 VAC 4 A - 3 przełączalne SPDT i 3 zwierne SPST. - 2 wyjścia PWM kluczujące napięcie zasilania. - 2 wejścia czujników temperatury PT100. - Izolowane wyjście typu TRIAC 250 VAC 10 A. - Detektor przejścia przez zero sinusoidy napięcia sieciowego. - Izolowany kanał analogowy do pomiaru prądu w zakresie od -10 do +10 A. - Przewodowe interfejsy komunikacyjne: RS485, Ethernet 10/100 Mbit, USB, RS232, I2C, SPI, OneWire, UART TTL. - Bezprzewodowe interfejsy komunikacyjne: WiFi i Bluetooth. - Karta microSD. - Wyjście na panel HMI - LCD ze sterownikami rodziny FT8xx. - Zegar czasu rzeczywistego RTC po I2C z podtrzymaniem bateryjnym. - 8 wyprowadzeń mikrokontrolera GPIO z poziomami logicznymi TTL 0-5 VDC. - Możliwość podpięcia klawiatury 4x4 do ww. GPIO. - 3 diody sygnalizacyjne R, G, B. - Zasilanie układu 24 lub 12 VDC ze złącza rozłączalnego lub gniazda 5,5 mm. - Złącze rozszerzeń pozwalające na użycie dowolnego układu elektronicznego z dodatkowymi funkcjonalnościami. - Łatwe wgrywanie firmwareu przez USB. - Języki programowania C, C++. „ Do opisu warto dodać, że widziana matryca zworkowa pozwala na podpinanie do UARTów mikrokontrolera peryferii RS232, RS485, WiFi, Bluetooth, dzięki temu można wybrać UART z którego chcemy korzystać (również dostępny jest UART softwareowy użyty w Arduino). Listwa kołkowa opisana jako 8 x TTL GPIO, to nóżki procesora które oprócz dla optoizolowanych wejść można zamiennie wykorzystać do czegoś innego – przykładowo do podpięcia klawiatury 4x4. Obecnie posiadamy do tego modułu płytkę rozszerzeń na której jest 8 dodatkowych wyjść cyfrowych oraz brzęczyk. Nasz moduł sterowania został doceniony medalem targowym INDUSTRYmeeting 2019. Cieszymy się tym uznaniem. Na końcu postu można znaleźć kilka zdjęć/filmów z akcji – układy pracują w naszej gablocie targowej komunikując się po RS485. Obydwa układy mają podpięte dotykowe wyświetlacze 7 calowe. Ten po lewej robi za panel operatorski na którym można odczytać wartości lub posterować wyjściami tego drugiego modułu, a ten drugi właśnie (po prawej) robi za driver stołu liniowego XY oraz podpięte są do niego wszystkie peryferia wystawy (czujniki temperatury PT100, czujnik pływakowy, czujnik zbliżeniowy, listwa LEDowa pod PWM, rygiel elektromagnetyczny). Stół liniowy XY podąża za pozycją palca na prawym ekranie. Docelowo będziemy dostarczać bibliotek programistycznych do obsługi interfejsów i peryferii. Na ten moment chcielibyśmy zacząć wprowadzać na rynek ten moduł bez docelowej biblioteki, ale publikując przykłady obsługi peryferii. Największą wątpliwość jaką mamy, to taka czy wprowadzać urządzenie na rynek w stanie takim jakie jest, czy też wyposażyć go w bardziej wydajny mikrokontroler. Z drugiej jednak strony, obecnie zastosowany mikrokontroler ATmega2560 z komunikacją USB za pośrednictwem ATmega16U2 czyni nasz moduł atrakcyjnym dla sympatyków Arduino, jako że ten zestaw jest bardzo podobny do rodzimego Arduino MEGA2560 a nawet wyposażony w znacznie więcej niż ten rodzimy. Bylibyśmy wdzięczni za szczere i grzeczne opinie, na zasadzie takiej czy ktoś uważa, że nasz moduł może mieć zainteresowanie na rynku czy też nie i co myśli na temat wydajności z zastosowanym mikrokontrolerem. Zastosowany mikrokontroler może i nie kwalifikuje modułu sterującego do demonów prędkości, ale daje za to łatwość programowania a wydajność procesora mimo iż niższa od (przykładowo) 32 bitowych ARMów to i tak powinna zaspokoić wespół z liczebnymi peryferiami płytki szerokie spektrum zastosowań. Co o tym wszystkim myślicie? Gdyby też ktoś był zainteresowany dostępnością naszego modułu to jesteśmy w stanie dostarczyć takie moduły jeszcze ”przedpremierowo” czyli zanim wprowadzimy je oficjalnie na rynek. Link do filmiku naszych układów sterowania przedstawiający je w akcji:
  19. Mam problem z połączeniem kodu ardiunu. Napisałem działający kod na sterowanie dwoma silnikami przez mostek, oraz kod na sterowanie dwoma serwo. Kody te osobno działają lecz przy próbach połączenia kodów nic nie działa. Dopiero zaczynam programować w arduino. Wiem że to pewnie prosta sprawa dla kogoś kto już troche w tym siedzi ale to dla mnie początki. Pierwszy kod do sterowania silnikami: https://pastebin.com/eLdFuPBV?fbclid=IwAR2gle7I_ltJhNnZ5NYrGbPog7Eu33zzu-CwV8DazjPd6IxyswPJcXlZ5yw Kod do sterowania dwoma serwo: https://pastebin.com/Dmhz6TwH?fbclid=IwAR1jieyCyECJCqomrRivB8H0d_qAJRlPoy9_m85_Xi1HhayHlehIvkObiZA Schemat połączenia :
  20. Mam pytanie i proszę o pomoc Więc tak, zaprogramowałem wyświetlacz LCD 2x16 z klawiaturą membranową w ten sposób, że to co wcisnę to się pojawia na wyświetlaczu. Ma to służyć do wpisywania PINu i tu zaczyna się mój problem gdyż w razie pomyłki chciałem klawiszem 'A' usunąć znak przed kursorem (po jego lewej stronie) ale kompletnie nie wiem jak to zrobić Kombinowałem coś z funkcją lcd.rightToLeft() i żeby wtedy wypisał pusty znak ale nie działa Pomoże ktoś??
  21. Cześć. Jestem tu dlatego że sie poddałem... Plan był taki aby za pomocą pilota 433Mhz sterować pprzekaźnikiem 2ch. Gdy mi już coś wyszło po naciśnięciu któregoś z 2 przycisków przekaźnik zaczyna wariować (załącza sie i wyłącza z 2 razy na sekunde). Szukałem gotowych kodów by znaleźć swój błąd lecz żaden nawet nie załączał przekaźnika. Niestety chce wykorzystać tylko jedno arduino nano/uno które bedzie sterowane pilotem. Może nie tyle o gotowe programy co o naprowadzenie jak to ugryźć. Posiadam: przetwornica (posiadam tez 4ch ale i tak chce wykorzystać 2) Moduł+pilot Arduino nano/uno #include <rm4.h> static const int kEnablePin = 12; static const int kData0Pin = 7; static const int kData1Pin = 8; static const int kData2Pin = 16; static const int kData3Pin = 13; const int relay1 = 10; const int relay2 = 11; const int relay3 = 14; const int relay4 = 15; RM4 remote(kData0Pin, kData1Pin, kData2Pin, kData3Pin); void setup() { Serial.begin(9600); pinMode(kEnablePin, OUTPUT); digitalWrite(kEnablePin, HIGH); pinMode(relay1, OUTPUT); pinMode(relay2, OUTPUT); pinMode(relay3, OUTPUT); pinMode(relay4, OUTPUT); } void loop() { const int button_code = remote.buttonCode(); if (button_code == 8) { digitalWrite(relay1, LOW); delay (2000); } else { digitalWrite(relay1, HIGH); } if (button_code == 2) { digitalWrite(relay2, LOW); delay (2000); } else { digitalWrite(relay2, HIGH); } if (button_code == 1) { digitalWrite(relay3, LOW); delay (2000); } else { digitalWrite(relay3, HIGH); } if (button_code == 4) { digitalWrite(relay4, LOW); delay (2000); } else { digitalWrite(relay4, HIGH); } } Z góry dzięki za pomoc
  22. Mam wyświetlacz 1602A i moduł i2c (PCF8574AT), jak podłączam do arduino GND - GND Vcc - 5V SDA- A4 SCL - A5 to skaner i2c nie pokazuje adresu. Jednak czytając datasheety adres to 0x3F i jak wgrywam do przykładów podstawowy program, to wyświetlacz nic nie pokazuje. Kontrast działa, a korzystam z biblioteki NewLiquidCrystal (najnowszej wersji).
  23. Cześć, mam prosty program na arduino nano - wpisujemy w klawiaturę kod ( klawiatura 4x3, keypad.h), jeśli jest poprawny, zmienia stan na przekaźniku i wyłącza elektromagnes, jeśli nie, nic się nie dzieje. Dodatkowo reset wpisanego hasła za pomocą '*'. Otóż program po prostu przestaje działać w losowym momencie, nie pomaga reset ani wyłączenie zasilania na dłuższy czas, jedynie wgranie programu od nowa. Spotkał się ktoś kiedyś z taką sytuacją? Sytuacja już z 2 takim arduino. Załączam cały kod, może coś przeoczyłem. Pozdrawiam, Kamil #include <Keypad.h> char password[9] = {'2','2','4','4','2', '2','5','5','5'}; //char password1[5] = {'1','1','1','1','1'}; char dane[9] = {}; const byte ROWS = 4; //four rows const byte COLS = 3; //three columns int x = 0; char hexaKeys[ROWS][COLS] = { {'1','2','3'}, {'4','5','6'}, {'7','8','9'}, {'*','0','#'} }; byte rowPins[ROWS] = {5, 6, 7, 8}; //connect to the row pinouts of the keypad byte colPins[COLS] = {2, 3, 4}; //connect to the column pinouts of the keypad Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS ); void setup(){ Serial.begin(9600); pinMode(11, OUTPUT); digitalWrite(11, HIGH); // keypad.addEventListener(keypadEvent); } void loop(){ char customKey = customKeypad.getKey(); if (customKey == '*')reset(); else if (customKey) { dane[x]= customKey; x++; } if ( dane[0]== password[0] && dane[1]==password[1] && dane[2] == password[2] && dane[3] == password[3] && dane[4] == password[4] && dane[5] == password[5] && dane[6] == password[6] && dane[7] == password[7] && dane[8] == password[8] ) { Serial.println("DZIAŁA"); digitalWrite(11, LOW); delay(500); digitalWrite(11, HIGH); delay(500); reset(); } } void reset() { for(int i=0; i<9; i++) { dane[i]=0; x=0; Serial.println("RESET"); digitalWrite(11, HIGH); } }
  24. Witam, przymierzam się do projektowania układu. Mam jedną kwestię, którą nie wiem jak rozwiązać, żeby było to jak najbardziej poprawne. Chcę mieć dwustronną komunikację z bazą danych. Tzn. zapisywać dane oraz sterować z poziomu strony www poprzez bazę danych i tutaj myślę czy wykorzystać: Moduł sieciowy Ethernet ENC28J60 czy esp ? Czy oba nadają się do dwustronnej komunikacji czy może jakoś inaczej to ugryź. Z góry bardzo dziękuję za każdą radę.
  25. Mam takie pytanie. Czy mieliście może kiedyś problemy z czujnikiem DHT 22? Mój przysparza mi problemów od samego początku. Czujnik zamontowany jest w lodówce ok 5 -6 metrów od arduino. Na początku wykorzystałem jako kabel żyłkę 3 x 1,5. Odczyt był stabilny ale często zrywało połączenie czy coś. Kiedy wypiąłem czujnik i wpiąłem go od nowa odczyt wracał na kilkanaście godzin i znów znikał. Obwiniałem więc kabel. W ramach radykalnej poprawy przesyłu danych zastosowałem przewód FTP CAT. 7. Uziemiłem oplot jak Pan Bóg przykazał i... poprawiła się dokładność odczytu ale czujnik nadal wymaga ręcznego wypinania co kilkanaście godzin. Pomyślałem no dobra, to ja Ci DHT bokiem podeślę(dwoma żyłami 1.5 biegnącymi innym peszlem) 5v i GND a odczyt sobie zgarnę po jednej żyle FTP CAT 7. DHT zareagował pozytywnie a jakże odsyłając jeszcze dokładniejszy pomiar. Niestety po kilkunastu godzinach znów zaprosił mnie na audiencję by ręcznie pomasować mu plecki. Pomyślałem więc - w lodówce cholera jest. Jak otworzę drzwiczki ciepłe powietrze i zimne - się pewnie wilgoć na nim zbiera i stąd problemy. Zamówiłem spray Plastik 70 i obfukałem go izolacyjnie. Ucieszył się niezmiernie i dał jeszcze większą dokładność - na kilkanaście godzin. I tu trafił mnie szlak. Albo to jakieś totalne g... albo ja robię jakiś kardynalny błąd. Ktoś może coś doradzić?
×
×
  • Utwórz nowe...