esp32+nrf24l01+ps2 micropython 2自由度云台

该代码示例展示了如何使用ESP32通过NRF24L01无线模块实现PS2手柄信号的捕获和传输。发送端读取PS2手柄的Y轴和X轴模拟值,根据值判断移动方向,并通过NRF24L01发送给接收端。接收端通过NRF24L01接收数据,解析后控制舵机转动。代码涉及ADC转换、SPI通信以及中断处理。

发送端

import ustruct as struct
import utime
from machine import Pin, SoftSPI, ADC
from NRF24L01 import NRF24L01
import time

# 名称与引脚联系
# "miso": 17, "mosi": 16, "sck": 4, "csn": 2, "ce": 15

# 0xe1f0f0f0e1, 0xd2f0f0f0d2,两个地址
# 相当于两个电话号码,用于标记 nrf24l01,
# 两部手机通话只有知道对方的号码才可以互相拨打
# b 前缀表示该字符串是二进制数据,称为字节串
# 字节串的一个字符对应一个8位字节,可以表示从0-255之间的整数
# 如果要和常用字符串转化,可以这样:
# b"hello world".decode("utf-8")
pipes = (b"\xe1\xf0\xf0\xf0\xe1", b"\xd2\xf0\xf0\xf0\xd2")


def main():
    # PS2
    ps2_y = ADC(Pin(33))  # 设置33引脚为ADC数模转化引脚,用于转化ps2的y轴方向上的模拟值
    ps2_y.atten(ADC.ATTN_11DB)  # 配置测量量程为3.3V
    ps2_x = ADC(Pin(32))  # 设置32引脚为ADC数模转化引脚,用于转化ps2的x轴方向上的模拟值
    ps2_x.atten(ADC.ATTN_11DB)  # 配置测量量程为3.3V
    btn = Pin(25, Pin.IN, Pin.PULL_UP)  # 配置ps2的按钮,可以配置成中断引脚,调用回调函数

    # NRF24L01
    csn = Pin(2, mode=Pin.OUT, value=1)  # 设置csn,并拉高电平
    ce = Pin(15, mode=Pin.OUT, value=0)  # 设置ce,并拉低电平
    spi = SoftSPI(sck=Pin(4), mosi=Pin(16), miso=Pin(17))  # 实例化类 SoftSPI
    nrf = NRF24L01(spi, csn, ce, payload_size=4)  # 实例化类 NRF24L01,并设置传播数据大小为4字节
    nrf.open_tx_pipe(pipes[0])  # 开启nrf24l01的发送功能和要发送的地址(接收端的地址)
    nrf.open_rx_pipe(1, pipes[1])  # 开启nrf24l01的数据接收功能和要接收地址(发送端的地址)
    nrf.stop_listening()  # 停止监听功能,本实例中不用接收另一个设备的数据
    # 死循环
    while True:
        # 读取y轴模拟值
        val_y = ps2_y.read()
        # 读取x轴模拟值
        val_x = ps2_x.read()
        # 定义一个变量,为了检测是否有人控制ps2
        # 如果有人控制ps2,则经过下面的循环后这个变量的值一定会变
        # 反之就不变
        move_num = -1
        # 转动ps2的模拟值,判断ps2的移动方向和距离,试出来的
        # 分别判断y轴和x轴两个方向
        # 把move_num的值通过选择结构落在1,2,3,0这4个数字上
        # 分别代表摇杆的4个方向
        if val_y > 2000:
            move_num = 0
        elif val_y < 1600:
            move_num = 1
        if val_x > 2000:
            move_num = 3
        elif val_x < 1600:
            move_num = 2
        # 这里容易出错,为防止程序复位,采用try
        if move_num != -1:
            try:
                # 10 表示经过一个while循环就发送多少个数据,比如move_num=0,就发送10个0
                # 这里的数字可以调节ps2与操控设备的灵敏度(延迟),自己试一下,调成最好的结果
                for i in range(10):
                    # 发送数据,打包发送 move_num,这里的字符串i不同与for循环的i,表示要发送的数据为4字节
                    # 若为"ii"则表示8字节
                    nrf.send(struct.pack("i", move_num))
                    # 控制台打印发送成功的消息
                    print("发送成功")
            except OSError:
                pass


main()

 把上面的代码保存为main.py 放到esp32里

还有一个代码也一起放到esp32里,命名为NRF24L01.py

from micropytho
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值