实现过程:
1、单片机程序编序(C语言)
STC89C52单片机 晶振频率11.0592MHz
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit led =P1^0; // 发送指示灯
sbit s1 = P3^4; // 左转
sbit s2 = P3^5; // 前进
sbit s3 = P3^6; // 右转
sbit s4 = P3^7; // 停止
uchar num='S'; // 初始状态为停止 STOP
void delay(uint x) // 键盘消抖
{
uint i,k;
for(i=0;i<x;i++)
for(k=0;k<1000;k++);
}
void init()
{
TMOD=0x20; //设定T1定时器工作方式2
TH1=0xfd; //波特率9600
TL1=0xfd; //波特率9600
TR1=1; //启动定时器1
SM0=0; //串口工作方式1 八位异步串行通信
SM1=1; //一帧数据结构为一个起始位,八个数据位,一个停止位
REN=1; //允许串口接收
EA=1; //开总中断
ES=1; //开串口中断
PCON=0x00; //SMOD=1 要获得9600波特率 OXFD对应SMOD值为0 0XFA对应SMOD值为1
}
void key()
{
if(s1 == 0)
{
delay(5); // 消抖
if(s1 == 0)
{
num = 'L';
while(!s1); // 松手检测
}
}
if(s2 == 0)
{
delay(5); // 消抖
if(s2 == 0)
{
num = 'Q';
while(!s2); // 松手检测
}
}
if(s3 == 0)
{
delay(5); // 消抖
if(s3 == 0)
{
num = 'R';
while(!s3); // 松手检测
}
}
if(s4 == 0)
{
delay(5); // 消抖
if(s4 == 0)
{
num = 'S';
while(!s4); // 松手检测
}
}
}
void main()
{
init();
while(1)
{
key(); // 键盘检测
ES=0; // 关闭串口中断
SBUF=num; // 将发送数据写入缓冲区
while(!TI); // 等待发送完成
TI=0; // 清除发送标志位
ES=1; // 开启串口中断
led = ~led; // led闪烁
delay(100); // 发送间隔
}
}
2、ubuntu20.04 中的串口调试助手
串口调试助手使用的是:cutecom
波特率9600 数据位8位 停止位1位
sudo cutecom
3、串口加权限
sudo chmod 666 /dev/ttyUSB0
4、python3语言编写ROS程序
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
import rospy
import serial
from geometry_msgs.msg import Twist
if __name__ == '__main__':
#2.初始化 ROS 节点:命名(唯一)
rospy.init_node("serial")
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=0.2)
# 打开前先关闭串口
ser.close()
# 打开串口
ser.open()
if ser.is_open:
print("......串口已经打开!")
else:
print("......串口打开失败!")
pub = rospy.Publisher("/turtle1/cmd_vel",Twist,queue_size=10)
twist = Twist()
rate = rospy.Rate(2)
while not rospy.is_shutdown():
rate.sleep()
try:
recv = ser.readline()
r = str(recv)
r_l = list(r[2])
print(r_l)
if r_l[0] == 'L':
twist.linear.x = 0
twist.angular.z = 0.5
if r_l[0] == 'Q':
twist.linear.x = 1
twist.angular.z = 0
if r_l[0] == 'R':
twist.linear.x = 0
twist.angular.z = -0.5
if r_l[0] == 'S':
twist.linear.x = 0
twist.angular.z = 0
print(twist.linear.x)
print(twist.angular.z)
pub.publish(twist)
except (OSError, TypeError) as reason:
print('错误的原因是:', str(reason))
# 关闭串口
ser.close()
print("......串口已经关闭。")
ser.close()
print("......串口已经关闭。")
5、launch文件编写
<launch>
<node pkg = "turtlesim" type = "turtlesim_node" name = "wugui"/>
<node pkg = "turele_51" type = "com_turtle.py" name = "kongzhi"/>
</launch>