Skocz do zawartości

Tablica liderów


Popularna zawartość

Pokazuje zawartość z najwyższą reputacją 13.05.2020 we wszystkich miejscach

  1. 2 punkty
    Jakiś czas temu zakupiłem sobie ESP32 CAM, niestety nie umiałem dla niej znaleźć jakiegoś sensownego zastosowania. Przeleżała z pół roku a może i więcej, aż wpadłem na pomysł zrobienia foto-pułapki. I tak oto powstała: Po mojej posiadłości często biegają dzikie zwierzęta takie jak: sarny, bażanty, dziki i zające. Te ostatnie to raczej szkodniki ale lecimy z tematem dalej. Założenia: Zapis zdjęć na karcie SD Wysyłka zdjęć na FTP Wysyłka zdjęć na maila jakiś czujnik temperatury praca możliwie jak najdłużej z jednej baterii wspomaganej panelem PV Po ogarnięciu softu na biurku podłączeniu czujnika PIR wszystko ładnie działało. Za zasilanie odpowiada jedno ogniwo 18650, przetwornica podnosząca napięcie do 5V i mały panel PV 6V 167mA. Jak widać powyżej kamera jest przylepiona klejem dwuskładnikowym, tak by uniknąć uszkodzenia tasiemki. Wszystko zostało umieszczone w obudowie po NanoStation Loco M5. Która została dostosowana do zamontowania panelu PV, czujnika PIR oraz kamery. Poniżej etap pasowania elementów. Został również wydrukowany daszek oraz uchwyty dla szyby która osłania kamerę od deszczu. Obudowa Została dodatkowo pomalowana na czarno - ale chyba będę jej robić jakieś malowanie taktyczne, lub pójdzie w ruch “termoglut” i trzcina żeby się lepiej wtapiała w otoczenie. Pierwsze wyjście w teren i klapa, wszystkie zdjęcia były przejaśnione. Po kilku próbach okazało się że kamera potrzebuje 2s! aby dostosować czas ekspozycji, (lekka tragedia bo przy zajączkach to już go może dawno nie być w kadrze) oczywiście w warsztacie wszystko działało jak należy. Następnym nietrafionym pomysłem okazało się wysyłanie zdjęć na maila, trwa to stosunkowo długo a co za tym idzie zużycie energii jest większe, co doprowadziło do rozładowania baterii po 2 dniach. Konieczne było zrezygnowanie z wysyłki zdjęć na maila. W tej chwili kamera działa bez ładowania już 5 dni. Przykładowe zdjęcia z kamery poniżej: Trapi mnie jeszcze jeden problem mianowicie jeśli na zdjęciu jest więcej szczegółów np: cały kadr trzciny lub trawy, to obraz jest obcinany tak około 100-200px z dołu. Nie jest to chyba problem buforu w ESP bo przy kompresji ustawionej w sofcie na 10 zdjęcia zajmują 384KB jeśli zwiększę kompresje zdjęcia zajmują mniej a obraz i tak jest obcinany. Oprócz zdjęć wyzwalanych czujnikiem ruchu, procesor budzi się co 30 min wykonuje zdjęcie i wysyła je na FTP. To aby mieć pewność że bateria nie uległa rozładowaniu. A i jest jeszcze nieszczęsny czujnik temperatury DS18B20, nie było łatwo go tam upchać bo okazało się że wszystkie piny na płytce są wykorzystywane i jedyny wolny pin który mogę wykorzystać to pin serial RX, co niesie za sobą konieczność wypięcia czujnika w razie chęci przeprogramowania układu. Lista wykorzystanych elementów: ESP32-CAM AI-Thinker Przetwornica step-up 5V wraz z modułem ładowania ogniw 18650 Koszyk na ogniwo 18650 Czujnik PIR Mini panel PV 6V 167mA Antena 2.4 Ghz Podsumowując, działa aczkolwiek widać pewne ograniczenia tego układu chociażby czas jaki kamera potrzebuje na uruchomienie się. Z ciekawostek do ESP32 została podłączona zewnętrzna antena, gdzie przetestowany zasięg to około 200 m :), ale pewnie to też zasługa tego że łącze się do AP który mam wystawiony na dworze. Kodu programu pozwolę sobie w tej chwili nie udostępnić bo mam tam niezły bałagan, a jeszcze staram się uporać z obcinaniem fotek, za jakiś czas na pewno go zamieszczę.
  2. 2 punkty
    Z góry zaznaczam, iż projekt jest baaardzo stary, ma już blisko 3 lata. Jego celem było zbudowanie czegoś pływającego, a związku z tym, że aktualnie trwały wówczas wakacje, pomyślałem, że spróbuję swoich sił w pseudo-modelarstwie Tak powstała bardzo prosta łódka - w założeniu, miała być gabarytowo podobna do kartki A4, sterowana przez Bluetooth i pozwolić na zdalne sterowanie na odległość kilku-kilkunastu metrów - na początku może krótki film: Konstrukcja Na początku, próbowałem wyfrezować klocek drewniany w kształcie korpusu, ale okazał się zdecydowanie za ciężki - chciałem, by był lity, bez drążenia wewnątrz, gdyż nie miałem żadnego doświadczenia z uszczelnianiem i zabezpieczaniem elektroniki/mechaniki przed wodą. Wybór padł więc na wycięcie kadłuba z dużego kawałka pianki poliuretanowej, który potem odpowiednio wyszlifowałem, ściąłem przód (aby był odpowiednio wyprofilowany), a całość pomalowałem kilkukrotnie czerwonym spray'em. Napęd i ster Silnik jest umieszczony na specjalnej (drukowanej 3D) podstawce, jego oś jest skierowana 30 stopni w dół względem płaszczyzny podłoża. Następnie jest połączony z wałem - fragmentem prętu gwintowanego M3, na końcu której znajduje się 3-łopatkowa śruba napędowa. Sam pręt umieszczony jest w dwóch, wklejonych w piankę, tulejkach stalowych, które toczyłem samodzielnie. Ich podstawową funkcją jest łożyskowanie, nie musiały być idealnie wodoszczelne przez to, że całość elektroniki.mechaniki jest umieszczona na, a nie w kadłubie. Sam ster to również drukowana 3D (jak patrzę z perspektywy czasu, to daleko było tym wydrukom do doskonałości ) płytka, umieszczona na wysięgniku i poprzez popychacz (odpowiednio wygięty drucik) połączona z orczykiem serwomechanizmu modelarskiego. Elektronika i oprogramowanie Tutaj również nic wyszukanego - prosty układ składający się Arduino Pro Mini, kilku kondensatorów chroniących mikrokontroler przed spadkami napięć wywołanymi rozruchem silnika, moduł BT HC-05 oraz przekaźnik (wklejony w korpus), służący właśnie do załączania napędu. Całość zasilana jest akumulatorem Li-Pol 7,4V 700mAh. Aplikacja sterująca na system Android to oczywiście stworzona w App Inventor'ze prosty program, umożliwiający połączenie się z modułem BT oraz przyciski: silnik ON/OFF oraz te służące do regulacji kąta wychylenie serwa. Wsad dla Arduino "nasłuchuje" natomiast software'owego SerialPort'u i podejmuje odpowiednią akcję w zależności od otrzymanej literki. Kilka zdjęć Wnioski Łódka, mimo, że stosunkowo prosta, wręcz jak teraz na nią patrzę, to banalna , dostarczyła wiele radości, spełniła podstawowe założenie - pływała i to w sposób kontrolowany oraz uświadomiła mi, że jednak bardziej wolę amatorską robotykę. Odnośnie pytań, dlaczego nie zabezpieczyłem elektroniki i całość jest przyklejona "tak luzem", to zdecydowałem tak zrobić ze względu na prostotę i fakt, że powierzchnia górna kadłuba jest podwyższona względem lustra wody o jakieś kilka cm; a całość jest stabilna i wolna, związku z tym przy spokojnej wodzie żadne zalanie (czy, co gorsza, wywrócenie "do góry nogami") konstrukcji nie grozi Pozdrawiam
  3. 2 punkty
    Witam, Z racji, że z zawodu jestem chemikiem, a hobbistycznie lubię „pobawić się” nieco elektroniką, chciałbym zgłosić projekt DIY, który łączy te dwie pasje. Pomysł na stworzenie „inteligentnego obrazu luminescencyjnego” narodził się po remoncie pokoju, gdy na ścianach zrobiło się dużo wolnego miejsca. Inteligentny obraz luminescencyjny składa się z kilku głównych elementów, do których należą: 1) Matryca obrazu została przygotowana z transparentnej masy na bazie polisiloksanów, znakowanej luminoforem nieorganicznym w postaci siarczku cynku. Luminofor ten wybrałem ze względu na wysoką wydajność luminescencji (świecenia) oraz prostą syntezę. Dla wyjaśnienia dodam, że siarczek cynku (z dodatkiem odpowiedniego aktywatora) wykazuje silną fosforescencję, czyli zdolność do emitowania światła (w kolorze zielonym) po wcześniejszym naświetleniu go promieniowaniem z zakresu światła UV lub światła widzialnego o barwie niebieskiej ( do około 450nm). 2) System silników krokowych jest odpowiedzialny za ruch głowicy rysującej. Składa się on z dwóch silników krokowych 28BYJ-48 wraz ze sterownikami (rozwiązanie budżetowe – dla większej szybkości rysowania można zamontować silniki krokowe wyższej klasy), płytki Arduino UNO oraz uchwytów wydrukowanych na drukarce 3D (materiał niebieski PET-G). 3) Głowica rysująca, której zadaniem jest punktowe dostarczanie światła ultrafioletowego. Składa się ona z obudowy wykonanej przy pomocy technologii druku 3D (materiał niebieski PET-G), obciążenia (dwie baterie typu „paluszki”) oraz lasera o długości fali 405nm wraz z zasilaczem TP4056 (obecnie zastosowany jest budżetowy laser o mocy 5mW). Matryca obrazu została przygotowana poprzez wymieszanie luminoforu z masą polisiloksanową, którą następnie wylano między dwie płyty wykonane z płyt plexi (grubość 1mm) i całość oprawiono aluminiową ramą od obrazu (wymiary 80x60cm). Głowica jest przymocowana za pomocą transparentnej żyłki do dwóch silniczków krokowych zamontowanych na górnych rogach obrazu. Silniczki krokowe są natomiast połączone poprzez sterowniki z płytką Arduino UNO, na którą wgrany został program sterujący ich pracą. Możliwe jest wgranie na płytkę wzoru, który jest rysowany od razu po podłączeniu całości do zasilania lub komunikacja z płytką Arduino UNO bezpośrednio z komputera. W drugim przypadku możemy rysować nieskończoną ilość wzorów, które są wgrywane do programu (skrypt Arduino) polargraphcontroller w postaci grafiki wektorowej. W głowicy rysującej umieszczony jest laser UV (zasilany ładowarką TP4056). W momencie, gdy załączymy zasilanie (lub załadujemy odpowiednią grafikę przy pomocy komputera) laser zostaje załączony a silniczki krokowe poruszają się w ten sposób aby wiązka lasera padająca na matrycę znakowana luminoforem „rysowała” zadany kształt lub napis. Warto zaznaczyć, iż po kilku godzinach obraz znika (luminescencja zanika) i możemy załadować kolejną grafikę. Obecnie mogę więc mieć w pokoju inny obraz każdego dnia. Zamontowanie lasera UV o większej mocy (rzędu 50mW) powinno zapewnić utrzymywanie się obrazu przez cały dzień/noc. Dodatkowo ponieważ przez dzień obraz absorbuje również światło słoneczne wpadające do pokoju przez okno w nocy nawet bez wyrysowanego wzoru widać lekką emisję światła z całej powierzchni obrazu, co pomaga mi w nawigacji po pokoju gdy zdarzy się konieczność przemieścić się gdzieś po przebudzeniu. Oczywiście taki obraz najlepiej wygląda wieczorem lub w nocy przy zgaszonym świetle (przykłady na fotografiach powyżej). Poniżej wstawiam także filmik ilustrujący działanie inteligentnego obrazu. Do otrzymywania "pełnych" obrazów wygodniej jest stosować (zamiast lasera) rzutnik UV, który zbudowałem do tego celu. Jego głównymi elementami są dioda UV 3W, soczewka powiększająca, ładowarka TP4056 oraz przezrocze z wypalonym wzorem. Przezrocza przygotowuję poprzez wycięcie z czarnej tektury odpowiedniego wzoru (przy pomocy grawerki laserowej), a następnie zaklejenie wygrawerowanego otworu przezroczystą taśmą. Fotografie rzutnika przedstawiono poniżej. Mam nadzieję, że projekt się spodobał Uwagi: 1) Z racji że system sterujący silnikami i zasilanie lasera jest zamontowane z tyłu za obrazem (od strony ściany), a nie mam możliwości ściągnięcia obrazu (jest dosyć ciężki i boję się że mógłbym go z powrotem nie założyć) wysunąłem te elementy z obudowy i na fotografii są przedstawione w formie „surowej” (bez obudowy). 2) Dźwięk, który słychać na nagranym filmiku pochodzi od drukarek 3D, które ostatnimi czasy nieprzerwanie pracują nad drukiem przyłbic ochronnych. Sama maszyna nie wydziela praktycznie jakichkolwiek dźwięków, a przynajmniej nie takich, które byłyby dla mnie słyszalne.
  4. 1 punkt
    Witam chce wam przedstawić mojego pierwszego robota o nazwie LEM Od dłuższego czasu w moim domu leżały nieużywane moduły zdalnego sterowania do bram wjazdowych. Stwierdziłem, że jest to marnowanie ich potencjału, w mojej szkole miał odbyć się cykliczny konkurs mam talent gdzie uczniowie z całej szkoły pokazywali co potrafią. Ten projekt był pierwszym tego typu ''talentem'' w mojej szkole i wywołał nie małe zainteresowanie. Więc tak jak napisałem wyżej za rozum robota odpowiadał moduł 12 kanałowy z wbudowanymi przekaźnikami. Nie było to najlepsze rozwiązanie, ale chciałem wykorzystać to co mam. Planując możliwości robota uparłem się na gąsienice, nie chciałem montować kół, bardziej fascynowały mnie właśnie gąsienice. Te napędzane były przez dwie niezależne głowice od wkrętarek 12v dzięki czemu lem miał możliwość skręcania. Głowice zakończone zębatkami od przerzutek rowerowych zdawały się nie najlepiej ale wystarczająco dobrze dużo lepiej zdałyby egzamin np. takie silniki z przekładnią. Ramię robota zginane jest też za pomocą silników od wkrętarek z zamontowaną śrubą trapezową. Tak działały dwa zgięcia ''ręki'' natomiast sam chwytak działał przy pomocy osi z napędu dvd. Napęd ten był nietypowy ponieważ wykorzystywał silnik dc a nie silnik krokowy jak można to spotkać w większości napędów. Nie ukrywam, ułatwiło mi to zadanie. Najwięcej czasu zajęło mi zrobienie gąsienic skradają się one z 5 łańcuchów rowerowych. co drugi nit w łańcuchu musiałem wybić i zastąpić prętem m3 ręcznie dociętym na 6cm łącząc tym samym dwa łańcuchy równolegle. Pomiędzy nimi wsunąłem dystanse zrobione z rurek od namiotu, nadały się idealne! Następnie ze starej opony rowerowej powycinałem małe elementy które zostały przewiercone i przyczepione na trytytki. Pod spód mojej maszyny doczepiłem ledy wydobyte kosztem lampki nocnej ale można je kupić również oddzielnie w formie pasków LED. Jednak to nie jedyne oświetlenie lema z przodu posiada on dwa reflektory 10W. Są to nieco zmodyfikowane lampki rowerowe, rozebrałem obudowę lampki i włożyłem tam własne ogniwo led. Te grzało się tak bardzo, że niezbędne okazało się zamontowanie z tyłu radiatory chłodzące. na powyższym zdjęciu można zaobserwować rurę u dołu robota jest to niedopracowany odkurzacz działający na wentylatorze komputerowym, jednakże działało to dość słabo dlatego traktuje to bardziej jako ciekawostkę. Ciekawy może też być tył robota. Lem nosi na swoich barkach odznakę ZSRR i znak wysokiego napięcia. Kontroler to przerobiony pad do gier z wymienionymi przyciskami i doklejonym pilotem do ledów. Robot działał na 9 akumulatorach 18650 które działały znakomicie. Jeszcze parę bajeranckich przełączników dźwigniowych tego typu lub takich i robot gotowy! film z działania okazał się zbyt duży i nie mogłem go tutaj przesłać wiec wrzuciłem na yt i proszę bardzo wszystko działa! Dziękuje wszystkim za uwagę i chcę was zachęcić tym samym do budowy odważniejszych projektów. Ten robot był prosty w podłączaniu teraz uczę się języka Arduino mam nadzieję że przeczytacie tu jeszcze nie jeden artykuł mojego autorstwa!
  5. 1 punkt
    Witam serdecznie wszystkich czytelników Forbota w tym artykule chciałbym opisać projekt, który udało mi się skończyć całkiem niedawno. Mowa o urządzeniu do monitorowania prądów fazowych silników elektrycznych. W kwestii, krótkiego wstępu warto wspomnieć, że silniki elektryczne wykorzystywane są jako jednostki napędowe w znacznej większości maszyn i urządzeń, dlatego niezbędne jest utrzymanie ich w dobrej kondycji w trakcie eksploatacji. Do przeprowadzenia oceny stanu technicznego silników eklektycznych wykorzystuje się m.in. metodę MCSA (ang. Motor Current Signature Analysis), która polega na pozyskaniu informacji o stanie technicznym silnika poprzez analizę widma prądu fazowego stojana. Na tej podstawie możliwe jest wykrycie uszkodzeń zarówno części mechanicznej jak i obwodów elektromagnetycznych silnika. Aby możliwe było przeprowadzenie analizy MCSA należy pozyskać sygnał związany z prądem fazowym silnika. Stało się to motywacją do opracowana ww. urządzenia. Zaprojektowany układ, dedykowany dla silników zarówno jedno jak i trójfazowych, pozwala na pozyskanie informacji o prądzie pobieranym niezależnie przez poszczególne fazy silnika. W tym celu wykorzystano trzy przekładniki prądowe TA28E-00 o przełożeniu 1:50 (max. 5A – 100mA). Zastosowanie przekładników prądowych pozwala na przeniesienie całego spektrum sygnału prądowego na sygnał napięciowy, a także zapewnia izolację galwaniczną pomiędzy stroną wysoko i niskonapięciową. Przykładowy układ przekładnika prądowego przedstawiono na rysunku poniżej. Prąd po stronie wtórnej przekładnika przepływa przez pomiarowy rezystor bocznikowy o rezystancji 1 Ohma. Układ wzmacniacza odwracającego LM324D wzmacnia spadek napięcia na rezystorze pomiarowym, proporcjonalny do przepływającego przez niego prądu. Wzmocnienie układu uzależnione jest od rezystora zamieszczonego w pętli sprzężenia zwrotnego wzmacniacza. Wybór wzmocnienia (x1, x4.7, x10, x47, x100, x500) następuje poprzez wybór odpowiedniej pozycji przełącznika obrotowego GAIN. Następnie za układem wzmacniacza zamieszczono przełącznik bistabilny opisany jako RANGE, umożliwiający wybór zakresu sygnału wyjściowego (±2.5V lub 0-5V). Urządzenie wyposażone jest w 3 tego typu układy. Urządzenie ma możliwość zasilenia układów wewnętrznych bezpośrednio z jednej z faz podłączonych do wejścia trójfazowego 3x400V, zewnętrznego źródła napięcia przemiennego 230V 50Hz oraz napięcia stałego 5V (min. 100mA). Zmiana źródła zasilania dokonywana jest przy pomocy przekaźników. Najwyższy priorytet ma zewnętrzne źródło napięcia stałego 5V. Wynika to z możliwości zasilenia układów ze źródła zasilania bateryjnego (np. power bank). Dzięki temu sygnał wyjściowy pozbawiony jest zakłóceń pochodzących z sieci elektrycznej tj. niskonapięciowe składowe o częstotliwości 50Hz. Podczas zasilania układów elektronicznych ze źródła napięcia przemiennego (z wejścia trójfazowego 3x400V lub zewnętrznego 230V) układy elektroniczne zasilane są poprzez przetwornicę AC/DC 230V-5V. Wejście przetwornicy zabezpieczone jest bezpiecznikiem topikowym oraz warystorem. Zasilacz modułowy widoczny na rysunku powyżej stosowany jest tylko w celu załączenia przekaźnika podczas zasilania urządzenia z sieci elektrycznej 230V. Dzięki wyprowadzeniu sygnałów na złącze goldpin urządzenie może zostać wzbogacone o dodatkowy układ mikroprocesorowy umożliwiający konwersję ADC sygnału napięciowego oraz przesłanie danych drogą bezprzewodową do komputera PC. Układ przetestowano pod kątem komunikacji radiowej oraz sieci WiFi. W pierwszym przypadku wykorzystano moduł NUCLEO STM32F303K8, do którego podłączono moduł radiowy RFM73-D. Do odbioru danych z urządzenia pomiarowego wykorzystano autorskie urządzenie USB z tym samym modułem radiowym (rysunek poniżej). Druga możliwość obejmowała wykorzystanie bezprzewodowej platformy pomiarowej OpenScope MZ. W tym wypadku możliwe było monitorowanie maksymalnie 2 kanałów. Wynikało to z ograniczeń zastosowanego modułu pomiarowego OpenScope MZ. O ile platforma OpenScope umożliwia wygodną prezentację wyników, tak wykorzystanie transmisji radiowej pozwala na dowolne wykorzystanie danych cyfrowych przez dowolny system do analizy danych tj. DASYlab. Dane mogą być importowane na bieżąco przez program i wykorzystywane do dalszych analiz, np. wcześniej wspomnianą techniką MCSA. Podsumowując, urządzenie może znaleźć zastosowanie w monitorowaniu prądów fazowych nie tylko silników elektrycznych, ale również dowolnego urządzenia zasilanego napięciem max. 3x400V oraz pod warunkiem, że poszczególne fazy nie będą obciążone prądem wyższym niż 5A. Urządzenie zostało zaprojektowane pod kątem wielu możliwości zasilania oraz przesyłania sygnałów wyjściowych (analogowo oraz cyfrowo), co umożliwia szerokie spektrum zastosowania w układach służących do precyzyjnych pomiarów i analiz prądów zasilających maszyny i urządzenia różnego typu.
  6. 1 punkt
    Panowie dziś się trochę bawiłem elektroniką, i podczas wylutowywania elektrolitu, wyskoczył z skórki,. Dosłownie. Została mi taka oto łysa beczułka 10uF/400V. Pytanie na podwieczorek brzmi. Jak teraz określić jego polaryzację, czyli gdzie jest Plus, a gdzie Minus? Oczywiście mógłbym go bez płaczu wyrzucić, ale stwierdziłem że ciekawy temat, na dyskusje.
  7. 1 punkt
    Albo po prostu if (START) { } Dla wyjaśnienia - if "wchodzi" w kod, jeśli to co w nawiasie nie wyjdzie 0, czyli jeśli bedzie START jako false to będzie 0 i "pomija", a jeśli jako true, to będzie 1 i wykonuje. Tak możesz na przyszłość uniknąć takich błędów
  8. 1 punkt
    @ZwiewnyTrzmiel witam na forum Ciężko coś powiedzieć, co na pewno rzuciło mi się w oczy to nieprawidłowy warunek: if (START = true) Tu trzeba zamienić na operator porównania ==, ale nie jest to powód do nieskompilowania kodu. A możesz przekopiować cały wynik? Przycisk znajdziesz na pomarańczowym tle tak ja na screenshocie:
  9. 1 punkt
    W ramach uzupełnienia uszczelnionych fotek :
  10. 1 punkt
    Witam! Podobnie jak kolega cztery wpisy wyżej połączyłem trzy tryby działania robota, wybór trybu sygnalizowany jest mignięciem diody oraz buzzerem. Aby robot zaczął działać po wybraniu trybu trzeba jeszcze go "włączyć pilotem". Oczywiście w trakcie działania można go pilotem wyłączyć. W trybach światłolub i ręcznie sterowanie w przypadku wykrycia przeszkody robot się cofnie i zatrzyma. Klawiszem od regulacji głośności można również zwiększyć i zmniejszyć prędkość robota. #include <RC5.h> //ustawienia silnikow #define PWM_MAX 165 //maksymalne obroty przy zasilaniu 9V #define L_PWM 5 //obroty silnika lewego #define L_DIR 4 //kierunek silnika lewego #define R_PWM 6 //obroty silnika prawego #define R_DIR 9 //kierunek silnika prawego //sensory - wąsy #define L_SIDE_SENSOR A2 #define R_SIDE_SENSOR 7 //sensory - czujnik światła #define L_LIGHT_SENSOR A1 #define R_LIGHT_SENSOR A0 //glosnik #define BUZZER 10 //dioda #define LED 13 //odbiornik IR #define TSOP_PIN 3 //przekazanie na jakim pinie jest odbiornik IR RC5 rc5(TSOP_PIN); //zmienne dla RC5 byte address; byte command; byte toggle; //tryby działania const String tryb1 = "OMIJANIE_PRZESZKOD"; const String tryb2 = "SWIATLOLUB"; const String tryb3 = "STEROWANIE_IR"; //zmienna do ustalenia w jakim trybie działa robot, domyslnie tryb3 sterowanie IR String trybDzialania = tryb3; //zmienne do kierowania robotem boolean jazda = false; int los = 5; //do losowego czasu trwania obrotu przy przeszkodzie int kierunek = 5; int predkosc = 50; #define V_MAX 80 #define V_MIN 30 //zmienne do trybu światłolub int odczytLewy = 0; int odczytPrawy = 0; int roznicaSwiatla = 0; int zmianaPredkosci = 0; #define ROZNICA_MIN -300 #define ROZNICA_MAX 300 void setup() { //Konfiguracja pinow mostku H pinMode(L_DIR, OUTPUT); pinMode(R_DIR, OUTPUT); pinMode(L_PWM, OUTPUT); pinMode(R_PWM, OUTPUT); //konfiguracja pinow od sensorów - wąsy pinMode(L_SIDE_SENSOR, INPUT_PULLUP); pinMode(R_SIDE_SENSOR, INPUT_PULLUP); //Konfiguracja pozostalych elementow pinMode(BUZZER, OUTPUT); digitalWrite(BUZZER, 0); //buzzer wylaczony pinMode(LED, OUTPUT); digitalWrite(LED, 0); //wylaczenie diody //inicjalizacja generatora liczb pseudolosowych randomSeed(analogRead(A5)); //Serial.begin(9600); } void loop() { //jeśli odebrano dane, reakcja na przyciski pilota if (rc5.read(&toggle, &address, &command)) { switch (command) { case 12: // właczanie/wyłączanie silnikow if (jazda == false) { jazda = true; zapalDiode(LED); zatrzymajRobota(); delay(500); } else { jazda = false; zgasDiode(LED); zatrzymajRobota(); delay(500); } break; case 16: //zwiekszanie predkosci if (predkosc < V_MAX) { predkosc = predkosc + 5; //Serial.println(predkosc); } break; case 17: //zmiejszanie predkosci if (predkosc > V_MIN) { predkosc = predkosc - 5; //Serial.println(predkosc); } break; case 1: //skret w lewo do przodu kierunek = 1; break; case 2: //do przodu kierunek = 2; break; case 3: //skret w prawo do przodu kierunek = 3; break; case 4: //obrot w lewo kierunek = 4; break; case 5: //stop zatrzymajRobota(); break; case 6: //obrot w prawo kierunek = 6; break; case 7: //skret w lewo do tyłu kierunek = 7; break; case 8: //do tylu kierunek = 8; break; case 9: //skret w prawo do tylu kierunek = 9; break; case 35: //wlacz diode zapalDiode(LED); break; case 62: //wylacz diode zgasDiode(LED); break; case 36: //klakson klaskonON(BUZZER); delay(200); klaksonOFF(BUZZER); break; //wybór trybów działania robota case 107: jazda = false; zatrzymajRobota(); for (int i = 0; i < 1; i++) { zapalDiode(LED); klaskonON(BUZZER); delay(100); zgasDiode(LED); klaksonOFF(BUZZER); delay(100); } trybDzialania = tryb1; break; case 108: jazda = false; zatrzymajRobota(); for (int i = 0; i < 2; i++) { zapalDiode(LED); klaskonON(BUZZER); delay(100); zgasDiode(LED); klaksonOFF(BUZZER); delay(100); } trybDzialania = tryb2; break; case 109: jazda = false; zatrzymajRobota(); for (int i = 0; i < 3; i++) { zapalDiode(LED); klaskonON(BUZZER); delay(100); zgasDiode(LED); klaksonOFF(BUZZER); delay(100); } trybDzialania = tryb3; break; } } //jesli jazda == true, tryb1 - jedz reagujac na przeszkody if (jazda == true && trybDzialania == "OMIJANIE_PRZESZKOD") { //jazda do przodu jedzDoPrzodu(predkosc); los = random(5, 20) * 10; //czs obrotu miedzy 50 a 200 ms //przeszkoda po lewej stronie if (digitalRead(L_SIDE_SENSOR) == LOW) { jedzDoTylu(predkosc); klaskonON(BUZZER); delay(300); obrotPrawo(predkosc - 10); klaksonOFF(BUZZER); delay(140 + los); } //przeszkoda po prawej stronie if (digitalRead(R_SIDE_SENSOR) == LOW) { jedzDoTylu(predkosc); klaskonON(BUZZER); delay(300); obrotLewo(predkosc - 10); klaksonOFF(BUZZER); delay(140 + los); } } //jesli jazda == true, tryb2 - światłolub if (jazda == true && trybDzialania == "SWIATLOLUB") { odczytLewy = analogRead(L_LIGHT_SENSOR); odczytPrawy = analogRead(R_LIGHT_SENSOR); roznicaSwiatla = odczytLewy - odczytPrawy; //czy nie przekracza max if (roznicaSwiatla < ROZNICA_MIN) { roznicaSwiatla = ROZNICA_MIN; } else if (roznicaSwiatla > ROZNICA_MAX) { roznicaSwiatla = ROZNICA_MAX; } //przeliczamy roznice w jasnosci na zmiane predkosci zmianaPredkosci = map(roznicaSwiatla, ROZNICA_MIN, ROZNICA_MAX, -predkosc, predkosc); skretSwLub(predkosc, zmianaPredkosci); //jesli natrafil na przeszkode wydaj dzwiek cofnij, zatrzymaj i 'wyłacz' robota if (digitalRead(L_SIDE_SENSOR) == LOW || digitalRead(R_SIDE_SENSOR) == LOW) { kierunek = 5; jazda = false; zgasDiode(LED); klaskonON(BUZZER); jedzDoTylu(predkosc); delay(500); klaksonOFF(BUZZER); stopSilniki(); } } // jesli jazda == true, tryb3 - jedź zdodnie z danymi z pilota if (jazda == true && trybDzialania == "STEROWANIE_IR") { switch (kierunek) { case 1: //skret w lewo do przodu skretLewo(predkosc); break; case 2: //do przodu jedzDoPrzodu(predkosc); break; case 3: //skret w prawo do przodu skretPrawo(predkosc); break; case 4: //obrot w lewo obrotLewo(predkosc - 10); break; case 5: //stop stopSilniki(); break; case 6: //obrot w prawo obrotPrawo(predkosc - 10); break; case 7: //skret w lewo do tyłu skretLewo(-predkosc); break; case 8: //do tylu jedzDoTylu(predkosc); break; case 9: //skret w prawo do tylu skretPrawo(-predkosc); break; } //jesli natrafil na przeszkode wydaj dzwiek cofnij i zatrzymaj if (digitalRead(L_SIDE_SENSOR) == LOW || digitalRead(R_SIDE_SENSOR) == LOW) { kierunek = 5; klaskonON(BUZZER); jedzDoTylu(predkosc); delay(500); klaksonOFF(BUZZER); stopSilniki(); } } } //funcje sterujace robotem void lewySilnik(int V) { if (V > 0) { V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(L_DIR, 0); //kierunek do przodu analogWrite(L_PWM, V); //ustawienie predkosci } else { V = abs(V); V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(L_DIR, 1); //kierunek do tylu analogWrite(L_PWM, V); //ustawienie predkosci } } void prawySilnik(int V) { if (V > 0) { V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(R_DIR, 0); //kierunek do przodu analogWrite(R_PWM, V); //ustawienie predkosci } else { V = abs(V); V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(R_DIR, 1); //kierunek do tylu analogWrite(R_PWM, V); //ustawienie predkosci } } void stopSilniki() { analogWrite(L_PWM, 0); analogWrite(R_PWM, 0); } void jedzDoPrzodu(int V) { lewySilnik(V); prawySilnik(V); } void jedzDoTylu(int V) { lewySilnik(-V); prawySilnik(-V); } void obrotLewo(int V) { lewySilnik(-V); prawySilnik(V); } void obrotPrawo(int V) { lewySilnik(V); prawySilnik(-V); } void skretLewo(int V) { lewySilnik(V / 2); prawySilnik(V); } void skretPrawo(int V) { lewySilnik(V); prawySilnik(V / 2); } void skretSwLub(int V, int zV) { lewySilnik(V + zV); prawySilnik(V - zV); } void zatrzymajRobota() { kierunek = 5; stopSilniki(); } //funkcje pomocnicze //zapalanie diody void zapalDiode(int PIN) { digitalWrite(PIN, 1); } //gaszenie diody void zgasDiode(int PIN) { digitalWrite(PIN, 0); } //włacznie buzzera void klaskonON(int PIN) { digitalWrite(PIN, 1); } //wylaczenie buzzera void klaksonOFF(int PIN) { digitalWrite(PIN, 0); } Tutaj robot we wszystkich trzech trybach:
  11. 1 punkt
    @Astronom witam na forum Sterownik z tego miejsca powinien być odpowiedni: https://www.st.com/en/development-tools/stsw-link009.html Przy okazji zachęcam do korzystania z nowej wersji kursu (jest zgodna z Twoim zestawem): https://forbot.pl/blog/kurs-stm32-f1-migracja-na-hal-wstep-spis-tresci-id23580
  12. 1 punkt
    Cześć majsterkowicze! Jakiś czas temu zakupiłem konsolę Nintendo Switch, po wielu godzinach frajdy jaką mi dała włączył mi się instynkt majsterkowicza i zrodziła idea zbudowania własnej konsoli. Początkowo rozważałem użycie Raspberry Pi i zbudowanie handheldowego emulatora na Retro Pi. Jednak biorąc pod uwagę, że z zawodu jestem programistą a tam nie miałbym za wiele do "kodzenia" stwierdziłem, że zejdę poziom niżej i spróbuję coś zrobić w oparciu o AtMegę. Zamysł był prosty, stworzyć konsolę na AtMedze z własnym firmware i silnikiem do tworzenia gier a potem zaprogramować na nią jakieś gry. Pod ręką jednak nie miałem żadnego wolnego "odpowiednio mocnego" mikrokontrolera od MicroChipa, więc musiałem się poratować Arduino ProMini z AtMegą 328. Do interakcji z użytkownikiem wykorzystałem TactSwitche (4 jako przyciski kierunkowe, 1 akcji ale rozważam dodanie 2 przycisku akcji aby stworzyć układ znany z klasycznego GameBoya) oraz wyświetlacz OLED 128x64 komunikujący się z Arduino przez I2C. Do tego wszystkiego dołączyłem Buzzer aby dodać efekty dźwiękowe i proste melodyjki Zasilanie całej konsoli odbywałoby się przez stabilizator 7805 z baterii 9V (wiem, że jest niekonieczny przy Arduino ale zostawiłem go na wypadek późniejszej wymiany Arduino na suchą AtMege :D). Poniższy schemat pokazuje nieskomplikowaną budowę konsoli. Jako pierwszą grę stworzyłem klona kultowego Pong ale dla jednego gracza (drugą paletką kieruje sztuczna inteligencja). Kod gry można zobaczyć poniżej: #include <Adafruit_SSD1306.h> #include "engine.h" #define PLAYER_SPEED 50 #define ENEMY_SPEED 80 #define BALL_START_SPEED 40 #define BALL_MAX_SPEED 60 float player_y; float enemy_y; float enemy_movement; unsigned long last_decision; unsigned long last_incrementation; float ball_x; float ball_y; short ball_speed; short ball_motion_x; short ball_motion_y; short player_score; short enemy_score; long currentTime; long oldTime; float deltaTime; void resetBall() { ball_x = 62; ball_y = 30; ball_motion_x = -1; ball_motion_y = 1; ball_speed = BALL_START_SPEED; delay(500); } void gameSetup() { player_y = 22; enemy_y = 22; enemy_movement = 0; player_score = 0; enemy_score = 0; resetBall(); } void gameLoop(short axis_x, short axis_y, bool action) { oldTime = currentTime; currentTime = millis(); deltaTime = (float)(currentTime - oldTime) / 1000; player_y += PLAYER_SPEED * axis_y * deltaTime; enemy_y += ENEMY_SPEED * enemy_movement * deltaTime; // Enemy AI float distance = sqrt(pow(ball_x - 121, 2) + pow(ball_y - enemy_y, 2)); enemy_movement = 0; if (distance > 15 && distance < 100) { if (millis() - last_decision > 50) { if (ball_y > enemy_y + 10) { enemy_movement = 1; } else if (ball_y < enemy_y + 10) { enemy_movement = -1; } last_decision = millis(); } } player_y = constrain(player_y, 0, 44); enemy_y = constrain(enemy_y, 0, 44); // Ball movement ball_x += ball_speed * ball_motion_x * deltaTime; ball_y += ball_speed * ball_motion_y * deltaTime; if (ball_y >= 64 - 4 || ball_y <= 0) { ball_motion_y *= -1; } if (ball_x >= 4 && ball_x <= 7 && ball_motion_x < 0) { if (ball_y > player_y - 4 && ball_y < player_y + 20) { ball_motion_x *= -1; } // Increment ball speed with every successfull bounce if (ball_speed < BALL_MAX_SPEED) { ball_speed++; } } if (ball_x >= 121 && ball_x <= 124 && ball_motion_x > 0) { if (ball_y > enemy_y - 4 && ball_y < enemy_y + 20) { ball_motion_x *= -1; } } // Count score if (ball_x > 128) { player_score += 1; resetBall(); } if (ball_x < 0) { enemy_score += 1; resetBall(); } // Game over condition if (enemy_score > 10) { gameOver(); } // Win condition if (player_score > 10) { playerWins(); } } void gameDraw(Adafruit_SSD1306 display) { display.clearDisplay(); // Draw player display.fillRect(0, player_y, 3, 20, SSD1306_WHITE); // Draw enemy display.fillRect(125, enemy_y, 3, 20, SSD1306_WHITE); // Draw ball display.fillRect(ball_x, ball_y, 4, 4, SSD1306_WHITE); // Draw mid line for (int i = 0; i < 32; i++) { int position = 4 + (4 * (i-1)); display.fillRect(63, position, 2, 2, SSD1306_WHITE); } // Draw score display.setTextColor(SSD1306_WHITE); display.setTextSize(1); display.setCursor(50, 0); display.println(player_score); display.setCursor(72, 0); display.println(enemy_score); display.display(); } Nie jest to "samowystarczalny" kod Arduino, do działania wymaga on jeszcze firmware i silnika do gier, którego ze względu na niedopracowanie nie mogę go teraz pokazać (ale gdy tylko go skończę udostępnię całość na GitHub :D). Kod gry jest banalny. Do grafiki używam biblioteki od AdaFruit. Sztuczną inteligencją kieruje implementacja algorytmu "Chaser" do gry PONG z małymi moimi modyfikacjami (reakcja dopiero w momencie gdy piłka będzie na odpowiednim dystansie oraz opóźnienie reakcji AI aby ją bardziej "uczłowieczyć" i dać jakieś szanse na zwycięstwo graczowi (aczkolwiek i tak z tym cieżko bo czas reakcji bota jest dosyć niski XD, obecnie jest to ok. 50ms. Dla porównania człowiek przeciętnie ma reakcję po ok. 200ms). Gra się kończy gdy jeden z graczy zdobędzie 10 punktów, punkty zdobywamy odbijając piłeczkę tak aby przeciwnik nie mógł jej odbić (gdy piłka "wyleci za paletkę" punkt otrzymuje gracza używający przeciwnej paletki). W silniku brakuje jeszcze wielu rzeczy min. obliczania delta time wewnątrz silnika i przekazywanie wyniku do gry czy bardziej dopracowanego kodu odpowiedzialnego za sterowanie dźwiękiem (w tym prostego "odtwarza" melodyjek zapisanych jako sekwencja dźwięków). Do tego nie ma jeszcze obsługi ekranu końca gry (oraz zwycięstwa) i tak zwane splash screenu przed startem. Jednak gra jest grywalna co można zobaczyć na filmiku na samym dole. Prototyp prezentuje się tak: Jest zbudowany na płytce stykowej (podłączone są na razie tylko dwa przyciski, które są wykorzystywane w grze. Odłączony tak samo jest Buzzer, który na razie odtwarza w pętli trzy dźwięki). W planach jest również stworzenie na drukarce 3D obudowy w tym przeniesienie całego układu na PCB by zrobić z urządzenia pełnoprawną konsole Gdy uda mi się skończyć firmware i silnik w planach mam dalsze wspieranie konsoli tworząc na nią kolejne gry (następne w kolejce są klon Froggera i Tetrisa). Z powodu dodawania kolejnych gier może dojść potrzeba dołączenia dodatkowej pamięci EEPROM lub modułu z kartą SD. (Koncepcja finalnego produktu. Wiem, że artysta ze mnie średni :D) Link do wideo z działaniem konsoli
  13. 1 punkt
    Nie dawno wpadłem na pomysł stworzenia prostego alarmu dzięki któremu miałbym możliwość zabezpieczenia swoich robotów przed zabraniem przez młodszego brata do zabawy. Projekt zrealizowałem wykorzystując NE555, LM358, fotorezystor, buzzer, tranzystor BC547, potencjometr, rezystory 10kΩ ,100Ω 1kΩ , diodę laserową , złącze ark, diodę czerwoną, tact swicha, przełącznik klej na gorąco. KONSTRUKCJA OBWODU Fotorezystor i rezystor 10kΩ są połączone w sposób dzielnika napięcia jego wyjście do pinu nieodwracalnego LM358. Do pinu odwracalnego jest podłączone wyjście potencjometru a dwa pozostałe piny do plusa i minusa zasilania. Wyjście wzmacniacza podłączony jest do pinu bazy tranzystora NPN prze dwa rezystory 100Ω. Pin wyzwalający NE555 ma podpięty rezystor 10kΩ podobnie pin resetu NE555 dodatkowo między pinem resetu a zasilaniem jest przycisk służący do resetowania. Kondensator ceramiczny jest podłączony do pinu 4 NE555 a buzzer do pinu 3. DZIAŁANIE W tym alarmie LM358 działa jako komparator porównując napięcie na pinach odwracalnym i nie odwracalnym. Potencjometr służy do ustalania napięcia referencyjnego dla kompaktora. W zależności od rezystancji fotorezystora na wyjściu LM358 będzie stan niski(tranzystor wyłączony) albo wysoki(tranzystor włączony)Wyjście tranzystora jest połączone z pinem 2 NE555 co w przypadku włączenia tranzystora powoduje że na pinie 3 pojawia się stan wysoki(buzzer się aktywuje). WSKAŹNIK LASEROWY Tu niema za bardzo co opisywać to tak proste jak tylko możliwe.Ładowarka Li-Pol połączona z przełącznikiem i diodą laserową. Wszystko połączone za pomocą kleju na gorąco. MECHANIKA Elektronika alarmu znajduje się na plastikowym pudełku przyczepiona do niego klejem na gorąco.Ogólnym zamysłem było to żeby obudowa pozwoliła przymocować alarm za pomocą taśmy dwustronnej do np. drzwi pod stół itp. Dodatkowo jak widać na filmiku jest dioda informująca o zasilaniu alarmu którą można wyłączyć za pomocą przełącznika 1 za pomocą drugiego można włączyć/wyłączyć sam alarm.
  14. 1 punkt
    Można spróbować zaprogramować go do układania Wieży Hanoi (chyba każdy zna tę układankę) przy użyciu kamerki, tak, żeby sam decydował który krążek wziąć i przełożyć..
  15. -1 punktów
    A co mają poradzić na twoją niezdarność? Po dziś dzień nie pokazałeś zdjęć jak to wszystko podłączasz, a często to nawet "stykówki" robią mega problemy...
Tablica liderów jest ustawiona na Warszawa/GMT+02:00
×
×
  • Utwórz nowe...