Skocz do zawartości

Camera Slider "STEP"


Pomocna odpowiedź

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
  • 5 miesiące później...

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ę! 2
  • 2 tygodnie później...
(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

@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

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ę »
×
×
  • Utwórz nowe...