电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
[树莓派Pico] Pico中断读取EC11编码器控制SG90舵机旋转(MicroPython)
分 享
扫描二维码分享
[树莓派Pico] Pico中断读取EC11编码器控制SG90舵机旋转(MicroPython)
树莓派Pico
EC11编码器
SG90舵机
wybliw
关注
发布时间: 2021-07-28
丨
阅读: 5714
[TOC] --- 开发环境: * 操作系统:windows * 开发板:树莓派Pico * 使用的IDE:Thonny V3.3.11 * 编程语言:MicroPython ## 树莓派Pico ### 简介 树莓派Pico核心板是基于树莓派研发的RP2040微处理器设计的,Pico板上有: * 一个RP2040微处理器; * 2MB的Flash闪存空间; * Micro USB1.1接口,用于供电和通信; * 总共40Pin的外置接口; * 26个多功能3.3V电平的GPIO口; * 23个数字GPIO口; * 3个ADC接口; * 3Pin的SWD调试接口; * 9个GND接口(包含SWD的),1个3.3V接口,2个5V接口。 * 核心板尺寸:21x51mm,pcb板厚1mm。 树莓派Pico裸板图: ![](https://cf04.ickimg.com/bbsimages/202107/43aeaf078b0dd3a0bccfe39d7e048938.png) 裸板不带排针,可以作为SMD元件,直接焊接到PCB板上。 在Micro USB的旁边,有一个LED灯,该LED和RP2040的GPIO25脚相连,用户可通过编程控制它,板上没有电源灯。板上唯一的微动按钮,是启动选择按钮,在Pico上电前,先按下该按钮不松开,然后接上USB电源,Pico就会进入可上传uf2程序模式,在电脑里会显示为一个U盘,可以拖拽uf2程序到Pico里,然后pico会自动重启,执行上传的uf2程序。 其中33号引脚地线是AGND,模拟的地线。 下图是Pico开发板详细接口图: ![](https://cf04.ickimg.com/bbsimages/202107/23f426496021ff33078576fc14333f4d.png) * VBUS:是直接取自MicroUSB的电源,5V,如果不接USB电源,那么VBUS将没有输出; * VSYS:是经过二极管之后的,供给稳压IC的电源,5V,经过稳压IC后会产生3.3V电源,供给RP2040芯片。 * 3V3:经过稳压IC后的电源,3.3V,可用于外部模块供电,推荐负载电流不超过300mA。 * 3V3_EN:连接在稳压IC的使能引脚,并通过100K电阻拉高(到VSYS)。引脚拉低,则会禁止3.3V电源的产生 (RP2040的供电也关闭)。 * RUN:是RP2040的复位引脚,内部通过50K电阻上拉到3.3V,将该引脚拉低可使RP2040复位重启。 ![](https://cf04.ickimg.com/bbsimages/202107/38d822f641de10fb7670acf78262b967.png) ### 其他引脚 * GPIO25:接在板上的LED灯,OP模式。 * GPIO24:VBUS电压探测,有VBUS电压,则为高,反之为低,IP模式。 * GPIO23:稳压IC的PS侧引脚,OP模式。 * GPIO29:用于内部ADC采集,测量VSYS/3电压。 * ADC_VREF ADC电源参考电压,从Pico的3.3V滤波产生。如果需要更好的ADC性能,这个可以和外部参考一起使用。 * AGND 是GPIO26-29的模拟地。如果不适用ADC或不在乎ADC性能,该引脚可以连接到数字地。 26个引脚中,有16个可配置的PWM引脚,2个I2C总线,2个UART和2个SPI总线,ADC的分辨率为12位。 ### TP测试引脚 * TP1 接在GND; * TP2 是USB DM; * TP3 是USB DP; * TP4 是GPIO23/SMPS PS Pin(不推荐用于其他); * TP5 是GPIO25/LED (不推荐用于其他); * TP6 是BOOTSEL; ### RP2040微控制器 树莓派Pico是围绕基金会的新芯片RP2040微控制器而设计的。下面是它的参数: * 40nm工艺,双核,32位ARM Cortex-M0+处理器; * 内存 264KB SRAM;运行在48MHz,最大可达到133MHz; * 30个GPIO引脚(4个能被用作ADC),IO电压1.8-3.3V; * ADC是12bit 500ksps; * 可支持USB主机或设备模式; * 2xPIO (可编程IO),共8个状态机; * 2xUART,2xI2C,2xSPI,16xPWM通道,1xTimer和4 alarms,1xReal Time Counter; RP2040能够支持高达16MB的片外闪存,不过在Pico中只有2MB。 ## Pico编程 pico目前支持C、C++和MicroPython编程。MicroPython是一种专门为微控制器制作的解释语言。下面的示例将以micropython为主。 ### 安装Thonny IDE Thonny IDE 官网:https://thonny.org/ 下载最新版本的IDE,目前最新版版本是V3.3.11,若是3.2.x版本,可能会遇到不能下载第三方库的情况。 下载IDE后,直接安装即可,安装过程很简单。 ### Pico安装Micropython解释器 Pico官网下载Micropython解释器:https://www.raspberrypi.org/documentation/rp2040/getting-started/#getting-started-with-micropython 如下图: ![](https://cf04.ickimg.com/bbsimages/202107/2b6f5a3a4eb4bee7c64ec1c8549a615f.png) 上传uf2文件:让Pico进入大容量磁盘模式,按住BOOTSEL键不松开,将Pico插入电脑的USB端口,等待几秒钟后松开BOOTSEL键,你会看到一个新的驱动器在你的电脑上可用。 打开新的 “驱动器”,你会看到几个文件,其中一个是网页文档 index.htm 。点击该网页文件,浏览器就会打开,你会被重定向到树莓派 Pico入门页面,按上图选择下载uf2文件,然后将uf2文件复制到Pico磁盘根目录下,pico会自动重启,进入micropython模式。 Pico磁盘中的内容: ![](https://cf04.ickimg.com/bbsimages/202107/2cbdd5264ac82c5f2a9edfbc709df864.png) ### Thonny IDE连接Pico 打开Thonny,看右下角的状态栏,默认显示的是一个Python的版本,这是当前计算机上的Python版本,点击该python版本,会出现一个下拉菜单,选择MicroPython (树莓派 Pico),底部信息栏会出现一个新的Shell,在这个Shell中,会出现一些文字,表示你已经连接到Pico。现在可以开始编程了。 ![](https://cf04.ickimg.com/bbsimages/202107/96af2400ca972c9f2be14f76602ed452.png) --- ## 示例-EC11编码器控制SG90舵机 EC11编码器和SG90接线: | EC11 | 树莓派Pico | SG90 | 树莓派Pico | | ---- | ---------- | ---- | ---------- | | CLK | GPIO2 | GND | GND | | DT | GPIO3 | VCC | 3.3V | | SW | GPIO0 | DATA | GPIO4 | | GND | GND | - | - | | VCC | 3.3V | - | - | ### SG90舵机 有关SG90的相关介绍请看往期文章:[[树莓派系列] 使用WiringPi库入门模拟舵机-SG90(C和Python)](https://www.icxbk.com/article/detail?aid=1811) 。 ### EC11编码器 EC11是一种常见的编码器,旋转一圈能产生20个脉冲信号,编码器可以无限旋转,相比电位器要灵活很多,它还带有一个微动开关。编码器模块共有5个引脚: * VCC 接电源; * GND 接地; * SW 按键引脚; * DT DT信号输出引脚; * CLK clk信号输出引脚; 注:DT和CLK是差不多的,在编程时,会以其中一个作为clk时钟引脚,作为中断的输入源,另一个DT作为数据引脚,每产生一个中断,读取DT电平状态。 EC11编码器实物图: ![](https://cf04.ickimg.com/bbsimages/202107/ab1d87c29cd8f9682535909a5fbf5a56.png) **正转:** * 当CLK产生上升沿中断,读取DT电平,若为低电平,判断为正转(方向自己定义)。 * 当CLK产生下降沿中断,读取DT电平,若为高电平,判断为正转(方向自己定义)。 下图是EC11正转时产生的脉冲图: ![](https://cf04.ickimg.com/bbsimages/202107/a02f67fd2800ad648c4543d86df14ddc.png) **反转:** * 当CLK产生上升沿中断,读取DT电平,若为高电平,判断为反转(方向自己定义)。 * 当CLK产生下降沿中断,读取DT电平,若为低电平,判断为反转(方向自己定义)。 下图是EC11反转是脉冲图: ![](https://cf04.ickimg.com/bbsimages/202107/c6179074d04edd19d6a930942cd50d95.png) 在正转和反转中,笔者判断的双边沿中断,读者也可根据自己需求,只判断上升沿或者下降沿。 ### 代码示例 点击Thonny的新建按钮,新建一个**ec11.py**文件,输入如下代码: ```python from machine import Pin, PWM import time # 定义EC11引脚,使用GPIO2和GPIO3,GPIO0 EC_clk = Pin(2, Pin.IN, Pin.PULL_UP) EC_data = Pin(3, Pin.IN, Pin.PULL_UP) EC_key = Pin(0, Pin.IN, Pin.PULL_UP) # 定义SG90舵机引脚,GPIO4 sov_pwm = PWM(Pin(4)) sov_pwm.freq(50) # 产生50Hz的PWM波,周期20ms # 高电平持续时间 占空比duty 舵机角度 # 0.5ms (0.5/20)*65535=1638 -90° # 1.0ms (1.0/20)*65535=3276 -45° # 1.5ms (1.5/20)*65535=4915 0° # 2.0ms (2.0/20)*65535=6553 45° # 2.5ms (2.5/20)*65535=8191 90° # 65535:占空比duty_u16,是16位数据 SOV_DIR_N90 = 1638 # 负90度 SOV_DIR_N45 = 3276 # 负45度 SOV_DIR_0 = 4915 # 0度 SOV_DIR_P45 = 6553 # 45度 SOV_DIR_P90 = 8191 # 90度 # 舵机占空比 sov_duty = SOV_DIR_N90 # EC编码器处理函数 def EC_handle(pinx): global sov_duty i=0 state_bak = EC_data.value() # 读取data引脚电平 for i in range(5): # 读5次,消抖 state = EC_data.value() if state != state_bak: state_bak = state break print("IRQ 1 active=> EC_data: %d, duty: %d" %(state_bak, sov_duty)) if (i == 4): # 是编码器旋转中断 if pinx.value() == 0: # 下降沿 if state_bak == 1: # CW 正转 sov_duty += 100 # 占空比递增100 if sov_duty > SOV_DIR_P90: # 限制极限值 sov_duty = SOV_DIR_P90 else: # CCW 反转 sov_duty -= 100 if sov_duty < SOV_DIR_N90: sov_duty = SOV_DIR_N90 elif pinx.value() == 1: # 上升沿 if state_bak == 0: # CW sov_duty += 100 if sov_duty > SOV_DIR_P90: sov_duty = SOV_DIR_P90 else: # CCW sov_duty -= 100 if sov_duty < SOV_DIR_N90: sov_duty = SOV_DIR_N90 sov_pwm.duty_u16(sov_duty) # 产生对应PWM波 # 中断回调 EC_clk.irq(EC_handle, Pin.IRQ_FALLING | Pin.IRQ_RISING) print("start... ") led = Pin(25, Pin.OUT) # led指示灯 # 处理按键 while True: if EC_key.value() == 0: time.sleep_ms(10) # 消抖 if EC_key.value() == 0: led.toggle() while EC_key.value() == 0: time.sleep_ms(1) time.sleep_ms(10) ``` 效果图: ![](https://cf04.ickimg.com/bbsimages/202107/562c5f5ccebeacbb09c4c9d22b712d6e.gif) **注:**图中的Pico拓展板是笔者自己设计的,和树莓派4B的40pin接口统一,方便pico使用树莓派的各种模块。 Shell调试窗: 每产生一个中断,就打印一次,EC_data的 0, 1 是读取了双边沿中断。 ![](https://cf04.ickimg.com/bbsimages/202107/78c04128606ac8b15e8078ea158aa97d.png) --- == end ==
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
wybliw
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交