嘉立创产业服务站群
发作品签到
专业版

基于esp32和xbox手柄的气垫船

工程标签

2.3k
0
0
8

简介

采用ESP32作为主控,xbox one s手柄作为遥控器发出控制信号驱动气垫船移动。 源码已放在附件处。小白仅供参考!

简介:采用ESP32作为主控,xbox one s手柄作为遥控器发出控制信号驱动气垫船移动。 源码已放在附件处。小白仅供参考!
基于ESP32物联网征集令

开源协议

GPL 3.0

创建时间:2024-08-08 05:14:01更新时间:2024-09-16 07:08:32

描述

 

1.入门

2024年8月27日

23:26

 

先用platform建立下图工程

测试代码

 

void setup() {

  // put your setup code here, to run once:

  //初始化串口

  Serial.begin(115200);

}

 

void loop() {

  // put your main code here, to run repeatedly:

  Serial.println("My First PIO Project!");

  delay(1000);

}

编译下载

 

存在的问题

Platform 默认波特率是9600,需要在配置文件加

monitor_speed = 115200即可正常显示

2.引脚电平读写

2024年8月27日

23:53

直接读取引脚电平

#include

void setup() {

  // put your setup code here, to run once:

  //初始化串口

  Serial.begin(115200);

  pinMode(2,OUTPUT);//初始化io  

  pinMode(4,INPUT);//初始化io

}

void loop() {

  // put your main code here, to run repeatedly:

  // Serial.println("My First PIO Project!");

  // delay(1000);

  digitalWrite(2,digitalRead(4));//设置2引脚的电平为读取到4脚输入电平

}

 

不同于STM32的简单复用,ESP32的多路复用器,使设计人员可以灵活地更改芯片内部的 GPIO 引脚连接并将其路由到任何信号,这样硬件设计上,布线也方便的多。

 

 

 

 

#include

void bt_callBack(void);

void setup() {

  // put your setup code here, to run once:

  //初始化串口

  Serial.begin(115200);

  pinMode(2,OUTPUT);//初始化io  

  pinMode(4,INPUT);//初始化io

  attachInterrupt(4,bt_callBack,CHANGE);

}

void loop() {

  // put your main code here, to run repeatedly:

  // Serial.println("My First PIO Project!");

  // delay(1000);

  // digitalWrite(2,digitalRead(4));//设置2引脚的电平为读取到4脚输入电平

}

void bt_callBack(void)//中断回调函数

{

  digitalWrite(2,digitalRead(4));

}

通过中断控制

3.串口通信

2024年8月28日

0:34

ESP32 芯片有3 个 UART 接口,UART0,UART1,UART2,支持异步通信和 IrDA,通信速度最高可达 5Mbps,3 个接口可以被 DMA 或 CPU 直接访问,3 个串口带发送接收 FIFO,共享 1024*8bit 的 RAM,通过串口,我们可以非常方便的跟其它外设进行通信或者打印数据。

 

 

 

 

UART1的默认引脚为GPIO9,、GPIO10,这两个接口一般用于连接外部Flash,程序中默认使用这两个引脚的,所以我们在用的时候一定记得改到别的IO口

 

 

 

  Serial1.begin(115200,SERIAL_8N1,26,27);

Serial1可以转到定义查看为串口2,就把RX改到了26,TX改到了27,第一个参数为波特率设置,如果输入0就会自动监测波特率,第二个为串口配置参数,SERIAL_8N1为8位数据位,无校验位,1位停止位的意思

串口常用函数,在HardwareSerial中可以看到

 

void begin(unsigned long baud, uint32_t config=SERIAL_8N1, int8_t rxPin=-1, int8_t txPin=-1, bool invert=false, unsigned long timeout_ms = 20000UL); //串口初始化

void end();//失能串口

void updateBaudRate(unsigned long baud);//重新设置波特率

int available(void);//返回串口接收缓冲区中的数据

int read(void);//返回串口接收缓冲区的一个字节的数据,之后将缓冲区中的本字节删除

void flush(void);//等待串口收发数据完毕

size_t write(uint8_t);//写数据到TX缓冲区

size_t setRxBufferSize(size_t);//设置接收缓冲区的大小

 

各种格式化打印

