Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
串口
舵机
瑞萨_RA6M4
基于RT-Thread+RA6M4的双足机器人
发布于 2022-07-23 18:30:09 浏览:774
订阅该版
[tocm] 使用RA6M4开发板的I2C用于控制PWM输出模块,串口与蓝牙模块hc-05通信,满足短距离机器人与手机间的通信。 本项目实现了使用手机通过蓝牙控制双足机器人前进、左转、右转等功能。 手机发送蓝牙信号命令至控制板,控制板通过HC05模块进行接收,并处理。通过I2C控制PWM模块,进而分别控制6个舵机。PCA9685模块是使用I2C总线可以控制16路舵机模块,在后续舵机控制中也会更方便。舵机采用的是MG995,金属齿轮,满足。 ## 新增串口1 首先打开RA工具,在PIn Selection选择区中选择connectivity:SCI ![1.png](https://oss-club.rt-thread.org/uploads/20220723/5708c4d179c412662cc020252ca7af88.png "1.png") 选中SCI1,设置模式为Asynchronous UART模式 点击Stacks栏,点击New Stack,如下图选择串口。 ![2.png](https://oss-club.rt-thread.org/uploads/20220723/b9f9a4ab54d5eee5d03af22104e9fdd2.png.webp "2.png") 点击串口,编辑串口名 通道设定波特率等信息,见下图,由于hc-05的默认波特率是9600,这时我们就设置9600. ![3.png](https://oss-club.rt-thread.org/uploads/20220723/95c7c1d36c3677a8f690627f4e811c5a.png.webp "3.png") 点击Generate Project Content。关闭RA软件 点击RT-Thread Setting,打开串口1 ![4.png](https://oss-club.rt-thread.org/uploads/20220723/819e790e6c2b65280b01dda781a870ed.png "4.png") 在hal_entry.c文件中新增串口接收函数,并在hal_entry函数中调用HC05_UART_Entry();即可 ```c #define HC05_UART_NAME "uart1" /* 串口接收消息结构*/ struct rx_msg { rt_device_t dev; rt_size_t size; }; /* 串口设备句柄 */ static rt_device_t serial; /* 消息队列控制块 */ static struct rt_messagequeue rx_mq; rt_uint8_t hc_cmd; void HC05_UART_Entry(void); /* 接收数据回调函数 */ static rt_err_t uart_input(rt_device_t dev, rt_size_t size) { struct rx_msg msg; rt_err_t result; msg.dev = dev; msg.size = size; result = rt_mq_send(&rx_mq, &msg, sizeof(msg)); if ( result == -RT_EFULL) { /* 消息队列满 */ rt_kprintf("message queue full!\n"); } return result; } static void serial_thread_entry(void *parameter) { struct rx_msg msg; rt_err_t result; rt_uint32_t rx_length; static char rx_buffer[200 + 1]; while (1) { rt_memset(&msg, 0, sizeof(msg)); /* 从消息队列中读取消息*/ result = rt_mq_recv(&rx_mq, &msg, sizeof(msg), RT_WAITING_FOREVER); if (result == RT_EOK) { /* 从串口读取数据*/ rx_length = rt_device_read(msg.dev, 0, rx_buffer, msg.size); rx_buffer[rx_length] = '\0'; hc_cmd=rx_buffer[0] ; } } } void HC05_UART_Entry(void) { static char msg_pool[256]; char str[] = "hello RT-Thread!666\r\n"; /* 查找串口设备 */ serial = rt_device_find(HC05_UART_NAME); if (!serial) { rt_kprintf("find %s failed!\n", HC05_UART_NAME); } /* 初始化消息队列 */ rt_mq_init(&rx_mq, "rx_mq", msg_pool, /* 存放消息的缓冲区 */ sizeof(struct rx_msg), /* 一条消息的最大长度 */ sizeof(msg_pool), /* 存放消息的缓冲区大小 */ RT_IPC_FLAG_FIFO); /* 如果有多个线程等待,按照先来先得到的方法分配消息 */ /* 以 DMA 接收及轮询发送方式打开串口设备 */ rt_device_open(serial, RT_DEVICE_FLAG_DMA_RX); /* 设置接收回调函数 */ rt_device_set_rx_indicate(serial, uart_input); /* 发送字符串 */ rt_device_write(serial, 0, str, (sizeof(str) - 1)); /* 创建 serial 线程 */ rt_thread_t thread = rt_thread_create("serial", serial_thread_entry, RT_NULL, 1024, 25, 10); /* 创建成功则启动线程 */ if (thread != RT_NULL) { rt_thread_startup(thread); } else { rt_kprintf("Create %s Entry failed!\n", HC05_UART_NAME); } } ``` ## 添加PWM模块 在软件包中搜寻PCA9685组件并添加。打开I2C. 设置引脚,注意这是16进制。 ![5.PNG](https://oss-club.rt-thread.org/uploads/20220723/15cdfa7fdb7f6124201dbc91d3241cad.png "5.PNG") 舵机控制 ```c static void Servo_entry(void *parameter) { run_state=0; left_up_num=left_up_int_num; left_mid_num=left_mid_int_num; left_down_num=left_down_int_num; right_up_num=right_up_int_num; right_mid_num=right_mid_int_num; right_down_num=right_down_int_num; set_robot_left(left_up_num,left_mid_num,left_down_num); set_robot_right(right_up_num,right_mid_num,right_down_num); rt_kprintf("Servo_entry \n"); while (1) { if(hc_cmd!=0) { run_state=hc_cmd; hc_cmd=0; rt_kprintf("run_state=%d\n",run_state); switch (run_state) { case 0x00:{ rt_thread_mdelay(1); break;} case 0x31:{ go_left_step(50,2,100); go_right_step(50,2,100); break;} case 0x32:{ go_left(50,2,100); break;} case 0x33:{ go_right(50,2,100); break;} default: rt_thread_mdelay(1); break; } } rt_thread_mdelay(20); } } ``` 和PWM初始化等其他的程序详见我的附件。 ## 遇到的一点麻烦 在实际测试的时候发现PCA9685模块I2C通信正常,但是就是不能输出PWM,然后就进行一行一行的排查在pca9685.c的代码中pca9685_set_pwm_freq函数中 ```c if (PWM_All_Call) { oldmode |= 0xA1; } else { oldmode |= 0xA0; } LOG_D("auto run..\n"); write_reg(dev, PCA9685_MODE1, 1, &oldmode); ``` oldmode按道理来说 oldmode的最高位进行置1进行了复位; 最后在write_reg前新增了一句oldmode |= 0x80;模块正常运行 测试视频
[robot.zip](https://club.rt-thread.org/file_download/445b2dc776949c69)
2
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
403463275
啥都不懂
文章
2
回答
29
被采纳
2
关注TA
发私信
相关文章
1
串口DMA发送数据时,数据被覆盖
2
关于串口DMA模式下rt_device_close问题
3
利用stm32f427实现usb转串口,电脑端什么也没有识别到
4
finsh 控制台 适配 RS 485请大神指点????
5
uart_sample.c 中,读串口设备时偏移量pos要设置为-1而不是0?
6
【结贴】at_device软件包中对串口接收数据缺少判断导致数据接收异常
7
串口无法接受数据,但可以发送
8
串口如何有效的清除掉接收缓冲,而不必一个一个的去读取
9
串口接收使用方式问题
10
雅特力FINSH问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
10
个答案
1
次被采纳
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
YZRD
2
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部