Control de Dynamixel MX28R a través de RS485

0

Tengo problemas para controlar el servo motor dynamixel MX28R . He probado dos tipos de conexión. Primero uno a raspberry Pi B+ y este es un caso de uso principal. Aquí está mi esquema de conexión.

ElservoseconectaaRS485communicationboard.RSEpinseconectaaGPIO_0deframbuesa.RSEnecesitaserconfiguradoaceropararecibiryestableceren1paralatransmisióndedatos.HemodificadoelSDKdeC++yagregueencenderGPIO_0antesdeescribiryapagardespués.deDynamixelSDK/c++/src/dynamixel_sdk_linux/port_handler_linux.cpp

#defineRES_PIN0...PortHandlerLinux::PortHandlerLinux(constchar*port_name):socket_fd_(-1),baudrate_(DEFAULT_BAUDRATE_),packet_start_time_(0.0),packet_timeout_(0.0),tx_time_per_byte(0.0){is_using_=false;setPortName(port_name);wiringPiSetup();//<<<<thisismycodepinMode(RES_PIN,OUTPUT);//<<<<digitalWrite(RES_PIN,LOW);//<<<<}...intPortHandlerLinux::writePort(uint8_t*packet,intlength){digitalWrite(RES_PIN,HIGH);//<<<<//delay1don'tworkwithorwithoutdelaysintres=write(socket_fd_,packet,length);//delay2digitalWrite(RES_PIN,LOW);//<<<<returnres;}...

PerocuandoejecutoejemplosVeoThereisnostatuspacket!error.Yelmotornoreacciona.Hetratadodeenviarcomandosatravésdedxl_monitor.Porejemplo,paraencenderelLED:w11251ow1255251peronopasanada.Tambiénheintentadoenviarel paquete de instrucciones desde este ejemplo .

import serial
import time
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
GPIO.setup(0, GPIO.OUT)

port = serial.Serial("/dev/ttyAMA0", baudrate=1000000, timeout=3.0)

while True:
        GPIO.output(0, GPIO.HIGH)
        port.write(bytearray.fromhex("FF FF 01 05 03 1E 32 03 A3"))
        time.sleep(0.1)
        GPIO.output(0, GPIO.LOW)
        time.sleep(3)

        GPIO.output(0,GPIO.HIGH)
        port.write(bytearray.fromhex("FF FF 01 05 03 1E CD 00 0b"))
        time.sleep(0.1)
        GPIO.output(0,GPIO.LOW)
        time.sleep(3)

También he intentado cambiar la velocidad en baudios a diferentes valores de este manual sin resultado.

Aquí hay otra conexión que he usado.

RSE pin siempre se establece en 1 para transmitir datos desde la PC.

Envié paquetes de instrucciones en bruto con el mismo código de Python (sin GPIO ). Pero el servo no reacciona.

También he notado que el led en UART se enciende por un tiempo, cuando enciendo dynamixel. Al igual que envía algunos datos sobre encendido. He intentado leer datos con utile de pantalla:

screen /dev/ttyUSB0 1000000 cs8

Probado con diferentes velocidades de transmisión, pero la pantalla no muestra información.

    
pregunta Tony O

1 respuesta

1

Esto ciertamente no funcionará:

int res = write(socket_fd_, packet, length);
// delay2
digitalWrite (RES_PIN, LOW); // <<<<

El motivo es que write () es asíncrono, y simplemente coloca bytes en el búfer del puerto serie saliente; No espera a que los datos terminen de enviarse. Puede usar tcgetattr () seguido de tcsetattr () con TCSADRAIN para asegurarse de que el búfer de salida se vacíe completamente antes de volver a cambiar de dirección.

#include <termios.h>

// call this after you've called write() for the data,
// before you attempt to switch direction again.
struct termios tio;
tcgetattr(fd, &tio);
tcsetattr(fd, TCSADRAIN, &tio);

Aparte de eso, ¿qué dice el osciloscopio o la sonda lógica sobre los tres cables que se supone que debes cambiar desde el Pi? (RX, TX y DIR)

    
respondido por el Jon Watte

Lea otras preguntas en las etiquetas