开源硬件库pinpong简介
1.简介
pinpong库是一个基于Firmata协议开发的Python硬件控制库。借助于pinpong库,直接用Python代码就能给各种常见的开源硬件编程,即使该硬件并不支持Python。
pinpong库的原理是给开源硬件烧录一个特定的固件,使其可以通过串口与电脑通讯,执行各种命令。pinpong库的名称由“Pin”和“Pong”组成,“Pin”指引脚,“pinpong”为“乒乓球”的谐音,指信号的往复。目前pinpong库支持Arduino、掌控板、micro:bit等开源硬件,同时支持虚谷号、树莓派和拿铁熊猫等。
2.安装
可以使用使用pip命令安装pinpong库,如:
pip install pinpong
注:MMEdu中已经内置了pinpong库。
3.代码示例
示例程序以“Arduino”为例,复制粘贴代码到python编辑器中,并修改Board初始化版型参数为你使用的板子型号即可。
3.1 数字输出
实验效果:控制arduino UNO板载LED灯一秒闪烁一次。
接线:使用windows或linux电脑连接一块arduino主控板。
import time
from pinpong.board import Board,Pin
Board("uno").begin() #初始化,选择板型(uno、microbit、RPi、handpy)和端口号,不输入端口号则进行自动识别
#Board("uno","COM36").begin() #windows下指定端口初始化
#Board("uno","/dev/ttyACM0").begin() #linux下指定端口初始化
#Board("uno","/dev/cu.usbmodem14101").begin() #mac下指定端口初始化
led = Pin(Pin.D13, Pin.OUT) #引脚初始化为电平输出
while True:
#led.value(1) #输出高电平 方法1
led.write_digital(1) #输出高电平 方法2
print("1") #终端打印信息
time.sleep(1) #等待1秒 保持状态
#led.value(0) #输出低电平 方法1
led.write_digital(0) #输出低电平 方法2
print("0") #终端打印信息
time.sleep(1) #等待1秒 保持状态
3.2 数字输入
实验效果:使用按钮控制arduino UNO板载亮灭。
接线:使用windows或linux电脑连接一块arduino主控板,主控板D8接一个按钮模块。
import time
from pinpong.board import Board,Pin
Board("uno").begin()
btn = Pin(Pin.D8, Pin.IN) #引脚初始化为电平输入
led = Pin(Pin.D13, Pin.OUT)
while True:
#v = btn.value() #读取引脚电平方法1
v = btn.read_digital() #读取引脚电平方法2
print(v) #终端打印读取的电平状态
#led.value(v) #将按钮状态设置给led灯引脚 输出电平方法1
led.write_digital(v) #将按钮状态设置给led灯引脚 输出电平方法2
time.sleep(0.1)
3.3 模拟输入
实验效果:打印UNO板A0口模拟值。
接线:使用windows或linux电脑连接一块arduino主控板,主控板A0接一个旋钮模块。
import time
from pinpong.board import Board,Pin
Board("uno").begin()
#adc0 = ADC(Pin(Pin.A0)) #将Pin传入ADC中实现模拟输入 模拟输入方法1
adc0 = Pin(Pin.A0, Pin.ANALOG) #引脚初始化为电平输出 模拟输入方法2
while True:
#v = adc0.read() #读取A0口模拟信号数值 模拟输入方法1
v = adc0.read_analog() #读取A0口模拟信号数值 模拟输入方法2
print("A0=", v)
time.sleep(0.5)
3.4 模拟输出
实验效果: PWM输出实验,控制LED灯亮度变化。
接线:使用windows或linux电脑连接一块arduino主板,LED灯接到D6引脚上。
import time
from pinpong.board import Board,Pin
Board("uno").begin()
#pwm0 = PWM(Pin(board,Pin.D6)) #将引脚传入PWM初始化 模拟输出方法1
pwm0 = Pin(Pin.D6, Pin.PWM) #初始化引脚为PWM模式 模拟输出方法2
while True:
for i in range(255):
print(i)
#pwm0.duty(i) #PWM输出 方法1
pwm0.write_analog(i) #PWM输出 方法2
time.sleep(0.05)
3.5 引脚中断
实验效果:引脚模拟中断功能测试。
接线:使用windows或linux电脑连接一块arduino主控板,主控板D8接一个按钮模块。
import time
from pinpong.board import Board,Pin
Board("uno").begin()
btn = Pin(Pin.D8, Pin.IN)
def btn_rising_handler(pin):#中断事件回调函数
print("\n--rising---")
print("pin = ", pin)
def btn_falling_handler(pin):#中断事件回调函数
print("\n--falling---")
print("pin = ", pin)
def btn_both_handler(pin):#中断事件回调函数
print("\n--both---")
print("pin = ", pin)
btn.irq(trigger=Pin.IRQ_FALLING, handler=btn_falling_handler) #设置中断模式为下降沿触发
#btn.irq(trigger=Pin.IRQ_RISING, handler=btn_rising_handler) #设置中断模式为上升沿触发,及回调函数
#btn.irq(trigger=Pin.IRQ_RISING+Pin.IRQ_FALLING, handler=btn_both_handler) #设置中断模式为电平变化时触发
while True:
time.sleep(1) #保持程序持续运行
更多代码请访问官方文档。
4. 借助pinpong开发智能作品
开源硬件是创客的神器,而pinpong进一步降低了开源硬件的编程门槛。pinpong库的设计,是为了让开发者在开发过程中不用被繁杂的硬件型号束缚,而将重点转移到软件的实现。哪怕程序编写初期用Arduino开发,部署时改成了掌控板,只要修改一下硬件的参数就能正常运行,实现了“一次编写处处运行”。
当学生训练出一个AI模型,就可以通过各种硬件设备进行多模态交互。当学生训练出一个简单猫狗分类模型后,加上一个舵机,就能实现智能宠物“门禁”;加上一个马达,就能做出一个智能宠物驱逐器;加上一条快门线,就能做宠物自动拍照设备。有多少创意,就能实现多少与众不同的作品。