Теперь в нашем онлайн-магазине доступна уникальная книга «BEAM-робототехника. От азов до создания практических устройств», идеально подходящая как для кружков робототехники, так и для самообучения дома. Вы можете приобрести её по привлекательной цене в 699 рублей. Дополнительная информация о книге доступна на нашем сайте. Также в ассортименте нашего онлайн-магазина представлены готовые наборы для сборки роботов, с помощью которых ваш ребенок сможет легко собрать своего первого робота, следуя нашим подробным инструкциям. Перейти в магазин


[ Раскрыть online-чат / Закрыть ] · [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: nightmare, Huntswarrior, Aleks_Crow  
Форум » Программирование микроконтроллеров AVR, PIC » Вопросы по програмированию » Нужна помощь по описанию программы для датчика SHARPGP2Y0A02 (не могу понять как программно связать датчик Ик дальномера)
Нужна помощь по описанию программы для датчика SHARPGP2Y0A02
Отправлено 23.06.2013 - 18:341
Начальная группа
5 сообщений
Мужчина
- вот так выглядит принципиальная схема проекта
- Такой он получился реализованный в железе за исключением одного датчика и модуля блютуз

//
// Motor end datchik test
//

int val_1 ; // переменная для хранения значения с 1 датчика
int val_2 ; // переменная для хранения значения 2
void setup()
{
Serial.begin(9600);
pinMode(8, OUTPUT); // Инициализируем цифровой вход/выход
pinMode(9, OUTPUT); // в режим выход
pinMode(10, OUTPUT); // для двигателя 1

pinMode(11, OUTPUT); // Инициализируем цифровой вход/выход
pinMode(12, OUTPUT); // в режим выход
pinMode(13, OUTPUT); // для двигателя 2

pinMode(16, INPUT); // Инициализируем цифровой вход/выход
pinMode(15, INPUT); // в режим вход датчиков

void loop()
{
val_2 = digitalRead(16); // считываем значение с входа датчиков
val_3 = digitalRead(15);
if ( val_1 == HIGH && val_2 == LOW) // если нажат датчик 1 то платфор-ма едет вперед
{ //движение вперед
digitalWrite(8, LOW);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
digitalWrite(13, LOW);}
if ( val_2 == HIGH && val_1 == LOW) // если нажат датчик 2 то платфор-ма едет назад
{//движение назад
digitalWrite(8, HIGH);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, LOW);
digitalWrite(13, HIGH);}
else //если датчики не нажаты то платформа стоит на месте
{//Стоп
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
}
}

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

Добавлено (23.06.2013, 18:24)
---------------------------------------------
//
// SHARP IR sensor testing
//

int IRpin = 0; // аналоговый пин для подключения выхода Vo сенсора

void setup() {
Serial.begin(9600); // старт последовательного порта
}

void loop() {
// 5V/1024 = 0.0048828125
float volts = analogRead(IRpin)*0.0048828125; // считываем значение сенсора и переводим в напряжение
float distance = 65*pow(volts, -1.10); // worked out from graph 65 = theretical distance / (1/Volts)S - luckylarry.co.uk
Serial.println(distance); // выдаём в порт
delay(100); // ждём
}

С помощью данного скетча производил проверку датчика SHARP - GP2Y0A02

Добавлено (23.06.2013, 18:34)
---------------------------------------------
Все приведенные скетчи использовались для тестирования, с помощью первого скетча была организована программа управления



6880619.jpg (154.8 Kb) · 8915957.jpg (107.1 Kb)
Профиль Личное сообщение Дом. страница icq Skype
0
Отправлено 23.06.2013 - 19:532
Администраторы
3417 сообщений
Мужчина
Цитата (KypoL)
проверив работоспособность ИК дальномера, не могу добавить его в тело цикла

Диапазон измерения расстояния от 20 до 150 см ?



Статью думаю вы прочли на крафтдуино. Не получается совместить два кода в один ?
А если так:

Код
//  
// Motor end datchik test  
//  

int IRpin = 0;    // свободный аналоговый пин для подключения выхода Vo сенсора  
int val_1 ;  // переменная для хранения значения с 1 датчика  
int val_2 ;  // переменная для хранения значения 2  
void setup()  
{  
Serial.begin(9600);  
pinMode(8, OUTPUT);  // Инициализируем цифровой вход/выход  
pinMode(9, OUTPUT);  // в режим выход  
pinMode(10, OUTPUT);  // для двигателя 1  

pinMode(11, OUTPUT);  // Инициализируем цифровой вход/выход  
pinMode(12, OUTPUT);  // в режим выход  
pinMode(13, OUTPUT);  // для двигателя 2  

pinMode(16, INPUT);  // Инициализируем цифровой вход/выход  
pinMode(15, INPUT);  // в режим вход датчиков  

void loop()  
{  

float volts = analogRead(IRpin)*0.0048828125; // считываем значение сенсора и переводим в напряжение  
float distance = 65*pow(volts, -1.10);  
//Зная теперь расстояние, занесенное в переменную distance, можем оперировать
//с условиями поведения робота в зависимости от дистанции.

val_2 = digitalRead(16); // считываем значение с входа датчиков  
val_3 = digitalRead(15);  

if (distance >= "расстояние указать")
{ ...Вставить код при котором робот должен работать при отсутствии препятствия }

if (distance <= "расстояние указать)
{ ...Вставить код при котором робот должен работать при наличии препятствия }

}


Вырезанный код который надо куда-то вставить из условий


Только дурак нуждается в порядке-гений господствует над хаосом...
Онлайн ЧАТ по робототехнике ! Заходи и общайся без регистрации =)
Профиль Личное сообщение Дом. страница icq Skype
34
Отправлено 23.06.2013 - 20:013
Администраторы
3417 сообщений
Мужчина
Если не понятно как работает дальномер и какие показания ему скармливать, точнее что ожидать от него, можно просто напросто взять сигнал пустить на аналоговый порт, и вывести значение порта в serialRead(Пин на который подключен дальномер); и наглядно увидим сколько он показывает при максимальной дистанции, и при минимальной. После найдем середину, ну а там не сложно прикинуть расстояние. Так еще проще. kind


Только дурак нуждается в порядке-гений господствует над хаосом...
Онлайн ЧАТ по робототехнике ! Заходи и общайся без регистрации =)
Профиль Личное сообщение Дом. страница icq Skype
34
Отправлено 23.06.2013 - 20:024
Администраторы
3417 сообщений
Мужчина
И да, когда будете рассказывать про робота, лучше "контактный датчик" назвать правильно - "тактильный датчик" или "тактильный сенсор" =)


