Skocz do zawartości

Przeszukaj forum

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

  • 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

  1. Drogi Konstruktorze! Na pewno zdarzyła Ci się taka sytuacja: tworzysz układ na płytce stykowej. Wszystko jest ok, ale nagle ... które wyprowadzenie jest które? I liczysz: raz, dwa, trzy ... a potem drugi raz, żeby się nie pomylić, a czasem trzeci. Ale można inaczej - wystarczy nakleić na układ rozpiskę wyprowadzeń. I tu właśnie przychodzi z pomocą moja aplikacja. Możesz opisać piny układu całkowicie po swojemu, niekoniecznie zgodnie z kartą katalogową. Bez rejestracji, w pełni darmowo. Bez żadnego pobierania, wystarczy przeglądarka internetowa. Bez reklam. Po prostu tworzysz i drukujesz plik PDF. Jest także możliwość zapisania projektu, więc Twoja praca się nie zgubi. Zapraszam do testowania! Na razie wrzucam jako zajawkę, wkrótce pojawią się lepsze zdjęcia i zrzuty ekranu. Wszelki feedback mile widziany! https://stickers.js29a.info.pl/
  2. W tym projekcie chciałbym opisać krok po kroku proces podłączenia licznika samochodowego od Forda Galaxy do naszego Arduino. Potrzebne elementy: Zasilacz 12V Arduino Przewody męsko-żeńskie Licznik samochodowy Zestaw wskaźników od Forda Galaxy posiada 2 wtyczki - czerwoną oraz czarną. Nas w tym projekcie interesuje tylko czerwona wtyczka gdyż znajdują się w niej piny zasilające oraz dostarczające dane do silników krokowych w liczniku. Najpierw zajmijmy się zasilaniem. Do pinu 3 oraz do pinu 4 na liczniku wpinamy 2 przewody i podłączamy je do minusa na naszym zasilaczu a kolejne 2 przewody wpięte w pin 14 oraz w pin 15 podłączamy do +. Jako zasilacz może nam posłużyć zwykły zasilacz komputerowy kub jakikolwiek o napięciu 12V. Dalej zajmijmy się podłączeniem silniczków od wskazówek. obrotomierz - 10 pin prędkościomierz - 27 pin wskaźnik poziomu paliwa - 21 pin wskaźnik temperatury cieczy - 23 pin (pin 1 jest w lewym dolnym rogu wtyczki) Następnie przewody te wpinamy w wejścia cyfrowe do Arduino. W moim przypadku obrotomierz wpiąłem w wejście oznaczone 2, prędkościomierz w wejście nr 3, wskaźnik poziomu paliwa 4 a temp. cieczy w wejście 5. Jeżeli po podpięciu zasilania licznik zadziała (wskazówki ustawią się w położeniu 0 oraz włączy się podświetlenie) to możemy przejść do konfiguracji. Pobieramy oprogramowanie SimHub i instalujemy je. Po uruchomieniu programu przechodzimy do zakładki Arduino a następnie klikamy na zakładkę "My hardware". Wybieramy "Single Arduino" i klikamy "Open arduino setup tool". Następnie definiujemy w jakie wejścia wpięliśmy nasze wskaźniki. Wybieramy z jakiego arduino korzystamy (w moim przypadku jest to UNO) oraz wybieramy port komunikacyjny. Gdy wszystko mamy już zrobione klikamy Upload to arduino i czekamy aż program zostanie wgrany na Arduino. Jeżeli program wgrał się poprawnie przechodzimy do zakładki "Gauges" i kalibrujemy nasz licznik. Wartości liczbowe są indywidualne dla każdego licznika ale to co musimy ustawić do każdego licznika to MAX Tachometer RPM na 7 (jeżeli zakres na tarczy obrotomierza jest inny to podajemy maksymalną liczbę, jeśli jest to 5 to podajemy 5) oraz tachometer cylinders na 6. Warto zaznaczyć opcję "Always use tachometer full range" jednak jeśli sprawia ona problemy możemy ją wyłączyć. Resztę wartości musimy ustawić tak, żeby wskazówka poprawnie wskazywała położenie min i max. Niestety nie ma uniwersalnych wartości i prędkościomierz u mnie wskazuje poprawnie 240 km/h przy wartości 222 (speedo gauge maximum output) jednak w innym liczniku może być to wartość ciut większa lub mniejsza. Na samym końcu wybieramy grę w którą chcemy zagrać z zakładki "Games". Następnie uruchamiamy naszą grę i cieszymy się rozgrywką z naszym licznikiem. Ktoś mi może powiedzieć "Przecież można napisać kod", zgodzę się z tym tylko ja gram od ETS 2 przez Dirt 4 na Forzie kończąc. O wiele łatwiej jest jednym kliknięciem zmienić grę w simhubie niż pisać osobny kod eksportujący dane z telemetrii do Arduino. Jeżeli ktoś potrzebuje tylko licznika do jednej gry to ma to sens jednak w moim przypadku mija się to z celem. Koszt takiego licznika może zamknąć się w okolicach 50 zł. Możemy wykorzystać klona arduino (klon nano możemy kupić za mniej niż 15zł), a licznik możemy znaleźć na portalach aukcyjnych za ok 20zł. Jest to niedrogi i fajny bajer a na dodatek jest bardzo praktyczny. Poniżej znajdują się zdjęcia i gif pokazujący pracę urządzenia.
  3. Witam. Niedawno szukając pomysłu na projekt zobaczyłem, że mam wyświetlacz TM1637 i od razu wpadł mi do głowy pomysł na zrobienie licznika cyfrowego. Taki przyrząd dla zapominalskich, do liczenia. I tak oto powstało to: Cyfrowy Licznik Użyte komponenty/moduły: Attiny85 Moduł wyświetlacza TM1637 Tact switch (x3) Przełącznik Baterie AAA (x3) Zacząłem od napisania kodu i złożenia wszystkiego na płytce stykowej. Początkowo wszystko miało być zrobione na Arduino NANO, potem stwierdziłem że lepiej użyć czegoś tańszego i mniejszego czyli Attiny85. Przyciski miały działać w ten sposób: Lewy -> +1 Środkowy -> +10 Prawy -> RESET Rozkład działania przycisków licznika Cały kod udało mi się napisać dość szybko i nie jest on skomplikowany: #include <TM1637Display.h> #define CLK 3 #define DIO 4 TM1637Display display(CLK, DIO); int buttonState_1; int buttonState_10; int buttonState_reset; int licznik=0; void setup() { display.setBrightness(7); pinMode(0, INPUT); pinMode(1, INPUT); pinMode(2, INPUT); for(int i=0; i < 7; i++){ display.showNumberDecEx(8888, 0b01000000, true); delay(50); display.clear(); delay(50); } delay(500); display.showNumberDec(0); } void loop() { buttonState_1 = digitalRead(0); buttonState_10 = digitalRead(1); buttonState_reset = digitalRead(2); if(buttonState_1 == HIGH){ licznik++; display.showNumberDec(licznik); while(buttonState_1 == HIGH){ buttonState_1 = digitalRead(0); } } if(buttonState_10 == HIGH){ licznik+=10; display.showNumberDec(licznik); while(buttonState_10 == HIGH){ buttonState_10 = digitalRead(1); } } if(buttonState_reset == HIGH){ licznik=0; display.showNumberDec(licznik); while(buttonState_reset == HIGH){ buttonState_reset = digitalRead(2); } } if(licznik > 9999){ licznik=0; display.showNumberDec(licznik); } delay(50); } Na samym początku jest tzw. ,,test ledów" więc cały wyświetlacz mruga liczbami i znakami: 88:88, a później są same funkcje odpowiadające za wykrywanie czy przycisk nie został naciśnięty oraz za wyświetlanie danych liczb. Dobra dość gadania o kodzie, czas powiedzieć coś o obudowie. Obudowę robiło się bardzo przyjemnie. Robiłem ją jak zawsze w programie TINKERCAD, który jest bardzo prosty i przyjazny dla początkujących takich jak ja 😉 Obudowa licznika W moich poprzednich obudowach i projektach robiłem sam otwór na koszyk i tam go po prostu przyklejałem. Przyznam że nie wyglądało to estetycznie w ogóle. W tym projekcie koszyk był drukowany w raz z pokrywą całej obudowy, więc po wydrukowaniu trzeba było tylko włożyć odpowiednio blaszki i gotowe! Wydrukowana pokrywa obudowy wraz z koszykiem, blaszkami oraz bateriami Cała obudowa drukowała się ok. 3 godziny i pochłonęła 56g filamentu. Wszystko drukowało się bardzo ładnie, a tak wyglądał efekt: Wydrukowana obudowa Pozostało mi jeszcze wszystko polutować i upchać do środka, co okazało się najcięższym zadaniem... Na początku zlutowałem podstawkę (na Attiny85), tylko tutaj zrobiłem to trochę inaczej. Zamiast lutować kabelki do podstawki, zrobiłem coś co miało pełnić funkcje takiej jakby ,,płytki stykowej?" żeby było można wszystko w każdej chwili poprzepinać. Użyłem do tego żeńskich goldpin-ów i cały ten pomysł okazał się bardzo dobry. Wiadomo że wszystko będzie mniej wytrzymałe, bo w każdej chwili może coś się wypiąć, ale tu się to bardzo dobrze trzymało. Dodatkowo co chwilę musiałem coś wypinać/przepinać, więc ta metoda sprawdziła się tu idealnie 👍 Zlutowany, prawie gotowy projekt Okazało się, że obudowę jednak zrobiłem trochę za ciasną i upchanie tego wszystkiego do środka zajęło mi bardzo dużo czasu. 😅 Wiele elementów musiałem spiłować, kleić i robić wiele innych rzeczy, ale w końcu udało się to wszystko do środka włożyć i zamknąć obudowę: Obudowa i upchania do środka elektronika Test licznika jest na tym filmie: Czy będę go używał? Nie! Raczej jak już coś liczę to zapamiętuje to w głowie, więc taki przyrząd nie jest mi potrzebny. Zrobiłem go, bo innego pomysłu na projekt nie miałem. Dziękuje za przeczytanie tego DIY! Mam nadzieję że projekt się spodobał. Czekam na wasze opinie i uwagi! 😄 Pozdrawiam.
  4. Witam. Budowę auta na pilota planowałem już od dawna, ale nie wiedziałem jak się do tego zabrać. Dopiero niedawno gdy miałem okazje wykonać projekt z tego filmu, dowiedziałem się jak to zrobić. I tak oto powstało takie auto na pilota: Auto na pilota Użyte komponenty i moduły: Arduino UNO Moduł sterownika silników DC L293D Akumulatorki Li-Ion 18650 + koszyk Silnik DC z przekładnią + koła (x4) Odbiornik IR Rezystor 68Ω Kondensator 100µF Przełącznik I/O Pilot IR (ja użyłem ten pilot) Na samym początku musiałem zbadać kody które odbiornik odbiera po wciśnięciu danego przycisku na pilocie, więc napisałem i wgrałem taki kod: #include <IRremote.h> const int RECV_PIN = A0; void setup() { Serial.begin(9600); IrReceiver.begin(RECV_PIN, ENABLE_LED_FEEDBACK); Serial.println("Odbiornik IR gotowy."); } void loop() { if (IrReceiver.decode()) { Serial.print("Kod: "); Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX); IrReceiver.resume(); } Okazało się, że odbiornik odbiera losowe sygnały gdy klikam ten sam przycisk. Problem rozwiązał ,,filtr na zasilaniu odbiornika". (problem szczegółowo opisywany i rozwiązywany jest w tym wątku): Ustaliłem sposób w jaki będą działać przyciski i zająłem się budową auta: Instrukcja obsługi pilota Auto budowałem w podobny sposób jak na filmie do którego linkowałem na początku tego opisu. Dlatego nie będę też opisywał tutaj tego jakie kroki wykonałem, żeby je zbudować. Lepiej zajrzyjmy do kodu. 😄 #include <IRremote.hpp> #include <AFMotor.h> AF_DCMotor motorM1(4); AF_DCMotor motorM2(3); AF_DCMotor motorM3(2); AF_DCMotor motorM4(1); const int RECV_PIN = A0; int speed=200; void setup() { IrReceiver.begin(RECV_PIN); motorM1.setSpeed(speed); motorM2.setSpeed(speed); motorM3.setSpeed(speed); motorM4.setSpeed(speed); } void loop() { if (IrReceiver.decode()) { if(IrReceiver.decodedIRData.decodedRawData == 0xBF40FF00){ // JAZDA W PRZÓD motorM1.run(FORWARD); motorM2.run(FORWARD); motorM3.run(FORWARD); motorM4.run(FORWARD); } if(IrReceiver.decodedIRData.decodedRawData == 0xE619FF00){ // JAZDA W TYŁ motorM1.run(BACKWARD); motorM2.run(BACKWARD); motorM3.run(BACKWARD); motorM4.run(BACKWARD); } if(IrReceiver.decodedIRData.decodedRawData == 0xF807FF00){ // SKRĘT W LEWO motorM1.run(FORWARD); motorM2.run(FORWARD); motorM3.run(BACKWARD); motorM4.run(BACKWARD); } if(IrReceiver.decodedIRData.decodedRawData == 0xF609FF00){ // SKRĘT W PRAWO motorM3.run(FORWARD); motorM4.run(FORWARD); motorM2.run(BACKWARD); motorM1.run(BACKWARD); } if(IrReceiver.decodedIRData.decodedRawData == 0xEA15FF00){ // STOP motorM3.run(RELEASE); motorM4.run(RELEASE); motorM2.run(RELEASE); motorM1.run(RELEASE); } IrReceiver.resume(); } } I tak jak widać po kodzie, sterowanie tym autem jest uciążliwe. W klasycznych autach na pilota, jak klika się przycisk (jazda w przód) to auto jedzie póki nie puścisz przycisku. Tutaj jak klikam przycisk, to auto jedzie do momentu w którym nie nacisnę innego przycisku, lub przycisku stop. Jak wie ktoś jak wykonać taki kod, który pozwoli sterować autem tak jak w klasycznych autach, to był bym wdzięczny jakby podpowiedział pod tym opisem. 🙂 Podczas pisania kodu, napotkałem jeszcze jeden problem. Biblioteka AFMotor gryzła się z IRremote, przez co nie mogłem sterować silnikami M1 i M2, więc w kodzie mogłem używać tylko jednej z tych bibliotek. Rozwiązanie problemu też znajduje się w tym wątku: Na koniec najlepsza część, czyli filmik: Choć kod i schemat połączenia wszystkiego były wykonane przeze mnie to dużo inspirowałem się tym filmem. Dziękuje za przeczytanie całego DIY i z góry przepraszam, jeśli się je dziwnie czytało, ale zupełnie nie wiedziałem jak się do niego zabrać. 😉 Czekam z niecierpliwością na wasze uwagi. Pozdrawiam. 🙂
  5. Cześć! Ostatnio wpadłem na pomysł stworzenia lampki która będzie ładowana za pomocą panelu solarnego 6V/1W a dodatkowo będzie miała 2 ważne funkcje; zapalanie po nastaniu odpowiednich warunków w pokoju oraz wykrywanie ruchu. Głównym założeniem tego projektu ma być przede wszystkim nauka oraz sprawdzenie się pod względem wiedzy którą posiadam. Funkcje lampki które chciałbym aby miała: Samowystarczalność, ładowanie za pomocą panelu aby nie trzeba było pamiętać jej ładować. Mobilność urządzenia, może być zabrana wraz z dzieckiem gdziekolwiek będzie. Świecenie diody dopiero po zapadnięciu zmroku, a gdy wykryje ruch dioda ma świecić jaśniej. Z racji posiadanego zestawu elektroniki #1 oraz #2 Forbota chciałbym wykorzystać następujące elementy: Tranzystor BC546 x 2 Czujnik ruchu HC-SR501 Fotorezystor 5-10k Ohm Rezystory Komparator LM311 Potencjometr 5k Ohm Dodatkowo: Panel Solarny 6V/1W Moduł zarządzania energią z panelu solarnego Akumulator Li-on 3.7V 18650 (wykorzystuje takie do innych celów więc chciałbym użyć go i tutaj) Koszyczek na aku 18650 Poniżej zamieszczam schemat w postaci PNG oraz PDF. Z góry dziękuje za wszelkie odpowiedzi. Lampka_zmierzchowa.pdf
  6. Witam wszystkich czytelników. Zainspirowałem się w wakacje postem użytkownika @Krzysiek97, który przedstawił swoją kierownice do gier na bazie arduino leonardo: Kierownica PC - wersja 2. Z racji tego że lubię grać w gry wyścigowe i symulatory postanowiłem zbudować własną kierownicę z dodatkowymi akcesoriami. Nie chciałem przerabiać starej gotowej kierownicy do komputera, więc wpadłem na pomysł aby zbudować całe stanowisko. Materiał o tym stanowisku/ projekcie znajduję się na moim kanale na YT do którego was zapraszam Kierownica do komputera na bazie arduino Chciałem aby w tym stanowisko znajdowała się kierownica o kącie obrotu 900 stopni, sprzęgło, gaz, hamulec, 8 biegów + wsteczny (8 biegów ponieważ tyle mają niektóre samochody np. w Forza Horizon 4), hamulec ręczny, 2 joystiki (do sterowania maszynami w Farming Simualtor), button matrix 4x5 = 20 przycisków (przypisanych do rożnych akcji w grach) i zegary do wyświetlania prędkości i obrotów. Tak więc gdzieś w połowie lipca zacząłem szukać potrzebne części. Pierwszym problemem z którym się spotkałem była niewystarczająca ilość wejść w arduino leonardo. Ktoś na tym forum podsunął mi płytki Nucleo 64 na STM32, obawiałem się jednak czy programy które wcześniej znalazłem w internecie będą z nimi współpracować. Bawiłem się naco wcześniej arduino lecz nucleo nie stąd moja niepewność ponieważ zaczynałem dopiero wtedy zabawę z tym wszystkim. Zdecydowałem się jednak zostać przy arduino i zakupiłem 3 płytki, po jednej dla każdego programu który obsługuję inną część stanowiska, ponieważ i tak nie ma prgoramu który ogarnie wszystkie moje rzeczy na raz. A więc tak: Arduino Leonardo - program EMC Utility Lite (z początku korzystałem z RFR Whell Configuration elcz sprawiał on problemy) - obsługuję kierownicę, pedały, hamulec ręczny - Link do programu EMC, Jak zainstalować program Pierwsze Arduino Pro Micro - program MMJoy2 - obsługuję button matrix i 2 joysticki - Link do programu MMJoy2, Jak zainstalować program Drugie Arduino Pro Micro - program SimHub - obsługuję zegary/wyświetlacze - Link do programu SimHub Zamówiłem też 20 guzików (push button) 10 styczników krańcowych 2 Joysticki 2 wyświetlacze Tm1638, 1 wyświetlacz Max7219 (zamówiłem też sterownik silnika BTS7960 lecz na razie nie zakładałem FFB). Rzeczy które miałem w domu to: 2 potencjometry 10k Ohm, stycznik krańcowy ls-11s, kable kawałki plastiku, materiału i gumy. Za postawę stanowiska posłużyła mi deska rozdzielcza i fotel od mazdy mx-5 i kierownica od mazdy 626. Całość jest przyspawana do rurki i przykręcona do euro palety. Z racji tego że deska pochodzi z anglika to nie mogłem zamontować zwykłych zegarów w miejscu poduszki pasażera. Zamieszczam tutaj schematy podłączeń danych elementów: Drugim problemem który chce tu opisać, było przeniesienie/ zczytanie obrotu z kierownicy do arduino. Na początku chciałem wykorzystać enkoder optyczny z swojej starej drukarki, lecz gubił się on często i nie działał dokładnie, więc kupiłem enkoder inkrementalny 600ppr. Nie będę się już tak rozpisywał co jak i gdzie jest skręcone dlatego wszystko pokazane i omówione jest w filmiku do którego link jest na początku posta. Więc to jest dodatkowy materiał dla ciekawych. Podsumowując: koszt budowy stanowiska zamknął się dla mnie w kwocie 300zl, czas realizacji od pierwszego pomysłu do zbudowania całości i upewnienia się że wszystko jest sprawne to 6 miesięcy. Tak oto prezentuję się kierownica i jej działanie w grze Forza Horizon 4 Na koniec pytanie głownie do administratora, czy i kiedy będzie znowu dostępny konkurs Opisz elektroniczne DIY i odbierz 50 zł rabatu do Botland?
  7. Witam wszystkich! Mam na imię Paweł i od blisko 5 lat buduję swój własny procesor oparty o układy z rodziny 74 TTL. Do tej pory stworzyłem dwie iteracje projektu. Każda z tych dwóch iteracji składa się z płytki CPU i płytek potrzebnych do zbudowania prostego komputera w oparciu o te CPU. Do tej pory tworzyłem swój projekt hobbystycznie. Strona na której zamieszczałem opis i źródła nie była za bardzo nigdzie udostępniana i praktycznie tylko znajomi o niej wiedzieli. Ale nadszedł ten czas by się podzielić projektem z większą publiką 🙂 WWW: https://xirx.net GIT: https://git.xirx.net lub mirror: https://github.com/demohpj Na stronie www na ta chwilę jest pełny opis XiPU w pierwszej wersji. XiPU_v2 będzie miał dopiero taki opis tworzony. Zapraszam też do zapoznania się działem download gdzie można ściągnąć emulator całego komputera i pobawić się z nim na żywo: Download: https://xirx.net/?s=download W obu wersjach miałem proste założenia: Używać układów 74 w wersji HCT (napięcie działania to 5V ale zapotrzebowanie prądowe jest o wiele mniejsze ze względu na bycie układami CMOS) Nie używać nic bardziej skomplikowanego niż ALU 181 Ograniczyć się maksymalnie do formatu A4 dla PCB 8 bitowa architektura z 16 bitowym adresowaniem pamięci 2 rejestry ogólnego przeznaczenia (A i B) i 2 rejestry dodatkowe pomocne przy używaniu adresów (X i Y) Obsługa 64 KB RAM (16 bitowa szyna adresowa) Taktowanie CPU minimum 1 MHz (by dało się go używać w jakiś sensownych scenariuszach) Szyna danych do komunikacji z zewnętrznym światem (8 bit IN oraz 8 bit OUT) Obsługa stosu Obsługa rozkazów: add, sub, inc, dec, shl, shr, push, pop, cmp, jmp Mikrokod zapisany na układach EEPROM Wymagania co do komputera: Ekran 320x240 z 4 bitową paletą i znakami 8x8 (w rzeczywistości zastosowany jest ekran LCD 640x480 z 8 bitową paletą) Prosty głośnik do odtwarzania tonów generowanych przez funkcję kwadratową (zmieniamy procent wypełnienia i częstotliwość) RS232 o prędkości 1200 bps Zegar RTC z podtrzymaniem bateryjnym Klawiatura QWERTY 4 diody LED (power, run, capslock, error) Komputer zasilany jest napięciem 7.5V przy maksymalnym prądzie 1A. Główną składową komputera oprócz CPU jest IO Board, który ma za zadanie pośredniczyć w komunikacji CPU ze światem. Jako układ sterujący zastosowałem STM32F072. Płytka posiada również pamięć typu flash o wielkości 2 MB do przechowywania plików i programów udostępnianych po szynie danych do CPU. W XiPU_v2 pamięć flash przechowuje również plik z systemem operacyjnym, który po starcie jest pobierany przez bootloader. Opis kluczowych właściwości XiPU: Częstotliwość zegara: 1 MHz Pamięć: 32 KB ROM + 64 KB RAM (dwie oddzielne przestrzenie adresowe, górne 32 KB RAM jest widoczne jako górna połówka ROM) Zewnętrzna szyna komunikacyjna: 8 bit IN, 8 bit OUT Rejestry: A, B, X, Y (wszystkie są 8 bitowe) Stos: 256 bajtów (tylko prosty push i pop) Adresowanie: Bezpośrednie lub jako adres w parze rejestrów Y:X Flagi procesora: C i Z (każda instrukcja używająca ALU powoduje zmianę tych flag) Mikrokod: 2 pamięci 32 KB EEPROM Arytmetyka: Tylko operacje na 8 bitowych danych System operacyjny: 32 KB EEPROM (zmiana wersji wymaga przeprogramowania układu) Opis kluczowych właściwości XiPU_v2: Częstotliwość zegara: 1 MHz Pamięć: 64 KB RAM (jedna przestrzeń adresowa, tylko pierwsze 2 KB pamięci jest przeznaczone dla BIOS w pamięci ROM) Zewnętrzna szyna komunikacyjna: 8 bit IN, 8 bit OUT Rejestry: A, B, X, Y (wszystkie są 8 bitowe) Stos: 4 KB, obsługa Frame Pointera (dostępny rejestr BP), dostępne instrukcje enter i leave, możliwe zaawansowane manipulowanie adresem wskaźnika stosu i bezpośredni dostęp do danych Adresowanie: Bezpośrednie lub jako adres w parze rejestrów Y:X, możliwe używanie dodatkowego przesunięcia dla adresów przechowywanych w Y:X Flagi procesora: C i Z (są dwie pary tych flag, jedna jest przeznaczona do widzenia przez następne instrukcje, druga jest ukryta i służy tylko do tymczasowego użytku podczas wykonywania specyficznych instrukcji) Mikrokod: 2 pamięci 32 KB EEPROM Arytmetyka: Operacje na 8 bitowych danych, dodatkowo wsparcie dla podstawowych instrukcji add/sub/inc/dec dla 16 bitowych danych w rejestrach Y:X System operacyjny: 2 KB EEPROM z BIOS (bootloader + podstawowe API dla IO), OS jest pobierany przez zewnętrzną szynę komunikacyjną z IO Board Do projektu użyłem następujących narzędzi: Geany - Tworzenie plików Makefile i asemblera. QtCreator - C++/Qt. Użyte do tworzenia aplikacji pomocniczych. Qt 5.12.4 - Biblioteka użyta do tworzenia aplikacji pomocniczych. GCC - kompilator C i C++ Keil uVision 5.37 - Kompilator i środowisko debugowe dla STM32F0 MCU. Make - Narzędzie do automatyzacji budowania. Doxygen 1.9.7 - Generator dokumentacji na podstawie kodu źródłowego. Proteus 8.10 - Symulator obwodów drukowanych. QCAD - Narzędzie do projektowania rysunków technicznych. DipTrace 4.2.0.1 - Narzędzie do projektowania PCB. AUTODESK Fusion - Narzędzie do projektowania modeli 3D do druku.
  8. Witam wszystkich! Po dłuższej nieobecności na formu chciałbym zaprezentować Wam kilka z moich najnowszych projektów przy okazji po krótce omawiając magistralę CAN bus. *** Wstęp *** Do tej pory opublikowałem dwa wpisy na forum opisujące budowę analogowych liczników samochodowych od Forda Galaxy oraz Audi A3 8L. Są to projekty niezwykle proste w budowie, wystarczy na określony pin podać 12V, masę lub sygnał z Arduino o określonej częstotliwości aby ożywić cały licznik i wszystkie wskazówki. Jednak ze względu na swoją prostotę projekty te posiadają liczne ograniczenia - przede wszystkim nie jesteśmy w stanie idealnie symulować zmiennej rezystancji czujnika poiomu paliwa oraz temperatury cieczy. Dodatkowo większosć kontrolek działa w logice 12V przez co nie można nimi sterować bezpośrednio z Arduino. Wszystkie te ograniczenia obchodzą liczniki, które do komunikacji wykorzystują magistralę CAN bus. *** Założenia projektu *** Projekt licznika miał być przede wszystkim uniwersalny i działać z szerokim wachlarzem gier - od ETS 2 gdzie prędkości obrotowe silnika wynoszą do 2500 RPM a prędkość rzadko kiedy przekracza 120km/h przez Framingi, BeamNG, Asseto Corsa na F1 kończąc gdzie silnik wkręca się powyżej 10.000 RPM a prędkości znacznie wykraczają za maksymalne wychylenie prędkościomierza licznika samochodowego. Licznik umożliwić ma nie tylko odczyt podstawowych parametrów prowadzonego pojazdu tj. obroty silnika, prędkość, temperatura cieczy, oleju czy poziomu paliwa ale także informować o stanie świateł, silnika czy nawet opon. *** Potrzebne materiały *** Arduino MCP2515 Zasilacz 12V (1A w zupełności starczy) Przewody połączeniowe *** Jak to działa? *** Do budowy projektu wykorzystałem dobrze znane większości z Was Arduino NANO wyposażone w USB-C. Dialog z licznikiem prowadzony jest poprzez moduł CAN MCP-2515 a całość zasila 12V zasilacz sieciowy. Całość umieściłem w małej obudowie wydrukowanej na drukarce 3D. Nie wgryzając się za bardzo w szczegóły techniczne - CAN bus to szeregowa magistrala danych wykorzystująca do komunikacji 2 przewody opisywane jako CAN-H oraz CAN-L. Jak łatwo się domyślić na przewodzie CAN-High panuje nieco wyższe napięcie niż na CAN-Low. CAN Bus jest magistralą działającą w sposób różnicowy czyli mierzy i porównuje napięcia na CAN-H oraz CAN-L. W ten sposób odczytywane są bity dominujące i recesywne tworąc ciąg zer i jedynek. Dla ułatwienia projektu nie oparłem o liczby binarne tylko znacznie przyjemniejsze dla oka - heksadecymalne. Ramka CAN wysyłana do licznika składa się z unikalnego identyfikatora (ID) oraz określonej ilości bajtów danych. Każdy bajt danych może przyjąć wartość od 0 do FF czyli decymalnych 255. Dla przykładu aby zapalić kontrolkę hamulca ręcznego w liczniku od Peugeota 407 muszę nadać ramkę o ID 128 a bicie zerowym nadać wartość 24HEX. Wygląda to mniej więcej tak: [ ID 128 0x24 0x00 0x00 0x00 0x00 0x00 0x00 0x00 ]. Pod pozostałymi bitami kryją się kolejne kontrolki tj. kierunkowskazy, światła mijania, drogowe, przeciwmgielne oraz nielubiany przez kierowców check engine. Pod różnymi ID ramek można odnaleźć pozostałe funkcje licznika - sterowanie wskazówkami, podświetleniem, ustawianie przebiegu itd. Warto pamiętać, że niektóre liczniki po otrzymaniu zasilania będą pozornie wyglądać na martwe. Takie konstrukcje potrzebują tak zwanego sygnału przebudzenia, który "obudzi" licznik. Jeśli taki sygnał występuje to jest to pierwszy krok aby zacząć zabawę z licznikiem. *** Projekt licznika *** Do moich projektów wykorzystuję liczniki z samochodów Peugeot oraz Citroen. Magistrala CAN w obu markach jest bliźniaczo podobna i różnią się jedynie małymi szczegółami. Najważniejsze, że obie marki wykorzystują taką samą szybkość magistrali wynosząca 125Kbps. Do kontroli modułu MCP2515 wykorzystałem bibliotekę MCP2515.h. W pierwszej kolejności łączę moduł CAN z Arduino oraz podłączam magistralę wraz z zasilaniem do licznika. Należy pamiętać, że każdy licznik posiadać może swój własny indywidualny pinout. Powyżej można zobaczyć pinout licznika Citroen C3 I FL. Po podłączeniu wszystkich 4 przewodów wgrywam przygotowany wcześniej kod na Arduino. Warto zatrzymać się na chwilę przy kodzie i zastanowić się jak projektant tworzył licznik. Zespół projektujący licznik miał surowe dane - maksymalne obroty silnika 5200 RPM, maksymalna temp. cieczy 130℃, maksymalna temp. oleju 150℃, maksymalna prędkość 260km/h. Licznik przygotowany jest oczywiście na taki zakres danych z minimalnym zapasem jednak po przekroczeniu skali obrotomierza lub wskaźnika temperatury zaczną dziać się różne dziwne rzeczy. Wartości out of range są różnie traktowane przez liczniki - jedne ustawiają wskaźnik na "0", drugie wyłączają się a trzecie mogą się zawiesić. Dane z gier praktycznie zawsze będą wykraczać poza zakresy ustalone przez producenta więc trzeba przeanalizowaćkażdą grę z osobna i zastosować zabezpieczenia oraz skalowanie tak, aby wartości zawsze znajdowały się w akceptowalnym przez licznik zakresie. Kod musi brać także poprawkę na nieliniowość wskaźników temperatury - rzadko kiedy 1° obrotu silnika krokowgo będzie odpowiadał dokładnie takiemu samemu przyrostowi temperatury. Do przykładu - wskazówka temp. cieczy "zastyga" na 90℃ gdy faktyczna temperatura cieczy waha się od ~85-93℃. Dalszy wzrost temperatury będzie powodował niewielki wzrost wychylenia wskazówki. Jednak gdy temperatura niebezpiecznie wzrośnie to wskazówka momentalnie zwiększy swoją czułość i będzie wykonywać znaczny ruch co każdy 1-2℃. *** Dane z gier *** Po przetestowaniu kodu na "suchych" danych wpisanych "z palca" do kodu wypadałoby przestawić się na dane przesyłane z gier do licznika w czasie rzeczywistym. Za przygotowanie danych odpowiada aplikacja SimHUB współpracująca ze specjalnie napisaną przeze mnie formułą NCalc "obrabiającą" surowe dane z gier na zakresy liczbowe zaimplementowane w kodzie. Wygląd danych, którymi "karmię" kod Arduino przedstawiam poniżej. Jest to oczywiście wycinek danych ponieważ ogranicza mnie pole wyświetlające Raw result. *** Efekt końcowy *** Po wielu próbach i testach udało mi się ujarzmić prawie cały licznik. Wszytskie wskazania licznika: prędkość obrotowa silnika prędkość pojazdu poziom paliwa temp. cieczy temp. oleju wskaźnik biegów Kontrolki: hamulec ręczny kierunkowskazy światła mijania, drogowe, przeciwmgielne brak ładowania akumulatora niskie ciśnienie oleju rezerwa przegrzanie cieczy przebita opona przebieg nastawa tempomatu / aktualna prędkość pojazdu niskie ciśnienie w układzie hamulcowym (ETS2/ATS wykorzystując kontrolkę wody w filtrze paliwa) podniesienie osi (ETS2/ATS wykorzystując kontrolkę wyłączonej poduszki powietrznej pasażera) kończącego się czasu pracy (ETS2/ATS wykorzystując kontrolkę uszkodzenia wspomagania kierownicy oraz kontrolkę pasów bezpieczeństwa) przekroczonego limitu prędkości na drodze (ETS2/ATS wykorzystując kontrolkę usterki tempomatu (tylko Peugeot 407)) zbyt wysokich obrotów (ETS2/ATS wykorzystując kontrolkę trójkąta ostrzegawczego) retardera (ETS2/ATS wykorzystując kontrolkę świec żarowych) ekonomicznej jazdy (wykorzystując kontrolkę ECO) działanie ESP działanie ABS Działanie licznika w grach można zobaczyć na poniższych zdjęciach. *** Zbuduj sam własny projekt i odkrywaj tajniki CAN BUS! *** Z tego miejsca chciałbym gorąco zachęcić wszystkich zainteresowanych do spróbowania swoich sił i budowy własnego projektu z licznikiem opartym na magistrali CAN Bus. Elementy niezbędne do budowy projektu oraz same liczniki są bardzo tanie i projekt powinien spokojnie zamknąć sie w 100-150zł. Magistrala CAN grupy PSA jest bardzo dobrze opisana, obszerną dokumentację stanowiącą fundamentalny filar wiedzy można znaleźć pod TYM linkiem. Jeśli do wybranego przez Ciebie licznika nie ma żadnej dokumentacji to nic straconego, wystarczy napisać bardzo prosty generator losowych wartości bajtówki. Metoda ta nazywa się brute force i jest bardzo efektywna. Należy jednak korzystać z niej ostrożnie ponieważ istnieje niewielka szansa na zbrickowanie licznika. Eksperymentowanie z licznikiem oraz CAN Bus'em pozwoli Tobie także lepiej zrozumieć cały proces komunikacyjny, który finalnie zapala nielubiany check engine na liczniku. Za pomocą modułu MCP2515 możesz także podsłuchać co "szumi" w magistrali CAN Twojego samochodu. Jeśli rozszyfrujesz te dane to nic nie stoi na przeszkodzie abyś zaprojektował swój własny wyświetlacz doładowania, cyfrowy prędkościomierz czy wyświetlacz temperatury oleju w silniku. *** Wykorzystaj mój kod! *** Jeśli jednak nie czujesz się na siłach aby zbudować własny licznik to możesz bez problemu wykorzystać opracowane przeze mnie liczniki wraz z kodem na Arduino. Wszelkie informacje odnośnie budowy takiego projektu znajdziesz w poradniku na moim kanale:
  9. Miesiąc po skończeniu wstępnego kursu na Forbocie o arduino (w grudniu 2023), zacząłem myśleć jakim projektem się zająć. Na początku próbowałem robić różne proste rzeczy, ale gdy stwierdziłem, że kupię drukarkę 3D to pójdę o krok dalej i wrzucę się na głęboką wodę. I tak zaczęła się przygoda z tworzeniem kierownicy do simracingu na bazie kirownicy F1 z 2023 roku z bolidu mercedesa. W tym też momencie zacząłem się uczyć programów projektowych (fusion 360 itp) i szukać potrzebnych części. Na początku miała to byc prosta kierownica z 12 przyciskami. Ale gdy odkryłem bibliotekę joystick.h to stwierdziłem że idę na całość. Całość zajęła jakieś 1,5 mc. Lącznie z ogarnięciem drukarki która nie chciała współpracować. Znając podstawy dowiedziałem się że da się to zrobić na dowolnych arduino z ATmega32U4. Poniżej znajdziecie też trochę kodu. Na początku (co było złym pomysłem) próbowałem nauczyć się tworzenia płytek PCB nie wiedząc jeszcze jak połącze wszystko. (VCC pomyliłem z GND :D) Stwierdizłem, że zaprojektuje całość, ale nie wiedziałem dokładnie ile miejsca potrzebuje. Wersja miała zawierac tylko przyciski, joystick i 2-3 enkodery. testowo podpięte pod arduino. użyłem większych buttonów podświetlanych. Zostałem przy niebieskich i białych, bo pobierały najmniej pradu. Po przymiarkach stwierdziłem że robie full kierę z F1. Projekt to H005. całość robiona według instrukcji, ale z dużymi zmianami. Większe buttony, enkodery które miałem nie mieściły się. Inne pokrętła, no i całość na jednym arduino. Dodatkowo dokupiłem ekran Vocore 4,3 cala. Projekt był pod 4,0 więc przerobiłem obudowę pod niego. Na początku wpięte wszystkie buttony i enkodery, tak by skręcić całość bez tylnej pokrywy. wszystko sprawdzane 10 razy by nie musieć rozkręcać wszystkiego po złożeniu. Całość obklejona "carbonem" i opaskami do tenisa + tasma izolacyjna. Jeśli chodzi o okablowanie, użyłem płytek by moc na nich ogarnąć buttony i GND. Po podpięciu wszystkiego kabli było na tyle dużo że całość nie zamknęła się w obudowie. Musiałem ją pogrubić. Dodatkowo dodałem 7 way joystick, ale używam tylko 4 kierunkowy + przycisk. Nie starczyło wejść w arduino na więcej. - 12 wejść pod rotary enkodery, - 1 wejście pod 11 buttonów + joystick + manetki, - 2 wejścia pod 2x 12 pos switch, łącznie 52 buttony + ekran Manetki według projektu. Całość po skręceniu. Jedno pokrętło środkowe to potencjometr podpiety do VCC i rezystorem 330ohm by regulować podświetlenie. dodatkowo ekran podpięty na osobnym kablu usb. Same kable usb w środku wpięte do 7 din avaitor kabla, wszystko na jednym kablu z koncowka na 2x usb wpięte do PC. Sam ekran sterowany za pomocą SimHuba. i po naklejeniu naklejek. Po złożeniu całości wyszły problemy z bouncingiem enkoderów. Po dwóch dniach udało mi się rozwiązać problem bez użycia interrupt pinów. pierwsza zmiana to sposób sprawdzania 6 enkoderów. void read_encoder_1() { // Encoder interrupt routine for both pins. // if they are valid and have rotated a full indent Old_AB_1 <<=2; // Remember previous state if (digitalRead(PIN_A_1)) Old_AB_1 |= 0x02; // Add current state of pin A if (digitalRead(PIN_B_1)) Old_AB_1 |= 0x01; // Add current state of pin B encval_1 += enc_states[( Old_AB_1 & 0x0f )]; // Update counter_1 if encoder has rotated a full indent, that is at least 4 steps if( encval_1 > 3 ) { // Four steps forward Joystick.pressButton(12); set_rotary = 12; encval_1 = 0; } else if( encval_1 < -3 ) { // Four steps backward Joystick.pressButton(13); set_rotary = 13; // Update counter_1 encval_1 = 0; } } // Encoder value static const int8_t enc_states[] = {0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0}; // Lookup table Same buttony działają według tego schematu, podpiete pod jednym pinem sprawdzam wartość ograniczając każdy następny 1k rezystorem. Nie bawiłem sie w wyliczenia by było idealnie podzielone na 1023/ ilość buttonów. Po prostu sprawdzałem odczyt i wpisywałem zakresy z marginesem kilku %. Niby jest ograniczenie że nie możemy kliknąć więcej niz jednego przycisku, ale w moim przypadku jeśli klikniemy "wyzszy wartością" przycisk i pozniej kolejny, to dostajemy wieloklik, więc częściowo działa. Dodatkowo kod starałem się tak napisać by buttony do mommentu puszczenia były na stałe wciśnięte i by nie "migotały". //BUTTONS value_buttons = analogRead(A3); rotary12pos2 = analogRead(A1); rotary12pos = analogRead(A2); //Serial.println(value_buttons); if (value_buttons > 815 && value_buttons < 820) { // Joystick.pressButton(0); // delay(button_delay); setbutton = 0; //Serial.println("Button1"); //Serial.println(value_buttons); } else if (value_buttons > 764 && value_buttons < 770) { // Joystick.pressButton(1); // delay(button_delay); setbutton = 1; //Serial.println("Button2"); //Serial.println(value_buttons); } else if (value_buttons > 677 && value_buttons < 683) { // Joystick.pressButton(2); // delay(button_delay); setbutton = 2; //Serial.println("Button3"); //Serial.println(value_buttons); } else if (value_buttons > 507 && value_buttons < 515) { // Joystick.pressButton(3); // delay(button_delay); setbutton = 3; //Serial.println("Button4"); //Serial.println(value_buttons); } else if (value_buttons < 2) { //Joystick.pressButton(4); // delay(button_delay); setbutton = 4; //Serial.println("Button5"); //Serial.println(value_buttons); } else if (value_buttons > 849 && value_buttons < 855) { //Joystick.pressButton(5); // delay(button_delay); setbutton = 5; //Serial.println("Button4"); //Serial.println(value_buttons); } else if (value_buttons > 873 && value_buttons < 880) { // Joystick.pressButton(6); // delay(button_delay); setbutton = 6; //Serial.println("Button4"); //Serial.println(value_buttons); } else if (value_buttons > 891 && value_buttons < 898) { // Joystick.pressButton(7); // delay(button_delay); setbutton = 7; //Serial.println("Button4"); //Serial.println(value_buttons); } else if (value_buttons > 904 && value_buttons < 912) { // Joystick.pressButton(8); // delay(button_delay); setbutton = 8; //Serial.println("Button4"); //Serial.println(value_buttons); } else if (value_buttons > 956 && value_buttons < 960) { // Joystick.pressButton(9); // delay(button_delay); setbutton = 9; //Serial.println("Button4"); //Serial.println(value_buttons); } else if (value_buttons > 918 && value_buttons < 923) { //Joystick.pressButton(10); // delay(button_delay); setbutton = 10; //Serial.println("Button4"); //Serial.println(value_buttons); } else if (value_buttons > 951 && value_buttons < 958) { //Joystick.pressButton(11); // delay(button_delay); setbutton = 11; //Serial.println("Button4"); } else if (value_buttons > 968 && value_buttons < 971) { //Joystick.pressButton(50); // delay(button_delay); setbutton = 50; } else if (value_buttons > 964 && value_buttons < 968) { //Joystick.pressButton(51); // delay(button_delay); setbutton = 51; } else if (value_buttons > 933 && value_buttons < 942) { setbutton = -1; Joystick.setHatSwitch(0, 0); delay(button_delay); setbutton = -1; } else if (value_buttons > 927 && value_buttons < 932) { setbutton = -1; Joystick.setHatSwitch(0, 90); delay(button_delay); } else if (value_buttons > 945 && value_buttons < 952) { setbutton = -1; Joystick.setHatSwitch(0, 180); delay(button_delay); } else if (value_buttons > 940 && value_buttons < 949) { setbutton = -1; Joystick.setHatSwitch(0, 270); delay(button_delay); } //Serial.println(value_buttons); if(value_buttons == 1023){ Joystick.setHatSwitch(0, -1); Joystick.setHatSwitch(0, -1); Joystick.setHatSwitch(0, -1); Joystick.setHatSwitch(0, -1); Joystick.setButton(setbutton,0); for(int i =0; i<12; i++){ Joystick.releaseButton(i); } Joystick.releaseButton(50); Joystick.releaseButton(51); setbutton = -1; } Joystick.setButton(setbutton,1); Niestety przy stałym sprawdzaniu enkoderów i buttonów było to za wolne by enkodery wyłapywały każdy obrót. Stwierdziłem że przez 90% czasu działania kodu bede sprawdzał enkodery, a przez reszte buttony które nie potrzebują aż takiej precyzji. unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; static int counter = 0; static bool flag = false; if (counter < firstPartDuration / 1) { // rotary encoders read_encoder_1(); read_encoder_2(); read_encoder_3(); read_encoder_4(); read_encoder_5(); read_encoder_6(); // If count has changed print the new value to serial if(set_rotary != -1){ delay(70); Joystick.setButton(set_rotary, 0); set_rotary = -1; } } else if (counter < (firstPartDuration + secondPartDuration) / 1) { // CHECK BUTTONS // CHECK ROT SWITCH POS } Dzięki temu w dowolnym momencie poruszając enkoderami, działają idealnie, bez debouncingu, i za każdym razem gdy je przekręce. Co bym zmienił w kolejnej wersji? Na pewno zrobił płytkę PCB z wszystkimi komponentami by podpiąć tylko kable. Projekt który wykonałem jest poniżej. Sama płytka jest dość uniwersalna. I w zalezności co podepniemy to zadziała. Dodatkowo dodałbym rev light za jeden pin do którego jest podpięty 12 rot pos Porównujac z kupną DIY którą miałem do tej pory, jest to spoooory przeskok 😄 Sama kierownica jest bardzo wygodna. Wytrzymała już 10h jeżdzenia na 6Nm kierownicy TS-PC. Nic sie nie rozpada. Jest lekki flex bardziej przez problemy z projektem który w ogóle nie polecam składać bo jest to mordęga. Nowa Stara, kupiona na OLX
  10. Witam. Od wielu lat udzielam się na https://www.forumfajerwerki.pl Animowałem tam kilka projektów amatorskich systemów pirotechnicznych. W założeniach miały one spełniać funkcję edukacyjną i poprawić bezpieczeństwo fanów fajerwerków. Były nawet dosyć popularne, powstało kilka ich zmodyfikowanych wersji, ale miały też pewne ograniczenia, głównie związane z programowaniem uC. Pomyślałem, że Arduino rozwiąże te problemy i do nowego projektu wybrałem Arduino Nano Every. Płytka PCB została zaprojektowana w KiCad, a kod dla Arduino powstał w Arduino IDE. Hardware jest dostępny jako open source, a program sterujący tym systemem jest freeware. Pliki projektu dostępne są w repozytorium na GitHub https://github.com/pyrobox/knk1303ar1 Płytka PCB została zaprojektowana pod elementy THT aby ułatwić montaż i eksperymenty. Niektóre elementy z PCB nie zostały jeszcze uwzględnione w kodzie np. LoRa E32TTL100 czy Ra-02. Kod jest dosyć obszerny więc został podzielony na kilkanaście plików .cpp i zawiera mi.in.: - obsługę transmisji szeregowej, odbiór i nadawanie, po magistrali RS485 - obróbkę odebranych danych, w tym np. analizę stringa, kalkulację CRC - obsługę wyświetlacza LCD 2x16 z konwerterem I2C, w tym menu na 3 przyciskach - pomiar napięcia DC za pomocą modułu ADS1115 - sterowanie przekaźnikami poprzez rejestry przesuwające 74595 - zapis i odczyt ustawień do/z EEPROM Zastosowanie przekaźników zostanie pewnie uznane za rozwiązanie archaiczne ale uważam, że są one bezpieczniejsze w amatorskich projektach tego typu urządzeń. Poza tym zakładam, ze pojawią się modyfikacje projektu, w których przekaźniki zostaną zastąpione przez MOSFETy. To jest mój pierwszy i na razie jedyny projekt z Arduino. Pewnie pełno w nim fuszerek, ale prototyp działa więc dla mnie jest ok 🙂 Wątek na forumfajerwerki.pl https://www.forumfajerwerki.pl/topic/9585-forumowy-projekt-opensource-systemu-pirotechnicznego/?do=findComment&comment=165880 Niestety dostęp do niego wymaga rejestracji na forum.
  11. Witam, piszę tu do was z prośbą o pomoc/radę w sprawie mojego mini projektu. Jestem początkującym w tworzenia elektroniki więc proszę o większą wyrozumiałość w kwestii specjalistycznego nazewnictwa. Celem projektu jest zamienienie podświetlenia przycisku zasilania na obudowie komputera na podświetlenie RGB zsynchronizowane z podświetleniem w obudowie. Sam przycisk ma trzy stany podświetlenia (świeci, mryga i nie świeci). Problem pojawia się, gdy chcemy “zsynchronizować” to z podświetleniem. Na płycie głównej mam trzy dostępne wyjścia: RGB, ARGB, POW-LED. (pin-out zamieszczam poniżej) RGB: 1 - 12v, 2 - G, 3 - R, 4 – B ARGB: 1 - 5v, 2 - Din, 3 - pusty, 4 - GND POW-LED: 1 - 5v, 2 – GND Początkowo zakładam nie korzystać z wyjścia ARGB z powodu większej złożoności tego rodzaju podświetlenia natomiast zostawiam tu informację o jego istnieniu. Schemat powinien realizować taką (pseudo) tablice boolowska: Legenda: IN – tablica stanów wejściowych OUT – tablica stanów wyjściowych PW – zasilanie 5v (POW-LED:1) LED – Czy podświetlenie obudowy się świeci? 12v – Czy na złączu RGB występuje zasilanie? PW LED – Czy przycisk się świeci? LED GRD – puszczenie “minusa” przez gniazdo RGB (RGB:2,3,4) PW GRD – puszczenie “minusa” przez gniazdo PW (POW-LED:2) Opis stanów: Nr.1 - PC włączony Nr.2 - PC wygaszony Nr.3 i 4 – PC uśpiony (przycisk mryga) Nr.5 - PC wyłączone Własnymi siłami doszedłem do takiego prototypu, ale nie jest on idealny. Nie spełnia bowiem przypadku Nr.2 z tablicy. Dostęp mam tylko do tego co jest podłączone do większej płytki stykowej (wyprowadzenia gniazd i diody). Mniejsza jest hipotetyczną implementacja sterowania oświetleniem na płycie głównej. Połączenie minusa pomiędzy płytkami jest nie potwierdzone (ale zakładam, że istnieje). Z braku istnienia modelu Diody RGB (wsp.Anoda) w programie użyłem trzech zwykłych na modelu. Napięcie 3v z baterii też jest umowne. Co do doboru rezystorów to jest to zrobione na oko (na razie) chodzi głównie o zasadę działania. Za wszelkie sugestie, pomysły i podpowiedzi będę bardzo wdzięczny. Ps. Niechciał bym używać w projekcie żadnych mikrokontrolerów typu Arduino itp.
  12. Cześć, przedstawiam projekt dla fanów drinków dla których zachowanie proporcji jest niezmiernie istotne. Postanowiłem, że robot będzie nalewał trzy różne substancje (jak na domowego barmana w zupełności wystarczy). Wykorzystałem w tym celu pompki membranowe, które są stosunkowo tanie, jednak warto użyć zaworów zwrotnych przy każdym z węży ponieważ "na postoju" nie są szczelne i ciecze powoli kapią z dysz robota. Przy innym projekcie zdarzyło mi się, że pompka była nieszczelna, więc w tym zamontowałem je w miejscu w którym ewentualny wyciek nie narobi szkód. We wcześniejszych konstrukcjach ustawiałem lanie zależne od zadanego czasu, jednak po testach (wspierając się wagą kuchenną) stwierdziłem, że odmierzane wartości nie są powtarzalne. Wtedy postanowiłem dodać wbudowaną wagę. Użyłem belki tensometrycznej do 1kg oraz wzmacniacza HX711. Robot zasilany jest zasilaczem wtykowym 12V a jego serce to Arduino Mega - ze względu na zapotrzebowanie na dużą liczbę wejść/wyjść. Do sterowania pompek użyłem gotowego Shielda - sterownika L293D – może sterować czterema silnikami DC i zajmuje mało miejsca w obudowie, a chciałem żeby konstrukcja była zwarta i jak najmniejsza. Początkowo użyłem wyświetlacza 2x16, jednak wyświetlane dane nie były tak przejrzyste, jakbym tego chciał więc zamontowałem wyświetlacz 4x16. Teraz każdy składnik ma swoją nieskróconą nazwę i ma swoją osobną linijkę. Wartości danych substancji ustawia się przy pomocy trzech potencjometrów. Wyskalowałem wartość każdego od 0 do 150g. W przypadku przekroczenia sumy trzech substancji powyżej 250g, zamontowane diody RGB świecą na czerwono (jest to tylko sygnał ostrzegawczy, nie blokuje nalewania). Diody te również „ubarwiają” proces tworzenia drinka (efekt widoczny na załączonym filmie). Po ustawieniu ulubionych proporcji wciskamy START i nalewanie odbywa się automatycznie, przed nalaniem każdego składnika waga samoczynnie się taruje. Można również korzystać z manualnego nalewania oraz tarowania, gdy stworzony drink nie spełnia wszystkich wymagań. Obudowę wydrukowałem na drukarce 3D. Składa się z wielu elementów, żeby był łatwiejszy dostęp do podzespołów oraz żeby pojedynczy wydruk krócej się drukował. Umieściłem z jednej strony okno rewizyjne żeby móc się w razie potrzeby podłączyć do Arduino. Części których użyłem do budowy robota: Arduino ATmega2560 - 1szt. wyświetlacz LCD 4x20 - Niebieski - ze sterownikiem kompatybilnym z HD44780 - QC2004A konwerter I2C do wyświetlacza LCD HD44780 wzmacniacz do belki tensometrycznej HX711 - 1szt. belka tensometryczna 1kg - 1szt pompa do cieczy 12V 110l/h - 7mm – 3szt moduł sterownika silnika L293 UNO MEGA shield - 1szt moduł diody RGB 5V - 2szt, wtyk DC 2,1/5,5mm z zaciskami skręcanymi – 1szt. gniazdo DC 2,1/5,5 do obudowy plastikowe -1szt. zasilacz wtyczkowy UMEC impulsowy 12V 30W 2,5A - 1szt. przełącznik kołyskowy 15x10mm – 1 szt przewody połączeniowe przycisk podświetlany - 1szt. przycisk okrągły monostabilny chwilowy czerwony - 4szt. potencjometr liniowy 1K – 3szt. .zawór zwrotny - 3szt. wężyk silikonowy 1,5m Oto kod, z którym się najdłużej męczyłem, ale działa 😉 #include <HX711.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> #include <AFMotor.h> #define I2C_ADDR 0x3F #define start 52 #define manpom1 50 #define manpom2 46 #define manpom3 44 #define tara 48 #define redl 24 #define bluel 22 #define greenl 26 #define redr 30 #define bluer 28 #define greenr 32 HX711 waga; LiquidCrystal_I2C lcd(I2C_ADDR, 2, 1, 0, 4, 5, 6, 7); int led = 13; float ciezar; int ml1 = 0; int ml2 = 0; int ml3 = 0; int czasMigania = 250; int predkoscNalewania = 200; char odczyt[8]; AF_DCMotor pompa1 (3); AF_DCMotor pompa2 (2); AF_DCMotor pompa3 (1); void setup() { Serial.begin(9600); pinMode(start, INPUT_PULLUP); pinMode(manpom1, INPUT_PULLUP); pinMode(manpom2, INPUT_PULLUP); pinMode(manpom3, INPUT_PULLUP); pinMode(tara, INPUT_PULLUP); pinMode(redl, OUTPUT); pinMode(bluel, OUTPUT); pinMode(greenl, OUTPUT); pinMode(redr, OUTPUT); pinMode(bluer, OUTPUT); pinMode(greenr, OUTPUT); lcd.begin(20, 4); lcd.setBacklightPin(3, POSITIVE); digitalWrite(led, HIGH); lcd.setBacklight(HIGH); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Witaj!"); lcd.setCursor(0, 1); lcd.print("Chlapnij sobie!"); lcd.setCursor(13, 3); lcd.print("Kasztan"); delay(1000); pinMode(led, OUTPUT); waga.begin(A1, A2); waga.set_scale(419341.0 / 200.0); waga.tare(5); pompa1.setSpeed(predkoscNalewania); pompa2.setSpeed(predkoscNalewania); pompa3.setSpeed(predkoscNalewania); } void loop() { pomiar(); ekran(); if ((ml1 + ml2 + ml3) > 250) { czerwona(); delay(500); ciemno (); } else { ciemno(); } if (digitalRead(start) == LOW) { waga.tare(); ekran(); Serial.println("zeruje"); if (ml1 >= 0) { waga.tare(10); pomiar(); ekran(); Serial.println("nalewam promile"); while (ciezar <= ml1) { pomiar(); ekran(); pompa1.run(FORWARD); led1(); } pompa1.run(RELEASE); Serial.println("promile przerwa"); delay(100); if (ml2 >= 0) { waga.tare(10); pomiar(); ekran(); Serial.println("nalewam rozcienczacz"); while (ciezar <= ml2) { pomiar(); ekran(); pompa2.run(FORWARD); led2(); } pompa2.run(RELEASE); Serial.println("rozcienczacz przerwa"); delay(100); if (ml3 >= 0) { waga.tare(10); pomiar(); ekran(); Serial.println("nalewam kwas"); while (ciezar <= ml3) { pomiar(); ekran(); pompa3.run(FORWARD); led3(); } pompa3.run(RELEASE); Serial.println("kwaas przerwa"); delay(100); } } } waga.tare(); pomiar(); kolorowo(); ciemno(); } if (digitalRead(manpom1) == LOW) { pompa1.run(FORWARD); led1(); } else { pompa1.run(RELEASE); } if (digitalRead(manpom2) == LOW) { pompa2.run(FORWARD); led2(); } else { pompa2.run(RELEASE); } if (digitalRead(manpom3) == LOW) { pompa3.run(FORWARD); led3(); } else { pompa3.run(RELEASE); } if (digitalRead(tara) == LOW) { waga.tare(10); } } void pomiar() { ml1 = analogRead(A5); ml1 = map(ml1, 1020, 0, 0, 150); ml2 = analogRead(A4); ml2 = map(ml2, 1020, 0, 0, 150); ml3 = analogRead(A3); ml3 = map(ml3, 1020, 0, 0, 150); ciezar = waga.get_units(); dtostrf(ciezar, 5, 0, odczyt); } void ekran() { lcd.clear(); lcd.setCursor(0, 0); lcd.print("1.Alkohol:"); lcd.print(ml1); lcd.setCursor(0, 1); lcd.print("2.Dodatek:"); lcd.print(ml2); lcd.setCursor(0, 2); lcd.print("3.Kwas:"); lcd.print(ml3); lcd.setCursor(0, 3); lcd.print("Waga:"); lcd.print(odczyt); lcd.print("g"); Serial.println(ml1); Serial.println(ciezar); } void ciemno() { digitalWrite(redl, LOW); digitalWrite(greenl, LOW); digitalWrite(bluel, LOW); digitalWrite(redr, LOW); digitalWrite(greenr, LOW); digitalWrite(bluer, LOW); } void czerwona () { digitalWrite(redl, HIGH); digitalWrite(greenl, LOW); digitalWrite(bluel, LOW); digitalWrite(redr, HIGH); digitalWrite(greenr, LOW); digitalWrite(bluer, LOW); } void zielona () { digitalWrite(redl, LOW); digitalWrite(greenl, HIGH); digitalWrite(bluel, LOW); digitalWrite(redr, LOW); digitalWrite(greenr, HIGH); digitalWrite(bluer, LOW); } void niebieska () { digitalWrite(redl, LOW); digitalWrite(greenl, LOW); digitalWrite(bluel, HIGH); digitalWrite(redr, LOW); digitalWrite(greenr, LOW); digitalWrite(bluer, HIGH); } void kolorowo () { digitalWrite(redl, HIGH); delay(czasMigania); digitalWrite(greenl, HIGH); delay(czasMigania); digitalWrite(bluel, HIGH); delay(czasMigania); digitalWrite(redr, HIGH); delay(czasMigania); digitalWrite(greenr, HIGH); delay(czasMigania); digitalWrite(bluer, HIGH); delay(czasMigania); delay(500); } void led1 () { digitalWrite(redl, HIGH); digitalWrite(greenl, HIGH); digitalWrite(bluel, LOW); digitalWrite(redr, HIGH); digitalWrite(greenr, HIGH); digitalWrite(bluer, LOW); } void led2 () { digitalWrite(redl, LOW); digitalWrite(greenl, HIGH); digitalWrite(bluel, HIGH); digitalWrite(redr, LOW); digitalWrite(greenr, HIGH); digitalWrite(bluer, HIGH); } void led3 () { digitalWrite(redl, HIGH); digitalWrite(greenl, LOW); digitalWrite(bluel, HIGH); digitalWrite(redr, HIGH); digitalWrite(greenr, LOW); digitalWrite(bluer, HIGH); } Link do filmu:
  13. import cv2 import pytesseract import time from pytesseract import Output def extract_license_plate(image_path): image = cv2.imread(image_path) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) blur = cv2.GaussianBlur(gray, (5, 5), 0) edges = cv2.Canny(blur, 100, 200) contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) contours = sorted(contours, key=cv2.contourArea, reverse=True)[:10] plate_text = None for contour in contours: peri = cv2.arcLength(contour, True) approx = cv2.approxPolyDP(contour, 0.018 * peri, True) if len(approx) == 4: x, y, w, h = cv2.boundingRect(approx) roi = image[y:y + h, x:x + w] plate_text = pytesseract.image_to_string(roi, config='--psm 8 --oem 3 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789') return ''.join(filter(str.isalnum, plate_text)) return "no text detected" cap=cv2.VideoCapture(0) try: while True: ret, frame = cap.read() if ret: cv2.imwrite('/home/marek/tablica.png',frame) print("Image saved") text = extract_license_plate('/home/marek/tablica.png') else: print("fail") if text is not None: print(f"Extracted Text: {text}") time.sleep(5) except Exception as e: print(f"An error occurred: {e}") finally: cap.release() print("Camera released.") Pracuję nad projektem systemu służącego do automatycznego otwierania bramy, w momencie rozpoznania przez kamerę z Raspberry Pi, numerów tablic rejestracyjnych zapisanych w pliku tekstowym. Jestem dość zielony w jakiekolwiek programy związane z systemami wizyjnymi i mocno posiłkowałem się ChatemGPT 4, wrzuciłem do chatu zdjęcia przypominające docelowy obraz z kamery i kazałem mu pod to napisać program. Program działa prawie idealnie kiedy zczytuje tablice z gotowych zdjęć, jednak gdy zdjęcia pochodzą z kamery i pokazuje przed nią dokładnie to samo zdjęcie tylko wydrukowane, program nie rozpoznaje żadnych znaków. Pytanie gdzie może leżeć problem, czy wpływ na to ma zbyt niska jakość obrazu z kamerki (używam kamery ZeroCam z przejściówka do Raspberry PI 3A+) , potencjalnie zły kąt zdjęcia przed kamerka czy może jakiś błąd w kodzie? Testuje działanie na załączonym obrazku Z góry dziękuje za pomoc, ewentualny namiar do kogoś kto mógłby pomóc :))
  14. Witam, chciałem zrobić wzmacniacz do projektu, znalazłem TL494 na internecie i okazało się że jest to popularny układ do wzmacniaczy klasy D. Więc zrobiłem go raz na płytce uniwersalnej i nic, teraz zrobiłem to samo ( bez mosfetów ) na płytce prototypowej i znowu nic. Sytuacja wygląda w ten sposób, wpinam się sygnałem audio z telefonu/modułu bluetooth, podłączam zasilanie, cisza, puszczam jakiś test prawa lewa strona na telefonie i napięcie na wyjściach które powinny iść na mosfety się nie zmienia. Jeden mosfet jest otwarty drugi zamknięty i tak cały czas. Nie ma jakiejkolwiek reakcji na sygnał wejściowy. Czy ktoś z was może mi powiedzieć co robie źle?
  15. Geneza Potrzebowałem programatora/debuggera do mikrokontrolerów z rdzeniami M0-M4 (oraz tymi nowszymi). Głównie STM32, ale RP2040 czy GD32 też warto by obsługiwał. Niestety JLink EDU (w pełnej wersji) nie jest już praktycznie dostępny, a BASE kosztuje raptem 2.5k PLN... Zdecydowanie za drogo. W związku z tym postanowiłem zlutować sobie BlackMagicProbe'a. Efekt Programator został zbudowany z THT, co bym nie musiał kupować zbyt dużo części (wszystko poza złączem IDC10 było w szufladzie). Lista elementów STM32F401CCU6 "Black Pill" - rdzeń, wraz z wgranym skompilowanym oprogramowaniem 😉 (Aż musiałem stawiać maszynę na linuxie by to ogarnąć). 2x TXS0108EPWR - moduł dwukierunkowego konwertera poziomów logicznych 1x AMS1117-1.5V - LDO 2x Kondensator 10uF THT (25V) 1x Kondensator 100nF THT 4x Rezystor 220-470R 0.25W (zalecane 1%) 5x Rezystor 100R 0.25W (zalecane 1%) 1x Rezystor 10K 0.25W (zalecane 1%) 4x LED (biała, niebieska, czerwona, zielona). Kolory wedle uznania 😉 1x Złącze IDC proste, 10 pin (2x5). W sumie chcąc kupić wszystkie elementy wychodzi ok. 100-120 PLN. Test w działaniu Po podłączeniu Raspberry Pi Pico (tylko ten mikrokontroler miałem zlutowany z wejściem SWD) do programatora i podłączeniu wszystkiego do zasilania odpaliłem GDB, by przetestować działanie. Jak widać na załączonym obrazku programator znalazł RP2040. Programowanie również działa (tego nie załączyłem na obrazku). Parametry techniczne Wymiary: nieco za duży 😉 95x80mm. Płytka dwuwarstwowa. Czy można zlutować ręcznie (lutownicą kolbową): tak Koszt/cena komponentów: ok. 100-120 PLN Obsługiwane mikrokontrolery: praktycznie każdy ARM... Ciągle dodają nowe do BlackMagic'a. Obsługiwane napięcie MCU: 1.65-5V (stąd konwertery poziomów logicznych) Zasilanie: złącze USB-C Pliki projektowe (EasyEDA STD + Firmware 1.10rc1), schemat, PCB PCB nie do końca zostało zrobione zgodnie z regułami, aczkolwiek to tylko prototyp (myślę zrobić lepszą aka. mniejszą wersję na bazie SMD z pełnym złączem 26-pin, 10-pin Cortex oraz 10-pin Segger... I prawdopodobnie złączem 4-pin tylko do SWD 😄 Co by potem nie bawić się z kabelkami. Pliki PCB.zip - do przeróbek 😉 EasyEDA STD (oraz Firmware) PCB Gerber.zip - do zamówienia, gdyby ktoś chciał taką samą sztukę (wersja SMD będzie dużo trudniejsza do zlutowania) Appendix Wszelkie uwagi mile widziane 😉 (pomijając porty masowe skierowane w górę, to był bardzo szybki prototyp, który był potrzebny ASAP).
  16. Witam, posiadam dodatkowy wentylator od komputera (https://www.x-kom.pl/p/1131748-wentylator-do-komputera-endorfy-stratus-120-pwm-argb-120mm.html?gclid=Cj0KCQjw0bunBhD9ARIsAAZl0E17QlbeqJtevHRTiTL8x16SQjVjJxtv2IF8n47ChcsvsJAKe0gPOYgaAq8xEALw_wcB) Chciałbym podłączyć go do arduino uno R3, niestety nie wiem jak się za to zabrać. Nie mam pojęcia za co są odpowiedzialne piny wentylatora (4 piny) a tym bardziej RGB (3piny), bo w sieci znajduje tylko 4 pinowe RGB. Jeśli macie pomysł jak zabrać się za ten projekt to będę wdzięczny za odpowiedź.
  17. Jak w temacie, buduję dla kogoś stację pogodową, taką max wypasiona z wieloma czujnikami. Ponieważ hardware już mam prawie ukończony, soft odczytuje te dane i teraz, poszukuję serwisu na który mógłbym to wszystko wysłać: stacja jest wyposażona w czujnik siły i kierunku wiatru, sumy opadów deszczu, detektor wyładowań atmosferycznych, czujnik temperatury, ciśnienia, wilgotności, indeksu UV, oraz pyłów. Co rozumiem pod pojęciem przyjaznego API? To że mam zerowe pojęcie o web app i fajnie by było gdyby był konfigurator 🙂
  18. Witam wszystkich, Dawno mnie tu nie było, praca, studia itp. W końcu znalazłem coś czasu, aby przedstawić projekt już chyba ostatni mojej kierownicy, który wykonałem w ramach pracy inżynierskiej na kierunku Mechatronika. Projekt od wcześniejszych pod względem elektroniki znacznie się nie różni jedyne co to został zastosowany inny enkoder oraz silnik DC co opisze w dalszej części postu. A więc tak: Główne założenia projektu: Wykorzystanie mikrokontrolera Arduino Leonardo do sterowania urządzeniem, Użycie enkodera OMRON E6B2-CWZ6C do odczytu położenia kierownicy, Wykorzystanie silnika DC ZY6812 oraz sterownika silnika IBT_2 do wytworzenia siły zwrotnej tzw. force feedback, Wykonanie mechanizmu, który ma za zadanie przekazać informację na temat zachowania się kierownicy podczas jazdy w symulatorze wyścigów samochodowych, oraz innych grach czy symulatorach samochodowych, Wykonanie większości elementów konstrukcji w technologii druku 3D przy użyciu materiału PETG, Wykonanie wałka głównego łączącego enkoder, koło kierownicy, oraz przekładnię za pomocą obróbki skrawaniem na maszynie sterowanej numerycznie CNC z pręta aluminiowego o średnicy Ø60mm oraz oznaczeniu PA6/EN AW 2017, Wykonanie estetycznej oraz w pełni funkcjonalnej obudowy urządzenia, Wykorzystanie sportowego koła kierownicy wraz z zaczepem quick release, Zasilanie urządzenia zasilaczem ADLS-360-24, Możliwość dołączenia dodatkowych elementów takich jak: pedał gazu, hamulca, sprzęgła, hamulec ręczny, skrzyni biegów poprzez gniazda RJ 45 z tyłu obudowy. Większość układu elektroniki została opisana we wcześniejszych moich postach, więc jeżeli jest ktoś zainteresowany to zapraszam do odwiedzenia ich, natomiast tutaj dodam kilka zdjęć przedstawiających wykonane urządzenie oraz film, który również prezentuje urządzenie oraz jego działanie. Link do filmu :
  19. Zaczynam dopiero przygodę z elektroniką, ale podjąłem pierwsze kroki w tym kierunku z pewnym wyobrażeniem tego, jaki jest mój punkt dojścia. Otóż od dawna fascynuje mnie magiczny świat radia, dźwięku i krótkofalarstwa, ogólnie wszystkiego co łączy się z eterem. Moja praktyczno-techniczna wiedza w tym temacie jest jednak dosyć ograniczona i nigdy nie miałem możliwości się nim zająć na poważnie, dlatego postanowiłem uporządkować sobie wszystko od podstaw robiąc kursy z forbota i eksperymentując z fizyczną elektrotechniką. Ostatecznie jednak chciałbym być w stanie zbudować i naprawiać radioodbiorniki, budować własny sprzęt do łączności, posiąść odpowiednią wiedzę na te tematy, zgromadzić niezbędny sprzęt. Oczywiście są to cele dalekosiężne. Ponieważ jednak nie widziałem na forum wielu wątków związanych z tym tematem, chciałem zapytać bardziej doświadczonych kolegów (i koleżanki) o pokierowanie na początek. Czy może ktoś polecić dobre publikacje, mogą być klasyczne i stare? Może jakieś projekty do których można się przymierzyć na początek, bądź inne inspirujące realizacje? Jeśli temat był już poruszany będę zobowiązany za przekierowanie.
  20. Witam, składam właśnie nowy komputer, zauważyłem, że na mojej płycie głównej są złącza, które powinienem podłączyć do speakera na front panelu w obudowie, te złącza to: - +5V - GND - GND - Speaker Niestety moja obudowa nie posiada speakera. Czy mogę podłączyć najzwyklejszy buzzer używany m.in. w Arduino? Taki buzzer ma złącza GND oraz +5V. Do czego służy to złącze speaker oraz jeśli mogę zrobić takie połączenie to czy potrzebuję rezystora, jeśli tak to o jakiej mocy? Bardzo dziękuję za każdą odpowiedź, Pozdrawiam
  21. Budowa tego projektu zaczęła się od tego, że znajomy zapytał, czy bym czegoś nie wymyślił, ponieważ on posiada w domu piec na ekogroszek z zasobnikiem na węgiel i czasem zapomina dosypywać węgla i gaśnie mu w piecu. Wykonałem więc nadajnik z ultradźwiękowym czujnikiem odległości HC-SR04 , który przekazuje dane do odbiornika bezprzewodowo za pomocą modułu nRF24L01. Gotowy odbiornik i nadajnik wygląda tak, jak na zdjęciu niżej. Do budowy wykorzystałem: Dwie sztuki Arduino Pro Mini 328 - 5V/16MHz Dwie sztuki moduł radiowy nRF24L01 Ultradźwiękowy czujnik odległości HC-SR04 Buzzer z generatorem 5V 12mm Zestaw diod LED 5mm Rezystory 100 ohm, 110 ohm i 190 ohm Dwie sztuki Stabilizator LDO 3,3V Dwie sztuki Kondensator elektrolityczny 10uF/50V Dwie sztuki Zasilacz impulsowy 5V / 1,2A Obudowy plastikowe Całość zmontowałem na płytkach z OSH Park MySensor 3.3V Pro Mini or 5V Pro Mini Diody LED i buzzer zamontowałem na płytce uniwersalnej. Schemat nadajnika. Schemat odbiornika. Kod programu Arduino nadajnika. #include <SPI.h> #include "RF24.h" int msg[1]; const uint64_t pipe = 0xF0F0F0F0A1LL; RF24 radio(9,10); #define trigPin 3 #define echoPin 4 void setup(){ Serial.begin (9600); pinMode(trigPin, OUTPUT); //Pin, do którego podłączymy trig jako wyjście pinMode(echoPin, INPUT); //a echo, jako wejście radio.begin(); radio.openWritingPipe(pipe); radio.setPALevel(RF24_PA_MAX); //Maxymalna moc nadajnika } void loop(){ long czas, dystans; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); czas = pulseIn(echoPin, HIGH); dystans = czas / 58; Serial.print(dystans); Serial.println(" cm"); msg[0] = dystans; radio.write(msg, 1); // Wysylanie wartosci ze zmiennej msg delay(500); } Kod programu do odbiornika. #include <SPI.h> #include "RF24.h" const uint64_t pipe = 0xF0F0F0F0A1LL; RF24 radio(9,10); int msg[1]; void setup(){ //Serial.begin (9600); pinMode(3, OUTPUT); //led czerwona pinMode(4, OUTPUT); //led zolta pinMode(5, OUTPUT); //led pierwsza zielona pinMode(6, OUTPUT); //led druga zielona pinMode(7, OUTPUT); //led trzecia zielona pinMode(8, OUTPUT); // buzer radio.begin(); radio.openReadingPipe(1,pipe); radio.startListening(); } void loop(){ if(radio.available()){ radio.read(msg, 1); Serial.print(msg[0]); Serial.println(" cm"); if (msg[0] >= 57) { //odlegolsc max kiedy wlacza sie buzer digitalWrite(3, HIGH); digitalWrite(4, LOW); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(8, HIGH); delay(5000); digitalWrite(3, HIGH); digitalWrite(4, LOW); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(8, LOW); delay(1800000); } else { digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, HIGH); digitalWrite(8, LOW); } if (msg[0] >= 43 && msg[0] <57) { digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(8, LOW); } if (msg[0] >= 29 && msg[0] < 43) { digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(8, LOW); } if (msg[0] >= 15 && msg[0] < 29) { digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, LOW); digitalWrite(8, LOW); } if (msg[0] >= 15 && msg[0] < 2) { digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, HIGH); digitalWrite(8, LOW); } } delay(500); } Kod programu odbiornika, jest napisany tak, że gdy poziom węgla spadnie do 57 cm od góry, włącza się buzer na 5 sekund i świeci czerwona dioda i jeżeli nie dosypiemy węgla, buzer włączy się znowu za pół godziny na 5 sekund, po dosypaniu węgla trzeba nacisnąć przycisk reset, który wyprowadziłem za pomocą przycisku na obudowie lub odczekać pół godziny. Zasobnik na węgiel wygląda tak. Zmontowany nadajnik z ultradźwiękowym czujnikiem odległości HC-SR04. Nadajnik jest zamontowany na górze metalowego zasobnika na węgiel, przed montażem zostały wywiercone 2 otwory w zasobniku, tak aby pasowały wystające okrągłe elementy czujnika HC-SR04. Zmontowany układ na płytce MySensors dostępnej w OSH Park, długość to około 10 cm. Ponieważ zastosowałem 5 diod, które informują o stanie węgla, to 57 cm podzieliłem na 4, co daje około 14 cm i gdy poziom węgla spadnie o 14 cm gasną kolejne diody, aż do 57 cm i wtedy świeci się czerwona dioda i włącza buzer na 5 sekund. Program możemy dowolnie modyfikować, aby dostosować do wysokości pojemnika na węgiel. Działanie całości widać na poniższym filmie. Całość działa już 2 lata bez awarii i na czas dosypywania ekogroszku, nadajnik jest zdejmowany i czasem przedmuchany z pyłu.
  22. Ostatnio zacząłem projektowanie miotacza ognia zasilanego pompą do paliwa, nie znam zbytnio się na elektryce ale to by było najlepsze dla mnie rozwiązanie
  23. Kolega modernizując u siebie w mieszkaniu system ogrzewania poprosił mnie o wykonanie jakiegoś sterownika do pieca CO wraz ze sterowaniem dmuchawy. Tak powstał niewielki regulator, który miał mieć na celu prostotę i czytelność. Główne elementy użyte do budowy sterownika to: LCD 2x16 HD44780 ATMEGA8 - zastosowany procesor DS18B20 - czujnik mierzący temperaturę na piecu przekaźnik na 5V taki jak tutaj: przekaźnik Głównym zadaniem jest uruchamianie pompy obiegowej na podstawie zadanej temperatury na piecu. Dodatkową funkcją jest tryb rozpalania, który w początkowej fazie uruchamia dmuchawę. Jest to bardzo przydatna opcja, przyspieszająca proces rozpalania w piecu. Sterowanie jest bardzo proste, odbywa się z wykorzystaniem tylko trzech przycisków. W podstawowym widoku regulujemy zadaną temperaturę na piecu, która decyduje o tym czy pompa ma zacząć pracować czy nie. Regulator jest prostą nastawą z histerezą. Po wejściu w menu możemy dodatkowo zmienić: temperaturę wyłączenia dmuchawy. Jeżeli piec jest zimny i włączymy opcję rozpalania to po osiągnięciu już stosunkowo niewielkiej temperatury dmuchawa zostanie wyłączona histerezę pracy regulatora maksymalne czasy pracy pompy i dmuchawy Wszystko zostało zamknięte w obudowie natynkowej, a sterownik umieszczony obok pieca w pomieszczeniu gospodarczym. Układ składa się z dwóch płytek rozdzielając część wysokiego napięcia i sterowania. Zdecydowałem się na umieszczenie kompletnego zasilania w urządzeniu, transformator, bezpiecznik i kilka dodatkowych elementów. Powodem tego było to, że sterownik jest używany przez kogoś innego a dołączany zasilacz może się zgubić i wtedy nie mam kontroli na tym jaki zamiennik zostanie użyty. Tutaj jest pokazany schemat i wzór płytki: Płytka została wykonana w domowych warunkach metodą żelazkową. Dla poprawy czytelności wykorzystałem możliwość definiowania własnych znaków co pozwoliło uzyskać duże cyfry widoczne z daleka. Niżej pokazuje jak uzyskać takie efekt. - najpierw musimy zdefiniować poszczególne elementy cyfr i ładujemy je do pamięci wyświetlacza uint8_t BigDigitDefChar[][8] = { {15,7,32,32,32,32,3,7}, {32,32,32,32,32,32,7,15}, {28,30,30,30,30,30,30,28}, {7,15,15,15,15,15,15,7}, {31,31,32,32,32,32,32,32}, {32,32,32,32,32,32,31,31}, {31,31,32,32,32,32,31,31}, {30,28,32,32,32,32,24,28} }; for(uint8_t i=0;i<8;i++) lcd_defchar(i,BigDigitDefChar[i]); - następnie tworzymy tablicę która poskleja nam te segmenty w cyfry char* BigDigit[][2]={ {"\x83\x84\x82","\x83\x85\x82"}, //0 {" \x82"," \x82"}, //1 {"\x80\x86\x82","\x83\x85\x85"}, //2 {"\x80\x86\x82","\x81\x85\x82"}, //3 {"\x83\x85\x82"," \x82"}, //4 {"\x83\x86\x87","\x81\x85\x82"}, //5 {"\x83\x86\x87","\x83\x85\x82"}, //6 {"\x83\x84\x82"," \x82"}, //7 {"\x83\x86\x82","\x83\x85\x82"}, //8 {"\x83\x86\x82","\x81\x85\x82"} //9 }; - teraz już tylko wystarczy użyć odpowiedniej funkcji do wyświetlania. Funkcja ta korzysta z obsługi R/W i odczytuje stan busy flag co pozwala na odczytanie pozycji kursora. Jeśli ktoś będzie chciał podłączyć R/W do GND to musi przerobić tą funkcję tak aby przekazać do niej pozycję kursora void lcd_big_int(int val) { uint8_t pp,x,y; char bufor[17]; char *wsk=itoa(val, bufor, 10); //zamieniamy całą liczbę na pojedyncze znaki ACSII np. 1234 -> '1','2','3','4' register uint8_t znak; while ( (znak=*(wsk++)) ) //pętla jest powtarzana po wszystkich indeksach tablicy bufor, aż napotka '\0' { pp = check_BF() & 0b01111111; //odczytujemy aktualną pozycję kursora - busy flag wyświetlacza y = pp & 0xF0; //wyodrębniamy nr wiersza x = pp & 0x0F; //wyodrębniamy pozycję x znak -= 0x30; //zamieniamy kod ascii na rzeczywistą wartość dziesiętną np '7' -> 7; będzie to nasz indeks do tablicy lcd_str(BigDigit[znak][0]); //ładujemy na wyświetlacz górną część cyfry lcd_write_cmd( (0x80 + y + 0x40 + x) ); //wracamy kursorem na domyślną pozycję x, ale o jeden wiersz niżej lcd_str(BigDigit[znak][1]); //ładujemy na wyświetlacz dolną część cyfry lcd_write_cmd( (0x80 + y + x + 0x03) ); //ustawiamy kursor zaraz za cyfrą w wierszu domyślnym, czyli takim w którym wywołano funkcję } } uint8_t check_BF(void) { CLR_RS; return _lcd_read_byte(); } Jest to prosty sposób na bardzo fajne wyświetlanie liczb, które są widoczne z daleka.
  24. Cyfrowa stacja lutownicza Jest to mój 2 prolekt po 12 letniej przerwie z elektroniką. Była to okazja do poznania Eagle oraz podstaw programowania mikroprocesorów. Obecnie wiele rzeczy bym poprawił i docelowo tak się chyba stanie. Działanie stacji oceniam bardzo pozytywnie. Obecnie mam 3 stacje lutownicze, więc już mogę coś na ten temat napisać ale to już dłuższy temat. Projekt polecam wszystkim, którzy mają niewykorzystane trafo 2x12V 60VA (minimum) oraz LCD1602 i procesor Atmega8. Są to chyba 3 najdroższe elementy (pomijając kolbę 907A, którą przez internet można kupić poniżej 30zł z kosztami wysyłki). Docelowo schemat podzieliłem na 2 zasadnicze części: 1. Płytka zasilająca 2.Płytka sterowania Wzory płytek w Eagle standardowo dostępne są w załączniku. A tutaj jeszcze foto gotowych płytek: Aby ułatwić możliwość wymiany procesora i wzmacniacza operacyjnego, zostały one umieszczone w podstawkach. Płytka sterująca oraz płytka zasilająca zostały połączone za pomocą złącza goldpin. Obudowa została wykonana z płyt meblowych oklejonych fornirem dębowym. Dodatkowo składałem dla znajomego CNC z chin i w ramach testów wykonałem panel przedni oraz tylni na tym CNC (materiał to 1,5mm blacha aluminiowa). Efekty pracy widać na poniższych zdjęciach: Zasilanie 230V trafia na gniazdo komputerowe oraz włącznik (pozyskane z zasilacza ATX). Następnie mamy bezpiecznik szklany i transformator toroidalny 50VA 2x12V. Transformator miał wymienione uzwojenia wtórne. Miałem transformator z tylko jednym uzwojeniem o napięciu 10,5V, więc od nowa zostały nawinięte uzwojenia 2x12V. Takie napięcia są wprowadzone zgodnie z zamieszczonym schematem na płytkę zasilającą. Zastosowałem najprostszą kolbę 907A z termoparą. Wykorzystałem dostępne w sieci oprogramowanie stacji lutowniczej RL-1 zawierające algorytm PID do sterowania grzałką. Konstrukcja nie jest pozbawiona wad: Obudowa nie jest dokładnie spasowana z panelami czołowym i tylnym (miała być tymczasowa, a wyszło jak zwykle). Słaby obieg powietrza w obudowie (pomimo tego faktu nic się nie przegrzewa przy długiej pracy. Oto film prezentujący rozgrzewanie grota od temperatury 38 stopni do 320 stopni: Już w 22 sekundzie grzałka osiąga temperaturę zadaną. Od 35 sekundy przykładam do grota cynę o grubości 0,7mm. Cyna zaczyna się topić ok. 50 sekundy. Temperatura grota została zestrojona ze wskazaniem stacji za pomocą termopary i procedury opisanej w dokumentacji stacji RL-1 (w załączniku AVT987). A to obecnie przeze mnie posiadane stacje lutownicze: Jak już wcześniej wspomniałem, wykonałbym kilka zmian. Najważniejsza to zmniejszenie wymiarów stacji. Trafo zajmuje 1/3-1/4 obudowy. Obecnie całość znalazłaby się na jednym PCB, wszystkie elementy SMD, cała stacja zmieściłaby się za LCD. Do tego trafo i wymiar całości zmniejszony minimum o połowę. Poza tym, prócz najdłuższego rozgrzewania i braku mocy przy lutowaniu dużych pól masy stacja działa nad wyraz dobrze. EAGLE_Moja stacja lutownicza.zip AVT987.pdf Cyfrowa_Stacja_Lutownicza_RL1 - do wgrania.zip Cyfrowa_Stacja_Lutownicza_RL1 - edytowalne oprogramowanie.zip Cyfrowa stacja lutownicza RL1.zip
  25. Witam, mój system powstał z praktycznej potrzeby zautomatyzowania systemu podlewania i w celu rozpoczęcia przygody z elektroniką – wyszedłem z założenia, że jak teraz nie zrozumiem, jak działa to wszystko co jest dookoła, to za chwilę będzie to tak złożone, że nie zdążę już tego zrozumieć 🙂 I generalnie myślę, że się udało – zrobiłem dokładnie to, co zamierzałem i w dodatku działa 🙂 OPIS DZIAŁANIA SYSTEMU System w założeniu miał być jak najprostszy (tzn. działać przy jak najmniejszej potrzebie ingerencji człowieka w porównaniu do skomplikowanych systemów programowalnych, które są na rynku). Steruje on trzema liniami rozprowadzonymi w ogrodzie: woda w kranach, zraszacze trawników, linie kroplujące. Sterowanie odbywa się za pomocą elektrozaworów zasilanych z przekaźników (moduł 4 przekaźników). Przekaźnikami steruje Arduino na podstawie: włączenia/wyłączenia przełącznika, upłynięcia maksymalnego czasu określonego dla każdej linii (po upłynięciu tego czasu zawór zostaje zamknięty). System jest zasilany wodą z zestawu hydroforowego (żeby było odpowiednie ciśnienie), który pobiera wodę z ze zbiornika na deszczówkę (ZBIORNIK 1). Ponieważ nie jest on zbyt duży (3 m3) to istniała konieczność dopompowywania wody z drugiego zbiornika na deszczówkę (ten już ma 12 m3). Moje rozwiązanie opiera się na zamontowaniu w zbiorniku 1 dwóch czujników poziomu cieczy i pozwala na automatyczne dopompowywanie wody ze zbiornika 2 do zbiornika 1, gdy w tym poziom spadnie poniżej dolnego czujnika. Pompa, która jest w zbiorniku 2 wyłącza się, gdy poziom w zbiorniku 1 podniesie się powyżej górnego czujnika. REALIZACJA Do sterowania zaworami wykorzystałem Arduino. Początkowo plan był taki, żeby wszystko zrobić bez mikrokontrolera. Jednak Arduino jest mi potrzebne w drugiej wersji urządzenia (już się buduje), o której napisze poniżej. Na czystej elektronice (bez programowania) oparłem moduł sygnalizacji poziomu i uzupełniania wody w zbiorniku. Bazując na dwóch czujnikach poziomu wody mogę określić trzy stany wody w zbiorniku: niski, średni, wysoki. Zależało mi, żeby pompa uzupełniająca wodę zaczynała pompować, gdy woda w zbiorniku osiągnie poziom niski, a kończyła, gdy osiągnie stan wysoki. Poprzez umieszczenie czujników jak najdalej od siebie, uzyskałem samoczynne uzupełnianie zbiornika. Do tego wykorzystałem dwa układy scalone: bramkę OR oraz NAND co pozwoliło zastosować trzy diody oznaczające poziom wody. Logika włączania tych diod jest następująca: Bramkę NAND wykorzystałem dodatkowo jako przerzutnik bistabilny, który pamięta czy pompa jest włączona, czy wyłączona. Oto płytka sporządzona samodzielnie na potrzeby projektu: KONSTRUKCJA Całe urządzenie udało się zamknąć w standardowej obudowie hermetycznej z wyprowadzeniem przewodów do zasilania, podłączenia zaworów, czujników poziomu wody i przewodu sterującego pompą. Do wykonanie „wtyczek” do zaworów wykorzystałem tworzywo, które mięknie w 60 stopniach i w ciepłej wodzie robi się plastyczne – można wszystko ulepić. Chodziło o to, że przy zaworach, jak najbliżej, powinny się znaleźć diody prostownicze i dlatego zrobiłem wtyczki z zatopionymi diodami. Jest to bardzo wygodne przy rozmontowywaniu systemu na zimę. Działanie systemu widać na poniższym filmie (na uchwycie wiszą czujniki poziomu wody). System działał już jeden sezon, także jest sprawdzony. PLANY NA PRZYSZŁOŚĆ Druga wersja urządzenia będzie miała dołączone czujniki deszczu i wilgotności gleby, będą pobierane komunikaty pogodowe z lotniska i będzie sterowanie zaworami przez wifi z telefonu. Chcę także dodać obsługę kalendarza do określenia czasu godziny, gdy system ma się włączać. Długość podlewania będzie sterowana czujnikami wilgotności i deszczu a włączenie podlewania uzależnione od przewidywanej pogody. Myślę, że więcej do systemu podlewania nie jest potrzebne. Musze powiedzieć, że budowa tego urządzenia dała mi wiele satysfakcji, bo nie zajmuję się zawodowo elektroniką ani programowaniem. Chciałbym szczególnie podziękować Trekerowi za kursy, dzięki którym było łatwo zacząć przygodę z elektroniką oraz Markowi za cenne uwagi i przekazaną wiedzę.
×
×
  • 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.