Помогите с програмированием датчика SHARP 2Y0A21
- Войдите на сайт для отправки комментариев
Пнд, 04/02/2013 - 02:19
Уважаемые форумчане нужна помощь с програмированием Arduino. У меня Arduino Uno + Arduino Motor Shield + дальномер SHARP 2Y0A21 все это установлено на двухколесной платформе с двумя движками. Когда небыло дальномера платформа двигалась по программе после добавления дальномера платформа просто разворачивается на месте. Значения дальномера были измерены перед подключением, а потом написпна программа. Вот код который я заливал.
int distPin = 4;//Дальномер
int m1pin = 3;
int m2pin = 11;
int m1dir = 12;
int m2dir = 13;
void setup()
{
pinMode(m1pin, OUTPUT);
pinMode(m2pin, OUTPUT);
pinMode(m1dir, OUTPUT);
pinMode(m2dir, OUTPUT);
}
void loop()
{
int val = analogRead(distPin);//чтение данных с дальномера
delay(100);
if(val < 400)
{
digitalWrite(m1dir, HIGH);//движение вперед
digitalWrite(m2dir, HIGH);
analogWrite(m1pin, 200);
analogWrite(m2pin, 200);
}
if(400 < val < 500)
{
analogWrite(m1pin, 0);//Остановка
analogWrite(m2pin, 0);
delay(50);
digitalWrite(m1dir, HIGH);//Разворот
digitalWrite(m2dir, LOW);
analogWrite(m1pin, 200);
analogWrite(m2pin, 200);
delay(500);
}
if(val > 500)
{
analogWrite(m1pin, 0);//Остановка
analogWrite(m2pin, 0);
delay(50);
digitalWrite(m1dir, LOW);//Движение назад
digitalWrite(m2dir, LOW);
analogWrite(m1pin, 200);
analogWrite(m2pin, 200);
delay(1000);
digitalWrite(m1dir, HIGH);//Разворот
digitalWrite(m2dir, LOW);
analogWrite(m1pin, 200);
analogWrite(m2pin, 200);
delay(500);
}
}
В програмировании я полный ноль, это моя первая программа не считая тестовых типа мигания светодиода. Скажите пожалуйста что я делаю не так. Да совсем забыл изначально хотелось сделать робота объезжайкую. Зараннее спасибо за ответ.
В програмировании я полный ноль,
В логике, что - тоже?
Если ваш робот не движется вперед, то первый if-блок не выполняется. Значит, значения меньше 400 с датчика не приходят.
Если ваш робот не откатывается с разворотом, то третий if-блок не выполняется. Значит, значения больше 500 с датчика не приходят.
Если ваш робот только разворачивается, то постоянно выполняется второй if-блок. Значит, с датчика приходят только значения в диапазоне 401...499.
Как следует из вышесказанного, "не так" задаете диапазоны реагирования. Это во-вторых.
А во-первых - не с того начинаете. Сначала научитесь считывать данные с датчика и выводить их в терминал. В этом случае вы сможете построить кривую "расстояние до препятствия"-"значение, считываемое с датчика", а на ее основе - осмысленно задать диапазоны реагирования.
Показания датчика были эксперементально измерены через сериал порт, до подключения двигателей. Возможно ли что вместе с подключенными двигателями двигателями показания датчика меняютсю? И еще скажите пожалуйста можно ли к Arduine подключить внешнее питание одновременно с USB что бы вывести показания датчика через Serial во время работы программы вместе с подключенными двигателями? Сейчас вся схема питается от батареи 6в.
>>И еще скажите пожалуйста можно ли к Arduine подключить внешнее питание одновременно с USB <<
Да, можно. Почитайте основы электротехники. Если у вас не заняты RX и TX , все будет работать нормально.
int distPin = 4;//Дальномер int m1pin = 3; int m2pin = 11; int m1dir = 12; int m2dir = 13; void setup() { pinMode(m1pin, OUTPUT); pinMode(m2pin, OUTPUT); pinMode(m1dir, OUTPUT); pinMode(m2dir, OUTPUT); } void loop() { int val = analogRead(distPin);//чтение данных с дальномера delay(100); if(val > 500) forwardd(); else if(val < 500 && val > 400) turnn(); else backwardd(); ) void forwardd() //движение вперед { digitalWrite(m1dir, HIGH); digitalWrite(m2dir, HIGH); analogWrite(m1pin, 200); analogWrite(m2pin, 200); } void backwardd() //Движение назад { digitalWrite(m1dir, LOW); digitalWrite(m2dir, LOW); analogWrite(m1pin, 200); analogWrite(m2pin, 200); } void turnn() //Разворот { digitalWrite(m1dir, HIGH); digitalWrite(m2dir, LOW); analogWrite(m1pin, 200); analogWrite(m2pin, 200); }Может так заработает?
Спасибо за подсказку, ошибка в моём коде была здесь:
25 if(400 < val < 500)
Поставив ваши значения:
21 else if(val < 500 && val > 400) все заработало.
Исправив свою программу попробовал вашу она более доступно написана и легче читается.
Подскажите пожалуйста, хочу еще поставите два ИК дальномера слева и справа или может есть какое-то другое решение для боковых датчиков.
Подскажите пожалуйста, хочу еще поставите два ИК дальномера слева и справа или может есть какое-то другое решение для боковых датчиков.
http://arduino.ru/forum/proekty/ik-radar
У дальномера сильно острая диаграмма.
Нужно дальномер прикрепить на оси сервомотора и сканировать препятствия от 0 до 180гр
здравствуйте подскажите пожалуйста как считывать данные с датчика шарп 2Y0A21 зарание спасибо !!
(мне нужна программа)
если можно рпспишиите по детально
да и еще чтобы он ехал пока у него нету ничего ближе 15 см когда 14 и ниже останавливался зарание спасибо!
помоги с ультразвуком пожалуйста как считывать даные
[quote=Mastino]
помоги с програмированием как считывать данные с улбтразвука и как потом запрограмировать