Przeszukaj forum
Pokazywanie wyników dla tagów 'RC'.
Znaleziono 12 wyników
-
- pierwsze pytanie czy to jest silnik BLDC. - ten zestaw napędza model samochodu w skali 1:10. - skrzynie biegów jest 3 stopniowa ale nie ma biegu wstecznego. - w skrzynię biegu bym nie ingerował, ale może coś można zmienić w tym ESC i silniku.
-
Trudne początki Tak naprawdę to jest chyba mój pierwszy projekt w świecie Arduino! Zamarzyłem sobie zbudowanie własnego, terenowego pojazdu zdalnie sterowanego - takiego, na którym można potem zamontować jakiś chwytak, ramię albo kamerkę z przekaźnikiem FPV. Kontroler Tu akurat nie miałem większego wyboru, bo wtedy pod ręką miałem akurat Arduino Leonardo. Zaletą tej płytki jest kompatybilność z popularnymi shieldami do Uno a także złącze microUSB typu B (zamiast mało popularnego złącza "drukarkowego" w Uno). Na potrzeby tego niezbyt skomplikowanego projektu moc obliczeniowa tej płytki jest również całkowicie wystarczająca. Podwozie Moim planem było zbudowanie definitywnego i niepokonanego łazika marsjańskiego, więc zwykłe podwozie nie wchodziło w grę - koniecznie musiało być terenowe. Przegrzebałem naprawdę połowę Internetu w poszukiwaniu tego idealnego podwozia (ale - nie ukrywajmy - mieszczącego się również w moim budżecie) i w końcu mój wybór padł na podwozie Dagu DG012-ATV z napędem na cztery koła. Nieco podwyższony prześwit w stosunku do innych podwozi (dający nadzieję na pokonywanie niewielkich przeszkód), napęd na cztery koła - wszystko to brzmiało bardzo zachęcająco. Czterema silnikami coś oczywiście musi obracać, razem z podwoziem nabyłem więc również czterokanałowy sterownik silników DFRobota (w postaci shieldu dla Arduino). Serwo i czujnik Żeby urozmaicić nieco projekt, dodałem do niego serwo modelarskie, na którym zamontowałem ultradźwiękowy czujnik odległości z założeniem, że spróbuję kiedyś napisać program do autonomicznego poruszania się. RC Od długiego czasu używam do zdalnego sterowania aparatury FrSky Taranis, więc oczywiście musiałem skorzystać z kompatybilnego odbiornika - w tym przypadku X8R. Zasilanie Projekt oczywiście musiał być mobilny, więc zdecydowałem się na zasilenie go dwucelowym akumulatorem Lipo; konieczne okazało się też zastosowanie układu BEC, który obniżył napięcie akumulatora do 5V. Teraz pozostało już tylko zmontować wszystko w całość. Montaż podwozia Tu obyło się bez niespodzianek i problemów, po prostu skręciłem wszystko zgodnie z instrukcją i wyprowadziłem na zewnątrz przewody, którymi zasilane miały być silniki. Potem sprawy nieco się skomplikowały. Wszystko rozbiło się generalnie o to, że jak bym nie ułożył elementów na podwoziu, po prostu nie było takiego ułożenia, żeby wszystko się zmieściło. Sprawy utrudniał również fakt zastosowania Leonardo, które - umówmy się - jest raczej kobylaste i znacznie lepiej sprawdziłoby się tu kompatybilne z tą płytką Arduino Micro. Do tego dochodził BEC, odbiornik, serwo (którego nota bene nie miałem jak zamocować, bo w wersji 4WD podwozia miejsce na serwo zajmowane było przez dwa dodatkowe silniki) no i oczywiście akumulator. Dlatego zdecydowałem się na umieszczenie wszystkiego ponad podwoziem, pozostawiając na dole sam akumulator. Przykleiłem więc na dolnym pokładzie rzep, na którym mocowany jest akumulator - przeciążenia podczas poruszania robota są tak znikome, że jest to naprawdę pewny i sprawdzony sposób montażu (pozwalający też szybko zamontować albo zdemontować akumulator w razie potrzeby). Oprócz tego przykręciłem w narożnikach podwozia długie dystanse (kupione kiedyś w Chinach na potrzeby projektu quadrokoptera) i zabrałem się za przygotowywanie górnej części pojazdu. Górne podwozie wykonałem z fragmentu płytki aluminiowej, którą dociąłem tak, by znalazła się dokładnie ponad górną częścią podwozia - i jednocześnie dzięki temu przykryła koła, z których pył mógł się dostawać do elektroniki. W płytce wyciąłem otwór na serwo; ponieważ nie dysponuję żadnym sprzętem CNC, który pomógłby mi wyciąć równy, parametryczny otwór, rad nierad wziąłem do ręki wiertarkę, najpierw nawierciłem otwory, potem zamontowałem w niej frez i zacząłem ręcznie wycinać aluminium, a na końcu doszlifowałem wszystko pilnikami o zmniejszającej się ziarnistości. Cały proces poniżej: Teraz można było powoli przystąpić do montażu. Na pierwszy ogień poszło serwo, które na szczęście wpasowało się w wycięty przeze mnie otwór po prostu idealnie. Następnym krokiem było zamontowanie BECa, którego umieściłem pod górnym pokładem. Przewód zasilający (zakończony złączem T-Dean) musiałem rozgałęzić, ponieważ jedna para przewodów musiała zostać połączona z BECem, który obniży napięcie do 5V dla części elektroniki, zaś druga para - do sterownika silników, który będzie potem je zasilał. Szczęśliwie silniki akceptują napięcie dwucelowego akumulatora LiPo - trzeba to koniecznie sprawdzić przed zakupem/montażem! Arduino Leonardo można zasilić bezpośrednio z akumulatora, natomiast konieczne było przylutowanie odpowiedniej wtyczki (na zdjęciu po prawej stronie). Na koniec pozostało podłączenie wszystkich komponentów i otrzymujemy następujący efekt: Programowanie Pierwszym programikiem, który napisałem, był tester silników, który uruchamiał każdy z nich na pół sekundy. Kod wygląda następująco: const int E1 = 3; // Motor1 Speed const int E2 = 11; // Motor2 Speed const int E3 = 5; // Motor3 Speed const int E4 = 6; // Motor4 Speed const int M1 = 4; // Motor1 Direction const int M2 = 12; // Motor2 Direction const int M3 = 8; // Motor3 Direction const int M4 = 7; // Motor4 Direction void M1_advance(char Speed) { digitalWrite(M1, HIGH); analogWrite(E1, Speed); } void M2_advance(char Speed) { digitalWrite(M2, LOW); analogWrite(E2, Speed); } void M3_advance(char Speed) { digitalWrite(M3, LOW); analogWrite(E3, Speed); } void M4_advance(char Speed) { digitalWrite(M4, HIGH); analogWrite(E4, Speed); } void M1_back(char Speed) { digitalWrite(M1, LOW); analogWrite(E1, Speed); } void M2_back(char Speed) { digitalWrite(M2, HIGH); analogWrite(E2, Speed); } void M3_back(char Speed) { digitalWrite(M3, HIGH); analogWrite(E3, Speed); } void M4_back(char Speed) { digitalWrite(M4, LOW); analogWrite(E4, Speed); } void setup() { for (int i = 3; i < 9; i++) pinMode(i, OUTPUT); for (int i = 11; i < 13; i++) pinMode(i, OUTPUT); pinMode(LED_BUILTIN, OUTPUT); } void loop() { digitalWrite(LED_BUILTIN, HIGH); M1_advance(100); delay(500); M1_advance(0); M2_advance(100); delay(500); M2_advance(0); M3_advance(100); delay(500); M3_advance(0); M4_advance(100); delay(500); M4_advance(0); digitalWrite(LED_BUILTIN, LOW); delay(2000); // Delay 2S } Jak widać, sterowanie silnikami odbywa się poprzez podawanie kierunku poprzez piny cyfrowe i prędkości poprzez piny analogowe - proste, jak konstrukcja cepa. Teraz przyszła kolej na odbiornik RC i tu zaczęły się schody. Odbiorniki klasycznie podają stan każdego kanału poprzez sygnał PWM. W praktyce jest to seria naprzemiennych zer i jedynek, z których każda para 1+0 trwa 1/55 sekundy. Wartość możemy odczytać mierząc czas trwania sygnału 1: jeżeli jest to 1 milisekunda, przyjmujemy wartość minimalną ("-1"), jeżeli 1.5 milisekundy, to wartość środkową ("0"), zaś jeśli 2 milisekundy, to wartość maksymalną ("1"). Niektóre odbiorniki pozwalają na nieco szerszy zakres - od 0.5ms do 2.5ms, X8R domyślnie podaje wartości z tego pierwszego zakresu. Ponieważ musiałem mierzyć wartości na dwóch różnych kanałach, zdecydowałem się skorzystać z mechanizmu przerwań. Działa on mniej więcej następująco: gdy zajdzie wybrane zdarzenie (na przykład zmiana stanu danego pinu z niskiego na wysoki), wykonanie programu jest przerywane, zostaje wykonana funkcja oznaczona jako tzw. handler przerwania, a po jej zakończeniu program wznawia wykonanie w miejscu, w którym został przerwany. Na Arduino można znaleźć bardzo wygodną bibliotekę EnableInterrupt, która uogólnia sposób dodawania i usuwania handlerów przerwań pomiędzy różnymi wersjami Arduino, a korzysta się z niej w następujący sposób: #include "EnableInterrupt.h" volatile int microsStart = 0; void pin0Rising() { microsStart = micros(); disableInterrupt(0); enableInterrupt(0, pin0Falling, FALLING); } void pin0Falling() { int microsEnd = micros(); int diff = microsEnd - microsStart; if (diff > 1500) { digitalWrite(LED_BUILTIN, HIGH); } else { digitalWrite(LED_BUILTIN, LOW); } disableInterrupt(0); enableInterrupt(0, pin0Rising, RISING); } void setup() { enableInterrupt(0, pin0Rising, RISING); pinMode(LED_BUILTIN, OUTPUT); } void loop() { } Po wpięciu przewodu sygnałowego do pinu 0 i uruchomieniu programiku na kontrolerze, wbudowana dioda powinna się zapalić w momencie, gdy ustawimy drążek w położeniu większym niż połowa. Zwrócę jeszcze uwagę na magiczne słówko "volatile" przy deklaracji zmiennej - informuje ono kompilator, że zmienna ta nie może zostać zoptymalizowana (kompilator, a dokładniej optymalizator w niektórych przypadkach może w locie usunąć zmienną, na przykład jeżeli nie jest ona używana lub przez cały czas trwania programu ma zawsze tę samą wartość). Dodam tu jeszcze jedną ważną informację: program obsługi przerwania powinien być tak krótki, jak to tylko możliwe! Ma to sporo sensu jeżeli się nad tym nieco dłużej zastanowić, ale ja na to nie wpadłem i w pierwotnej wersji programu cała obsługa silników umieszczona była właśnie w programie obsługi przerwania. I ku mojemu zdziwieniu, po uruchomieniu programu, pomimo tego, że drążki były w położeniu zerowym, dwa silniki zaczęły się obracać. Okazało się, że obsługa przerwania obliczającego czas trwania PWM na pierwszym kanale trwała tak długo, że sztucznie opóźniała wywołanie drugiego przerwania wykonującego te same obliczenia dla drugiego kanału, przez co podawało ono zawyżone wartości. Wystarczyło przebudować program w taki sposób, by obsługa silników znalazła się poza programami obsługi przerwań i wszystko wróciło do normy. Pamiętajmy - to może oczywiste, ale mimo wszystko warto to powiedzieć - że mikrokontrolery nie są wielowątkowe, a przerwania nie są wątkami: wykonują się tylko jedno na raz. Drugie przerwanie musi czekać, aż pierwsze zostanie do końca obsłużone. Przed napisaniem końcowego programu pozostało mi już tylko przetestować obsługę czujnika ruchu, programik wygląda następująco: #include <NewPing.h> #define ULTRASONIC_TRIGGER_PIN 9 #define ULTRASONIC_ECHO_PIN 10 #define MAX_DISTANCE 400 NewPing sonar(ULTRASONIC_TRIGGER_PIN, ULTRASONIC_ECHO_PIN, MAX_DISTANCE); void setup() { pinMode(LED_BUILTIN, OUTPUT); } void loop() { digitalWrite(LED_BUILTIN, HIGH); delay(50); digitalWrite(LED_BUILTIN, LOW); delay(50); int ping = sonar.ping_cm(); if (ping < 30) digitalWrite(LED_BUILTIN, HIGH); else digitalWrite(LED_BUILTIN, LOW); delay(200); } Również i tu korzystam z wbudowanej diody, która powinna zapalić się, gdy zmierzona przez czujnik odległość będzie mniejsza niż 30 cm. Wreszcie program obsługujący całego robota: #include <NewPing.h> #include "EnableInterrupt.h" #include "NewPing.h" // Motor constants // Motor1 Speed #define MOTOR_1_SPEED_PIN 3 // Motor2 Speed #define MOTOR_2_SPEED_PIN 11 // Motor3 Speed #define MOTOR_3_SPEED_PIN 5 // Motor4 Speed #define MOTOR_4_SPEED_PIN 6 // Motor1 Direction #define MOTOR_1_DIR_PIN 4 // Motor2 Direction #define MOTOR_2_DIR_PIN 12 // Motor3 Direction #define MOTOR_3_DIR_PIN 8 // Motor4 Direction #define MOTOR_4_DIR_PIN 7 // Ultrasonic constants #define ULTRASONIC_TRIGGER_PIN 9 #define ULTRASONIC_ECHO_PIN 10 #define MAX_DISTANCE 400 // Servo constants #define SERVO_PIN 13 // AI constants #define DISTANCE_THRESHOLD_2 80 #define DISTANCE_THRESHOLD_1 40 // Ultrasonic control NewPing sonar(ULTRASONIC_TRIGGER_PIN, ULTRASONIC_ECHO_PIN, MAX_DISTANCE); // Motor control functions void M1_advance(byte Speed) ///<Motor1 Advance { digitalWrite(MOTOR_1_DIR_PIN, HIGH); analogWrite(MOTOR_1_SPEED_PIN, Speed); } void M2_advance(byte Speed) ///<Motor2 Advance { digitalWrite(MOTOR_2_DIR_PIN, LOW); analogWrite(MOTOR_2_SPEED_PIN, Speed); } void M3_advance(byte Speed) ///<Motor3 Advance { digitalWrite(MOTOR_3_DIR_PIN, LOW); analogWrite(MOTOR_3_SPEED_PIN, Speed); } void M4_advance(byte Speed) ///<Motor4 Advance { digitalWrite(MOTOR_4_DIR_PIN, HIGH); analogWrite(MOTOR_4_SPEED_PIN, Speed); } void M1_back(byte Speed) ///<Motor1 Back off { digitalWrite(MOTOR_1_DIR_PIN, LOW); analogWrite(MOTOR_1_SPEED_PIN, Speed); } void M2_back(byte Speed) ///<Motor2 Back off { digitalWrite(MOTOR_2_DIR_PIN, HIGH); analogWrite(MOTOR_2_SPEED_PIN, Speed); } void M3_back(byte Speed) ///<Motor3 Back off { digitalWrite(MOTOR_3_DIR_PIN, HIGH); analogWrite(MOTOR_3_SPEED_PIN, Speed); } void M4_back(byte Speed) ///<Motor4 Back off { digitalWrite(MOTOR_4_DIR_PIN, LOW); analogWrite(MOTOR_4_SPEED_PIN, Speed); } // PWM control volatile int microsYStart = 0; volatile int microsXStart = 0; volatile int microsZStart = 0; volatile int yMicros = 0; volatile int xMicros = 0; volatile int zMicros = 0; int UScounter = 0; int USlock = 0; // Pin 0 interrupt handling void pin0Rising() { microsYStart = micros(); disableInterrupt(0); enableInterrupt(0, pin0Falling, FALLING); } void pin0Falling() { yMicros = micros() - microsYStart; disableInterrupt(0); enableInterrupt(0, pin0Rising, RISING); } // Pin 1 interrupt handling void pin1Rising() { microsXStart = micros(); disableInterrupt(1); enableInterrupt(1, pin1Falling, FALLING); } void pin1Falling() { xMicros = micros() - microsXStart; disableInterrupt(1); enableInterrupt(1, pin1Rising, RISING); } // Pin2 interrupt handling void pin2Rising() { microsZStart = micros(); disableInterrupt(2); enableInterrupt(2, pin2Falling, FALLING); } void pin2Falling() { zMicros = micros() - microsZStart; disableInterrupt(2); enableInterrupt(2, pin2Rising, RISING); } void setup() { for (int i = 3; i < 9; i++) pinMode(i, OUTPUT); for (int i = 11; i < 13; i++) pinMode(i, OUTPUT); pinMode(ULTRASONIC_TRIGGER_PIN, OUTPUT); pinMode(ULTRASONIC_ECHO_PIN, INPUT); pinMode(SERVO_PIN, OUTPUT); enableInterrupt(0, pin0Rising, RISING); enableInterrupt(1, pin1Rising, RISING); enableInterrupt(2, pin2Rising, RISING); } void loop() { // Eval motor signals int yValue = (yMicros - 1500) / 2; int xValue = (xMicros - 1500) / 2; if (yValue > 260 || yValue < -260) yValue = 0; if (xValue > 260 || xValue < -260) xValue = 0; int leftEngines = constrain(xValue + yValue, -250, 250); int rightEngines = constrain(yValue - xValue, -250, 250); // Check for obstacles every 10th iteration UScounter++; if (UScounter >= 10) { UScounter = 0; int frontDistance = sonar.convert_cm(sonar.ping_median(5)); if (frontDistance != 0 && frontDistance < DISTANCE_THRESHOLD_2) { if (frontDistance > DISTANCE_THRESHOLD_1) USlock = 1; else USlock = 2; } else USlock = 0; } if (USlock == 1) { leftEngines = constrain(leftEngines, -250, 128); rightEngines = constrain(rightEngines, -250, 128); } if (USlock == 2) { leftEngines = constrain(leftEngines, -250, 0); rightEngines = constrain(rightEngines, -250, 0); } if (abs(leftEngines) < 20) { M3_advance(0); M4_advance(0); } else if (leftEngines > 0) { M3_advance(leftEngines); M4_advance(leftEngines); } else { M3_back(-leftEngines); M4_back(-leftEngines); } if (abs(rightEngines) < 20) { M1_advance(0); M2_advance(0); } else if (rightEngines > 0) { M1_advance(rightEngines); M2_advance(rightEngines); } else { M1_back(-rightEngines); M2_back(-rightEngines); } } Pozwala on na kontrolowanie robota przy pomocy jednego drążka aparatury (dwóch kanałów). Oprócz tego program cyklicznie sprawdza odległość przed robotem i zabezpiecza przed wjechaniem w ścianę: w przypadku przeszkody znajdującej się bliżej niż 80 cm od robota, zostanie ograniczona jego maksymalna prędkość, natomiast jeżeli odległość ta będzie mniejsza niż 40cm, robot zatrzyma się całkowicie i niemożliwe będzie ruszenie nim do przodu. Wnioski To była prawdziwa frajda zobaczyć, jak robot rusza i jeździ zgodnie z instrukcjami z aparatury! Pierwszy skończony projekt. Nauczyłem się na nim dużo, bo okazało się, że w trakcie pracy podjąłem bardzo dużo nietrafnych decyzji. Robot tak naprawdę nigdy nie wyjechał z domu, ma bardzo otwartą konstrukcję, która sprzyja dostawaniu się do obudowy pyłu i piachu. W domowych warunkach wystarczyłby natomiast napęd na dwa koła - w ten sposób miałbym też trochę miejsca wewnątrz obudowy. Arduino Leonardo jest świetne, ale wielkie. Znacznie lepiej sprawdziłoby się Arduino Micro albo Teensy. To drugie nawet bardziej, bo shield do sterowania silnikami pożera dużo pinów i niewiele zostaje na odbiór sygnału z odbiornika RC. Udało mi się jeszcze podłączyć czujnik odległości, ale serwo wpiąłem już bezpośrednio w odbiornik, bo po prostu zabrakło mi pinów. Nie ma większego sensu robić żadnych projektów (innych niż wstępne prototypy) na przewodzikach połączeniowych. Lepiej kupić sobie płytkę prototypową, złącza goldpinowe, przewodziki kydexowe i polutować wszystko na płytce - układ zajmuje znacznie mniej miejsce i jest znacznie mniej podatny np. na przypadkowe wyjęcie przewodu. Chodzi mi po głowie wskrzeszenie projektu - właśnie przy pomocy Teensy oraz drukarki 3D, przy pomocy której mogę wydrukować całe nadwozie szyte na miarę. Ale podejrzewam, że zajmę się tym dopiero za jakiś czas...
-
Cześć, tworzę prostą grę bazującą na bramkach i układach logicznych (bez CPU), która musi pobrać skrócony/obcięty sygnał wciśnięcia przycisku. Załączam wycinek schematu, który jest za tę funkcję odpowiedzialny. W pierwszej części znajduje się filtr RC dolnoprzepustowy, którego wyjście jest później filtrowane przez bramkę AND (U5A na schemacie), pozostałe symbole to ogranicznik impulsów, który obcina impuls, aby trwał ok. 10 µs. Nie wiem, czy to podejście jest prawidłowe i czy nie powinienem usunąć sekcji debouncującej i bramki U5A.
-
SŁOWEM WSTĘPU Geneza powstania tego projektu jest niezwykle prosta i prozaiczna - po prostu potrzebowałem na szybko nadajnik do obsługi odbiorników z modułem nrf24l01. Wiele moich projektów i robotów opiera swoją komunikację właśnie na tych popularnych i dobrze znanych układach. Jednak do tej pory nie miałem opracowanego żadnego kompaktowego rozwiązania do tego celu. Nadeszła jednak chwila, w której potrzebowałem rozwiązania przydającego się poza moim warsztatem - czyli w terenie. Projekt ten miał 3 główne założenia: Wykonać projekt w maksymalnie jak najkrótszym czasie. Do produkcji urządzenia wykonać ogólnodostępne komponenty walające się po moim warsztacie. Zostawić w projekcie miejsce na dalsze usprawnienia. Tym sposobem po dwóch dniach powstał pilot, którym bardzo bym chciał się podzielić ze społecznością tego forum, a także każdym, kto lubi tworzyć i będzie w potrzebie stworzenia takiego urządzenia. Udało się spełnić wszystkie postawione wymagania. Czas produkcji prototypu zamyka się w niecałych 7 godzinach. W czas ten wliczony jest wydruk elementów na drukarce 3D, wytrawienie PCB oraz końcowy montaż całej elektroniki. Pilot posiada bardzo prosty i surowy styl, który w połączeniu z wyczuwalnym ciężarem 420 gramów daje odczucie solidnego i wytrzymałego produktu. Choć kształt pilota był tworzony w czysto improwizowanym procesie, bardzo dobrze układa się w dłoniach i zapewnia pewny chwyt całego urządzenia. Jeżeli więc potrzebny jest pilot RC a brak jest czasu, to do wykonania tego będziesz potrzebować: 2x Moduł Joystick z przyciskiem 1x Potencjometr montażowy 10k 1x gałka do potencjometru (nie jest konieczna ale to miły dodatek) 1x Arduino Nano - U3 2x przełącznik kołyskowy złącza goldpin męskie raster 2,54mm - J3, J4, J5, J6, J7, J8, J9, J10, J11, D1 złącza goldpin żeńskie raster 2,54mm przewody męsko-męskie 10cm przewody męsko-męskie 20cm 1x moduł nrf24L01+PA+LNA (można użyć standardowego modułu) - U4 1x dioda LED THT 5mm 1x stabilizator 5V LM7805 - U1 1x stabilizator 3,3V LF33CV - U2 1x rezystor 1k - R1 4x kondensator 100uF/16V (ważne by wysokość kondensatora nie była większa niż 7mm) - C2, C3, C4, C5 1x kondensator 100nF/50V - C5 2x złącze śrubowe ARK raster 5mm - J1, J2 1x pojemnik na baterie 6xAA 1x laminat jednostronny FR4 śruby do drewna fi3 12mm ELEKTRONIKA: Projekt płytki powstał w programie KiCAD. Nie ma w tym projekcie niczego wartego szerszego wyjaśniania. PCB ma za zadanie wyprowadzić złącza pod Arduino Nano, moduł radiowy oraz złącza sygnałowe goldpin. Arduino pełni rolę głównej jednostki obliczeniowej, obsługującej nasze radio. Szereg złącz sygnałowych jest podpiętych pod porty analogowe A0-A5, co umożliwia podłączenie sygnałów analogowych oraz modułów z interfejscem I2C (furtka na przyszłe modernizacje). Projekt PCB został wykonany z myślą o metodzie termotransferu, dlatego ułożenie oraz grubość ścieżek wygląda w taki a nie inny sposób. Priorytetem było stworzenie PCB łatwej i szybkiej w domowej produkcji. W załączniku umieściłem plik PCB.PDF zawierający layout niezbędny do wykonania płytki. Co do komponentów pasywnych potrzebnych do montażu PCB, domyślne wartości zostały wymienione wyżej w liście. Kondensatory C1,C2,C3,C4 mogą mieć inne wartości (np. 22uF-220uF). Ważne jest by zachować minimalnie napięcie 16V oraz wysokość kondensatorów maksymalnie 7mm. Rezystor R1 jest jedynie ogranicznikiem prądu i jego wartość jest w pełni zależna od decyzji montera. Na renderze widać diodę D1 wlutowaną w PCB. Ostatecznie zamontowałem tam złącze goldpin, aby doprowadzić zasilanie do diody statusowej umieszczonej w innym miejscu obudowy pilota. KONSTRUKCJA PILOTA: Konstrukcja została zaprojektowana w programie Fusion360. Posiadając modele 3D stworzonej PCB a także wszystkich niezbędnych komponentów, wykonałem stosowną obudowę. Starałem się, by pilot przypominał dostępne na rynku aparatury RC, aby finalny produkt mógł godnie prezentować się poza garażem np. w trakcie trwania różnych imprez lub zlotów. Finalny model składa się z 4 elementów: bazy, pokrywy frontu, pokrywy baterii oraz mocowania anteny. Do wydrukowania tych elementów skorzystałem z czarnego PLA. Części zostały wydrukowane na Bambulab A1 z użyciem supportów drzewnych, z wypełnieniem gyroidalnym 5%. Wszystkie pliki w formacie STL umieściłem w folderze 3Dfiles.zip. MONTAŻ ELEKTRONIKI: Montaż najlepiej zacząć od podłączenia przewodów10cm Ż-Ż do modułów joystick. Przewody podwinąłem tak, aby przechodziły pod modułem i wówczas przykręciłem je śrubami 3mm do bazy pilota. Do potencjometru oraz diody statusowej LED przylutowałem przewody Ż-Ż, aby ułatwić ich podłączenie do PCB. W przypadku potencjometru, zastosowałem przewody 10cm a diody 20cm. Potencjometr posiada w bazie miejsce, gdzie można zamontować go na "wcisk", bez konieczności przykręcania. Należy pamiętać o usunięcia kombinerkami wystającej blokadki, która służy do unieruchamiania potencjometru na panelu. Dioda LED posiada również miejsce do jej umieszczenia. Zalecam poprowadzenie przewodów diody LED pod modułem prawego joysticka. Pilot posiada 2 przełączniki - "1" oraz "ON/OFF". Do przełącznika "1" można przylutować przewody 10cm Ż-Ż w celu podłączenia go do PCB. Do przełącznika "ON/OFF" można przylutować zwykłe przewody, ponieważ jest on podłączany do złącza ARK. Do zasilania pilota wykorzystano 6 baterii AA, przez wzgląd na ich powszechne występowanie w sklepach. Przewody koszyka baterii AA można zarobić i również wpiąć w dedykowane złącze ARK na PCB. Koszyk baterii montowany jest śrubkami stożkowymi fi3 x 8mm. W przypadku ich braku wystarczy cienka taśma dwustronna lub po prostu zamknięcie obudowy tylną klapą. W bazie znajdują się dedykowane miejsca pod umieszczenie małych opasek zaciskowych, które pomogą w organizacji przewodów. Sygnały należy podłączyć w sposób następujący: Potencjometr - A0 Joystick lewy oś X - A1 Joystick lewy oś Y - A2 Joystick prawy oś X - A4 Joystick prawy oś Y - A5 Przełącznik "1" - A3 Po podłączeniu wszystkich przewodów, można podłączyć moduł radiowy nrf24L01. Jeżeli mamy model z dodatkową anteną, należy umieścić ją ostrożnie w dedykowanym kanale i przymocować za pomocą wydrukowanego mocowania. NIE WKŁADAMY JESZCZE ARDUINO NANO! PROGRAM: Przed zamknięciem obudowy pilota, należy wgrać program na Arduino. Pilot nie ma niestety żadnego wyprowadzenia pod złącze USB, dlatego wszystkie zmiany w oprogramowaniu wymagają otwarcia pilota. Poniżej załączam prosty kod do działania tego pilota. Umożliwia on wysyłanie informacji za pomocą 6 kanałów. 5 kanałów obsługuje wyprowadzenia analogowe, mapując je na zakres 0-255 i wysyłając w takiej formie. Kanał 6 odpowiada za wysyłanie stanu logicznego przełącznika. Po zaprogramowaniu Arduino, można podłączyć je do PCB i zamknąć bazę pilota za pomocą frontu. Front przytwierdzany jest za pomocą śrubek fi3. Na potencjometr można założyć gałkę bez konieczności przykręcania jego wału. Pozostaje uruchomić pilot przełącznikiem ON/OFF i sprawdzić, czy elektronika uruchamia się poprawnie. Jeżeli Arduino daje nam lekką czerwoną poświatę a dioda statusowa mieni się na froncie, nasz pilot jest gotowy do działania. #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> const uint64_t my_radio_pipe = 0xE8E8F0F0E1LL; //Adres RF24 radio(9, 10); struct Data_to_be_sent { byte ch1; byte ch2; byte ch3; byte ch4; byte ch5; byte ch6; }; Data_to_be_sent sent_data; void setup() { radio.begin(); radio.setAutoAck(false); radio.setDataRate(RF24_250KBPS); radio.openWritingPipe(my_radio_pipe); sent_data.ch1 = 127; sent_data.ch2 = 127; sent_data.ch3 = 127; sent_data.ch4 = 127; sent_data.ch5 = 127; sent_data.ch6 = 0; } void loop() { sent_data.ch1 = map( analogRead(A0), 0, 1024, 0, 255); //pot sent_data.ch2 = map( analogRead(A1), 0, 1024, 0, 255); //joy1 X sent_data.ch3 = map( analogRead(A2), 0, 1024, 0, 255); //joy1 Y sent_data.ch4 = map( analogRead(A4), 0, 1024, 0, 255); //joy2 X sent_data.ch5 = map( analogRead(A5), 0, 1024, 0, 255); //joy2 Y sent_data.ch6 = digitalRead(A3); radio.write(&sent_data, sizeof(Data_to_be_sent)); } PODSUMOWANIE: Projekt ten okazał się dla mnie całkiem przyjemnym ale także angażującym zadaniem, w którym mogłem przetestować swoje umiejętności wobec bardzo krótkiego czasu oraz ograniczonych zasobów. Mam nadzieję, że okaże się on dla kogoś równie przydatny jak dla mnie. Liczę także na dalszy rozwój tego projektu, dodając do niego nowe funkcje oraz poprawiając design. PCB.pdf 3Dfiles.zip
- 5 odpowiedzi
-
- 10
-
-
- arduino nano
- nrf24l01
-
(i 3 więcej)
Tagi:
-
ESPoBOT czyli robot mobilny RC z chwytakiem i kamerą FPV
marcinus opublikował temat w Projekty - DIY roboty
No cześć, kilka miesięcy wzlotów i upadków, kłótni z żoną i w końcu jest .... ESPoBOT Robot gąsienicowy RC z kamerą FPV i chwytakiem. Sterowanie oparte o ESP32-wroom 32D. Zacząłem od Arduino, ale z uwagi na problemy z komunikacją dwustronną NRF24L01, przesiadłem się na ESP32. Napędem są 2 silniki 9Vdc z przekładnią 87:1 na podwoziu gąsienicowym z regulacją prześwitu, kontrolowane przez sterownik oparty o układ TB6612. Prędkość silników regulowana płynnie w zakresie 0-30cm/s (1km/h). Robot wyposażony w chwytak umożliwiający chwycenie detalu, podniesienie/opuszczenie z użyciem 3 serw. Kontrola zaciśnięcia chwytaka zrealizowana poprzez pomiar prądu serwa. Regulacja prędkości serw. Zainstalowana kamera 1200TVL do przekazywania obrazu fpv 5.8GHz na telefon, PC lub wyświetlacz AV. Zasięg nadajnika do 500m. Robot wyposażony w oświetlenie LED RGB. Całość zasilana z akumulatora LiPo 1800mAh 11,1V 20C i zabezpieczona bezpiecznikiem polimerowym 4A. Dodatkowo akumulator zabezpieczony programowo przed rozładowaniem. Komunikacja dwustronna z padem na częstotliwości 2.4GHz (ESP-NOW) i zasięgu do 250m. Pad wyposażony w 2 joysticki, 6 guzików, potencjometr, enkoder oraz wyświetlacz OLED 128x64 do wyświetlania parametrów urządzenia. Zasilany z akumulatora 9V 650mAh USB. -
Hej, potrzebuje kontrolera radiowego do użycia w symulatorze fpv a potem w dronie. Musi być tani(więcej jak 250zł nie dam),mieć jakiś normalny port do podłączenia do komputera i być gotowy do użytku bez dokupowania niczego powyżej 10zł(np. Jakiejś przejściówki)
-
Jaka jest najlepsza metoda zdalnego sterowania esp8266 nodemcu
xTAgz opublikował temat w Arduino i ESP
Hej, robie sobie takie autko, bardziej deskę i silniki. Ale mniejsza. Potrzebuję tym sterować jakoś, mam dostępne rpi i esp8266. Rpi jest za duże więc zostaje esp. ALE nie mam pojęcia jak to zrobić, to znaczy wiem jak sterować silnikami itd. ale przeraża mnie zdalna łączność. Kasy za bardzo nie mam... -
Postanowiłem zrobić mój pierwszy pojazd rc wiec zakupiłem silnik z regulatorem 30 A ale nie wiem jaka akumulator wybrać. Proszę o pomoc z góry dziękuję :). Silnik ABC-Power A2212 2200KV 2-3S Napięcie zasilające: 2- 3S lipo ; 5-7 NiMh Max prąd: 28A/60 s Max wydajność: 72% Opór wewnętrzny: 45 mΩ Średnica: 3.17 mm Max Watts: 220 W Wymiary silnika: 27.5x30 (mm) Rozstaw śrub mocujących: 19mm, 33mm Regulator 30A Prąd ciągły: 30A Napięcie wejściowe: 2-3S Lipo lub 5-10 Ni-Mh/Ni-Cd BEC: 2A/5V Wymiary: 45x26x8mm
-
Witam Czy ktoś z forumowiczów ma może doświadczenie w sterowaniu silnikiem modelarskim przy pomocy arduino? Zależy mi na regulacji prędkością obrotową i schemacie podłączenia. przykładowy silnik "Silnik bezszczotkowy L2204"
-
Witam, Moim celem jest stworzenie robota kontrolowanego przez pilot z łącznością przez moduł radiowy FS100A Od strony technicznej wszystko mam zaplanowane lecz nie potrafię zaprogramować arduino z modułem radiowym jedyne co narazie mam to Kod Nadajnika: #include <VirtualWire.h> #define led_pin 11 #define transmit_pin 10 #define pot_pin A0 void setup() { vw_set_tx_pin(transmit_pin); vw_setup(2000); pinMode(led_pin, OUTPUT); } void loop() { int pot = analogRead(pot_pin); String toSend = (String(pot, DEC)); char msg[23]; toSend.toCharArray(msg, toSend.length() + 1); digitalWrite(led_pin, HIGH); vw_send((uint8_t *)msg, strlen(msg)); vw_wait_tx(); digitalWrite(led_pin, LOW); delay(1000); } Kod odbiornika: #include <VirtualWire.h> #define led_pin 13 #define receive_pin 11 #define pwm_pin 3 void setup() { Serial.begin(9600); Serial.println("setup"); vw_set_rx_pin(receive_pin); vw_setup(2000); vw_rx_start(); pinMode(led_pin, OUTPUT); pinMode(pwm_pin, OUTPUT); } void loop() { uint8_t buf[VW_MAX_MESSAGE_LEN]; uint8_t buflen = VW_MAX_MESSAGE_LEN; if (vw_get_message(buf, &buflen)) { int i,pwm,wartosc; String liczba; digitalWrite(led_pin, HIGH); for (i = 0; i < buflen; i++) { liczba+=char(buf); } wartosc = liczba.toInt(); pwm = map(wartosc,0,1023,0,255); Serial.print(wartosc); Serial.print(" "); Serial.println (pwm); analogWrite(pwm_pin, pwm); digitalWrite(led_pin, LOW); } } Tyle że jest to program przesyłający dane jednego potencjometru a la potrzebuje trzecz potencjometrów i dwóch przełączników ,nie mam pojęcia jak to przerobić pomoże ktoś???
-
Witam, z okazji sytuacji w Polsce i na Świecie związanej z koro... sami wiecie z czym, postanowiłem w końcu zrobić coś zamiast robić nic. Może nie jest to jakiś bardzo ambitny projekt ale jednak nauczyłem się paru nowych rzeczy. Najpierw przedstawię co to : Jest to poduszkowiec bez poduszki nie wiedziałem jak to nazwać więc wymyśliłem nazwę Slidejunk. Nazwa jest z języka angielskiego i oznacza ślizgający się(slide) śmieć(junk). Ślizgający się ponieważ się ślizga , śmieć ponieważ zrobiłem go z kartonu i rzeczy które miałem w domu . Spis rzeczy użytych do samego pojazdu: Silnik BLDC bezszczotkowy A2212/10T 1400KV. Sterownik silnika BLDC 30A. Pakiet Li-Pol 11.1v 3S 20C 2200mAh Servo SG90 Karton Na początku chciałem zbudować samolot ale zniechęciłem się po tym jak położyłem baterię na wagę . Bateria waży 135 g , nie chciałem ryzykować . Budowa samolotu to wyższy poziom . A ja mam tylko karton i ciężką baterię. Kiedyś kupie sobie specjalnego styropianu i coś z tym pokombinuję. Odbiornik - ma 7 kanałów , mózgiem jest arduino nano, sygnał jest odczytywany przez nrf24. Nadajnik - na razie ma 5 kanałów i więcej nie potrzebuję mózgiem znowu jest arduino nano a sygnał jest wysyłany przez nrf24 (ten z anteną).Zasilanie to 2 baterie 18560.W sumie używam 3 kanały : sterowanie silnikiem BLDC, sterowanie serwem, precyzyjne sterowanie serwem (potencjometr). Na górze widać spalone oczka na płytce, jestem amatorem w lutowaniu więc musiało się coś nie udać.Po zlutowaniu wszystkiego nadajnik nie działał , zdenerwowałem się i nie ładnie wylutowałem nrf-a. Wlutowałem go jeszcze raz i potem już działało. Nie udane pomysły Chciałem całość zamknąć w 2 kanałach ale, nie ma idealnego ustawienia domyślnego dla serwa dlatego musiałem dodać trzeci kanał . Był też pomysł na informowanie o stanie naładowania baterii po przez buzzer na nadajniku .Buzzer miał "pikać"gdy napięcie spada poniżej 11V. Nie udało się . Okazało się że nadawanie sygnału i odbieranie go jednocześnie przez pilota do pojazdu RC nie jest najlepszym pomysłem w tym przypadku. Ustawienia sterowania Joystickiem po lewej steruję silnik BLDC . Joystickiem z prawej serwem. Z okazji że te joysticki nie są z najwyższej półki, musiałem ustawić maksymalną moc silnika na 50% (po minimalnym przesunięciu silnik osiągał około 30% mocy a to sporo jak na ten pojazd). A maksymalny skręt serwa 30 stopni w każdą stronę . Podsumowanie Podczas projekt uważam za udany da się ślizgać. Planuję kiedyś kupić lepsze joysticki. Nie mam trzech rąk więc przy nagrywaniu trzymałem telefon w kolanach mam nadzieję że taki film wystarczy. Pozdrawiam czytelników .
-
Cześć, potrzebuję pomocy z zasilaniem robota. Robot to linefollower oparty na arduino. -podwozie https://abc-rc.pl/product-pol-7655-Podwozie-robota-2WD-RT-4-140mm-2-silniki-z-enkoderami-platforma-mobilna.html -sterownik silników DC https://abc-rc.pl/product-pol-6196-Modul-sterownika-L298N-do-silnikow-DC-i-krokowych-Arduino.html. Najpierw myślałem o zwykłym koszyku na baterie AA ale po czasie odszedłem od tego bo w póżniejszych projektach i tak predzej czy poziej bym musiał przejść na akumulatorki które można ładować. Myślałem nad 2 celami Li-ion tylko nie wiem jak zaprojektować te zasilanie. Na pewno trzeba będzie obniżyć napięcie całego koszyka z celami i kontrolowac napiecie cel by nie spadło do poziomu gdy już będą nie do odratowania. O czymś jeszcze trzeba pomyśleć? Proszę o pomoc w zaprojektowaniu tego zasilania.
- 7 odpowiedzi
-
- Line follower
- Arduino
-
(i 1 więcej)
Tagi:
