Witam Was ponownie.
Zrobiłem sobie prosty podajnik sterowany elektrozaworami. Pracę ma wyzwalać czujnik, który podpiąłem sobie pod wejście analogowe nr 2.
Sekwencja wygląda tak:
1. Czujnik optyczny daje krótki sygnał
2. Uruchamiam 3 elektrozawory w określonej kolejności
3. Sprawdzam odległość od przedmiotu (czujnik ultradźwiękowy)
4. Jak:
a) jest przedmiot to go łapię przyssawkami i odstawiam do pozycji 0
b) jak nie ma to czekam aż się pojawi w odpowiedniej odległości po czym wykonuję to co w podpunkcie a
Niestety przez to że wszystko działa w pętli to nie potrafię wymusić czekania opisanego w podpunkcie b. Program po prostu leci od początku i flaga "czekaj" ustawiona jest na 0, mimo że niżej ustawiłem ją na 1.
Nie jestem ani elektrykiem ani programistą, stąd nie potrafię sobie z tym poradzić.
Będę wdzięczny za podpowiedź.
PS kod źródłowy obsługujący czujnik wziąłem z internetu i go wstawiłem w swój.
Kod wygląda tak:
Zrobiłem sobie prosty podajnik sterowany elektrozaworami. Pracę ma wyzwalać czujnik, który podpiąłem sobie pod wejście analogowe nr 2.
Sekwencja wygląda tak:
1. Czujnik optyczny daje krótki sygnał
2. Uruchamiam 3 elektrozawory w określonej kolejności
3. Sprawdzam odległość od przedmiotu (czujnik ultradźwiękowy)
4. Jak:
a) jest przedmiot to go łapię przyssawkami i odstawiam do pozycji 0
b) jak nie ma to czekam aż się pojawi w odpowiedniej odległości po czym wykonuję to co w podpunkcie a
Niestety przez to że wszystko działa w pętli to nie potrafię wymusić czekania opisanego w podpunkcie b. Program po prostu leci od początku i flaga "czekaj" ustawiona jest na 0, mimo że niżej ustawiłem ją na 1.
Nie jestem ani elektrykiem ani programistą, stąd nie potrafię sobie z tym poradzić.
Będę wdzięczny za podpowiedź.
PS kod źródłowy obsługujący czujnik wziąłem z internetu i go wstawiłem w swój.
Kod wygląda tak:
Kod:
// ustawienie pinów i definicje
#define z1 4 // zawór 1 (siłownik główny 50 cm)
#define z2 2 // zawór 2 (przyssawki)
#define z3 3 // zawór 3 (siłownik opuszczający)
int Trig = 12; // Numer pinu wyzwolenia
int Echo = 11; // Numer pinu odpowiedzi
long EchoTime; // Czas trwania sygnału ECHO
int Distance; // Odległość w centymetrach
int MaximumRange = 20; // Maksymalna odległość
int MinimumRange = 2; // Minimalna odległość
int start = 0;
int czekaj = 1;
// parametry główne
void setup() {
Serial.begin(9600); // testowe uruchomienie logów
pinMode(z1,OUTPUT);
pinMode(z2,OUTPUT);
pinMode(z3,OUTPUT);
pinMode(A2,INPUT); // czujnik optyczny na wejściu analogowym
// Konfiguracja pinów czujnika
pinMode(Trig, OUTPUT);
pinMode(Echo, INPUT);
}
void loop() {
int v2 = analogRead(2); //odczytanie wartości z czujnika optycznego
if (v2 < 1020 || czekaj == 1) { // jesli otrzymuje sygnal z czujnika lub flaga czekaj jest = 1
// uruchamian elektrozawor nr 1
digitalWrite (z1, HIGH);
// Ustawiam TRIG w stan niski na 2us
digitalWrite(Trig, LOW);
delayMicroseconds(2);
// Ustawiam TRIG w stan wysoki na 10us
digitalWrite(Trig, HIGH);
delayMicroseconds(10);
// Ustawiam TRIG w stan niski - rozpoczynamy pomiar
digitalWrite(Trig, LOW);
// Odczytuje czas trwania stanu wysokiego na pinie ECHO
EchoTime = pulseIn(Echo, HIGH);
// Obliczam odległość
Distance = EchoTime / 58;
// Sprawdzam zakres pomiarowy
if (Distance >= MaximumRange)
{
// jesli jest poza zakresem to zmieniam stan elektrozaworu 3
digitalWrite (z3, LOW);
} else
{
if (Distance < 4)
{
// jesli przedmiot jest blizej niz 4 cm od czujnika to uruchamiam sekwencje elektrozaworow
digitalWrite (z3, LOW);
delay (200);
digitalWrite (z1, LOW);
// potrzebny czas na schowanie sie silownika 50 cm
delay (900);
// wypuszczam przedmiot z przyssawek
digitalWrite (z2, LOW);
delay (200);
czekaj = 0;
} else
{
//delay (200);
digitalWrite (z3, HIGH);
digitalWrite (z2, HIGH);
czekaj = 1;
}
Serial.print("Odleglosc: ");
Serial.println(Distance);
}
digitalWrite (z3, HIGH);
// Opóźnienie kolejnego pomiaru
delay(5);
}
}
}