Serial.println(data) //从串行端口输出数据,跟随一个回车(ASCII 13, 或 'r')和一个换行符(ASCII 10, 或 'n')。这个函数所取得的值与 Serial.print()一样。

Serial.println(b) //以十进制形式输出b的ASCII编码值,并同时跟随一个回车和换行符。

Serial.println(b, DEC)// 以十进制形式输出b的ASCII编码值,并同时跟随一个回车和换行符。

Serial.println(b, HEX) //以十六进数据形式输出b的ASCII编码值,并同时跟随一个回车和换行符。

Serial.println(b, OCT)//以八进数据形式输出b的ASCII编码值,并同时跟随一个回车和换行符。

Serial.println(b, BIN)//以二进数据形式输出b的ASCII编码值,并同时跟随一个回车和换行符。

Serial.print(b, BYTE)//以单个字节输出b,并同时跟随一个回车和换行符。

Serial.println(str)//如果 str是一个字符串或数组,输出整个 str的 ASCII编码字符串。

Serial.println()//仅输出一个回车和换行符

 

使用ch340分别rx连接27脚,tx连接26脚

 

#include

int recData = 0;

void bt_callBack(void);

void setup() {

  // put your setup code here, to run once:

  //初始化串口

  Serial.begin(115200);

  Serial1.begin(115200,SERIAL_8N1,26,27);

  pinMode(2,OUTPUT);//初始化io  

  pinMode(4,INPUT);//初始化io

  // attachInterrupt(4,bt_callBack,CHANGE);//初始化中断

}

void loop() {

  // put your main code here, to run repeatedly:

  // Serial.println("My First PIO Project!");

  // delay(1000);

  // digitalWrite(2,digitalRead(4));//设置2引脚的电平为读取到4脚输入电平

 

  if(Serial1.available()>0){

    recData = Serial1.read();

    Serial1.print("received: ");

    Serial1.println(recData,HEX);

  }

}

void bt_callBack(void)//中断回调函数

{

  digitalWrite(2,digitalRead(4));

}

再通过串口助手进行收发验证

5.PWM

2024年8月28日

22:12

 

ESP32 不同于普通的PWM,它这里叫LED PWM,主要用于控制LED的亮度与颜色,当然,也可以用于其它用途,一共有16路通道,8路高速8低速,这16路通道可以分配给任意一个IO(某些只有输入功能的除外)。

16个通道,根据速度分,分为两组,每组有4个定时器对应8个通道,两个通道共享一个定时器,所以,最多能输出8个不同频率的PWM。

 

 

 

分配通道到GPIO引脚

确定好要使用的PWM通道PWM_Ch,绑定到GPIO_Pin。

ledcAttachPin(GPIO_Pin, PWM_Ch);

频率,分辨率设置

配置选择通道的PWM频率,分辨率可以设置1位到16位,比如我们设置成8位,占空比范围就是0-255,设置成10位,就是0-1023这样,函数也很简单。

/*

* PWM_Ch   PWM通道 0-15

* PWM_Freq PWM频率 

* PWM_Res  PWM分辨率 1-16

* */

ledcSetup(PWM_Ch, PWM_Freq, PWM_Res);;

设置占空比

直接写入对应占空比即可在对应IO上输出PWM。

ledcWrite(PWM_Ch, DutyCycle);

 

ESP-NOW

2024年8月29日

0:24

 

ESP-NOW 是由 Espressif 开发的一种协议,它使多个设备能够在不使用 Wi-Fi 的情况下相互通信。该协议类似于无线鼠标中用的2.4GHz无线连接。因此,设备之间的配对需要在它们通信之前进行。配对完成后,连接是安全且点对点的,无需握手,也就是他不像TCP/IP等是长连接的,换句话说,它是无连接的,如果其中一个板子突然断电,重新启动后,会自动匹配它的连接设备继续通信。不同于传统的OSI模型,ESP-NOW去掉了其中一些层,只保留最基本的传输层,减少了网络拥堵造成的丢包延迟,实现快速响应。简单来说,ESP-NOW 是一种快速通信协议,可用于在 ESP32 板之间交换短消息(单次最多 250 字节)。

ESP-NOW的优势

  • 快速响应:开机后,设备无需任何无线连接即可直接传输数据和控制其他配对设备,响应速度以毫秒为单位;
  • 远距离通信:ESP-NOW 支持远距离通信,板载天线户外空旷距离能达到200米+;
  • 多跳控制:ESP-NOW可以实现设备的多跳控制,可通过单播、广播和群控方式控制数百台设备;
  • 新配网方式:提供了除 Wi-Fi 和蓝牙之外的新方式,通过蓝牙为第一台设备配置网络,其他设备不需要配置SSID/密码等信息,第一台连接到网络的设备可以直接将这些信息发送给其他设备;
  • 升级:可用于固件升级或者大量数据升级的场景;
  • 调试:在一些高温高压等不太方便的场合,可以接收多个设备的数据,快速诊断设备故障。
  • 低成本:可与WiFi,蓝牙等共存;
  • 安全:ESP-NOW 采用 CCMP 方法保护供应商特定动作帧的安全,具体可参考 IEEE Std. 802.11-2012。

ESP-NOW通信

单向通信

一个从机向一个主机发送数据

这种情况适用于一个设备向另一个设备单向发送数据,比如一个从机采集传感器数据或将开关量发送到主机。

图片

一个主机向多个从机发送数据

图片

一个从机从多个主机接收数据

图片

双向通信

主机与从机互相通信

图片

多个设备之间互相通信

图片

ESP-NOW非常适合组建一个小型网络,可以让多个ESP32之间交换数据

 

获取板子的MAC地址

ESP-NOW是通过MAC地址做为不同设备的唯一识别的,就像不同设备的ID码一样,当然我们可以通过扫描配对的方式去自动配对,这里为了方便展示程序原理,我们就先采用最基本的方式,先通过下面的代码获取主机设备的MAC地址。

 

#include "WiFi.h"

 

void setup(){

  Serial.begin(115200);

  WiFi.mode(WIFI_MODE_STA);

  Serial.println(WiFi.macAddress());

}

 

void loop(){

}

 

如果没有wifi这个头文件,则需要手动在platform中安装

 

获取到主机的MAC地址后,并记录。

初始化ESP-NOW

初始化ESP-NOW,在这个函数调用之前必须初始化WiFi。

esp_now_init();

添加配对设备

调用此函数配对设备,将MAC地址,通道,加密信息等进行配置。

esp_now_add_peer();

发送数据

向配对设备发送数据

esp_now_send();

发送数据回调函数

注册一个发送数据时调用的函数,此函数会返回是否发送成功的消息。

esp_now_register_send_cb();

接收数据回调函数

注册一个接收到数据时调用的函数。

esp_now_register_rcv_cb();

 

#include

#define PWM1_Ch   0     //PWM通道 0-15

#define LED_GPIO  32    //pwm输出io口

#define PWM1_Res   10     //PWM分辨率 1-16

#define PWM1_Freq  50     //PWM频率

int PWM1_DutyCycle = 0;

void setup() {

  Serial.begin(115200);

  ledcAttachPin(LED_GPIO, PWM1_Ch);         //定义io口的pwm通道

  ledcSetup(PWM1_Ch, PWM1_Freq, PWM1_Res);  //定义pwm输出的相关参数

}

void loop() {                                 //实现es08舵机0-180度来回转动

  while(PWM1_DutyCycle < 127)                 //设定pwm变换条件,我这里基于es08II舵机,10分辨率满计数1024

  {                                           //舵机 0.5ms-2.5ms  就是在20ms所占比。 0.5ms占20ms的比例乘上1024即0度舵机占空比

    ledcWrite(PWM1_Ch, PWM1_DutyCycle++);

    delay(10);

  }

  while(PWM1_DutyCycle > 25)

  {

    ledcWrite(PWM1_Ch, PWM1_DutyCycle--);

    delay(10);

  }

}

设计图

未生成预览图,请在编辑器重新保存一次

BOM

暂无BOM

附件

序号文件名称下载次数
1
ESP32_connect_Xbox.zip
121
2
ESP32连接xbox手柄制作气垫船.mp4
139
3
气垫船.zip
116
克隆工程
添加到专辑
0
0
分享
侵权投诉

工程成员

评论

全部评论(1)
按时间排序|按热度排序
粉丝0|获赞0
相关工程
暂无相关工程

底部导航