Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам > Робототехника

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 16.01.2017, 12:00   #1
kdsystem
Junior Member
 
Регистрация: 16.01.2017
Сообщений: 8
Вес репутации: 0
kdsystem is an unknown quantity at this point
По умолчанию Робот

имеется:
UNO
L293D shield
Два двигателя

Всё это дело собрал в "бутерброд", энкодеры подключил на 2,3 пин.
Заливаю код (см ниже), начинает кружиться влево (видимо из-за особенностей одного из двигателей).
Отключаю обработку прерываний - ездит и поворачивает нормально.

На основе приведенного кода синхронизации скорости вращения колес в одной из веток данного форума, написал код:

PHP код:
#include <AFMotor.h>  // Подключаем библиотеку для работы с шилдом 
#include <Cyberlib.h>
//Управление пинами:
// считаем, что motorL - левый мотор
// считаем, что motorR - правый мотор
#define encoders_init D2_In; D3_In; D2_High; D3_High
#define robot_rotation_left D4_Low; D5_High; D6_Low; D7_High

const byte MOTOR_SPEED 80//скорость передвижения робота
const byte TURN_SPEED 80;
const 
int TURN_TIME 180;
int i;

volatile int8_t course=0;
// Подключаем моторы к клеммникам M3, M4
AF_DCMotor motorL(3);
AF_DCMotor motorR(4);

void setup() {
  
Serial.begin(9600);
  
pinMode(2,INPUT);
  
pinMode(3,INPUT);
  
motorL.setSpeed(MOTOR_SPEED);
  
motorR.setSpeed(MOTOR_SPEED);
  
robot_stop();
  
IntOn();  //включить прерывания
}

void IntOn()
{
  
attachInterrupt(0left_interruptRISING);  // настроить срабатывание прерывания interrupt0 pin 2 по перепаду с низкого (Low) на высокий(HIGH)
  
attachInterrupt(1right_interruptRISING);  // настроить срабатывание прерывания interrupt1 pin 3 по перепаду с низкого (Low) на высокий(HIGH) 
}

void IntOff()
{
  
detachInterrupt(0);  // отключить срабатывание прерывания interrupt0
  
detachInterrupt(1);  // отключить срабатывание прерывания interrupt1
}  

void robot_right()
{
  
IntOff();
  
//остановили моторы
  
robot_stop();
  
motorL.setSpeed(TURN_SPEED);
  
motorR.setSpeed(TURN_SPEED);
  
//поворачиваем правое назад, левое вперед 1сек
  
motorL.run(BACKWARD);
  
motorR.run(FORWARD);
  
delay_ms(TURN_TIME);
  
robot_stop();
  
course=0;
  
IntOn();
}

void robot_left()
{
  
IntOff();
  
//остановили моторы
  
robot_stop();
  
motorL.setSpeed(TURN_SPEED);
  
motorR.setSpeed(TURN_SPEED);
  
//поворачиваем правое вперед, левое назад 1сек
  
motorL.run(FORWARD);
  
motorR.run(BACKWARD);
  
delay_ms(TURN_TIME);
  
robot_stop();
  
course=0;
  
IntOn();
}

void  left_interrupt()  
// обработка внешнего прерывания левое колесо

  
course--;
  
Serial.print("Left interrupt......course "); 
  
Serial.println(course);   
  if(
course 0) { robot_left(); }else{ robot_right();}
}  

