Как подключить rc-серву к ROBO TX

Обсуждаем модели и конструкции, построенные своими руками
Ответить
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1019
Зарегистрирован: 22 окт 2010, 23:57

Как подключить rc-серву к ROBO TX

Сообщение Mr.Kubikus »

Задача
Возникла интересная задача - подключить к контроллеру ROBO TX несколько обычных рулевых машинок так, чтобы ими можно было управлять из программы, созданной в ROBO Pro. Опишу решение, которое у меня получилось.

У контроллера ROBO TX нет штатных средств для управления rc-сервомашинками. Поэтому для решения задачи нам понадобится некое промежуточное устройство, которое будет принимать команды от ROBO TX и выдавать на рулевые машинки нужные сигналы управления. У меня на столе лежала не пристроенная Arduino UNO, поэтому я долго не раздумывал над выбором железки для этой задачи.
tx-servo-0.jpg
tx-servo-0.jpg (6.57 КБ) 12123 просмотра

Подключение

Arduino в моем решении подключается к ROBO TX через интерфейс I2C, доступный через разъем EXT2. Назначение контактов разъема EXT2 показано на рисунке ниже:
tx-servo-4.jpg
tx-servo-4.jpg (12.1 КБ) 12141 просмотр
На плате Arduino UNO интерфейс I2C выведен на следующие пины: A4 (SDA), A5 (SCL).
Четыре стандартные рулевые машинки я подключил к выходам Arduino D6, D9, D10 и D11.

Программа
Скетч для Arduino, который принимает команды через I2C и выдает управляющие сигналы на рулевые машинки, написан с использованием двух библиотек - Wire и Servo. Он настолько простой, что все понятно из исходного кода:

Код: Выделить всё

//
// Created: 2012-12-05
// Author: Mr. Kubikus
//

#include <Wire.h>
#include <Servo.h> 

Servo myservo[4];

int pos[4];    // variable to store the servo position 

void setup()
{
  myservo[0].attach(6);   // Servo connected to D6
  myservo[1].attach(9);   // D9
  myservo[2].attach(10);  // D10
  myservo[3].attach(11);  // D11 
  delay(1000);

  Wire.begin(4);                // join i2c bus with address #4
  Wire.onReceive(receiveEvent); // register event
  Serial.begin(9600);           // start serial for output
}

void loop()
{
  for(int ii = 0; ii < 4; ii++) {
    myservo[ii].write(pos[ii]);
  }
  delay(100);
}

void receiveEvent(int howMany)
{
  int ii = 0;
  while(Wire.available() > 0)
  {
    pos[ii] = Wire.read();
    Serial.print(pos[ii]);
    Serial.print(" ");
    ii+=1;
  }
  Serial.println(";");
}
Для доступа к порту I2C из среды ROBO Pro используется функция I2C Write. Для тестирования я разместил на листе блок-схемы 4 бегунка, которые задают значения в диапазоне от 0 до 180 градусов. Блок-схема программы для управления сервомашинками через I2C показана ниже:
tx-servo-1.jpg
tx-servo-1.jpg (27.92 КБ) 12141 просмотр

Свойства программных элементов I2C Write №1-3:
tx-servo-2.png
tx-servo-2.png (18.06 КБ) 12141 просмотр
Свойства программного элемента I2C Write №4:
tx-servo-3.png
tx-servo-3.png (18.01 КБ) 12141 просмотр
tx-servo.zip
Архив с исходными кодами для ROBO Pro и Arduino:
(3.8 КБ) 884 скачивания
Ссылки
Библиотека Wire
Библиотека Servo
Демонстрационная версия среды fischertechnik ROBO Pro
С уважением, Григорий
GitHub FB ВК
StarPer_l
Сообщения: 33
Зарегистрирован: 07 дек 2012, 21:16

Re: Как подключить rc-серву к ROBO TX

Сообщение StarPer_l »

Спасибо за ответ на тему. Идея понятна. А как написать прогу для поворачивания сервы на угол пропорциональный расстоянию от сонара до препятствия? Пример можно?
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1019
Зарегистрирован: 22 окт 2010, 23:57

Re: Как подключить rc-серву к ROBO TX

Сообщение Mr.Kubikus »

Как мне представляется, алгоритм может быть такой:

1: Считываем значение из входа, к которому подключен дальномер(сонар). Единицы полученного значения - сантиметры.
2: Преобразуем значение из сантиметров в угловые градусы. Для этого выполняем функцию масштабирования. Результат преобразования будет использоваться как задание для рулевой машинки.
3: Передаем задание в рулевую машинку через I2C.

Программу для ROBO TX попробую набросать немного позже, когда доберусь до компьютера с ROBO PRO.
С уважением, Григорий
GitHub FB ВК
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1019
Зарегистрирован: 22 окт 2010, 23:57

Re: Как подключить rc-серву к ROBO TX

Сообщение Mr.Kubikus »

Составил, вот, программу для ROBO TX.
Главная программа
tx-servo-usound-1.jpg
tx-servo-usound-1.jpg (38.34 КБ) 12069 просмотров
Подпрограмма MAP
Подпрограмма выполняет преобразование значения, передаваемого на вход в виде параметра. Для преобразования используется следующая формула:
y = (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
Для нашего примера:
in_min = 0;
in_max = 100 [см];
out_min = 0;
out_max = 180 [град];
tx-servo-usound-2.jpg
tx-servo-usound-2.jpg (32.81 КБ) 12069 просмотров
Подпрограмма RCSRV
Подпрограмма принимает в виде параметра значение, которое будет передано в блок управления рулевыми машинками через интерфейс I2C. Размерность параметра - угловые градусы.
tx-servo-usound-3.jpg
tx-servo-usound-3.jpg (18.29 КБ) 12069 просмотров
Вложения
ft-servo-usound.rpp
Проект для ROBO Pro
(116.09 КБ) 882 скачивания
С уважением, Григорий
GitHub FB ВК
Ответить