Arduino - RS485 - SR518
- Войдите на сайт для отправки комментариев
Ср, 19/09/2012 - 07:44
Нам нужно было подключить серво 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] ); } }
2. Питание мотора было отдельным (4-9 В), и земля ардуино не была соединена с землей ардуины.
Вот это поподробней опишите - каким образом сделать удалось ;)
Также хотелось бы узнать, какие трудности при подключении в лоб вызвали необходимость искать (и найти) описываемое решение. А то непонятно, из-за чего огород городился.
И - цены бы не было вашему посту, если бы вы вставили коды с помощью соответствующего тега (красненькие квадратные скобки в окне редактирования с синенькой надписью под ними "code").
Да, напишите мне письмо, на perevalovds (at) gmail (dot) com
- что именно не работает?
Прошу пояснения, ведь код неработающий.
+оч нужно разобраться с этим серво
Вот итоговый код библиотеки, которую использовал. (Как я понял, моё первое сообщение было отформатировано модератором, и была внесена ошибка в код).
----------------
//Интерфейс управления моторами на 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);
}
//-----------------------------------------------------------------------