Только дурак нуждается в порядке-гений господствует над хаосом...
Онлайн ЧАТ по робототехнике ! Заходи и общайся без регистрации =)
Профиль Личное сообщение Дом. страница icq Skype
34
Отправлено 23.06.2013 - 21:005
Начальная группа
5 сообщений
Мужчина
// Motor end datchik test
//

int IRpin = 0; // свободный аналоговый пин для подключения выхода Vo сенсора
int val_1 ; // переменная для хранения значения с 1 датчика
int val_2 ; // переменная для хранения значения 2
void setup()
{
Serial.begin(9600);
pinMode(8, OUTPUT); // Инициализируем цифровой вход/выход
pinMode(9, OUTPUT); // в режим выход
pinMode(10, OUTPUT); // для двигателя 1

pinMode(11, OUTPUT); // Инициализируем цифровой вход/выход
pinMode(12, OUTPUT); // в режим выход
pinMode(13, OUTPUT); // для двигателя 2

pinMode(16, INPUT); // Инициализируем цифровой вход/выход
pinMode(15, INPUT); // в режим вход датчиков

delay(5000); }

void loop()
{
float volts = analogRead(IRpin)*0.0048828125; // считываем значение сенсора и переводим в напряжение
float distance = 65*pow(volts, -1.10);
//Зная теперь расстояние, занесенное в переменную distance, можем оперировать
//с условиями поведения робота в зависимости от дистанции.
Serial.println(distance);
delay(500);
val_1 = digitalRead(16); // считываем значение с входа датчиков
val_2 = digitalRead(15);

if (distance <= 50)
{ Serial.println(distance);
delay(1000);
//движение назад
digitalWrite(8, HIGH);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, LOW);
digitalWrite(13, HIGH);}
if (distance >= 50)
{ Serial.println(distance);
delay(1000);
//движение назад
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);}}
Используя данный скетч был выявлен еще один недостаток платформы 4WD Mr.basic это её инерционность


