Popularny post wn2001 Napisano Lipiec 28, 2019 Popularny post Udostępnij Napisano Lipiec 28, 2019 Szyna video, inaczej camera slider to projekt, który wykonałem jakieś 3 lata temu, w II klasie gimnazjum, a akcja rabatowa zainspirowała mnie do jej opisania Projekt zwięźle był opisywany w formie worklog'a (link poniżej), ale przechodząc do konkretów - na początek porcja zdjęć Mechanika Bazę urządzenia stanowi prowadnica liniowa firmy Igus (średnica wałka - 10mm) oraz śruba trapezowa o skoku 25mm; również Ø10 wraz z współpracującym wózkiem i nakrętką z kołnierzem. Bez kryptoreklamy, od tradycyjnych łożysk liniowych i nakrętek różnią się tym, że wykonane są z specjalnych polimerów, które są cichsze, bezsmarowne, a przez idealne w lekkich aplikacjach. Długość zestawu wynosi 100cm, ponieważ z przodu umieszczony jest silnik z sterownikiem, a z tyłu założyskowanie, rzeczywista maksymalna droga przesuwu wózka to 70cm. Pozostałe elementy drukowałem 3D z wykorzystaniem zielonego filamentu PLA. Całość napędza silnik krokowy NEMA17, sterowany stepstick'iem A4988 (o elektronice szerzej za chwilę ). Sprzęgło osi silnika i śruby to 2 nakładki skręcone ze sobą. Wózek zawiera mocowanie aparatu/kamery w postaci dwóch łap przekręcanych śrubami imbusowymi. Na drugim końcu znajduje się natomiast łożysko kulkowe wraz z toczoną własnoręcznie tuleję przenoszącą ewentualne siły wzdłużne. Elektronika Sercem sterownika jest Arduino Pro Mini, które steruje wspomnianym stepstick'iem oraz odpowiada za interfejs użytkownika - wyświetlacz 16x2 + 4 sztuki tact-switch'y, jak widać na poniższym filmie - rozwiązanie może nie jest profesjonalne, ale pozwala na łatwe i intuicyjne wprowadzenie danych typu droga przesuwu, szybkość i innych opcji. Zasilacz jest laptopowy, podajże Dell 19,5V (na wyrost, ale akurat taki miałem). Dostarczeniem 5V dla logiki zajmuje się tradycyjnie LM7805, stepstick zasilany jest bezpośrednio. Szyna ma też czujnik krańcowy, samodzielnie potrafi znaleźć pozycję domową Oprogramowanie Oprogramowanie pisałem samodzielnie, oczywiście Arduino IDE, nie ma w nim nic odkrywczego - sprawdzanie stanu przycisków, sterowanie wyświetlaczem LCD i generowanie impulsów dla silnika za pomocą funkcji tone(). Film ilustrujący działanie urządzenia... ...i kilka ujęć z aparatu (niestety moje umiejętności fototechniczne są dość skromne) To tyle, chętnie odpowiem na wszelkie pytania, bo starałem się nie rozpisywać Pozdrawiam, wn2001 3
Treker (Damian Szymański) Sierpień 1, 2019 Udostępnij Sierpień 1, 2019 @wn2001, właśnie zaakceptowałem opis. Dziękuję za przedstawienie ciekawego projektu, zachęcam do prezentowania kolejnych DIY oraz aktywności na naszym forum 1
wn2001 Styczeń 13, 2020 Autor tematu Udostępnij Styczeń 13, 2020 Ponieważ jeden z użytkowników forum poprosił mnie na PW o wgląd do kodu, pomyślałem, że pokażę i wstawię go tutaj tak, aby również inni mogli podejrzeć, jeżeli będą potrzebować. Zastrzegam, że kod pisałem dawno i jest bardzo nieelegancki! Przepraszam za odkopanie wątku #define A 14 #define B 12 #define C 2 #define D 3 #define KRANC 4 #include <LiquidCrystal.h> byte w1=0; byte w2=0; byte w3=0; int predkosc=0; int zpos=0; int apos=0; LiquidCrystal lcd(9, 15, 8, 7, 6, 5); void setup(){ pinMode(KRANC, INPUT_PULLUP); pinMode(A, INPUT_PULLUP); pinMode(B, INPUT_PULLUP); pinMode(C, INPUT_PULLUP); pinMode(D, INPUT_PULLUP); pinMode(10, OUTPUT); pinMode(11, OUTPUT); pinMode(16, OUTPUT); lcd.begin(16, 2); lcd.print("Camera Slider"); lcd.setCursor(0, 1); lcd.print("STEP"); delay(1000); lcd.clear(); lcd.print("NUM ENTER"); lcd.setCursor(0, 1); lcd.print("A B C D"); delay(1000); lcd.clear(); lcd.print("A-FULL B-MANUAL"); lcd.setCursor(0, 1); lcd.print("C-HOME D-DEMO"); delay(500); } void loop(){ if (digitalRead(C)==0) zeruj(); else if (digitalRead(D)==0) demo(); else if (digitalRead(A)==0) full(); else if (digitalRead(B)==0) manual(); delay(100); } void zeruj() { //zerowanie digitalWrite(10, HIGH); tone(11, 1600); while (digitalRead(KRANC)==0) { delay(1); } digitalWrite(10, LOW); tone(11, 800); delay(1000); digitalWrite(10, HIGH); tone(11, 800); while (digitalRead(KRANC)==0) { delay(1); } digitalWrite(10, LOW); noTone(11); apos=0; delay(1000); } void demo() { //demonstracja możliwości, zapętlona zeruj(); digitalWrite(10, LOW); tone(11, 3200); delay(16000); while (digitalRead(D)==1 ||digitalRead(C)==1 ||digitalRead(B)==1 ||digitalRead(A)==1) { digitalWrite(10, LOW); tone(11, 3200); delay(10000); noTone(11); delay(500); digitalWrite(10, HIGH); tone(11, 3200); delay(10000); noTone(11); delay(500); } } void manual() { //funkcja własnoręcznego ustawienia predkosci i drogi przejazdu zeruj(); lcd.clear(); lcd.print("V|MAX 150CM/MIN"); lcd.setCursor(0, 1); lcd.print("0"); while(digitalRead(D)==1) { if (digitalRead(A)==0 && w1==0) {predkosc=predkosc+100; w1=1;lcd.setCursor(0, 1); lcd.print(predkosc);} else if (digitalRead(A)==1) w1=0; if (digitalRead(B)==0 && w2==0) {predkosc=predkosc+10; w2=1;lcd.setCursor(0, 1); lcd.print(predkosc);} else if (digitalRead(B)==1) w2=0; if (digitalRead(C)==0 && w3==0) {predkosc=predkosc+1; w3=1;lcd.setCursor(0, 1); lcd.print(predkosc);} else if (digitalRead(C)==1) w3=0; delay(100); } if (predkosc>150) predkosc=150; digitalWrite(16, HIGH); delay(250); digitalWrite(16, LOW); delay(250); digitalWrite(16, HIGH); delay(250); digitalWrite(16, LOW); delay(250); lcd.clear(); lcd.print("POS|MAX 700MM"); lcd.setCursor(0, 1); lcd.print("0"); while(digitalRead(D)==1) { if (digitalRead(A)==0 && w1==0) {zpos=zpos+100; w1=1;lcd.setCursor(0, 1); lcd.print(zpos);} else if (digitalRead(A)==1) w1=0; if (digitalRead(B)==0 && w2==0) {zpos=zpos+10; w2=1;lcd.setCursor(0, 1); lcd.print(zpos);} else if (digitalRead(B)==1) w2=0; if (digitalRead(C)==0 && w3==0) {zpos=zpos+1; w3=1;lcd.setCursor(0, 1); lcd.print(zpos);} else if (digitalRead(C)==1) w3=0; delay(100); } if (zpos>700) zpos=700; digitalWrite(16, HIGH); delay(250); digitalWrite(16, LOW); delay(250); digitalWrite(16, HIGH); delay(250); digitalWrite(16, LOW); delay(250); digitalWrite(10, LOW); tone(11, (predkosc/150)*3200); delay((zpos*128000)/((predkosc/150)*3200)); noTone(11); } void full() { //przejazd na pełen dystans, tylko z regulacją prędkości zeruj(); lcd.clear(); lcd.print("V|MAX 150CM/MIN"); lcd.setCursor(0, 1); lcd.print("0"); while(digitalRead(D)==1) { if (digitalRead(A)==0 && w1==0) {predkosc=predkosc+100; w1=1;lcd.setCursor(0, 1); lcd.print(predkosc);} else if (digitalRead(A)==1) w1=0; if (digitalRead(B)==0 && w2==0) {predkosc=predkosc+10; w2=1;lcd.setCursor(0, 1); lcd.print(predkosc);} else if (digitalRead(B)==1) w2=0; if (digitalRead(C)==0 && w3==0) {predkosc=predkosc+1; w3=1;lcd.setCursor(0, 1); lcd.print(predkosc);} else if (digitalRead(C)==1) w3=0; delay(100); } if (predkosc>150) predkosc=150; digitalWrite(16, HIGH); delay(250); digitalWrite(16, LOW); delay(250); digitalWrite(16, HIGH); delay(250); digitalWrite(16, LOW); delay(250); digitalWrite(10, LOW); tone(11, (predkosc/150)*3200); delay(89600000/((predkosc/150)*3200)); noTone(11); } Pozdrawiam 2
Bosak Styczeń 24, 2020 Udostępnij Styczeń 24, 2020 (edytowany) Cześć! Na jakiej podstawie dobierałeś silnik krokowy do tego układu? z jakich założeń wyszedłeś i dlaczego akurat o,66Nm? Miłego wieczoru Edytowano Styczeń 24, 2020 przez Bosak
wn2001 Styczeń 24, 2020 Autor tematu Udostępnij Styczeń 24, 2020 @Bosak, wszystko zależy od tego, jaka jest masa wózka i jakie chcesz uzyskiwać przyspieszenia, ponieważ z praw fizyki, do przesuwania ruchem jednostajnym wystarczy minimalnie przekroczyć opór śruby i łożysk liniowych (inaczej ma się sytuacja, kiedy podnosimy ciało pionowo w górę, wówczas należy przekroczyć siłę ciężkości tego ciała F=m*g). Zatem nie pamiętam, jakie były założenia, ale przedstawię przykład obliczeń, które nie wykraczają poza fizykę z nieistniejących już gimnazjów: Wózek z aparatem ma masę 3kg. Przyspieszenie liniowe ma wynosić 0,5m/s^2, a maksymalna prędkość - 5cm/s. Śrubę można użyć np. fi10mm z skokiem 25mm - wówczas silnik będzie obracał się prędkością 2obr/s, co daje 4*pi rad/s. Siła to F=m*a, jak mówiłem przesuwamy się tylko w poziomie do Ziemi, co daje 1,5N, ale ponieważ jest jeszcze opór śruby itd., załóżmy, że 2N. Korzystamy z zasady W1=W2 (W to praca ): siła "na wózku"*przesunięcie wózka = siła "na promieniu śruby"*obwód śruby, zatem siła "na promieniu śruby"=2N*25mm/(10mm*3,14)=1,6N [ponieważ obrót silnika powoduje, że punkt na powierzchni śruby zakreśla obwód pi*d, a wózek przesuwa się o skok śruby]. Jeżeli na 5mm (promień śruby) jest 1,6N, to na centymetrowej dźwigni musi być to dwa razy mniej, czyli 0,8N; zatem potrzebny moment to 0,8N*cm. Chyba nigdzie się nie pomyliłem, dziś już nie myślę , ale zauważ, że wartość jest śmiesznie niska (moment wspomnianego silnika to 0,66Nm=66N*cm; proszę nie mylić tych kilku różnych jednostek). Pamiętaj, że to moment statyczny, a my obliczyliśmy dynamiczny - ten spada wraz obrotami (i to bardzo mocno, przy kilku obr/s silnik może nie być w stanie poruszyć się jałowo, ale teamt jest znacznie bardziej rozbudowany - odsyłam do charakterystyk momentu w funkcji prędkości obrotowej), zakładamy brak oporu łożysk, idealną centryczność osi silnika i śruby, idealne warunki pracy (matematyczne), śmiesznie niskie przyspieszenie, a co za tym idzie - siłę pchającą wózek. W rzeczywistości, musi być to taki zapas (i to duży). Pozdrawiam, wn2001 1
Pomocna odpowiedź
Bądź aktywny - zaloguj się lub utwórz konto!
Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony
Utwórz konto w ~20 sekund!
Zarejestruj nowe konto, to proste!
Zarejestruj się »Zaloguj się
Posiadasz własne konto? Użyj go!
Zaloguj się »