Датчик препятствия. как реализовать.

Gluck-Truck
Gluck-Truck аватар
Offline
Зарегистрирован: 17.06.2019

Подскажите пожалуйста, кто на опыте. как более верно реализовать.

имеется датчик препятствия.

нужно что  бы он мог различать начало предмета и конец.  то есть.
сначала датчик не чего не видит, потом видит ставит переменную и как только снова не видит => предмет закончился.

в моем коде что то не так,
так как когда он только заметил предмет,  он через несколько ходов перестает его видеть хотя предмет еще стоит. 

мой код:
 

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);  
}
}

  

 

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Интересная конструкция в 43 строке ))

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Попробуйте перестроить логику в таком ключе:

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);
    }
  }

 

b707
Offline
Зарегистрирован: 26.05.2017

Глюк-трюк - поясните, в какой ситуации, по задумке, должно выводится: "выполнено условие x=1 and y=1"

b707
Offline
Зарегистрирован: 26.05.2017

v258 - ну раз уж сами про L1 = ++L1; сделали замечание - зачем сами оставили это в коде?

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

b707 пишет:

v258 - ну раз уж сами про L1 = ++L1; сделали замечание - зачем сами оставили это в коде?

Исправил. Хотя эта строка к его проблемам отношения все равно не имеет ))

b707
Offline
Зарегистрирован: 26.05.2017

v258 пишет:

Хотя эта строка к его проблемам отношения все равно не имеет ))

ее :) Это девушка, давно известная на форуме :)))

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

b707 пишет:

ее :) Это девушка, давно известная на форуме :)))

Упс.... Не знал, извиняюсь )))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

v258 пишет:

Хотя эта строка к его проблемам отношения все равно не имеет ))

ее :) Это девушка, давно известная на форуме :)))

"ты проверяй какого пола твой сосед...как проверить? лезть под платье, так схлопочешь по мозгам..." В.Высоцкий )))

Gluck-Truck
Gluck-Truck аватар
Offline
Зарегистрирован: 17.06.2019

спасибо большое, сейчас я пришла к выводу что хоть что делай но все равно появится 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);
} 

}

 

Gluck-Truck
Gluck-Truck аватар
Offline
Зарегистрирован: 17.06.2019

условие такое если предмет закончился значит и нужно повернуть сервопривод на угол(1-3)=) выше описала и код , а по сути этот не нужно. такак проблема была в мнимом плюсе появляющемся неоткуда, хотела решить этим проблему в итоге только код усложнила

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017
043
Serial.println("ПРИПЯТСВИЕ");

Писать надо правильно: "Припяцтвие"

Gluck-Truck
Gluck-Truck аватар
Offline
Зарегистрирован: 17.06.2019

Извиняюсь за грамматику, прошу не вызывать грамматическую полицию
задонная частота , дон река 

Gluck-Truck
Gluck-Truck аватар
Offline
Зарегистрирован: 17.06.2019

Докладываю, резистор не помог, мнимая единица все равно выскакивает в программе.  раз в 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);
} 

}

 

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

А вы уверены, что там проскакивает какая-то единица? При исправном датчике это невозможно. Я же вам предлагал переделать логику работы

v258 пишет:

if (v == 0)
{
// здесь действия при обнаружении препятствия
}
else
{
// здесь действия при потере препятствия, проверка v == 1 тут не нужна
}

В этом случае обработка потери препятствия будет проводиться только при условии, что с датчика действительно пришла единица. А вы валите все проверки в одну кучу, а потом жалуетесь на какие-то паразитные сигналы ))

Gluck-Truck
Gluck-Truck аватар
Offline
Зарегистрирован: 17.06.2019

а что мне говорить в иначе? вот что то не соображу. у меня если коробочка, что бы не задавать время за сколько она пройдет, оно может быть разное. я отслеживаю его начало и конец.  тем самым начинаю прибавлять переменную 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);
}

 

Gluck-Truck
Gluck-Truck аватар
Offline
Зарегистрирован: 17.06.2019

Еще сервоприод дергается как ненормальный трясется.  приходится отключать его порт. 

#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;
}
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

не знаю, что там за датчик, но если на просвет, то зацепить его за прерывание по  фронтам и всех делов

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Gluck-Truck пишет:

а что мне говорить в иначе?

Все, что должно происходить в случае отсутствия препятствия перед датчиком. Что конкретно - вам виднее, это ваша программа. В посте #2 я привел пример в ответ на ваш код