Интернет-лаборатория роботов ZiZiBOT.RU

Проектирование и разработки в области робототехники и автоматизации технологических процессов. Производство готовых роботов и конструкторов для творчества. Консультации и обучение по электронике и программированию.

г. Юрга,
ул.Ленинградская 38/83

+7 923-503-6074

Программное тестирование и программирование робота для робобаскетбола

Ссылки

  1. Сборка механики
  2. Сборка электроники
  3. Программирование

Программа для робота тестирование ходовой (robotest1.ino):

Программа тестирования связи по BT (robotest2.ino):

Программа для робота ПОЛНАЯ(robobasket.ino):

Модуль motor.h

Модуль move_case.h

Ссылка на полные скетчи.

 

Программа для робота тестирование ходовой (robotest1.ino):

Программа может быть использована для тестирования и настройки пинов (контактов моторов) универсальной ходовой части четырехмоторных/двух роботов подлюченных к драйверу L298N (по два мотора к порту параллельно) без использованния выводов драйвера ENA и ENB (они всегда включены). Программа служит для настройки используемых пинов, экспериментальным включением робота и изменение порядка расположения номеров пинов при инициализации драйвера функцией setup_motor_system  первые два числа задают управляющие пины левого мотора, а следующие два числа - управляющие пины правого мотора. Если перепутаны левая и правая сторона, их (пары) можно поменять. Если колеса вращаются не в ту сторону, числа в паре меняются местами. Если провода вообще перемешаны - экспериментально устанавливайте номера пинов для setup_motor_system

// Подключаем библиотеку для создания дополнительных последовательных (Serial) портов.
#include " motor.h "

//=================================//
//== Функция инициализации
void setup()
{
  // Переменные – номера контактов (пинов) Arduino.
  // Для левых и правых моторов машинки.
  setup_motor_system(2, 3, 4, 5);
  _stop(); //Двигатели остановлены.
  // Устанавливаем скорость передачи данных для НС-05 (Bluetooth-модуль).
}
// Основная программа.
void loop()
{
  //По очереди раскомментируем/закомментируем следующие две группы команд:


  //1.Группа. Должен вращать вперед только левые колеса, если колеса вращаются назад, в setup_motor_system 2 и 3 меняем местами
  //forward_right();
  //delay(1000);



  //2.Группа. Должен вращать вперед только правые колеса, , если колеса вращаются назад, в setup_motor_system 4 и 5 меняем местами
  //forward_left();
  //delay(1000);

}

Программа тестирования связи по BT (robotest2.ino):

Мы уже установили BT модуль на робота и хотим проверить его работу. Предполагается, что вам известна скорость обмена BT модуля с Arduino в примере это 9600 , остается оттестировать пины выделенные на организацию последовательного порта связи, в нашем случае это: SoftwareSerial BTSerial(8, 9) 8 и 9 , 8 отвечает за чтение данных, 9 за запись, т.е. на BT адаптере, они должны быть перекрещены 8 пойдет на TX, а 9 на RX.

Внимание, не забудьте выставить пины моторов по результатам предыдущей тестовой программы (robotest1).

// Подключаем библиотеку для создания дополнительных последовательных (Serial) портов.
#include < SoftwareSerial.h >
#include " motor.h "
#include " move_case.h "
//Создаем последовательный порт на пинах 13-чтение и 2-передача.
SoftwareSerial BTSerial(8, 9); // RX, TX
// Переменная для приема данных по Bluetooth.
char bt_input;
// Хранит время последнего нажатия кнопки.
unsigned long _time;

//=================================//
//== Функция инициализации
void setup()
{
  // Переменные – номера контактов (пинов) Arduino.
  // Для левых и правых моторов машинки.
  setup_motor_system(2, 3, 4, 5);
  _stop(); //Двигатели остановлены.
  // Устанавливаем скорость передачи данных для НС-05 (Bluetooth-модуль).
  BTSerial.begin(9600);
  // Устанавливаем скорость передачи данных по кабелю.
  // Порт компьютера
//  Serial.begin(9600);
  _time = micros();
  _move_time = 500;
}
// Основная программа.
void loop()
{
  if (BTSerial.available())
  {
    // Читаем команду и заносим ее в переменную. char преобразует
    // код символа команды в символ.
    bt_input = (char)BTSerial.read();
    // Отправляем команду в порт, чтобы можно было
    // их проверить в "Мониторе порта".
    // Serial.println(bt_input);
    //Вызов функции выбора действия по команде
    move_case(bt_input);
    _time = micros();
  }
  if ((micros() - _time) > _move_time)
  {
    _stop();
  }
  if ((micros() - _time) >= 500)
  {
    _time = micros();
    move_case(bt_input);
  }
}

