Помогите с програмированием датчика SHARP 2Y0A21

teoln_m
Offline
Зарегистрирован: 03.02.2013

Уважаемые форумчане нужна помощь с програмированием 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);
  }
}
  

В програмировании я полный ноль, это моя первая программа не считая тестовых типа мигания светодиода. Скажите пожалуйста что я делаю не так. Да совсем забыл изначально хотелось сделать робота объезжайкую. Зараннее спасибо за ответ.

step962
Offline
Зарегистрирован: 23.05.2011

teoln_m пишет:

В програмировании я полный ноль,

В логике, что - тоже?

Если ваш робот не движется вперед, то первый if-блок не выполняется. Значит, значения меньше 400 с датчика не приходят.

Если ваш робот не откатывается с разворотом, то третий if-блок не выполняется. Значит, значения больше 500 с датчика не приходят.

Если ваш робот только разворачивается, то постоянно выполняется второй if-блок. Значит, с датчика приходят только значения в диапазоне 401...499.

Цитата:
Скажите пожалуйста что я делаю не так.

Как следует из вышесказанного, "не так" задаете диапазоны реагирования. Это во-вторых.

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

teoln_m
Offline
Зарегистрирован: 03.02.2013

Показания датчика были эксперементально измерены через сериал порт, до подключения двигателей. Возможно ли что вместе с подключенными двигателями двигателями показания датчика меняютсю? И еще скажите пожалуйста можно ли к Arduine подключить внешнее питание одновременно с USB что бы вывести показания датчика через Serial во время работы программы вместе с подключенными двигателями? Сейчас вся схема питается от батареи 6в.

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

 >>И еще скажите пожалуйста можно ли к Arduine подключить внешнее питание одновременно с USB <<

Да, можно. Почитайте основы электротехники. Если у вас не заняты RX и TX , все будет работать нормально.

Mastino
Offline
Зарегистрирован: 03.12.2011
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);
}

Может так заработает?

teoln_m
Offline
Зарегистрирован: 03.02.2013

Спасибо за подсказку, ошибка в моём коде была здесь:

25     if(400 < val < 500)

Поставив ваши значения:

21     else if(val < 500 && val > 400) все заработало.

 Исправив свою программу попробовал вашу она более доступно написана и легче читается.

Подскажите пожалуйста, хочу еще поставите два ИК дальномера слева и справа или может есть какое-то другое решение для боковых датчиков.

Mastino
Offline
Зарегистрирован: 03.12.2011

teoln_m пишет:

Подскажите пожалуйста, хочу еще поставите два ИК дальномера слева и справа или может есть какое-то другое решение для боковых датчиков.

http://arduino.ru/forum/proekty/ik-radar

carduino.ru
Offline
Зарегистрирован: 06.12.2011

У дальномера сильно острая диаграмма.

 Нужно дальномер прикрепить на оси сервомотора и сканировать препятствия  от 0 до 180гр

artemon123
Offline
Зарегистрирован: 03.01.2016

здравствуйте подскажите пожалуйста как считывать данные с датчика шарп 2Y0A21 зарание спасибо !!

(мне нужна программа)

 

если можно рпспишиите по детально

да и еще чтобы он ехал пока у него нету ничего ближе 15 см когда 14 и ниже останавливался зарание спасибо!

artemon123
Offline
Зарегистрирован: 03.01.2016

помоги с ультразвуком пожалуйста как считывать даные

 

artemon123
Offline
Зарегистрирован: 03.01.2016

[quote=Mastino]

помоги с програмированием как считывать данные с улбтразвука и как потом запрограмировать