• Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
  • Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже предостаточно - придумайте что-то пооригинальнее.
  • Не писать свой вопрос в первую попавшуюся тему - вместо этого создать новую тему.
  • За поиск и предложение пиратского ПО - бан без предупреждения.
  • Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
  • Перед тем как что-то написать - читать здесь и здесь.

Управление мотором по rs-485 (Gyems rmd-x6)

Ответить

Автор темы
anatoliydenisenko44
Сообщения: 1
Зарегистрирован: 21 окт 2021, 10:57
Имя: Анатолий Денисенко
Страна: Украина
город/регион: м. Дніпро

Управление мотором по rs-485 (Gyems rmd-x6)

Сообщение anatoliydenisenko44 »

Доброго времени суток!
Не так давно занимаюсь электроникой и низкоуровневым программированием а с промышленными протоколами дела совсем не имел.
Есть двигатель он работает по протоколу rs-485, у меня связка ардуино уно + модуль rs-485 + мотор.

Я ним могу управлять и на него команды приходят, а вот обратной связи я добиться не могу. В тему добавлю код своего скетча.
Я не очень силен в работе с битами и регистрами, если есть хорошая литература которая даст понять как мне это все использовать - я буд только признательным. Потому что в данном протоколе есть старшие и младшие биты и я кое как понять как мне сделать скетч.

Добавлю фото с инструкцией к протоколу.
Изображение
Изображение

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

const int PIN_DIR = 2;
byte servoID_1 = 0x01;
//byte servoALL = 0x
int a=0;
void setup() {

pinMode(PIN_DIR,OUTPUT);
Serial.begin(115200);

digitalWrite(PIN_DIR,LOW);
Serial.flush();


}

void loop() {

a = analogRead(A0);

delay(100);


torque(0);
 // moveServo_temp(a);
  //delay(1000);
 // torque_pol(0);
delay(1000);  
printBuffer();
//delay(2000);  


}



void printBuffer(){
  unsigned char buf[5];
  uint8_t cur;
  byte notchecksum = (0xDC);
  digitalWrite(PIN_DIR,HIGH);
  buf[0]=0x3E;
  buf[1]=0x9C;
  buf[2]=0x01;
  buf[3]=0x00;
  buf[4]=0xDB;
  Serial.write(buf,5);
  Serial.flush();
  digitalWrite(PIN_DIR,LOW);
  while(Serial.available()>0){
    cur=Serial.read();
    delay(100);
  }
  Serial.print(cur,HEX);
  
  
}

void torque(int Position){
  unsigned char buf[8];
  char Position_H = Position >> 8;
  char Position_L = Position % 256;
  byte notchecksum = (Position_L+Position_H);
  digitalWrite(PIN_DIR,HIGH);
  buf[0]=0x3E;
  buf[1]=0xA1;
  buf[2]=0x01;
  buf[3]=0x02;
  buf[4]=0xE2;
  buf[5]=Position_L;
  buf[6]=Position_H;
  buf[7]=notchecksum;
  Serial.write(buf,8);
  Serial.flush();
 
  delay(100);
  digitalWrite(PIN_DIR,LOW);
  
  
}
void moveServo(){
  
  digitalWrite(2,HIGH);
  delay(100);
  Serial.write(0x3E);
  Serial.write(0xA4);
  Serial.write(0x01);
  Serial.write(0x0C);
  Serial.write(0xEF);
  Serial.write(0x10);
  Serial.write(0x27);
  Serial.write(0x00);
  Serial.write(0x00);
  Serial.write(0x00); 
  Serial.write(0x00);
  Serial.write(0x00);
  Serial.write(0x00);
  Serial.write(0xA0);
  Serial.write(0x8C);
  Serial.write(0x00);
  Serial.write(0x00);
  Serial.write(0x63);
  Serial.flush();
  digitalWrite(2,LOW);

  delay(100);
  
   
}

void moveServo4(int Position){
  char Position_H = Position >> 8;
  char Position_L = Position % 256;
  byte notchecksum = (Position_L+Position_H+0x00+0x00+0x00+0x00+0x00+0x00+0xA0+0x8C+0x00+0x00);
  //byte notchecksum = (0xA0+0x8C+0x00+0x00+0x00+0x00+0x00+0x00+0xA0+0x8C+0x00+0x00);

  digitalWrite(2,HIGH);
  delay(100);
  Serial.write(0x3E);
  Serial.write(0xA4);
  Serial.write(0x01);
  Serial.write(0x0C);
  Serial.write(0xEF);
  Serial.write(Position_H);                    // Serial.write(Position_L);
  Serial.write(Position_L);
  Serial.write(0x00);
  Serial.write(0x00);
  Serial.write(0x00); 
  Serial.write(0x00);
  Serial.write(0x00);
  Serial.write(0x00);
  Serial.write(0xA0);
  Serial.write(0x8C);
  Serial.write(0x00);
  Serial.write(0x00);
  Serial.write(notchecksum);
  Serial.flush();
  digitalWrite(2,LOW);

  delay(100);
  Serial.println(Position_H);
  Serial.println(Position_L);
  
   
}

void moveServo2(){
  byte notchecksum = (0x00+0x00+0x00+0x00+0x00+0x00+0x00+0x00+0xA0+0x8C+0x00+0x00);
  digitalWrite(2,HIGH);
  delay(100);
  Serial.write(0x3E);
  Serial.write(0xA4);
  Serial.write(0x01);
  Serial.write(0x0C);
  Serial.write(0xEF);
  Serial.write(0x00);
  Serial.write(0x00);
  Serial.write(0x00);
  Serial.write(0x00);
  Serial.write(0x00); 
  Serial.write(0x00);
  Serial.write(0x00);
  Serial.write(0x00);
  Serial.write(0xA0);
  Serial.write(0x8C);
  Serial.write(0x00);
  Serial.write(0x00);
  Serial.write(notchecksum);
  Serial.flush();
  digitalWrite(2,LOW);

  delay(100);
  
   
}

void moveServo3(){
  
  digitalWrite(2,HIGH);
  delay(100);
  Serial.write(0x3E);
  Serial.write(0xA4);
  Serial.write(0x01);
  Serial.write(0x0C);
  Serial.write(0xEF);
  Serial.write(0xA0);
  Serial.write(0x8C);
  Serial.write(0x00);
  Serial.write(0x00);
  Serial.write(0x00); 
  Serial.write(0x00);
  Serial.write(0x00);
  Serial.write(0x00);
  Serial.write(0xA0);
  Serial.write(0x8C);
  Serial.write(0x00);
  Serial.write(0x00);
  Serial.write(0x58);
  Serial.flush();
  digitalWrite(2,LOW);

  delay(100);
  
   
}


void moveServo_temp(int Position){
  unsigned char ab;
  char Position_H = Position >> 8;
  char Position_L = Position % 256;
  byte notchecksum = (0x00+0x00+0x00+0x00+0x00+0x00+0x00+0x00+0x00+0x00+0x00+0x00+0x00);
  //byte notchecksum = (0xA0+0x8C+0x00+0x00+0x00+0x00+0x00+0x00+0xA0+0x8C+0x00+0x00);

  digitalWrite(2,HIGH);
  delay(100);
  Serial.write(0x3E);
  Serial.write(0xA4);
  Serial.write(0x01);
  Serial.write(0x07);
  Serial.write(0xEA);
  Serial.write(0x00);
  Serial.write(0x00);
  Serial.write(0x00);
  Serial.write(0x00);
  Serial.write(0x00);
  Serial.write(0x00);
  Serial.write(0x00);
  Serial.write(0x00);
  Serial.write(notchecksum);
  Serial.flush();
  digitalWrite(2,LOW);

  delay(100);
  ab=Serial.read();
  Serial.print("ab - ");
  Serial.println(ab);
  
   
}


Ryzhij
почётный участник форума
почётный участник форума
Сообщения: 4885
Зарегистрирован: 07 окт 2011, 08:12
Имя: Гаско Вячеслав Эриевич
Страна: Россия
город/регион: Рязань
Благодарил (а): 295 раз
Поблагодарили: 463 раза

Управление мотором по rs-485 (Gyems rmd-x6)

Сообщение Ryzhij »

Какой ID вы используете?
Есть много протоколов, в которых существуют широковещательные сообщения. Они принимаются и исполняются всеми, но никто на них не отвечает.
---------------------------------------------------
«У человека в душе дыра размером с Бога, и каждый заполняет её как может». Жан-Поль Сартр

Аватара пользователя

Jackson
администратор
администратор
Сообщения: 13338
Зарегистрирован: 17 июн 2008, 15:01
Имя: Евгений свет Брониславович
Страна: Россия
город/регион: Санкт-Петербург
Благодарил (а): 351 раз
Поблагодарили: 643 раза

Управление мотором по rs-485 (Gyems rmd-x6)

Сообщение Jackson »

anatoliydenisenko44 писал(а):
21 окт 2021, 11:08
Есть двигатель он работает по протоколу rs-485
Начнем с того, что RS-485 - это физический интерфейс, а не протокол. Протокол там может бежать какой угодно, как с поддержкой широковещательных сообщений, так и без неё.

У Вас какой протокол? Приложенное - там сказано что-то про широковещательные телеграммы?

Отправлено спустя 2 минуты 30 секунд:
anatoliydenisenko44 писал(а):
21 окт 2021, 11:08
понять как мне сделать скетч
Ещё бы пояснить, что такое скетч. :) Вообще если сделать надо Вам, то и понять, как это работает, тоже придется Вам. Без этого не обойдётся. Здесь только на вопросы ответят.
По вопросам работы Форума можно обратиться по этим контактам.


Sokolov_Dmitry
освоился
освоился
Сообщения: 233
Зарегистрирован: 31 окт 2017, 16:45
Имя: Дмитрий
Страна: Россия
город/регион: Калининград
Благодарил (а): 8 раз
Поблагодарили: 45 раз

Управление мотором по rs-485 (Gyems rmd-x6)

Сообщение Sokolov_Dmitry »


Ответить

Вернуться в «Arduino»