Помогите разобраться с HC-SR04 и двигателями.
- Войдите на сайт для отправки комментариев
Доброго времени суток! помогите пожалуйста разобратся. есть небольшой проект, примерная схема выше на фото.три пластиковых шарика, на каждый шар отдельный мотор-редуктор, драйвер 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); }
А если дистанция 0? Вы его крутанули в 37 строке и тут же тормознули в 47 и так бесконечно. Такие сравнения надо как минимум во вложенных if делать. elseif
Наверное вы меня не так поняли,все крутится-вертится стабильно,проблема только в том что при запуске начинает крутится только один двигатель, тот что посередине.два крайних бездействует, хотя скетч залит один на все три дуины.
Да это я понял, ну а сериал.принтлн (33 строка) что выдает если подцепить монитор и подать питание?
Как это не странно, он выдает реальное значение расстояния до шара. Я уже третий день голову ломаю, попробовал по разному изменить скетч, else if тоже пробовал, все также - с одинаковым скетчем на трех платформах с первого раза запускается только средний шар.может быть дело в какой-то неисправности самих датчиков? Я не упомянул о том что на датчиках я выпаивал пины и вместо них подпаивал провода, т.к. усомнился в надежности проводов от монтажной платы( папа-мама), не мог ли я их( датчики) сжечь либо подпортить паяльником( 12в но он раньше иногда бился током)?
Погодите, что-то я еще раз глянул на код мельком, после прочтения фразы "выдает реальное расстояние". Так если реальное будет, например, 30см Вы ни в какое условие не попадете и моторы не запустятся пока не проведете рукой ближде 10 сантиметров от датчика. Видать второй шар висит как раз либо близко либо далеко от датчика вот и срабатывает. Другого объяснения я не вижу.
UPD: надо просто в сетапе, например, написать M1_CV чтобы мотор начал вращаться не важно в какую сторону, тогда уже и условия отработают.
Не вникал в суть так как не понял сколько дальностьи сколько датчиков. На первый взгляд:
1. Ограничить дальность PulseIn поменьше, хотя-бы до 200 - 100 - 50.
2. У вас три дэвайса в одном месте? И замеры идут асинхронно?
Тогда возможна накладка: приём не "своих" импульсов.
3. Очень правильно что используете #define !!!
побовал выставлять второй шар в любых положениях,он так и так начинает крутится до значения >90 см. а боковые шары как раз таки и срабатывают только если провести рукой ближе 10 см, либо отодвинуть шар и дать датчику увидеть подоконник. датчики находятся примерно в 40 см друг от друга.Прием не своих импульсов тоже исключаю т.к. при отключении одного либо двух шаров ситуация аналогичная - средний срабатывает, боковые - тишина...
я так понимаю проблема в недоработке и сырости кода. Тогда помогите пожалуйста с ним либо подскажите в каком направлении двигатся. Я так понимаю что если в сетапе прописать M1_CV , то ничего не произойдет, команда же должна находится в LOOPе? или я чего-то не допонимаю?можнт быть можно как нибудь заставить моторы при подключении питания начинать вращаться например вниз не повторяя эту команду как в LOOP, но при этом не противореча основному условию <10 cm - вниз , > 90 cm - вверх ?
Просто добавьте в сетапе M1_CV всё произойдет. При подаче питания мотор закрутится. А дальше в лупе будет проверяться условия при котором надо мотору реверс сделать и всё. А то что вы описали про подоконник и руку как раз это подтверждает. Пока датчик не увидит выход за пределы мотор будет стоять.
Спасибо вам большое,завтра попробую и отпишусь!)но все же для меня до сих пор остается загадкой почему второй мотор работает при тех же условиях при которых остальные не срабатывают...
А если оставить только сетап, весь луп закомментировать и залить во второй "мотор" посмотреть вдруг он закрутится. Может где-то наводки на линии, не притянуты, в третьем состоянии болтаются выходы и т.д. вот и работает.
может быть и такое, т.к. из-за того что он работал исправно монитор к нему я не подключал.Хорошо, я завтра сначала попробую добавить в setup M1_CV,если это не поможет то второй вариант...в любом случае я завтра отпишусь. спасибо вам!