Помогите разобраться с HC-SR04 и двигателями.

vovancho0
Offline
Зарегистрирован: 12.03.2015

Доброго времени суток! помогите пожалуйста разобратся. есть небольшой проект, примерная схема выше на фото.три пластиковых шарика, на каждый шар отдельный мотор-редуктор, драйвер L298N, Arduino UNO r3 и дальномер HC-SR04.  Идея в том чтобы шары в хаотичном порядке двигались вниз-вверх. По реализации идеи проблем не возникало, при проверке в мастерской система вела себя отлично.Проблема возникла после монтажа механизма в магазине, монтаж производился в оконный проём. Суть проблемы в том, что при подаче питания в механизм без проблем запускается только средний шар под номером 2, шар 1 и 3 начинает работать только с пинка(проведя рукой либо другим предметом под датчиком). Помогите разобратся в чем может быть проблема? вот пример моего кода.


#define IN1  2
#define IN2  3
#define Trig1  4
#define Echo1  5


#define M1_CV   digitalWrite (IN1, HIGH);  digitalWrite (IN2, LOW)
#define M1_CCV  digitalWrite (IN1, LOW);   digitalWrite (IN2, HIGH)
#define M1_STOP digitalWrite (IN1, LOW);   digitalWrite (IN2, LOW)

void setup()
{

  pinMode (IN2, OUTPUT);
  pinMode (IN1, OUTPUT);
  pinMode (Trig1, OUTPUT);
  pinMode (Echo1, INPUT);


Serial.begin(9600);
}

unsigned int time_us=0;
unsigned int distance_sm=0;

void loop()
{
digitalWrite(Trig1, HIGH); // Подаем сигнал на выход датчика 1
delayMicroseconds(10); // Удерживаем 10 микросекунд
digitalWrite(Trig1, LOW); // Затем убираем
time_us=pulseIn(Echo1, HIGH); // Замеряем длину импульса
distance_sm=time_us/58; // Пересчитываем в сантиметры
Serial.println(distance_sm);
 
if (distance_sm<10) // Если расстояние до шарика меньше 10 см 
{
  M1_CV; // крутим двигатель влево
}

if (distance_sm>90) // если расстояние до шара больше 160 см
{
  M1_CCV; // крутим двигатель вправо
}

if (distance_sm<=0) // если нет сигнала от датчика
{
  M1_STOP; // остановка двигателя
}
delay(100);  
}

 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

А если дистанция 0? Вы его крутанули в 37 строке и тут же тормознули в 47 и так бесконечно. Такие сравнения надо как минимум во вложенных if делать. elseif

vovancho0
Offline
Зарегистрирован: 12.03.2015

Наверное вы меня не так поняли,все крутится-вертится стабильно,проблема только в том что при запуске начинает крутится только один двигатель, тот что посередине.два крайних бездействует, хотя скетч залит один на все три дуины.

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Да это я понял, ну а сериал.принтлн (33 строка) что выдает если подцепить монитор и подать питание?

vovancho0
Offline
Зарегистрирован: 12.03.2015

Как это не странно, он выдает реальное значение расстояния до шара. Я уже третий день голову ломаю, попробовал по разному изменить скетч, else if тоже пробовал, все также - с одинаковым скетчем на трех платформах с первого раза запускается только средний шар.может быть дело в какой-то неисправности самих датчиков? Я не упомянул о том что на датчиках я выпаивал пины и вместо них подпаивал провода, т.к. усомнился в надежности проводов от монтажной платы( папа-мама), не мог ли я их( датчики) сжечь либо подпортить паяльником( 12в но он раньше иногда бился током)?

 

 

 

 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Погодите, что-то я еще раз глянул на код мельком, после прочтения фразы "выдает реальное расстояние". Так если реальное будет, например, 30см Вы ни в какое условие не попадете и моторы не запустятся пока не проведете рукой ближде 10 сантиметров от датчика. Видать второй шар висит как раз либо близко либо далеко от датчика вот и срабатывает. Другого объяснения я не вижу.

UPD: надо просто в сетапе, например, написать M1_CV чтобы мотор начал вращаться не важно в какую сторону, тогда уже и условия отработают.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Не вникал в суть так как не понял сколько дальностьи сколько датчиков. На первый взгляд:

1. Ограничить дальность PulseIn поменьше, хотя-бы до 200 -  100 - 50.

2. У вас три дэвайса в одном месте? И замеры идут асинхронно?
Тогда возможна накладка: приём не "своих" импульсов.

3. Очень правильно что используете #define !!!

vovancho0
Offline
Зарегистрирован: 12.03.2015

побовал выставлять второй шар в любых положениях,он так и так начинает крутится до значения >90 см. а боковые шары как раз таки и срабатывают только если провести рукой ближе 10 см, либо отодвинуть шар и дать датчику увидеть подоконник. датчики находятся примерно в 40 см друг от друга.Прием не своих импульсов тоже исключаю т.к. при отключении одного либо двух шаров ситуация аналогичная - средний срабатывает, боковые - тишина...

я так понимаю проблема в недоработке и сырости кода. Тогда помогите пожалуйста с ним либо подскажите в каком направлении двигатся. Я так понимаю что если в сетапе прописать M1_CV , то ничего не произойдет, команда же должна находится в LOOPе? или я чего-то не допонимаю?можнт быть можно как нибудь заставить моторы при подключении питания начинать вращаться например вниз не повторяя эту команду как в LOOP, но при этом не противореча основному условию <10 cm - вниз , > 90 cm - вверх ?

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Просто добавьте в сетапе M1_CV всё произойдет. При подаче питания мотор закрутится. А дальше в лупе будет проверяться условия при котором надо мотору реверс сделать и всё. А то что вы описали про подоконник и руку как раз это подтверждает. Пока датчик не увидит выход за пределы мотор будет стоять.

vovancho0
Offline
Зарегистрирован: 12.03.2015

Спасибо вам большое,завтра попробую и отпишусь!)но все же для меня до сих пор остается загадкой почему второй мотор работает при тех же условиях при которых остальные не срабатывают...

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

А если оставить только сетап, весь луп закомментировать и залить во второй "мотор" посмотреть вдруг он закрутится. Может где-то наводки на линии, не притянуты, в третьем состоянии болтаются выходы и т.д. вот и работает.

vovancho0
Offline
Зарегистрирован: 12.03.2015

может быть и такое, т.к. из-за того что он работал исправно монитор к нему я не подключал.Хорошо, я завтра сначала попробую добавить в setup M1_CV,если это не поможет то второй вариант...в любом случае я завтра отпишусь. спасибо вам!