Программа для робота ПОЛНАЯ(robobasket.ino):

По сравнению с предыдущей программой в данную добавлен функционал манипулятора. Подключено управление двумя сервомоторами. При установке сервомотора в перевернутом виде робот работать будет, но потребуется изменить настройки местами. Также значения RUKA_OPEN, RUKA_CLOSE, PLECHO_TOP, PLECHO_BOTTOM можно подбирать экспериментально, но если вы используете серовмотор mg90s, эти значения не должны быть меньше 10 и больше 170 иначе сервомотор может заклинить. Для остальных моторов можно использовать значения от 0 до 180. Если вы случаено перепутали и припаяли/установили управление в другие пины, их значение можно изменить в программе, в функции void setup() , это строки ruka.attach(6) и plech.attach(7) , первый номер для управления пальцами, второй для управления подъемным механизмом, установите те, что подключены на роботе.

#include < Servo.h >

//Если мотор установлен в обратную сторону, то значения в RUKA_OPEN и RUKA_CLOSE возможно придется поменять местами
#define RUKA_OPEN 15
#define RUKA_CLOSE 165

//Если мотор установлен в обратную сторону, то значения в PLECHO_TOP и PLECHO_BOTTOM возможно придется поменять местами
#define PLECHO_TOP 35
#define PLECHO_BOTTOM 155


Servo ruka, plech;
// Подключаем библиотеку для создания дополнительных последовательных (Serial) портов.
#include < SoftwareSerial.h >
#include " motor.h "
#include " move_case.h "
//Создаем последовательный порт на пинах 13-чтение и 2-передача.
SoftwareSerial BTSerial(8, 9); // RX, TX
// Переменная для приема данных по Bluetooth.
char bt_input;
// Хранит время последнего нажатия кнопки.
unsigned long _time;

//=================================//
//== Функция инициализации
void setup()
{
  // Переменные – номера контактов (пинов) Arduino.
  // Для левых и правых моторов машинки.
  ruka.attach(6);
  plech.attach(7);
  ruka.write(RUKA_CLOSE);
  plech.write(PLECHO_TOP);
  setup_motor_system(2, 3, 4, 5);
  _stop(); //Двигатели остановлены.
  // Устанавливаем скорость передачи данных для НС-05 (Bluetooth-модуль).
  BTSerial.begin(9600);
  // Устанавливаем скорость передачи данных по кабелю.
  // Порт компьютера
//  Serial.begin(9600);
  _time = micros();
  _move_time = 500;

}
// Основная программа.
void loop()
{
  if (BTSerial.available())
  {
    // Читаем команду и заносим ее в переменную. char преобразует
    // код символа команды в символ.
    bt_input = (char)BTSerial.read();
    // Отправляем команду в порт, чтобы можно было
    // их проверить в "Мониторе порта".
    // Serial.println(bt_input);
    //Вызов функции выбора действия по команде
    move_case(bt_input);
    _time = micros();
  }
  if ((micros() - _time) > _move_time)
  {
    _stop();
  }
  if ((micros() - _time) >= 500)
  {
    _time = micros();
    move_case(bt_input);
  }
}

Модуль motor.h

// Объявляем переменные для хранения состояния двух моторов.
int motor_L1, motor_L2;
int motor_R1, motor_R2;
//===============================================
// Функция инициализации управления моторами.
void setup_motor_system(int L1, int  L2, int  R1, int R2)
{
  // Заносятся в переменные номера контактов (пинов) Arduino.
  motor_L1 = L1; motor_L2 = L2;
  // Для левых и правых моторов робота.
  motor_R1 = R1; motor_R2 = R2;
  // Переводятся указанные порты в состояние вывода данных.
  pinMode(motor_L1, OUTPUT);
  pinMode(motor_L2, OUTPUT);
  pinMode(motor_R1, OUTPUT);
  pinMode(motor_R2, OUTPUT);
}
//===============================================
// движение вперед.
void forward()
{
  // Если двигатель будет работать не в ту сторону,
  // поменять на нем контакты местами.
  digitalWrite(motor_L1, HIGH);
  digitalWrite(motor_L2, LOW);
  digitalWrite(motor_R1, HIGH);
  digitalWrite(motor_R2, LOW);
}
//===============================================
// Поворот налево с блокировкой левых колес.
void forward_left()
{
  // блокировка вращения левых колес.
  digitalWrite(motor_L1, LOW);
  digitalWrite(motor_L2, LOW);
  // правые колеса вращаются.
  digitalWrite(motor_R1, HIGH);
  digitalWrite(motor_R2, LOW);
}
//===============================================
// Поворот направо с блокировкой правых колес.
void forward_right()
{
  // левые колеса вращаются.
  digitalWrite(motor_L1, HIGH);
  digitalWrite(motor_L2, LOW);
  // блокировка вращения правых колес.
  digitalWrite(motor_R1, LOW);
  digitalWrite(motor_R2, LOW);
}
// Поворот налево на месте.
void left()
{
  // левые колеса вращаются назад.
  digitalWrite(motor_L1, LOW);
  digitalWrite(motor_L2, HIGH);
  // правые колеса вращаются вперед.
  digitalWrite(motor_R1, HIGH);
  digitalWrite(motor_R2, LOW);
}
//===============================================
// Поворот направо на месте.
void right()
{
  // левые колеса вращаются вперед.
  digitalWrite(motor_L1, HIGH);
  digitalWrite(motor_L2, LOW);
  // правые колеса вращаются назад.
  digitalWrite(motor_R1, LOW);
  digitalWrite(motor_R2, HIGH);
}


