Arduino - RS485 - SR518

perevalovds
Offline
Зарегистрирован: 19.09.2012

Нам нужно было подключить серво SR-518 к ардуино. Удалось, но очень не сразу.
Поэтому решил выслать описание как это было сделано.

(хотел ответить в ветке на http://arduino.ru/forum/apparatnye-voprosy/arduino-rs-485 - но не удалось).

Подключили к Arduino mega (DFRduino Mega 2560 V2.0) моторчик SR-518 через "IO Expansion Shield for Arduino (V5)".
1. "A" и "B" шилда - подключили к A и B мотора.
2. Питание мотора было отдельным (4-9 В), и земля ардуино не была соединена с землей ардуины.
3. При прошивке ардуины - надо убрать три джампера шилда.
4. После прошивки - вставить их в положение "RS485".

Код:

int EN = 2; //RS485 has a enable/disable pin to transmit or receive data. Arduino Digital Pin 2 = Rx/Tx 'Enable'; High to Transmit, Low to Receive

int ledPin = 13;

void setup()
{
pinMode( ledPin, OUTPUT );
pinMode(EN, OUTPUT);
//Serial.begin(1000000); //Documented speed of SR518
Serial.begin(500000); //Works too!

delay(500);
digitalWrite( ledPin, HIGH );
}

void loop()
{
digitalWrite( ledPin, HIGH );

int upangle = 1024; //max value for angle
int id = 1; //motor id (1 is default)

//Angle test - slow rotating at full range
for (int i=0; i servoRotate( id, i );
delay(10);
}

delay(1000);

//Speed test - rotate at different speeds, 5 times
//speed values: 0 - max speed(no control), 1-slowest...1023-fastest
for (int i=1; i<1023; i+= 1023/5)
{
servoSpeed( id, i);
delay(10); //Attention: without delay it doesn't work (???)
servoRotate( id, 0 );
delay( 2000 );
servoRotate( id, upangle );
delay( 2000 );
}

delay(1000);

//Accelerate test - rotate with different acceleration
//accel/deccel values: 0 - no motion, 1 - slowest, 255-fastest,
//but 32 - is high enough (32 is default value)
for (int i=1; i<=10; i++) {
servoAccel( id, i );
delay(10);
servoDeccel( id, i );
delay(10);

servoSpeed( id, 0 );
delay(10);
servoRotate( id, 0 );
delay( 2000 );
servoRotate( id, upangle );
delay(2000);
}

digitalWrite( ledPin, LOW );

delay(1000);

}

//-----------------------------------------------------------------------
//rotate to angle, value 0..1023
const int GoalHi = 31;
const int GoalLow = 30;
void servoRotate( int id, int value )
{

servoWrite( id, GoalHi, value / 256 );
servoWrite( id, GoalLow, value % 256 );

}

//-----------------------------------------------------------------------
//set speed value: 0 - max speed(no control), 1-slowest...1023-fastest
const int SpeedHi = 33;
const int SpeedLow = 32;
void servoSpeed( int id, int value )
{
servoWrite( id, SpeedHi, value / 256 );
servoWrite( id, SpeedLow, value % 256 );
}

//-----------------------------------------------------------------------
//set acceleration/decceleration speed, 0..255
//0 - no motion, 1 - slowest, 255-fastest,
//but 32 - is high enough (32 is default value)
const int Accel = 34;
const int Deccel = 35;
void servoAccel( int id, int value )
{
servoWrite( id, Accel, value );
}

void servoDeccel( int id, int value )
{
servoWrite( id, Deccel, value );
}

//-----------------------------------------------------------------------
void servoWrite( int id, int regist, int value )
{
//255 255 id 4-length 3-WRITE regist value control_sum
int buf[] = {255, 255, id, 4, 3, regist, value, 0 };

int len = 8;
int sum = 0; //calculate control sum
for (int i=2; i sum += buf[i];
}
sum = 255 - (sum % 256 );
buf[len-1] = sum;

digitalWrite(EN, HIGH);//Enable data transmit

for (int i=0; i Serial.write( buf[i] );
}

}

 

step962
Offline
Зарегистрирован: 23.05.2011

perevalovds пишет:

2. Питание мотора было отдельным (4-9 В), и земля ардуино не была соединена с землей ардуины.

Вот это поподробней опишите - каким образом сделать удалось ;)

Также хотелось бы узнать, какие трудности при подключении в лоб вызвали необходимость искать (и найти) описываемое решение. А то непонятно, из-за чего огород городился.

И - цены бы не было вашему посту, если бы вы вставили коды с помощью соответствующего тега (красненькие квадратные скобки в окне редактирования с синенькой надписью под ними "code").

hallai
Offline
Зарегистрирован: 21.10.2013
привет
 
Вы могли бы сделать 518 SR работе с Arduino.
 
Я попытался с помощью выше исходный код, но не работает.
 
Не могли бы вы мне помочь?
 
спасибо
 
Я прошу прощения за плохое письмо.
perevalovds
Offline
Зарегистрирован: 19.09.2012

hallai пишет:

привет
 
Вы могли бы сделать 518 SR работе с Arduino.
 
Я попытался с помощью выше исходный код, но не работает.
 
Не могли бы вы мне помочь?
 
спасибо
 
Я прошу прощения за плохое письмо.

Да, напишите мне письмо, на perevalovds (at) gmail (dot) com 

- что именно не работает?

nikita9333
Offline
Зарегистрирован: 02.02.2014

Прошу пояснения, ведь код неработающий.
+оч нужно разобраться с этим серво

perevalovds
Offline
Зарегистрирован: 19.09.2012

Вот итоговый код библиотеки, которую использовал. (Как я понял, моё первое сообщение было отформатировано модератором, и была внесена ошибка в код).

----------------
//Интерфейс управления моторами на RS485
//подключены с помощью шилда. Только A и B - к шилду, а земля и питание отдельно
//Шилд RS485 подключен так: два крайних джампера пинами 0 и 1 к Serial3 Меги, а третий стоит на RS485

//RS485 has a enable/disable pin to transmit or receive data. Arduino Digital Pin 2 = Rx/Tx 'Enable'; High to Transmit, Low to Receive
int servoEN = 2;   //Пин шилда

int Servo485RewriteData = 1;      //Перепрошивать ли у сервы id, Speed, Accel, Deccel
                      //0;
          
//--------------------------------------------------------------
void m485Setup()
{  
  pinMode(servoEN, OUTPUT);
  //Serial3.begin(1000000);    //Может оказаться у мотора миним
  Serial3.begin(500000);      //Может оказаться у мотора миним
 
}

//--------------------------------------------------------------
//void m485Update( float dt )
//{
//}

//-------------------------------------------------------------
//-------------------------------------------------------------
//-------------------------------------------------------------

//-----------------------------------------------------------------------
//-----------------     НИЗКОУРОВНЕВЫЕ ФУНКЦИИ RS485  -------------------
//-----------------------------------------------------------------------
//вращение в нужный угол, от 0 до 1024
const int GoalHi = 31;
const int GoalLow = 30;
void servoRotate( int id, int value )
{
 
  servoWrite( id, GoalHi, value / 256 );
  servoWrite( id, GoalLow, value % 256 );

}

//-----------------------------------------------------------------------
//установка скорости, от 0 до 1023. 0 - самая быстрая, 1023 - самая медленная
const int SpeedHi = 33;
const int SpeedLow = 32;
void servoSpeed( int id, int value )
{
  if ( Servo485RewriteData ) {
    servoWrite( id, SpeedHi, value / 256 );
    servoWrite( id, SpeedLow, value % 256 );
  }
}

//-----------------------------------------------------------------------
//установка ускорения, 1 - самое медленное, 32 - быстрое, по умолчанию
const int Accel = 34;
const int Deccel = 35;
void servoAccel( int id, int value )
{
  if ( Servo485RewriteData ) {  
    servoWrite( id, Accel, value );
  }
}

void servoDeccel( int id, int value )
{
  if ( Servo485RewriteData ) {  
    servoWrite( id, Deccel, value );
  }
}

//-----------------------------------------------------------------------
//установка нового id
/*
//Закомментировал - чтоб id не сбилось случайно ни за что.

const int IdReg = 3;

void servoId( int id, int newId )
{
  if ( Servo485RewriteData ) {
    servoWrite( id, IdReg, newId );
  }
}
*/

//-----------------------------------------------------------------------
void servoWrite( int id, int regist, int value )
{

  //255 255 254-(broadcast) 4-длина 3-WRITE 31-GoalPos(H) ЗНАЧ-е   контрсумма
 int buf[] = {255, 255, id, 4, 3, regist, value, 0 };
 
  //buf[6] = value;
 
  int len = 8;
  int sum = 0;  //считаем контрольную сумму
  for (int i=2; i<len-1; i++) {
    sum += buf[i];  
  }
  sum = 255 - (sum % 256 );
  buf[len-1] = sum;
 
  digitalWrite(servoEN, HIGH);//Enable data transmit

  delay(1);

  for (int i=0; i<len; i++) {
    Serial3.write( buf[i] );
  }
 
 //0XFF 0XFF 0XFE 0X04 0X03
  delay(1);
 
}

//-----------------------------------------------------------------------