Arduino Polska Forum

Pełna wersja: Sterowanie serwo - czujnik przeszkód
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Witam, 

Próbuję sterować ruchami silnika serwo przy wykorzystaniu czujnika przeszkód do sterowania drzwiami. Napisałem krótki program w tym celu: gdy czujnik nie wykrywa przeszkody serwo wykonuje ruch, natomiast jeżeli na czujniku pojawia się przeszkoda to serwo powinno się zatrzymać. Program działa poprawnie, ale niestety nie tak jak chciałbym. Nie działa on gdy przeszkoda zostaje wykryta w trakcie ruchu - wtedy serwo powinno zatrzymać się w pewnym punkcie - jak najszybciej, ale w moim przypadku zatrzymuje się ono dopiero na końcu zakresu swojego ruchu. 

Kod:
#include <Servo.h>
Servo myservo;
int PrzeszkodaPin = 8;  
int przeszkoda = HIGH;  
int pos = 0;
void setup() {
pinMode(2,OUTPUT);
myservo.attach(3);
pinMode(PrzeszkodaPin, INPUT_PULLUP);
Serial.begin(9600);
 
}

void loop() {
         
 przeszkoda = digitalRead(PrzeszkodaPin);
 if (przeszkoda== LOW)
 {
   Serial.println("obecny");
 }
 else
 {
  Serial.println("nieobecny");
          myservo.write(0);
          delay(1000);
          myservo.write(90);  
          delay(1000);
 }
}

Mógłbym liczyć na jakieś wskazówki z Waszej strony? Chciałbym, aby nastąpiła reakcja serwa w czasie rzeczywistym i gdy przeszkoda znika z pola czujnika, to serwo ruszałoby dalej.
Kod:
#include <Servo.h>
Servo myservo;
int PrzeszkodaPin = 52;  
int przeszkoda = HIGH;  
int pos = 0;
void setup() {
pinMode(52,INPUT);
myservo.attach(A0);
pinMode(PrzeszkodaPin, INPUT_PULLUP);
Serial.begin(9600);

}

void loop() {
        
przeszkoda = digitalRead(PrzeszkodaPin);
if (przeszkoda== LOW)
{
   Serial.println("obecny");
}
else
{
  Serial.println("nieobecny");
          myservo.write(0);
          delay(1000);
          myservo.write(90);  
          delay(1000);
}
}
Spróbuj teraz czy o to ci chodzi po jeśli chcesz zatrzymać w konkretnym monecie na przykład, servoobraca się od 0 do 90 ale przeszkoda wykryta zostanie na 30 stopniach i tu ma się n tych 30 zatrzymać to trochę inaczej musi być
nie będzie działać ponieważ serwo działa niezależnie od arduino na podstawie sygnału jaki otrzymuje a dostaje tylko 2 pozycje i będzie działało dopóki ich nie osiągnie .

myservo.write(0);
myservo.write(90);

Tu masz poprawnie jak to powinno wyglądać i działać

Kod:
#include <Servo.h>
Servo myservo;
int PrzeszkodaPin = 8;  
int przeszkoda = HIGH;  
int pos = 10;
int minimum = 0; // serwo skrajna pozycja
int maximum = 90; // serwo skrajna pozycja
int czas_otwarcia = 2000;

void setup() {
  
pinMode(2,OUTPUT);
myservo.attach(3);
pinMode(PrzeszkodaPin, INPUT_PULLUP);
Serial.begin(9600);
}

void loop() {
        
przeszkoda = digitalRead(PrzeszkodaPin);

if (przeszkoda == LOW){
    Serial.println("obecny");
    pos = maximum ;
    myservo.write(pos);
    delay(czas_otwarcia);
}
  
if (przeszkoda == HIGH){     // zamykanie jeżeli ma być przerwane to musi być na bieżąco
  Serial.println("nieobecny");  // sprawdzany stan czujnika a tylko ruch krok po kroku na to pozwoli
  for ( pos = pos ; pos > minimum ; pos--){  // dlatego ruch powrotny jest w pętli
    if ( pos < minimum )pos = minimum;
       myservo.write(pos);  
    if (przeszkoda== LOW)break;
    }
  }
}