// Включаем движение назад.
void backward()
{
  // Смена направления вращения двигателей.
  digitalWrite(motor_L2, HIGH);
  digitalWrite(motor_L1, LOW);
  digitalWrite(motor_R2, HIGH);
  digitalWrite(motor_R1, LOW);
}
//===============================================
// Включаем движение назад.
void backward_left()
{
  // Смена направления вращения двигателей.
  digitalWrite(motor_L2, LOW);
  digitalWrite(motor_L1, HIGH);
  digitalWrite(motor_R2, HIGH);
  digitalWrite(motor_R1, LOW);
}
//===============================================
// Включаем движение назад.
void backward_right()
{
  // Смена направления вращения двигателей.
  digitalWrite(motor_L2, HIGH);
  digitalWrite(motor_L1, LOW);
  digitalWrite(motor_R2, LOW);
  digitalWrite(motor_R1, HIGH);
}
//===============================================


void _stop()
{
  // Блокировка всех колес.
  digitalWrite(motor_L2, LOW);
  digitalWrite(motor_L1, LOW);
  digitalWrite(motor_R2, LOW);
  digitalWrite(motor_R1, LOW);
}

Модуль move_case.h

// Пременная изменения скорости.
unsigned long  _move_time;
int sostoyanie=0;
int _timer_;
// == Выбор действий
void move_case(char bt_input)
{

  switch (bt_input) {
    // Вперед
    case 'F':
      forward();
      break;
    // Назад
    case 'B':
      backward();
      break;
    // Влево
    case 'L':
      left();
      break;
    // Вправо
    case 'R':
      right();
      break;
    // Прямо и влево
    case 'G':
      forward_left();
      break;
    // Прямо и вправо
    case 'I':
      forward_right();
      break;
    // Назад и влево
    case 'H':
      backward_left();
      break;
    // Назад и вправо
    case 'J':
      backward_right();
      break;
    // Стоп
    case 'S':
      _stop();
      break;
    // Скорость 0%
    case '0':
      _move_time = 0;
      break;
    // Скорость 10%
    case '1':
      _move_time = 250;

      break;
    // Скорость 20%
    case '2':
      _move_time = 300;

      break;
    // Скорость 30%
    case '3':
      _move_time = 325;

      break;
    // Скорость 40%
    case '4':
      _move_time = 350;

      break;
    // Скорость 50%
    case '5':
      _move_time = 375;

      break;
    // Скорость 60%
    case '6':
      _move_time = 400;

      break;
    // Скорость 70%
    case '7':
      _move_time = 425;

      break;
    case '8':
      // Скорость 80%
      _move_time = 450;

      break;
    // Скорость 90%
    case '9':
      _move_time = 475;
      break;
    // Скорость 100%
    case 'q':
      _move_time = 500;
      break;

    case 'V':
      ruka.write(RUKA_OPEN);
      break;
    case 'v':
      ruka.write(RUKA_CLOSE);
      break;
    case 'X':
      plech.write(PLECHO_BOTTOM);
      break;
    case 'x':
      plech.write(PLECHO_TOP);
      break;
    case 'D':
      _stop(); //switch_rejim = 0;
      break;
  }
}

Ссылка на полные скетчи.

Ссылки

  1. Сборка механики
  2. Сборка электроники
  3. Программирование

X

Написать сообщение:

Укажите свой номер телефона или e-mail для обратной связи
- e-mail
ИЛИ
- номер телефона

Текст сообщения: