Arduino Uno + сервоконтроллер на 32 мотора

Nathan
Offline
Зарегистрирован: 29.08.2017

Здравствуйте. Есть ли у кого-нибудь пример скетча для управления сервоконтроллером через Arduino Uno?

У меня есть два контроллера:

Первый:

https://ru.aliexpress.com/item/New-Version-32-Channel-Robot-Servo-Control-Board-Servo-Motor-Controller-PS2-Wireless-Control-USB/32329729842.html?spm=a2g0s.9042311.0.0.7ItK6C

Второй:

https://ru.aliexpress.com/item/32-Channel-Robot-Servo-Control-Board-controller-robot-control-PS2-remote-control-mini-usb-bluetooth-module/32722390676.html

 

Пытался залить скетч с этого форума (то, что в конце с исправлениями под один мотор):

http://www.robotshop.com/forum/al5d-speed-control-using-arduino-uno-and-ssc-32-t12450

Получается, что сервоконтроллер должен управлять мотором подключенным к 0 пину. По монитору COM-порта вижу, что Arduino посылает сигналы, но движения сервомотора нет.

Подключаю также:

Tx(Uno)->Rx(SSC-32) 
GND(Uno)->GND(SSC-32)

Питание для сервомоторов подаю через стабилизатор 7805 в корпусе TO-220. Хотя на форуме написали, что там не хватало напряжения.

 

И ещё по второму контроллеру на ATMega168 китаец прислал софт:

http://pan.baidu.com/s/1nuJ8WFv

Нужно ли его использовать, если управление идёт через Arduino? Может кто-нибудь использовал такие контроллеры?

Dr_grizzly
Dr_grizzly аватар
Offline
Зарегистрирован: 07.12.2015

А почему RX не задействуете от Uno к контроллеру?

На каком чипе собраны контроллеры? Atmel?

Можете посниферить(прощупать) обмен между прогой и контроллером которую дал Китаец? К примеру через Мегу подсоединить на разные порты устройства и вот этот скеч залить в мегу:

// буфер PC Serial
char bufferPC_Serial[64];
char bufferShield_Serial[64];
// буфер GPRS Serial
char bufferGPRS_Serial[64];
 
int i = 0;
int j = 0;
int n = 0;

void clearBufferPC_Serial()
{
  for (int t = 0; t < i; t++) {
    // очищаем буфер,
    // присваивая всем индексам массива значение 0
    bufferPC_Serial[t] = 0;
  }
}
void clearBufferGPRS_Serial()
{
  for (int t = 0; t < j; t++) {
    // очищаем буфер,
    // присваивая всем индексам массива значение 0
    bufferGPRS_Serial[t] = 0;
  }
}

void clearBufferShield_Serial()
{
  for (int t = 0; t < n; t++) {
    // очищаем буфер,
    // присваивая всем индексам массива значение 0
    bufferShield_Serial[t] = 0;
  }
}

 void serialPCread()
{
  i = 0;
  // если появились данные с компьютера
  if (Serial.available() > 0) {
    while (Serial.available() > 0) {
      // пока идёт передача данных,
      // записываем каждый байт в символьный массив
      bufferPC_Serial[i++]=(Serial.read());
    }
    // добавляем символ конца строки
    bufferPC_Serial[i] = '\0';
    // записываем данные в GPRS Shield
    Serial1.write(bufferPC_Serial);
   // Serial2.println(bufferPC_Serial);
    // очищаем буфер PC Serial
    clearBufferPC_Serial();
  }
}

 void serialShieldread()
{
  n = 0;
  // если появились данные с компьютера
  if (Serial2.available() > 0) {
    while (Serial2.available() > 0) {
      // пока идёт передача данных,
      // записываем каждый байт в символьный массив
      bufferShield_Serial[n++]=(Serial2.read());
    }
    // добавляем символ конца строки
    bufferShield_Serial[n] = '\0';
    // записываем данные в GPRS Shield
    Serial.write(bufferShield_Serial);
    Serial1.write(bufferShield_Serial);
    // очищаем буфер PC Serial
    clearBufferShield_Serial();
  }
}
 
void serialGPRSread()
{
   
    j = 0;
    // если появились данные с GPRS Shield
    if (Serial1.available() > 0) {
      digitalWrite(13,HIGH);
      while (Serial1.available() > 0) {
        // пока идёт передача данных,
        // записываем каждый байт в символьный массив
        bufferGPRS_Serial[j++]=(Serial1.read());
    }
    // добавляем символ конца строки
    bufferGPRS_Serial[j] = '\0';
    // выводим полученные данные с GPRS Shield в Serial-порт
    Serial.println(bufferGPRS_Serial);
   // Serial2.write(bufferGPRS_Serial);
    // очищаем буфер GPRS Serial
    clearBufferGPRS_Serial();
  delay(500);
  digitalWrite(13,LOW);
  }

  
}
 
 
 
void setup()
{
  // включаем GPRS-шилд
  pinMode(8,INPUT);
  pinMode(13,OUTPUT);  
  // открываем последовательный порт для мониторинга действий в программе
  Serial.begin(19200);
  Serial2.begin(19200);
  Serial1.begin(19200);
  // открываем последовательный порт
  // для связи с GPRS-устройством со скоростью 9600 бод
 
 
  while (!Serial) {
    // ждём, пока не откроется монитор последовательного порта
    // для того, чтобы отследить все события в программе
  }
 // gprs_OnOff();
  // пока не установится связь с GPRS-устройством, будем крутиться в теле функции
//  gprsTest();
}
 
void loop()
{
  
  // считываем данные с компьютера и записываем их в GPRS Shield
  serialPCread();
  delay(150);
  // считываем данные с GPRS Shield и выводим их в Serial-порт
  serialGPRSread();
  delay(150);
  serialShieldread(); 
  delay(150); 
}

здесь Serial1 и Serial2 обмениваются между собой и все это льется в Serial монитор.

Ссылка с небольшим материалом по контроллеру Серво http://robot-kit.ru/product_info.php/info/p590_Servo-kontroller-USB-dlya-Arduino--32-servoprivoda---Servo-Controller-Board-32-Channel-USB--RKP-SCB-32C-.html