Skocz do zawartości

alshrom

Użytkownicy
  • Zawartość

    8
  • Rejestracja

  • Ostatnio

Reputacja

3 Neutralna

O alshrom

  • Ranga
    2/10
  1. Problem w testerze rozwiązany. Zapomniałem, że trzeba podłączyć sygnał sterujący na 0 w płytce. Ostatnie pytanie- jeśli mam taki warunek: if((digitalRead(10)==LOW && digitalRead(9)==LOW && digitalRead(7)==LOW)) { servo.attach(3); servo.write(86); delay(15);} //servo zamyka przesłone else { servo.write(90);} //servo nie działa W tym przypadku, gdy nie naciskam włącznika, serwo nie porusza się, ale cały czas płynie przez nie prąd. Czy dla serwa taka sytuacja jest bez znaczenia (pracowałoby ciągle do kilku godzin), czy lepiej pomyśleć nad tym by odłączyć zasilanie/sygnał z serwa?. edit. Ustawiłem pin serwa jako wyjście, i zamiast "ustawiać" serwo na 90 stopni to wyłączyłem sygnał. Wszystko działa idealnie i nie występują drgania. Dziękuję wszystkim za pomoc.
  2. Dziś przyszło do mnie serwo- PowerHD LF-20MG-360 standard. Stworzyłem prosty program do przetestowania motoru i pojawił się problem. Przy włączeniu programu serwo chwile czeka, rusza się o kilkanaście stopni i następnie znowu czeka. Przy testowaniu zwykłego serwa analogowego zmieniało ono prawidłowo zadaną pozycję, gdy było zasilane z płytki arduino, ale gdy było zasilanie z zasilacza to się trzęsie . Do zasilania użyłem zasilacza 5,5V, 2000mA. Wcześniej, gdy chciałem przetestować serwo na moim docelowym programie to efekt był podobny. Jedynie gdy na zasilaczu zmieniłem napięcie zasilania na 2v to wtedy serwo zaczęło równo się kręcić. Czy problem z moim nowym serwem może wynikać z zasilacza? Dla pewności wstawiam kod do testowania #include <Servo.h> Servo servo; void setup() { servo.attach(9); } void loop() { servo.write(55); }
  3. Na dzień dzisiejszy najbardziej skłaniam się ku pomysłowi by zastosować serwo 360 stopni (kupić gotowe lub przerobić- ważne by miało odpowiedni moment i było wodoodporne). Nie rozumiem tylko jednej rzeczy- na jakiej podstawie działa sterowanie prędkością w takim serwie. Dlaczego czym większa jest nastawa od wartości w której serwo się nie obraca, tym szybciej się ono kręci. Jeżeli nastawię serwo by kręciło się na 95 stopni (gdzie np przy 90 sie nie rusza) to czy uzyskam wtedy moment obrotowy jaki jest deklarowany? Sam silnik z przekładnią byłby wg. mnie najwygodniejszym rozwiązaniem, ale niestety nie znalazłem nic co by pasowało mi obrotami, gabarytami i było wodoodporne.
  4. Chyba wszystko zrozumiałem. Uznaję, że mam trzy opcję do wyboru: 1. Przerabiam serwo na silnik (lub kupuję serwo 360) , i wtedy serwo wykonuje ruch, gdy sygnał od arduino różni się od zablokowanego na potencjometrze (np. 90 stopni). W tym przypadku prędkość serwa będzie zależeć od różnicy między zadanym kątem, a 90 stopni. 2. Stosuję serwo wraz z zamontowanym enkoderem w postaci np. potencjometru. Wtedy po naciśnięciu przycisku mogę mu zadać komendę: wykonuj +1 stopień od wskazania potencjometru, w jakiś odstępach czasowych. I tutaj mam pytanie: czy istnieją serwa modelarskie, które mogą wysyłać sygnał do arduino nt. swojej aktualnej pozycji? 3. Stosuję silnik z przekładnią, którego obroty i kierunek mogę sterować np. za pomocą mostka typu H. Chciałem zastosować serwo, a nie silnik z przekładnią, dlatego że ma małe gabaryty, są wodoodporne, mają duże momenty i można łatwo sterować prędkością obrotową. Z geometrii mojego układu wynika, że potrzebuję napędu, który wykona około 5 obr/min.
  5. Niestety, ale jestem pewny, że będą występowały sytuacje utraty zasilania podczas wykonywania ruchu serwa. Rozumiem, że muszę napisać program w taki sposób by cały czas czytał i zapisywał w pamięci ostatnią pozycję serwa, a następnie przy ponownym odpaleniu na niej się bazował. Czyli jak aktualnie mam sytuacje, że serwo wraca do pozycji zadanej w komendzie- int pos =0; to ma to wyglądać mniej więcej tak: int pos ="ostatnia zapamiętana pozycja". Jeżeli dobrze zrozumiałem to prosiłbym o poradę w jakich komendach szukać rozwiązania/ o czym dokładnie poczytać.
  6. Zmieniłem kod, ale nadal jest problem bo serwo po spełnieniu warunków na ruch wykonuje najpierw szybki ruch na pozycje określoną w linijce "int pos =0/120/150/(co wpisze). Na plus jest to, że jeżeli przerwę zasilanie w pozycji gdzie przesłona ma się nie ruszać to po ponownym uruchomieniu serwo nie wraca z automatu na pozycję 90 stopni. Czy problem nie jest taki, że moje tanie serwo po prostu nie ma pojęcia w jakim miejscu się znajduje i zawsze po utracie zasilania będzie wracać do jakieś bazy? Czy zastosowanie serwa cyfrowego coś zmieni?
  7. Użyłem najtańszego serwa dołączonego do zestawu arduino. Docelowo planuję użyć jakiegoś serwa z momentem 1-1.5 Nm, wodoodpornego i z metalowymi zębami.
  8. Cześć wszystkim! Zostałem postawiony przed koniecznością stworzenia pewnego mechanizmu. Jedna z jego części ma działać w następujący sposób: Przy załączonym przycisku klapka ma otwierać się w stronę krańcówki K1. W momencie osiągnięcia K1 krańcówka wysyła sygnał do arduino i napęd ma się wyłączyć. Przy wyłączeniu przycisku klapka powinna wrócić w położenie K2. Klapka ma pokonać dystans 80mm w czasie ~2sek. Pierwotna koncepcja zakładała wykorzystanie zwykłego silniczka ze śrubą pociągową, lecz niestety gabaryty nie pozwalają na zastosowanie takiego rozwiązania. Zdecydowałem się więc na użycie serwomechanizmu (jest mały, zapewnia duży moment, łatwo sterować prędkością otwierania klapki). Ogólnie po napisaniu programu wszystko działało zgodnie z założoną logiką, lecz problem pojawił się po ponownym uruchomieniu arduino. Po osiągnięciu pozycji K1 i przy załączonym przycisku odłączyłem zasilanie. Po ponownym uruchomieniu, serwomechanizm ustawił się szybko na pozycję 90 stopni, choć przycisk cały czas był wciśnięty serwo nie dążył do pozycji K1. Dopiero po wyciśnięciu przycisku serwo wykonało ruch (niestety szybki, a nie powolny jak zaprogramowałem) w pozycję K2. Do stworzenia prototypu użyłem elementów z zestawu startowego arduino. Niestety, ale w swoim projekcie nie mogę sobie pozwolić na to by po ponownym podłączeniu zasilania serwo wykonywało jakieś szybkie ruchy na pozycje 0. Czy jest jakiś sposób, który może rozwiązać mój problem? Dodam, że moja wiedza z programowania jest podstawowa, więc proszę o prosty język i wyrozumiałość. W kodzie mam sterowanie na dwa przełączniki, ale nie ma to większego znaczenia. #include<Servo.h> int pos =0; Servo servo; void setup() { pinMode(10, INPUT); //przelacznik 1 pinMode(9, INPUT); //przelacznik 2 pinMode(8, INPUT); //krancowka na otwarciu pinMode(7, INPUT); //krancowka na zamknieciu servo.attach(3); } void loop() { //ruch przesłony if(((digitalRead(10)==HIGH || digitalRead(9)==HIGH)&&(digitalRead(8)==LOW)) && pos< 180) {pos++; servo.write(pos); delay(15);} //servo otwiera przesłone else {digitalWrite(2,LOW);} //servo nie działa if((digitalRead(10)==LOW && digitalRead(9)==LOW && digitalRead(7)==LOW) && pos>0) {pos--; servo.write(pos); delay(15);} //servo zamyka przesłone else {digitalWrite(2,LOW);} //servo nie działa }
×
×
  • Utwórz nowe...