使用pyboard 充当USB鼠标
pyboard是USB设备,可以配置为充当鼠标,而不是默认的USB闪存驱动器。
首先要编辑boot.py文件以更改USB配置。
# boot.py -- 在启动时允许
# 可以运行任何python,但最好少用。
import machine
import pyb
pyb.country('US') # ISO 3166-1 Alpha-2 code, eg US, GB, DE, AU
#pyb.main('main.py') # 这个以后要运行的脚本
#pyb.usb_mode('VCP+MSC') # 作为串行设备或储存设备
#pyb.usb_mode('VCP+HID') # 作为串行设备和鼠标,,所以我们要取消这个注释
这就告诉pyboard 在启动时将自身配置为VCP( 虚拟COM端口即串行端口)和HID (人机接口设备,就是鼠标)设备
然后重置下,就会识别板子为鼠标。额。。要修改的话就要进入安全模式了。。
就是反应的有点慢
手动发送鼠标事件
然后我们使用REPL。。。原来那个不行了,就挨个试试吧,最后时COM4好使。。。。为啥呢
>>> hid = pyb.USB_HID() # 鼠标右移100像素,按钮状态,x方向,y方向,滚动
>>> hid.send((0, 100, 0, 0)) # (button status, x-direction, y-direction, scroll)
>>> import math
>>> def osc(n, d): # 左右摇摆
... for i in range(n):
... hid.send((0, int(20 * math.sin(i / 10)), 0, 0))
... pyb.delay(d)
...
>>> osc(100, 50)
hid.send((0,0,0,100)) # 向上滚
>>> for i in range(-10,11): # 画个圈圈
... hid.send((0,i,int((100-i*i)**0.5),0))
... pyb.delay(50)
用加速度传感器做一个鼠标
目前板子是一个鼠标,不能访问文件系统来编辑文件,进入安全模式然后修改就行。
import pyb
switch = pyb.Switch()
accel = pyb.Accel()
hid = pyb.USB_HID()
while not switch(): # 使用USER按钮控制开启,话说这是switch.value()的简写吗
hid.send((0, accel.x(), accel.y(), 0))
pyb.delay(20) # 挺飘的。。想保持不动还是很难的。。
出了个问题,按下RST后就闪绿灯(重置没成功?),按下USR停止,打开REPL 在ctrl+d 重置一下才会生效。。这是为什么呢。。
恢复正常,在boot.py中把那行注释掉就行
计时器
pyboard有14个计时器,每个计时器都包含一个以用户定义的频率运行的独立计时器。可以将它们设置为特定间隔运行功能,这几个计时器编号1-14,3 保留给内部使用,5/6定时器用于伺服器和ADC/DAC控制。尽量避免这些的使用。
tim= pyd.Timer(4) # 创建一个计时器对象。
tim
Timer(4) # tim 就附加到了4号计时器上,但尚未初始化
>>> tim.init(freq=10) # 初始化为每秒十次触发
>>> tim
Timer(4, prescaler=624, period=13439, mode=UP, div=1)
# 这个表示此定时器设置为以624+1 分频的外设时钟运行,从0计数到13439,此时触发中断,然后从0开始重写计数。
# 这些数字的设置是为了让计时器以指定频率触发,
# 原频率是84MHz( 通过tim.source_freq()查看),所以就是84MHz / 625/13440 = 10Hz。挺复杂的哈。。。
相关操作
tim.counter() # 获取计时器的当前值,可以多试几次看看都是不同的数
>>> tim.callback(lambda t:pyb.LED(1).toggle()) # 为计时器增加一个回调函数,到时间就闪一次
>>> tim4 = pyb.Timer(4, freq=1)
>>> tim7 = pyb.Timer(7, freq=2)
>>> tim4.callback(lambda t: pyb.LED(1).toggle()) # 两个一起来
>>> tim7.callback(lambda t: pyb.LED(2).toggle())
# 制作微秒计数器,这在执行需要精确计时的操作时可能很有用。我们使用计时器2,这个是32位计数器。。
>>> micros = pyb.Timer(2, prescaler=83, period=0x3fffffff) # 周期设置的大一些,可以再返回零之前计数。
# 预分频器设置为83,该定时器的计数为1 MHz。168 MHz / 2 /(83 + 1)= 1MHz
micros.counter(0) # 先重置为0
>>> start_micros = micros.counter()
... do some stuff ...
>>> end_micros = micros.counter()
电源控制
pyb.wfi() 用于在等待中断等事件时降低功耗。您可以在以下情况下使用它:
while True:
do_some_processing()
pyb.wfi()
控制频率使用:pyb.freq:
pyb.freq(30000000) # 设置CPU频率为30MHz
控制伺服驱动器
不就是舵机嘛。。。就是180/360 转来转去的那个。。固定翼、机器人、机械臂、航模等
在线模拟pyboard,,用上了再买吧。。
pyboard上有4个专用连接点,用于连接业余伺服电机,引脚X1,X2,X3和X4是4个专用伺服信号引脚。这些电动机具有3根导线:地线,电源线和信号线。
伺服器上的接地线通常是颜色最深的,黑色或深棕色。电源线很可能是红色的。伺服器的电源引脚(标为VIN)直接连接到pyboard的输入电源。通过USB供电时,VIN通过5V USB电源线通过二极管供电。连接到USB后,该pyboard可以为至少4个中小型伺服电机供电。如果使用电池为仪表板供电并运行伺服电动机,请确保其不大于6V,因为这是大多数伺服电动机可以承受的最大电压。(某些电动机仅可承受4.8V的电压,因此请检查您使用的是哪种类型。)
>>> servo1 = pyb.Servo(1) # 创建一个舵机对象,id是1-4,并且对应于引脚X1至X4。
>>>> servo1.angle(45) # 右转45度,此处的角度以度为单位,视电机而定。
>>>> servo1.angle() # 由于设置脉冲宽度时的舍入误差,对于某些角度,返回的角度与您设置的角度不完全相同。
45
>>> servo1.angle(50, 1000) # 第二个参数就是到达所需角度所要的时间,毫秒单位
>>> servo1.angle(-45, 2000); servo2.angle(60, 2000) # 控制多个电机
连续旋转伺服器
现在我们用的时移动到特定角度并报错该角度的标准伺服器,可以用来创建机器人关键,,电机内部有一个可变电阻器(电位计),该电阻器可测量电流角度,并按与所需角度相差多远的比例向电机施加功率。所需角度由伺服信号线上的高脉冲宽度设置。1500微秒的脉冲宽度对应于中心位置(0度)。脉冲以50 Hz发送,即每秒发送50个脉冲。(人类真是厉害啊。。)
也可以连续旋转,方向和速度又信号线上的脉冲宽度设置,1500微妙的脉冲宽度对应于停止的电机,小于或大于此宽度的脉冲宽度以给定速度单向或双向旋转。
>>> servo1.speed(30) # 这个比angle更好理解
>>> servo1.speed(0, 2000) # 两秒停止,其实是对加速度的控制。
校准
伺服对象使用其校准值完成从角度或速度到脉冲宽度的转换。
>>> servo1.calibration()
(640, 2420, 1500, 2470, 2200)
>>> servo1.calibration(700, 2400, 1510, 2500, 2000) # 更改默认的
最小脉冲宽度 伺服器接受的最小脉冲宽度。
最大脉冲宽度 伺服器接受的最大脉冲宽度。
中心脉冲宽度;使伺服器处于0度或0速度的脉冲宽度。
脉冲宽度对应于90度。这将angle角度转换设置为脉冲宽度。
脉冲宽度对应于速度100。这将speed速度方法中的转换设置为脉冲宽度。