利用STC89C52控制ROS中的海龟

实现过程:
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>
上一篇:python检测光电感烟火灾探测报警器


下一篇:B. Pairs