Профиль Личное сообщение Дом. страница icq Skype
0
Отправлено 23.06.2013 - 21:076
Администраторы
3417 сообщений
Мужчина
Код работает ? Инерционность можно гасить программно, для этого нам нужно мотор стопорить. Точно не скажу как это скажется на электронике, но чтобы остановиться резко, а у вас там редуктор тем более, он сразу шестерни не затормозит, на мгновение запускаем мотор в реверс. Или ставим по 1 и 1 на входы L293D(если не ошибаюс это стоп, надо смотреть таблицу истинности) laugh


Только дурак нуждается в порядке-гений господствует над хаосом...
Онлайн ЧАТ по робототехнике ! Заходи и общайся без регистрации =)
Профиль Личное сообщение Дом. страница icq Skype
34
Отправлено 23.06.2013 - 21:167
Участник
142 сообщений
Мужчина
С инерционностью можно побороться. На небольшое маленькое время реверсировать моторы. Так на сумо лечил его инерцию) а то летит на большой скорости, видит край ринга, и улетает по инерции) Или есть вариант плавно тормозить, используя цикл for.

Добавлено (23.06.2013, 21:16)
---------------------------------------------
1 и 1 на выходах L293D это не стоп. Полного стопа у нее нет как токового) просто 1 и 1 на выходах не будет подавать на моторы ничего.



Профиль Личное сообщение Дом. страница icq Skype
20
Отправлено 23.06.2013 - 21:438
Начальная группа
5 сообщений
Мужчина
Так же натыкался на плавный пуск через l293 то что постепенно наращивается входное напряжение, следовательно можно наверно и заставить работать двигатель на пониженном напряжении, но учесть что нагрузка должна стать меньше


Профиль Личное сообщение Дом. страница icq Skype
0
Отправлено 23.06.2013 - 21:519
Администраторы
3417 сообщений
Мужчина
L293D не любит сильных нагрузок, и любит греться pinch


Только дурак нуждается в порядке-гений господствует над хаосом...
Онлайн ЧАТ по робототехнике ! Заходи и общайся без регистрации =)
Профиль Личное сообщение Дом. страница icq Skype
34
Отправлено 23.06.2013 - 22:0510
Начальная группа
5 сообщений
Мужчина
Ага заметил это, особенно когда люфт у колес не оставил


Профиль Личное сообщение Дом. страница icq Skype
0
Администраторы
3417 сообщений
Мужчина
Кстати, чтобы не давать роботу заезжать в слепую зону, ведь если препятствие ближе 20 см, то он его не заметит и будет пытать проехать по нему, если оно попало мимо контактов, нужно сделать усы из проволоки, как пример:э



Только дурак нуждается в порядке-гений господствует над хаосом...
Онлайн ЧАТ по робототехнике ! Заходи и общайся без регистрации =)
Профиль Личное сообщение Дом. страница icq Skype
34
Администраторы
3417 сообщений
Мужчина
Только усы сделать чтоб они рядом начинали и расходились, и если препятствие будет ниже датчика, или ближе, промельнув мимо дальномера, обязательно заденит тактильный ус.


