Arduino Uno + сервоконтроллер на 32 мотора
- Войдите на сайт для отправки комментариев
Здравствуйте. Есть ли у кого-нибудь пример скетча для управления сервоконтроллером через Arduino Uno?
У меня есть два контроллера:
Первый:
Второй:
Пытался залить скетч с этого форума (то, что в конце с исправлениями под один мотор):
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? Может кто-нибудь использовал такие контроллеры?
А почему 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