ros学习之modbus读写饲服电机数据

ros学习之modbus-rtu读写饲服电机数据

首先你得找到电机的端口号和波特率 ,然后声明句柄
部分代码(只写了一个电机的代码,第二个同理)

	modbus_t *mb=NULL;
	uint16_t mbbuf[10];//存放数据,可以根据你读取的数据字节,调节数组。
	std::string connection_port = "";
	int main(int argc, char **argv)
{
	ROS_INFO("scaning available port");
	bool is_connected = false;
	if(!(mb=modbus_new_rtu("/dev/ttyUSB0",19200,'N',8,1))) //声明modbus的句柄
	{
		if(modbus_set_slave(mb,1)==-1)//设置从机位置
            	{
                modbus_free(mb);
            	}
            	if(modbus_connect(mb)==-1)
		{
                modbus_free(mb);
            	}
            	modbus_set_response_timeout(mb,0,200000);//设置超时时间
            	int m_en = modbus_write_register(mb,0,1);//modbus使能
           	if(modbus_read_registers(mb,0,15,mbbuf)==1)//读取该地址中的数据。
            	{
                connection_port = "/dev/ttyUSB0";
                is_connected = true;    
            	}
       
	}
	if(!is_connected) 
	{
        ROS_ERROR_STREAM("control borad connection failed");
        return -1;
    	}
	ROS_INFO_STREAM("available prot: " << connection_port);
	 ros::Publisher car_data_pub = nh.advertise("car_data", 10);
    ros::Subscriber car_control_sub=nh.subscribe("car_cmd",10,twistCallback);
}

上面进行了modbus的通讯,接下来对电机进行读取

while (ros::ok()) 
		{
        	memset(mbbuf,0,10*2);//置零
        	if(modbus_read_registers(mb,0,15,mbbuf)==1)
        		{
		   	loop_rate.sleep();
		   	translate_mb_data();//数据传输
		   	car_data_pub.publish(my_data);//发布节点
        		}
        
        	ros::spinOnce();
        
    		}
    	modbus_close(mb);
    	modbus_free(mb);
    	return 0;
//此函数在主函数(main)中一直循环

读取代码:

	void translate_mb_data(void)
	{
	    double sp1=0;
	    sp1=(short)mbbuf[0];//数据转换
	    my_data.speed[1]=sp1/RDC;//右轮,RDC是减速比
	}

写入代码:

	void twistCallback(const my_msgs::car_cmd & mycmd)//自己定义的消息类型
	{
    	double speed[2];
    	speed[0]=mycmd.speed[0];
    	speed[1]=mycmd.speed[1];
		int motor_speed_a=0,motor_speed_b=0;
		motor_speed_a=speed[0]*RDC;//转化成电机的转速
		motor_speed_b=speed[1]*RDC;
        usleep(1000*10);//寄存器来不及写入  进行时间延长
        int res = modbus_write_register(mb,20000,motor_speed_b);//右轮
        usleep(1000*10);
        int res1 = modbus_write_register(mb1,20000,motor_speed_a);//左轮
    
	}

好了,这样小车就可以行走了。(记得/dev/ttyUSB0权限)。

你可能感兴趣的:(ros)