Przeszukaj forum
Pokazywanie wyników dla tagów 'projekt'.
Znaleziono 11 wyników
-
Cześć, pasjonaci elektroniki i robotyki! Chciałbym się z Wami podzielić moim najnowszym projektem DIY, który ożywił moją fascynację mechanicznymi konstrukcjami – SpyderBotem. To czteronożny robot, którym steruję bezprzewodowo za pomocą Raspberry Pi Pico 2 W, wykorzystując przeglądarkę internetową, a nawet podłączony kontroler do gier retro SNES! Pomysł narodził się z chęci stworzenia mobilnej platformy, którą mógłbym kontrolować intuicyjnie, jednocześnie pogłębiając wiedzę z zakresu programowania mikrokontrolerów i komunikacji sieciowej. Chociaż droga do w pełni działającego pająka była pełna wyzwań, satysfakcja z każdego postępu była ogromna. Wiele kluczowych komponentów, które posłużyły mi w tym projekcie, znalazłem w sklepie Botland.pl, co znacząco ułatwiło budowę. [Potrzebne elementy] Oto lista komponentów, które były niezbędne do zbudowania mojego SpyderBota. Jest to mieszanka specjalistycznych modułów i bardziej ogólnych części, które udało mi się zebrać. > 2 x DFRobot Pająk KIT - zestaw montażowy: To one stanowiły bazę dla ruchomych nóg i korpusu pająka. W skład zestawów wchodzą również 2 x silniki DC, które napędzają ruch. Zestawy są świetnie przemyślane, a instrukcja montażu prosta i klarowna, co pozwoliło mi szybko złożyć mechaniczne części. > 1 x Pololu Dwukanałowy Sterownik Silników DRV8835: Niezastąpiony do precyzyjnego sterowania dwoma silnikami DC. Jego niewielkie rozmiary i wydajność idealnie pasowały do kompaktowej budowy robota. > 1 x Przetwornica Step-Up U3V16F5 - 5V 2A - Pololu 4941: Absolutnie kluczowa dla zapewnienia stabilnego zasilania 5V dla Raspberry Pi Pico W i pozostałej elektroniki, bezpośrednio z akumulatora Li-ion. Bez niej, napięcie z baterii byłoby zbyt niskie. > 1 x Ładowarka Li-Pol TP4056 (pojedyncza cela 1S 3,7V microUSB z zabezpieczeniami): Prosta i skuteczna do ładowania baterii Li-ion. > 1 x Kontroler do gier retro SNES - fioletowe przyciski: Wykorzystany do intuicyjnego sterowania robotem. > 4 x Tuleja dystansowa mosiężna - 25mm > 4 x Tuleja dystansowa mosiężna - 30mm (pochodzące z zestawu podwozia 4WD): Wykorzystałem je do stworzenia stabilnej konstrukcji, montując płytki PCB na odpowiedniej wysokości. > Goldpin wtyk i gniazdo: Do wygodnego łączenia modułów. > 1 x Płytka stykowa - 170 otworów biała: Niezastąpiona na etapie prototypowania. > 2 x Czerwone diody LED justPi: Do sygnalizacji statusu pracy, np. połączenia Wi-Fi. > 1 x Koszyk na baterie (4xAA): Główne źródło zasilania dla 2 silników DC. > 1 x Obudowa od iPhone 5: Kreatywne wykorzystanie do stworzenia korpusu/miejsca na elektronikę robota. > 1 x Bateria Li-ion (pozyskana z iPhone 5): Główne źródło zasilania dla Raspberry Pi Pico W. > Śrubki M3 6mm: Do mocowania wszystkich elementów. > Raspberry Pi Pico 2 W: Mózg robota, odpowiedzialny za komunikację Wi-Fi i sterowanie silnikami. [Budowa mechaniczna i montaż elektroniki] Budowę SpyderBota rozpocząłem od mechanicznego złożenia nóg i ramy pająka, zgodnie z instrukcją zestawów DFRobot. Kluczowym krokiem było zaadaptowanie obudowy iPhone'a 5 – stała się ona idealnym, lekkim korpusem, w którym zamknąłem całą elektronikę. Na górnej części obudowy zamontowałem Raspberry Pi Pico W oraz przetwornicę step-up i ładowarkę TP4056. Sterownik silników DRV8835 znalazł swoje miejsce na spodzie, bliżej silników, co zminimalizowało długość przewodów. Tuleje dystansowe zapewniły odpowiednie oddzielenie warstw i sztywność konstrukcji. Całość jest dość kompaktowa i estetyczna, jak na robota DIY! [Schemat połączeń i oprogramowanie] Sercem SpyderBota jest Raspberry Pi Pico W, który pełni rolę serwera WWW. Dzięki niemu, robot jest dostępny poprzez sieć Wi-Fi, co umożliwia sterowanie z dowolnego urządzenia z przeglądarką. Pico W jest zasilane z baterii Li-ion poprzez przetwornicę step-up, gwarantującą stabilne 5V. Dwa silniki DC są podłączone do sterownika DRV8835, który z kolei jest zasilany niezależnie z koszyka na baterie AA. Po wielu testach ustaliłem, że Motor A to silnik prawy, natomiast Motor B to silnik lewy. To bardzo ważne dla prawidłowego mapowania kierunków ruchu robota. Dioda LED na Pico W służy do sygnalizacji statusu połączenia Wi-Fi – miga podczas próby połączenia, a świeci światłem ciągłym po pomyślnym nawiązaniu. Oprogramowanie napisane w MicroPythonie obsługuje zapytania HTTP z przeglądarki, przekładając je na odpowiednie komendy dla silników (np. /start_forward_fast czy /stop). [Testy, debugowanie i sterowanie gamepadem] Najbardziej ekscytującą częścią projektu, a zarazem źródłem największych wyzwań, było zaimplementowanie sterowania za pomocą kontrolera gier retro SNES poprzez Gamepad API w przeglądarce. Początkowe mapowanie przycisków okazało się sporym orzechem do gryzienia, ponieważ indeksy przycisków Gamepad API mogą różnić się w zależności od producenta i modelu kontrolera. Wiele godzin spędziłem na debugowaniu, naciskając każdy przycisk i obserwując reakcję robota oraz logi w konsoli Thonny. Dzięki temu udało mi się ustalić następujące, potwierdzone i działające mapowania dla mojego kontrolera SNES-style: > Przycisk X (Indeks 0): Robot porusza się do przodu z dużą prędkością. > Przycisk A (Indeks 1): Robot porusza się do tyłu z dużą prędkością. > Przycisk B (Indeks 2): Prawy silnik (Motor A) porusza się do przodu. > Przycisk Y (Indeks 3): Robot wykonuje skręt w lewo. > Przycisk L1 (Indeks 4): Robot wykonuje skręt w prawo. > Przycisk Select (Indeks 8): Lewy silnik (Motor B) porusza się do tyłu. > Przycisk Start (Indeks 9): Robot porusza się do przodu (zapewne z domyślną prędkością ustawioną dla komendy /start_forward_fast). > Przycisk X (Indeks 14): Robot ZATRZYMUJE WSZYSTKIE ruchy. Ciekawostka: Okazało się, że mój kontroler raportuje przycisk "X" pod dwoma różnymi indeksami (0 i 14)! Musiałem dostosować logikę w kodzie JavaScript, aby indeks 14 zawsze wywoływał zatrzymanie, dając mu priorytet nad ruchem do przodu. To typowy przykład problemu, który można rozwiązać tylko przez praktyczne testowanie. Niestety, niektóre przyciski takie jak "R", "R1", "L" (jeśli jest inny niż L1) oraz przyciski kierunkowe (D-pad) nie wywołały żadnej reakcji na indeksach testowych (5, 6, 7, 10-13, 15-17). Możliwe, że mój kontroler ich nie raportuje, lub ich indeksy są poza standardowym zakresem. Dalsze eksperymenty z osiami analogowymi kontrolera (jeśli są dostępne) to kolejny krok do pełniejszej kontroli. # SPYDER-BOT BEST WORKING SCRIPT (GAMEPAD CONTROLS NEED TO BE CONFIGURED PROPERLY AND DEBUGGED) import network import time import rp2 import sys from machine import Pin, PWM import socket # --- Wi-Fi Credentials --- try: from secrets import SSID, PASSWORD, COUNTRY except ImportError: print("Create a 'secrets.py' file with SSID, PASSWORD, and COUNTRY.") sys.exit() # --- Broadcast IP address --- def broadcast_ip(ip_address): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) s.sendto(f"PICO_IP:{ip_address}".encode(), ('255.255.255.255', 5005)) s.close() # --- LED Feedback --- led = Pin('LED', Pin.OUT) # --- Motor Pin Setup --- MOTOR_A_AIN1_PIN = 20 MOTOR_A_AIN2_PIN = 21 MOTOR_B_BIN1_PIN = 7 MOTOR_B_BIN2_PIN = 6 motor_a_ain1 = Pin(MOTOR_A_AIN1_PIN, Pin.OUT) pwm_a_ain2 = PWM(Pin(MOTOR_A_AIN2_PIN)) pwm_a_ain2.freq(6000) motor_b_bin1 = Pin(MOTOR_B_BIN1_PIN, Pin.OUT) pwm_b_bin2 = PWM(Pin(MOTOR_B_BIN2_PIN)) pwm_b_bin2.freq(6000) MOTOR_A_IS_REVERSED = False MOTOR_B_IS_REVERSED = True # --- SPEED CONSTANTS --- LOWEST_CRAWL_SPEED = 41100 SLOW_SPEED = 48200 MEDIUM_SPEED = 57500 FAST_SPEED = 65535 # --- CALIBRATION --- MOTOR_A_CALIBRATION_FORWARD = 1.05 MOTOR_A_CALIBRATION_REVERSE = 0.91 MOTOR_B_CALIBRATION_FORWARD = 1.05 MOTOR_B_CALIBRATION_REVERSE = 0.91 def run_motor(name, fixed_pin, pwm_pin, direction, speed): calibrated_speed = speed if name == "A": if direction == "forward": calibrated_speed = int(speed * MOTOR_A_CALIBRATION_FORWARD) elif direction == "reverse": calibrated_speed = int(speed * MOTOR_A_CALIBRATION_REVERSE) elif name == "B": if direction == "forward": calibrated_speed = int(speed * MOTOR_B_CALIBRATION_FORWARD) elif direction == "reverse": calibrated_speed = int(speed * MOTOR_B_CALIBRATION_REVERSE) calibrated_speed = max(0, min(65535, calibrated_speed)) if direction == "forward": fixed_pin.value(0) pwm_pin.duty_u16(calibrated_speed) elif direction == "reverse": fixed_pin.value(1) pwm_pin.duty_u16(65535 - calibrated_speed) elif direction == "brake": fixed_pin.value(1) pwm_pin.duty_u16(65535) else: # coast fixed_pin.value(0) pwm_pin.duty_u16(0) def stop_all(): run_motor("A", motor_a_ain1, pwm_a_ain2, "coast", 0) run_motor("B", motor_b_bin1, pwm_b_bin2, "coast", 0) # --- CONTINUOUS MOVEMENT --- def start_walk_forward(speed): dir_a = "reverse" if not MOTOR_A_IS_REVERSED else "forward" dir_b = "reverse" if not MOTOR_B_IS_REVERSED else "forward" run_motor("A", motor_a_ain1, pwm_a_ain2, dir_a, speed) run_motor("B", motor_b_bin1, pwm_b_bin2, dir_b, speed) def start_walk_reverse(speed): dir_a = "forward" if not MOTOR_A_IS_REVERSED else "reverse" dir_b = "forward" if not MOTOR_B_IS_REVERSED else "reverse" run_motor("A", motor_a_ain1, pwm_a_ain2, dir_a, speed) run_motor("B", motor_b_bin1, pwm_b_bin2, dir_b, speed) def start_turn_left(speed): # To turn left continuously: motor A backward, motor B forward dir_a = "reverse" if not MOTOR_A_IS_REVERSED else "forward" dir_b = "forward" if not MOTOR_B_IS_REVERSED else "reverse" run_motor("A", motor_a_ain1, pwm_a_ain2, dir_a, speed) run_motor("B", motor_b_bin1, pwm_b_bin2, dir_b, speed) def start_turn_right(speed): # To turn right continuously: motor A forward, motor B backward dir_a = "forward" if not MOTOR_A_IS_REVERSED else "reverse" dir_b = "reverse" if not MOTOR_B_IS_REVERSED else "forward" run_motor("A", motor_a_ain1, pwm_a_ain2, dir_a, speed) run_motor("B", motor_b_bin1, pwm_b_bin2, dir_b, speed) def connect_wifi(ssid, password, country): wlan = network.WLAN(network.STA_IF) wlan.active(True) rp2.country(country) wlan.connect(ssid, password) for _ in range(30): if wlan.isconnected(): break led.toggle() time.sleep(1) if wlan.isconnected(): led.value(1) return wlan.ifconfig()[0] led.value(0) return None def run_web_server(ip): addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1] s = socket.socket() s.bind(addr) s.listen(1) print(f"Web server running at http://{ip}") while True: cl, addr = s.accept() request = cl.recv(1024).decode() print(f"Request: {request}") # Movement commands if "/start_forward_slow" in request: start_walk_forward(SLOW_SPEED) cl.send("HTTP/1.1 200 OK\r\nContent-Length: 2\r\n\r\nOK".encode()) elif "/start_forward_medium" in request: start_walk_forward(MEDIUM_SPEED) cl.send("HTTP/1.1 200 OK\r\nContent-Length: 2\r\n\r\nOK".encode()) elif "/start_forward_fast" in request: start_walk_forward(FAST_SPEED) cl.send("HTTP/1.1 200 OK\r\nContent-Length: 2\r\n\r\nOK".encode()) elif "/start_reverse_slow" in request: start_walk_reverse(SLOW_SPEED) cl.send("HTTP/1.1 200 OK\r\nContent-Length: 2\r\n\r\nOK".encode()) elif "/start_reverse_medium" in request: start_walk_reverse(MEDIUM_SPEED) cl.send("HTTP/1.1 200 OK\r\nContent-Length: 2\r\n\r\nOK".encode()) elif "/start_reverse_fast" in request: start_walk_reverse(FAST_SPEED) cl.send("HTTP/1.1 200 OK\r\nContent-Length: 2\r\n\r\nOK".encode()) elif "/stop" in request: stop_all() cl.send("HTTP/1.1 200 OK\r\nContent-Length: 2\r\n\r\nOK".encode()) # Continuous turn (hold) elif "/start_turn_left" in request: start_turn_left(FAST_SPEED) cl.send("HTTP/1.1 200 OK\r\nContent-Length: 2\r\n\r\nOK".encode()) elif "/start_turn_right" in request: start_turn_right(FAST_SPEED) cl.send("HTTP/1.1 200 OK\r\nContent-Length: 2\r\n\r\nOK".encode()) # Single motor debug elif "/motor_a_forward" in request: run_motor("A", motor_a_ain1, pwm_a_ain2, "reverse", SLOW_SPEED) run_motor("B", motor_b_bin1, pwm_b_bin2, "coast", 0) cl.send("HTTP/1.1 200 OK\r\nContent-Length: 2\r\n\r\nOK".encode()) elif "/motor_a_reverse" in request: run_motor("A", motor_a_ain1, pwm_a_ain2, "forward", SLOW_SPEED) run_motor("B", motor_b_bin1, pwm_b_bin2, "coast", 0) cl.send("HTTP/1.1 200 OK\r\nContent-Length: 2\r\n\r\nOK".encode()) elif "/motor_b_forward" in request: run_motor("B", motor_b_bin1, pwm_b_bin2, "forward", SLOW_SPEED) run_motor("A", motor_a_ain1, pwm_a_ain2, "coast", 0) cl.send("HTTP/1.1 200 OK\r\nContent-Length: 2\r\n\r\nOK".encode()) elif "/motor_b_reverse" in request: run_motor("B", motor_b_bin1, pwm_b_bin2, "reverse", SLOW_SPEED) run_motor("A", motor_a_ain1, pwm_a_ain2, "coast", 0) cl.send("HTTP/1.1 200 OK\r\nContent-Length: 2\r\n\r\nOK".encode()) else: # Serve the control page HTML (same as before, just removed burst buttons) response_html = """\ HTTP/1.1 200 OK Content-Type: text/html <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>SpyderBot Control</title> <style> body { font-family: sans-serif; text-align: center; margin: 20px; background-color: #f0f0f0; } h1 { color: #333; } h2 { color: #555; margin-top: 30px; margin-bottom: 10px; } .button-row { display: flex; flex-wrap: wrap; justify-content: center; gap: 12px; margin-bottom: 25px; } button { flex: 1 0 130px; max-width: 160px; padding: 15px 20px; font-size: 1.1em; cursor: pointer; border: none; border-radius: 8px; transition: background-color 0.3s; user-select: none; } button:active { filter: brightness(0.85); } .move-btn { background-color: #007bff; color: white; } .move-btn:hover { background-color: #0056b3; } .turn-btn { background-color: #ffc107; color: #333; } .turn-btn:hover { background-color: #e0a800; } .stop-btn { background-color: #dc3545; color: white; max-width: 320px; } .stop-btn:hover { background-color: #c82333; } a { text-decoration: none; } </style> </head> <body> <h1> SpyderBot Remote Control</h1> <h2>Debug: Single Motor Test</h2> <div class="button-row"> <a href="/motor_a_forward"><button class="move-btn">Motor A Forward</button></a> <a href="/motor_a_reverse"><button class="move-btn">Motor A Backward</button></a> <a href="/motor_b_forward"><button class="move-btn">Motor B Forward</button></a> <a href="/motor_b_reverse"><button class="move-btn">Motor B Backward</button></a> </div> <h2>Move Forward (Hold to move)</h2> <div class="button-row"> <button class="move-btn" onmousedown="startMove('forward_slow')" onmouseup="stopMove()" ontouchstart="startMove('forward_slow')" ontouchend="stopMove()">Slow</button> <button class="move-btn" onmousedown="startMove('forward_medium')" onmouseup="stopMove()" ontouchstart="startMove('forward_medium')" ontouchend="stopMove()">Medium</button> <button class="move-btn" onmousedown="startMove('forward_fast')" onmouseup="stopMove()" ontouchstart="startMove('forward_fast')" ontouchend="stopMove()">Fast</button> </div> <h2>Move Backward (Hold to move)</h2> <div class="button-row"> <button class="move-btn" onmousedown="startMove('reverse_slow')" onmouseup="stopMove()" ontouchstart="startMove('reverse_slow')" ontouchend="stopMove()">Slow</button> <button class="move-btn" onmousedown="startMove('reverse_medium')" onmouseup="stopMove()" ontouchstart="startMove('reverse_medium')" ontouchend="stopMove()">Medium</button> <button class="move-btn" onmousedown="startMove('reverse_fast')" onmouseup="stopMove()" ontouchstart="startMove('reverse_fast')" ontouchend="stopMove()">Fast</button> </div> <h2>Hold to Turn</h2> <div class="button-row"> <button class="turn-btn" id="hold-left">⟲ Hold Left</button> <button class="turn-btn" id="hold-right">⟳ Hold Right</button> </div> <p><a href="/stop"><button class="stop-btn">STOP ALL MOTION</button></a></p> <p>Note: Hold Forward/Backward buttons to move continuously. Release to stop.<br>Hold turn buttons to turn continuously.</p> <script> function startMove(speed) { fetch('/start_' + speed); } function stopMove() { fetch('/stop'); } // Hold-to-turn logic const leftBtn = document.getElementById("hold-left"); const rightBtn = document.getElementById("hold-right"); function startTurn(direction) { fetch('/start_turn_' + direction); } function stopTurn() { fetch('/stop'); } // Mouse controls leftBtn.addEventListener("mousedown", () => startTurn('left')); leftBtn.addEventListener("mouseup", stopTurn); rightBtn.addEventListener("mousedown", () => startTurn('right')); rightBtn.addEventListener("mouseup", stopTurn); // Touch controls (mobile) leftBtn.addEventListener("touchstart", (e) => { e.preventDefault(); startTurn('left'); }); leftBtn.addEventListener("touchend", (e) => { e.preventDefault(); stopTurn(); }); rightBtn.addEventListener("touchstart", (e) => { e.preventDefault(); startTurn('right'); }); rightBtn.addEventListener("touchend", (e) => { e.preventDefault(); stopTurn(); }); // Gamepad API integration window.addEventListener("gamepadconnected", (e) => { console.log("Gamepad connected:", e.gamepad); }); // SNES button mapping (adjust for your specific gamepad if needed) const buttonMap = { 2: () => fetch("/start_forward_fast"), // B button 1: () => fetch("/start_reverse_fast"), // A button 4: () => fetch("/start_turn_left"), // L1 button 0: () => fetch("/start_turn_right"), // X button 9: () => fetch("/stop"), // 'Start' button button → STOP ALL }; # // working controls # //[0 = X button], [1 = A button], [2 = B button], [3 = Y button], [4 = L1], [8 = 'Select' button], [9 = 'Start' button], [14 = X button (dual with 0)] const activeButtons = new Set(); // To track currently pressed buttons function pollGamepad() { const gp = navigator.getGamepads()[0]; // Get the first connected gamepad if (gp) { gp.buttons.forEach((btn, i) => { const isPressed = btn.pressed; const wasPressed = activeButtons.has(i); if (isPressed && !wasPressed) { activeButtons.add(i); if (buttonMap[i]) { buttonMap[i](); // Execute the mapped function } } else if (!isPressed && wasPressed) { activeButtons.delete(i); // Stop motion on release for continuous movement buttons if ([0, 1, 14, 15].includes(i)) { fetch("/stop"); } } }); } requestAnimationFrame(pollGamepad); // Continue polling } pollGamepad(); // Start the gamepad polling loop </script> </body> </html> """ cl.send(response_html.encode()) cl.close() # --- MAIN --- if __name__ == '__main__': ip = connect_wifi(SSID, PASSWORD, COUNTRY) if ip: print(f"Connected! IP: {ip}") broadcast_ip(ip) run_web_server(ip) else: print("Failed to connect to Wi-Fi.") [Podsumowanie i dalsze plany] SpyderBot to dla mnie dowód na to, że nawet z prostych komponentów można stworzyć zaawansowanego robota, a nauka przez praktykę jest najskuteczniejsza. Rozwiązanie problemów z mapowaniem gamepada było frustrujące, ale ostatecznie bardzo pouczające. Najlepszą częścią tego projektu (i wielu innych potencjalnych robotów, podwozi, czy elementów dostępnych w Botland.pl) jest to, że nie podąża się za sztywną instrukcją, budując robota niczym meble z Ikei, gdzie każdy egzemplarz wygląda identycznie. Wręcz przeciwnie! Istnieje ogromna swoboda i pole do popisu dla kreatywności, by stworzyć całkowicie spersonalizowanego robota. Ta właśnie możliwość modyfikacji, adaptacji i tworzenia czegoś własnego stanowi zarówno część wyzwania, jak i ogromną część zabawy – to właśnie w niej tkwi prawdziwa wartość i przyjemność z majsterkowania! W przyszłości planuję rozbudować robota o dodatkowe funkcje, takie jak detekcja przeszkód za pomocą ultradźwięków, sterowanie prędkością proporcjonalne do wychylenia gałek analogowych na gamepadzie, a może nawet transmisję wideo! Mam nadzieję, że mój projekt zainspiruje Was do tworzenia własnych, unikalnych konstrukcji. Pamiętajcie, że nawet jeśli nie wszystko pójdzie gładko od razu, to wytrwałość w debugowaniu przynosi największą satysfakcję! Szczególne podziękowania dla Botland.pl! Bez szerokiego wyboru komponentów, które znalazłem w Waszym sklepie, ten projekt nie byłby możliwy do zrealizowania. Dziękuję za wsparcie społeczności DIY!
-
Dobra a więc tak robie swój pierwszy projekt czyli mój gameboy i żeby jakoś zasilić arduino kupiłem baterie lipo 1000mah 3,7v i moduł solar charger shield od seeed naładowałem baterie i podłączyłem moduł do arduino wgrałem kod na gameboya i włączyłem zasilanie a dioda na arduino sie zaswieciła na zielono lecz arduino nie wykonuje kodu czy ktoś może mi coś poradzić?
-
Praca Zlecę przygotowanie prototypu mini-wyciągarki
zork opublikował temat w Sprzedam/Kupię/Zamienię/Praca
Zlecę budowę prototypu mini-wciągarki składającej się z: - silnika krokowego - przekładni ślimakowej (lub innej kątowej) - szpuli rozwijanej z linką stalową 2mm - wyłącznika krańcowego zintegrowanego ze sprężyną wypychającą. - udźwig max do 5kg Sterowanie silnikiem będzie realizowane docelowo przez Wobit SIC174 (przygotowanie oprogramowania do sterowania jest poza zakresem zadania, do testów można użyć dowolnego sterownika). Zakres prac: - dobór silnika, przekładni, wielkości szpuli do planowanego obciążenia. - opracowanie rozwiązania dla wyłącznika krańcowego. - przygotowanie projektu mocowań, wydruk 3D - złożenie i przetestowanie prototypu. Wynik prac: - działający prototyp w oparciu o wydruki 3D - projekt pozwalający wykonanie wersji finalnej: projekty elementów wymagających cięcia CNC lub wydruku 3D - lista innych części wymagających zakupu. Jeżeli ktoś jest zainteresowany to proszę o wiadomość prywatną.- 1 odpowiedź
-
Witam, szukam dodatku/programu pozwalającego na ustawienie okienek w visual studio tak jak to wygląda w windows forms ale działającego na linuxe. W skrócie program ma komunikować sie przez modbus z arduino a te dane chce chce wyświetlić na monitorze i mieć klikalne przyciski i tym podobne. Ewentualnie jakieś inne rozwiązanie okienkowe chociaż najlepszy był by program klikalny najlepiej darmowy
- 2 odpowiedzi
-
- Raspberry Pi
- linux
- (i 3 więcej)
-
Witam, chciałbym zrobić projekt zdolny pobierać oraz magazynować energię z otoczenia, wykorzystujący dedykowaną do tego przetwornicę LTC3588. Mam jednak problem z określeniem wyprowadzeń na zakupionym układzie przetwornicy, ponieważ załączone do niego noty katalogowe dotyczą wyprowadzeń samej przetwornicy (płytka posiada dodatkowo połączone elementy, a wyprowadzenia posiadają inne nazwy). Cała zakupiona płytka posiada zbudowany jeden z zaproponowanych w nocie katalogowej układów, załączony na zdjęciu. Czy ktoś mógłby pomóc mi w ustaleniu odpowiedniego połączenia z tą płytką źródła energii z zastosowaniem magazynu energii oraz pomóc określić rolę poszczególnych wyprowadzeń (do czego służy EN, co należy podłączać do Vin a co do Vcc)? Załączam dodatkowo zdjęcie oraz schemat układu oraz notę katalogową samej przetwornicy. ltc3588 data.pdf
-
- energy
- harvesting
-
(i 2 więcej)
Tagi:
-
Witam, na czym najlepiej zaprezentować do projektu jak działa 2 prawo kirchhoffa? Chodzi oczywiście o samochód osobowy.
-
Witam potrzebuje pomocy jakiś czas temu zlecilem komuś zrobienie tablicy ledowej 100cm/50cm składającej się z 15 rzędów po 30 ledów ws2812b połączonych szeregowo do tego kupiłem arduino uno rev3 zasilacz impulsów 12v 20.8A 250w oraz przetwornice lm2596 wszystko jest naklejane na plexi 100x50 z tego co mi pisał chłopak co mi to wszystko montuje że jest problem z zasilaniem led wiem jeszcze to że do każdego z pasków poprowadził oddzielną zasilanie z przetwornice aby nie było spadku napiecia Zamierzam zabrać od niego wszystko i dokończyć samemu zostawię mu tylko kwestie programowania arduino bo se chłopak nie radzi Pomóżcie mi jak to mam przerobić żeby zaczęło działać czy mam coś do tego dokupić bo myślałem o wymianie przetwornice na mocniejszą ale jaką była by dobra Kurczę pomocy bo to ma być prezent dla syna który się bawi w Yutube i mało się tam wyświetlać jego nik i takie są tam Pozdrawiam Kamil
- 3 odpowiedzi
-
- Arduino
- ledy adresowaln
- (i 3 więcej)
-
Witam forumowiczów, jestem w trakcie tworzenia pracy inżynierskiej i jako temat mam "Czujnik jakości powietrza" oparty o Arduino. Dostępne mam następujące czujniki: gazu (MQ-2, MQ-3, MQ-5, MQ-135), temperatury (BME280) oraz cząstek stałych (PMS7003). W planach mam jeszcze zakup modułu WiFi, żeby móc przesłać i wyświetlać dane mobilnie. Całość będzie oparta o płytkę Maker Uno. W planach nie mam korzystać z każdego elementu z listy, a prawdopodobnie skupię się na dwóch czujnikach gazu (najpewniej z czujnika MQ-2 oraz MQ-135), czujniku temperatury oraz cząstek stałych wraz z modułem wifi. Pierwsze podłączenia i testy czujników są już za mną poza czujnikiem pyłu. W tym momencie staram się zrozumieć i znaleźć sposób na kalibrację MQ-2. Chodzi mi zarówno od strony technicznej (zrozumienie wykresów z dokumentacji) jak i od strony praktycznej. Oczywiście, jeśli ktoś ma chęci i czas to nie pogardziłbym pomocą w tej materii. Poza tym udało mi się znaleźć jakiś kod do kalibracji, który w większości rozumiem, poza niektórymi zmiennymi. Pozdrawiam
-
Już wcześniej pisałem na forum o mojej szklarni. Więc podpiąłem wszystko (2 linijki diód(10),termometr cyfrowy,wyświetlacz,fotorezystor, buzzer, czujnik wilgotności,pompę 12v, wentylator 12v)i nie działa. Do zasilania Arduino używam Stabilizowanego zasilacza sieciowego - dogniazdkowego 230 V AC. Napięcie wyjściowe wynosi 12 V DC. Prąd wyjściowy: 1,5 A - 2 A. Podpiąłem do gniazdka i jak wszystko na raz jest włączone to przestaje działać (chyba, że podepnę arduino także do komputera). Stabilizator napięcia na arduino się grzeje. Proszę o pomoc.
- 16 odpowiedzi
-
- Arduino
- nie działa
-
(i 1 więcej)
Tagi:
-
Witam serdecznie wszystkich czytelników. Chciałbym wam dziś przedstawić mój projekt jaki wykonałem na zakończenie technikum. Mianowicie zaprojektowałem i zbudowałem router sieciowy wyposażony w 5 portów ethernet oraz WIFI 2,4Ghz i 2x2 MIMO. Projekt zacząłem od wybrania jednostki sterującej , znajomy elektronik polecił mi SKW92a. Jest to mały moduł idealny do tego typu zastosowań. Można na nim uruchomić OpenWRT, bardzo ekonomiczna w zajmowane miejsce na dysku( tylko około 8 MB) wersja Linuxa. Tak więc użyłem tego modułu do budowy tego urządzenia. Następną rzeczą do zrobienia było dobranie zasilania. Chciałem aby router mógł być zasilany z np.takiej oto ładowarki , gdyż wejście microUSB i 5V jest dość popularne w dzisiejszych czasach. SKW92a działa jednak na zasilaniu 3,3V, konieczne więc było dodanie przetwornicy z 5V na 3,3V. Postanowiłem dodać jeszcze LEDy , aby służyły jako wskaźniki oraz port USB który będzię mógł posłużyć do podłączenia pamięci zewnętrznej w razie potrzeby przywrócenia systemu. Na końcu oczywiście też filtry dopasowujące transmisje ethernet i porty szeregowe do debuggowania. Projekt PCB routera Zaprojektowałem płytkę w Ki-Cadzie, dodałem swoje logo i wysłałem do produkcji ( sam proces projektowania PCB , rysowania footprintów itp. zajął około 30 h). Po polutowaniu wszystkiego router zaczął nabierać kształtu. Wszystko na miejscu Niestety pierwsze uruchomienie nie poszło zbyt kolorowo, gdyż mimo poboru prądu nie dało się wejść przez UART do SKW , po dogłębnej diagnostyce okazało się że nie jest to błąd portu szeregowego ale przetwornicy która była wadliwa.Musiałem umieścić tam osobną przetwornice step-down na osobnej płytce. Po tym zabiegu router zaczął działać wyśmienicie. Działający router Zainstalowanie OpenWRT nie było większym problemem, a także późniejsza konfiguracja była dość prosta. Z pomocą znajomego odkryliśmy że bez problemu można także przełączyć router w tryp switcha i można nawet tworzyć VLANy. Ostatnią rzeczą do zrobienia zostało zrobić ładną obudowę, którą zaprojektowałem w programie Designspark mechanical i wydrukowałem w drukarce 3D. Obudowa A tak wygląda w pełni działający router Dziękuję za uwagę i zapraszam do zadawania pytań w komentarzach
-
Witam wszystkich chciałbym Wam dzisiaj pokazać sejf mojego autorstwa. Może on być głównie wykorzystywany jako ciekawostka lub zabawka. Projekt powstał w celu nauczenia się podstaw arduino. Ostatnio nauczyłem się sterowania silniczkami oraz przechwytywania liczb z klawiatury. Po połączeniu tych umiejętności z podstawami programowania powstał ten projekt sejfu. Przy tworzeniu tego projektu wykorzystałem następujące materiały: Arduino Uno Klawiaturę numeryczną Serwo potencjometr Przewody połączeniowe męsko-damskie Wykonanie: Projekt został wykonany z elementów jakie posiadałem w domu. Do Arduino podłączone są przewody, które łączą się z serwem (zasilanie, masa oraz sygnał sterujący). Przewody z wyświetlacza są podłączone bezpośrednio do Arduino poza V0. Ponadto, V0 zostało zintegrowane z potencjometrem i służy do regulacji kontrastu wyświetlacza. Układ jest zasilany baterią 9V za pomocą odpowiedniego adaptera Działanie projektu: Program przechwytuje z klawiatury kod wpisywany przez użytkownika. Jeśli kod jest prawidłowy to uruchamia się serwo i otwiera skrytkę. Jeśli kod jest nie prawidłowy program informuje użytkownika o niepoprawnym haśle. Na klawiaturze znajdują się klawisze A, B, C, D, # i *. Mój program ich nie wykorzystuje, ale jeśli ktoś chce wykonać taki projekt to może je wykorzystać. Po kliknięciu wyżej wymienionych klawiszy program informuje o naciśnięciu złego klawisza. Kod: #include <Servo.h> #include <LiquidCrystal.h> // biblioteka do LCD #include <Keypad.h> //biblioteka do klawiatury Servo servo; int pos = 40; char* password ="7890"; //hasło int pozisyon = 0; int przycisk = 0; const byte rows = 4; const byte cols = 4; char keyMap [rows] [cols] = { {'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'} }; byte rowPins [rows] = {1, 2, 3, 4}; byte colPins [cols] = {5, 6, 7, 8}; Keypad myKeypad = Keypad( makeKeymap(keyMap), rowPins, colPins, rows, cols); LiquidCrystal lcd (A0, A1, A2, A3, A4, A5); void setup(){ servo.attach(9); lcd.begin(16, 2); setLocked (true); przycisk = 0; } void loop(){ setLocked (true); char whichKey = myKeypad.getKey(); lcd.setCursor(0, 0); lcd.print(" Witam"); lcd.setCursor(0, 1); lcd.print(" Wpisz haslo"); if(whichKey == '*' || whichKey == '#' || whichKey == 'A' || whichKey == 'B' || whichKey == 'C' || whichKey == 'D'){ przycisk=0; pozisyon=0; setLocked (true); lcd.clear(); lcd.setCursor(0, 0); lcd.print("ZLY PRZYCISK"); delay(1000); lcd.clear(); } if(whichKey == '0' || whichKey == '1' || whichKey == '2' || whichKey == '3' || //define keys whichKey == '4' || whichKey == '5' || whichKey == '6' || whichKey == '7' || whichKey == '8' || whichKey == '9'){ przycisk++; } if(przycisk == 5){ przycisk = 0; lcd.clear(); lcd.setCursor(0,0); lcd.write(" ZA DUZO"); lcd.setCursor(0,1); lcd.write(" ZNAKOW"); delay(1000); lcd.clear(); } if(przycisk == 1){ lcd.clear(); lcd.setCursor(0,1); lcd.write(" *"); } if(przycisk == 2){ lcd.clear(); lcd.setCursor(0,1); lcd.write(" **"); } if(przycisk == 3){ lcd.clear(); lcd.setCursor(0,1); lcd.write(" ***"); } if(przycisk == 4){ lcd.clear(); lcd.setCursor(0,1); lcd.write(" ****"); } if(przycisk == 4 && pozisyon < 3){ lcd.clear(); lcd.setCursor(0,0); lcd.write(" ZLE"); lcd.setCursor(0,1); lcd.write(" HASLO"); delay(1000); przycisk = 0; lcd.clear(); } if(whichKey == password [pozisyon]){ pozisyon ++; } if(pozisyon == 4){ przycisk = 0; pozisyon = 0; setLocked (false); lcd.clear(); lcd.setCursor(0, 0); lcd.print("*** Verified ***"); delay(3000); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Skrytka zamknie"); lcd.setCursor(0, 1); lcd.print(" sie za 5s"); delay(7000); lcd.clear(); } delay(100); } void setLocked(int locked){ if(locked){ servo.write(40); } else{ przycisk = 0; servo.write(130); } } Przyszłość projektu: Projekt można modyfikować (np. zmiana hasła przez użytkownika). Można też zmienić rodzaj zabezpieczenia z kodu czterocyfrowego na hasło z literami lub odcisk palca użytkownika. W najbliższej przyszłości zamierzam to połączyć z Raspberry Pi (rozpoznawanie twarzy) i Google AIY Voice Kit (komendy głosowe). Film: Zdjęcia:
