news 2026/5/6 18:48:27

使用trea完成洋桃电子1号开发板无线遥控小车

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用trea完成洋桃电子1号开发板无线遥控小车

1、项目介绍:

之前购买了洋桃电子的开发板学习,刚好手里也有ESP8266模块,打算使用开发板上的模拟摇杆控制小车方向,和旋转编码器设置车速,OLED屏显示车速和方向信息,数码管显示设置车速值,触摸按键A/B控制加减速,C/D控制小车的车灯亮灭,后面发现旋转编码器和模拟摇杆的引脚冲突了,去掉了旋转编码器的设置车速功能。刚好手里还有一个ESP32-CAM模块,也放在了小车上,可以获取视频。

2、全程让trea进行开发:

3、控制效果如视频:

模拟摇杆遥控小车

4、和trea的交流:

5、main.c主程序代码:

//程序由AI生成 #include "stm32f10x.h" #include "sys.h" #include "delay.h" #include "oled0561.h" #include "adc.h" #include "JoyStick.h" #include "touch_key.h" #include "encoder.h" #include "TM1640.h" #include "usart.h" #include "i2c.h" #include "led.h" #include <string.h> #include <stdio.h> extern vu16 ADC_DMA_IN[2]; char speed_buf[32]; char light_buf[32]; u8 speed = 50; u8 set_speed = 50; u8 light = 0; u8 direction = 0; u8 last_direction = 0; u8 last_speed = 50; u8 last_light = 0; #define DIR_STOP 0 #define DIR_FORWARD 1 #define DIR_BACKWARD 2 #define DIR_LEFT 3 #define DIR_RIGHT 4 #define CMD_STOP 0x00 #define CMD_FORWARD 0x01 #define CMD_BACKWARD 0x02 #define CMD_RIGHT 0x04 #define CMD_LEFT 0x08 #define CMD_FORWARD_RIGHT 0x05 #define CMD_FORWARD_LEFT 0x09 #define CMD_BACKWARD_RIGHT 0x06 #define CMD_BACKWARD_LEFT 0x0A #define KEY_A 1 #define KEY_B 2 #define KEY_C 3 #define KEY_D 4 char *dir_str[] = {"STOP ", "FORWARD", "BACK ", "LEFT ", "RIGHT "}; u8 TOUCH_KEY_Scan(void) { if(GPIO_ReadInputDataBit(TOUCH_KEYPORT, TOUCH_KEY_A) == 0) { delay_ms(10); if(GPIO_ReadInputDataBit(TOUCH_KEYPORT, TOUCH_KEY_A) == 0) return KEY_A; } if(GPIO_ReadInputDataBit(TOUCH_KEYPORT, TOUCH_KEY_B) == 0) { delay_ms(10); if(GPIO_ReadInputDataBit(TOUCH_KEYPORT, TOUCH_KEY_B) == 0) return KEY_B; } if(GPIO_ReadInputDataBit(TOUCH_KEYPORT, TOUCH_KEY_C) == 0) { delay_ms(10); if(GPIO_ReadInputDataBit(TOUCH_KEYPORT, TOUCH_KEY_C) == 0) return KEY_C; } if(GPIO_ReadInputDataBit(TOUCH_KEYPORT, TOUCH_KEY_D) == 0) { delay_ms(10); if(GPIO_ReadInputDataBit(TOUCH_KEYPORT, TOUCH_KEY_D) == 0) return KEY_D; } return 0; } u8 GetCarCmd(void) { u8 cmd = 0; switch(direction) { case DIR_STOP: cmd = CMD_STOP; break; case DIR_FORWARD: cmd = CMD_FORWARD; break; case DIR_BACKWARD: cmd = CMD_BACKWARD; break; case DIR_LEFT: cmd = CMD_LEFT; break; case DIR_RIGHT: cmd = CMD_RIGHT; break; } if(light) cmd |= 0x10; else cmd |= 0x20; return cmd; } void SendCarCmd(void) { u8 cmd = GetCarCmd(); char packet[16]; sprintf(packet, "!C%02X%02X\r\n", cmd, speed); GPIO_WriteBit(LEDPORT, LED2, (BitAction)(1)); USART3_printf(packet); GPIO_WriteBit(LEDPORT, LED2, (BitAction)(0)); } int main (void){ u8 key; delay_ms(2000); RCC_Configuration(); ENCODER_Init(); TM1640_Init(); LED_Init(); TOUCH_KEY_Init(); JoyStick_Init(); ADC_Configuration(); I2C_Configuration(); OLED0561_Init(); OLED_DISPLAY_CLEAR(); USART3_Init(115200); // LED1涓嶅啀闂儊 OLED_DISPLAY_8x16_BUFFER(6, (u8*)"CONFIG ESP8266.."); USART3_printf("AT+CWMODE=1\r\n"); delay_ms(500); USART3_printf("AT+CWJAP=\"ESP32-C3-Car\",\"12345678\"\r\n"); delay_ms(2000); USART3_printf("AT+CIPSTART=\"UDP\",\"192.168.4.1\",8888\r\n"); delay_ms(500); USART3_printf("AT+CIPMODE=1\r\n"); delay_ms(500); USART3_printf("AT+CIPSEND\r\n"); delay_ms(500); OLED_DISPLAY_8x16_BUFFER(6, (u8*)"ESP8266 OK! "); delay_ms(1000); OLED_DISPLAY_8x16_BUFFER(6, (u8*)"READY TO GO! "); while(1) { key = TOUCH_KEY_Scan(); if(key == KEY_A) { if(speed < 255) speed += 10; if(set_speed < 255) set_speed += 10; } else if(key == KEY_B) { if(speed > 0) speed -= 10; if(set_speed > 0) set_speed -= 10; } else if(key == KEY_C) { light = 1; } else if(key == KEY_D) { light = 0; } if(ADC_DMA_IN[1] > 2600) direction = DIR_FORWARD; else if(ADC_DMA_IN[1] < 1600) direction = DIR_BACKWARD; else if(ADC_DMA_IN[0] < 1600) direction = DIR_LEFT; else if(ADC_DMA_IN[0] > 2600) direction = DIR_RIGHT; else direction = DIR_STOP; TM1640_display(0, speed / 100); TM1640_display(1, (speed / 10) % 10); TM1640_display(2, speed % 10); OLED_DISPLAY_8x16_BUFFER(0, (u8*)dir_str[direction]); sprintf(speed_buf, "SPEED:%3d ", speed); OLED_DISPLAY_8x16_BUFFER(2, (u8*)speed_buf); if(light) { OLED_DISPLAY_8x16_BUFFER(4, (u8*)"LIGHT ON "); } else { OLED_DISPLAY_8x16_BUFFER(4, (u8*)"LIGHT OFF "); } // 鍙湪鐘舵€佸彉鍖栨椂鎵嶅彂閫佹暟鎹? if(direction != last_direction || speed != last_speed || light != last_light) { SendCarCmd(); last_direction = direction; last_speed = speed; last_light = light; } delay_ms(50); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/6 18:47:29

裁剪SurfaceView

并不是真正的裁剪SurfaceView&#xff0c;而是用 FrameLayout 包裹 SurfaceView达到视觉裁剪。举例&#xff1a;给外层 FrameLayout 设置圆角轮廓 开启轮廓裁剪&#xff0c;让 FrameLayout 把超出圆角的部分 “挡住”&#xff0c;从而让矩形 SurfaceView 看起来是圆角的。acti…

作者头像 李华
网站建设 2026/5/6 18:42:43

ROS Noetic下,用Python和C++分别实现Topic通信,我踩过的坑你别再踩了

ROS Noetic实战&#xff1a;Python与C的Topic通信避坑指南 1. 环境配置与基础问题排查 在ROS Noetic环境下进行Topic通信开发时&#xff0c;环境配置往往是第一个拦路虎。不同于简单的Hello World示例&#xff0c;实际项目中会遇到各种环境变量问题。最常见的就是rosrun命令报…

作者头像 李华
网站建设 2026/5/6 18:31:45

AI智能体规则管理框架agentrules:从原理到实战的声明式控制方案

1. 项目概述与核心价值最近在探索AI智能体&#xff08;Agent&#xff09;的规则管理与编排时&#xff0c;发现了一个挺有意思的开源项目——agentrules。这个项目由ayushopchauhan维护&#xff0c;乍一看名字&#xff0c;你可能会觉得它只是一个简单的规则集合库。但实际深入使…

作者头像 李华
网站建设 2026/5/6 18:27:27

通过 OpenClaw 配置 Taotoken 作为自定义大模型供应商

通过 OpenClaw 配置 Taotoken 作为自定义大模型供应商 1. 准备工作 在开始配置之前&#xff0c;请确保您已经完成以下准备工作。首先&#xff0c;您需要拥有一个有效的 Taotoken 账户&#xff0c;并在控制台中创建了 API Key。其次&#xff0c;您需要在模型广场查看并记录下您…

作者头像 李华
网站建设 2026/5/6 18:26:57

Wonder3D跨域扩散架构解析:单图到3D生成的技术革命与实战应用

Wonder3D跨域扩散架构解析&#xff1a;单图到3D生成的技术革命与实战应用 【免费下载链接】Wonder3D Single Image to 3D using Cross-Domain Diffusion for 3D Generation 项目地址: https://gitcode.com/gh_mirrors/wo/Wonder3D 在传统的3D建模流程中&#xff0c;从单…

作者头像 李华