Arduino使用ROS通过键盘控制单个直流电机

我这边需要使用ROS控制一个AGV上的升降平台,于是在花费了几天的时间作出了这个方法
电机:24V直流电机, 通电即转
驱动器:BTS7960大电流电机驱动器,H桥原理,下图这种
在这里插入图片描述

板子:Arduino UNO
在这里我使用的时Arduino端作为Subscriber,ubuntu端作为publisher

Arduino端代码:


#include <ros.h>
#include <std_msgs/String.h>
#include <std_msgs/Int8.h>


ros::NodeHandle  nh;

int E1 = 5;     //M1 正
int E2 = 6;     //M1 反

std_msgs::String str_msg;

void stop_move(void) 
{                   
  analogWrite(E1,0);   
  analogWrite(E2,0);  
}   
void advance(void)          
{
  analogWrite (E1,255);       
  analogWrite (E2,0);
}  
void back_off (void)          
{
  analogWrite (E1,0);
  analogWrite (E2,255); 
}

void ModelCb(const std_msgs::Int8& model){ //定义回调函数为ModelCb,订阅String消息里的model
  if(model.data==-1){
    back_off();
  }
  else if(model.data==1){
    advance();
  }
  else if(model.data==0){
    stop_move();
  }
}


ros::Subscriber<std_msgs::Int8> sub("model", ModelCb );

void setup(void) 
{ 
  nh.initNode();
  nh.subscribe(sub);
} 
 
void loop(void) 
{

  nh.spinOnce();
  delay(1);
}

这个代码中的引脚5接的是L_PWM,引脚6接的是R_PWM,L_EN跟R_EN我直接接的5V供电

ubuntu端python代码:

#!/usr/bin/env python
# coding=utf-8
import rospy

import geometry_msgs.msg 

from std_msgs.msg import Int8

import sys, select, termios, tty

count =0
model=0
#键值对应移动方向
moveBindings = {
        'w':(1),
        's':(0),
        'x':(-1),
           }
#获取键值函数
def getKey():
    tty.setraw(sys.stdin.fileno())
    rlist, _, _ = select.select([sys.stdin], [], [], 0.1)
    if rlist:
        key = sys.stdin.read(1)
    else:
        key = ''

    termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings)
    return key

#主函数
if __name__=="__main__":
    settings = termios.tcgetattr(sys.stdin) #获取键值初始化,读取终端相关属性
    
    rospy.init_node('up_down_plat') #创建ROS节点,节点名称为“up_down_plat"
    pub = rospy.Publisher('model',Int8,queue_size=5) #创建话题发布者,发布"model"为话题的消息

    try:
        while(1):
            key = getKey() #获取键值

            #判断键值是否在移动方向键值内
            if key in moveBindings.keys():
                model  = moveBindings[key]
                count = 0
                if(model==1):
                    print("上升")
                elif(model==0):
                    print("停止")
                elif(model==-1):
                    print("下降")


            #空键值/'k',相关变量置0
            elif key == ' ' or key == 'k' :
                model=0

            #长期识别到不明键值,相关变量置0
            else:
                count = count + 1
                if count > 4:
                    model= 0
                if (key == '\x03'):
                    break

            pub.publish(model) 

    #运行出现问题则程序终止并打印相关错误信息
    except Exception as e:
        print(e)

    #程序结束前发布速度为0的速度话题
    finally:
        model =0
        pub.publish(model)

    #程序结束前设置终端相关属性
    termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings)

可以实现按w上升,s下降,松开即停

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值