Skocz do zawartości

Przeszukaj forum

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

  • 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


TempX

Znaleziono 12 wyników

  1. Witam wszystkich!!! Po długiej przerwie w końcu znalazłem czas aby opublikować swój kolejny projekt. Po mojej serii ostatnich artykułów dotyczących zalet Arduino UNO ten będzie można uznać poniekąd za ostatni z tej serii. Uważam bowiem, że temat sposobów ułatwiających wgrywanie sketchy oraz bootloaderów do procesorów Atmega8/168/328 stosowanych w popularnym Arduino UNO (głównie ten ostatni) został przeze mnie wyczerpany. Dziękuje wszystkim, którzy przeczytali moje poprzednie artykuły i sprawia mi ogromną satysfakcję, jeżeli informację w nich zawarte komuś mogły pomóc. Tyle tytułem wstępu. Teraz przejdę do opisu mojego projektu dlaczego powstał i dlaczego zrealizowałem go w taki, a nie inny sposób. Dotąd projektowałem dość proste układy, które realizowałem na zaprojektowanych przez siebie PCB tylko jednowarstwowych i wykonanych w warunkach domowych metodą termo transferu z wykorzystaniem elementów THT. Jako, że pracuję jako technik w jednej z firm gdzie mam okazję montować urządzenia na profesjonalnych PCB z wykorzystaniem elementów SMD poczułem chęć zrealizowania jakiegoś swojego projektu w tej właśnie technologii, a także zaprojektowania płytki PCB dwuwarstwowej. Jako, że ostatnie moje artykuły są związane z Arduino UNO oraz, że mam też swoją wizję tej platformy. Dlatego postanowiłem zaprojektować właśnie odpowiednik Arduino UNO wg swojej koncepcji. Nazwa odpowiednik nie jest bez powodu bo nie jest to typowy "klon" tej platformy. Generalnie powiem, że od razu nie poszedłem na całość tzn. planuje za jakiś czas zrobić drugą jego wersję, która będzie ostateczną bo będzie zawierać dodatkowe funkcje. Na początku skorzystałem z ułatwień takich jak posiadany przeze mnie konwerter USB UART RS232, który podłączany jest do złącza na płytce aby móc komunikować się z procesorem. Generalnie chciałem sprawdzić jak moja koncepcja sprawdzi się w rzeczywistości oraz czy PCB jest dobrze zaprojektowane, tzn. czy urządzenie działa poprawnie i nie ma w nim zakłóceń, które mogłyby wpłynąć na stabilność jego pracy. Po uruchomieniu urządzenia okazało się, że działa ono prawidłowo, oraz że moja koncepcja sprawdza się. Tak powstało MWuino UNO. Dwie pierwsze litery w nazwie pochodzą: pierwsza od mojego imienia a druga od nazwiska. Zatem czym MWuino UNO różni się od typowych klonów Arduino UNO. Zacznijmy od wizualnych różnic: 1. PCB ma zupełnie inny kształt i jest dłuższe w stosunku do oryginału i klonów o 1,5cm. MWuino UNO ma długość 8cm, szerokość zaś to 5cm. Krańce PCB zostały łagodnie zaokrąglone aby wygodnie można było trzymać płytkę w ręce. 2. Inne ułożenie elementów elektronicznych, aby można było je na powierzchni 5x8cm dobrze rozmieścić i odpowiednio poprowadzić ścieżki zarówno na stronie TOP jak i BOTTOM. Stąd też inne ułożenie gniazd/złącz sygnałowych dla procesora IC2 3. Najważniejsza widoczna różnica. Na PCB znajdują się dwa procesory IC1 oraz IC2, które zostaną omówione później. 4. Dodatkowe elementy, których nie ma w oryginalnym arduino, czyli: - włącznik zasilania. Koniec z wyciąganiem wtyczki z gniazda zasilania. Jednym ruchem palca możemy wygodnie wyłączyć zasilanie. - zamontowane złącza zarówno w wersji męskiej jak i żeńskiej. W zależności jakie przewody połączeniowe posiadamy możemy szybko podłączyć podłączyć elementy do gniazd procesora IC2 Poniżej zdjęcia prezentujące gotowe urządzenie: Strona TOP Strona BOTTOM Działające urządzenie z podłączonym konwerterem Nie chciałem wykonywać idealnej kopii tej platformy gdyż jest ich mnóstwo w internecie. Fakt, że niektóre z tych urządzeń mają bardzo ciekawe rozwiązania względem typowych kopii, które tak naprawdę nie oferują nic nowego poza niską ceną, a niekiedy ich jakość wykonania pozostawia wiele do życzenia. Ze względu na pewne rozwiązanie które jest mocną zaletą mojej wersji oraz tego aby wymiarowo było zbliżone do oryginału, pewne ułożenie elementów takich jak np: gniazda/złącza sygnałowe podłączone do procesora mają inne ułożenie niż ma to miejsce w oryginale. Generalnie dla mnie to nie jest problem, gdyż jak zaczynałem naukę z Arduino UNO nie czułem potrzeby używania tak zwanych shield -ów, tylko mając elementy łączyłem je na płytce stykowej, a z płytki stykowej za pomocą przewodów do odpowiednich pinów gniazd na płytce Arduino UNO. Co więcej takie ułożenie złącz przy procesorze gwarantuje najkrótsze połączenie z pinami procesora oraz ze względu na ich bliskość możliwość stosowania przewodów połączeniowych o zbliżonych długościach, gdyż przy rozstawie złącz w oryginalnym UNO oraz jego klonach, zdarzyło mi się kilka razy, że nie miałem przewodów o potrzebnej mi długości. Do urządzenia możemy podłączyć dowolny konwerter UART/RS232 TTL. Dzięki zastosowaniu złącz w wersji męskiej jak i żeńskiej nie będzie problemu z podłączeniem go do płytki za pomocą odpowiednich przewodów połączeniowych. Na zdjęciu jak widać mój konwerter jest wpięty bezpośrednio do gniazda żeńskiego na płytce, a to dlatego że na etapie projektowania linie sygnałowe i zasilania są dopasowane do wyprowadzeń posiadanego przeze mnie konwertera. Najważniejszą zaletą mojego projektu jest możliwość wgrywania bootloaderów do procesora IC2. Przedstawię najkrócej jak się da opis budowy i działania najważniejszych elementów układu. Dodatkowo w pliku do pobrania, zamieszczam schemat budowy, przydatny przy analizowaniu poniższego opisu, pliki gerber PCB w rev.2, zmodyfikowany skecz Arduino ISP-wymagany doi prawidłowego działania urządzenia, oraz listę elementów użytych do budowy-BOM. plik do pobrania:MWuinoUNO-rev.2.zip Starałem się możliwie w miarę zwięźle i ogólnie opisać działanie urządzenia. Tak więc: Procesor IC1 ma wgrany na stałe skecz Arduino ISP. Skecz tez został przeze mnie nieco zmodyfikowany tzn. dodano obsługę switcha S2(SELECT), Diody LED Status - BTLDR i PROGR oprócz standardowych (PMODE, HBEAT, ERROR) oraz sterowanie układami MUX/DEMUX - IC6,IC7, które są odpowiedzialne za przełączanie sygnałów TX,RX konwertera na odpowiednie wejścia RX,TX procesorów IC1 oraz IC2 oraz sygnałem z pinu (16) -IC1 na wejście (1)RESET IC2 – IC8. Układy MUX/DEMUX sterowane są z jednego wyjścia procesora IC1(4). Najprościej rzecz ujmując. Po uruchomieniu MWuinoUNO, zapalają się diody PROGR - zielona oraz HBEAT - niebieska. W tym trybie układy MUX/DEMUX nie są sterowane z IC1, a ich domyślne ustawienie powoduje, że sygnały RX,TX konwertera są podane na piny RX,TX procesora IC2. Ustawienie w tym trybie - PROGR, umożliwia nam wgrywanie skeczy do procesora IC2. Dla przykładu uruchamiamy środowisko Arduino IDE i wybierzmy standardowy skecz blink. Najpierw pamiętamy o ustawieniach czyli "Narzędzia" następnie "Port" COM - do którego podłączone jest nasz konwerter oraz "Płytka".Jeżeli w podstawce IC2 mamy procesor ATmega328 w polu "Płytka" wybieramy "Arduino UNO". Jeżeli używamy procesora ATmega8/168 to w polu "Płytka" wybieramy "Arduino NG or older" po czym ponownie klikamy na "Narzędzia" i w polu „Procesor” wybieramy właściwy, który aktualnie znajduje się w podstawce IC2. Kiedy wszystkie ustawienia są odpowiednie, klikamy na "Wgraj" i tu teraz jest bardzo ważna kwestia do omówienia. Jeżeli nasz konwerter ma tylko wyjścia TXD(TX), RXD(TX) oraz wyjścia zasilania, to tuż zanim nastąpi wgrywanie skecza do procesora musimy nacisnąć szybko przycisk S2(RESET) aby nasz procesor mógł się zaprogramować. Teraz napiszę jak to zrobić aby ta czynność przebiegła dość sprawnie. Klikamy "Wgraj" i patrzymy na napis na zielonym pasku nad czarnym okienkiem w którym pojawiają się informacje. Jeżeli jest napis "kompilowanie szkicu..." i obok jest pasek postępu, nie wciskamy przycisku S3(RESET). Kiedy pasek postępu dobiegnie końca i pojawi się komunikat "Wgrywanie" szybko wciskamy i puszczamy przycisk S3(RESET). Dlatego przed wgraniem dobrze jest mieć palec blisko tego przycisku i obserwować komunikaty, które powyżej napisałem. Osoby, które dysponują konwerterem z dodatkowym wyjściem oznaczonym jako DTR, nie muszą przed wgraniem skecza naciskać switcha S3(RESET), gdyż dzięki sygnałowi z DTR z konwertera, procesor IC2 zostanie automatycznie zresetowany. Bardzo istotną rzeczą przed wgrywaniem skeczy jest to aby programowany przez nas procesor posiadał wcześniej wgrany bootloader, gdyż bez niego nie wgramy skecza do procesora. W MWuinoUNO. Możemy wgrywać bootloadery do procesorów takich jak ATmega 8/168/328, gdyż Arduino IDE wspiera te procesory. Wystarczy że włożymy czysty procesor w podstawkę IC2 i możemy w ciągu chwili wgrać bootloader niż ma to miejsce w przypadku Arduino UNO i jego klonów, gdzie potrzebny jest shield do Arduino umożliwiający nam wykonanie tej czynności lub płytka stykowa z elementami takimi jak kwarc, kondensatory i rezystor(do pinu RESET procesora). Elementy te nie zawsze możemy mieć pod ręką, a i podłączenie całego układu zajmie nam chwilę i jak to bywa w przypadku płytek stykowych, może się okazać, że mamy przerwę w połączeniu i będzie problem z wgraniem bootloadera, a my dodatkowo stracimy kilka minut na poszukiwaniu usterki. Teraz opiszę jak wgrać bootloader do procesora IC2 w MWuinoUNO. Uruchamiamy środowisko Arduino IDE i sprawdzamy ustawienia programu tak samo jak opisałem to powyżej dla trybu PROGR. czyli "Port" i "Płytka". Następnie naciskamy i przytrzymujemy switch S2(SELECT) po czym zapala się czerwona dioda led opisana jako BTLDR. Jest to tryb w którym możemy wgrać bootloader do procesora IC2. W tym trybie procesor IC1 - z wgranym zmodyfikowanym skeczem "Arduino ISP" steruje układami MUX/DEMUX sprawiając, że układy IC6,IC7 przełączają komunikację konwertera (RX,TX) z procesora IC2 na procesor IC1 oraz IC8, z którego resetowanie procesora IC2 odbywa się z pinu (16) procesora IC1. Dzięki temu, wgrywanie bootloadera do procesora IC2 jest w pełni automatyczne i nie wymaga ręcznego resetowania procesora. Bootloader z PC zostaje wysłany przez konwerter do procesora IC1, który jest w tym momencie programatorem i z tego procesora liniami MISO, MOSI, SCK do linii MISO, MOSI, SCK procesora IC2 zostaje przesłany. Diody na liniach MOSI, MISO, SCK, sprawiają, że każda linia może przysyłać dane tylko w jednym kierunku. W przypadku linii MISO i SCK są dodatkowe rozwiązania z poziomu zmodyfikowanego przeze mnie skecza Arduino ISP. Ma to na celu sprawienie, że gdy wykorzystamy te piny w naszym programie, który wgramy do IC2, sygnały te nie będą absorbowane przez piny IC1. Szczególne znaczenie ma to dla linii SCK, gdyż tak samo jak w Arduino UNO i jego klonach podłączona jest dioda L, której działanie uaktywnia się na przykład po wgraniu standardowego skecza blink do IC2, a także jest aktywna w momencie wgrywania bootlodera do IC2, zatem może być sterowana zarówno z procesora IC1 jak i IC2 i nie nastąpi sytuacja aby wyjścia SCK obu procesorów w jednym czasie mogłyby nią sterować lub na przykład linia SCK IC1 będzie w stanie niskim absorbując sygnał w stanie wysokim z linii SCK IC2. Przekaźniki K1 oraz K2 przełączają zasilanie z konwertera na zasilanie podłączone z zewnętrznego źródła zasilania, czyli zasilacza podłączonego do DC jack. Oczywiście aby to nastąpiło najpierw musimy ustawić przełącznik S4 (ON, OFF) w odpowiedniej pozycji. Cewki przekaźnika pobierają zasilanie z zewnętrznego źródła zasilania jakim jest zasilacz, dzięki temu może nastąpić proces przełączenia zasilania z konwertera na zewnętrzne źródło zasilania. Oczywiście taki sposób przełączania zasilania nie jest idealny tzn. chodzi o szybkość. W momencie przełączania następuje resetowanie procesorów IC1,IC2 w wyniku chwilowego zaniku napięcia ich zasilania. Generalnie wiedziałem, że takie zjawisko wystąpi i myślę, że nie jest to duży problem. Częściowo można temu zaradzić dodając dodatkowy kondensator tantalowy o pojemności 100u za stykami przekaźnika, a dokładniej w okolicy zasilania najlepiej IC2. Unikniemy resetu w momencie podłączania zewnętrznego źródła zasilania jakim jest zasilacz. Niestety problem ten nie zniknie w momencie odłączania zewnętrznego źródła zasilania i ponownego przełączenia zasilania, na zasilanie z konwertera USB. Procesory ATmega328 dość szybko się uruchamiają w przeciwieństwie do ATmega8. Zauważyłem, że wszystkie procesory ATmega8 jakie posiadam potrzebują ok 8 sekund na uruchomienie programu (skecza). Opisałem najważniejsze koncepcje i sposoby ich realizacji w moim projekcie. Część z nich wynikała z tego, że wykorzystałem posiadane już przeze mnie elementy takie jak przekaźniki oraz konwerter oraz to, że pewne zjawiska takie jak ręczne resetowanie procesora przed wgraniem programu lub chwilowy zanik napięcia zasilania podczas jego przełączania dla mnie nie są jakoś specjalnie istotne. Najważniejsze, że cały projekt działa stabilnie oraz założenia, które w nim wdrożyłem także się sprawdziły. Tak jak wcześniej napisałem za jakiś czas przedstawię wersję bardziej rozbudowaną, w której będą wyeliminowane wyżej opisane niedogodności, a także dodatkowe nowe funkcje. Z ciekawości przejrzałem wszystkie możliwe klony Arduino UNO oraz rozwiązania i funkcje jakie zostały do nich dodane, a które naprawdę mogą się przydać większości użytkowników tej platformy. Obecnie wszystko mam już sprawdzone i jestem na etapie projektowania PCB. Pozostałe zdjęcia Na zakończenie chcę dodać, że przedstawione na zdjęciu urządzenie to rev.1 urządzenia. Zamieściłem pliki gerber w nowszej rewizji rev.2 mojego projektu, jeżeli ktoś będzie zainteresowany to bez problemu będzie mógł zamówić PCB. W skrócie wymienię różnice pomiędzy rev.1 a rev.2 MWuino UNO -Powiększone opisy pinów złącz/gniazd sygnałowych podłączonych do procesora IC2 -Obniżenie switcha S2(SELECT) oraz przesunięcie złącza zasilania J1 oraz kondensatora C2 w lewo, aby łatwiej było naciskać switch S2(SELECT) -Zmiana złącz konwertera z 5pin na 6pin oraz dodatkowe elementy R12,C21. Dodanie tym samym obsługi DTR z konwertera, dzięki czemu osoby które posiadają konwerter USB UART z linią DTR nie będą musiały ręcznie restartować procesora IC2 przed wgraniem do niego programu (skecza) -Przesunięty kondensator C9 w lewo aby łatwiej można było zamontować złącze JP1 (goldpin, żeńskie) -Dodany kondensator C20 do pinu RESET IC1. Urządzenie pracujące w obszarze dużych zakłóceń, a nawet dotknięcie palcem pinu RESET IC1 może zadziałać tak samo jak wciśnięcie switcha S1(RESET). Dodanie tego kondensatora eliminuje całkowicie ten problem. -Dodany C22 tantalowy do podtrzymania chwilowego zasilania procesora IC2 w momencie przełączania zasilania z konwertera na zewnętrzne źródło zasilania jakim jest zasilacz podłączony do gniazda J1 -Pady rezonatora kwarcowego GND podłączone do masy na PCB. Nie jest to konieczne, ale jeżeli producent opisał te piny jako GND, a ja generalnie trzymam się tego co jest napisane w dokumentacji. Wymagało to ode mnie zmodyfikowania domyślnej biblioteki rezonatorów kwarcowych programu Eagle, gdyż dostępne w tej bibliotece elementy szczególnie pasujące do zastosowanego przeze mnie rezonatora kwarcowego, piny te są pozostawione jako niepodłączone. -Poprawiono zamienione w rev.1 nazwy diod – HBEAT, ERROR -Dodanie rezystora R13-1M do pinu SCK procesora IC2 oraz IC1 (katoda diody D1). Do pinu SCK dodatkowo podłączone jest wejście nieodwracające wzmacniacza operacyjnego, pracującego w trybie wtórnika napięcia, którego zadaniem jest sterowaniem diody LED L, tak aby nie obciążać jednocześnie linii zegarowej SCK lub gdy ta linia pełni rolę we/wy. W momencie kiedy pin procesora IC2 nie jest zdefiniowany jako we/wy a tym samym nie ma ustawionego stanu H/L wejście wzmacniacza „wisi w powietrzu” powodując świecenie diody L. Tak duża wartość rezystora nie obciąża pinu SCK procesora, ale polaryzuje wejście wzmacniacza do masy w przypadku, gdy pin SCK nie jest określony jako we/wy a tym samym nie ma ustawionego stanu H/L. Co ciekawe oryginalne Arduino UNO oraz jego klony też nie posiadają rezystora polaryzującego wejścia wzmacniacza operacyjnego i tym samym wyżej opisane zjawisko w nich występuje (świecenie diody L) Powyższe zmiany jakie zostały wprowadzone do rev.2 MwuinoUNO. U mnie urządzenie w rev.1 działa bez najmniejszych problemów. Jedyną z powyższych zmian jaką zrobiłem to dolutowanie kondensatora do pinu (1)RESET-IC1 oraz rezystor do wejścia nieodwracającego wzmacniacza operacyjnego IC9. Wszystko sprawuje się dobrze i działa prawidłowo. Do prawidłowego działania urządzenia po zmontowaniu potrzebujemy koniecznie 1 szt. procesora z wgranym już bootloaderem. Jeżeli mamy czysty procesor oraz znamy kogoś kto ma Arduino nie koniecznie musi to być UNO i wie jak wgrywać bootloadery lub my sami posiadamy taką wiedzę, to już połowa sukcesu. Ewentualnie pozostaje nam zakup procesora z wgranym bootloaderem. Następnie co musimy zrobić to wgrać zmodyfikowany przeze mnie skecz Arduino ISP. Skecz ten wgrać możemy już w MWuinoUNO. Teraz kolejna zaleta w tym urządzeniu. Tryb PROGR działa także bez udziału IC1-jedynie diody LED status będą nieaktywne, z wyjątkiem diody L. Procesor umieszczamy w podstawce IC2 i wgrywamy zmodyfikowany sketch Arduino ISP (plik o nazwie „MwuinoUNO”). Po wgraniu wyjmujemy procesor z podstawki IC2 i umieszczamy w podstawce IC1. Od teraz możemy zamawiać czyste procesory Atmega8/168/328 tzn. bez wgranego bootloadera, i sami w łatwy sposób wgramy bootloader dla procesora, którego aktualnie zamierzamy używać. Poniżej link do filmu przedstawiającego działanie MWuinoUNO https://www.youtube.com/watch?v=oWh97v3rdZE
  2. Witam wszystkich!!! W poprzednim artykule przedstawiłem swoją wizję platformy Arduino UNO opartej o procesor ATmega 328 THT. Wizja nie do końca doskonała, choć dla mnie na chwilę obecną wystarczająca. Chciałem teraz, aby to było coś wyróżniającego się na tle klonów tej platformy. Coś z powiewem świeżości, nowego!!!. Bo nie sztuką jest zrobić klon 1:1 i to tylko aby zbić cenę a nieraz wykonanie niektórych klonów pod względem jakości jak i działania pozostawiało wiele do życzenia. Pierwsza wersja mojego urządzenia była tak naprawdę tylko wstępem do tego co teraz zamierzałem zrobić, co tym bardziej zachęciło mnie do zrobienia ostatecznej wersji mojego urządzenia. Wersji, która uważam zawiera ciekawe rozwiązania, których mi osobiście brakowało a na pewno znajdą się osoby, które myślą podobnie. Bo czym jest poświęcenie jednej ATmegi, której koszt wynosi mniej niż 10 PLN aby na stałe była zaprogramowana jako programator ISP , dzięki czemu możemy swobodnie wgrywać bootloader do drugiej wymiennej ATmegi, nie używając do tego dedykowanego shielda lub łącząc układ na płytce stykowej. Wygodnie prawda?. Możliwość podłączenia dowolnego konwertera, którego koszt nieraz jest mniejszy niż procesor ATmega 16U2, który dodatkowo trzeba zaprogramować lub inny układ odpowiadający za komunikację. A jako, że takie konwertery są tanie to opłaca się kupić kilka sztuk na tak zwaną "czarną godzinę" lub gdy mamy kilka projektów, które z nich korzystają. Na początku kilka słów samokrytyki!!! Pewne rozwiązania były zrobione na szybko. Owszem działały jednak na przykład: przełączanie zasilania z USB na zasilacz za pomocą przekaźników ogólnie nie jest idealne jak w oryginalnej platformie. Szczerze dla mnie osobiście to akurat było bez znaczenia gdyż tu sugerowałem się posiadanymi przeze mnie elementami oraz tym, że mi osobiście reset procesora nie przeszkadzał w momencie przełączania zasilania z USB za zasilacz i odwrotnie, ale jednak względem oryginalnej platformy, funkcjonalność ta znacznie odbiegała. Tak więc skoro moja wizja ma dorównać a docelowo być lepsza od oryginału i jego klonów, zatem działanie pewnych elementów urządzenia musi być takie samo. Poniżej kilka zdjęć nowej wersji MWuinoUNO-rev3.1 W przedstawionej przeze mnie wersji zrezygnowałem z użycia konwertera, a komunikację z procesorami wykonałem z użyciem układu FTDI232RQ. W plikach urządzenia, przygotowałem łącznie cztery wersje urządzenia. Plik do pobrania jest na końcu artykułu. Pierwszą wersję Rev3.1, którą aktualnie będę przedstawiał z użyciem FTDI 232RQ. Drugą wersja Rev3.2, także z użyciem FTDI232RQ, z tym, że zastosowany jest wydajniejszy stabilizator dla linii 5V - LM340MP-5.0/NOPB o wydajności prądowej 1,5A. Kolejne dwie wersje Rev4.1 oraz Rev4.2 gdzie do komunikacji możemy wykorzystać konwerter, tak jak miało to miejsce w prezentowanej jakiś czas temu pierwszej odsłonie mojego urządzenia, z tym że podobnie jest podobnie jak w Rev3.2, Rev4.2 ma wydajniejszy stabilizator dla linii 5V. Powstanie dodatkowych Rewizji 3.2 oraz 4.2 było podyktowane innymi rolami wyprowadzeń stabilizatora dla linii 5V - LM340MP-5.0/NOPB niż ma stabilizator NCP1117ST50T3G. Zatem obu tych stabilizatorów nie można używać zamiennie w tym przypadku. Podsumowując!!! Poprawiłem pewne niedostatki z wersji pierwszej wprowadzając odpowiednie modyfikację. Przejrzałem dostępne klony platformy UNO R3 z ATmegą 328 THT oraz ciekawe rozwiązania zaadaptowałem w swojej wersji urządzenia oraz dodałem drobne funkcje od siebie. Poniżej zdjęcia prezentujące pierwszą wersję urządzenia MWuinoUNO Rev.1 oraz aktualna prezentowana wersja MWuinoUNO Rev3.1 Uważam, że wszystko jest jak należy i więcej nic nie potrzeba dodawać. Urządzenie jest zbliżonych rozmiarów względem oryginału, a oferuje znacznie więcej niż oryginalna platforma lub jej klony. najważniejszą zaletą jest wygoda!!! W końcu dla hobbystów jak i amatorów wyeliminowanie pewnych rzeczy, które mogą nas irytować uważam że jest ważne. W końcu dla mnie elektronika oprócz zarabiania na życie to pasja, a ta raczej powinna nam zapewnić spokój i skupienie się na tym co robimy. Wiadomo, że nie jesteśmy w stanie wszystkiego przewidzieć, ale zawsze możemy próbować eliminować pewne niedogodności z tym związane. Przejdźmy zatem do omówienia mojego projektu. Porównajmy teraz moją wersję platformy Uno z oryginalną i jej wiernie wykonanymi klonami. Najważniejsze różnice są przedstawione poniżej: Cecha: UNO R3 oraz klony 1:1 MWuinoUNO Rev3.1 MWuinoUNO Rev3.2 MWuinoUNO Rev4.1 MWuinoUNO Rev4.2 Napięcie pracy 5V 5V/3,3V 5V/3,3V 5V/3,3V 5V/3,3V Jumper Bootloader Nie Tak Tak Tak Tak Złącze USB USB B micro USB micro USB nie dotyczy-brak nie dotyczy-brak Włącznik zasilania Nie Tak Tak Tak Tak Wyjście 3,3V* Prąd 150mA Prąd 300/500mA Prąd 300m/500mA Prąd 300/500mA Prąd 300/500mA Wyjście 5V Prąd 1A Prąd 1A Prąd 1,5A Prąd 1A Prąd 1,5A Oscylator Ceramiczny Kwarcowy Kwarcowy Kwarcowy Kwarcowy Wgrywanie bootloaderów Tylko z użyciem shielda Tak Tak Tak Tak lub podłączonego układu na płytce stykowej Sterownik USB ATmega16U2 FT232RQ FT232RQ UART/RS232 TTL UART/RS232 TTL konwerter konwerter Sterowanie diodą (L) wzmacniacz operacyjny MOSFET BSS138 MOSFET BSS138 MOSFET BSS138 MOSFET BSS138 *- Montujemy jeden z dwóch stabilizatorów w zależności od naszych potrzeb. Ze względu na to, że ich wyprowadzenia pełnią taką samą rolę można ich używać zamiennie. W prezentowanej wersji zamontowany jest stablizator o wydajności 300mA, gdyż 500mA na chwilę zamawiania elementów do montażu, nie był dostępny. Napięcie pracy: 5V/3,3V Przełącznik konfiguracji napięcia 3,3V/5V: ustala jakim napięciem jest zasilany mikrokontroler a tym samym z jaka logiką pracuje cały system, do wyboru 3,3V lub 5V. Jumper Bootloader: W trybie ON płytka się zresetuje po podłączeniu napięcia zasilania lub portu USB. W trybie OFF : program zapisany ruszy natychmiast po podłączeniu zasilania, płytka nie zresetuje się po podłączeniu portu USB do PC. Złącze USB: Możliwość użycia popularnego mniejszego kabla micro USB używanego w większości smartphonów, itp. Włącznik zasilania: Aby odłączyć urządzenie od zasilania nie trzeba już wyciągać wtyczki z gniazda. Można to zrobić włącznikiem ON/OFF. Wyjście 3,3V: MWuinoUNO zapewnia wyższą wydajność prądową stabilizatora 3,3V. Wyjście 5V: MWuinoUNO w Rev3.2 oraz Rev4.2 zapewnia wyższą wydajność prądową stabilizatora 5V. Oscylator: Rezonator kwarcowy zapewnia wyższą dokładność taktowania. Wgrywanie bootloaderów: W MWuinoUNO wystarczy do podstawki IC2 włożyć czysty procesor i wykonując odpowiednie czynności wgrać bootloader. Sterownik USB: Układ FT232 w MWuinoUno jest wspierany w każdym popularnym systemie operacyjnym lub wersja bez układu komunikacji FT232, gdzie możemy podłączyć dowolny konwerter UART/RS232 TTL. Sterowanie diodą (L): Sterowanie diodą LED w UNO i klonach podyktowane jest oszczędnością a tym samym wykorzystaniem drugiego wzmacniacza operacyjnego gdyż LMV358 zawiera dwa wzmacniacze. To zastosowanie ma pewne wady takie jak, że wzmacniacz operacyjny nie przenosi pełnego pasma sygnału CLK. Tak więc jasność LED nie będzie dobrze oddawała pinu CLK. Lepiej do tego celu nadaje się tranzystor, który steruje LED-em. Tranzystory MOSFET są sterowane napięciowo, więc podobnie jak wzmacniacz w konfiguracji wtórnika emiterowego, nie obciąża sygnału z pinu CLK. Tutaj też się przyznam, że większość z rozwiązań są skopiowane. Po przejrzeniu klonów platformy UNO wybrałem te użyteczne. Fakt faktem nie było tego dużo, więc wybrałem prawie wszystkie. Moje rozwiązania to tak jak w pierwszej odsłonie projektu zintegrowanie programatora ISP, dzięki, któremu możemy wgrywać bootloader do wymienialnego procesora IC2. Urządzenie posiada także sygnalizację zasilania z USB diodą LED. Rozwiązanie to niesie ze sobą dodatkową korzyść. Jak widać na schemacie załączonym w pliku: MWuinoUNO.zip - na przykład Rev3.1. Dioda LED USB jest sterowana stanem niskim wzmacniacza operacyjnego, pełniącego rolę komparatora. Generalnie do porównywania napięć przeznaczone są do tego celu komparatory. Jako, że nie mam ostatnio czasu bawić się w eksperymenty zastosowałem coś co jest sprawdzone i działa choć tutaj zastosowałem wzmacniacz, który był użyty w poprzedniej wersji do sterowania dioda użytkownika (L). Dobierając wtedy ten wzmacniacz patrzyłem pobieżnie na pewne parametry, ale zaryzykowałem i przy okazji postanowiłem zobaczyć czy się sprawdzi. No i jak widać wszystko działa dobrze. Teraz napiszę na czym polega dodatkowa korzyść z zastosowania diody LED USB oraz jej sterowania z wyjścia wzmacniacza. Rozwiązanie ze wzmacniaczem w roli komparatora jest skopiowane. Przeanalizujmy najpierw działanie wzmacniacza operacyjnego (IC10) w roli komparatora. Opis ten odnosi się do rev3.1 oraz 4.1, gdzie rezystory R18,R19 dzielnika napięć mają jednakową wartość rezystancji-10k. Zatem: Napięcie z zasilacza (VIN) jest podane na dzielnik napięcia złożonego z rezystorów R18, R19 o wartości 10 kOhm każdy, który działa w proporcji 1:2. Napięcie mierzone przez wzmacniacz (na wejściu nieodwracającym +) jest na rezystorze R19 dzielnika i jest porównywane z napięciem wzorcowym 3,3V mierzonym na (wejściu odwracającym -) wzmacniacza, które pochodzi z dodatkowego stabilizatora (IC5). Więc jeśli napięcie zasilania (VIN) jest równe lub nieco wyższe od 6,6V, tranzystor T1 nie jest sterowany z wyjścia wzmacniacza i tym samym nie przewodzi. Dioda LED USB nie świeci i do zasilania całego urządzenia wykorzystywany jest zasilacz. Najprościej rzecz ujmując: Napięcie na rezystorze R19 osiąga wartość 3,3V przy napięciu zasilania równym lub nieco wyższym od (VIN)=6,6V. Wyjście wzmacniacza operacyjnego sterującego tranzystorem T1 i diodą LED USB jest w stanie wysokim przez co tranzystor ten nie przewodzi oraz nie świeci dioda LED USB, co informuje nas, że do urządzenia podłączone jest zewnętrzne zasilanie, które także zasila nam całe urządzenie. Tutaj kluczowa jest też wartość napięcia zasilacza ze względu na minimalną wartość napięcia zasilania stabilizatora 5V. Standardowy stabilizator zastosowany w UNO i niektórych jego klonach na wejściu potrzebuje minimum 6,5V aby na jego wyjściu napięcie stabilizowane, którym zasilane są wszystkie podzespoły urządzenia, wyniosło 5V. W przypadku zastosowania stabilizatora LM340MP-5.0/NOPB minimalne napięcie zasilania tego stabilizatora wynosi 7,5V. Zatem aby urządzenie przełączało nam zasilanie z USB na zasilacz i tym samym aby mieć napięcie 5V na wyjściu tego stabilizatora, musimy zmienić wartość jednego z rezystorów dzielnika napięcia tak aby przy napięciu zasilania z zasilacza - 7,5V na rezystorze R19, napięcie wynosiło 3,3V. Zatem od czego najpierw zaczynamy. Z poniższego rysunku, (aby było nam łatwiej ustalić parametry dzielnika) widzimy, że musimy ustalić: Spadki napięć "UR18", "UR19" na rezystorach, prąd "Ir" płynący przez rezystory naszego dzielnika oraz wartość rezystancji "R18". Pierwszym krokiem będzie ustalenie rozkładu napięcia VIN na poszczególnych rezystorach dzielnika. Jako że wejście nieodwracające (+) wzmacniacza jest podłączone pomiędzy R18 a R19 to znaczy, że wzmacniacz mierzy napięcie na R19. Wiemy, że napięcie na R19 ma wynieść 3,3V przy napięciu zasilania VIN=7,6V. Zatem UR19=3,3V Znając napięcie na R19 Obliczymy teraz spadek napięcia jaki musi być na R18. Wystarczy, że od napięcia VIN odejmiemy napięcie na R19 UR18=VIN-UR19=6,7V-3,3V=4,3V. Zatem spadek napięcia na R18 wynosi 4,3V. Jak widać napięcie VIN jest sumą spadków napięć na poszczególnych rezystorach naszego dzielnika zatem: VIN=UR18+UR19=4,3V+3,3V=7,6V. Ustalamy wartość jednego z rezystorów dzielnika. Jest to istotne aby obliczyć prąd płynący przez dzielnik. Dla ułatwienia wybrałem R19 i niech będzie miał on wartość 10k. Jak widać dzielnik napięcia to po prostu połączone ze sobą dwa rezystory szeregowo. Cechą szeregowego połączenia rezystorów jest to, że płynie przez nie ten sam prąd "Ir". Zatem znając wartość rezystora R19 i spadek napięcia na nim, możemy obliczyć prąd "Ir" płynący przez oba rezystory, korzystając z prawa Ohma I=U/R zatem Ir=UR19/R19=3,3V/10k=0,33mA Z kolei znając wartość prądu płynącego przez rezystory R18, R19 dzielnika oraz spadek napięcia na R18, znów korzystając z prawa Ohma po przekształceniu wzoru I=U/R do postaci R=U/I, obliczmy rezystancję rezystora R18. Zatem R18=UR18/Ir=4,3V/0,33mA=13k Jak widzimy nasz rezystor R18 ma wartość 13k Jak widzimy w tym przypadku wyliczenie wartości potrzebnego nam rezystora jest bardzo łatwe. Dzięki temu nasz układ przełączając się z zasilania USB na zasilacz dostarczy do stabilizatora odpowiednio wysokie napięcie na jego wejście, aby na wyjściu tego stabilizatora uzyskać napięcie 5V potrzebne do zasilania podzespołów naszego urządzenia, a my dzięki diodzie LED USB będziemy wiedzieć czy tak się stało. Właśnie to jest ta zaleta. Oczywiście aby to działało sprawnie musimy obserwować diodę USB oraz ustawić odpowiednią wartość napięcia zasilania na zasilaczu. Po podłączeniu zasilania z zasilacza powinna zapalić się zielona dioda LED PWR, a niebieska USB zgasnąć. Musimy pamiętać, że zasilacze wtyczkowe regulowane przełącznikiem, mają podane na sztywno zakresy przełączanych napięć a nie wszyscy mogą wiedzieć że stabilizator aby dać napięcie 5V na wyjściu, musi mieć podane na wejście konkretną wartość napięcia. Najważniejsze, żeby pamiętać aby nie przekroczyć maksymalnego napięcia zasilania dla stabilizatora, aby tym samym go nie uszkodzić oraz innych elementów naszego urządzenia. W zależności od modelu stabilizatora, napięcie jego zasilania może mieć inną wartość. Jeżeli po podłączeniu zasilacza dioda LED USB nie zgaśnie może się okazać, że nasz zasilacz podaje zbyt niskie napięcie niż jest potrzebne do przełączenia się urządzenia z zasilania USB na zasilanie z zasilacza, a tym samym podania na wejście stabilizatora odpowiedniej wartości napięcia, aby na jego wyjściu uzyskać 5V. Będziemy też wiedzieć czy zasilacz jaki zastosowaliśmy ma odpowiednie napięcie aby zasilić nasze urządzenie. Aby ułatwić sprawę napiszę jaką wartość napięcia zasilania można podać dla danego typu stabilizatora: -stablizator NCP1117ST50T3G 5V, 1A. Producent napisał, że maksymalne napięcie wejściowe to max 20V. Natomiast minimalne to 6,5V -stabilizator LM340MP-5.0/NOPB 5V, 1,5A Producent napisał, że maksymalne napięcie wejściowe to max 35V. Natomiast minimalne to 7,5V Jak też widać pomimo, że mechanizm przełączania zasilania jest identyczny jak w platformie uno i jej klonach, to trochę podrążyłem temat co przedstawiłem powyżej. Być może komuś te informacje okażą się przydatne przy projektowaniu własnego urządzenia z użyciem dzielnika napięcia. Dodanie do obwodu diody led oraz podstawowa wiedza na temat stabilizatorów oraz dzielnika napięcia z zastosowaniem wzmacniacza operacyjnego w roli komparatora, dała nam przydatną funkcję, dzięki której wszystkie elementy urządzenia, jak i te które przyłączymy do niego, będą zasilane odpowiednią wartością napięcia. Podsumowując dzięki diodzie LED USB wiemy, czy nasze urządzenie przełączyło się na zasilanie zewnętrzne (zasilacz) tym samym przełączenie to nastąpiło w momencie, kiedy nasz zasilacz ma odpowiednią wartość napięcia potrzebną do zasilenia stabilizatora, aby ten na wyjściu dał napięcie 5V potrzebne z kolei do zasilania podzespołów urządzenia oraz elementów do niego podłączonych. W największym skrócie - jak widać zależność napięcia wejściowego "VIN" (zasilacz), do którego podłączony jest stabilizator, do napięcia wyjściowego "UR19", które steruje wzmacniaczem operacyjnym w roli komparatora, którego rolą jest przełączanie źródła zasilania jest uzależniona od wartości rezystancji dzielnika napięcia. Znając wartość napięcia potrzebnego do zasilenia stabilizatora oraz fakt, że przy tej wartości napięcie na wyjściu dzielnika ma wynieść 3,3V dobieramy odpowiednią wartość rezystorów dla tego dzielnika. Dodam jeszcze, że zrezygnowałem z połączeń pomiędzy dwoma procesorami na liniach MISO, MOSI, SCK za pośrednictwem diod, tak jak to miało w pierwszej odsłonie urządzenia. Okazało się, że w przypadku linii MISO i MOSI jest to zbędne i urządzenie działa bez problemu. Inaczej jest w przypadku lini SCK, ale tutaj zastosowałem rozwiązanie z poziomu hardware niż softu. Jako, że miałem zamówionych więcej układów analog. MUX/DEMUX, to wolałem użyć go do połączenia pinów SCK procesorów IC1 i IC2 niż bawić się w modyfikację kodu. Efekt działania w końcu jest ten sam tylko metoda prowadząca do tego efektu inna. Kolejną rzeczą choć może mniej istotną jest możliwość uśpienia programatora ISP. Jeżeli na przykład drażnią kogoś świecące się diody led. Co mi rzadko ale bywa, że przeszkadza, szczególnie jak nie używamy programatora ISP aktualnie go do wgrywania bootloderów. Oszczędzanie energii w tym przypadku nie jest specjalnie duże (około 50mA), choć z drugiej strony lepiej mieć mniej niż wcale, szczególnie gdzie port USB ma wydajność 500mA. Aby aktywować uśpienie programatora naciskamy najpierw switch S1-RESET, a następnie przez chwilę przytrzymujemy S6-IC1 SLEEP. Diody: PMODE, HBEAT, ERROR powinny na chwilę zamrugać, a następnie razem z diodami BTLDR i PROGR nie powinny się zapalić. Wtedy programator jest uśpiony. W zależności od potrzeb i upodobań danego użytkownika, przygotowałem kilka różnych wersji zmodyfikowanego sketcha ArduinoISP. Mamy do dyspozycji z przytrzymywaniem switcha S2-SELECT na czas wgrywania bootloadera, z trybem uśpienia jak i bez, oraz bez przytrzymywania switcha S2-SELECT bez funkcji uśpienia. W tej wersji urządzenia, zaraz po zmontowaniu potrzebujemy 1szt. procesora z wgranym już bootloaderem, który będzie pełnił rolę programatora ISP - IC1. Najlepiej niech to będzie ATmega8, ze względu na fakt, że jest to do dziś najtańszy procesor oraz ilość pamięci jaką posiada jest wystarczająca do wgrania skecza ArduinoISP. Sam skecz wykorzystuje około 60% pamięci tego procesora. W poprzedniej wersji urządzenia aby wgrać skecz ArdunoISP, trzeba było najpierw ten procesor umieścić w podstawce IC2. Teraz można umieścić go bezpośrednio w podstawce IC1, dzięki czemu nie ma konieczności przekładania go - niekiedy dość upierdliwa czynność. Po włożeniu procesora do podstawki IC1, zakładamy zworkę na piny IC1PROGR. Zapala na się dioda LED IC1-PROGR. Włączamy środowisko Arduino IDE. O tym jak powinno być ono skonfigurowane dla danej wersji procesora i jak wgrać skecz do procesora opisałem w artykule: https://forbot.pl/forum/topic/19357-mwuinouno-bootloader-programmer-i-arduino-w-jednym/ Aby ułatwić szukanie opisu wgrywania skeczy, szukamy podtytuł (pogrubiona czcionka) "Tak więc:" i w tekście poniżej-siódma linijka tekstu, od zdania zaczynającego się od słów "Dla przykładu". Oczywiście zamiast switcha S2 używamy switch S1 i podstawka IC2 używamy IC1. Tutaj jak widać procesor IC1 musimy zresetować ręcznie switchem S1. Na początku myślałem aby to było robione z układu FTDI232RQ, ale w sumie nikt nie będzie często przeprogramowywał tego procesora ewentualnie raz na jakiś czas o ile zajdzie taka potrzeba, a obwód to raz, że więcej elementów, niepotrzebny koszt i stopień komplikacji urządzenia. Chyba lepsze jest aktualne rozwiązanie. Łatwiej jest raz na jakiś czas przed programowaniem nacisnąć przycisk reset niż bawić się w przekładanie procesora z podstawki do podstawki. Gdybyśmy nie mieli zworki tylko przewód połączeniowy, to jeden koniec przewodu podłączamy do pinu VCC a drugi do pinu złącza IC1PROGR oznaczonego kropką. Oczywiście dla urządzenia z układem FTDI232RQ. w momencie wgrywania skecza do procesora IC2 przed wgraniem następuje jego RESET jak to ma miejsce w platformie UNO i jej klonach. W przypadku wersji wymagającej podłączenia zewnętrznego konwertera jest to uzależnione właśnie od posiadanego przez nas konwertera, czy może on resetować procesor przed wgraniem skecza. Zatem jak widać bazowałem przede wszystkim na rozwiązaniach niespotykanych w oryginalnej platformie, a niektórych klonach tej platformy. Mimo wszystko jest też kilka moich pomysłów oraz co najważniejsze i trudne to zaprojektować PCB tak aby te rozwiązania mogły być zintegrowane oraz samo urządzenie możliwie zbliżone do wymiarów oryginalnej platformy UNO. Jak widać wiązało się to z pewnymi zmianami takimi jak inny układ pinów gniazd procesora IC2. Nie podłączymy co prawda do nich shieldów czyli nakładek zwiększających możliwości naszego urządzenia, lecz dzięki bliskości tych złącz, łącząc układ na płytce stykowej powinny nam wystarczyć przewody jednakowej długości, aby wykorzystać wszystkie piny procesora. Wiedzmy też, że prócz shieldów możemy też kupić funkcjonalne moduły na mniejszych PCB niż zaprojektowane shieldy i przy pomocy przewodów połączeniowych podłączyć je do urządzenia. Tak więc pomimo niestandardowego układu wyprowadzeń, dalej jesteśmy w stanie zbudować potrzebne nam urządzenie. Niewielką rekompensatą tego rozwiązania jest umieszczenie dodatkowych złączy w wersji męskiej. Dzięki czemu możemy stosować przewody połączeniowe z końcówka męską lub żeńską. Jednak postanowiłem jeszcze oprócz samego urządzenia i korzystając z tego, że JLCPB ceny są dość atrakcyjne, zaprojektować trzy nakładki do swojego urządzenia. Pierwsza "adapter shield" to nakładka, która umożliwia przejście z niestandardowego układu pinów mojej wersji platformy uno, na układ pinów zgodny z oryginalną platformą, dzięki czemu można używać dedykowanych shieldów. Zauważyłem, że niektóre shieldy mają dodatkowo złącze ICSP w wersji żeńskiej do podłączenia, jako że nie posiadam takiego shielda, nie jestem w stanie określić czy będzie on działać w pełni po podłączeniu do adapter shield. Jeżeli nie to pozostaje tylko skorzystać modułu w postaci PCB podłączanego do pinów przewodami połączeniowymi. Tak jak mamy na przykład ethernet shield oraz moduł ethernet w postaci małej płytki PCB z wyprowadzeniami podłączanymi przewodami połączeniowymi. To co wyróżnia się najbardziej to otwory na PCB, umieszczone nad diodami USB i PWR MwuinoUNO, dzięki czemu nie ma potrzeby stosowania diod LED na nakładce oraz zawsze niewielka, ale oszczędność pobieranego prądu. Mamy również otwory pod przełącznik napięcia 3,3V/5V oraz na włącznik zasilania Co jest widoczne na zdjęciach poniżej. 1. Wszystkie nakładki - strona BOTTOM 2. Nakładka "adapter shield" strona TOP podłączona do MWuinoUNO Drugą nakładką jest sensor shield. Płytka z pinami do podłączeń, sensorów i różnych modułów PCB, pozwalająca tworzyć nam bardziej zaawansowane układy. To co wyróżnia się najbardziej to otwory na PCB, umieszczone nad diodami USB i PWR MwuinoUNO, dzięki czemu nie ma potrzeby stosowania diod LED na nakładce oraz zawsze niewielka, ale oszczędność pobieranego prądu. Shield ten od większości dostępnych dla oryginalnej platformy UNO, posiada filtrację zasilania składającą się z kondensatorów ceramicznych i elektrolitycznych. Dwie pary kondensatorów. W każdej parze kondensator ceramiczny z kondensatorem elektrolitycznym umieszczone w odpowiedniej odległości aby zapewnić odpowiednią filtrację zasilania modułów, czujników itp. Dzięki temu mamy pewność, że nasz projekt będzie działać niezawodnie i stabilnie. Mamy również otwory pod przełącznik napięcia 3,3V/5V oraz na włącznik zasilania Co jest widoczne na zdjęciach poniżej. Nakładka "sensor shield" strona TOP podłączona do MWuinoUNO Trzecią nakładką jest gniazdo procesora, a dokładniej podstawka testowa ZIF. Umożliwia nam ona szybką wymianę procesora, za pośrednictwem dźwigni dociskającej jego piny do styków podstawki. Domyślnie można na PCB dla podstawki zamontować rezonator kwarcowy z kondensatorami i używać jej kiedy mamy do zaprogramowania dużą ilość procesorów. Możemy także na niej zamontować dodatkowo kondensatory filtrujące zasilanie, dławik, rezystor oraz switch do pinu reset. Mamy tym samym spełnione minimalne podłączenie procesora i możemy podpiąć przewodami połączeniowymi jakiś prosty moduł celem sprawdzenia jego działania z procesorem. Możemy też do jego gniazd włożyć listwę kołkową męską i wystające piny listwy wpiąć na płytkę stykową, nie podłączając elementów wymaganych do samej pracy procesora a podłączać tylko te którymi nasz procesor ma sterować lub te, które mają dostarczać sygnały do niego. Nakładka IC2 socket adapter strona TOP podłączona do MWuinoUNO Na zakończenie dodam, że jest to już ostatni artykuł z serii o Arduino UNO, gdzie starałem przedstawić się zalety jak i swoją wizję tej platformy. Następne moje projekty będą się tyczyć urządzeń zbudowanych a oparciu o platformę UNO. Mam nadzieję, że wszystkie informację, które do tej pory przedstawiłem okazały się pomocne, szczególnie dla osób początkujących, które zdecydowały się na wybór Arduino UNO jako platformy, z którą zaczynają naukę programowania i budowania urządzeń. Plik do pobrania: MWuinoUNO.zip W pliku tym znajdziemy dokumentację oraz wszystkie niezbędne pliki, gdybyśmy chcieli wykonać urządzenie, w tym skecze ArduinoISP do zaprogramowania IC1, a nawet sterownik dla układu FTDI232RQ dla WIN10.
  3. Witam wszystkich!!! Opisane tutaj metody są przeznaczone dla posiadaczy Arduino UNO lub jego klonów, z procesorem THT 28 pin!!! Poprzednio opisywałem jak z pomocą Bootloader programmer i Arduino Uno wgrywać bootloadery do procesorów ATmega8/168/328. Tym razem omówię jak wgrywać sketche czyli programy do ATmeg, tak abyśmy nie musieli co chwilę przekładać procesora z Arduino UNO do zaprojektowanego przez nas urządzenia. Pewne ułatwienie w tej kwestii możemy sobie zafundować już na etapie projektowania naszej płytki PCB. Jest to też przydatne zwłaszcza kiedy przewidujemy rozbudowanie lub modyfikację programu w przyszłości. Przyda się to głównie początkującym osobom w programowaniu, gdzie będzie trzeba często poprawiać kod aby nasz program działał zgodnie z założeniami. Na poniższych zdjęciach widać fragment schematu oraz zdjęcie płytki PCB jednego z moich kilku urządzeń, które przedstawia dodanie switcha (S1) na linii RESET procesora oraz złączą do którego możemy podłączyć Arduino UNO lub Konwerter USB/TTL/UART/RS232. Głównie będą to porady dla osób zaczynających naukę programowania w środowisku Arduino IDE. Wiemy, że napisanie idealnego programu, który od razu będzie nam działał nie jest łatwe . Oczywiście nie mówię tu o najprostszych rzeczach takich jak na przykład sterowaniem diodami led, ale już bardziej złożonych urządzeniach, które realizują już dość konkretne funkcje. Jak widać na poniższym schemacie i zdjęciu jednego z moich projektów, wykorzystuje nawet piny, odpowiedzialne za programowanie procesora. Warto wiedzieć, że rola pinów RX, TX nie ogranicza się tylko do przesyłania nimi programu. Można je programować także jako we/wy i ustawić stan H/L. Dlatego wiedząc, że w przyszłości mogą mi być przydatne do przeprogramowania procesora, elementy które są z nich sterowane są podłączone za pośrednictwem zworek, tak aby elementy te nie obciążały pinów RX, TX procesora do których są wysyłane sygnały z Arduino lub konwertera USB/TTL/UART/RS232, aby tym samym nie zakłócać przebiegu wgrywania programu do procesora. Oczywiście niektórzy zwrócą uwagę, że jeżeli zastosowałem switche, które są normalnie rozwarte to po co stosować zwory w obwodzie, który ma już przerwę? Jak zauważymy obok switchy znajdują się kondensatory ceramiczne, które służą do eliminacji drgań styków switchy. W schemacie tego projektu, który przedstawiłem, switche są używane przez większą część pracy, dlatego generalnie w takich przypadkach do eliminacji drgań styków stosuje eliminację zarówno z poziomu softu jak i hardware'u - kondensatory. Tutaj problem przy wgrywaniu softu, stanowić będą kondensatory eliminujące drgania styków switchy, dlatego na czas wgrywania softu muszą być odłączone od pinów procesora Rx, Tx. 1. Z wykorzystaniem Arduino UNO z procesorem THT 28 pin Aby skorzystać z tego sposobu wgrywania programu, musimy z Arduino wyjąć właściwy procesor z jego podstawki. Następnie za pomocą przewodów połączeniowych (można skorzystać z przewodów do płytek stykowych), łączymy odpowiednio zasilanie, reset oraz linie komunikacyjne: z Arduino RX<-0 do Rx naszego procesora oraz z Arduino TX->1 do Tx naszego procesora, który zamierzamy programować. Kiedy wszystko mamy już podłączone postępujemy dokładnie tak samo jak byśmy wgrywali normalnie program do Arduino z procesorem w podstawce. Ważne: W przypadku Arduino nie ma możliwości wgrania programu do więcej niż jednego procesora w tym samym czasie. Dlatego istotne jest wyciągnięcie oryginalnego procesora z podstawki w Arduino, aby móc bez przeszkód zaprogramować procesor, który znajduje się w zaprojektowanym przez nas urządzeniu. Jak widać praktycznie wyeliminowaliśmy przekładanie procesora z Arduino do naszego projektu, ograniczyliśmy się jedynie do wyjęcia samego procesora z Arduino na czas programowania procesora w naszym projekcie. Dzięki temu oszczędzamy czas i nerwy oraz nie ryzykujemy uszkodzeniem pinów procesora, ukruszeniem jego obudowy a tym samym wyrobieniem pinów samego gniazda podstawki. Przydatne szczególnie gdy jesteśmy początkujący i uczymy się programowania - szukanie, eliminowanie błędów lub zmiana/modyfikowanie programu. Przewody zasilające: czerwony (+5V), czarny (GND), Komunikacja Rx, TX (pomarańczowy), RESET (żółty) 2. Z wykorzystaniem Konwertera USB/TTL/UART/RS232 Konwerter zbudowany z popularnym układem PL2303HX współpracuje ze środowiskiem Arduino UNO umożliwiając nam wgrywanie sketchy do procesorów ATmega. Konwertery oparte o układ PL2303HX charakteryzuje bardzo niska cena i duża dostępność. Jeżeli chodzi o podłączenie komunikacji konwertera jest to realizowane odwrotnie niż jak to ma miejsce w pkt.1, czyli: Pin RX konwertera podłączamy do pinu TX procesora. Następnie pin TX konwertera podłączmy do pinu RX procesora. Zasilanie programowanego procesora możemy podłączyć z konwertera lub zasilacza. Jeżeli procesor który zamierzamy programować ma wgrany tylko bootloader i wcześniej nie był programowany za pomocą Arduino, możemy śmiało przystąpić do wgrania programu do procesora. W przeciwnym razie jeżeli do procesora był już wgrany program poprzez Arduino, może a raczej na pewno zdarzy się sytuacja, że program, który będziemy chcieli wgrać za pośrednictwem konwertera nie wgra nam się do procesora. Jedynym wtedy wyjściem jest ponowne wgranie bootloadera do procesora i ponowna próba wgrania programu poprzez konwerter. Kolejną ważną rzeczą przy takim sposobie programowania procesora jest moment w którym musimy wcisnąć przycisk reset programowanego procesora. Teraz napiszę jak to zrobić aby ta czynność przebiegła dość sprawnie. Klikamy "Wgraj" i patrzymy na napis na zielonym pasku nad czarnym okienkiem w którym pojawiają się informacje. Jeżeli jest napis "kompilowanie szkicu..." i obok jest pasek postępu, nie wciskamy przycisku RESET. Kiedy pasek postępu dobiegnie końca i pojawi się komunikat "Wgrywanie" szybko wciskamy i puszczamy przycisk RESET. Dlatego przed wgraniem dobrze jest mieć palec blisko tego przycisku i obserwować komunikaty, które powyżej napisałem. Zamiana oryginalnego procesora ATmega 328 w arduino UNO na inny? Arduino UNO lub klon z procesorem THT 28pin Wiemy, że Arduino UNO nie ma na stałe zamontowanej ATmegi, tylko jest ona umieszczona w podstawce co jest dobrym rozwiązaniem w przypadku gdy procesor ten ulegnie uszkodzeniu. Obecnie standardowo w Arduino UNO montuje się procesor ATmega328. Nie znaczy to jednak, że tylko taki procesor może obsługiwać Arduino UNO. Procesory ATmega 8/168 mają identyczny układ pinów podobnie jak ATmega328 i tę samą obudowę. Możemy śmiało je stosować zamiennie w miejsce ATmega328. I teraz przejdę do sedna całej sprawy. Warto wspomnieć że pierwsze wersje Arduino UNO były wyposażone w procesor ATmega8. W przypadku kiedy w Arduino UNO zamienimy procesor ze standardowego (ATmega 328) na inny taki jak ATmega8 lub ATmega 168 musimy zmienić dwa ustawienia, które opiszę poniżej. Standardowe ustawienie "Arduino UNO" w polu "Płytka" jest zarezerwowane wyłącznie dla Arduino UNO i jego klonów sprzedawanych z procesorem ATmega328. W przypadku kiedy nasza płytka Arduino UNO ma inną wersję procesora, zmieniamy to ustawienie. Dla Arduino UNO z procesorem ATmega8/168 w interfejsie programu Arduino IDE klikamy "Narzędzia"/"Płytka" i zaznaczamy "Arduino NG or older" zamiast "Arduino Uno". Ponownie klikamy na "Narzędzia" najeżdżamy na pole "Procesor" i z menu rozwijanego wybieramy ten, który aktualnie znajduje się w naszym urządzeniu. Po zmianach wyżej opisanych parametrów programu, możemy wgrywać skecze do procesora. Oczywiście najpierw procesor musi mieć wgrany bootloader dla danej wersji procesora. Jak wgrywać bootloader do ATmeg opisałem wcześniej w Bootloader programmer for UNO R3 - rev.2. Wgrywanie bootloader-ów do ATmeg
  4. Słowem wstępu, projekt ten został wykonany w czasie pandemicznego wymogu pozostania w domu, kiedy to zbliżał się koniec semestru na mojej uczelni. Był to mój projekt zaliczeniowy z przedmiotu o wdzięcznej nazwie: "Układy mikroprocesorowe". Prowadzący udostępnił listę urządzeń, z której każdy może wybrać jedno. Po dokonaniu wyboru należało wykonać je w warunkach domowych do końca wówczas trwającego miesiąca. Jako że był to dość niewygodny moment do wychodzenia po części do sklepu, a na zamówienie ich i czekanie nie chciałem marnować czasu, zrobiłem szybki przegląd swojego warsztatu. Wśród przewalających się podzespołów i elementów udało mi się dostrzec czujnik gazów MQ-2, który kiedyś kupiłem w promocji wraz z czujnikami alkoholu MQ-3. Jako że na liście widniał czujnik gazów, niewiele myśląc zebrałem to co miałem i przystąpiłem do pracy. Efektem tej pracy jest właśnie... DETEKTOR GAZÓW W POWIETRZU ATMOSFERYCZNYM OPARTY NA CZUJNIKU MQ-2 Detektor gazów przystosowano do pomiaru stężeń czterech gazów: LPG, dymu, CO oraz H2. Urządzenie zaprojektowano tak, by miało kompaktową obudowę i prosty, intuicyjny interfejs użytkownika. Wszystkie elementy tego interfejsu opisano na rysunku 1. Gaz którego odczyt ma zostać dokonany, zostaje wybrany za pomocą pokrętła głównego. Zgodnie z jego nastawą detektor będzie przeliczał odczyty czujnika pod wybrany gaz i wyświetli wynik na skali ledowej, znajdującej się po lewej stronie urządzenia. Wartości zmierzonych stężeń przelicza się na jednostkę PPM (Part Per Milion). W zależności od wysokości stężenia, skala LED pokazuje nie tylko zakres, ale także za pomocą odpowiedniej barwy pokazuje czy dany gaz znajduje się w strefie małego, umiarkowanego czy też dużego niebezpieczeństwa. rysunek 1. opis elementów detektora Urządzenie nie jest skomplikowane zarówno w swojej budowie, ale także w działaniu. Cały proces zachodzący pod obudową wykonaną z PLA opisuje schemat algorytmu na rysunku 2. rysunek 2. schemat algorytmu detektora Czytając schemat elektryczny umieszczony na rysunku 3., od lewej strony widzimy źródło zasilania, którym są akumulatory li-ion o napięciu 4.2 [V] każdy. Układ może być zamiast z akumulatorów zasilany z zasilacza o napięciu od 9 do 12 [V], o wydajności minimum 1.5 [A]. Po załączeniu układu przyciskiem “start” zasilanie prowadzone jest na dwa stabilizatory liniowe LM7805. Jeden z nich zasila mikrokontroler oraz interfejs urządzenia, a drugi odpowiada za zasilenie czujnika MQ-2. Zastosowanie dwóch stabilizatorów wiąże się z zapotrzebowaniem czujnika na prąd. Aby nie wprowadzać zakłóceń w działaniu mikrokontrolera, czujnik zasilany jest osobno a sam stabilizator jest chłodzony dodatkowo radiatorem. Sercem urządzenia jest mikrokontroler Atmega328PU. Zastosowano go ze względu na odpowiednio dużą liczbę dostępnych portów oraz wbudowany przetwornik analogowo- cyfrowy. Mikrokontroler przyjmuje sygnał analogowy z czujnika gazów na pin A1, analizuje go, sprawdza nastawę przełącznika “S1” po przez weryfikację stanów portów A2-A5, a na koniec wyświetla wynik za pomocą diod LED podpiętych pod porty PD0-PD7 oraz PB0. Oprócz tego, układ podłączony jest do 10-cio pinowego gniazda CANDA, które umożliwia programowanie mikrokontrolera bez konieczności rozbierania urządzenia i wyjmowania Atmegi328PU. rysunek 3. schemat elektryczny detektora gazów Płytę główną detektora zaprojektowano przy pomocy programu Cadsoft Eagle. Wykonany w nim wzór został przeniesiony na miedziany laminat za pomocą metody termicznej, a następnie wytrawiony nadsiarczanem sodowym. rysunek 4. Po lewej projekt PCB, po prawej zmontowana płytka Obudowa została zaprojektowana w programie Fusion360. Rzut na model złożony w programie cadowskim ukazano na rysunku 5. Na podstawie utworzonego modelu wykonano wydruki 3D, które po oszlifowaniu oraz wyczyszczeniu skompletowały projekt i umożliwiły zabudowę elektroniki w kompaktowej obudowie. rysunek 5. model obudowy w Fusion360 Jednym z najważniejszych etapów konstruowania detektora było wyprowadzenie liniowej zależności na stężenie gazu. Nota katalogowa czujnika przedstawia charakterystykę PPM w skali logarytmicznej. Wyprowadzenie wzoru było konieczne aby umożliwić mikrokontrolerowi wykonywanie obliczeń: a) wyprowadzenie zależności ogólnej: a = (Y2 – Y1) : (X2 – X1) Y - Y1 = a*(X- X1) X= ((Y – Y1) : a) + X1 logX= ((log(Y – Y1)) : a) + X1 X = 10^ (((log(Y – Y1)) : a) + X1) gdzie: X= PPM, Y= Rs: Ro PPM = 10^ (((log((Rs: Ro) – Y1)) : a) + X1) b) przykład aplikacji wzoru dla odczytu stężenia gazu LPG w powietrzu: X1 = 200, X2 = 10000, Y2 = 1,6, Y1 = 0,26 X1 = log200 = 2,3 X2 = log10000 = 4 Y1 = log1,6 = 0,2 Y2 = log0,26 = -0,58 PPM = 10^ (((log((Rs: Ro) – 0,2)) : (-0,58)) + 2,3) rysunek 6. po lewej charakterystyka PPM= f(Rs/Ro) z datasheet MQ-2, po prawej charakterystyka PPM=f(Uo) wykonana na bazie obliczeń w programie Graph 4.4.2 Film z prezentacji działania urządzenia: Na koniec udostępniam jeszcze kod napisany w środowisku Atmel Studio: #define F_CPU 16000000 #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> int main(void) { //Deklaracja portów wyjściowych DDRD = (1 << PORTD0) | (1 << PORTD1) | (1 << PORTD2) | (1 << PORTD3) | (1 << PORTD4) | (1 << PORTD5) | (1 << PORTD6) | (1 << PORTD7); DDRB = (1 << PORTB0) | (1 << PORTB1); //Deklaracja portów wejściowych DDRC = 0x00; //Załączenie rezystorów podciągających do portów A2- A5 PORTC = 0x3C; //Skala ledowa zaczyna się ładować, aby po dotarciu do wartości maksymalnej uruchamić krótki, podwójny brzęk buzzera informujący o rozpoczęciu kalibracji czujnika PORTB |= (1<<PORTB0); _delay_ms(300); PORTD |= (1<<PORTD7); _delay_ms(300); PORTD |= (1<<PORTD6); _delay_ms(300); PORTD |= (1<<PORTD5); _delay_ms(300); PORTD |= (1<<PORTD4); _delay_ms(300); PORTD |= (1<<PORTD3); _delay_ms(300); PORTD |= (1<<PORTD2); _delay_ms(300); PORTD |= (1<<PORTD1); _delay_ms(300); PORTD |= (1<<PORTD0); _delay_ms(300); PORTB |= (1<<PORTB1); _delay_ms(300); PORTB &= ~(1<<PORTB1); _delay_ms(300); PORTB |= (1<<PORTB1); _delay_ms(300); PORTB &= ~(1<<PORTB1); _delay_ms(100); //Ustawienia rejestrów do obsługi przetwornika analogowo-cyfrowego: ADMUX = (1 << REFS0) | ( 1 << MUX0 ); ADCSRA = (1 << ADEN) | (1 << ADIE) | (1 << ADPS0) | (1 << ADPS1) | (1 << ADPS2); DIDR0 = (1 << ADC0D); ADCSRA |= (1 << ADSC); TCCR0B = (1 << CS00) | (1 << CS02); //Deklaracja mierzonej wartości napięcia: double pomiar_V; //Parametry krzywej gazu LPG: double LPG_X1 = 2.3; double LPG_Y1 = 0.2; double LPG_a = 0.46; //Parametry krzywej dymu: double SMOKE_X1 = 2.3; double SMOKE_Y1 = 0.56; double SMOKE_a = 0.5; //Parametry krzywej tlenku węgla: double CO_X1 = 2.3; double CO_Y1 = 0.7; double CO_a = 0.31; //Parametry krzywej wodoru: double H2_X1 = 2.3; double H2_Y1 = 0.32; double H2_a = 0.45; //Parametry kalibracji czujnika: double ilosc_probek_kalibracyjnych = 60; double czas_probkowania_kalibracyjnego = 500; double rezystancja_Robc = 5.6; double wsp_czystosci_powietrza = 9.83; //Parametry próbkowania napięcia: double ilosc_probek_pomiarowych = 60; double czas_probkowania_pomiarowego = 5; double Rs_do_Ro = 0; //Zmienna zliczania: int i = 0; //Zmienna zliczająca- suma: int suma = 0; //Deklaracja Ro: double Ro = 0; //***********************kalibracja czujnika**************************: //W pętli "for" odczytywane jest napięcie z czujnika gazu. Czujnik jest //wystawiony na czyste powietrze. Kalibracja polega na wyznaczeniu rezy- //stanchi Ro dla czystego powietrza. Po kazdej pętli odczytane napięcie //jest sumowane. Suma tych napięć po zakończeniu pętli jest dzielona //przez liczbę próbek, otrzymując średnią wartość rezystancji. Wartość ta //podzielona przez współczynnik czystego powietrza (9.83) daje rezysta- //ncje Ro, na której będą oparte następne obliczenia. Obliczenia te wy- //konywane są raz. for (i=0;i<ilosc_probek_kalibracyjnych;i++) { pomiar_V = ADC; ADCSRA |= (1 << ADSC); Ro = ((1024-pomiar_V)/pomiar_V)*rezystancja_Robc; _delay_ms(czas_probkowania_kalibracyjnego); suma = suma+Ro; } Ro = suma/ilosc_probek_kalibracyjnych; Ro = Ro/wsp_czystosci_powietrza; //Opadanie wskazania ledowego i podwójny sygnał z buzzera informuje użytkownika o zakończeniu klibracji urządzenia PORTD &= ~(1<<PORTD0); _delay_ms(300); PORTD &= ~(1<<PORTD1); _delay_ms(300); PORTD &= ~(1<<PORTD2); _delay_ms(300); PORTD &= ~(1<<PORTD3); _delay_ms(300); PORTD &= ~(1<<PORTD4); _delay_ms(300); PORTD &= ~(1<<PORTD5); _delay_ms(300); PORTD &= ~(1<<PORTD6); _delay_ms(300); PORTD &= ~(1<<PORTD7); _delay_ms(300); PORTB &= ~(1<<PORTB0); _delay_ms(300); PORTB |= (1<<PORTB1); _delay_ms(300); PORTB &= ~(1<<PORTB1); _delay_ms(300); PORTB |= (1<<PORTB1); _delay_ms(300); PORTB &= ~(1<<PORTB1); _delay_ms(100); while(1) { //Zmienna zliczania: int j = 0; //Zmienna zliczająca- razem: int razem = 0; //Deklaracja liczonej rezystancji czujnika: double Rs = 0; //************************pomiar z czujnika************************: //W pętli "for" wyliczana jest wartość rezystancji na podstawie na- //pięcia z czujnika gazu. Obliczane rezystancje są sumowane. Po za- //kończeniu pętli, suma rezystancji jest dzielona przez liczbę pró- //bek i otrzymujemy przybliżony odczyt rezystancji czujnika. for (j=0;j<ilosc_probek_pomiarowych;j++) { pomiar_V = ADC; ADCSRA |= (1 << ADSC); Rs = ((1024-pomiar_V)/pomiar_V)*rezystancja_Robc; razem = razem + Rs; _delay_ms(czas_probkowania_pomiarowego); } Rs = razem/ilosc_probek_pomiarowych; //Znając Rs oraz Ro obliczamy ich stosunek i podstawiamy do wzoru //na zawartość cząstek LPG w powietrzu. Rs_do_Ro = Rs/Ro; _delay_ms(10); //Zawartość PPM gazu LPG w powietrzu: if (!(PINC & 0b00100000)) { double PPM = 0; PPM = pow(10,((log(Rs_do_Ro - LPG_Y1)/((-1)*LPG_a)) + LPG_X1)); _delay_ms(10); if ((PPM >= 0)&&(PPM <= 500)) { PORTB = 0b00000001; PORTD = 0b00000000; } if ((PPM >= 500)&&(PPM <= 1000)) { PORTB = 0b00000001; PORTD = 0b10000000; } if ((PPM >= 1000)&&(PPM <=2000)) { PORTB = 0b00000001; PORTD = 0b11000000; } if ((PPM >= 2000)&&(PPM <=5000)) { PORTB = 0b00000001; PORTD = 0b11100000; } if ((PPM >= 5000)&&(PPM <=7500)) { PORTB = 0b00000001; PORTD = 0b11110000; } if ((PPM >= 7500)&&(PPM <=10000)) { PORTB = 0b00000001; PORTD = 0b11111000; } if ((PPM >= 10000)&&(PPM <=15000)) { PORTB = 0b00000001; PORTD = 0b11111100; } if ((PPM >= 15000)&&(PPM <=20000)) { PORTB = 0b00000001; PORTD = 0b11111110; } if (PPM >= 20000) { PORTB = 0b00000001; PORTD = 0b11111111; } } //Zawartość PPM dymu w powietrzu: if (!(PINC & 0b00010000)) { double PPM = 0; PPM = pow(10,((log(Rs_do_Ro - SMOKE_Y1)/((-1)*SMOKE_a)) + SMOKE_X1)); _delay_ms(10); if ((PPM >= 0)&&(PPM <= 500)) { PORTB = 0b00000001; PORTD = 0b00000000; } if ((PPM >= 500)&&(PPM <= 1000)) { PORTB = 0b00000001; PORTD = 0b10000000; } if ((PPM >= 1000)&&(PPM <=2000)) { PORTB = 0b00000001; PORTD = 0b11000000; } if ((PPM >= 2000)&&(PPM <=5000)) { PORTB = 0b00000001; PORTD = 0b11100000; } if ((PPM >= 5000)&&(PPM <=7500)) { PORTB = 0b00000001; PORTD = 0b11110000; } if ((PPM >= 7500)&&(PPM <=10000)) { PORTB = 0b00000001; PORTD = 0b11111000; } if ((PPM >= 10000)&&(PPM <=15000)) { PORTB = 0b00000001; PORTD = 0b11111100; } if ((PPM >= 15000)&&(PPM <=20000)) { PORTB = 0b00000001; PORTD = 0b11111110; } if (PPM >= 20000) { PORTB = 0b00000001; PORTD = 0b11111111; } } //Zawartość PPM CO w powietrzu: if (!(PINC & 0b00001000)) { double PPM = 0; PPM = pow(10,((log(Rs_do_Ro - CO_Y1)/((-1)*CO_a)) + CO_X1)); _delay_ms(10); if ((PPM >= 0)&&(PPM <= 500)) { PORTB = 0b00000001; PORTD = 0b00000000; } if ((PPM >= 500)&&(PPM <= 1000)) { PORTB = 0b00000001; PORTD = 0b10000000; } if ((PPM >= 1000)&&(PPM <=2000)) { PORTB = 0b00000001; PORTD = 0b11000000; } if ((PPM >= 2000)&&(PPM <=5000)) { PORTB = 0b00000001; PORTD = 0b11100000; } if ((PPM >= 5000)&&(PPM <=7500)) { PORTB = 0b00000001; PORTD = 0b11110000; } if ((PPM >= 7500)&&(PPM <=10000)) { PORTB = 0b00000001; PORTD = 0b11111000; } if ((PPM >= 10000)&&(PPM <=15000)) { PORTB = 0b00000001; PORTD = 0b11111100; } if ((PPM >= 15000)&&(PPM <=20000)) { PORTB = 0b00000001; PORTD = 0b11111110; } if (PPM >= 20000) { PORTB = 0b00000001; PORTD = 0b11111111; } } //Zawartość PPM H2 w powietrzu: if (!(PINC & 0b00100000)) { double PPM = 0; PPM = pow(10,((log(Rs_do_Ro - H2_Y1)/((-1)*H2_a)) + H2_X1)); _delay_ms(10); if ((PPM >= 0)&&(PPM <= 500)) { PORTB = 0b00000001; PORTD = 0b00000000; } if ((PPM >= 500)&&(PPM <= 1000)) { PORTB = 0b00000001; PORTD = 0b10000000; } if ((PPM >= 1000)&&(PPM <=2000)) { PORTB = 0b00000001; PORTD = 0b11000000; } if ((PPM >= 2000)&&(PPM <=5000)) { PORTB = 0b00000001; PORTD = 0b11100000; } if ((PPM >= 5000)&&(PPM <=7500)) { PORTB = 0b00000001; PORTD = 0b11110000; } if ((PPM >= 7500)&&(PPM <=10000)) { PORTB = 0b00000001; PORTD = 0b11111000; } if ((PPM >= 10000)&&(PPM <=15000)) { PORTB = 0b00000001; PORTD = 0b11111100; } if ((PPM >= 15000)&&(PPM <=20000)) { PORTB = 0b00000001; PORTD = 0b11111110; } if (PPM >= 20000) { PORTB = 0b00000001; PORTD = 0b11111111; } } //Po dotarciu do końca komendy, pętla rozpoczyna się od począ- //tku mierząc jeszcze raz napięcie na czujniku. _delay_ms(100); } return(0); } Jeżeli dotrwaliście aż do tego momentu, to bardzo dziękuje wam za uwagę. Mam nadzieję, że ten projekt będzie pomocny dla każdej osoby rozpoczynającej swoje przygody z czujnikiem gazu MQ-2. Osobiście jestem zadowolony z rezultatu jaki osiągnąłem tym projektem. Mam jednak do niego sporo zastrzeżeń i kiedy będę miał możliwość, planuję do niego wrócić wprowadzając następujące zmiany: Skala ledowa zostanie zastąpiona wyświetlaczem 2x16 aby widzieć dokładny odczyt PPM wybranego gazu. Urządzenie zostanie wyposażone we własne źródło zasilania. Atmega328 będzie zastąpiona przez mikrokontroler atmega8. Obudowa zostanie lepiej uszczelniona. Czujnik zostanie wyprowadzony na długim przewodzie jako sonda, którą można umieścić w dowolnym miejscu. W programie napisane zostanie proste menu, dzięki czemu będzie można wygodnie wybrać gaz, przeprowadzić kalibrację (aby wyeliminować czekanie po uruchomieniu i pamiętać stałą wartość czujnika) oraz opcjonalnie zmienić współczynnik czystego powietrza. Przydatny link: Wyjaśnienie działania czujnika MQ-2 https://sandboxelectronics.com/?p=165
  5. Ten projekt powstał już jakiś czas temu, gdzieś w połowie marca . Jednak ostatnio go nieco ulepszyłem i poprawiłem. Dlatego przyszedłem się pochwalić . Pierwsza wersja była zrobiona na Arduino Nano i mogłem sterować jednym paskiem led 12V za pomocą pilota na podczerwień i przekaźnika (tylko stan wysoki, stan niski) . Całość była zasilana z akumulatora 12V 7,2AH co było złym rozwiązaniem bo starczał tylko na tydzień. Nie zadowalał mnie taki sterownik, więc gdy tylko podszkoliłem się w wiedzy o tranzystorach powstała druga wersja w której mogłem już sterować PWM (a właściwie to dolutowałem tylko tranzystor i lekko przerobiłem program). Tamta wersja była nawet dobra ale jednak wykorzystywanie całego Arduino na taki projekt jest trochę bez sensu, no i jeszcze ten nieszczęsny akumulator... Zachowało się nawet jedno zdjęcie z tamtego czasu: Ale w tym artykule skupię się na 3 i prawdopodobnie nie ostatniej wersji tego sterownika. Płytka prezentuje się następująco: W tej wersji mamy do dyspozycji 2 kanały PWM na 12V każdy + przekaźnik (stan wysoki / stan niski) ale za to może włączać/wyłączać urządzenia zasilane napięciem do 250VAC czyli np. lampka biurkowa. Elementy na płytce co robią, po co są: Mikrokontroler ATmega328P - jest "mózgiem" całego sterownika, odbiera dane z odbiornika IR, steruje tranzystorami i przekaźnikiem. Zaprogramowałem Arduino Uno i najprościej w świecie wyjąłem ATmegę i wsadziłem na płytkę. Stabilizator LM317T - razem z rezystorami i kondensatorami (prawy górny róg płytki) tworzy obwód zasilający mikrokontroler napięciem 5.2V - akurat tak wyszło z dostępnych mi rezystorów. Tranzystory IRF540N - podnoszą napięcie z 5V do 12V i przy okazji przepuszczają sygnał PWM . kondensatory (obok tranzystorów) - filtrują napięcie z tranzystorów. Czyli co, to już nie jest PWM ? No nie, to już nie jest PWM. Ale mi w tym projekcie nie chodzi konkretnie o PWM, a o możliwość regulacji jasności ledów więc PWM może być "stłumiony" przez kondensatory. Dodałem je, ponieważ bez nich w poprzedniej wersji ledy lubiły sobie czasem mrugać, lekko przygasać .Było to trochę irytujące. przekaźnik - służy do zamykania obwodu np. gdy podepnę lampkę biurkową 230VAC to jego zadaniem jest tylko domknąć obwód gdy nacisnę przycisk na pilocie. odbiornik podczerwieni TSOP2236 - nie ma go już na płytce, ale są dla niego przygotowane goldpiny w prawym dolnym rogu . Służy on jak sama nazwa mówi do odbierania promieni podczerwonych, które wysyłam ze zwykłego pilota od telewizora po naciśnięciu jakiegoś przycisku. Zasilanie: Pewnej słonecznej niedzieli wybrałem się na targ, tam znalazłem zasilacz który idealnie pasuje do mojego projektu. Vout - 12VDC, 3.3A . Pochwalę się że udało mi się utargować całe 5 zł 😎. Możliwości sterownika : 3 kanały w tym 2 z możliwością regulacji jasności na 12VDC i jeden do 250VAC ale z zewnętrznego zasilania i brakiem możliwości regulowania jasności. jest jeszcze miejsce na płytce żeby dolutować kolejny kanał ale i tak by mi się nie przydał. Teoretycznie maksymalna moc na jeden kanał to około 500W, ale w praktyce nigdy nie kupie takiego potężnego zasilacza więc aktualnie maksymalna moc na kanał to około 36W - jeśli używam jednego na raz i 18W - jeśli używam 2 kanały na raz, ale można też z jednego kanału pobierać np. 30W a z drugiego 6 itp. . Na razie podpiąłem tylko 2-metrowy pasek led który pobiera 28.8W na maksymalnej jasności. Podsumowując, maksymalna moc zależy głównie od zasilacza. Jako obudowa służy mi kartonowe pudełko: Co poprawię i co chciałbym poprawić w kolejnej wersji? Na pewno znajdę jakiś inny sposób aby doprowadzić zasilanie do mikrokontrolera. Ten stabilizator trochę się grzeje, a nawet trochę za bardzo. Co za tym idzie? Głównie chodzi mi o straty energii. Może uda mi się skonstruować jakąś przetwornicę. Jeśli chodzi o grzejące się elementy to jest jeszcze jedna rzecz - mikrokontroler który się lekko grzeje. Nie jakoś bardzo, tylko robi się lekko ciepły. Wie ktoś może jaka jest tego przyczyna? Chodzi tu o podwyższone napięcie ?(5.20V) Czy może jest to normalne? Jeśli ktoś wie to prosiłbym o odpowiedź. Co chciałbym poprawić? Z okazji że jest to do tej pory jeden z najpraktyczniejszych i najprzydatniejszych moich projektów, chciałbym poprawić obudowę, która jak w każdym moim projekcie jest z kartonu . Są dwa problemy - nie mam w ogóle pomysłu ani materiałów i żadnego sprzętu. Na koniec pozdrawiam czytelników i życzę miłego dnia 🙂.
  6. Cześć. W ramach projektu wymyśliłem sobie układ do sterowania wewnętrzną roletą w pokoju. Całość ma być kontrolowana przez ATmega328, ruch ma się odbywać między wyłącznikami krańcowymi, sterowanie pilotem / telefonem. Niestety kompletnie nie znam się na silnikach i nie wiem na ile mocny napęd jest mi potrzebny. Czy mógłbym prosić o podanie mi jakiegoś wzoru / skrótu myślowego, który pomoże dobrać mi moc silnika? Chciałbym użyć najprostszego silnika DC i umiejscowić go na dole łańcuszka poruszającego całością . Roleta ma wymiary 80x150 cm i waży ~1 kg.
  7. Witam, na wstępie przepraszam, jeśli podobny temat już był, sam jednak nie mogłem znaleźć tego o co mi chodzi. Mój problem wygląda tak. Podczas jednego z kursów Arduino na Forbocie prawdopodobnie zepsułem swój mikroprocesor. Środowisko pokazuje, że kod został wgrany bez problemów lecz nie wykonuje się on, a na płytce prototypowej miga dioda z podpisem "L". Na szczęście mam drugą atmegę328, lecz kupiłem wersję bez bootloadera ponieważ była tańsza, a sam chciałem wypalić loader przy pomocy Arduino. Teraz skoro atmega nie działa zastanawiam się nad kilkoma opcjami. 1. Kupno nowej atmegi z bootloaderem i wypalenie bootloadera na drugiej. 2. Kupienie programatora. W przypadku programatora mam kilka pytań. Czy przy pomocy programatora da się w jakiś sposób wypalić bootloader na czystej atmedze? Jakiego rodzaju programator byłby dobry na początek i czy potrzeba do niego jakieś szczególne sterowniki (nie ukrywam, że wolałbym mieć coś kompatybilnego z linuxem, ponieważ używam praktycznie tylko tego systemu). Jeśli miałbym programator, to jak wygląda pisanie kodu w czystym C na atmegę? Czy istnieją alternatywne środowiska do Atmel Studio, które działają na systemie z pingwinem? Z góry dziękuje za wszelkie odpowiedzi i pozdrawiam!
  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, ostatnio zbudowałem dosyć prosty układ, który steruje elektro-zamkiem (czujnik RFID i atmega328P). Elektro-zamek jest zasilany napięciem 12V, atmega również jest zasilana tym zasilaczem poprzez przetwornicę na 5V. Zamek jest sterowany za pomocą przekaźnika, który ma cewkę na 5V i tutaj pojawia się problem. Wyprowadziłem sobie trzy przewody z płytki PCB (+,- i sygnał sterujący, wysoki stan kiedy czujnik wykryje prawidłową kartę) po podłączeniu tych przewodów do przekaźnika i przyłożeniu prawidłowej karty nic się nie dzieję na przekaźniku. Zmierzyłem multimetrem napięcia na tych trzech przewodach i na plusie miałem 4,97 V, masa 0,07V, a sygnał sterujący 4,97V na 5 sekund kiedy karta zostaje przyłożona. Przekaźnik sterowany z arduino i zasilony z arduino działa bez zarzutów, da się usłyszeć przełączenia oraz zapala się na czas wysterowania dioda. Przekaźnik: JQC-3FF-S-Z-5V
  10. Hej, zbudowałem sobie takie samodzielne Arduino w oparciu o ATmega328p, jako mój programator służy arduino, z jego pomocą wgrałem bootloader na wyżej wymienioną atmege. I pojawił się problem gdy wgrywam za pomocą programatora(arduino as isp) program(miganie diodą) i podpinam zewnętrzne zasilanie, odpinam programator wszystko działa okej, ale gdy wgrałem sobie drugi program(sterowanie serwomechanizmem z pomocą modułu bluetooth HC-05) to jeśli jestem na zasilaniu z programatora(arduino) to program działa, natomiast jeśli odepnę i podłącze zewnętrzne zasilanie 5V to wtedy nie działa, (chyba) układ jest zasilony bo zapala się dioda z funkcji setup(), ale to co dzieje się w loop() tak jakby już nie działało bo nie ma mrugnięcia diodą a więc tym samym i sam serwomechanizm nie działa. Będę wdzięczny za wszystkie pomysły które mogą pomóc rozwiązać problem. Poniżej fragment kodu gdyby był potrzebny. Dodałem również schemat rozważałem rozdzielenie zasilania atmegi 5V i serwomechanizmy odzielnie na 6V(docelowo 4 serwomechanizmy), ale jeszcze nie wiem jak to się do końca łączy czy masy zasilania razem czy osobno czy w jakiś inny sposób(fajnie jakby ktoś się również tą wiedzą podzielił) ale na ten moment jest na jednym zasilaniu 5V całość atmega jak i 1 serwomechanizm. Na rx/tx dałem konwerter poziomów logicznych 5V/3.3V i jest też stabilizator żeby zrobić 3.3V. JP2 na schemacie to goldpiny na podpięcie serwa. #include <Servo.h> #include <SoftwareSerial.h> Servo s1; int bluetoothTx = 11; int bluetoothRx = 10; SoftwareSerial bluetooth(bluetoothTx, bluetoothRx); unsigned int servopos = 0; unsigned int servopos1 = 0; unsigned int servopos2 = 0; unsigned int realservo = 0; void setup() { s1.attach(9); bluetooth.begin(9600); pinMode(8, OUTPUT); digitalWrite(8, HIGH); } void loop() { if(bluetooth.available() >= 2) { digitalWrite(8, LOW); delay(700); digitalWrite(8, HIGH); servopos1 = bluetooth.read(); servopos2 = bluetooth.read(); realservo = servopos1 + (servopos2*256); Serial.print("Realservo - odczyt: "); Serial.println(realservo); if(realservo >=0 && realservo <=180) { digitalWrite(8, LOW); delay(300); digitalWrite(8, HIGH); digitalWrite(8, LOW); delay(300); digitalWrite(8, HIGH); s1.write(realservo); Serial.print("Pozycja serwo s1 "); Serial.println(realservo); delay(200); } }
  11. Witam zbudowałem sześcian z diod LED i chciałbym sterować świeceniem diod pilotem. Program napisałem wykorzystując bibliotekę Rc5 i jest kilka problemów. Nie potrafię napisać kodu, który po wciśnięciu przycisku np.1 na pilocie zapamięta wciśniecie przycisku jako logiczne 1 i wywoła funkcję, która będzie świeciła diodami(tryb 1) Po wciśnięciu innego przycisku np. 2 chciałbym aby diody przestały świecić w "trybie 1 i" zaczęły inaczej świecić (trybie 2). Mówiąc krótko wciskam przycisk 1 diody świecą w trybie 1 wciskam kolejny przycisk i diody zaczynają inaczej świecić(tryb 2). Dotychczas udało mi się zrobić tak, że wcisnę np. przycisk 1 i program zapamiętuje wciśniecie przycisku i diody ciągle świecą (wcześniej musiałem ciągle trzymać przycisk, żeby diody ciągle świeciły). Ale jest problem taki, że program zapamiętuje wciśniecie tego przycisku i dalej nic nie da się zrobić ani zmienić tryb świecenia ani wyłączyć diody(muszę zrobić reset aby diody się wyłączyły). Mógłby mi ktoś to na chłopski rozum wytłumaczyć jak to zrobić? Moje tryby napisałem jako funkcje, gdzie pierwsza funkcja to zwykłe miganie diodami, a druga to rozjaśnianie i gaszenie diod z pinu PWM. Tak wygląda mój kod: #define warstwa1 3 #define warstwa11 5 //podlaczenie diod do pinow PWM #define warstwa2 6 #define warstwa22 9 #define warstwa3 10 #define warstwa33 11 #define TSOP_PIN 7 //odbiornik podczerwieni #include <RC5.h> //biblioteka standard RC5 RC5 rc5(TSOP_PIN); //Informacja o podłączeniu odbiornika TSOP int wypelnienie=0; //zmienna dla PWM (dla funkcji dioda1) //Zmienne dla RC5 byte address; byte command; byte toggle; int button; void setup() { pinMode(TSOP_PIN ,INPUT); //odbiornik podczerwieni pinMode(warstwa1, OUTPUT); //diody jako wyjscie i wylacz wszystkie na starcie digitalWrite(warstwa1, 0); pinMode(warstwa11, OUTPUT); digitalWrite(warstwa11, 0); pinMode(warstwa2, OUTPUT); digitalWrite(warstwa2, 0); pinMode(warstwa22, OUTPUT); digitalWrite(warstwa22, 0); pinMode(warstwa3, OUTPUT); digitalWrite(warstwa3, 0); pinMode(warstwa33, OUTPUT); digitalWrite(warstwa33, 0); Serial.begin(9600); } void loop() { //Jeśli odebrano komendę if (rc5.read(&toggle, &address, &command)) { if(command == 2) { button=2; } // jesli odebrano zmienną command o wartosci 2 to zmienna button ma wartosc 2 else if (command == 1) { button=1;} } switch(button){ //wybierz zmienna button case 2: funkcja2(255,5,50); // Serial.println(button); break; case 1: funkcja1(250); //wlacz funkcje migania Serial.println(button); break; } } void funkcja1(int czas) { //funkcja1 digitalWrite(warstwa33, HIGH); delay(czas); digitalWrite(warstwa33, LOW); delay(czas); } void funkcja2( int ilewypelnienie, int zmiana, int czas){ //funkcja2 if(wypelnienie<ilewypelnienie){ analogWrite(warstwa1, wypelnienie); analogWrite(warstwa11, wypelnienie); analogWrite(warstwa2, wypelnienie); analogWrite(warstwa22, wypelnienie); analogWrite(warstwa3, wypelnienie); analogWrite(warstwa33, wypelnienie); wypelnienie+= zmiana; } if(wypelnienie==ilewypelnienie){ while(wypelnienie!=0){ analogWrite(warstwa1, wypelnienie); analogWrite(warstwa11, wypelnienie); analogWrite(warstwa2, wypelnienie); analogWrite(warstwa22, wypelnienie); analogWrite(warstwa3, wypelnienie); analogWrite(warstwa33, wypelnienie); wypelnienie=wypelnienie-zmiana; delay(czas); } } delay(czas); } I teraz po wciśnięciu przycisku 2 (tryb 2)do zmiennej button będzie ciągle przypisywał wartość 2 i nie mogę wtedy włączyć trybu 1. Tak to wygląda w monitorze portu szeregowego(screen w załączniku). I teraz jak zrobić, żeby dało się przełączać tryby lub wciśniecie tego samego przycisku powodowało by wyłączenie danego trybu? Napisałem prosty program, który po wciśnięciu switcha zapala diode i dioda gaśnie dopiero po ponownym wciśnięciu switcha. Tak wygląda ten kod: boolean buttonState1 = false; #define buttonPin1 7 //pin do odczytu stanu przycisku #define led1 11 void setup() { pinMode(led1, OUTPUT); //Dioda jako wyjście pinMode(buttonPin1, INPUT_PULLUP); //Przycisk jako wejście digitalWrite(led1, LOW); //Wyłączenie diody Serial.begin(9600); } void loop() { if (digitalRead(buttonPin1) == LOW) { delay(20); //20ms na obsługę drgań styków buttonState1 = !buttonState1; //zmiana na odwrotny stan if (buttonState1 == true){ digitalWrite(led1, HIGH); Serial.println(buttonState1); } else { digitalWrite(led1, LOW); Serial.println(buttonState1); } while (digitalRead(buttonPin1) == LOW); //czekamy tak długo, jak długo wciśnięty jest przycisk delay(20); //20ms na obsługę drgań styków } } Przerobiłem kod tak aby po wciśnieciu przycisku wywołał funkcje 2 lecz program nie działa tak jak chciałem tzn. rozjaśnienie i przygaszenie diody. boolean buttonState1 = false; // aktualny stan zaświecenia diody #define buttonPin1 7 //pin do odczytu stanu przycisku #define led1 11 //pin do obsługi diody int wypelnienie = 0; void setup() { pinMode(led1, OUTPUT); //Dioda jako wyjście pinMode(buttonPin1, INPUT_PULLUP); //Przycisk jako wejście digitalWrite(led1, LOW); //Wyłączenie diody Serial.begin(9600); } void loop() { if (digitalRead(buttonPin1) == LOW) { delay(20); //20ms na obsługę drgań styków buttonState1 = !buttonState1; //jest stan true i zamienia go na false if (buttonState1 == true){ funkcja2(255,5,50); Serial.println(buttonState1); Serial.println(wypelnienie); } else { digitalWrite(led1, LOW); // dioda sie Serial.println(buttonState1); Serial.println(wypelnienie); } while (digitalRead(buttonPin1) == LOW); //czekamy tak długo, jak długo wciśnięty jest przycisk delay(20); //20ms na obsługę drgań styków } } void funkcja2( int ilewypelnienie, int zmiana, int czas){ //ta sama funkcja co dioda tylko, ze na instrukcji warunkowej if if(wypelnienie<ilewypelnienie){ analogWrite(led1, wypelnienie); wypelnienie+= zmiana; } if(wypelnienie==ilewypelnienie){ while(wypelnienie!=0){ analogWrite(led1, wypelnienie); wypelnienie=wypelnienie-zmiana; delay(czas); } } delay(czas); } Wciśniecie przycisku powoduje ustawienie stanu logicznego 1 i zmianę wypełnienia o wartość 5. Wytłumaczy mi ktoś łopatologiczne jak napisać kod który: Po wciśnięciu przycisku na pilocie lub zwykłego switcha zapamięta wciśniecie przycisku jako logiczne 1 i będzie wykonywał wywołaną funkcje Ponowne wciśniecie tego samego przycisku spowoduje wyłączenie wywołanej funkcji lub wciśniecie innego przycisku zatrzyma aktualnie wywoływaną funkcję i wywoła inną Proszę o pomoc.
  12. Witam panowie wgrałem prosty program przykładowy blik do mikrokontrolera Arduino Uno. Teraz chciałbym aby ten program działał bez płytki arduino na płytce prototypowej. Na stronie arduino znalazłem poradnik jak to zrobić zrobiłem wszystko według instrukcji i nie działa program. Na pinie jest zaledwie 0,5V gdzie napięcie powinno raz mieć 5V a po 1sec 0V(bo taki program jest wgrany). Nie wiem co jest nie tak wszystko powinno byc dobrze zmontowane wklejam zdjęcia układu i proszę o pomoc.
×
×
  • 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.