Только дурак нуждается в порядке-гений господствует над хаосом...
Онлайн ЧАТ по робототехнике ! Заходи и общайся без регистрации =)
Профиль Личное сообщение Дом. страница icq Skype
34
Отправлено 23.06.2013 - 22:4013
Начальная группа
5 сообщений
Мужчина
А вот еще один скетч с использованием всего что нацеплено, и подбором оптимального расстояния
// Motor end datchik
//

int IRpin = 0; // свободный аналоговый пин для подключения выхода Vo сенсора
int val_1 ; // переменная для хранения значения с 1 датчика
int val_2 ; // переменная для хранения значения 2
void setup()
{
Serial.begin(9600);
pinMode(8, OUTPUT); // Инициализируем цифровой вход/выход
pinMode(9, OUTPUT); // в режим выход
pinMode(10, OUTPUT); // для двигателя 1

pinMode(11, OUTPUT); // Инициализируем цифровой вход/выход
pinMode(12, OUTPUT); // в режим выход
pinMode(13, OUTPUT); // для двигателя 2

pinMode(16, INPUT); // Инициализируем цифровой вход/выход
pinMode(15, INPUT); // в режим вход датчиков

delay(5000); }

void loop()
{
float volts = analogRead(IRpin)*0.0048828125; // считываем значение сенсора и переводим в напряжение
float distance = 65*pow(volts, -1.10);
//Зная теперь расстояние, занесенное в переменную distance, можем оперировать
//с условиями поведения робота в зависимости от дистанции.
Serial.println(distance);
delay(500);
val_1 = digitalRead(16); // считываем значение с входа датчиков
val_2 = digitalRead(15);

if (distance <= 75)
{
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
delay(500);
//движение назад
digitalWrite(8, HIGH);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, LOW);
digitalWrite(13, HIGH);
delay(3000);
digitalWrite(8, LOW);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, LOW);
digitalWrite(13, HIGH);
delay(1500);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
delay(500);}
if (distance >= 80)
{ //движение вперед
digitalWrite(8, LOW);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
digitalWrite(13, LOW);}
if ( val_1 == LOW && val_2 == HIGH) // столкновение, нажатие датчикa d1, плавный задний поворот на лево
{//Стоп
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
delay(1000);
//движение назад
digitalWrite(8, HIGH);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, LOW);
digitalWrite(13, HIGH);
delay(1500);
//поворот
digitalWrite(8, HIGH);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
digitalWrite(13, LOW);
delay(3000);
//Стоп
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
delay(1000);
}

if ( val_1 == HIGH && val_2 == LOW) // столкновение, нажатие датчикa d2, плавный задний поворот на право
{//Стоп
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
delay(1000);
//движение назад
digitalWrite(8, HIGH);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, LOW);
digitalWrite(13, HIGH);
delay(1500);

//поворот
digitalWrite(8, LOW);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, LOW);
digitalWrite(13, HIGH);
delay(3000);
//Стоп
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
delay(1000);
}

if ( val_1 == LOW && val_2 == LOW)//датчики не нажаты
{ //движение вперед
digitalWrite(8, LOW);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
digitalWrite(13, LOW);
}
}

Добавлено (23.06.2013, 22:40)
---------------------------------------------
На счет усов знаю, просто не задавался на счет их реализации, а изготовить их можно в виде бампера



Профиль Личное сообщение Дом. страница icq Skype
0
Администраторы
3417 сообщений
Мужчина
Видео заснять можете ?


Только дурак нуждается в порядке-гений господствует над хаосом...
Онлайн ЧАТ по робототехнике ! Заходи и общайся без регистрации =)
Профиль Личное сообщение Дом. страница icq Skype
34
Форум » Программирование микроконтроллеров AVR, PIC » Вопросы по програмированию » Нужна помощь по описанию программы для датчика SHARPGP2Y0A02 (не могу понять как программно связать датчик Ик дальномера)
  • Страница 1 из 1
  • 1
Поиск: