Skocz do zawartości

Tablica liderów


Popularna zawartość

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

  1. 2 punkty
    Tester elementów elektronicznych na Atmega328P i LCD Nokia 5110 Opis konstrukcji Tester powstał w celu nauki rysowania schematów w Eagle oraz nauki podstaw programowania mikroprocesorów. Dodatkowo jest małych rozmiarów. Po raz pierwszy zastosowałem elementy SMD. Oczywiście wzorowałem się na dostępnych w sieci schematach, wykorzystałem doświadczenie autorów innych tego typu konstrukcji. Nowością jest wykorzystanie LCD Nokia5110/3110. Oczywiście można kupić obecnie testery o podobnych rozmiarach z wyświetlaczami kolorowymi, ale nic się wtedy nie nauczymy. Schemat i widok płytki w Eagle: No i fotki wykonanej konstrukcji: Aby ułatwić możliwość wymiany serca naszego projektu - procesora Atmega32 i podstawki testowej ZIF14 (procesor mozna uszkodzić nie rozładowanym kondensatorem, natomiast podstawka pomiarowa ZIF zużywa się), zostały one umieszczone w podstawkach. Dodatkowo gniazdo ZIF oraz enkoder ma znajdować się nad LCD w celu uproszczenia montażu całości w obudowie. Dla osób chętnych wykonać dla siebie taki tester zamieszczam linki do "referencyjnej" konstrukcji autora pierwowzoru całego projektu oraz do źródeł oprogramowania. W swojej konstrukcji, w celach testowych zastosowałem rezystory pomiarowe 680om oraz 470kom z tolerancją 0,1%. W oprogramowaniu wpisałem również dokładną wartość napięcia odniesienia w mV. Napięcie odniesienia TL431 z tolerancją 1%. Pomiar napięcia odniesienia wykazał 2491mV. Taka wartość została wpisana do programu mikroprocesora. Konstrukcja nie jest pozbawiona wad: dioda LED sygnalizująca pracę znajduje się pod LCD (moja świadoma decyzja), brak podświetlenia LCD (uznałem je za zbędne), zasilanie z zasilacza 12V (łatwo można przerobić całość i zastosować baterię 9V lub 2x18650), wykonanie pozostawia wiele do poprawy (w tym szczególnie luty SMD). Oto kilka filmów prezentujących jak pracuje tester: Przepraszam za jakość filmów, ale ciężko jest zmieniać elementy, trzymać tester i telefon w jednym czasie W załączniku zamieszczam materiały pozwalające na samodzielne skonstruowanie testera: Schemat w EAGLE wraz z rysunkiem ścieżek. Skompilowane pliki źródłowe oprogramowania w wersji 1.31m. Ustawienia fusebitów procesora, bo sam tego szukałem: Wyniki "pomiarów" z wykorzystaniem testera wychodzą zbliżone do pomiarów chińskim miernikiem ANENG 102 oraz bardziej znanym i cenionym UNI-T UT71. Przy okazji mogę nadmienić, iż wspomniany chiński miernik nie odbiega pomiarami od UNI-T. Projekt powstawał już dłuższy czas temu. Test polegający na stosowaniu rezystorów o tolerancji 0,1% oraz dokładnej kalibracji napięcia referencyjnego ujawnił, iż najsłabszym ogniwem jest w tej konstrukcji Atmega. Kusi zrobienie takiej konstrukcji na STM32. Mam 3 testery i uzyskuję na nich zbliżone wyniki (Wspomniana konstrukcja, konstrukcja z LCD 1604 i rezystorami 1%, tester GM328 z aliexpress). W przyszłości zminimalizuję cały tester stosując wszystkie elementy SMD i LCD bezpośrednio na PCB. Całość będzie wtedy kieszonkową wersją wielkości obecnego LCD. I z płytki wystawię złącza na zewnętrzne sondy. Tester elementów elektronicznych na Atmega328P i LCD Nokia 5110.zip eagle.zip
  2. 2 punkty
    @kaczakat - program który podałeś działa nieco inaczej. Cały problem nie wynika z użycia millis(), micros() czy innej funkcji. Równie dobrze możemy po prostu używać licznika w pętli. Każda z tych funkcji zwraca zmienną o skończonej długości - np. 32 bitów. Więc po pewnym czasie - dla millis() będzie to 49dni, dla micros 1000 razy szybciej następuje przepełnienie i wartości liczą od początku. Problem polega na "sprytnym" operowaniu typami ze znakiem i bez znaku, tak aby uzyskać poprawne działanie. W przypadku kodu, który podał @narbej tak nie było. Ja chciałem pokazać jak zasymulować problem używając zmiennych 8-bitowych i tylko udowodniłem samemu sobie jak trzeba uważać z typami w C. Wbrew pozorom przypisanie m =millis() jest ważne. Sam millis zwraca zmienną 32-bitową, więc porównując ją z 8-bitową łatwo uzyskać stale fałszywy wynik - co niestety mi się udało. A wracając do progamu, który analizowałem - przecież zmienne są typu unsinged char, więc nie rozumiem gdzie miał być problem. Jest typ 8-bitowy bez znaku, a program działa błędnie. Pytanie jak go poprawić? I dlaczego wtedy już będzie dobrze? Edit: Widzę, że metoda znalezienia gotowca w sieci jest teraz dobra na wszystko. Ja jednak lubię nieco podrążyć temat. Więc po pierwsze ten programik z sieci nie rozwiązuje usterki, którą zgłosił @narbej - czasy, które program spędza poza if-em dodają się do błędu. No i na czym polega lepszość tego rozwiązania? Jak udowodnić, że teraz wszystko działa dobrze oraz rozwiązać problem z gubieniem czasu poza if-em? Edit 2: Faktycznie fora internetowe potrafią zabić w człowieku cały entuzjazm i chęć dzielenia się wiedzą. Więc tylko napiszę, jak można było ten program poprawić: unsigned char zapamietanyCzas = 0; unsigned char roznicaCzasu = 100; void setup() { pinMode(2, OUTPUT); Serial.begin(9600); } void loop() { unsigned char m = millis(); unsigned char diff = m - zapamietanyCzas; delay(10); if (diff >= 100) { zapamietanyCzas += roznicaCzasu; digitalWrite(2, HIGH); Serial.println("Wysyłamy trochę danych"); Serial.println("jeszcze trochę..."); Serial.println("i jeszcze więcej"); delay(15); digitalWrite(2, LOW); } } Są tutaj dwa kluczowe elementy. Pierwszy to odejmowanie przy zmiennej diff. Dzięki niemu unikamy problemów, które zawierała wersja kolegi @narbej Przepełnienie zmiennej nic złego już nie robi. Druga sztuczka to dodawanie różnicyCzasu do zmiennej zapamietanyCzas, zamiast do m, czy też wartości millis(). Dzięki temu nawet jeśli wywołanie if()-a się opóźni (po to jest delay(10)), wartość średnia częstotliwości wykonania warunku będzie stała.
  3. 1 punkt
    Cyfrowa stacja lutownicza Jest to mój 2 prolekt po 12 letniej przerwie z elektroniką. Była to okazja do poznania Eagle oraz podstaw programowania mikroprocesorów. Obecnie wiele rzeczy bym poprawił i docelowo tak się chyba stanie. Działanie stacji oceniam bardzo pozytywnie. Obecnie mam 3 stacje lutownicze, więc już mogę coś na ten temat napisać ale to już dłuższy temat. Projekt polecam wszystkim, którzy mają niewykorzystane trafo 2x12V 60VA (minimum) oraz LCD1602 i procesor Atmega8. Są to chyba 3 najdroższe elementy (pomijając kolbę 907A, którą przez internet można kupić poniżej 30zł z kosztami wysyłki). Docelowo schemat podzieliłem na 2 zasadnicze części: 1. Płytka zasilająca 2.Płytka sterowania Wzory płytek w Eagle standardowo dostępne są w załączniku. A tutaj jeszcze foto gotowych płytek: Aby ułatwić możliwość wymiany procesora i wzmacniacza operacyjnego, zostały one umieszczone w podstawkach. Płytka sterująca oraz płytka zasilająca zostały połączone za pomocą złącza goldpin. Obudowa została wykonana z płyt meblowych oklejonych fornirem dębowym. Dodatkowo składałem dla znajomego CNC z chin i w ramach testów wykonałem panel przedni oraz tylni na tym CNC (materiał to 1,5mm blacha aluminiowa). Efekty pracy widać na poniższych zdjęciach: Zasilanie 230V trafia na gniazdo komputerowe oraz włącznik (pozyskane z zasilacza ATX). Następnie mamy bezpiecznik szklany i transformator toroidalny 50VA 2x12V. Transformator miał wymienione uzwojenia wtórne. Miałem transformator z tylko jednym uzwojeniem o napięciu 10,5V, więc od nowa zostały nawinięte uzwojenia 2x12V. Takie napięcia są wprowadzone zgodnie z zamieszczonym schematem na płytkę zasilającą. Zastosowałem najprostszą kolbę 907A z termoparą. Wykorzystałem dostępne w sieci oprogramowanie stacji lutowniczej RL-1 zawierające algorytm PID do sterowania grzałką. Konstrukcja nie jest pozbawiona wad: Obudowa nie jest dokładnie spasowana z panelami czołowym i tylnym (miała być tymczasowa, a wyszło jak zwykle). Słaby obieg powietrza w obudowie (pomimo tego faktu nic się nie przegrzewa przy długiej pracy. Oto film prezentujący rozgrzewanie grota od temperatury 38 stopni do 320 stopni: Już w 22 sekundzie grzałka osiąga temperaturę zadaną. Od 35 sekundy przykładam do grota cynę o grubości 0,7mm. Cyna zaczyna się topić ok. 50 sekundy. Temperatura grota została zestrojona ze wskazaniem stacji za pomocą termopary i procedury opisanej w dokumentacji stacji RL-1 (w załączniku AVT987). A to obecnie przeze mnie posiadane stacje lutownicze: Jak już wcześniej wspomniałem, wykonałbym kilka zmian. Najważniejsza to zmniejszenie wymiarów stacji. Trafo zajmuje 1/3-1/4 obudowy. Obecnie całość znalazłaby się na jednym PCB, wszystkie elementy SMD, cała stacja zmieściłaby się za LCD. Do tego trafo i wymiar całości zmniejszony minimum o połowę. Poza tym, prócz najdłuższego rozgrzewania i braku mocy przy lutowaniu dużych pól masy stacja działa nad wyraz dobrze. EAGLE_Moja stacja lutownicza.zip AVT987.pdf Cyfrowa_Stacja_Lutownicza_RL1 - do wgrania.zip Cyfrowa_Stacja_Lutownicza_RL1 - edytowalne oprogramowanie.zip Cyfrowa stacja lutownicza RL1.zip
  4. 1 punkt
    Lampy nixie to chyba najczęściej powracający temat wśród amatorskich projektów elektronicznych. Myśl o skonstruowaniu zegara z takim wyświetlaczem chodziła mi po głowie już wiele lat temu, w tym celu zaopatrzyłem się w zestaw lamp IN-14. Niestety z powodu braku czasu i dużej ilości projektów o wyższym priorytecie zadanie to ciągle było odkładane na później. Może to i lepiej, bo w międzyczasie miłośnicy amatorskiej elektroniki zyskali dostęp do całkiem ciekawych elementów, które mogłem wykorzystać w projekcie. Prezentowany zegar powstał w 2017 roku. Jego głównym elementem jest mikrokontroler Atmega644, który wykonuje wszystkie operacje związane z odmierzaniem czasu i obsługą multipleksowanego wyświetlacza. Dodatkowo zegar został wyposażony w moduł WiFi z układem ESP8266, pracujący pod kontrolą własnego programu. Zadaniem modułu jest cykliczne sprawdzanie czasu na serwerze NTP i korygowanie ustawień lokalnego RTC. Urządzenie posiada też układ scalony FT232, dodający możliwość konfiguracji przez USB. Stałe napięcie około 180V jest generowane za pomocą przetwornicy boost na układzie MC34063A. Oprogramowanie zegara zostało wyposażone w funkcję automatycznego wykrywania czasu letniego i zimowego. Na płycie czołowej znajduje się przełącznik umożliwiający włączenie trybu, w którym wyświetlany jest czas UTC - funkcja ta została dodana w związku z moimi radioamatorskimi i krótkofalarskimi zainteresowaniami. Konstrukcja została zamontowana wewnątrz obudowy ze sklejki wycinanej laserowo. Fizycznie urządzenie składa się z dwóch osobnych płyt, Jedna z nich mieści zestaw lamp nixie, druga elektronikę sterującą.
  5. 1 punkt
    Witam, jako nowy na Forbocie liczę na wyrozumiałość Do tej pory byłem jedynie czytelnikiem kursów. Mam 18 lat. Jestem uczniem technikum, elektroniką interesuję się odkąd pamiętam, a swojego pierwszego robota skonstruowałem i podbijałem nim świat kiedy miałem zaledwie 8 lat kiedy nikt nie wiedział co to arduino. Nie umiałem się posługiwać w odpowiednim stopniu internetem, który dla mnie wtedy i tak był trudno dostępny, a swoją wiedzę opierałem na książkach o elektronice z miejskiej biblioteki oraz mogłem liczyć na pomoc taty i dziadka pasjonatów majsterkowania. Kiedy na rynku pojawiały się pierwsze płytki arduino zacząłem tworzyć na prawdę efektywne projekty. Jednak w mojej rodzinie mój tata zawsze słynął z budowania dużych maszyn i pojazdów które ułatwiają prace na wsi lub po prostu ułatwiają codzienne życie. Postanowiłem więc iść w jego ślady i całymi dniami i nocami rozmyślałem nad naprawdę imponującym projektem. W ten właśnie sposób około rok temu powstał mój pierwszy i na pewno nie ostatni pojazd będący w stanie zapewnić komuś transport. Jest to moja prawdziwa duma i mam nadzieję, że ktoś po przeczytaniu opisu mojego projektu zostanie zainspirowany do zrobienia czegoś co będzie dawało taką satysfakcję. Projekt, którym chce się podzielić z czytelnikami to Hybryda wykonana w moim garażu ochrzczona jako HYBRYDZIK. Pojazdy hybrydowe, choć nie są nowinką technologiczną, coraz bardziej zwracają na siebie uwagę. Czasy w których przyroda potrzebuje pomocy od człowieka takie pojazdy mogą być sporą ulgą dla miast pokrytych smogiem, jednak producenci skupiają się głównie na wynikach spalania oraz codziennej eksploatacji. Wyniki nie przedstawiają się najgorzej biorąc pod uwagę, że kolejne koncerny ciągle udoskonalają tą technologię aby przedstawić się jako jak najbardziej ekologiczne. Niestety prawda wygląda nieco inaczej. Pojazdem ekologicznym nazywamy taki pojazd, którego nie tylko eksploatacja ale również produkcja jest w pełni nieszkodliwa dla środowiska. Produkcja hybryd nie odbiega zanieczyszczeniem od innych samochodów. Interesuje się motoryzacją i chętnie poznaje każde nowinki dotyczące tego rodzaju pojazdów. Jednak nie podążam za ekologiczną przykrywką, w której ochrona środowiska nie jest realną troskę o przyrodę, a "popychaczem" marketingu. Jako miłośnik majsterkowania postanowiłem nie pozostawać obojętny dla problemu tej krypto-ekologii i pokazać, że technologia napędu hybrydowego może być przyszłością, która realnie przyczyni się do ulgi dla środowiska. Cel jaki sobie postawiłem, przy budowie tego projektu, to możliwie duża korzyść na rzecz środowiska naturalnego. Aby uzyskać efekt prawdziwej ekologicznej hybrydy postanowiłem, że do budowy tego projektu będę się starał użyć jak najwięcej elementów z odzysku. Dzięki temu dam nowe życie rzeczom które były już niepotrzebne, a mogły znaleźć zastosowanie w mojej hybrydzie. Dzięki wykorzystaniu takich niepotrzebnych materiałów zmniejszamy wydobycie surowców pierwotnych co jest jak najbardziej ekologiczne i pomaga w ochronie środowiska. Gdyby zaczęto tak robić na masową skalę? Jak znacznie zmniejszyłoby się wydobycie. Owszem, recykling jest powszechnie stosowany, ale obecnie w produkcji hybryd nie przywiązuje się do tego takiej uwagi. Cele mojego projektu: Tak jak poprzednio wspominałem moim celem jest pokazanie i danie do zrozumienia ludziom jak na prawdę powinna wyglądać ekologia. Aktualnie na świecie kładzie się teoretycznie nacisk na normy spalania, a pojazdy hybrydowe stają się modne. Produkcja ich jednak przebiega w sposób, który nie jest przyjazny dla środowiska naturalnego. Im bardziej staramy się zagłębiać w temat pojazdów hybrydowych tym mniej wierzymy w ich ekologię. Jednak sam pomysł oraz idea jest jak najbardziej prawidłowa oraz wcale nie musi być tak, że hybrydy napędzają jedynie marketing, mogą być pojazdami dzięki, którym znacznie zmniejszą się zanieczyszczenia w naszych miejscach zamieszkania. Chodzi nie tylko o eksploatację oraz codzienne użytkowanie takich pojazdów. Fabryki powodują ogromne zanieczyszczenie i pobierają ogromne ilości energii. W obecnych czasach nie da się ukryć, że zanieczyszczenia wyczuwalne w powietrzu powodują u ludzi coraz większą świadomość potrzeby ekologii. A co gdyby spopularyzować pojazdy z części używanych? Mógłby powstać nowy odłam dla miłośników majsterkowania. Postanowiłem zostać pionierem i przełamać bariery. Co prawda znamy już samochody hybrydowe nie od dziś. Jednak jak wiele zostało ich wykonanych w przydomowych warsztatach z myślą o ekologii? Mój pojazd będzie przyjazny środowisku ze względu na to, że postanowiłem wykorzystać materiały recyklingowe, przedmioty które nie były już nikomu potrzebne a mogły znaleźć zastosowanie w moim samochodziku. Ekologiczne jest także zastosowanie dwóch silników spalinowego i elektrycznego. Takie jest główne założenie napędu hybrydowego. Gdzie ekologia takiego napędu skoro mamy również silnik spalinowy? Otóż silnik spalinowy jest tutaj znacznie mniej obciążany niż w przypadku pojazdów o napędzie wyłącznie spalinowym ponieważ w przypadku mojej hybrydy jest on jedynie wspomaganiem dla baterii zasilających silnik elektryczny. Jakie elementy postanowiłem wykorzystać do budowy? Elementy jakie potrzebowałem do realizacji to: silnik elektryczny, sterownik do silnika elektrycznego, silnik spalinowy, alternator, kierownica, kontrolki do deski rozdzielczej, fotel, woltomierz do pomiaru napięcia na bateriach (analogicznie jak litry paliwa w baku pokazywane przez wskaźnik paliwa w samochodzie spalinowym tak u mnie potrzebna była informacja o napięciu na baterii), amperomierz, przełączniki, elementy do wykonania zawieszenia, koła, przekładnia, łańcuch oraz materiał do wykonania nadwozia, paski led. Skąd pozyskiwałem elementy i jak łączyłem je w całość? To były elementy niezbędne aby pojazd mógł powstać. poszukiwania powyższych elementów rozpocząłem od własnego podwórka. W moim domu nic się nie marnuje. Znalazłem uszkodzonego quada, nadawał się on idealnie jako dawca części. Czym prędzej zaciągnąłem go do warsztatu i odciąłem potrzebne mi elementy. Wykorzystałem układ kierowniczy koła oraz ich mocowania oraz drążki do układu oraz tylną oś wraz z układem hamulcowym oraz kołami. Silnika niestety nie udało mi się uruchomić po mimo wielu napraw. Po dalszych poszukiwaniach szybko znalazłem metalowe elementy z których mogłem pospawać ramę, na której chciałem oprzeć resztę elementów. Po zespawaniu ramy i przymocowaniu do niej elementów z quada rozglądałem się za kolejnymi częściami (spawanie było zadziwiająco proste biorąc pod uwagę że jeszcze rok temu nie miałem zbyt dużego doświadczenia). Dość szybko udało mi się znaleźć silnik spalinowy, pozbywała się go firma budowlana w mojej okolicy właściciel pozwolił mi go zabrać za darmo. Odrestaurowałem go i uruchomiłem. Silnik z zagęszczarki 6,5KM idealny do mojego projektu. Ekonomiczny, emitujący mało spalin, oraz łatwy w obsłudze. Szybko udało mi się znaleźć także zalegający u dziadka alternator z ciągnika. Kierownicę udało mi się zdobyć dzięki koledze, który słysząc o moim projekcie postanowił pomóc. Przełączniki pozyskałem gromadząc elementy elektroniczne z rozbiórki elektronicznego sprzętu. Silnik elektryczny pozyskałem z samochodziku dla dzieci. Ma aż 1000W co w zupełności wystarczyło do tego projektu. Napięcie zasilania tego silnika to 36V. Niestety ktoś uprzedził mnie z bateriami, które zasilały ten zabawkowy pojazd. I właśnie baterie sprawiły mi najwięcej problemu. Na serwisie aukcyjnym wylicytowałem tanio uszkodzony rower elektryczny, w którym były takie sprawne baterie. Trzy akumulatory. Mają one pojemność 12Ah, oraz napięcie 12V. W rowerze tym był również sterownik do takiego typu elektrycznych pojazdów. Nie odpowiadała mi jednak manetka zamontowana w rowerze wróciłem więc do samochodziku z którego pozyskałem silnik elektryczny i wymontowałem z niego pedał dzięki któremu będziemy regulować prędkość nogą i nie musiałem przerabiać manetki. Wraz z rowerem otrzymałem również ładowarkę. W moich elektronicznych zbiorach odnalazłem również przetwornicę samochodową z 12V DC na napięcie 230V AC. Postanowiłem ją wykorzystać. Przeprowadziłem próbę podłączenia wszystkich elementów na stole. Skupiłem się jedynie na części elektrycznej. Wszystko zadziałało bez problemu przystąpiłem więc do składania pojazdu. Miałem już wcześniej zrobioną ramę. Całość po skręceniu i zespawaniu otrzymała karoserię z aluminiowej blachy, a rama została pomalowana na pomarańczowo. Po sprawdzaniu osiągów hybrydzik może aż 12km przejechać w trybie wyłącznie elektrycznym. Jego prędkość maksymalna to 39km/h. Zasada działania Hybryda mojej produkcji jest hybrydą szeregową. Koła mojego pojazdu napędzane są silnikiem elektrycznym. Silnik spalinowy pełni funkcję tzw. range extendera czyli jego zadaniem jest dostarczanie energii do alternatora. Alternator natomiast ładuje akumulatory. Jest on podpięty do jednego z nich ponieważ ładuje on akumulatory 12 woltowe. Dzięki temu silnik spalinowy pracuje w optymalnym zakresie prędkości obrotowych i obciążenia. Silnik spalinowy pracuje tylko wtedy gdy akumulatory używane do zasilania silnika elektrycznego potrzebują naładowania, jeżeli są one naładowane w odpowiednim stopniu silnik spalinowy nie musi być uruchomiony. pozawala to na znaczne zmniejszenie emisji spalin. Poruszamy się wtedy w przyjemnej ciszy, a nasz pojazd nie wytwarza zanieczyszczeń. Jeżeli baterie będą już słabe możemy uruchomić ręcznie silnik spalinowy dzięki czemu nie jesteśmy zmuszeni do postoju. Ładowanie baterii może odbywać się również dzięki ładowarce wpinanej do sieci, takie rozwiązanie jest nazywane hybrydą typu plug-in. Ładowarka zamontowana w pojeździe umożliwia bezproblemowe podładowanie baterii w miejscu gdzie mamy dostęp do prądu. Dzięki zastosowanemu sterownikowi mamy możliwość płynnej regulacji prędkości pojazdu. Mój pojazd może pracować również jako tylko i wyłącznie elektryczny w ów czas nie używamy silnika spalinowego, a jedynie energii zgromadzonej z silnika spalinowego zgromadzonej w sieci. Aby poruszać się Hybrydzikiem nie należy mieć dużych umiejętności. Jest prosty w prowadzeniu. Należy włącznikiem umiejscowionym pod nogami przekazać napięcie z baterii na sterownik, a także odblokować sterownik stacyjką, następnie należy wybrać kierunek jazdy i po naciśnięciu gazu pojazd zaczyna się poruszać. Jeżeli zjeżdżamy z przykładowo sporej górki możemy przełącznik kierunku jazdy ustawić w pozycji przeciwnej do kierunku poruszania się co pozwala na ładowanie baterii oraz hamowanie za pomocą silnika elektrycznego. Zastosowanie Hybrydzik nie tylko pokazuje jak powinna wyglądać troska o środowisko. Może on być wykorzystany dla przykładu w firmie, która wymaga od pracowników pokonywania sporych odległości w magazynach oraz po placach. Nie można używać silników spalinowych w pomieszczeniach, a taką hybrydą można poruszać się nie wytwarzając spalin. Dzięki zamontowanej przetwornicy na 230VAC możemy zasilać za jego pomocą urządzenia sieciowe w miejscach w których nie ma dostępu do takiego napięcia. Myślę że taki pojazd świetnie spisałby się dla osób niepełnosprawnych. Prosty w obsłudze, tani w utrzymaniu, nieszkodliwy. Taka niepełnosprawna osoba nie musiałaby się martwić o zasięg ponieważ silnik spalinowy zapewniałby dojechanie do najbliższego źródła zasilania, a po odpowiednim przystosowaniu mieszkania taka osoba mogłaby się poruszać po domu używając silnika elektrycznego. Na poniższych zdjęciach zobaczyć możemy zdjęcia przedstawiające składanie hybrydzika; Tak prezentowała się rama po pierwszych spawach: Na poniższych zdjęciach widzimy już prawie gotowego hybrydzika czekającego na ostatnie połączenia przed podbojem świata: Z kolei zdjęcie poniżej przedstawia mój pojazd już gotowy i poskładany oraz solidnie przetestowany: Mam nadzieję, że mój projekt spotka się z uznaniem. Jestem z niego na prawdę dumny i bardzo chętnie porozmawiam o nim i odpowiem na różne pytania w komentarzach. Jeżeli ktoś byłby chętny podjąć się zbudowania takiego projektu to może liczyć na moją pomoc Będę się bardzo cieszył jeżeli moje dzieło będzie czyjąś inspiracją i chętnie zobaczę ewolucje tego pomysłu w wykonaniu innych kreatywnych ludzi z podobnymi zainteresowaniami.
  6. 1 punkt
    Tym razem prezentuję jeden z moich starszych projektów. Powstał on w 2013 roku, będąc pierwszą poważniejszą próbą umiejętności zdobytych podczas nauki programowania mikrokontrolerów AVR. Wszystko zaczęło się jakiś czas wcześniej, gdy do moich rąk trafił stary, polski telefon z tarczą numerową, wyprodukowany przez przedsiębiorstwo RWT w latach sześćdziesiątych. Któryś z poprzednich właścicieli tego urządzenia potraktował je jako źródło części - wewnątrz brakowało większości elementów potrzebnych do normalnej pracy. Na szczęście obudowa zachowała się w idealnym stanie. Przywrócenie telefonu do stanu oryginalnego mijało się z celem, więc w najlepszym razie mógłby on służyć za stylową dekorację. W pewnym momencie wpadłem na inny pomysł co do zastosowania tego zabytku. Mniej więcej w tym samym czasie udało mi się bowiem zdobyć kilka modułów GSM Motorola D15, wymontowanych ze złomowanych centralek alarmowych. Rozwiązanie nasuwało się samo - zrobić z tego "komórkę". Urządzenie działa w oparciu o mikrokontroler Atmega328, którego głównym zadaniem jest sterowanie modułem GSM za pomocą komend AT. Układ zajmuje się także zliczaniem impulsów wysyłanych przez tarczę numerową podczas wybierania numeru, a także generuje sygnał PWM udający sygnały wybierania i zajętości, Najbardziej problematycznym elementem był dzwonek, wymagający do działania cyklicznych zmian przepływu prądu. Zadanie to jest realizowane prze prosty półmostek H. Ponieważ dzwonek wymaga do pracy napięcia co najmniej kilkudziesięciu V, w grę wchodziły dwa rozwiązania: zbudowanie przetwornicy albo przewinięcie uzwojeń. Zdecydowałem się na drugie z nich. Urządzenie wyposażone jest we wbudowany akumulator litowo-polimerowy oraz scalony kontroler ładowania MCP73831T. Podczas budowy telefonu popełniłem kilka błedów oraz poszedłem na kilka kompromisów, na które dzisiaj w żadnym razie bym się nie zgodził. Najważniejsze problemy tej konstrukcji to: Pojawiające się okazjonalnie zakłócenia, będące wynikiem zastosowania modułu GSM bez różnicowego toru audio. Dziś zastosowałbym któryś z tanich i ogólnodostępnych modułów GSM. Brak stabilnego zasilania. Cała elektronika jest zasilana bezpośrednio napięciem akumulatora. Nie stanowi to problemu, ponieważ wartości mieszczą się w dopuszczalnych warunkach pracy wszystkich elementów, a wraz z rozładowywaniem akumulatora zmienia się wspólny punk odniesienia, wyznaczany przez VCC. Dzisiaj jednak zastosowałbym przetwornicę S7V8F3. Program został napisany w sposób blokujący, w oparciu o "delay'e" oraz pętle oczekujące na wykonanie określonego zadania. Z uwagi na powyższe projekt w końcu doczeka się zapewne uwspółcześnionej rewizji.
  7. 1 punkt
    Może się czepiam, czy tematy dotyczące alkoholu i tytoniu nie powinny być według polskiego prawa oznaczone jako dostępne od 18 roku życia. Może to nie mieć znaczenia dopóki ktoś złośliwie się nie przyczepi.
  8. 1 punkt
    moje rozwiązanie było niezależne od serwera. działało samodzielnie na esp. dziś pewnie bym sprzęgał stm32 z esp, bo odkryłem timery zresztą dzięki forbotowi. miałem jedynie opcje wysyłania danych na serwer, ale nie korzystałem z tego. miałem też zrobione dozowanie 5 nawozów, ale element wykonawczy szwankował - był oparty o serwa i strzykawki, był to błąd bo sole mineralne krystalizowały w strzykawkach i sie tłoczki zacinały. sterować wszystkim można było przez neta, bo było podpięte po wifi. faktycznie ogranicza tylko wyobraźnia, no i umiejętności C. jak patrze na mój kod do tego sterownika, to masakra..... jak by to pisał Kali. dziś jestem niewiele lepszy, ale czasem coś tam dłubne. Obecnie robie sobie starowanie silnikami do lego technic, silniki też własne. lepiłem enkodery samodzielnie oparte na diodach IR, fajna zabawa. Ja jestem zachwycony mikrokontrolerami. teraz mam dosyć ciekawe zadanie bo padło mi sterowanie temperaturą w lodówce i będę robić własny termostat - proste jak budowa cepa, ale czasu brak. Robiłem też sterowanie kolejki lego na IR, miał być duży projekt sterowanie zwrotnicami, rozpoznawanie wagonów po NFC, sterowanie rozłączaniem wagonów itp. no i polutowałem część druciarstwa i leży, a już nie pamiętam co miało być jak.... znalazłem na yt mój stary film jak to działało, sorry że Ci demoluje wątek tu jak pompowało wodę, przy solach już nie było tak różowo
  9. 1 punkt
    Znowu podstawy C się kłaniają. Poczytaj jak reprezentowane są napisy, podpowiem że trzy znaki to za mało na przechowywanie napisu o długości 3.
  10. 1 punkt
    Rozbudowa w oparciu o i2c jest banalna, dlatego pisałem że ograniczeniem jest wyobraźnia i wielkość pamięci procesora. Z tym ze podłączając całość do środowiska IoT "przewalamy" spora część roboty na serwer. U mnie sprzętowo (poprzez arduino) obsługiwane są jedynie urządzenia w sensie interfejsu I/O wszelkie reguły zarządzania, kolejnością włączania, czy ściemnieniem/rozjaśnieniem oświetlenia "tworzone" są na serwerze i po radiu przesyłane do arduino. Niestety mam wrażenie że Mysensors nie jest zbyt stabilne, może to wina modułów NRF, może samego środowiska, a może.... moja (programistą to ja się na pewno nie czuje) Co jakiś czas pojawiają mi się błędy w transmisji, których przyczyny nie jestem w stanie namierzyć, nie mówiąc już o rozwiązaniu. Dlatego myślę przeniesieniu sterownika na ESP z EasyESP, na pierwszy rzut oka takie przeniesienie, dzięki obsłudze przez domoticza, powinno być banalne.
  11. 1 punkt
    Ja! Swoją droga rok temu zrobilem nieco podobny zegar synchronizowany GPS (choc chyba dokladniejszy, bo uzywa rowniez sygnalu PPS). No i czas liczy w "ziemskim" UTC. Posiada stoper. Przeznaczony jest do rejestracji momentów zakryć gwiazd przez Ksiezyc czy tez planetoidy. Naciskamy przycisk, a na wyświetlaczu pokazywany jest dokładny czas nacinięcia. Aktualny czas gwiazdowy jest przydatny, ale glownie dla algorytmów GoTo teleskopów i programów typu planetarium. Trochę tez do przygotowania sie do obserwacji. Wiedząc, jaki jest aktualny czas gwiazdowy dowiadujemy się również jaka jest rektascensja ciał niebieskich przechodzących przez południk lokalny. Wtedy też są najwyżej nad horyzontem i to najlepszy moment do ich obserwcji. IMHO mój jest bardziej praktyczny, bo realnie przydaje się przy wizualnych obserwacjach zjawisk zakryciowych. Przy okazji: Implementacja Sidereal time w programie
  12. 1 punkt
    Prawie mi się udało... Został mi jedynie warunek porównania warunku z tym co wpisuje. Robiąc krok po kroku w debuggerze wszystko jest okej. Warunek i Value są identyczne a mimo to funkcja strcmp nie zwraca 0 tylko -18. Przepraszam, że wykorzystuje tu HAL, lecz odkryłem ten kurs na nowszych bibliotekach i stwierdziłem, że lepiej będzie się uczyć na tych nowszych. int licznik=0; while (1) { if (__HAL_UART_GET_FLAG(&uart, UART_FLAG_RXNE) == SET) { char value[3]; // powinno być [4] zarówno w buforze jak i warunku, ponieważ dochodzi jeszcze znak końca tekstu '/0' char warunek[3]="on1"; HAL_UART_Receive(&uart, &value[licznik], 1, 100); licznik++; if(licznik==3) { licznik=0; int a=strcmp(value,warunek); if(a==0) send_string("on1\r\n"); else if(strcmp(value,"of2")==0) send_string("of2\r\n"); } } }
  13. 1 punkt
    Wreszcie coś oryginalnego w temacie Arduino. Może sama elektronika i kod nie są zbyt odkrywcze to wykonanie jest bardzo fajne.
  14. 1 punkt
    Skończyłem w zasadzie ten wątek kursu, więc wrzucam zadanka domowe. Zad 7.1 Zad. 7.2 tekst na wyświetlaczu po ciągłym odświeżaniu lekko "migał", ale prawie niezauważalnie Zad 7.3 Wynik jest bardzo trudny do odczytania Zad 7.4 Nie wiem, czy o to chodziło: #include <LiquidCrystal.h> //Dołączenie bilbioteki #include <Arduino.h> LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Informacja o podłączeniu nowego wyświetlacza unsigned long czas = 0; void setup() { lcd.begin(16, 2); //Deklaracja typu lcd.clear(); pinMode(8, INPUT_PULLUP); //przycisk stop pinMode(9, INPUT_PULLUP); //przycisk start lcd.setCursor(0, 0); lcd.print("Pomiar czasu"); } void loop() { czas = 0; if (digitalRead(9) == LOW){ //kiedy start wcisniety lcd.clear(); lcd.setCursor(0,0); lcd.print("Czas pomiaru w s"); while(digitalRead(8) == HIGH) { //dopoki stop nie bedzie wcisniety czas = czas+1; lcd.setCursor(0, 1); lcd.print(czas/10); //pomiar czasu dzielimy przez 10, delay(100); // wtedy nie trzeba delay'a 1s i przycisk dziala bez zarzutow } } if(digitalRead(8) == LOW) { // kiedy stop wcisniety lcd.clear(); lcd.setCursor(0,0); lcd.print("Koniec: "); lcd.setCursor(0,1); lcd.print(czas/10); lcd.print(" sek"); while(digitalRead(9) == HIGH); //pusta petla do ponownego restartu przyciskiem start } } Zdjęcie: Zrodziło się pytanie, bo o tej godzinie ciężko szukać, a ktoś może zna odpowiedź od razu. Czy jak pomiar natężenia prądu u mnie na diodzie podświetlającej wyniki pomiędzy 13 -15 mA, to czy potrzebuję stosować dodatkową rezystancję, aby móc przerobić układ do sterowania podświetleniem na PWM?
  15. 1 punkt
    zrobiłem podobne na ESP8266. ESP ma wystarczającą ilość flash, że dało się postawić pełną stronę WWW, dodałem jeden patent czyli licznik CO2 bąbelków na diodach IR i regulacje mikro zaworu CO2 opartą o silnik krokowy. Niestety akwarium już zlikwidowane. Miał być jeszcze pH metr ale nie doszło do budowy. fajny ten portal html. mój był tekstowy, a parametry akwarium były zapisywane w pamięci flash do pliku csv. zapisywałem pomiar temperatury, pomiar bąbli co2 i dane. w przypadku zbyt dużej ilości bąbli co2 układ wyłączał elektrozawór. esp rozszerzałem o dodatkowe porty na i2c. programista i elektronik ze mnie żaden, ale jak to zaczęło działać to frajda była. chodziło 3 lata bez problemów.
  16. 1 punkt
    Przede wszystkim napisałem, że zmienne mają byc UL bo chodzi by były tego samego typu, nic mądrego nie wyniknie z przypisania m=millis(). Nie wiem co ma to dać: unsigned char roznicaCzasu = 100UL; - zmienna jest 8 bitowa, wartość też, a na siłę robi się z niej UL. No i faktycznie udało się to zepsuć, brawo. Ja testowałem z mircos i nic się nie przepełnia: uint32_t zapamietanyCzas = 0; uint32_t roznicaCzasu = 200000UL; uint32_t licznikmillis,minuty; uint8_t msetki,sekundy,fmsetek; void setup() { pinMode(13, OUTPUT); Serial.begin(115200); } void loop() { fmsetek=0; uint32_t m = micros(); if ((uint32_t)(m - zapamietanyCzas) >= roznicaCzasu) { zapamietanyCzas = m ; fmsetek=1; msetki+=2; if(msetki>=5) { msetki=0; sekundy++; if(sekundy>=60) { sekundy=0; minuty++; } } } if(fmsetek) { digitalWrite(13, ! digitalRead(13)); Serial.println("Wysyłamy trochę danych"); Serial.println("jeszcze trochę..."); Serial.print("Powinno przestac dzialac po 70 minutach, a minelo minut:"); Serial.println(minuty); delayMicroseconds(150000); } } Dokładność z micros jest kiepska, może coś innego jest skopcone, nie będę szukał, idę spać, ale wg stopera w telefonie działa ponad 100minut. Jak komuś szkoda czasu to tu jest opisany prawidłowy sposób przetestowania millis na wartościach 8bit: https://www.baldengineer.com/arduino-how-do-you-reset-millis.html. Zgodnie z tym przykład blinkWithOutDelay odporny na przekręcenie licznika powinien wyglądać tak: // constants won't change. Used here to set a pin number: const int ledPin = LED_BUILTIN;// the number of the LED pin // Variables will change: int ledState = LOW; // ledState used to set the LED // Generally, you should use "unsigned long" for variables that hold time // The value will quickly become too large for an int to store uint32_t previousMillis = 0; // will store last time LED was updated // constants won't change: const uint32_t interval = 1000UL; // interval at which to blink (milliseconds) void setup() { // set the digital pin as output: pinMode(ledPin, OUTPUT); } void loop() { // here is where you'd put code that needs to be running all the time. // check to see if it's time to blink the LED; that is, if the difference // between the current time and last time you blinked the LED is bigger than // the interval at which you want to blink the LED. uint32_t currentMillis = millis(); if ((uint32_t)(currentMillis - previousMillis) >= interval) { // save the last time you blinked the LED previousMillis = currentMillis; // if the LED is off turn it on and vice-versa: if (ledState == LOW) { ledState = HIGH; } else { ledState = LOW; } // set the LED with the ledState of the variable: digitalWrite(ledPin, ledState); } } I tak, przetestowałem go - działa. Bez rzutowania też działał, ale już nie pamiętam, był inny problem przy przekręceniu zakresu zmiennej, chyba własnie nie doliczał do pełnej sekundy.
  17. 1 punkt
    Jak zwykle pośpiech to nic dobrego - wcześniej chciałem na szybko sprawdzić jak działa program i oczywiście tylko narobiłem błędów. O ostatnim napisałem, ale zauważyłem go dopiero czytając moje wcześniejsze komentarze. Jednak lepiej widać błędy czytając niż pisząc. Porblem wynikał z dodawania wewnątrz if-a. Po lewej stronie dodawałem dwie zmienne 8-bitowe, niestety kompilator miał prawo rozszerzyć wynik i dlatego po dwóch cyklach program przestawał generować kolejne impulsy. Teraz poprawiam program wprowadzając dodatkową zmienną - tak aby być pewnym że jest tylko 8-bitów po dodawaniu: unsigned char zapamietanyCzas = 0; unsigned char roznicaCzasu = 100UL; void setup() { pinMode(2, OUTPUT); Serial.begin(9600); } void loop() { unsigned char m = millis(); unsigned char next = zapamietanyCzas + roznicaCzasu; if (next <= m) { zapamietanyCzas += roznicaCzasu; digitalWrite(2, HIGH); Serial.println("Wysyłamy trochę danych"); Serial.println("jeszcze trochę..."); Serial.println("i jeszcze więcej"); delay(15); digitalWrite(2, LOW); } } Czy program działa dobrze? Oczywiście nie, chociaż inaczej niż poprzednio: Czas może chwilę pomyśleć zamiast ciągle eksperymentować. Spróbujmy wykonać program "na kartce" . Na początku wartość zmiennej "zapamietanyCzas" ma wartość 0. Dodajemy "roznicaCzasu" i w "next" mamy wartość 100. Teraz wszystko działa poprawnie, z millis() odczytujemy różne wartości aż dostaniemy coś większego lub równego od 100. Gdy to nastąpi, program dodaje do "zapamietanyCzas" 100, więc wartość zmiennej będzie wynosiła 200 i dalej wszystko jest ok. Znowu czekamy, aż wartości zwracane przez millis() wzrosną i zaczyna być ciekawie. Dodajemy do zapamietanyCzas wartość 100, ale występuje przepełnienie. Nowa wartość powinna wynosić 300, ale zmienna jest 8-bitowa, więc zamiast tego dostajemy 44. To poprawny wynik, ale problem zacznie się przy kolejnym obiegu pętli. Załóżmy że obieg pętli trwa 16ms, a poprzenio millis() zwróciło 200. Nowa wartość zapamietanyCzas wynosi 44, millis() zwroci poprawny czas 216 i... nasz warunek if bedzie spełniony. Wobec tego do 44 w zapamietany czas dodamy 100, czyli bedziemy mieli tam 144, oraz niepoprawnie wykonamy tresc w warunku. W nastepnym obrocie petli tez bedzie zle. Millis() zwroci 232, a wiec znowu wykonamy nasz warunek... To tlumaczy te dziwne dlugie impulsy na wykresie. Jak widać tak prosty program można na wiele sposobów popsuć - moża również łatwo naprawić, stąd moje pytanie: jak?
  18. 1 punkt
    5.4 #include <Servo.h> Servo serwomechanizm; int pozycja = 0; String wartosc_polozenia = ""; //wartość wpisana przez użytkownika int wartosc_polozenia_int = 0; void setup() { Serial.begin(9600); serwomechanizm.attach(9); } void loop() { Serial.println("Wpisz liczbę z zakresu 0 - 180"); while (Serial.available() == 0); //czakamy na podanie liczby wartosc_polozenia = Serial.readStringUntil ('\n'); //wczytujemy wartośc wpisaną przez użytkownika wartosc_polozenia_int = wartosc_polozenia.toInt(); //przekrztalcenie zmiannej string na int if (wartosc_polozenia_int > 0 && wartosc_polozenia_int <= 180) //jeśli wartosc wpisanej liczby jest miedzy 0 i 180 { pozycja = wartosc_polozenia_int ; //jeśli tak pozycja = wczytanej liczbie serwomechanizm.write(pozycja); //ruch do wpisanego położenia } else if (wartosc_polozenia_int == 0) // jeśli wpisana wartość równa się 0 - wracamy na pozycję 0 { pozycja = 0; serwomechanizm.write(pozycja); } else if (wartosc_polozenia_int > 180) // jeśli wartość przekracza 180 wyświetlamy komunikat { Serial.println("Podałeś złą wartość! Wartość musi być z zakresu 0-180"); delay(3000); } }
  19. 1 punkt
    Interesujące. W mojej "sportowej" karierze zajechałem dwa pulsometry i nigdy nie zastanawiałem się głębiej nad rytmem serca. Mam przed gwizdkiem startowym 100 to mam, mam na sprintach lub podjazdach 180 (no, stary już jestem..) to też OK a tu się okazuje, że pomiędzy kolejnymi uderzeniami tyle ciekawych rzeczy się dzieje. Wow. I o ile pulsometrowi wystarczy, że zaliczy uderzenie i dołączy do średniej z kilku(nastu?) ostatnich sekund to tutaj wręcz kluczowe wydaje się precyzyjne określanie punktu w czasie. Napisz może o tym coś więcej, bo to najbardziej smakowita część zadania, reszta to jakieś transmisje i wykresy. Nie oczekuję kodu, ale byłoby fajnie dowiedzieć się w prostych żołnierskich słowach jakich metod (DSP?) użyłeś by jednoznacznie i zawsze w tym samej fazie cyklu wykrywać bit. Możemy na to liczyć? Czy to zwykłe oczekiwanie na zmianę znaku pochodnej przy jednoczesnej dużej amplitudzie (poszukiwanie szczytu), momenty przejścia przez zero? A może zrobiłeś jakieś cyfrowe PLL i określasz przesunięcie fazy? BTW: Czy masz jakieś wykształcenie medyczne lub planujesz je mieć? Co Cię zainspirowało do zajęcia się pomiarami HVR? Jakaś literatura? Czy wyniki o których piszesz: synchronizacja z oddechem i sterowanie wielkością koherencji - są to tylko Twoje doświadczenia, czy robiłeś jakieś dłuższe eksperymenty (niekoniecznie na sobie) i czy wyniki ich są powtarzalne? Myślę tu głównie o tym uspakajaniu się, ew. wspomaganym sprzężeniem zwrotnym od pomiaru HVR. To moim zdaniem bardzo fajne spostrzeżenia. Czy takie urządzenia są stosowane w jakichś terapiach? Czy są dostępne handlowo? No, dużo pytań, ale i temat ciekawy, dla mnie zupełnie nowy a jednocześnie jak podkoszulka - bliski ciała Moim zdaniem natlenienie jest w tym temacie sprawą trzeciorzędną. Druga dioda jest, bo czujnik zaprojektowano pod pulsometry a w wysiłku i późniejszym odpoczynku tlen jest ważny i pewnie można z tego wyciagać jakies wnioski dotyczące odległości danej mocy od progu mleczanowego. Tutaj chyba nie ma nic do rzeczy - uważam, choć oczywiście kompletnie się na tym nie znam. Czyli jak zwykle.
  20. 1 punkt
    Tu masz świetny dokument od NXP który wyjaśni absolutnie wszystko co mógłbyś chcieć wiedzieć: https://www.nxp.com/docs/en/application-note/AN4327.pdf Ogólnie krew różnie pochłania światło w zależności od natlenienia. Jak masz dwie diody o różnym widmie to odrobiną matematyki możesz to przeliczyć.
  21. 1 punkt
    Cześć jestem Wojtek Chodzę do technikum elektroniką interesowałem się od małego ale dopiero niedawno zdecydowałem się sam coś stworzyć dołączyłem do forum bo tutaj są osoby które są wstanie mi pomóc w kwestiach elektronicznych (w szkole takich osób praktycznie niema)
  22. 1 punkt
    Witam! Chciałbym przedstawić wam moją konstrukcję, która stała się przedmiotem mojej pracy inżynierskiej. Mechanika: Konstrukcja mechaniczna w zasadzie oparta jest na 2 płytkach PCB. Do płytki głównej zamontowane są dwie kulki podporowe, a także silniki pololu o przekładni 1:10 co stanowi napęd robota. Z przodu zamontowana jest płytka z podstawą zawierająca uchwyty do czujników ultradźwiękowych. Taki sam uchwyt pod czujnik znajduje się również na 'ogonie' robota - jest on nie używany i został zamontowany eksperymentalnie. Na przedłużonej osi silników zostały zamontowane magnesy enkoderów magnetycznych co ilustruje poniższa fotografia. Elektronika: Sercem robota jest mikrokontroler AVR ATmega162, którego zadaniem jest sterowanie robotem w tym: obsługa enkoderów, sterowanie silnikami, odbiór informacji z mikrokontrolera slave nt. odległości mierzonych przez czujniki, realizację algorytmów sterowania, realizacja połączenia bluetooth, obsługa wyświetlacza LCD hd44780. Drugi mikrokontroler również AVR, ATmega328 realizuje tylko i wyłącznie obsługę czujników odległości HC-SR04. Pomiary normalizuje i wysyła interfejsem SPI do jednostki głównej ATmega162. Na pokładzie robota znajdują się również dwa enkodery magnetyczne AS5040 pracujące w pętli sterowania regulatora PI silników. Enkodery te pracują w trybie defaultowym czyli wyjście kwadraturowe, rozdzielczość 2x256. Silniki sterowane są poprzez mostek H L293. Komunikacją z robotem zajmuje się moduł bluetooth bt222 - czyli komunikacja jest przez UART mikrokontrolera. Główny mikrokontroler jest taktowany zewnętrznym kwarcem 16Mhz co przy takiej ilości obsługiwanych urządzeń i wykorzystywanych interfejsów było po prostu konieczne, z kolei mikrokontroler atmega328 jest taktowany zewnętrznym kwarcem jednak z powodu lepszej podstawy czasowej, która jest konieczna do dokładnych odczytów z czujników odległości. Na wyświetlaczu LCD są wyświetlane aktualnie mierzone wartości odległości czujników. Automatyka: Zostało wspomniane, że silnikami steruje algorytm regulatora PI. Aby obliczyć jego nastawy została przeprowadzona identyfikacja transmitancji. W tym celu wykorzystałem UART do przesyłania aktualnej prędkości silników oraz środowisko Matlab do wizualizacji danych na wykresie. Z wyliczeń wyszło, że silniki z zastosowanymi kołami mają transmitancję: G(s)=107/(0.19s+1) Po obliczeniu nastaw regulatora i zastosowaniu w praktyce okazało się, że można jeszcze troszkę dopieścić nastawy i ostatecznie wykresy odpowiedzi skokowej bez i z regulatorem wyglądają następująco: Software: Napisane w C w środowisku Eclipse. Umożliwia robotowi 3 tryby. Tryb avoid. W trybie tym robot ma za zadanie omijać przeszkody wykorzystując regulator rozmyty Takagi-Sugeno. Wykorzystuje w tym celu odczyty z czujników odległości. Tryb goal seeking. Robot podąża do celu czyli do odebranych przez bluetooth współrzędnych kartezjańskich podanych w [mm], zakładając, że miejsce od którego zaczyna lub dostał nowy zestaw współrzędnych, ma współrzędne 0,0. W trybie tym regulator Takagi-Sugeno ma za zadanie na podstawie zaimplementowanej odometrii oraz współrzędnych końcowych sterować robotem w celu osiągnięcia zadanego położenia. Problem algorytmu przedstawia ilustracja: Tryb avoid + goal seeking. Jest to połączenie dwóch wcześniej opisanych trybów. W trybie tym działają równocześnie obydwa wcześniej opisane algorytmy, jednak na wejście regulatorów PI sterujących silnikami jest podawany zbalansowany sygnał z obu algorytmów. Tzn w zależności od najmniejszej odległości od przeszkody mierzonej przez któryś z czujników jest obliczany procentowy udział wartości sterowania od dwóch algorytmów. Brzmi skomplikowanie ale takie nie jest. Najlepiej zobrazuje to wzór: V=K*Vg+(1-K)*Va gdzie V jest prędkością zadaną na regulator PI silnika, Vg jest prędkością wynikającą z algorytmu goal seeking, Va jest prędkością wynikającą z algorytmu avoid, K jest parametrem, który przyjmuje wartość z przedziału 0-1 w zależności od mierzonej minimalnej odległości do przeszkody. Robota wprowadza się w odpowiedni tryb za pomocą dwóch przycisków lub poprzez interfejs bluetooth. Odpowiednie tryby sygnalizują diody LED. W celu przesłania komendy zawierającej współrzędne celu najpierw należy wprowadzić robota w odpowiedni tryb, a następnie wysłać do niego wg stworzonego prze zemnie protokołu dane. Protokół wysyłania danych jest następujący: X±⌴⌴⌴Y±⌴⌴⌴& gdzie +- – znak współrzędnej, _ – wartość współrzędnej. Testy. Konstrukcja została przetestowana pod względem dokładności odometrii. Robot podczas licznych testów na bieżąco wysyłał swoje współrzędne, które w dalszej kolejności były obrabiane w środowisku Octave do przyjemnych w analizie wykresów. Przykładowy wykres drogi, którą pokonał robot na 'placu manewrowym' w trybie avoid: ... oraz rzut z góry na 'plac manewrowy': U góry pozycja początkowa, na dole końcowa robota. Cały ten obszar był dookoła ogrodzony ścianką. Słowa samokrytyki Co bym zmienił ? Czujniki. Ze względu na problematyczność wykrywania małych przeszkód lub gdy płaszczyzna przedmiotu uniemożliwia odbicie się fali ultradźwiękowej w stronę odbiornika. Zdarza się, że z powodu gubienia przeszkód robot po prostu w nie wpada. Najciekawsze fragmenty programu: Regulatory PI: //######################################## REGULATOR PRĘDKOŚCI ############################################ erra = vl-Va;//liczenie błedu prędkości errb = vp-Vb; if(ua<1023&&ua>-1023)Ca = Ca+(erra*dt);//całka błędu ua = kp*(erra + Ca/Ti);//regulator PI //P I if(ub<1023&&ub>-1023)Cb = Cb+(errb*dt);//całka błędu ub = kp*(errb + Cb/Ti);//regulator PI //P I if((ua<10)&&(ua>-10))ua=0; if((ub<10)&&(ub>-10))ub=0; motor_set(ua,ub);//ustawia sterowanie silników Regulator rozmyty Takagi-Sugeno trybu goal seeking: inline void PsiZ2Vlr(float *Psi, float *z, int16_t *vl,int16_t *vp) { float PSI[3]; float XL[6],XR[6]; float NR,FR,L,S,P,VL=0,VP=0,m=0; uint8_t i,k; ///////////////////////////////LICZENIE PRZYNALEŻNOŚCI////////////////////////////////// if(*z<=100)NR=-0.01*(*z)+1;else NR=0;//jak bardzo blisko jest cel if(*z<=100)FR=0.01*(*z);else FR=1;//jak bardzo daleko jest cel if(*Psi<=0)L=-0.3183*(*Psi);else if(*Psi<-M_PI)L=1;else L=0; if(*Psi<=0)S=0.3183*(*Psi)+1;else if(*Psi<-M_PI)S=0; else if(*Psi>M_PI)S=0;else S=-0.3183*(*Psi)+1; if(*Psi>=0)P=0.3183*(*Psi);else if(*Psi>M_PI)P=1;else P=0; /////////////////////////////////////TABLICA REGUŁ////////////////////////////////////// PSI[0]=L; PSI[1]=S; PSI[2]=P; //NR; XL[0]=-4000;XR[0]=4000; XL[1]=0;XR[1]=0; XL[2]=4000;XR[2]=-4000; //FR; XL[3]=-4000;XR[3]=4000; XL[4]=4000;XR[4]=4000; XL[5]=4000;XR[5]=-4000; /////////////////////////////obliczanie prędkości silników////////////////////////////// for(k=0,i=0;k<3;k++,i++)//pierwszy wiersz tabeli { VL+=NR*PSI[k]*XL[i]; VP+=NR*PSI[k]*XR[i]; m+=NR*PSI[k]; } for(k=0;i<6;k++,i++)//drugi wiersz tabeli { VL+=FR*PSI[k]*XL[i]; VP+=FR*PSI[k]*XR[i]; m+=FR*PSI[k]; } *vl=(int16_t)VL/m; *vp=(int16_t)VP/m; } Obsługa czujników odległości: //PRZERWANIE OD CAPTURE PIN ISR(TIMER1_CAPT_vect) { if( (TCCR1B & (1<<ICES1)) ) { LastCapture = ICR1;//jesli zbocze narastajace, zlap ICR1 } else { PulseWidth = ICR1 - LastCapture;//Jeśli zbocze opadajace oblicz PW pomiar=0;//wyzeruj flagę pomiaru } TCCR1B ^= (1<<ICES1);//Zmiana zbocza wyw. przerwanie } Mam nadzieję że robocik się podoba. W razie pytań proszę śmiało. Całości kodu nie udostępniam ze względu na prawa autorskie niektórych funkcji bibliotecznych. Co mogłem udostępniłem. Pozdrawiam was wszystkich !
  23. 1 punkt
    Jednym z moich pierwszych "poważniejszych" projektów, jakie zrealizowałem w ramach nauki programowania mikrokontrolerów był EtherGeiger - sieciowy detektor promieniowania jonizującego. Projekt stworzony w 2014 roku miał być swoistym żartem, nawiązującym swoją tematyką do Fallouta i post-apokaliptycznych filmów science-fiction. Wszystko zaczęło się od zakupionego na Allegro radzieckiego detektora Geigera typu STS-5. Przyrząd ten wymaga do działania wysokiego napięcia, w okolicy 400V. Jest ono wytwarzane przez przetwornicę typu flyback, pracującą na popularnym układzie MC34063A. Sercem pierwszej wersji urządzenia był mikrokontroler Atmega328, a za komunikację ze światem zewnętrznym odpowiadał układ ENC28J60, zwykle stosowany w popularnych modułach, tutaj przylutowany bezpośrednio do płytki urządzenia. Oprogramowanie sterujące pracą urządzenia zostało napisane w języku C, przy pomocy środowiska Atmel Studio. Poza pomiarem promieniowania tła urządzenie zbierało także informacje o temperaturze otoczenia, ciśnieniu atmosferycznym i wilgotności względnej. Wykorzystane zostały w tym celu moduły BMP280 oraz DHT11/DHT22. Wyniki pomiarów były przekazywane do serwera odpalonego na Raspberry Pi, który był odpowiedzialny za ich zapisywanie. W przypadku wykrycia wartości przekraczającej ustaloną wcześniej normę, oprogramowanie wysłałoby powiadomienie na telefon, za pośrednictwem serwisu Pushover. Projekt będący w zamierzeniach jedynie żartem (o pewnej wartości dydaktycznej) dwukrotnie okazał się być bardzo przydatny, gdy do mediów społecznościowych zaczęły trafiać fake newsy mówiące o awariach elektrowni atomowych i chmurze radioaktywnego pyłu, zmierzającego rzekomo nad Polskę. W ubiegłym roku projekt doczekał się nowej wersji, opartej na mikrokontrolerze PIC32MX270F265B. Pozwoliło to na dodanie nowych funkcji, m.in. wyposażenie urządzenia w PenDrive'a do lokalnego zapisywania pomiarów (w przypadku jego braku dane są zapisywane we wbudowanej pamięci SPI Flash). Zastosowany został także pojedynczy czujnik temperatury, ciśnienia i wilgotności, typu BME280. Planowana jest także rozbudowa tej wersji o dodatkową płytkę z wyświetlaczem LCD.
  24. 1 punkt
    1) Wstęp Postępujący w ostatnich dziesięcioleciach rozwój przemysłu spowodował potrzebę podnoszenie efektywności produkcji przy jednoczesnym obniżaniu kosztów. Naturalnym następstwem jest pojawianie się różnego typu maszyn, urządzeń i instalacji zastępujących pracownika tam, gdzie wykonywana praca jest w pełni powtarzalna pozwalając na wprowadzenie automatyzacji. Jednym z jej owoców są manipulatory – roboty, które działaniem przypominają ludzką kończynę górną. Ich efektorem (końcówką roboczą) może być na przykład chwytak (przenoszenie przedmiotów), wrzeciono frezujące bądź inne elektronarzędzie (obróbka) czy głowica spawalnicza (spawanie). Celem projektu było zbudowanie mini-systemu segregującego krążki na białe i czarne z manipulatorem opartym na projekcie EEZYbotARM https://www.thingiverse.com/thing:1015238 w roli głównej. Kolor krążków miałby być rozpoznawany za pomocą czujnika odbiciowego CNY70 (dioda IR + fototranzystor). Podczas pojedynczego cyklu, wyzwalanego za pomocą przycisku START, robot segregowałby 8 elementów, przekładając je do odpowiednio białego i czarnego pojemnika. Oprócz wspomnianego przycisku, na interfejs użytkownika składałyby się linijka ośmiu diód LED RGB oraz brzęczyk. 2) Parametry modelu Wymiary [cm]: 40x25x20 Kontroler: Arduino Uno R3 + Arduino Sensor Shield V5.0 Zasilanie: Zasilacz DC 5V 4A Czas cyklu: <1min; maximum 8 krążków Czujnik odbiciowy: CNY70 Ruch krążków: Wymuszony grawitacyjnie, szyna ustawiona pod kątem 30° Dodatkowe funkcje: Brzęczyk, przycisk START, 8 diód sygnalizujących RGB 3) Teoria Serwomechanizm modelarski to urządzenie, które sterowane sygnałem prostokątnym PWM pozwala na obrót wału w zakresie 180°. W manipulatorze wykorzystano cztery serwa, trzy główne SG-92R oraz jedno sterujące chwytakiem SG-90. Rozpoznawanie koloru krążka odbywa się poprzez czujnik odbiciowy – powierzchnia biała odbija wiele światła, oświetlając tym samym fototranzystor, co nie ma miejsca przy powierzchni czarnej. Po naciśnięciu przycisku START czujnik rozpoznaje kolor, zwraca informację do sterownika, a ten steruje serwami tak, aby krążki przekładane były do odpowiednich pojemników. Kolejność, w jakiej krążki były ułożone na szynie jest zapisywana na linijce LED. Podstawę stanowi frezowana płyta z mlecznej plexy o grubości 5mm. Pozostałe części wykonano z wykorzystaniem druku 3D, wspomagając się programem Google SketchUp. Rysunek techniczny 2D podstawy, niezbędny do jej późniejszej obróbki na ploterze frezującym CNC, opracowano w programie SolidEdge ST8. Wsad Arduino liczy 170 linijek kodu. Wykorzystano bibliotekę VarSpeedServo.h, która pozwala na zadanie kąta obrotu wału serwa oraz prędkości, z jaką ma ono nastąpić. 4) Film 5) Schemat blokowy i ideowy elektroniki 6) Główny fragment programu for(int x=0; x<8; x++) { //Powtórzenie 8-krotne linijka.setPixelColor(x, linijka.Color(255, 255, 0)); //Sygnalizacja kolorem żółtym, który krążek jest właśnie rozpoznawany linijka.show(); if (analogRead(A0)>=500) //Ocena, czy krążek jest biały (pomiar napięcia na fototranzystorze czujnika CNY70) { BASE.slowmove(50,50); //Ruchy serwomechanizmów RB.slowmove(120,50); RS.slowmove(90,50); GRIP.slowmove(pozycja1,100); delay(1000); GRIP.slowmove(0,100); delay(1000); BASE.slowmove(50,20); RB.slowmove(70,20); RS.slowmove(140,20); delay(1000); BASE.slowmove(10,50); RB.slowmove(110,20); delay(1000); GRIP.slowmove(pozycja2,100); delay(1000); linijka.setPixelColor(x, linijka.Color(255, 255, 255)); //Sygnalizacja kolorem białym, właśnie przełożony krążek był biały linijka.show(); } else if (analogRead(A0)<500) //Analogicznie dla krążków czarnych {...} Podsumowanie Wszystkie początkowo zakładane wymagania i cele zostały osiągnięte. Co ważne, na podstawie kilkudziesięciu prób można stwierdzić, że instalacja cechuje się wysoką niezawodnością – skuteczność w rozpoznawaniu detali wynosi 100%, nie dochodzi również do zacięć czy w samym działaniu mechaniki i elektroniki. Model budowałem hobbystycznie, natomiast później prezentowałem go na różnych pokazach itd. oraz konkursie innowacji technicznych, gdzie reprezentowałem szkołę. Pozdrawiam Zapraszam do pozytywnej krytyki PS. Kilka zdjęć (dwa ostatnie zdjęcia pokazują spód modelu, który stoi na pomarańczowych "nóżkach")
  25. 1 punkt
    Obudowa do głównego wyświetlacza, gotowa.
Tablica liderów jest ustawiona na Warszawa/GMT+02:00
×