void  right_interrupt()  
// обработка внешнего прерывания правое колесо
{
   
course++;
   
Serial.print("Right interrupt......course ");
   
Serial.println(course);   
   if(
course 0){ robot_right(); }else{ robot_left();}


void robot_stop()
{
  
//остановили моторы
  
motorL.run(RELEASE); 
  
motorR.run(RELEASE);
}

void loop() {
  
motorL.setSpeed(MOTOR_SPEED); // Задаем скорость движения
  
motorR.setSpeed(MOTOR_SPEED); 
  
// Двигаемся условно вперед пять секунд
  
motorL.run(FORWARD); // Задаем движение вперед
  
motorR.run(FORWARD);
  
  
delay_ms(5000);
  
  
// Останавливаем двигатели
  
robot_stop();
  
delay_ms(500);
  
  
//поворот налево
  
robot_left();
  
delay_ms(500);
  
//robot_stop();

kdsystem вне форума   Ответить с цитированием
Старый 16.01.2017, 12:45   #2
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Re: Робот

Попробуйте выбросить из прерываний все Serial.print
Admin вне форума   Ответить с цитированием
Старый 16.01.2017, 12:51   #3
kdsystem
Junior Member
 
Регистрация: 16.01.2017
Сообщений: 8
Вес репутации: 0
kdsystem is an unknown quantity at this point
По умолчанию Re: Робот

я их, наоборот,вставил для отладки. Почему-то ощущение, что работает только одно прерывание (один энкодер), вот для проверки и вставил вывод в консоль - работает и второй, но как-то странно.
kdsystem вне форума   Ответить с цитированием
Старый 16.01.2017, 13:02   #4
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Re: Робот

для отладки прерываний лучше подключить светодиоды
Ошибок в коде я не вижу http://cyber-place.ru/showthread.php?t=627
Возможно Вы полярности на двигателе попутали
Admin вне форума   Ответить с цитированием
Старый 16.01.2017, 13:11   #5
kdsystem
Junior Member
 
Регистрация: 16.01.2017
Сообщений: 8
Вес репутации: 0
kdsystem is an unknown quantity at this point
По умолчанию Re: Робот

с полярностью всё ок, ибо при отключении прерываний, едет прямо затем поворот налево.
Единственное, о чем я думаю - пин 2 задействован на контролере двигателей для 2го движка, я специально свои подключил к 3 и 4.

Смотрю на код и в обработчике прерываний, я останавливаю движки, может этого делать не надо? Или то, что кручу обоими двигателями? перепишу на корректировку одним двигателем, может проблема тут...

Спасибо за совет со светодиодами!
kdsystem вне форума   Ответить с цитированием
Старый 16.01.2017, 13:17   #6
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Re: Робот

Попробуйте код по ссылке выше
Admin вне форума   Ответить с цитированием
Старый 20.01.2017, 11:12   #7
kdsystem
Junior Member
 
Регистрация: 16.01.2017
Сообщений: 8
Вес репутации: 0
kdsystem is an unknown quantity at this point
По умолчанию Re: Робот

добился таки чтобы робот поехал по этому алгоритму.
Но есть но:
- как не делал, все-равно едет с подруливанием вправо-влево.
- двигается более прямо, но всё-равно загребает влево.
- при включении, двигатели крутятся в разнофазе (т.е. разворачивается на месте), хотя по алгоритму - никаких разворотов.
kdsystem вне форума   Ответить с цитированием
Старый 20.01.2017, 12:44   #8
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Re: Робот

Цитата:
- как не делал, все-равно едет с подруливанием вправо-влево.
- двигается более прямо, но всё-равно загребает влево.
Колеса скорее всего имеет небольшую разницу в диаметре
Admin вне форума   Ответить с цитированием
Старый 20.01.2017, 12:48   #9
kdsystem
Junior Member
 
Регистрация: 16.01.2017
Сообщений: 8
Вес репутации: 0
kdsystem is an unknown quantity at this point
По умолчанию Re: Робот

с разным диаметром колес идея интересная, конечно. Хотя, колеса, вроде бы такие же как у вас.
хм, а если меняю пины энкодеров местами, начинает загребать вправо.
думаю, стоит сравнить энкодеры еще.

код, кстати, тут: https://github.com/kdsystem/Arduino/...t/my_robot.ino
kdsystem вне форума   Ответить с цитированием
Старый 20.01.2017, 12:57   #10
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Re: Робот

А какие энкодеры используете?
Admin вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 8 (пользователей: 0 , гостей: 8)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 02:35. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика