Датчик препятствия. как реализовать.
- Войдите на сайт для отправки комментариев
Ср, 14/10/2020 - 11:18
Подскажите пожалуйста, кто на опыте. как более верно реализовать.
имеется датчик препятствия.
нужно что бы он мог различать начало предмета и конец. то есть.
сначала датчик не чего не видит, потом видит ставит переменную и как только снова не видит => предмет закончился.
в моем коде что то не так,
так как когда он только заметил предмет, он через несколько ходов перестает его видеть хотя предмет еще стоит.

мой код:
const int datchik_pin = 9;
byte v;
byte x,y,k,L1,z;
void setup() {
pinMode(datchik_pin, INPUT);
Serial.begin(9600);
}
void loop() {
v = digitalRead( datchik_pin);
if (v==0)
{
Serial.println("ДАТЧИК ВИДИТ ПРИПЯТСВИЕ");
x=1;
k=1;
Serial.println("X=");
Serial.println(x);
Serial.println("k=");
Serial.println(k);
}
if (v==1&&k==1)
{
Serial.println("ДАТЧИК ПОТЕРЯЛ ПРИПЯТСВИЕ");
y=1;
k=0;
Serial.println("Y=");
Serial.println(y);
Serial.println("k=");
Serial.println(k);
}
if (x==1&&y==1)
{
Serial.println("выполнено условие x=1 and y=1");
x=0;
y=0;
L1=++L1;
z=1;
Serial.println("L=");
Serial.println(L1);
}
}
Интересная конструкция в 43 строке ))
Попробуйте перестроить логику в таком ключе:
if (v == 0) { // здесь действия при обнаружении препятствия } else { // здесь действия при потере препятствия, проверка v == 1 тут не нужна }т.е. примерно так
if (!digitalRead( datchik_pin)) { Serial.println("ДАТЧИК ВИДИТ ПРИПЯТСВИЕ"); x = 1; k = 1; Serial.println("X="); Serial.println(x); Serial.println("k="); Serial.println(k); } else { if (k == 1) { Serial.println("ДАТЧИК ПОТЕРЯЛ ПРИПЯТСВИЕ"); y = 1; k = 0; Serial.println("Y="); Serial.println(y); Serial.println("k="); Serial.println(k); } if (x == 1 && y == 1) { Serial.println("выполнено условие x=1 and y=1"); x = 0; y = 0; L1++; z = 1; Serial.println("L="); Serial.println(L1); } }Глюк-трюк - поясните, в какой ситуации, по задумке, должно выводится: "выполнено условие x=1 and y=1
"v258 - ну раз уж сами про L1 = ++L1; сделали замечание - зачем сами оставили это в коде?
v258 - ну раз уж сами про L1 = ++L1; сделали замечание - зачем сами оставили это в коде?
Исправил. Хотя эта строка к его проблемам отношения все равно не имеет ))
Хотя эта строка к его проблемам отношения все равно не имеет ))
ее :) Это девушка, давно известная на форуме :)))
ее :) Это девушка, давно известная на форуме :)))
Упс.... Не знал, извиняюсь )))
Хотя эта строка к его проблемам отношения все равно не имеет ))
ее :) Это девушка, давно известная на форуме :)))
"ты проверяй какого пола твой сосед...как проверить? лезть под платье, так схлопочешь по мозгам..." В.Высоцкий )))
спасибо большое, сейчас я пришла к выводу что хоть что делай но все равно появится 1 на доли секунды, думаю подтянуть пин 9, с датчика на землю, вроде проблема решилась. мнимый плюс пропал.
код такой получился
#include <Servo.h> Servo myservo; const int datchik_pin = 9; ////пин датчика const int pin_serv= 8; ////пин сервопривода ////заданные углы для серво привода const int ygol_1=110; const int ygol_2=85; const int ygol_3=57; byte v,f,a,c; byte flag_1,flag_2,L1; ////задонная частота движение конвеера int chastota =20; unsigned long vremia_do_servoptivoda; unsigned long vremia_srabotki_servo1; unsigned long vremia_srabotki_servo2; unsigned long vremia_srabotki_servo3; void setup() { Serial.begin(9600); myservo.write(ygol_1); pinMode(datchik_pin, INPUT); myservo.attach(pin_serv); vremia_do_servoptivoda=(6310/chastota)-100; Serial.println("vremia_do_servoptivoda="); Serial.println(vremia_do_servoptivoda); } void loop() { v = digitalRead( datchik_pin); if (v==0) { Serial.println("ПРИПЯТСВИЕ"); flag_1=1; Serial.println("flag_1=="); Serial.println(flag_1); } if (v==1&&flag_1==1) { Serial.println("нет ПРИПЯТСВИЕ"); flag_2=1; Serial.println("flag_1=="); Serial.println(flag_1); } if (flag_1==1&&flag_2==1) { Serial.println("выполнено условие flag_1 and flag_1"); L1=L1+1; flag_1=0; flag_2=0; Serial.println("L1="); Serial.println(L1); } if(L1==1) { Serial.println("L1="); Serial.println(L1); f=1; Serial.println("f="); Serial.println(f); vremia_srabotki_servo1=millis(); L1=L1+1; } if(L1==3) { Serial.println("L1="); Serial.println(L1); a=1; Serial.println("a="); Serial.println(a); vremia_srabotki_servo2=millis(); L1=L1+1; } if(L1==5) { Serial.println("L1="); Serial.println(L1); c=1; Serial.println("c="); Serial.println(c); vremia_srabotki_servo3=millis(); L1=0; } if(f == 1&& millis()-(vremia_srabotki_servo1)>vremia_do_servoptivoda)// вращает 1 серво привод ygol_1 { myservo.write(ygol_1); Serial.println("ПОВЕРНУЛСЯ НА УГОЛ 1"); f=0; Serial.println("f="); Serial.println(f); } if(a == 1&& millis() - vremia_srabotki_servo2>vremia_do_servoptivoda)// вращает 1 серво привод ygol_1 { myservo.write(ygol_2); Serial.println("ПОВЕРНУЛСЯ НА УГОЛ 2"); a=0; Serial.println("a="); Serial.println(a); } if(c == 1&& millis() - vremia_srabotki_servo3>vremia_do_servoptivoda)// вращает 1 серво привод ygol_1 { myservo.write(ygol_3); Serial.println("ПОВЕРНУЛСЯ НА УГОЛ 3"); c =0; Serial.println("c="); Serial.println(c); } }условие такое если предмет закончился значит и нужно повернуть сервопривод на угол(1-3)=) выше описала и код , а по сути этот не нужно. такак проблема была в мнимом плюсе появляющемся неоткуда, хотела решить этим проблему в итоге только код усложнила
043 Serial.println("ПРИПЯТСВИЕ");Писать надо правильно: "Припяцтвие"
Извиняюсь за грамматику, прошу не вызывать грамматическую полицию
задонная частота , дон река
Докладываю, резистор не помог, мнимая единица все равно выскакивает в программе. раз в 10-20 шагов. применила Медианный фильтр , держу руку на пульсе.
#include <Servo.h> Servo myservo; const int datchik_pin = 8; ////пин датчика const int pin_serv= 9; ////пин сервопривода ////заданные углы для серво привода const int ygol_1=110; const int ygol_2=85; const int ygol_3=57; int v[3]; int v_filter; byte index; byte f,a,c; byte flag_1,flag_2,L1; ////задонная частота движение конвеера int chastota =20; unsigned long vremia_do_servoptivoda; unsigned long qqqq; unsigned long vremia_srabotki_servo1; unsigned long vremia_srabotki_servo2; unsigned long vremia_srabotki_servo3; void setup() { Serial.begin(9600); myservo.attach(9); myservo.write(ygol_1); pinMode(datchik_pin, INPUT); vremia_do_servoptivoda=(6310/chastota)-100; Serial.println("vremia_do_servoptivoda="); Serial.println(vremia_do_servoptivoda); } int middle_of_3(int a, int b, int c) { int middle; if ((a <= b) && (a <= c)) { middle = (b <= c) ? b : c; } else { if ((b <= a) && (b <= c)) { middle = (a <= c) ? a : c; } else { middle = (a <= b) ? a : b; } } return middle; } void loop() { if (++index > 2) index = 0; // переключаем индекс с 0 до 2 (0, 1, 2, 0, 1, 2…) { v[index] = digitalRead( datchik_pin); // записываем значение с датчика в массив // фильтровать медианным фильтром из 3ёх ПОСЛЕДНИХ измерений v_filter = middle_of_3(v[0], v[1], v[2]); Serial.println(v_filter); } if (v_filter==0) { Serial.println("ПРИПЯТСВИЕ"); flag_1=1; Serial.println("flag_1=="); Serial.println(flag_1); } if (v_filter==1&&flag_1==1) { Serial.println("нет ПРИПЯТСВИЕ"); Serial.println("flag_1=="); Serial.println(flag_1); Serial.println("выполнено условие flag_1 and flag_1"); L1=L1+1; flag_1=0; Serial.println("L1="); Serial.println(L1); } if(L1==1) { Serial.println("L1="); Serial.println(L1); f=1; Serial.println("f="); Serial.println(f); vremia_srabotki_servo1=millis(); L1=L1+1; } if(L1==3) { Serial.println("L1="); Serial.println(L1); a=1; Serial.println("a="); Serial.println(a); vremia_srabotki_servo2=millis(); L1=L1+1; } if(L1==5) { Serial.println("L1="); Serial.println(L1); c=1; Serial.println("c="); Serial.println(c); vremia_srabotki_servo3=millis(); L1=0; } if(f == 1&& millis()-vremia_srabotki_servo1>vremia_do_servoptivoda)// вращает 1 серво привод ygol_1 { myservo.write(ygol_1); Serial.println("ПОВЕРНУЛСЯ НА УГОЛ 1"); f=0; Serial.println("f="); Serial.println(f); } if(a == 1&& millis() - vremia_srabotki_servo2 > vremia_do_servoptivoda )// вращает 1 серво привод ygol_1 { myservo.write(ygol_2); Serial.println("ПОВЕРНУЛСЯ НА УГОЛ 2"); a=0; Serial.println("a="); Serial.println(a); } if(c == 1&& millis() - vremia_srabotki_servo3>vremia_do_servoptivoda)// вращает 1 серво привод ygol_1 { myservo.write(ygol_3); Serial.println("ПОВЕРНУЛСЯ НА УГОЛ 3"); c =0; Serial.println("c="); Serial.println(c); } }А вы уверены, что там проскакивает какая-то единица? При исправном датчике это невозможно. Я же вам предлагал переделать логику работы
if (v == 0) { // здесь действия при обнаружении препятствия } else { // здесь действия при потере препятствия, проверка v == 1 тут не нужна }В этом случае обработка потери препятствия будет проводиться только при условии, что с датчика действительно пришла единица. А вы валите все проверки в одну кучу, а потом жалуетесь на какие-то паразитные сигналы ))
а что мне говорить в иначе? вот что то не соображу. у меня если коробочка, что бы не задавать время за сколько она пройдет, оно может быть разное. я отслеживаю его начало и конец. тем самым начинаю прибавлять переменную L1. для углов сервопривода. в иначе у меня всегда будет считывай значение с датчика, то есть вернуться к началу луп.
if (v_filter==0) { Serial.println("ПРЕПЯТСТВИЕ"); flag_1=1; Serial.println("Поднят флаг flag_1 "); } if (v_filter==1&&flag_1==1) { Serial.println("нет ПРЕПЯТСТВИЕ"); Serial.println("flag_1=="); Serial.println(flag_1); Serial.println("выполнено условие flag_1 and flag_1"); L1=L1+1; flag_1=0; Serial.println("L1="); Serial.println(L1); }Еще сервоприод дергается как ненормальный трясется. приходится отключать его порт.
#include <Servo.h> Servo myservo; const int datchik_pin = 8; ////пин датчика const int pin_serv= 9; ////пин сервопривода ////заданные углы для серво привода const int ygol_1=110; const int ygol_2=85; const int ygol_3=57; int v[3]; int v_filter; byte index; byte f,a,c, q,w,e; byte flag_1,flag_2,L1; ////задонная частота движение конвеера int chastota =20; unsigned long vremia_do_servoptivoda; unsigned long qqqq; unsigned long vremia_srabotki_servo1; unsigned long vremia_srabotki_servo2; unsigned long vremia_srabotki_servo3; unsigned long vremia_end_servo1; unsigned long vremia_end_servo2; unsigned long vremia_end_servo3; void setup() { Serial.begin(9600); pinMode(datchik_pin, INPUT); vremia_do_servoptivoda=(6310/chastota)-100; Serial.println("vremia_do_servoptivoda="); Serial.println(vremia_do_servoptivoda); } int middle_of_3(int a, int b, int c) { int middle; if ((a <= b) && (a <= c)) { middle = (b <= c) ? b : c; } else { if ((b <= a) && (b <= c)) { middle = (a <= c) ? a : c; } else { middle = (a <= b) ? a : b; } } return middle; } void loop() { if (++index > 2) index = 0; // переключаем индекс с 0 до 2 (0, 1, 2, 0, 1, 2…) { v[index] = digitalRead( datchik_pin); // записываем значение с датчика в массив // фильтровать медианным фильтром из 3ёх ПОСЛЕДНИХ измерений v_filter = middle_of_3(v[0], v[1], v[2]); Serial.println(v_filter); } if (v_filter==0) { Serial.println("ПРИПЯТСВИЕ"); flag_1=1; Serial.println("Поднят флаг flag_1 "); } if (v_filter==1&&flag_1==1) { Serial.println("нет ПРИПЯТСВИЕ"); Serial.println("flag_1=="); Serial.println(flag_1); Serial.println("выполнено условие flag_1 and flag_1"); L1=L1+1; flag_1=0; Serial.println("L1="); Serial.println(L1); } if(L1==1) { f=1; Serial.println("f="); Serial.println(f); vremia_srabotki_servo1=millis(); L1=L1+1; } if(L1==3) { a=1; Serial.println("a="); Serial.println(a); vremia_srabotki_servo2=millis(); L1=L1+1; } if(L1==5) { Serial.println("L1="); Serial.println(L1); c=1; Serial.println("c="); Serial.println(c); vremia_srabotki_servo3=millis(); L1=0; } if(f == 1&& millis()-vremia_srabotki_servo1>vremia_do_servoptivoda)// вращает 1 серво привод ygol_1 { myservo.attach(9); myservo.write(ygol_1); Serial.println("ПОВЕРНУЛСЯ НА УГОЛ 1"); f=0; q=1; Serial.println("f="); Serial.println(f); } if(a == 1&& millis() - vremia_srabotki_servo2 > vremia_do_servoptivoda )// вращает 1 серво привод ygol_1 { myservo.attach(9); myservo.write(ygol_2); Serial.println("ПОВЕРНУЛСЯ НА УГОЛ 2"); a=0; w=1; Serial.println("a="); Serial.println(a); } if(c == 1&& millis() - vremia_srabotki_servo3>vremia_do_servoptivoda)// вращает 1 серво привод ygol_1 { myservo.attach(9); myservo.write(ygol_3); Serial.println("ПОВЕРНУЛСЯ НА УГОЛ 3"); c =0; e=1; Serial.println("c="); Serial.println(c); } if(q==1&&myservo.read()==ygol_1) { myservo.detach(); q=0; } if(w==1&&myservo.read()==ygol_2) { myservo.detach(); w=0; } if(e==1&&myservo.read()==ygol_3) { myservo.detach(); e=0; } }не знаю, что там за датчик, но если на просвет, то зацепить его за прерывание по фронтам и всех делов
а что мне говорить в иначе?
Все, что должно происходить в случае отсутствия препятствия перед датчиком. Что конкретно - вам виднее, это ваша программа. В посте #2 я привел пример в ответ на ваш код