Контроль мертвых зон на ардуино
- Войдите на сайт для отправки комментариев
Вс, 14/06/2020 - 09:28
Решил сделать простенький контроль мертвых зон на базе ардуино и ультразвуковых датчиков расстояния( по типу как на парктронике). Но рри тестировании появился неприятный глюк. Когда в пределах измерения датчика что-то есть( до метров пяти), то все работает. Но когда ничего нет, то он как-бы зависает и диоды которые должны сигнализировать горят постоянно. Скеч использовал вот этот
Модератор: Вставьте код по правилам форума. Ссылка есть в #1 посте "Песочницы".
Можно ли как-то это исправить? Я пока чайник в этом, напишите что добавить нужно в скеч
Спроси у автора кода
Спрашивал. Говорит что у него вроде все работает((
#define Left_SW_Pin 0 // пин переключателя указателя поворота (левый) #define Right_SW_Pin 1 // пин переключателя указателя поворота (правый) #define DZ1_Trig_Pin 2 // пин триггера датчика 1 (правый) #define DZ2_Trig_Pin 4 // пин триггера датчика 2 (левый) #define LZ_Led_Pin 11 // пин светодиода левой мертвой зоны #define BUZZ_Pin 12 // пин звукоизлучателя #define RZ_Led_Pin 13 // пин светодиода правой мертвой зоны int count_timer = 0; int j, d; void setup() { // Назначаем выходами пины всех тригеров и светодиодов. pinMode(DZ1_Trig_Pin, OUTPUT); pinMode(DZ2_Trig_Pin, OUTPUT); pinMode(LZ_Led_Pin, OUTPUT); pinMode(BUZZ_Pin, OUTPUT); pinMode(RZ_Led_Pin, OUTPUT); j = 1000; d = 1000; } int distance(int Data) //Возвращает дистанцию с датчика { int time_us; digitalWrite(Data, HIGH); // Подаем сигнал на выход //микроконтроллера delayMicroseconds(15); // Удерживаем 10 микросекунд digitalWrite(Data, LOW); // Затем убираем time_us=pulseIn(Data+1, HIGH); // Замеряем длину импульса return time_us/58; // Пересчитываем в сантиметры } void loop() { digitalWrite(LZ_Led_Pin, LOW); // отключение левого светодиода digitalWrite(RZ_Led_Pin, LOW); // отключение правого светодиода светодиоды if (d<100) // проверка — левая сторона digitalWrite(LZ_Led_Pin, HIGH); //включаем красный светодиод else //иначе digitalWrite(LZ_Led_Pin, LOW); //выключаем if (j<100) // Проверка — правая сторона digitalWrite(RZ_Led_Pin, HIGH); //включаем красный светодиод else //иначе digitalWrite(RZ_Led_Pin, LOW); //выключаем*/ if (!count_timer) { // Заставляем пищалку пищать в течение 200 миллисекунд. // Если это нужно. if ((digitalRead(Left_SW_Pin)&&d<80) || (digitalRead(Right_SW_Pin)&&j<80)) tone(BUZZ_Pin, 1500, 200); // поиграть с тоном и длительностью count_timer = 20; //Устанавливаем таймер паузы оповещения }else count_timer--; j= distance (DZ2_Trig_Pin); // Считываем дистанцию с левого d= distance (DZ1_Trig_Pin); //и правого канала данных delay (100); // пауза в 0,1 сек перед повтором цикла }1) У pulseIn есть третий параметр;
2) Между измерениями сонаром необходима пауза в 50-60 мс.
А вообще - прочитайте раздел "Возвращаемое значение" и подумайте, почему j и d меньше ста при больших расстояниях
http://arduino.ru/Reference/PulseIn