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

  1. 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.
  2. 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
  3. 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 :))
  4. 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?
  5. 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).
  6. 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:
  7. 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ź.
  8. 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 🙂
  9. 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 :
  10. 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.
  11. 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
  12. 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.
  13. 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
  14. 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.
  15. 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
  16. 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ę.
  17. Dzień dobry, załączyłem tutaj pewien schemat, który samodzielnie stworzyłem i nie wiem, czy jest on poprawnie zrobiony. Mam silniczek i baterię 9V - chcę stworzyć układ, w którym potencjometr będzie regulował prędkość obrotów silniczka. Dodatkowo chcę dołożyć rezystor oraz zieloną diodę LED, pokazyjącą z jaką mocą pracuje silnik (jasność diody). Nie wiem, czy taki układ zadziała prawidłowo. Czy dioda nie zabierze napięcia silniczkowi, który nie będzie pracował z najwyższą mocą? Z góry dziękuję.
  18. Cześć, przedstawiam projekt, który umożliwia szybkie rozlewanie "cieczy" do kieliszków przy zachowaniu niezbędnej precyzji 😉 Nie jest to mój pierwszy robot tego typu, jednak świat idzie do przodu i wymagania przeciętnego Kowalskiego są coraz bardziej wyśrubowane. Za dużo, za mało, znowu się rozlało... Do tego robota można podłączyć cztery różne substancje, bądź zwyczajnie wszystkie wężyki włożyć do jednej butelki. Rozlewanie na poszczególnych podstawkach odbywa się niezależnie. Każde "stanowisko" jest oznaczona numerem i na każdym z nich można ustawić ilość płynu w gramach przy pomocy potencjometrów. Pod każdą podstawką zamontowana jest belka tensometryczna dzięki której mamy nalane tyle ile chcieliśmy. Jeżeli jednak stwierdzimy w trakcie, że z pewnych względów mamy już dosyć, wystarczy unieść kieliszek do góry, a robot zakończy proces nalewania. Przy kładzeniu "naczynia" również nie trzeba się stresować, ponieważ nalewanie rozpoczyna się dopiero po 3 sekundach. Tak samo po uniesieniu kieliszka przerywamy cykl nalewania. Chciałem żeby robot był możliwie jak najmniejszy i (z niemałymi problemami z upychaniem podzespołów) nawet się to udało. Części których użyłem do budowy: - arduino ATmega2560 – 1 szt. - shield dla Mega2560 Expansion Sensor Board v2.0 – 1 szt. - wyświetlacz LCD 4x20 - ze sterownikiem kompatybilnym z HD44780 – 1 szt. - konwerter I2C do wyświetlacza LCD HD44780 – 1 szt. - wzmacniacz do belki tensometrycznej HX711 - 4szt. - belka tensometryczna 1kg – 4 szt. - moduł sterownika L298N do silników DC – 2 szt. - mini Pompa Perystaltyczna - DC 3.7V / 6V – 4 szt. - potencjometr liniowy 1K – 4 szt. - wtyk DC 2,1/5,5mm z zaciskami skręcanymi – 1 szt. - gniazdo DC 2,1/5,5 do obudowy plastikowe -1szt. - Przełącznik kołyskowy – 1 szt. - Moduł z diodą LED RGB – 4 szt. - Przewody połączeniowe - zasilacz wtyczkowy UMEC impulsowy 12V 30W 2,5A – 1 szt. - ŁĄCZNIK PROSTY plastikowy ZŁĄCZKA POM wąż 4mm – 8 szt. - ŁĄCZNIK TRÓJNIK T plastikowy POM do węża 4mm – 4 szt. - WĄŻ SILIKONOWY 6x4mm SILIKON wężyk przewód 6/4mm – 3 m - trochę śrubek i nakrętek M3, M4 Elementy do druku: 1. dekiel – 1 szt. 2. górna osłona – 1 szt. 3. górna pokrywa – 1 szt. 4. górny korpus – 1 szt. 5. korpus – 1 szt. 6. mocowanie ekranu – 2 szt. 7. mocowanie hx711 – 1 szt. 8. mocowanie pompek – 1 szt. 9. osłona belki tensometrycznej 1 – 1 szt. 10. osłona belki tensometrycznej 2 – 1 szt. 11. osłona belki tensometrycznej 3 – 1 szt. 12. osłona belki tensometrycznej 4 – 1 szt. 13. osłona ekranu – 1 szt. 14. podstawa – 1 szt. 15. podstawka pod arduino mega – 1 szt. 16. podstawka pod kieliszek – 4 szt. 17. pokrętło1 – 1 szt. 18. pokrętło2 – 1 szt. 19. pokrętło3 – 1 szt. 20. pokrętło4 – 1 szt. 21. przednia pokrywa – 1 szt. 22. tylny dekiel – 1 szt. 23. tył góry – 1 szt. Do druku 4 kieliszki z waga.rar Schemat połączeń: Kod do robota: #include <HX711.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> #define I2C_ADDR 0x27 #define red1 22 #define green1 23 #define blue1 24 #define red2 26 #define green2 27 #define blue2 28 #define red3 14 #define green3 15 #define blue3 16 #define red4 38 #define green4 39 #define blue4 40 #define pompastart1 1 #define pompalewo1 34 #define pompaprawo1 35 #define pompastart2 13 #define pompalewo2 11 #define pompaprawo2 10 #define pompastart3 0 #define pompalewo3 36 #define pompaprawo3 37 #define pompastart4 12 #define pompalewo4 9 #define pompaprawo4 8 int stan_tara = 0; int lanie1 = 0; int stan_ciezar1 = 0; int stan_lanie1 = 0; int lanie2 = 0; int stan_ciezar2 = 0; int stan_lanie2 = 0; int lanie3 = 0; int stan_ciezar3 = 0; int stan_lanie3 = 0; int lanie4 = 0; int stan_ciezar4 = 0; int stan_lanie4 = 0; float procent1; char procent1_fin[8]; float procent2; char procent2_fin[8]; float procent3; char procent3_fin[8]; float procent4; char procent4_fin[8]; int ml1; float ml11; char ml111[8]; int ml2; float ml22; char ml222[8]; int ml3; float ml33; char ml333[8]; int ml4; float ml44; char ml444[8]; HX711 waga1; float ciezar1; char odczyt1[8]; HX711 waga2; float ciezar2; char odczyt2[8]; HX711 waga3; float ciezar3; char odczyt3[8]; HX711 waga4; float ciezar4; char odczyt4[8]; unsigned long Czas_tara = 0; unsigned long aktualnyCzas = 0; unsigned long Start1 = 0; unsigned long Start2 = 0; unsigned long Start3 = 0; unsigned long Start4 = 0; LiquidCrystal_I2C lcd(I2C_ADDR, 2, 1, 0, 4, 5, 6, 7); void setup() { Serial.begin(9600); lcd.begin(20, 4); lcd.setBacklightPin(3, POSITIVE); 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); lcd.clear(); waga1.begin(A2, A3); waga1.set_scale(419341.0 / 400.0); waga1.tare(5); waga2.begin(A0, A1); waga2.set_scale(419341.0 / 400.0); waga2.tare(5); waga3.begin(A6, A7); waga3.set_scale(419341.0 / 400.0); waga3.tare(5); waga4.begin(A5, A4); waga4.set_scale(419341.0 / 400.0); waga4.tare(5); pinMode(red1, OUTPUT); pinMode(blue1, OUTPUT); pinMode(green1, OUTPUT); pinMode(red2, OUTPUT); pinMode(blue2, OUTPUT); pinMode(green2, OUTPUT); pinMode(red3, OUTPUT); pinMode(blue3, OUTPUT); pinMode(green3, OUTPUT); pinMode(red4, OUTPUT); pinMode(blue4, OUTPUT); pinMode(green4, OUTPUT); pinMode(pompastart1, OUTPUT); pinMode(pompalewo1, OUTPUT); pinMode(pompaprawo1, OUTPUT); pinMode(pompastart2, OUTPUT); pinMode(pompalewo2, OUTPUT); pinMode(pompaprawo2, OUTPUT); pinMode(pompastart3, OUTPUT); pinMode(pompalewo3, OUTPUT); pinMode(pompaprawo3, OUTPUT); pinMode(pompastart4, OUTPUT); pinMode(pompalewo4, OUTPUT); pinMode(pompaprawo4, OUTPUT); } void loop() { pomiar_waga(); pomiar(); ekran(); aktualnyCzas = millis(); dozowanie_1(); Serial.println("dozowanie1"); Serial.println(ciezar1); Serial.println(ml11); pomiar(); ekran(); aktualnyCzas = millis(); dozowanie_2(); Serial.println("dozowanie2"); Serial.println(ciezar2); Serial.println(ml22); pomiar(); ekran(); aktualnyCzas = millis(); dozowanie_3(); pomiar(); ekran(); aktualnyCzas = millis(); dozowanie_4(); } void dozowanie_1() { if (ciezar1 >= 20 && stan_ciezar1 == 0 && lanie1 == 0) { digitalWrite(red1, HIGH); digitalWrite(green1, LOW); digitalWrite(blue1, LOW); Start1 = millis(); stan_ciezar1 = 1; pomiar_waga(); } if (ciezar1 < 5 && lanie1 == 0) { Serial.println("podnosze1"); analogWrite(pompastart1, 0); digitalWrite(pompalewo1, LOW); digitalWrite(pompaprawo1, LOW); stan_ciezar1 = 0; stan_lanie1 = 0; digitalWrite(red1, LOW); digitalWrite(green1, HIGH); digitalWrite(blue1, LOW); lcd.setCursor(12, 0); lcd.print(" "); pomiar_waga(); } if (ciezar1 <= -1) { stan_ciezar1 = 0; stan_lanie1 = 0; lanie1 = 0; digitalWrite(red1, LOW); digitalWrite(green1, HIGH); digitalWrite(blue1, LOW); waga1.tare(1); pomiar_waga(); } if (aktualnyCzas - Start1 >= 2000 && stan_ciezar1 == 1) { waga1.tare(1); stan_lanie1 = 1; stan_ciezar1 = 0; pomiar_waga(); } if (ciezar1 <= ml11 && stan_lanie1 == 1) { analogWrite(pompastart1, 200); digitalWrite(pompalewo1, HIGH); digitalWrite(pompaprawo1, LOW); lanie1 = 1; digitalWrite(red1, LOW); digitalWrite(green1, LOW); digitalWrite(blue1, HIGH); procent1 = (ciezar1 / ml11) * 100; dtostrf(procent1, 3, 0, procent1_fin); lcd.setCursor(12, 0); lcd.print("Cyk "); lcd.print(procent1_fin); lcd.print("%"); pomiar_waga(); } if (ciezar1 >= ml11 && stan_lanie1 == 1) { analogWrite(pompastart1, 0); digitalWrite(pompalewo1, LOW); digitalWrite(pompaprawo1, LOW); lcd.setCursor(12, 0); lcd.print(" "); digitalWrite(red1, HIGH); digitalWrite(green1, HIGH); digitalWrite(blue1, HIGH); waga1.tare(1); lanie1 = 0; stan_lanie1 = 0; pomiar_waga(); } } void dozowanie_2() { if (ciezar2 >= 20 && stan_ciezar2 == 0 && lanie2 == 0) { digitalWrite(red2, HIGH); digitalWrite(green2, LOW); digitalWrite(blue2, LOW); Start2 = millis(); stan_ciezar2 = 1; pomiar_waga(); } if (ciezar2 < 5 && lanie2 == 0) { Serial.println("podnosze1"); analogWrite(pompastart2, 0); digitalWrite(pompalewo2, LOW); digitalWrite(pompaprawo2, LOW); stan_ciezar2 = 0; stan_lanie2 = 0; digitalWrite(red2, LOW); digitalWrite(green2, HIGH); digitalWrite(blue2, LOW); lcd.setCursor(12, 1); lcd.print(" "); pomiar_waga(); } if (ciezar2 <= -1) { stan_ciezar2 = 0; stan_lanie2 = 0; lanie2 = 0; digitalWrite(red2, LOW); digitalWrite(green2, HIGH); digitalWrite(blue2, LOW); waga2.tare(1); pomiar_waga(); } if (aktualnyCzas - Start2 >= 2000 && stan_ciezar2 == 1) { waga2.tare(1); stan_lanie2 = 1; stan_ciezar2 = 0; pomiar_waga(); } if (ciezar2 <= ml22 && stan_lanie2 == 1) { analogWrite(pompastart2, 200); digitalWrite(pompalewo2, HIGH); digitalWrite(pompaprawo2, LOW); lanie2 = 1; digitalWrite(red2, LOW); digitalWrite(green2, LOW); digitalWrite(blue2, HIGH); procent2 = (ciezar2 / ml22) * 100; dtostrf(procent2, 3, 0, procent2_fin); lcd.setCursor(12, 1); lcd.print("Cyk "); lcd.print(procent2_fin); lcd.print("%"); pomiar_waga(); } if (ciezar2 >= ml22 && stan_lanie2 == 1) { analogWrite(pompastart2, 0); digitalWrite(pompalewo2, LOW); digitalWrite(pompaprawo2, LOW); lcd.setCursor(12, 1); lcd.print(" "); digitalWrite(red2, HIGH); digitalWrite(green2, HIGH); digitalWrite(blue2, HIGH); waga2.tare(1); lanie2 = 0; stan_lanie2 = 0; pomiar_waga(); } } void dozowanie_3() { if (ciezar3 >= 20 && stan_ciezar3 == 0 && lanie3 == 0) { digitalWrite(red3, HIGH); digitalWrite(green3, LOW); digitalWrite(blue3, LOW); Start3 = millis(); stan_ciezar3 = 1; pomiar_waga(); } if (ciezar3 < 5 && lanie3 == 0) { analogWrite(pompastart3, 0); digitalWrite(pompalewo3, LOW); digitalWrite(pompaprawo3, LOW); stan_ciezar3 = 0; stan_lanie3 = 0; digitalWrite(red3, LOW); digitalWrite(green3, HIGH); digitalWrite(blue3, LOW); lcd.setCursor(12, 2); lcd.print(" "); pomiar_waga(); } if (ciezar3 <= -1) { stan_ciezar3 = 0; stan_lanie3 = 0; lanie3 = 0; digitalWrite(red3, LOW); digitalWrite(green3, HIGH); digitalWrite(blue3, LOW); waga3.tare(1); pomiar_waga(); } if (aktualnyCzas - Start3 >= 2000 && stan_ciezar3 == 1) { waga3.tare(1); stan_lanie3 = 1; stan_ciezar3 = 0; pomiar_waga(); } if (ciezar3 <= ml33 && stan_lanie3 == 1) { analogWrite(pompastart3, 200); digitalWrite(pompalewo3, HIGH); digitalWrite(pompaprawo3, LOW); lanie3 = 1; digitalWrite(red3, LOW); digitalWrite(green3, LOW); digitalWrite(blue3, HIGH); procent3 = (ciezar3 / ml33) * 100; dtostrf(procent3, 3, 0, procent3_fin); lcd.setCursor(12, 2); lcd.print("Cyk "); lcd.print(procent3_fin); lcd.print("%"); pomiar_waga(); } if (ciezar3 >= ml33 && stan_lanie3 == 1) { analogWrite(pompastart3, 0); digitalWrite(pompalewo3, LOW); digitalWrite(pompaprawo3, LOW); lcd.setCursor(12, 2); lcd.print(" "); digitalWrite(red3, HIGH); digitalWrite(green3, HIGH); digitalWrite(blue3, HIGH); waga3.tare(1); lanie3 = 0; stan_lanie3 = 0; pomiar_waga(); } } void dozowanie_4() { if (ciezar4 >= 20 && stan_ciezar4 == 0 && lanie4 == 0) { digitalWrite(red4, HIGH); digitalWrite(green4, LOW); digitalWrite(blue4, LOW); Start4 = millis(); stan_ciezar4 = 1; pomiar_waga(); } if (ciezar4 < 5 && lanie4 == 0) { analogWrite(pompastart4, 0); digitalWrite(pompalewo4, LOW); digitalWrite(pompaprawo4, LOW); stan_ciezar4 = 0; stan_lanie4 = 0; digitalWrite(red4, LOW); digitalWrite(green4, HIGH); digitalWrite(blue4, LOW); lcd.setCursor(12, 3); lcd.print(" "); pomiar_waga(); } if (ciezar4 <= -1) { stan_ciezar4 = 0; stan_lanie4 = 0; lanie4 = 0; digitalWrite(red4, LOW); digitalWrite(green4, HIGH); digitalWrite(blue4, LOW); waga4.tare(1); pomiar_waga(); } if (aktualnyCzas - Start4 >= 2000 && stan_ciezar4 == 1) { waga4.tare(1); stan_lanie4 = 1; stan_ciezar4 = 0; pomiar_waga(); } if (ciezar4 <= ml44 && stan_lanie4 == 1) { analogWrite(pompastart4, 200); digitalWrite(pompalewo4, HIGH); digitalWrite(pompaprawo4, LOW); lanie4 = 1; digitalWrite(red4, LOW); digitalWrite(green4, LOW); digitalWrite(blue4, HIGH); procent4 = (ciezar4 / ml44) * 100; dtostrf(procent4, 3, 0, procent4_fin); lcd.setCursor(12, 3); lcd.print("Cyk "); lcd.print(procent4_fin); lcd.print("%"); pomiar_waga(); } if (ciezar4 >= ml44 && stan_lanie4 == 1) { analogWrite(pompastart4, 0); digitalWrite(pompalewo4, LOW); digitalWrite(pompaprawo4, LOW); lcd.setCursor(12, 3); lcd.print(" "); digitalWrite(red4, HIGH); digitalWrite(green4, HIGH); digitalWrite(blue4, HIGH); waga4.tare(1); lanie4 = 0; stan_lanie4 = 0; pomiar_waga(); } } void pomiar_waga() { ciezar1 = waga1.get_units(); dtostrf(ciezar1, 3, 0, odczyt1); ciezar2 = waga2.get_units(); dtostrf(ciezar2, 3, 0, odczyt2); ciezar3 = waga3.get_units(); dtostrf(ciezar3, 3, 0, odczyt3); ciezar4 = waga4.get_units(); dtostrf(ciezar4, 3, 0, odczyt4); } void ekran() { lcd.setCursor(0, 0); lcd.print("1. Lej:"); lcd.print(ml111); lcd.print("g"); lcd.setCursor(0, 1); lcd.print("2. Lej:"); lcd.print(ml222); lcd.print("g"); lcd.setCursor(0, 2); lcd.print("3. Lej:"); lcd.print(ml333); lcd.print("g"); lcd.setCursor(0, 3); lcd.print("4. Lej:"); lcd.print(ml444); lcd.print("g"); } void pomiar() { ml1 = analogRead(A8); ml11 = map(ml1, 1020, 0, 5, 30); dtostrf(ml11, 3, 0, ml111); ml2 = analogRead(A9); ml22 = map(ml2, 1020, 0, 5, 30); dtostrf(ml22, 3, 0, ml222); ml3 = analogRead(A10); ml33 = map(ml3, 1020, 0, 5, 30); dtostrf(ml33, 3, 0, ml333); ml4 = analogRead(A11); ml44 = map(ml4, 1020, 0, 5, 30); dtostrf(ml44, 3, 0, ml444); }
  19. Ten artykuł jest częścią serii "Budowa frezarki CNC na stalowej ramie sterowanej z komputera PC" #1 - Mechanika #2 - Sterowanie i uruchomienie Wstęp Link do drugiej części na końcu tego artykułu. W niniejszym artykule chciałbym opisać proces budowy frezarki CNC, którą zbudowałem kilka lat temu jeszcze podczas studiów. Zdecydowałem się na budowę takiej maszyny ze względu na częstą potrzebę wytworzenia jakichś części lub na precyzyjne wycinanie otworów w obudowach do czego nie mam cierpliwości, a te parę lat temu druk 3D dopiero się rozkręcał i jakość ówczesnych drukarek mnie nie satysfakcjonowała. Ponadto budowa frezarki była swojego rodzaju sprawdzeniem własnych umiejętności jak i wyobraźni. Między innymi umiejąc już wtedy projektować w Autodesk Inventor umyślnie ograniczyłem projektowanie do pojedynczych części, chcąc się sprawdzić na ile jestem w stanie poukładać sobie projekt w głowie nie wspomagając się niczym więcej. Po zakończeniu budowy oczywiście znalazłoby się coś do poprawy natomiast efekt końcowy i tak przerósł moje oczekiwania oraz cieszył się dużym uznaniem innych osób. Podczas budowy wykonywałem na bieżąco kosztorysy, zapisywałem linki do części oraz zapisałem sobie wszystkie potrzebne rzeczy dzięki czemu mogłem wykorzystać ten projekt do napisania pracy inżynierskiej. Na potrzeby pracy inżynierskiej wykonałem projekt 3D zbudowanej już frezarki. Niniejszy artykuł nie stanowi kompletnej instrukcji budowy frezarki od podstaw natomiast ma na celu przedstawić jak ten proces budowy wyglądał, dlatego w tym artykule mogę częściej korzystać z czasu przeszłego pierwszej osoby w liczbie pojedynczej. Ten artykuł bierze udział w naszym konkursie! 🔥 Na zwycięzców czekają karty podarunkowe Allegro, m.in.: 2000 zł, 1000 zł i 500 zł. Potrafisz napisać podobny poradnik? Opublikuj go na forum i zgłoś się do konkursu! Czekamy na ciekawe teksty związane z elektroniką i programowaniem. Sprawdź szczegóły » Początkowo artykuł ten miałem napisać w jednej części, natomiast wyszedł obszerniejszy niż sądziłem i wyszło mi tutaj więcej zdjęć, a boję się że zaraz może się wyczerpać limit miejsca na zdjęcia zatem artkuł został podzielony na 2 części - mechaniczną oraz elektroniczną z konfiguracją Mach3 oraz przygotowaniem frezowania na tej maszynie. Wstępne założenia Pierwszym i najważniejszym założeniem były gabaryty całej maszyny. Początkowo miała ona dysponować polem roboczym ok. 300x300x150 mm kolejno w osiach X, Y, Z. Jednak po wstępnym kosztorysie okazało się iż najkosztowniejsze podzespoły takie jak nakrętki śrub kulowych, czy łożyska liniowe wystąpią w takiej samej ilości również w maszynie o większych gabarytach, a materiał potrzebny do budowy ramy, bramy i innych elementów konstrukcyjnych jest na tyle tani, że można sobie pozwolić na budowę większej maszyny nie zwiększając znacząco budżetu. Zatem nowe założenie obejmowało wymiary zewnętrzne maszyny w przybliżeniu 1000x1000x1000 mm oraz możliwie jak największe pole robocze kształtem zbliżone do kwadratu. Wiele konstrukcji ma pole robocze o proporcjach boków zbliżonych do 2:1 co często ogranicza rozmiar możliwego do zamontowania na maszynie materiału. Planując budowę takiej maszyny zawsze powinniśmy zaczynać od takiego wstępnego kosztorysu ponieważ jak widać założenia mogą się szybko zmienić. Pozostałe założenia Możliwość obróbki materiałów takich jak drewno, materiały drewnopodobne, tworzywa sztuczne, kompozyty i metale kolorowe 3 stopnie swobody Możliwie maksymalnie duże pole robocze przy danych wymiarach zewnętrznych Solidna konstrukcja oparta o profile stalowe Możliwość prostej separacji bramy od podstawy maszyny w celu łatwiejszego transportu Sterowanie z komputera klasy PC Zachowanie estetyki konstrukcji Kartezjański układ współrzędnych Wybór sposobu poruszania się w osi Y Do wyboru mamy dwie opcje: Ruchomy stół i statyczna brama Statyczny stół i ruchoma brama W moim przypadku wybór padł rozwiązanie ze statycznym stołem i ruchomą bramą ze względu na mniejszą wymaganą przestrzeń gdzie stoi maszyna, ponieważ stół ruszając się wychodzi poza obrys ramy podobnie jak w drukarkach 3D z takim rozwiązaniem. Dużą zaletą tego rozwiązania jest również nie wpływanie masy materiału na bezwładność podczas pracy w osi Y, co ma miejsce przy pierwszym sposobie. Ostatnią zaletą statycznego stołu jest możliwość zamontowania materiału znacząco wychodzącego poza obrys maszyny w osi Y i podparcia go w razie potrzeby. Przed przystąpieniem do projektowania własnej konstrukcji CNC pamiętajmy aby się dobrze zastanowić nad różnymi rozwiązaniami oraz wybrać najbardziej odpowiadające dla naszych potrzeb. Projekt 3D w Autodesk Inventor Jak wspomniałem we wstępie podczas budowy frezarki nie wspierałem się zanadto projektowaniem w Inventorze, ale sama praca inżynierska tego projektu już wymagała, zatem projekt 3D został wykonany post factum. Do zaprojektowania maszyny posłużył program Autodesk Inventor, który umożliwia zaprojektowanie pojedynczych części, ich zespołów, eksport rysunków potrzebnych do wykonania części na maszynach CNC, a ponadto umożliwia sprawdzenie kolizji oraz przeprowadzenie symulacji wytrzymałościowych. Model zawiera zarówno elementy dostępne na rynku jak i elementy potrzebne do wykonania. Części dostępne na rynku były modelowane symbolicznie zachowując tylko wymiary kluczowe dla konstrukcji i były nazywane słownie. Natomiast części wymagające wykonania były numerowane według schematu AAA-BBB, gdzie „AAA” jest numerem zespołu do którego należy część, a „BBB” jest numerem części danego zespołu. Przy czym plik 000-000 jest plikiem głównym zespołu i w jego skład wchodzą dwa zespoły (rama i brama) oraz śruby i podkładki je łączące. W przypadku pracy z większymi projektami zawierającymi więcej niż kilkanaście elementów pamiętajmy aby ustandaryzować nazewnictwo/numerację kolejnych modeli, ponieważ na słowne nazywanie każdej części szybko skończy się nam wyobraźnia, a nazwy typu "ercvevrtwh" szybko się na nas zemszczą bałaganem w plikach. Projekt nie zawiera wszystkich elementów maszyny ze względu na dużą ilość czasu ile wymagają te elementy do zamodelowania. Brakuje między innymi przewodów łączących wrzeciono, silniki i czujniki ze sterownikiem jak i łańcuchów prowadzących, mimo to model pozwolił dobrze dobrać odpowiednie łańcuchy prowadzące i zaplanować miejsca prowadzenia przewodów. Pamiętajmy aby podczas projektowania przewidzieć sposób ułożenia wszystkich przewodów, ponieważ nasz projekt nawet najlepszej konstrukcji z pajęczyną wiszących kabli będzie zwyczajnie nieestetyczny. Może to i trywialne, natomiast bardzo dużo osób o tym zapomina. Projektując tak dużą maszynę powinniśmy zastanowić się nie tylko nad spełnieniem kryteriów pracy tej maszyny, ale również powinniśmy przemyśleć rozwiązania zwiększające ergonomię użytkowania bądź transportu maszyny. Model mojej frezarki został podzielony na dwa podzespoły – ramę i bramę. Dzięki temu jest możliwość rozmontowania frezarki na dwa duże elementy co umożliwia łatwiejsze przenoszenie i transport maszyny. Dzięki przemyślanej konstrukcji wystarczy odkręcenie 10 śrub, aby frezarka została rozłączona na dwa niezależne elementy, co nie trwa więcej niż 10 minut. Poniższa grafika prezentuje śruby, które powinniśmy odkręcić, aby było możliwe zdjęcie bramy. Taka sama liczba śrub znajduje się po drugiej stronie maszyny. Natomiast grafika niżej reprezentuje już bramę odseparowaną od dolnej ramy. W przypadku takiego projektu bardzo ważne jest również powstrzymywania naszej wyobraźni przed zaprojektowaniem zbyt "fikuśnych" części, co może skutkować bardzo dużym kosztem wykonania. Zdarzają się przypadki kiedy ktoś poświęci bardzo dużo czasu na projekt, którego koszt wykonania przekracza wszelkie wyobrażenia i projekt należy powtórzyć. W tym przypadku detale były projektowane z myślą o wykonaniu ich metodą cięcia wodą. Jest to najtańsza i najszybsza metoda obróbki ubytkowej. Metoda wykorzystuje strumień wody pod ogromnym ciśnieniem, który z dodatkiem ścierniwa jest w stanie ciąć wszelkie materiały, a precyzja wykonania jest wystarczająca na potrzeby niniejszej budowy. Ponadto została również wykorzystana metoda druku 3D do wykonania odsysu, który może być montowany na mocowaniu wrzeciona i blokowany przez samo wrzeciono. Do montażu i demontaż potrzebny jest tylko jeden klucz imbusowy potrzebny do poluzowania uchwytu wrzeciona. Odsys zapewnia podłączenie odkurzacza oraz odprowadzenie wiórów i pyłu powstającego podczas frezowania. Jest to jedyna część wykonana techniką druku 3D w niniejszym projekcie ze względu skomplikowany kształt odsysu. Budowa części mechanicznej Rama Funkcję nośną dla całej maszyny pełni dolna rama, do której przymocowane są między innymi śruba osi Y, brama oraz gumowe nóżki, na których spoczywa cała konstrukcja. Jako materiał do budowy ramy posłużył profil stalowy gięty na zimno w kształcie prostokąta o wymiarach 100x50 mm i najgrubszej ściance dostępnej w hurtowni stali – 5 mm. Najbardziej kluczowy był etap spawania, ponieważ łączenie elementów łukiem elektrycznym powoduje powstawanie bardzo wysokiej temperatury w miejscu łączenia, po czym spoiwo stygnąc powoduje kurczenie materiału. Aby jak najskuteczniej przeciwdziałać temu zjawisku profile zostały przykręcone do stołu na czas spawania, same spawy najpierw były nakładane punktowo, aby ograniczyć nagrzewanie, a w następnej kolejności było nakładane spoiwo wypełniające, przy czym każdy następny punkt spawania znajdował się po przeciwległej stronie profilu, aby przeciwdziałać ściąganiu materiału. Przez cały ten proces kontrolowane były wymiary ramy. Mimo wszelkich starań zawsze będą obecne niedokładności w procesie budowy. Wymiary ramy były zadowalające, jednak stalowe profile gięte na zimno nie mają idealnie płaskich ścian, zawsze są one delikatnie wypukłe. Aby zapewnić jak największą dokładność samej maszyny powinniśmy zapewnić wspólną płaszczyznę dla podpór wałków liniowych, po których porusza się oś Y. Rozwiązaniem problemu może być planowanie powierzchni profilów w miejscach gdzie będą przymocowane prowadnice. Planowanie powierzchni zostało zlecone firmie dysponującej frezarką CNC o wystarczającym polu roboczym. Poniższe zdjęcie prezentuje równą płaszczyznę, na której możemy już przymocować prowadnice. Następnym etapem był montaż prowadnic dla ruchomej bramy. Wybór padł na wałki liniowe o średnicy 20 mm z podporami na całej długości prowadnicy co gwarantuje stabilne podparcie dla konstrukcji w każdym położeniu bramy. Przy montowaniu prowadnic powinniśmy przykuć szczególną uwagę, aby zamontowane prowadnice były względem siebie równoległe, ponieważ jakiekolwiek przekrzywienie wpłynie negatywnie na lekkość jak i dokładność pracy już o nadmiernym zużywaniu łożysk nie wspominając. Dla zapewnienia równoległości obu wałków względem siebie możemy najpierw przymocować jedną z prowadnic, a dla zachowania równoległości drugiej prowadnicy możemy się wspomóc np. płaskownikiem, do którego będą przykręcone łożyska obu prowadnic, następnie powinniśmy ten płaskownik z łożyskami przesunąć w obie skrajne pozycje oraz przymocować drugą prowadnicę. W moim przypadku sprawdziło się to świetnie. Następnie do ramy przyspawano uchwyty, w które zostały wkręcone gumowe nóżki. W sklepach z częściami do maszyn przemysłowych rozwiązania nóg zazwyczaj bywają strasznie drogie dlatego warto się rozejrzeć za innymi rozwiązaniami. Rolę nóżek w tym przypadku spełniły gumowe odboje z zawieszenia samochodu terenowego. Bardzo dobrze tłumią wszelkie wibracje maszyny i nie przenoszą ich na stół na którym stoi maszyna. Brama Brama podobnie do ramy pełni funkcję nośną dla pozostałych dwóch osi – X oraz Z. Do budowy bramy został użyty taki sam profil stalowy jak w przypadku ramy. Zostały docięte 3 odcinki o wymaganych długościach, a w profilu docelowo będącym poziomo zostały obrobione płaszczyzny na tokarni aby zapewnić prostopadłość płaszczyzny cięcia z bokiem profilu. Dzięki temu zabiegowi możliwe było zaciśnięcie profili w pożądanej pozycji, a następnie przystąpienie do spawania. Nie dysponowałem w tamtej chwili tak dużym zaciskiem zatem do unieruchomienia bramy przy spawaniu ponownie została wykorzystana tokarnia jako docisk tak jak widać na poniższym zdjęciu 🙂 W tym przypadku sposób okazał się doskonały, ponieważ wymiary bramy wyszły idealne z zachowaniem kątów prostych. Następnie został przyspawany drugi profil poziomo, tym razem o przekroju kwadratu 50x50 mm i również o ściance grubości 5 mm. W następnej kolejności zostały przyspawane stopy bramy do mocowania łożysk. Zostały one wycięte technologią cięcia wodą ze stali o grubości 15 mm. Do owych stóp zostały przykręcone podwójne łożyska otwarte i aby uniknąć montowania dodatkowych wzmocnień zdecydowałem się na tak dużą grubość stóp. Końcówki profili bramy wymagały wycięcia otworów w narożnikach, aby był możliwy dostęp do śrub mocujących łożyska liniowe. Rozwiązanie niezbyt eleganckie i ogranicza trochę dostęp do śrub mocujących, ale nie wpływa to na sztywność konstrukcji. Profil nie mógł być przyspawany na środku stopy, ponieważ musimy pamiętać, że wrzeciono frezarki będzie trochę odsunięte od bramy, dlatego brama musiała być możliwie cofnięta na stopie, aby wrzeciono i pozostała konstrukcja bramy znajdowała się w miarę możliwości w obrysie stóp. Wsunięcie bramy na prowadnice ramy udowodniło powodzenie w dotychczasowych staraniach. Brama mogła się poruszać bez oporów w całym zakresie ruchu, a nawet wymagała zabezpieczenia, aby uniemożliwić samoistne zsunięcie się z prowadnic. Podobnie jak w osi Y, płaszczyzny pod podpory prowadnic osi X również wymagały planowania powierzchni. Następnie zostały przymocowane prowadnice osi X w analogiczny sposób jak miało to miejsce dla osi Y. Na gotowe prowadnice został wsunięty wózek osi X wykonany z aluminiowej płyty o grubości 10 mm, na którym realizowany jest również ruch w osi Z. Do płyty przymocowanych jest 8 pojedynczych łożysk otwartych oraz obudowy nakrętek kulowych dla osi Y oraz Z. Ruch w osi Z odbywa się po prowadnicach zamontowanych na ostatnim elemencie nośnym, również wykonanym z 10 mm płyty aluminiowej. Do tego elementu jest przykręcony uchwyt umożliwiający montaż wrzeciona. Powyższe aluminiowe płyty również zostały wycięte wodą. Poza kształtem wycięto również otwory montażowe, zatem pod odbiorze takiego elementu możemy założyć gwintownik maszynowy na wkrętarkę, błyskawicznie nagwintować otwory i zamontować gotowy element. Dlatego też na etapie projektowania warto przewidzieć sposób wykonania niektórych elementów. Uwzględnienie wszystkich otworów w projekcie i wycięcie ich wodą spokojnie zaoszczędziło mi kilka cennych godzin i nerwów. Napęd i czujniki Do napędu frezarki użyłem silników krokowych sprzężonych ze śrubami kulowymi. Wybrałem silniki krokowe ze względu na niski koszt zakupu, łatwość w sterowaniu oraz powszechność wykorzystania w podobnych zastosowaniach. Wykorzystałem model bipolarny NEMA23 o momencie trzymającym 1,89 Nm. Istotnym parametrem przy doborze silników był też prąd jednej fazy wynoszący 2,8 A, co mieści się w ograniczeniu prądowym zastosowanego sterownika. Do zamiany ruchu obrotowego na ruch liniowy wykorzystałem śruby kulowe o średnicy 16 mm i skoku 5 mm. Mimo znaczącej ceny zestawu jest to korzystny wybór w zastosowaniu do napędu maszyn CNC. Śruby kulowe charakteryzują się brakiem luzu oraz znikomymi oporami toczenia dzięki budowie nakrętki przypominającej łożysko. Wadą skomplikowanej budowy nakrętek jest ich wysoka cena oraz niższa odporność na zabrudzenia, które mogą się przyklejać do śrub napędowych. Śruby zostały połączone z silnikami za pośrednictwem sprzęgieł mieszkowych. Sprzęgła pełnią dwie funkcje – przeniesienie napędu z silnika na śrubę oraz wprowadzają delikatną elastyczność, która jest niezbędna ze względu na niemożliwe do całkowitego usunięcia nieosiowości osi silnika i śruby. Sztywne połączenie silnika ze śrubą mogłoby skutkować wibracjami w trakcie pracy lub nawet uszkodzeniem łożysk silnika. Łożyska podtrzymujące śruby kulowe w osi Y zostały przymocowane za pomocą elementów umożliwiających regulację wysokości łożysk. Mocowania łożysk pozostałych osi zostały przytwierdzone bezpośrednio do ramy lub płyty aluminiowej. Cienkie stalowe elementy mocujące zostały wycięte wodą, natomiast aluminiowe mocowanie silnika osi Z zostało wyfrezowane ze względu na grubość 10 mm, przy takiej grubości płaszczyzna cięcia w przypadku wody może nie być do końca prostopadła. Przez zbyt duży rozmiar silników niemożliwe było zamontowanie jednego z nich współosiowo ze śrubą osi X ponieważ nie zmieściłby się między profilem bramy a wózkiem osi X. Aby rozwiązać ten problem przesunięto silnik poza obrys maszyny, a napęd przeniesiono przez dwa sprzęgła mieszkowe oraz wał o średnicy 6mm. Zastosowane rozwiązanie nie nadwyręża elastycznych możliwości sprzęgieł oraz nie ogranicza pola roboczego w osi X. Na koniec zostały przymocowane ostatnie najmniejsze detale takie jak uchwyty czujników, mocowanie wrzeciona czy mocowania łańcuchowych prowadnic na przewody. Przy umiejscowieniu czujników wziąłem pod uwagę ukrycie ich z dala od pola roboczego oraz miejsca, w którym znajduje się operator, aby nie narażać czujników na uszkodzenia oraz ze względów estetycznych. Po zamontowaniu na swoich miejscach silników i czujników maszyna była gotowa na pierwsze testowe uruchomienie. Tymczasowo został podłączony sterownik, komputer oraz wstępnie skonfigurowany program sterujący, aby zweryfikować poprawność działania wszystkich mechanizmów. Po chwili testów zostało zamontowane wrzeciono i maszyna mogła wykonać pierwsze otwory w obudowie przeznaczonej do skrycia wewnątrz sterownika. Po pomyślnie przeprowadzonych testach wszystkich mechanizmów konstrukcja była niemal gotowa do użytku. Ostatnią czynnością pozostało pomalowanie wszystkich stalowych elementów konstrukcyjnych, aby zabezpieczyć je przed korozją. Zdecydowałem się na malowanie metodą proszkową, która zapewnia odporność na korozję i czynniki chemiczne we wszystkich zakamarkach konstrukcji. Przed malowaniem należało całą konstrukcję rozebrać a następnie ponownie złożyć. Na koniec został zamontowany stół maszyny, którego funkcję pełni płyta ze sklejki liściastej. Materiał ten jest dość tani w zakupie i wystarczająco sztywny dla tej konstrukcji. Stół składa się z dwóch części: dolnej płyty o grubości 37 mm, do której jest przymocowany zasadniczy stół o wymiarach pola roboczego i o grubości 36 mm. W stole wykonano niemal 2100 otworów, które już samodzielnie wywierciła maszyna wiertłem o średnicy 3 mm. Na wykonanie takiej ilości otworów wystarczyło zaledwie 45 minut ciągłej pracy. Otwory będą wykorzystywane do zamocowania obrabianego materiału w polu roboczym. Po zakończeniu wiercenia stół został poddany planowaniu, aby zapewnić równoległość płaszczyzny stołu do płaszczyzny pracy maszyny. Podsumowanie części mechanicznej Jak widać proces budowy przebiegł całkiem pomyślnie z zachowaniem funkcjonalności i estetyki. Chciałbym natomiast przyłożyć dużą uwagę do etapu projektowania. Pamiętajmy, że im więcej czasu spędzimy na etapie projektowania i rozwiązywania problemów tym mniej czasu, potu, nerwów i pieniędzy będzie nas kosztowała budowa naszego projektu. W moim przypadku upiekło się bez istotnych wpadek, ale niektóre rzeczy na pewno zaprojektowałbym inaczej przed przystąpieniem do budowy. Nie będę nikogo czarował, że taka budowa to nic takiego, ponieważ jak widać wymaga to pewnej wiedzy i doświadczenia z mechaniką oraz zaplecza narzędzi, którymi nie każdy dysponuje, a zlecenie takiej budowy może być dość kosztowne. W kolejnej części artykułu opiszę budowę części elektronicznej, podłączenia wszystkich elementów, prowadzenie kabli, zmontowanie sterownika, sposób sterowania przez komputer PC oraz na sam koniec pokażę jak wygląda użytkowanie takiej maszyny wraz z materiałami wideo. Link do drugiej części artykułu: Budowa frezarki CNC na stalowej ramie sterowanej z komputera PC - Sterowanie i uruchomienie [2/2]
  20. Witam wszystkich. W ramach jakieś promocji na jednym z portali u naszych skośnych przyjaciół dostałem w dobrej cenie taki coś. Plan był taki żeby zrobić z tego zestaw grający pod szafkowy do kuchni. Dopiero jak to do mnie dotarło wczytałem się w specyfikację i okazało się że wymaga dodatkowego wzmacniacza. Chyba że coś źle rozumiem. Głośniki będą z zestawu komputerowego zasilane bezpośrednio z USB. To jest moje pierwsze podejście do takiego tematu więc pomóżcie z wyborem jakiegoś wzmacniacza. Myślałem żeby to zasilać zwykłym zasilaczem od ledów albo stara kostka do telefonu.
  21. Witam chciałem wam przedstawić wykonaną przeze mnie kierownicę do komputera PC. Kierownica nie jest jeszcze do końca wykonana tak jak bym chciał, ale jest skończona działa można ją będzie jeszcze rozbudować 🙂 Budowa od strony elektronicznej: Do budowy kierownicy użyłem jako podstawę Arduino Leonardo. Opierałem się o podobny projekt który znalazłem na yt . Lecz ja zrobiłem to trochę ładniej niż tamten chociaż nie ma rewelacji mogło być lepiej , ale w przyszłości myślę zrobić jeszcze jedną lepszą 🙂 Oprócz Arduino Leonardo , zamiast jakiś potencjometrów i kombinowania z przekładniami użyłem enkoder z drukarki Canon IP2700. Ogólnie to oprócz enkodera to jeszcze parę przycisków potencjometry do pedałów i jakieś diody na podświetlenie. Poniżej schemat jak to podłączone. Oprogramowanie gotowe znalazłem pod tym filmem z którego się wzorowałem, wystarczyło wgrać XLoaderem i to wszystko podłączyć jak na schemacie. Od strony mechanicznej wygląda to tak: Odbijanie i blokada zostały zrobione na sprężynie niestety nie mam zdjęć . Dodam link do filmu na którym jest pokazane jak to działa. Ręczny przerobiony ze starej kierownicy . Elementy skrzyni biegów wydrukował mi kolega w 3D. i wygląda to tak: Pedały ze starej kierownicy , dorobiony jeden sprzęgłowy z innej kierownicy: Ostatecznie wygląda to tak: Link do filmu jak to działa i jak zrobione niektóre rzeczy: To by było na tyle w planach zrobienie Force Feed Back , na silniku DC 12v i przekładniach 🙂 Pozdrawiam Krzysiek 🙂
  22. Od kiedy tylko ludzie zaczęli interesować się akwarystyką od tego momentu postanowili na każdym kroku ułatwiać sobie pracę. Powstawały coraz to nowsze urządzenia – napowietrzacze, filtry, oświetlenia i tym podobne. Także w tej dziedzinie pojawiły się urządzenia w pełni zautomatyzowane (sterowane za pomocą różnego rodzaju przełączników oraz czujników). Przykładem takiego rozwiązania był chociażby sterownik akwariowy “Skalar”. Jako że powstał on w czasach gdy o diodach mało kto słyszał a sterowanie PWM już chyba nikt postanowiłem stworzyć własny sterownik akwariowy Bella. Jest to kompletny sterownik oparty na Arduino Nano v3. Sterownik akwariowy Bella – lista materiałów do budowy Obudowa uniwersalna Z1W Panel przedni MN-Tech Panel tylny MN-Tech Płytka prototypowa Bella Compact 1.1 moduł pod driver PWM firmy Meanwell (5 kanał) – opcjonalny arduino nano wraz z programem sterownika akwariowego Bella zegar ds1307 wyświetlacz LCD 20×4 znaki na szynie I2C termometr DS18b20 wodoodporny na kablu – 1 szt drivery firmy Meanwell serii LDD (dowolny model) (max 5 szt) przekaźnik 1 kanałowy – 2 szt przekaźnik 4 kanałowy – 1 szt kable połączeniowe FF długości 20cm do podłączenia modułów (30 szt – liczone z zapasem) gniazdo na goldpin 3 pinowe – 8 szt gniazdo na goldpin 4 pinowe – 2 szt (do wyświetlacza) gniazdo na goldpin 5 pinowe – 1 szt (do klawiatury) gniazdo na goldpin 6 pinowe – 2 szt (przekaźnik 4 kanałowy) zworka 2 pinowa (używana w przypadku braku sondy pH) przycisk chwilowy – 4 szt (jako klawiatura) włącznik kołyskowy okrągły – 2 szt gniazdo montażowe płaskie (GS-035) – 6 szt gniazdo zasilające na kabel ósemka – 1 szt gniazdo + wtyk 3 pinowy mini CB (termometr) gniazdo + wtyk 2 pinowy mini CB do podłączenia zasilania driverów 2x gniazdo + 2x wtyk 4 pinowy CB na listwę led (każde na 2 kanały oświetlenia) lub 1 gniazdo CB 8 pinowe na 4 kanały gniazdo montażowe do zasilania arduino 5,5/2,1 gniazdo bezpiecznikowe – 1 szt śruby czarne M3 długość 12mm – około 30szt nakrętki M3 – około 60 sztuk Oświetlenie Najważniejszym założeniem sterownika akwariowego Bella było oczywiście sterowanie oświetleniem. Sterownik obsługuje 5 kanałów PWM. Na samej płytce jest miejsce na zamontowanie 5 driverów z firmy Meanwell (dowolnych od LDD-300L do LDD-1500H). 4 z nich znajdują się na płytce natomiast piąty można zamontować osobno na dodatkowej płytce. Napięcie zasilania driverów jest w zakresie od 12 do 48V. Na płytce zostały wyciągnięte piny pwm oraz masy do podłączenia dodatkowych driverów. Moc każdego kanału można ustawić dowolnie w granicy 0-100% (wartości 0-255 na wyświetlaczu). Wszystkie kanały włączają się jednocześnie i gaszą o tej samej godzinie (wyjątkiem są kanały 1 i 2, które w przypadku ustawienia oświetlenia nocnego gaszą się dopiero o północy. W przypadku kiedy moc któregoś z kanałów jest zmniejszona jego ściemnianie / rozjaśnianie działa tak samo długo lecz jest proporcjonalnie wolniejsze (skoki są mniejsze). Długości i zakresy które można ustawić w tym dziale zostaną opisane w ostatnim akapicie “Zakresy”. Termostat Kolejnym punktem jest zastosowanie wodoodpornego termometru DS18b20 i możliwość podłączenia do niego dwóch niezależnych urządzeń (np grzałki oraz chłodnicy czy też wentylatora). Jak w poprzednim punkcie zakresy zostały opisane na końcu. W przypadku awarii / odpięcia termometru temperatura na wyświetlaczu znika (zostaje zastąpiona przez znaki –. Dodatkowo w ramach zabezpieczenia w takim przypadku gniazda zarówno grzania jak i chłodzenia zostają odłączone od zasilania. W przypadku tej funkcjonalności mamy dostępne 2 zmienne. Pierwsza to temperatura (oznaczająca temperaturę dolną) poniżej której uruchomiona zostanie grzałka. Druga to histereza. Główną wartością jest temperatura – jest to deklarowana wartość dolna poniżej której uruchomiony zostanie przekaźnik odpowiadający za grzałkę. Na wyświetlaczu zmieni się opis z G-OFF na G- ON. Temperatura będzie rosła do momentu przekroczenia 1x histerezy w górę. W przypadku jeśli temperatura przekroczy wartość zadaną + 2x histerezę uruchomi się chłodzenie i będzie działać do momentu w którym włączyło się grzanie (T+H). Stycznik 1 oraz stycznik 2 Stycznik 1 może zostać ustawiony w 2 trybach – pierwszym z nich jest to tryb pracy do sterowania elektrozaworem do CO2 (sterowanie uruchamia się automatycznie po podłączeniu sondy pH). Drugim trybem jest uruchamianie się 1x dziennie na dowolny okres (od 1 minuty do 23 godzin i 59 minut). W przypadku gdy nie ma podpiętej sondy pH do sterownika należy zrobić mostek pomiędzy pinem A7 a pinem GND – program automatycznie zmienia działanie stycznika na tryb pracy 1x dziennie. Stycznik 2 działa tylko jako uruchamiany 1x dziennie (jak wyżej). Stycznik 3 oraz stycznik 4 Działają one automatycznie w zależności od pór dnia. Stycznik numer 3 uruchamia się w momencie rozpoczęcia świtu i wyłącza w momencie gdy kończy się zmrok. Stycznik numer 4 uruchamia się tylko w czasie trwania dnia. Sonda pH Program obsługuje sondy pH opisane w tym artykule. Podpinana jest ona do pinu A7. Za jej pomocą sterowany jest stycznik numer 1 do którego można podpiąć jak pisałem powyżej elektrozawór dozujący CO2. W momencie w którym nie mamy podpiętej sondy pH należy zewrzeć piny A7 oraz GND. Dzięki temu stycznik nr 1 przełącza się na działanie 1x dziennie. Wartości które możemy zmieniać to dolna granica pH oraz histereza. Po przekroczeniu górnej granicy uruchomiony zostaje stycznik (do którego można podłączyć elektrozawór dozujący CO2) i działa on do momentu obniżenia pH poniżej zadanej wartości. Oświetlenie awaryjne Pin analogowy A6 został przygotowany jako uruchamianie oświetlenia awaryjnego. W przypadku gdy pin zwarty jest do masy (za pomocą rezystora 10kOhm program działa w normalnym trybie. Gdy włącznik zostanie uruchomiony i zwarty do pinu 5V oświetlenie zacznie świecić na około 50% mocy (na tyle mocno żeby było widać lecz aby nie oślepiać). W tryb pracy awaryjnej zostaną uruchomione kanały 1 oraz 2. Do uruchomienia oświetlenia awaryjnego służy przycisk na boku obudowy (z przodu) po stronie wyświetlacza. Wyłącznik oświetlenia Istnieje także możliwość wyłączenia całkowicie napięcia podawanego na diody. Do tego celu służy przełącznik znajdujący się z boku obudowy (od strony wyświetlacza z tyłu). Dzięki temu możemy w sytuacji w której jest potrzeba odpięcia oświetlenia od sterownika odłączyć całkowicie zasilanie driverów. Wyświetlacz LCD Sterownik akwariowy Bella oferuje dwa tryby działania. Pierwszym z nich jest tryb wyświetlania informacji znajdujących się na sterowniku. Poniżej znajduje się właśnie taki układ. Na żółto zostały oznaczone pola odpowiednio od góry: Grzałka, Wentylator, Stycznik 1 (jeśli używamy sondy pH zmienia się jego nazwa z S na C – można podpiąć do niego elektrozawór CO2) oraz Stycznik S2. Styczniki S3 oraz S4 (ich godziny działania) wyświetlane są w menu rotacyjnym na dole ekranu. Kolejnym trybem w jakim pracuje ten sterownik akwariowy jest tryb menu. Aby go uruchomić należy jednocześnie przytrzymać przyciski + oraz – (góra i dół). W tym momencie układ wyświetlacza zmieni się całkowicie na prezentowany poniżej: Funkcje menu (nazwa, dostępne wartości oraz ich skoki) W trybie ustawień zmieniają się dwa dolne wiersze na wyświetlaczu. Na górnym jest informacja o aktualnie zmienianej funkcji oraz jej wartości. W dolnym rzędzie pokazany jest dostępny zakres w jakim może być on zmieniany. Dokładna struktura menu zakresy oraz skoki są dostępne w tabeli poniżej. Po uzyskaniu maksymalnej wartości (dla przykładu PWM1 – 255) jeśli nadal będzie włączony przycisk + wartości będą liczone dalej od najniższej. Podobnie dzieje się w przypadku uzyskania najniższej wartości i trzymania przycisku -. W tym przypadku wartość zmieni się na największą. Więcej informacji znajdziecie w filmie:
  23. Cześć, nie dawno wpadłem na pomysł małego tuningu swoich zasłon. Przy użyciu ESP8266, dwóch servomotorów MG996R 360, 4 czujnikow kontkatronowych i wydruku 3D. Projekt jest zasilany z 5v ładowarki od jbl W lecie oraz w słoneczne dni oglądanie telewizji w moim domu jest niemalże niemożliwe. Dostęp do rolety po lewej stronie jest nieco utrudniony , przez stojąca pod oknem klatkę królika. Urządzenia tego typu są stosunkowo drogie. Więc wraz ze szwagrem wpadliśmy na pomysł zbudowania automatu, który będzie odpowiadał za sterowanie zaslonami/ roletami okiennymi. Póki co sterowanie ogranicza się do http i rolety sterowane sa pojedynczo przez ograniczenie prądowe zasilacza impulsowego. Lecz finalnie chcemy go rozbudować o moduł czujnika natężenia światła oraz o optocoupler podłączony do usb telewizora. Które po włączeniu tv będzie miało stan wysoki, sygnał z modułu optocouplera będzie docierał do esp i na podstawie odczytu z czujnika światła; Płytka będzie decydowała czy zasłonić oba okna, czy jedno będzie wystarczające. Zaś po jego wyłączeniu będą się one automatycznie podnosić, tak aby w domu nie było ciemno przez cały czas. Myślę że projekt jest stosunkowo ciekawy i prosty do wykonania dla majsterkowiczów. Przez zastosowanie serwa udało się zmniejszyć rozmiary samego urządzenia. W przypadku zastosowania silnika krokowego i przekładni były sporo większy. Link do prezentacji YouTube: Poniżej załączam listę komponentów: -1x Esp 8266 -4x czujniki kontaktronowe (okienne) https://allegro.pl/oferta/kontaktron-boczny-czujnik-do-okien-drzwi-b-1p-10973809269?snapshot=MjAyMi0wMS0zMVQyMzoxNjo1NS44NThaO2J1eWVyOzA2ZWI1NmEyMTQ3ODljNmVkMWIzM2QyZWMzNDJiNjEwOGI3MzE4OGQ3MTkxNDMxMmU4ZmRkYzMxN2UzOWRkM2U%3D -2x servo MG996R https://allegro.pl/oferta/serwo-mg996r-metalowe-zebatki-15kg-360-11755893673?snapshot=MjAyMi0wMS0zMFQxNToxNjowMS43NzdaO2J1eWVyO2Q4NzBmNjY2OTRkMzc0ZDA1NzkzNjBhNjA2ZThhZGI5NWFiZTY3Nzk5YmQ4Mzg3N2NhODI5OWVkNzhhMGUzNGE%3D -4m przewodu wykorzystywanego w instalacjach alarmowych -2x wtyk usb https://electropark.pl/pl/p/Wtyk-USB-typ-A/475 - zasilacz impulsowy 5v 2,5A -2x moduł czujnika światła https://electropark.pl/pl/p/Modul-natezenia-swiatla-fotorezystor/9542 -12X klips do mocowania przewodu https://www.castorama.pl/klips-z-tasm-na-przew-5mm-4szt-id-1108710.html
  24. Witam chciał bym zaprezentować , drugą "lepszą wersję " kierownicy do komputera opartej na Arduino Leonardo. Film pokazujący jak dziala kierownica i Force Feedback: Jest to wersja elektronicznie taka sama jak poprzednia, wszystko opisane wcześniej link do poprzedniej tutaj : W tej wersji zmieniłem obudowę na znacznie mniejszą , lżejszą , łatwa do zamocowania przy stole, biurku itp. Obudowa została wykorzystana z kupionej przeze mnie za 50 zł kierownicy Logitech Formula Force Ex o obrocie 180* i Force Feedback. Dzięki temu że kierownica miała już przekładnie i ogólnie jest prosta w budowie , bardzo łatwo i tanio można ją przerobić tak aby miala kąt skrętu taki jak ustawimy sobie w programie np 720*,900* i Force Feedback do tego kąta obrotu. Tutaj link do gotowego software na Arduino Leonardo , od razu mówię że na Arduino Uno nie zadziała , link do pobrania w opisie filmu: Ja zrobiłem to tak: Na początku przez środek starej przekładni , dodałem pręt gwintowany o średnicy 10mm ,do którego z jednej strony mocowana jest kierownica, a z drugiej enkoder z drukarki canon ip2770. Aby zamocować enkoder musiałem wyciąć dziure jak widać na zdjęciu poniżej : Aby enkoder nie tarł o blat , dodałem plastikowe podkładki : A tak wygląda już gotowa sama kierownica: Wyjścia enkodera i do silnika , zostały przerobione na standardowych wyjściach które były w kierownicy i wchodzą do dodatkowej skrzynki w której znajduje się reszta elektroniki czyli w sumie tylko Arduino Leonardo i sterownik silników BTS7960: Jeszcze pedal box został przerobiony na taki aby miał 3 jednakowe pedały więc musiałem dokupić drugie takie same i wyciąć jeden i dokleić tak jak na zcjeciach . Schemat podłączenia wszystkiego w linku do wcześniejszej wersji. Efekt końcowy (pedały jeszcze stare): To by było na tyle , jeśli czegoś ktoś potrzebuje , śmiało pisać 🙂
  25. Cześć wszystkim, potrzebuję zbudować audio switcha takiego jak na znalezionym schemacie lecz nie potrafię dobrać odpowiedni przełącznik obrotowy i w tej sprawie właśnie pisze do was tu na forum.
×
×
  • 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.