Skocz do zawartości
wn2001

Camera Slider "STEP"

Pomocna odpowiedź

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ęć 🙂

IMG_20190716_190556849_HDR.thumb.jpg.b016911d9bdbd3dd41a904da17f08aee.jpg IMG_20190716_190754682_HDR.thumb.jpg.4a0bdaa5a5aedb0a0aa1ff77e9396f74.jpg IMG_20190716_190712893_HDR.thumb.jpg.ef228b2e4b46c0b47a2fc351b8d156e2.jpg

IMG_20190716_190657194_HDR.thumb.jpg.e5c13b237dd7285e9479935aa4f87164.jpg IMG_20190716_190606121_HDR.thumb.jpg.8ecaa8a6bbdc557004ee68c4359ad1bc.jpg IMG_20190716_190622774_HDR.thumb.jpg.3e4753475564684893f5d0d475ecdc60.jpg

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

  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites

Podoba Ci się ten projekt? Zostaw pozytywny komentarz i daj znać autorowi, że zbudował coś fajnego!

Masz uwagi? Napisz kulturalnie co warto zmienić. Doceń pracę autora nad konstrukcją oraz opisem.

@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 😉

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

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 🙂

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(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 przez Bosak

Udostępnij ten post


Link to post
Share on other sites

@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

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...