Skocz do zawartości

Przeszukaj forum

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

  • Szukaj wg tagów

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

Typ zawartości


Kategorie forum

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

Kategorie

  • Quizy o elektronice
  • Quizy do kursu elektroniki I
  • Quizy do kursu elektroniki II
  • Quizy do kursów Arduino
  • Quizy do kursu STM32L4
  • Quizy do pozostałych kursów

Szukaj wyników w...

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


Data utworzenia

  • Rozpocznij

    Koniec


Ostatnia aktualizacja

  • Rozpocznij

    Koniec


Filtruj po ilości...

Data dołączenia

  • Rozpocznij

    Koniec


Grupa


Imię


Strona

Znaleziono 16 wyników

  1. Cześć, mam problem z programem Khazama AVR Programmer, który używam do programowania mikrokontrolerów z pomocą USBasp. Problem polega na tym, że w przeciągu tygodnia przestał mi on działać. Nie działanie polega na tym, że nie pokazuje listy mikrokontrolerów i kompletnie nie da się nic za pomocą niego zrobić, żaden przycisk nie działa. Czy ktoś też zmagał się z takim problemem i udało się go rozwiązać? Próbowałem już odinstalowywać i usuwać wszystkie(większość) plików programu. Sprawdzałem poprzednie wersje i cały czas jest to samo. Na starym komputerze mi działa. Program jest darmowy więc to nie jest wygaśnięcie licencji. Plik instalacyjny pobieram z strony autora. Ma ktoś jakiś pomysł czego to może być wina?
  2. Niskobudżetowy zegar Nixie Każdy elektronik chyba kiedyś widział urządzenie oparte o lampy Nixie. Z racji ich uroku, niepowtarzalnego wyglądu i chęci zrobienia czegoś "wow", i ja taki zbudowałem. Działanie lamp Nixie: Dla tych, którzy nie wiedzą co lampy Nixie, już służę pomocą: lampy Nixie zostały wynalezione w latach 60. ubiegłego wieku. Pierwsza firma która je produkowała tak je nazwała i się ta nazwa przyjęła. Były też to pierwsze wyświetlacze cyfrowe. Ich działanie polega na jonizowaniu się gazu (neonu z domieszkami) wokół katody z przyłożonym napięciem ok. 180V. Zjonizowany gaz powoduje świecenie się, i układa się wokół katody (w tym przypadku cyfry). Na żywo wygląda to bezcennie, lecz należy pamiętać że to wysokie napięcie. Budowa: Ale może najpierw coś o mnie: nazywam się Leon, mam 14 lat, chodzę do 8 klasy podstawówki i interesuję się elektroniką, informatyką, itp. Mam też drukarkę 3D - nie wykorzystałem jej w konstrukcji z racji jej awarii (czekam jeszcze na nowego rampsa 😉 ). Przechodząc już do zegara: z racji mojego stosunkowo młodego wieku, nie mam zbyt dużo pieniędzy na projekty więc chciałem na całość przeznaczyć ok. 100 zł zebranych od dziadków. Dlatego miało wyjść tanio i dobrze. Założenia z góry były jasne: multiplexowanie 1 sterownikiem, użycie 4 lamp, oraz materiałów z odzysku. Zacząłem od zrobienia przetwornicy step-up na 200V prądu stałego. Skorzystałem z tego schematu, który się sprawdził dość dobrze. Potem przyszedł mi sterownik 74141, oraz neonówka - mogłem już sprawdzić czy wszystko działa, i działało za pierwszym razem (możecie zacząć budować bunkier na apokalipsę). Następnie przeszedłem do zrobienia płytki głównej - goła atmega 328 z kwarcem 16mhz, ze sterownikiem na jednej płytce. Od razu zamontowałem moduł czasu RTC DS1302 (najtańszy) który lekko zmodyfikowałem - piny dałem z drugiej strony, a na górze zamontowałem koszyczek na dużą baterię od biosa. Do tego doszedł stabilizator 7805 i sterownik katod lamp. Całość wyszła całkiem schludnie - jestem z tego zadowolony. Na końcu doszły mi tranzystory do sterowania anodami lamp. Zastosowałem tu klucz z NPN MPSA42 oraz PNP MPSA92. I tutaj, podczas testów zrobiłem błąd - z racji małego protoboarda zrobiło się zwarcie, przez które zjarałem mój pierwszy rezystor w życiu (!), a tranzystory jakoś działały dalej. Po naprawieniu usterki 1 lampa działała - mogłem wyświetlić wszystkie cyfry od 0 do 9. Mogłem też zmierzyć, że napięcie zapłonu wynosi 180V i obniża się do 140V napięcia pracy. Teraz zostało mi zrobić podstawki - model pod lampy IN-12 do druku mogę udostępnić, ale z racji uszkodzenia płyty musiałem je zrobić sam. Wziąłem więc starą pokrywkę od farby, wyciąłem prostokąty, markerem zaznaczyłem miejsca na piny wdg. datasheetu, mini wiertarką wywierciłem otwory. Musiałem przygotować też same piny do podstawek - użyłem tu rozwierconych pinów z podstawek precyzyjnych, a następnie młotkiem wbiłem we wcześniej przygotowaną podstawę. Elektronika była gotowa, więc zacząłem programować. Po chwili dodałem mikrofon elektretowy, aby po klaśnięciu zegar się sam wyłączył, i od razu przeświecił wszystkie cyfry w celu uniknięcia efektu zatrucia katod. Zauważyłem też, że cewka w przetwornicy się dość mocno grzeje - dałem więc kapkę pasty termoprzewodzącej z domieszkami złota i przykleiłem radiator. Została mi już najgorsza część - obudowa. Normalnie bym takową wydrukował, ale że nie mogłem, wyciąłem ze sklejki listewki które pomalowałem szprejem na czarny mat. Wywierciłem otwory, poskręcałem śrubami M2,5. Wyszło źle, krzywo, niedokładnie - po prostu do d.... , pewnie dlatego że to była moja pierwsza obudowa ze sklejki, i z pewnością wydrukuję później obudowę (post zaktualizuję). Z daleka, jak patrzymy na zegar, wygląda on ciekawie - czarna bryła, lampy rosyjskiej produkcji i to klaśnięcie - wszystko to sprawia, że zegar dodaje niepowtarzalny klimat do pokoju. Zegar robiłem cały tydzień szkolny. Działanie zegara: Zegar wyposażyłem w klawiaturę 3 przycisków - "+", "-", oraz "prog". Przytrzymując przycisk prog możemy nastawić zegar, klikając odpowiednio + i -, oraz kliknąć prog ponownie by nastawić kolejną cyfrę. Podczas zwykłego działania, kliknięcie + spowoduje wyświetlanie się minut oraz sekund, a - będzie wyświetlał godziny i minuty. Dodatkowo, jeżeli podczas uruchamiania zegara przytrzymamy przycisk +, zostanie wywołany efekt "slot machine". Całość programowałem w środowisku Arduino, za pomocą programatora USBASP. Lista zakupów: 4x lampy IN-12 - ok. 10zł/sztuka, 50zł całość (+przesyłka) konwerter step-up - jakieś 20zł za całość sterownik, neonówka i przesyłka - 20zł tranzystory z drobiazgami - 20zł ----------------------------------------------------------------------- Za całość zapłaciłem jakieś 110zł. Resztę elementów już miałem. Dość nieźle, kiedy najtańsze zegary były chyba za ok. 300zł. Cudem jest fakt, że przeżyłem - akurat teraz mnie nic nie kopnęło, ale wcześniej doświadczyłem mocy napięcia gniazdkowego (długa historia). Sam zegar przyniósł mi dużo pochwał, szacunek u kolegów, 6 z fizyki na semestr - to tak jak te cudowne aplikacje na androida 😉 Od siebie jeszcze powiem, że na pewno zegar rozbuduję i wzbogacę o nowe funkcje. Co dalej? Mam w planach kalkulator domowej roboty, z kolegą zbudowałem już działający prototyp urządzenia podlewającego rzeżuchę. Oczywiście zachęcam do budowy zegara, ale należy pamiętać o wysokim napięciu. Pozdrawiam, Leoneq :3
  3. Zamysł: „ATMEGA” jako PLC. Wszystko zaczęło się od chęci programowania/użycia sterownika PLC w domowych warunkach do prostych automatyzacji. Jednakże oryginalne sterowniki PLC są drogie. Nawet jeżeli ktoś by się zdecydował na jego zakup to nie wykorzystał by jego możliwości. Postanowiłem więc zbudować coś co może przypominać sterownik PLC i nie tylko przypominać, ale także działać na tej samej zasadzie. Jak wiemy sterowniki PLC najczęściej programuje się w języku „LD” co może być problemem przy programowaniu mikrokontrolerów AVR. Jednak je programujemy w języku „C”, czyli języku, który jest najbardziej popularny oraz oczekiwany w dziedzinie programowania. Istnieją programy które przetworzą nam program napisany w języku „LD” na „C” lecz do samego programowania mojego projektu nie jest to konieczne jedynie, gdzie widzę sens użycia takiego programu to programowanie sterownika przez inną osobę, która nie zna języka „C”. Jest to urządzenie z dużym potencjałem mam tutaj na myśli „nieograniczoną” możliwość rozbudowy i przystosowania do samego użytkownika. Cenowo tutaj nie będę porównywał, bo nie ma żadnego porównania, tak samo jak do prawdziwego sterownika PLC który to już długi czas króluje na rynku i ciągle się rozwija. Reasumując „ATMEGA” jako PLC jest bardzo ciekawym, tanim projektem, który możemy wykorzystać w naszych domach do sterowania prostych oraz średniozaawansowanych czynności. Budowa: Wszystkie połączenia oraz schemat płytki drukowanej wykonałem w programie EasyEDA. Następnie ścieżki wydrukowałem na papierze kredowym i odbiłem je na laminacie poprzez termo-transfer. Następnie wytrawiłem płytkę oraz wywierciłem otwory pod elementy przewlekane. Zacząłem lutować elementy, na samym początku przylutowałem wszystkie elementy potrzebne do zaprogramowania oraz uruchomienia mikrokontrolera oraz tylko jedno wyjście(przekaźnik). Po wypróbowaniu czy wszystko działa zgodnie z założeniem przylutowałem resztę elementów. Tak wiem nie wyczyściłem pytki. Następną czynnością było zaprojektowanie i wydrukowanie obudowy na płytkę i złożenie w całość. Dodałem opisy na obudowie jak wszystko powinno być podłączone. Przyszedł czas na testy. Wgrałem prosty program działający na zasadzie: jeśli podamy stan wysoki na wejście I1 załączy się wyjście Q1 po odłączeniu stanu wysokiego i po ponownym jego podaniu na wejście I1 spowoduje wyłączenie wyjścia Q1. Jeśli podamy stan wysoki na wejście I2 wyjście Q1 załączy się i wyłączy po 5 sekundach. Nie chodzi tu o zagłębianie się w sens tego programu tylko chodzi o pokazanie działania urządzenia. Filmik pokazujący działanie układu: ⚠️UWAGA! W filmiku zostało użyte wysokie napięcie które jest niebezpieczne dla zdrowia i życia.⚠️ Działania na rozwój projektu: W dalszym rozwoju projektu chciałbym dodać dodatkowe funkcje. Jedną z nich jest umożliwienie odczytu analogowych wartości z wejść urządzeń działających na logikę 5V takich jak: Potencjometr Fotorezystory Czujniki temperatury Dodanie wyjść PWM do sterowania prędkościami silników oraz natężeniem światła. Dodanie magistrali I2C do komunikacji np. pomiędzy kontrolerem a wyświetlaczem oraz innymi urządzeniami, które obsługują tą magistrale. Zmniejszeniem rozmiaru płytki drukowanej. Dodanie innych wersji sterowników np. 2 wejścia i 2 wyjścia do sterowania prostymi urządzeniami. Dodanie modułu Wi-Fi poprzez który będzie można odczytywać informacje dotyczące np. temperatury i zmieniać ustawienia z każdego miejsca, gdzie będziemy mieli dostęp do Internetu poprzez aplikację. Spis elementów elektronicznych:
  4. Założeniem projektu było zbudowanie w krótkim czasie biurkowego zegara. Na początku rozważałem zbudowanie prostego zegara na wyświetlaczach siedmiosegmentowych, jednak po przeanalizowaniu potrzebnych funkcjonalności stanęło na cyfrowym wyświetlaczu LCD. Taki wyświetlacz, dzięki bardzo małemu poborowi prądu, umożliwił sensowne zasilanie bateriami. Był to mój pierwszy projekt zasilany w ten sposób, gdzie czas pracy miał być w założeniu liczony przynajmniej w miesiącach. Wyświetlacz który użyłem w projekcie to DE 120-RS-20/7,5/V, który charakteryzuje się pełnymi 4 cyframi o wysokości 18mm i, co ważne, nie jest multipleksowany, dzięki czemu nieco łatwiej było napisać program który nim sterował. Jeśli chodzi o mikrokontroler, to wybrałem Atmegę 4809, ponieważ był to jedyny mikrokontroler z nowej rodziny AVR, dostępny w wersji przewlekanej, posiadający odpowiednią liczbę i/o. W kwestii zasilania stanęło na dwóch bateriach AA, zastosowanie AAA nie miałoby większego wpływu na rozmiar całości, z kolei zastosowanie baterii typu CR2032 znacząco by zmniejszyło czas pracy. Całość została zlutowana na płytce uniwersalnej, połączenia zostały zaprojektowane w eagle. Było kilka iteracji projektu, tak aby zminimalizować liczbę zworek i maksymalnie uprościć połączenia. Atmega została umieszczona pod ekranem, natomiast z drugiej strony został przykręcony zasobnik na baterie. Do ustawiania czasu służą dwa przyciski - jeden ustawia godziny, drugi minuty. Wydaje mi się to najprostszą możliwą metodą ustawiania czasu (poza opcją automatyczną :)). Piny w mikroprocesorze wykorzystane są wszystkie, przy czym nie wszystkie segmenty wyświetlacza są podłączone - ucierpiały kropki i jeden segment z pierwszej cyfry, który w przypadku wyświetlania tylko i wyłącznie czasu jest niepotrzebny, przy założeniu że godziny poranne wyświetlamy bez zera, czyli np 8:36 a nie 08:36. Jedną z ciekawszych części projektu była realizacja możliwie energooszczędnego oprogramowania. Wyświetlacze, takie jak ten zastosowany w projekcie, wymagają odświeżania z częstotliwością 30Hz - 100Hz (rekomendowane jest 32Hz). Jest kilka możliwości energooszczędnej realizacji tego zadania, ja ostatecznie zdecydowałem się na napędzanie Atmegi wewnętrznym oscylatorem z dzielnikiem 10, co dawało ok 2MHz i całkowite usypianie procesora na czas bezczynności (power down). Odmierzanie czasu, a jednocześnie wybudzaniem procesora z trybu power-down realizowane było natomiast z użyciem kwarcu zegarkowego i okresowego przerwania z modułu RTC, wywoływanego co 512 cykli kwarcu (co daje 64Hz). Zasada działania całości jest raczej prosta - co 1/64s wywoływane było przerwanie, program doliczał sobie kwant czasu, obsługiwał wyświetlacz (albo odwracał wszystkie piny, albo "renderował" nowy czas) i szedł dalej spać. W celu dodatkowej optymalizacji, wszystkie możliwe godziny zostały stablicowane przy pomocy małego skryptu w Typescripcie. Dzięki temu wyświetlenie nowej godziny było bardzo szybkie - wystarczyło odczytać 5 kolejnych wartości z tablicy (po jednej na każdy port uC) i wpisać je na odpowiednie porty (po uprzednim przepisaniu wartości z pinów które nie były podłączone do wyświetlacza). Takie podejście zapewniło mi pobór prądu, który był ciężki do zmierzenia moim tanim miernikiem, wynosił średnio ok 5-6uA, co przy idealnych warunkach daje jakieś 50 lat pracy na baterii (nie uwzględniając samorozładowania). Wiadomo, taka wartość jest nieosiągalna, ale pozwala przypuszczać, że przynajmniej kilka lat zegar powinien podziałać na jednym komplecie baterii. Obudowa zegara została wydrukowana na drukarce 3D. Śrubki, które trzymają całość w jednym kawałku, nie są może najładniejsze, ale mogłem wykorzystać tylko to co miałem po ręką 😄. Gwinty zostały przylutowane do płytki uniwersalnej (są to po prostu konektory typu zacisk śrubowy, wykorzystane w trochę innym celu). W trakcie budowy sporym problemem okazały się zakłócenia powstające na ścieżkach. Było to do przewidzenia, jednak nie spodziewałem się że tak mocno wpłynie na stabilność kwarcu. Ostatecznie musiałem nieco przeprojektować płytkę i pozmieniać część ścieżek, tak aby zmaksymalizować wolną przestrzeń dookoła kwarcu, zmieniłem też nieco wartości kondensatorów przy nim. Myślę że w przypadku wykonania normalnej PCB takie problemy by nie wystąpiły, możliwe by też było otoczenie kwarcu polem masy. Jeśli chodzi o możliwości rozbudowy, to możliwe by było dodanie wyświetlania temperatury, ponieważ Atmega4809 ma wbudowany termometr. Z kolei przejście na SMD i zmiana zasilania np na baterie CR2032 pozwoliłaby na zauważalne zmniejszenie grubości zegara.
  5. Cześć, zaczynam swoją przygodę z budową inteligentnego domu i mam następujące pytanie: Postawiłem domoticza na raspberry 4B oraz posiadam sterownik od firmy zajmującej się inteligentnymi domami na pokładzie z atmega644PA, która steruje wyjściami przekaźnikowymi. Czy jest możliwość, aby poprzez domoticza wydawać rozkazy (np. "AT+Out=2,5,1,1,0,1,0,0 <CR>", które będą wysyłane po rs232 do sterownika z atmegą?
  6. Witam wszystkich!!! W końcu po długiej nieobecności na forum, zrealizuje to do czego się zobowiązałem w moim wpisie pod projektem Bootlader programmer for UNO R3 - Rev.2, a dokładniej mówiąc opisze jak za pomocą Arduino UNO i wyżej przedstawionego urządzenia wgrywać Bootloadery do konkretnych ATmeg. Na warsztat weźmiemy procesory ATmega 8/168/328, gdyż środowisko Arduino IDE wspiera te procesory umożliwiając nam wgranie wybranego bootloadera. Cały proces przedstawię z wykorzystaniem Arduino UNO R3 wyposażonym w ATmegę 328. Opiszę cały proces od początku czyli od instalacji środowiska Arduino IDE, które jest dostępne na stronie producenta Arduino. Na razie nie podłączamy naszego Arduino do komputera tylko instalujemy Arduino IDE. Kiedy instalacja przebiegnie do końca bez jakichkolwiek problemów, wtedy podłączamy nasze Arduino i czekamy. Bywa także, że Windows musi doinstalować sterowniki aby prawidłowo rozpoznać podłączone urządzenie. Instalacja odbywa się automatycznie z Windows Update. System znajdzie i zainstaluje potrzebne nam drivery po czym wyświetli się komunikat, że sterowniki zostały prawidłowo zainstalowane oraz wyświetli nam nazwę podłączonego do komputera urządzenia. Po zakończeniu instalacji odłączamy nasze arduino i przygotujemy je do podłączenia Bootloader programmera. Najpierw zaczniemy od podłączenia płytki programatora do naszego Arduino tak jak to zostało przedstawione na zdjęciu. Aby ułatwić cały proces podłączenia, złącze programatora opisane zostało identycznymi oznaczeniami jakimi są opisane złącza Arduino UNO, dzięki temu proces podłączenia jest prosty i bezproble- mowy. Uwaga: Nie podłączamy linii RX, TX. W przypadku wgrywania bootloadera linie te nie mogą być podłączone. Następnym krokiem jest podłączenie Arduino do komputera oraz uruchomienie środowiska Arduino IDE po czym przechodzimy do ustawień środowiska Arduino IDE. Na początek sprawdzamy port, do którego podłączone jest nasze arduino. Jeżeli instalacja środowiska Arduino IDE przebiegła bez komplikacji to w zakładce "Narzędzia/Port" powinniśmy ujrzeć taki widok. Mamy do wyboru porty COM, wśród których znajduje się port do którego jest podłączone Arduino UNO. U mnie jest to port COM3. Możemy to rozpoznać po nazwie naszego urządzenia znajdującej się w nawiasie, po czym zaznaczamy wybrany port i przechodzimy do kolejnego ustawienia jakim jest wybór płytki. W tym celu klikamy "Narzędzia" i wybieramy opcję "Płytka". Z dostępnej listy wybieramy tą, która odpowiada naszej płytce podłączonej do komputera. W moim przypadku jest to: "Arduino UNO". Jest to bardzo ważne ustawienie bo od niego zależy wgrywanie sketch-ów czyli programów do Atmegi która jest sercem naszego Arduino, a także wgrywania bootloaderów do wybranych ATmeg z wykorzystaniem bootloader programmer. Ale wszystko po kolei. Po ustawieniu portu i wybraniu płytki klikamy "Plik/Przykłady" i z menu rozwijanego wybieramy "11.ArduinoISP/ArduinoISP". Jest to sketch, który czyni nasze arduino programatorem, które umożliwi nam wgranie do konkretnej ATmegi wybranego bootloadera z użyciem bootloader programmer. Naciskamy przycisk "wgraj" (strzałka w kółku) i czekamy na wgranie się sketcha. Po jego wgraniu klikamy na "Narzędzia/Programator" i z menu rozwijanego wybieramy "Arduino as ISP". Po zaznaczeniu tej opcji jesteśmy gotowi do wgrywania bootloaderów do ATmeg. Przejdziemy teraz do najważniejszej czynności czyli procesu wgrywania bootloadera. Bierzemy czysty procesor ATmega i umieszczamy go w podstawce bootloader programmera tak jak na zdjęciu. Jak widać na obudowie procesora z brzegu mamy półokrągle wycięcie a pod nim wgłębienie w postaci kółka które musi się znaleźć od strony dźwigni podstawki bootloader programmera. Opuszczamy na dół dźwignię podstawki tak aby piny złącza podstawki zostały dociśnięte do pinów procesora. Wgrywanie bootloadera do procesora ATMEGA 328 Klikamy na "Narzędzia i wybieramy "Wypal bootloader" po czym następuje wgrywanie bootloadera do naszej nowej czystej ATmegi. Proces ten może trwać od 15 sekund do jednej minuty. Diody: L, RX, TX na arduino powinny migać w trakcie wgrywania, a w dolnej części okna Arduino IDE powinniśmy ujrzeć taki komunikat w trakcie wgrywania oraz po zakończeniu wgrywania - zdjęcia poniżej. Po wszystkim możemy wyjąć procesor z podstawki i zaprogramować kolejny, jeżeli istnieje taka potrzeba. Wgrywanie bootloadera do procesora ATMEGA8/168 Tutaj zanim zaczniemy wypalać bootloader do jednego w powyższych procesorów, musimy dokonać zmiany jednego ustawienia. Klikamy "Narzędzia" i wybieramy opcję "Płytka" po czym z dostępnej listy wybieramy "Arduino NG or older" Ponownie klikamy "Narzędzia" i na liście wyboru pojawia nam się pole "Procesor" najeżdżamy na to pole kursorem, gdzie z menu rozwijanego mamy do wybory wyżej wymienione procesory. Klikamy na dany procesor do którego będziemy wgrywać bootloader. Następnie znów klikamy "Narzędzia" i opcję "Wypal bootloader" Proces ten może trwać od 15 sekund do jednej minuty. Diody: L, RX, TX na arduino powinny migać w trakcie wgrywania, a w dolnej części okna Arduino IDE powinniśmy ujrzeć taki komunikat w trakcie wgrywania oraz po zakończeniu wgrywania - zdjęcia poniżej. Po wszystkim możemy wyjąć procesor z podstawki i zaprogramować kolejny, jeżeli istnieje taka potrzeba. W przypadku kiedy wszystkie czynności zostały wykonane poprawnie a bootloader nie chce się wgrać, powinniśmy sprawdzić wszystkie połączenia płytek i procesora. Gdy to nie pomoże, warto na chwilę odłączyć arduino od komputera oraz zamknąć po czym ponownie uruchomić środowisko IDE Arduino. Za jakiś czas przedstawię kilka sposobów wgrywania sketch-y do procesora, który znajduje się już w gotowym projekcie. Tak aby obyło się bez zbędnych czynności w postaci ciągłego przekładania ATmegi z Arduino do gotowego projektu.
  7. Wymagania Postanowiłem zbudować zegar. O, kolejny projekt zegara, jakich w necie jest setki lub tysiące? No tak właśnie pomyślałem, przecież wśród tysięcy projektów zegara na pewno znajdę odpowiedni dla siebie ale niestety, po kilku dniach szukania dałem sobie spokój, nie ma takiego jak ja chcę. Dlatego rozpisałem wymagania i podzieliłem na obowiązkowe oraz opcjonalne, aby jeszcze raz przemyśleć i poszukać lub zastanowić się nad własnym projektem. Wymagane obowiązkowe: zasilanie akumulatorowe (najlepiej li-ion typu 18650) z okresem działania co najmniej 2 miesiące, dobra widoczność w nocy - wymagane podświetlenie wraz z regulacją jasności świecenia aby w nocy nie rozświetlał połowy pokoju tylko delikatnie się jarzył. duże cyfry min. 4 cm dokładność +/- 1 min/rok. Wymagania opcjonalne: automatyczne przestawianie czasu na letni i zimowy, nie musi pokazywać czasu non stop, wystarczy szybkie włączenie w reakcji na czujnik ruchu. No i niestety żaden projekt który znalazłem nie spełniał wszystkich 4 punktów obowiązkowych. Najczęściej jak w projekcie były duże widoczne wyświetlacze LED to było wymagane zasilanie sieciowe bo nikt się nie przejmował poborem prądu. Pierwsza myśl była taka, że może nie da się tego pogodzić, więc z ciekawości zabrałem się za analizę i weryfikację wymagań. Czy da się technicznie zrobić co spełnia wymagania obowiązkowe? Projekt Wstępne wyliczenia pokazały, że 7 segmentowe wyświetlacze o wielkości 1,8 cala są widoczne w nocy przy prądzie ok. 0,02 mA na segment, całkiem nieźle. Jednak w drugą stronę przy świetle dziennym do wyraźnego widzenia godziny wymagany jest prąd około 5-10 mA na segment no to dużo gorzej. Jednak opierając się o te wyliczenia i dodając czujnik ruchu PIR oraz czujnik oświetlenia zaprojektowałem zegar który powinien spełnić moje wymagania. Centralny mikrokontroler to Atmega88PA, który większość czasu jest uśpiony i pobiera tylko kilkanaście µA. Jako dokładny zegar wykorzystałem gotowy moduł DS3231. Bałem się trochę o prąd pobierany przez czujnik PIR, jednak okazało się, że moduł SR-505 zadowala się tylko ok. 50 µA. Dodatkowo do kontroli ładowania i zabezpieczenia akumulatora użyłem modułu z TP4056. Budowa Po etapie analizy wstępnie mogłem narysować schemat, w sumie prawie standardowy zegar tylko z dwoma obwodami zasilania. Pierwszy obwód o napięciu ok. 3.3V zasila mikrokontroler i pozostałe moduły: zegar i czujnik PIR. Drugi obwód z przetwornicą 5V zasila drivery 74HCT541 i wyświetlacze LED. Do narysowania schematu i projektu PCB użyłem programu KiCad oraz FreeRouting. Oto schemat, zaprojektowana płytka PCB i wizualizacja 3D Niestety już po zleceniu wykonania płytki PCB, eksperymentując z Atmega88PA, doczytałem i sprawdziłem też w praktyce na płytce stykowej, że wykorzystując do sterowania jasnością LED licznik 2 zamiast licznika 0 można znacząco ograniczyć pobór prądu. Sposób polega na generowaniu za pomocą licznika 2 modulacji PWM w której pomiędzy okresami CPU jest uśpiony w trybie SLEEP_MODE_EXT_STANDBY. Dlatego już podczas składania zegara dolutowałem dwa dodatkowe przewody zamieniając piny PD3<->PD5 czyli funkcje OC0B z OC2B, które one pełnią, dzięki temu uzyskałem zmniejszenie poboru prądu podczas wyświetlania godziny. Dodatkowo jeszcze wejścia sterujące jednego z buforów 74HCT541 podłączyłem na stałe do masy co zwolniło jeden z pinów Atmega do ewentualnego wykorzystania w przyszłości. Jeszcze po testach modułów postanowiłem zasilanie modułu DS3231 podłączyć do wyjścia Atmega i włączać zasilanie tego modułu tylko na moment odczytania aktualnego czasu co dodatkowo zredukowało pobierany prąd. Docelowo po uruchomieniu wersji testowej inne zmiany, w porównaniu do pierwszej wersji schematu z której było projektowane PCB, jak na razie nie były wymagane. Będąc przewidujący wyprowadziłem wszystkie mające znaczenie piny mikrokontrolera na kilka portów umożliwiających dolutowanie w przyszłości złącz szpilkowych tzw. goldpiny. Dzięki wyprowadzeniom szpilkowym zaprojektowana płytka PCB może pełnić rolę modułu dużego wyświetlacza LED sterowanego np. z Arduino lub innego zewnętrznego sterownika zasilanego 2,8-5V. Zegar w trakcie lutowania. Uruchomienie Podzieliłem uruchomienie na dwa etapy. W pierwszym przetestowałem obwód 3.3V co pozwoliło znaleźć kilka błędów programowych które uniemożliwiały przejście w tryb SLEEP_MODE_PWR_DOWN. W drugim etapie podłączyłem obwód 5V na razie bez wyświetlaczy LED i tu małe zaskoczenie, same bufory 74HCT541 w stanie włączenie ale bez żadnego obciążenia pobierają prąd kilka mA. Szybki test na płytce stykowej to niestety potwierdził, więc to nie był błąd w programie czy w montażu. Widocznie ten "model tak ma". Zamiana na D74HC541C nie pomogła a wręcz pogorszyła sytuację. No trudno te kilka mA w stanie aktywnym jakoś odżałuję, na szczęście stan wybudzenia to może 1% czasu pracy. Ostatecznie udało się zmniejszyć w trakcie uśpienia zegara pobór prądu do około 80 µA co uważam za sukces całego projektu. Jak się zegar będzie zachowywał i co ile czasu wymagane będzie doładowanie akumulatora okaże się w praktyce. Zdjęcia zmontowanego i uruchomionego zegara. Podsumowanie Ostatecznie udało mi zegar uruchomić i spełnić moje wymagania. Zdjęcie zegara w docelowym miejscu, a właściwie dwóch zegarów bo z rozpędu wykonałem dwie sztuki. Teraz mam jeden używany jako zegar i drugi do testów, rozbudowy i eksperymentów. Rozbudowa w przyszłości Po pewnym okresie użytkowania pojawiły się pomysły na rozbudowę: Bezprzewodowa synchronizacja z dokładnym zewnętrznym zegarem - niestety pierwszego pomysłu aby synchronizować zegar z siecią GPS nie udało mi się zrealizować z powodu słabego sygnału satelitów dostępnego w docelowym miejscu gdzie zegar ma się znajdować. Dlatego zamiast GPS planuję dołożyć moduł Bluetooth Low Energy HM-10 oraz dopisać prostą aplikację na Androida która będzie przesyłąła aktualny czas do modułu. Zatrzymywanie filmu gestem - zegar powstał jako „dodatek” do TV i jako taki sprawdza się doskonale, szczególnie kiedy wieczorem oglądam film i mogę na bieżąco kontrolować godzinę bez odrywania wzroku od ekranu. Jednak zamarzyła mi się opcja włączania pauzy w TV jedynie poprzez zbliżenie ręki od zegara. Zakupiłem już w tym celu moduł APDS9960 i po pierwszych testach wygląda na spełniający wymagania, czas reakcji na zbliżenie ręki na ok. 10cm jest błyskawiczny. Planuję w reakcji na zbliżenie przez dołączoną diodę IR emitować sygnał pilota Play/Pause.
  8. Hej, Umieszczam tutaj sposób wypalenia bootloadera na Atmega328P (Arduino Uno) za pomocą Arduino Leonardo. Nie jest to tak proste jak z użyciem Uno i długo się z tym męczyłem, wiec wrzucam dla potomnych. Nie jestem pewien dlaczego tak się robi, ale działa 😉 Potrzebujesz: Leonardo, Atmega328P, rezonatora kwarcowego, rezystora 10k om, dwóch kondensorów 22pF. Niestety musisz przeinstalować Arduino IDE do wersji 1.0.5. Wersje tą znajdziesz na oficjalnej stronie Arduino (https://www.arduino.cc/en/main/OldSoftwareReleases). 1. odinstaluj Arduino IDE 2. zainstaluj Arduino IDE 1.0.5 3. otwórz przykład ArduinoISP (Plik->Przykłady->ArduinoISP) 4. zmień "#define RESET SS" na "#define RESET 10" (druga linijka po komentarzu) 5. zmień "#define LED_HB 9" na "#define LED_HB 13" 6. wybierz płytkę Leonardo (Narzędzia-> Płytki->Arduino Leonardo) 7. wybierz port (COM) 8. wgraj program 9. przejdź do folderu "hardware" (C:\Program Files (x86)\Arduino\hardware) (ścieżka może się trochę różnić, ale chyba wyłapałeś o co chodzi) 10. utwórz w folderze hardware folder o nazwie "leofix" 11. otwórz notatnik i przekopiuj : " arduinoispleo.name=Arduino as ISP (Leonardo) arduinoispleo.communication=serial arduinoispleo.protocol=arduino arduinoispleo.speed=19200 " 12. zapisz to jako programmers.txt 13. podłącz układ : Atmego328P: Arduino Leonardo: RX pin 2-------------------------------------digital pin 0 TX pin 3-------------------------------------digital pin 1 MISO pin 18-----------------------------------ICSP pin MISO MOSI pin 17-----------------------------------ICSP pin MOSI SCK pin 19-----------------------------------ICSP pin SCK RESET pin1-------------------------------------digital pin 10 oraz 5v i GND (pamiętaj, że GND jest w dwóch miejscach, 5V również ) 14. dodaj rezonator, rezystor i dwa kondensatory. Schemat znajdziesz na oficjalnej stronie: https://www.arduino.cc/en/Tutorial/ArduinoToBreadboard. 15. zrestartuj Arduino IDE 16. wybierz płytkę UNO (Narzędzia-> Płytki->Arduino UNO) 17. wybierz port (COM) 18. wybierz Leonardo jako programator (Narzędzia->Programator-> Arduino as ISP (Leonardo) ) 19. wypal bootloader (Narzędzia->Wypal Bootloader) Jeżeli ktoś wie jak to zrobić prościej to piszcie 😉 (np. nie przeinstalowywanie Ardiuno IDE). Sorry ale nie wiem jak się wstawia zdjęcia źródło: 1. https://www.instructables.com/id/Arduino-Leonardo-as-Isp/ 2. można też obejrzeć Elektro Marsa (62. Jak przenieść projekt z Arduino na ATmega 328 )
  9. Witam. Chciałbym w programie z przerwaniem uzyskać następujący efekt żeby nie używać delaya: 1. Wywołuję przerwanie przyciskiem 2. W przerwaniu jest odmierzany czas przez Timer w Atmega8 i po np. 1 sekundzie przerwanie się kończy i przechodzi do programu głównego. Rozumiem że należy umieścić przerwanie wewnętrzne w zewnętrznym. Jak napiszę 2 przerwania pod sobą, pod programem głównym to po odpaleniu qC to co 1 s. będzie się włączało i wyłączało? Jak to ogarnąć już w kodzie takim jak poniżej bo gdzieś trzeba ten timer przerwania (np. TIMER1_OVF_vect) umieścić. Dziękuję z góry:) #include <stdio.h> #include <avr/interrupt.h> #define SWITCH (1<<PD3) int main(void) { //inicjalizacja przerwania - przycisk MCUCR |= (1<<ISC10); GICR |= (1<<INT1); //Timer1 TCCR1B |= (1 << WGM12); TCCR1B |= (1 << CS12); OCR1A = 31250; TIMSK |= (1 << OCIE1A); DDRD &= ~(SWITCH); PORTD |= (SWITCH); sei(); while (1) { } //kod programu } ISR(INT1_vect) { while(1) { //kod programu w przerwaniu } }
  10. Witam, Po inicjacji Timera, ADC przestaje działać. Przed, oraz w trakcie inicjacji wszystko działa jak należy, co sprawdziłem pułapkami programowymi w postaci funkcji LED() (na piny ADC0-2 podpięte są przez przyciski dzielniki napięć które na wyjściu dają połowę napięcia). Wszystko przestaje działać po włączeniu przerwania Compare Match Timera 1. Początkowo myślałem, że problem tkwi w tym, że program wychodząc z jednego przerwania wchodzi od razu w drugie, jednak dioda po zainicjowanym timerze wciąż świeci połową jasności, po prostu już nie gaśnie. Czy przerwania ADC i timera się w jakiś sposób gryzą? Lub ma ktoś jakiś inny pomysł w czym może tkwić problem? Kod: #include <stdlib.h> #include <avr/io.h> #include <avr/interrupt.h> #include <avr/pgmspace.h> #include <util/atomic.h> #include <util/delay.h> volatile int adc; volatile int MUX_tmp; volatile char adc_arr[3]; void ADC_init(void) { ADMUX|= ( _BV(REFS0) ); ADCSRA|= ( _BV(ADEN) | _BV(ADIE) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0)); DIDR0 |= 0x3F; } void LED(void) { while(adc<=300) { PORTB|=_BV(PB0); PORTB=0; } while(adc>=500){}; PORTB=0; } void Timer_init(void) { TCCR0A|= (_BV(COM0A1) | _BV(COM0B1) | _BV(WGM00) | _BV(WGM01)); LED(); _delay_ms(32); TCCR0B|= (_BV(CS00)); LED(); _delay_ms(32); TCCR1B|= (_BV(WGM12) | _BV(CS10)); LED(); _delay_ms(32); OCR1AH|= 0b1001000; LED(); _delay_ms(32); TIMSK1|= _BV(OCIE1A); LED(); _delay_ms(32); } ISR(ADC_vect) { adc=ADC; MUX_tmp=ADMUX & 0xF; adc_arr[MUX_tmp]=adc; if(MUX_tmp <= 3) { ADMUX=(MUX_tmp+1) | _BV(REFS0); MUX_tmp= ADMUX & 0xF; } else { ADMUX=_BV(REFS0); } ADCSRA|= _BV(ADSC); } volatile int Flag=0; ISR(TIMER1_COMPA_vect) { Flag=1; } int main(void) { sei(); ADC_init(); ADCSRA|= _BV(ADSC); DDRB|= _BV(PB0); LED(); _delay_ms(32); LED(); _delay_ms(32); Timer_init(); LED(); _delay_ms(32); while(1); { LED(); _delay_ms(32); } } Nie widzę potrzeby w wrzucaniu schematu, do PB0 podłączona jest dioda, do pinów ADC wspomniałem wcześniej a reszta mikrokontrolera podłączona jest prawidłowo. Z góry dziękuję za odpowiedź 🙂 Pozdrawiam Ps: Jest to wycinek programu, więc niektóre zmienne mogą zdawać się bezużyteczne (jak np int Flag)
  11. Zaczynając przygodę z elektroniką, prawdopodobnie każdy z nas jako jedno pierwszych narzędzi jakie kupił to sprzęt lutowniczy. Zazwyczaj zaczynamy od taniej "transformatorówki" lub zwykłej lutownicy kolbowej. Z czasem do coraz bardziej zaawansowanych projektów/napraw zaczyna brakować nam wielu funkcji w takim sprzęcie lub zwyczajnie chcemy czegoś lepszego i zastanawiamy się nad zakupem stacji lutowniczej. Tak wyglądał też mój początek z lutownicami.Pierwsze stacje które miałem, to popularne chińczyki które szybko się psuły lub zużywały. Po przepaleniu którejś kolby z rzędu, powiedziałem basta! Po dość długich poszukiwaniach, stwierdziłem że sprzęt który mnie zaspokoi jest dość drogi i zostaje DIY, tak właśnie stworzyłem idealną stację lutowniczą dla siebie, wzorując się na ciekawych i gotowych już pomysłach z sieci. Uwaga! W niektórych miejscach na płycie występują napięcia 230V! Niezachowanie ostrożności może grozić śmiercią! Założenia jakie miałem: Możliwość podłączenia różnych kolb lutowniczych( 24V z termoparą) Funkcja uśpienia(stacja przechodzi w tryb 180 stopni) Pamięć 3 najczęściej używanych temperatur Sterowanie pochłaniaczem dymu z poziomu stacji Wyświetlanie wszystkich informacji w czytelny sposób na LCD Niska awaryjność(pisze ten artykuł po kilku latach użytkowania stacji i póki co zero problemów) Niewielkie koszty Myślę że założenia udało mi się spełnić idealnie. Do stacji można podłączyć dowolną kolbę z grzałką na 24V. Posiada pamięć 3 zaprogramowanych wcześniej temperatur. Po 15 minutach od odłożenia kolby przechodzi w tryb uśpienia, co za tym idzie temperatura spada do 180 stopni i jest podtrzymywana, tak aby po podniesieniu kolby szybko się rozgrzać do poprzedniej temperatury, dodatkowo w trybie uśpienia wyświetlacz się wygasza. Po 30 minutach bezczynności stacja wyłącza się. Na tyle obudowy jest dodatkowe wyjście 230V pod które możemy podłączyć wyciąg powietrza, załączamy je odpowiednią kombinacją klawiszy. Dwie diody służą do sygnalizacji nagrzewania grzałki i załączenia wyjścia 230V. Obecnie pracuję na taniej kolbie firmy Zhaoxin ze względu na fakt, że posiadam bardzo duży zapas grotów i chcę je wykorzystać. Jednak gorąco polecam Solomon SL-30, którą używam w pracy i zdecydowanie dużo lepiej się nią lutuje. Układ załączania grzałki oparty jest na triaku i optotriaku który dodatkowo wykrywa przejście sieci przez zero. Jako ciekawe rozwiązanie warto tu wspomnieć o układzie włącznika. Podając impuls przyciskiem włączającym układ, tak naprawdę zawieramy styki przekaźnika na chwilę, procesor w ułamku sekundy wystawia stan wysoki na tranzystor który steruje przekaźnikiem załączającym zasilanie na całej płycie. Wyłączenie polega na wystawieniu stanu niskiego na tranzystor i odłączenie zasilania przez przekaźnik. Dodatkowe wyjście 230V również zbudowane zostało na popularnym układzie triak+optotriak. Wyświetlacz LCD w czytelny sposób prezentuje interesujące nas informacje takie jak stan podniesionej kolby, temperatura grota jak i żądaną, tryb pracy czy stan wyjścia 230V. Program do stacji został zaczerpnięty z innego projektu stacji który znalazłem w sieci, wspólnie z autorem dokonaliśmy kilku poprawek i modyfikacji. Po dopracowaniu całości i długich testach urządzenia prezentuje wam moim zdaniem najlepsza stacje lutownicza DIY. Poniżej zdjęcia i link ze szczegółowymi informacjami oraz plikami do konstrukcji😁 Szczegółowy opis i materiały do pobrania
  12. Cześć wszystkim. Mam problem z rezonatorem kwarcowym na płytce stykowej -- w momencie podpięcia go przez kondensatory 22 pF do masy, urządzenie nie jest rozpoznawane i avrdude wyświetla mi błąd (Mega1284). Jak tylko odłączę go od masy to urządzenie da się normalnie zaprogramować choć nie jestem pewien czy wszystko działa, ponieważ nie mogę przeprowadzić poprawnej transmisji UART (błędy w ramce danych, program jest dobry bo przez chwilę działał na ATMedze328p -- sprawdzane analizatorem logicznym.) Nie zamieszczam schematu podłączenia, ponieważ jest dobre -- na płytce lutowanej w której pracował mikrokontroler wszystko działa przy takim samym podłączeniu (kwarc połączony z masą). Zastanawia mnie też czy problemem może być sam kwarc. Zawsze używałem takich z oznaczeniem np. 16.000 itp. natomiast ten którego używam obecnie ma oznaczenie R160LEB8w Z góry dzięki za odpowiedzi. PS: Odpowiedź avrdude przy poprawnej transmisji. avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.01s avrdude: Device signature = 0x1e9706 (probably m1284) avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed To disable this feature, specify the -D option. avrdude: erasing chip avrdude: reading input file "asdf1.hex" avrdude: writing flash (184 bytes): Writing | ################################################## | 100% 0.08s avrdude: 184 bytes of flash written avrdude: verifying flash memory against asdf1.hex: avrdude: load data flash data from input file asdf1.hex: avrdude: input file asdf1.hex contains 184 bytes avrdude: reading on-chip flash data: Reading | ################################################## | 100% 0.08s avrdude: verifying ... avrdude: 184 bytes of flash verified avrdude: safemode: Fuses OK (E:FF, H:99, L:F7) avrdude done. Thank you. Kod programu: /*Przek dompilacją należy zdefinować wartości BAUD Rate */ #include <avr/io.h> #define BAUD 9600 #define MYUBRR F_CPU/16/BAUD-1 void UART_Init( unsigned int ubrr); void UART_Transmit(unsigned char data); int main(void) { char i = '5'; UART_Init(MYUBRR); UART_Transmit(i); while(1) ; return 0; } void UART_Init( unsigned int ubrr) { /*Set baud rate */ UBRR0H = (unsigned char)(ubrr>>8); UBRR0L = (unsigned char)ubrr; /*Enable receiver and transmitter */ UCSR0B = (1<<RXEN0)|(1<<TXEN0); /* Set frame format: 8data, 2stop bit */ UCSR0C = (1<<USBS0)|(3<<UCSZ00); } void UART_Transmit( unsigned char data ) { /* Wait for empty transmit buffer */ while ( !( UCSR0A & (1<<UDRE0)) ) ; /* Put data into buffer, sends the data */ UDR0 = data; } Wynik z analizatora stanów -- BAUD ustawiony na 9600 tak jak w programie:
  13. Cześć Mam problemy z Arduino i z programatorem. 1 . Kupiłem Arduino z chin podziałało chwile i kaput , no trudno pomyślałem że kupie nówkę sztukę orginalną , no ale też nie działa więc ... „I CAŁY MISTERNY PLAN W PIZDU” Arduino:1.8.9 (Windows 8.1), Płytka:"Arduino/Genuino Uno" Opcje projektu zmienione, przeładuj całość Szkic używa 444 bajtów (1%) pamięci programu. Maksimum to 32256 bajtów. Zmienne globalne używają 9 bajtów (0%) pamięci dynamicznej, pozostawiając 2039 bajtów dla zmiennych lokalnych. Maksimum to 2048 bajtów. avrdude: ser_open(): can't open device "\\.\COM3": Nie mo�na odnale�� okre�lonego pliku. Problem z wgrywaniem na płytkę. Sprawdź http://www.arduino.cc/en/Guide/Troubleshooting#upload w poszukiwaniu sugestii. Ten raport powinien zawierać więcej informacji jeśli w File -> Preferencje zostanie włączona opcja "Pokaż szczegółowe informacje podczas kompilacji" 2. Z programatorem to jest taka sprawa że w szkole na warsztatach sprawdziliśmy i działa atmega z płytki z chin ale sama płytka nie działa ( nie ważne ) , kupiłem programator ISP i nwm jak to podłączyć , żeby działało hehe ( oraz dalsze kroki postępowania ). PS . nie jestem jakimś mistrzem ale z schematów to umiem czytać , gorzej z programowaniem ... Z ewent. błędy ort. to sorry ...
  14. Długo zastanawiałem się czy pokazać ten projekt lecz postanowiłem, że jednak napiszę. Moim projektem jest zegar oparty o lampę VFD IW-18. Projekt wykonałem około 5 lat temu kiedy myślałem, że ATMega644P jest niesamowitym potworem. Zegar stał tylko około rok na biurku i od tamtego czasu leży w szafie. Jest to jeden z moich pierwszych w życiu “większych” projektów. Stare polskie przysłowie mówi “Każdy elektronik zrobi kiedyś zegarek” więc zrobiłem i ja. Projektu tego nigdy nie opublikowałem - po pierwszej publikacji wzmacniacza akustycznego na Elektrodzie zostałem tak zjechany, że przestałem się chwalić swoimi postępami publicznie. Teraz jestem starszy, mądrzejszy i na luzie podchodzę do krytyki w Internecie 🙂 Projekt nie jest mistrzostwem estetyki ani też nie jest pozbawiony błędów. Hardware - komponenty Niestety nie ostał mi się żaden schemat czy zarys projektu, ale na szczęście elementy mają opisy. Oczywiście najważniejszą rzeczą, która mnie przekonała do budowy zegara jest próżniowa lampa fluorescencyjna IW-18. Kiedy ją zobaczyłem pierwszy raz od razu się w niej zakochałem i jak najszybciej kupiłem dwie sztuki u jakiegoś wrocławskiego elektronika. Lampa potrzebuje napięcia minimum 15 V. Przetwornica odpowiedzialna za napięcie podane na lampę to MC34063. Ustawiłem ją na około 30 V. Sercem układu jest wspomniana we wstępie ATMega644P w obudowie DIP. Po kilku latach obcowania z STM32 stwierdzam, że to jest naprawdę wielki kloc. Lampa IW-18 podobnie jak wyświetlacze 7-segmentowe wymaga multipleksowania. Jako, że MCU ma wiele pinów to zrobiłem to w całości na nim. Prądy płynące przez siatkę i segmenty lampy są zbyt duże, aby mogła to obsłużyć “goła” Mega, dlatego zastosowałem układy ULN2803A na portach sterujących wyświetlaniem. No dobra, ale zegar potrzebuje wyświetlać godzinę. Wykorzystałem zewnętrzny zegar RTC PCF8583P. Nie wiem czemu, ale nie wlutowałem gniazda na baterię o.O Oprócz prezentowania daty i godziny warto pokusić się o pomiar kilku parametrów środowiskowych. Postawiłem na temperaturę, wilgotność oraz ciśnienie. Za temperaturę odpowiada szalenie popularny DS18B20. Jako czujnik wilgotności dałem DHT11, a za pomiar ciśnienia odpowiada MPL115A1, który w tamtym czasie był dla mnie nieodpowiedni. Hardware - PCB PCB wykonałem ręcznie przy pomocy termotransferu żelazkowego. Jeszcze nie wiedziałem o patencie z laminarką. Niestety nie doszedłem do takiej wprawy, aby wykonać wszystkie ścieżki bez żadnej wady dlatego wiele z nich poprawione jest drucikiem. Był to też czas w którym zainteresowałem się komponentami SMD(stąd wspomniany wcześniej MPL115A1). Na PCB kilka elementów pasywnych jest w obudowie 1206. Był to też czas eksperymentów z DIY soldermaską wykonywaną farbami do ceramiki. Do dzisiaj mam jeszcze te same buteleczki z różnymi kolorami. Montaż lampy VFD nie jest mojego pomysłu. Kiedyś podpatrzyłem na inne wykonanie i bardzo mi się spodobało. Lampa wlutowana jest w osobną płytkę, a wszystkie piny wyprowadziłem na kątowe złącze goldpin. Obudowa Obudowy nie zrobiłem i było to świadome zagranie. Chciałem, aby cały zegar wyglądał trochę cyberpunkowo(wtedy nie znałem tego określenia). Ma to swój urok, ale niesamowicie przyciąga kurz. Wkręciłem jedynie kołki dystansowe jako nóżki. Software Program na szczęście się uchował i nawet wrzuciłem go jakiś czas temu na GitHub: https://github.com/lamik/IW-18_retro-style_clock Patrząc na niego dzisiaj, to nie jest aż tak źle 🙂 Najbardziej razi mnie mieszanie języków polskiego i angielskiego. Całość działa w oparciu o timery programowe i jest napisana całkiem nieźle jak tak dzisiaj na to patrzę. Datę i godzinę ustawia się dwoma przyciskami. Pierwszy jest od wyboru menu. Z każdym jego naciśnięciem zegar przechodzi o ustawiania kolejnej zmiennej, która ta w momencie ustawiania szybko miga. Drugi przycisk inkrementuje wybraną daną. Z menu zegar wychodzi sam po upływie kilku sekund. Wcześniej wspomniałem, że MPL115A1 był dla mnie nieodpowiedni. Niestety nie byłem w stanie poznać go od strony programowej. A to wszystko dlatego, że nie potrafiłem go przylutować zwykłą lutownicą 🙂 Nigdy później do niego nie wróciłem bo na rynku pojawiły się czujniki BMP od Boscha. Błędy Z perspektywy czasu oraz doświadczenia widzę wiele błędów. Niektóre z nich: RTC był szalenie niedokładny. Pamiętam, że wsadziłem zegar do szafy bo potrafił opóźniać się o kilka minut na dzień! Beznadziejna przetwornica wysokiego napięcia. Do MC34063 podchodziłem kilka razy i nigdy nie mogłem się z nią dogadać. To na razie chyba jedyna przetwornica która mnie pokonała. Skoro już o przetwornicy mowa to ustawiłem zdecydowanie na małe napięcie. Zegar jest bardzo słabo widoczny w oświetlonym pomieszczeniu. Grzanie się sekcji zasilania. Liniowy stabilizator 5V plus MOSFET od przetwornicy na jednym radiatorze to solidny grzejnik. Dzisiaj staram się unikać stabilizatorów liniowych. Grzanie się rezystorów na segmentach lampy. Źle je chyba dobrałem 🙂 Za cienkie ścieżki do termotransferu. Nie wiem czemu, ale zawsze chciałem zrobić PCB podobną do tych profesjonalnych, czyli cienkie i ładne ścieżki. Nigdy to nie wychodziło, a dzisiaj produkcja nawet w Polsce jest tak tania, że szkoda sobie zawracać głowę trawieniem. Soldermaska własnego wykonania nie jest warta zachodu. Nie jest ona tak wytrzymała jak profesjonalne maski. Łatwo się zdziera. Kątowe piny nie łączą się pod kątek prostym. Lampa pod swoim ciężarem opada i jest nierówno 😞 Może sam wyłapiesz jeszcze jakieś istotne błędy 🙂 Podsumowując - projekt mimo, że robiony był przez młodego i mało doświadczonego zapaleńca elektroniki to nauczył mnie wiele. Prawdą jest to, że każdy projekt uczy nas, a przy początkach uczy najwięcej. Dzisiaj szkoda mi jest niszczyć tą konstrukcję i mimo, że nie będę jej używał, to trzymam w szafie. Na szczęście mam jeszcze jedną lampę IW-18. Kiedyś pewnie powstanie coś na miarę moich dzisiejszych możliwości 🙂
  15. Wstęp: Na wstępie chciałbym zaznaczyć, iż jest to mój pierwszy projekt, w którym miałem możliwość wykorzystać software do projektu własnej płytki PCB i skonstruować coś co nie bazuje na płytce Arduino i nie jest plątaniną przewodów na płytce stykowej. Proszę o wyrozumiałość, a zarazem o konstruktywną krytykę i cenne wskazówki, które mogą być przydatne przy tworzeniu kolejnych projektów. Wykonany prze ze mnie projekt nie jest innowacyjny, ale dzięki niemu mogłem spróbować swoich przede wszystkim w wytrawieniu pierwszej płytki PCB. Opis: Wynikiem końcowym projektu jest niewielkie pudełko/sejf do przechowywania drobnych rzeczy, które można otworzyć po wpisaniu hasła, bądź przyłożeniu karty. Sercem układu jest mikrokontroler, który można spotkać w Arduino UNO R3. Ze względu na prostotę środowiska ArduinoIDE zdecydowałem się na implementację kodu właśnie w tym programie. W związku z tym wybór padł na mikrokontroler ATmega328P z wgranym bootloaderem dla Adruino. Takie rozwiązanie pozwoliło mi na wykorzystanie gotowych bibliotek do obsługi modułu RFID i klawiatury numerycznej. Zdecydowałem się na brak wewnętrznego źródła zasilania. Został wyprowadzony przewód USB, dzięki któremu urządzenie można podpiąć pod dowolne wyjście USB (powerbank, port USB w komputerze, ładowarka sieciowa). Urządzenie jest więc zasilane napięciem 5V DC. Wykorzystane elementy: Na projekt składają się wymienione wcześniej elementy, tj.: ATmega328P moduł RFID klawiatura numeryczna 4x3 konwerter poziomów logicznych oraz: stabilizator napięcia LF33CV rezonator kwarcowy 16MHz serwomechanizm rezystory 22Ohm oraz 10kOhm kondensatory 100nF diody LED (czerwona i zielona) + oprawki przewód USB + odgiętka na przewód przewody połączeniowe drewniane pudełko (brak linku, elementy znaleziony w piwnicy w trakcie porządków) dystans nylonowy Budowa: Po przetestowaniu działania urządzenia na płytce prototypowej znalazłem odpowiednie pudełko, w którym zmieści się układ i będzie stosunkowo estetycznie wszystko rozmieszczone. Wyciąłem miejsce na klawiaturę, miejsce na blokadę serwomechanizmu oraz wywierciłem otwory na oprawki na diody. W kolejnym kroku pokryłem pudełko matową farbą i wnętrze wypełniłem materiałem zbliżonym do okleiny na głośnikach i tubach basowych. Po wykonaniu płytki przystąpiłem do lutowania elementów. Klawiatura, moduł RFID, diody, serwomechanizm oraz złącze zasilania zostały połączone z płytką poprzez przewody połączeniowe z końcówką żeńską. Płytka PCB została umieszczona w górnej części pudełka na nylonowych dystansach. Pod płytką znalazło się miejsce na moduł RFID oraz klawiaturę i diody. Na koniec wyciąłem odpowiedni fragment deseczki balsowej z miejscem na serwomechanizm, aby ukryć przewody połączeniowe. Deseczkę balsową okleiłem tym samym materiałem co wnętrze pudełka. Oprogramowanie: Kod programu został napisany w środowisku ArduinoIDE z wykorzystaniem następujących bibliotek: Servo.h Keypad.h Password.h SPI.h MFRC522.h Kod programu: #include <Servo.h> #include <Keypad.h> #include <Password.h> #include <SPI.h> #include <MFRC522.h> //Servo Servo servo; //Password Password password = Password("1234"); //RFID const byte UID1[] = {0x70, 0xC3, 0xF9, 0x65}; const byte UID2[] = {0x35, 0xDC, 0xD7, 0x65}; const byte ROWS = 4; const byte COLS = 3; char keys[ROWS][COLS] = { {'1', '2', '3'}, {'4', '5', '6'}, {'7', '8', '9'}, {'#', '0', '*'} }; byte rowPins[ROWS] = {4, 3, 2, 0}; byte colPins[COLS] = {8, 7, 6}; Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); MFRC522 rfid(10, 5); MFRC522::MIFARE_Key key; void setup() { Serial.begin(9600); SPI.begin(); rfid.PCD_Init(); pinMode(A0,OUTPUT); pinMode(A1,OUTPUT); servo.attach(9); servo.write(0); keypad.addEventListener(keypadEvent); digitalWrite(A0,HIGH); digitalWrite(A1,LOW); } void loop() { keypad.getKey(); if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) { if (rfid.uid.uidByte[0] == UID1[0] && rfid.uid.uidByte[1] == UID1[1] && rfid.uid.uidByte[2] == UID1[2] && rfid.uid.uidByte[3] == UID1[3]) { servo.write(90); digitalWrite(A0, LOW); digitalWrite(A1, HIGH); } else if (rfid.uid.uidByte[0] == UID2[0] && rfid.uid.uidByte[1] == UID2[1] && rfid.uid.uidByte[2] == UID2[2] && rfid.uid.uidByte[3] == UID2[3]) { servo.write(90); digitalWrite(A0, LOW); digitalWrite(A1, HIGH); } } } void keypadEvent(KeypadEvent eKey) { switch (keypad.getState()) { case PRESSED: Serial.println(eKey); switch (eKey) { case '#': checkPassword(); delay(1); break; case '*': closeBox(); delay(1); break; default: password.append(eKey); delay(1); } } } void checkPassword() { if (password.evaluate()) { servo.write(90); digitalWrite(A0, LOW); digitalWrite(A1, HIGH); } else { servo.write(0); digitalWrite(A0, HIGH); digitalWrite(A1, LOW); } } void closeBox() { password.reset(); servo.write(0); digitalWrite(A0, HIGH); digitalWrite(A1, LOW); } Działanie programu: Aby odblokować serwomechanizm i otworzyć pudełko należy wpisać odpowiedni kod zdefiniowany w programie i zatwierdzić znakiem "*" lub przyłożyć odpowiednią kartę (zdefiniowane są dwie karty). Po odblokowaniu gaśnie dioda czerwona, zapala się dioda czerwona i serwomechanizm zmienia położenie. Aby zamknąć pudełko należy wcisnąć przycisk "#". Podsumowanie: Projekt uważam za prawie zakończony. Po złożeniu całego urządzenia zwróciłem uwagę na brak możliwości zmiany kodu oraz dodania nowej karty (możliwe jedynie poprzez przeprogramowanie ATmegi). Projekt płytki zapewne pozostawia sporo do życzenia, dlatego liczę na cenne wskazówki aby nie popełniać błędów w przyszłości. Za wadę uważam też brak dodatkowej filtracji zasilania (stwierdziłem, że skoro biorę zasilanie z USB to nie trzeba nic dodawać). Zaletą (albo i wadą 😉) urządzenia są małe gabaryty. Ja wykorzystuje je do przechowywania zdjęć wykonanych Instaxem. Załączniki: W projekcie załączam kod programu, wykorzystane biblioteki i projekt Eagle do płytki PCB. Zdjęcia: safe_box_eagle.zip safe_box_software.zip
  16. Witam , wchodzie w temat uC i proszę o pomoc (ATmega8a) DDRB=0b00001111;// ustawienie pinów 0-3 portu B jako wyjście DDRB &= ~(1<<PB7); PORTB |= (1<<PB7); DDRD &= ~(1<<PD7); PORTD |= (1<<PD7); próbowałem też: DDRB=0b00001111;// ustawienie pinów 0-3 portu B jako wyjście //DDRB &= ~(1<<PB7); PORTB |= (1<<PB7); DDRD &= ~(1<<PD7); PORTD |= (1<<PD7); Dlaczego nóżka D7 ma wysokie napięcie (H) a nóżka B7 nie ?
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.