1 - pinpong库说明
行空板上板载了一颗单片机协处理器负责板载元件及GPIO的控制,我们使用Python中的PinPong库来与协处理器通讯,从而实现用Python代码控制硬件。
更多pinpong库的介绍,请查看pinpong官方文档
2 - 安装库
注:行空板出厂固件中已经内置了pinpong库,因此本步骤可以跳过。
通过pip工具即可进行安装和更新
安装:
pip install pinpong
更新:
pip install -U pinpong
================
3 - pinpong库导入方法
- pinpong库由于支持众多的主控板及开源硬件,因此分成了3个包,board、extension和libs,board包中放置主板支持的功能及常用库,extension为定制类主控,libs中放置其他传感器的扩展库。
- pinpong库支持多块主控板的使用,因此可以指定板型及端口号并生成对象,因为行空板上固定为协处理器并且端口号固定,因此可以省略掉这些参数而直接初始化。
from pinpong.board import xxx #board包中的库
from pinpong.libs.xxx #libs包中的库
from pinpong.extension.xxx #extension包中的主板
Board().begin() #初始化,连接协处理器,检查固件为空或版本不对则自动烧录
----------------
4 - 板载资源使用说明
4.1-L灯
行空板背面有一颗蓝色LED灯(标记为L)可供用户控制。
L灯为高低电平控制,接到了行空板的P25接口上,因此控制P25即可控制L灯。
- 语法:
Pin(Pin.P25, Pin.OUT).write_digital(电平信号)
- 返回值:无
- 输入参数:
1
高电平,0
低电平 - 示例代码:
# -*- coding: UTF-8 -*-
import time
from pinpong.board import Board,Pin
Board().begin() #初始化
led = Pin(Pin.P25, Pin.OUT) #引脚初始化为电平输出模式,P25为L灯的引脚
while True:
#led.value(1) #输出高电平 方法1
led.write_digital(1) #输出高电平 方法2
print("1 LED亮") #终端打印信息
time.sleep(1) #等待1秒 保持状态
#led.value(0) #输出低电平 方法1
led.write_digital(0) #输出低电平 方法2
print("0 LED灭") #终端打印信息
time.sleep(1) #等待1秒 保持状态
- 图形化示例:
4.2-按钮AB
注意:行空板上有三个按键:Home、A、B,其中Home按键仅供Home菜单使用,A、B按键可供用户调用(注:由于A、B按键同时被映射为了键盘的AB按键,因此除了使用pinpong调用,还可以用unihiker库中的键盘事件调用,或者使用pygame、opencv等能获取键盘的库调用,并不需要使用pinpong)。
在pinpong库中,按钮有两种方式调用,一种是直接读取 查询式,第二种是中断事件回调式。
- 查询式 :
- 语法:
button_a.is_pressed()
button_b.is_pressed()
- **返回值:**按钮按下返回
True
,按钮没有按下返回False
- **输入参数:**无
- 示例代码:
- 语法:
# -*- coding: utf-8 -*-
from pinpong.board import *
from pinpong.extension.unihiker import *
Board().begin() #初始化
while True:
if button_a.is_pressed() == True: #判断按钮是否被按下
print("按钮A按下")
if button_b.is_pressed() == True: #判断按钮是否被按下
print("按钮B按下")
-
图形化示例:
-
回调式 :
- 语法:
button_a.irq(trigger=触发模式, handler = 回调函数)
button_b.irq(trigger=触发模式, handler = 回调函数)
- **返回值:**无
- 输入参数:
- trigger:触发模式,有上升沿(
Pin.IRQ_RISING
)、下降沿(Pin.IRQ_FALLING
)、电平跳变(Pin.IRQ_RISING+Pin.IRQ_FALLING
)三种
- trigger:触发模式,有上升沿(
- 示例程序:
- 语法:
# -*- coding: utf-8 -*-
from pinpong.board import *
from pinpong.extension.unihiker import *
import time
Board().begin() #初始化
def btn_a_rasing_handler(pin):#中断事件回调函数
print("按钮A按下")
def btn_b_falling_handler(pin):#中断事件回调函数
print("按钮B松开")
button_a.irq(trigger=Pin.IRQ_RISING, handler = btn_a_rasing_handler)#上升沿触发
button_b.irq(trigger=Pin.IRQ_FALLING, handler = btn_b_falling_handler)#下降沿触发
while True:
time.sleep(1)#等待让程序不退出
4.3-光线传感器
行空板正面屏幕上方有一颗光线传感器,可以获取环境光线强度(注:单位为模拟输入值,非勒克斯)。
- 语法:
light.read()
注:光线传感器接到行空板的P29接口上,因此还可以通过ADC输入方法读取。 - 返回值:光线强度值,0-4095。
- 输入参数:无
- 示例代码:
# -*- coding: UTF-8 -*-
import time
from pinpong.board import *
from pinpong.extension.unihiker import *
Board().begin() #初始化
while True:
light_value = light.read()
print("光线强度:%d"%(light_value)) #终端打印信息
time.sleep(0.1) #等待1秒 保持状态
- 图形化示例:
4.4-加速度传感器
行空板背面板载一颗6轴加速度陀螺仪传感器,可以分别读取加速度和陀螺仪的x、y、z的值,以及加速度强度。
- 语法:
- 加速度:
accelerometer.get_x()
accelerometer.get_y()
accelerometer.get_z()
accelerometer.get_strength()
- 陀螺仪:
gyroscope.get_x()
gyroscope.get_y()
gyroscope.get_z()
- 加速度:
- 返回值:加速度陀螺仪的值
- 输入值:无
- 示例程序:
# -*- coding: utf-8 -*-
import time
from pinpong.board import *
from pinpong.extension.unihiker import *
Board().begin() #初始化
while True:
print(accelerometer.get_x()) #读取加速度X的值
print(accelerometer.get_y()) #读取加速度Y的值
print(accelerometer.get_z()) #读取加速度Z的值
print(accelerometer.get_strength()) #读取加速度强度(x、y、z方向的合力)
print(gyroscope.get_x()) #读取陀螺仪X的值
print(gyroscope.get_y()) #读取陀螺仪Y的值
print(gyroscope.get_z()) #读取陀螺仪Z的值
print("------------------")
time.sleep(1)
- 图形化示例:
4.5-蜂鸣器
行空板背面板载一颗蜂鸣器,可以发出设定的音调。
- 示例程序:
# -*- coding: utf-8 -*-
import time
from pinpong.board import Board,Pin
from pinpong.extension.unihiker import *
Board().begin()#初始化
#音乐 DADADADUM ENTERTAINER PRELUDE ODE NYAN RINGTONE FUNK BLUES BIRTHDAY WEDDING FUNERAL PUNCHLINE
#音乐 BADDY CHASE BA_DING WAWAWAWAA JUMP_UP JUMP_DOWN POWER_UP POWER_DOWN
#播放模式 Once(播放一次) Forever(一直播放) OnceInBackground(后台播放一次) ForeverInBackground(后台一直播放)
buzzer.play(buzzer.DADADADUM, buzzer.Once) #播放音乐一次
# buzzer.set_tempo(4,60) #设置每一拍音符数,每分钟节拍数
buzzer.pitch(494, 4) #播放音符
# buzzer.pitch(494) #后台播放音符
# time.sleep(10)
# buzzer.stop() #停止后台播放
# buzzer.redirect(Pin.P0) #引脚重定向,只支持PWM引脚
# buzzer.play(buzzer.ENTERTAINER, buzzer.ForeverInBackground) #后台一直播放音乐
while True:
time.sleep(1) #等待1秒 保持状态
- 图形化示例:
4.6-环境声音强度
行空板上的麦克风并非普通的声音传感器,可以直接录音做语音识别,因此接到了CPU而非协处理上,所以获取环境声音强度不使用pinpong库,而使用unihiker库中Audio类获取。
点击查看:unihiker库
- 示例程序:
# -*- coding: utf-8 -*-
from unihiker import Audio
import time
audio = Audio() #实例化音频
while True:
value = audio.sound_level()
print("环境音=%d"%(value))
time.sleep(0.1)
----------------
5 - 基础GPIO使用说明
行空板引脚操作与pinpong通用语法相同。
5.1-数字输出
行空板所有引脚均支持数字输出,电平电压为3.3V。
# -*- coding: UTF-8 -*-
#实验效果:控制外接LED灯一秒闪烁一次
#接线:在行空板P21接一个LED灯
import time
from pinpong.board import Board,Pin
Board().begin() #初始化
led = Pin(Pin.P21, 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秒 保持状态
- 图形化示例:
5.2-数字输入
行空板所有引脚均支持数字输入,电平电压为3.3V。
# -*- coding: UTF-8 -*-
#实验效果:使用按钮控制行空板板载L灯亮灭
#接线:在行空板P23接口接一个按钮模块
import time
from pinpong.board import Board,Pin
Board().begin() #初始化
btn = Pin(Pin.P23, Pin.IN) #引脚初始化为电平输入
led = Pin(Pin.P25, Pin.OUT) #L灯引脚初始化为输出
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)
- 图形化示例:
5.3-模拟输入(ADC)
行空板支持8路12位高精度模拟输入ADC,分别对应引脚为: P0 P1 P2 P3 P4 P10 P21 P22
# -*- coding: UTF-8 -*-
#实验效果:打印行空板P21口模拟值
#接线:行空板P21口接一个旋钮模块
import time
from pinpong.board import Board,Pin
Board().begin() #初始化
# ADC模拟输入引脚支持: P0 P1 P2 P3 P4 P10 P21 P22
#adc21 = ADC(Pin(Pin.P21)) #将Pin传入ADC中实现模拟输入 模拟输入方法1
adc21 = Pin(Pin.P21, Pin.ANALOG) #引脚初始化为电平输出 模拟输入方法2
while True:
#v = adc21.read() #读取A0口模拟信号数值 0-4095 模拟输入方法1
v = adc21.read_analog() #读取A0口模拟信号数值 0-4095 模拟输入方法2
print("P21=", v)
time.sleep(0.5)
- 图形化示例:
5.4-模拟输出(PWM)
行空板支持8路10位PWM,分别对应引脚为: P0 P2 P3 P10 P16 P21 P22 P23
注意: 其中P8与P2共用一路PWM,P9与P10共用一路PWM,因此P8与P9也可以使用PWM,但使用时P2和P10不能使用,另外需要注意P8P9为一组,P2P10为一组,只能同时使用其中一组,不可混合使用(例如P8或P9输出了PWM,则P2或P10就不能输出PWM了)。
# -*- coding: UTF-8 -*-
#实验效果: PWM输出实验,控制LED灯亮度变化
#接线:LED灯接到行空板P21引脚上
import time
from pinpong.board import Board,Pin
Board().begin() #初始化
# PWM模拟输出引脚支持: P0 P2 P3 P10 P16 P21 P22 P23
#pwm21 = PWM(Pin(Pin.P21)) #将引脚传入PWM初始化 模拟输出方法1
pwm21 = Pin(Pin.P21, Pin.PWM) #初始化引脚为PWM模式 模拟输出方法2
while True:
for i in range(1023):
print(i)
#pwm21.duty(i) #PWM输出 方法1
pwm21.write_analog(i) #PWM输出 方法2
time.sleep(0.05)
- 图形化示例:
----------------
6 - 高级功能
6.1-串口(UART)
行空板金手指上支持1路硬串口,可搭配micro:bit兼容的扩展板使用。
注:不支持软串口
注:行空板板载了USB接口,内置了ch340、cp2102、pl2303串口驱动,因此你还可以直接使用一个USB to TTL转接板连接串口设备,使用pyserial库进行通信。
# -*- coding: utf-8 -*-
import time
from pinpong.board import Board, UART
Board("UNIHIKER").begin() #初始化,选择板型,不输入板型则进行自动识别
#硬串口1 P0-RX P3-TX
uart1 = UART()
#初始化串口 baud_rate 波特率, bits 数据位数(8/9) parity奇偶校验(0 无校验/1 奇校验/2 偶校验) stop 停止位(1/2)
# uart1.init(baud_rate = 115200, bits=8, parity=0, stop = 1)
uart1.init() #默认波特率为9600
buf = [0x00, 0x01, 0x02, 0x03, 0x05, 0x06, 0x07]
#关闭硬串口1
#uart1.deinit()
#返回可读取的字节数
#uart1.any()
#串口写,buf为数列
#uart1.write(buf)
#读取串口字符,返回None或者数列
#uart1.read(n)
#读一行,以换行符结尾。读取行或 None 超时。(到换行键(0xa)结束,无则返回None)
#buf = uart1.readline()
#将字节读入buf。如果 nbytes 指定,则最多读取多个字节。否则,最多读取 len(buf) 字节数。
#uart1.readinto(buf, nbytes)
while True:
uart1.write(buf)
time.sleep(1)
6.2-SPI
行空板金手指上支持2路SPI接口,可搭配micro:bit兼容的扩展板使用。
import time
from pinpong.board import Board, Pin, SPI
Board("UNIHIKER").begin() #初始化,选择板型,不输入板型则进行自动识别
#0代表SPI0(P1 SCK, P10 MISO, P2 MOSI), 1代表SPI1(P13 SCK, P14 MISO, P15 MOSI)
#cs为选片引脚, 只能做主机
spi0 = SPI(0, cs = Pin.P3)
w_buf = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07]
while True:
# r_buf = spi0.read(8) #向从机读取8个字节
# print(r_buf)
#spi0.write(0x88) #spi0发送单字节
spi0.write(w_buf) #spi0发送buf
time.sleep(1)
----------------
7 - 更多传感器的支持
pinpong库中支持的传感器在行空板上也可以使用,只需要调整对应的引脚代码即可。
DHT11温湿度传感器
需要传入引脚的传感器,数字信号,任何引脚均可,使用行空板中引脚积木插入对应传感器引脚对象中。
注:因为行空板引脚控制积木默认会进行初始化操作,因此不在需要单独的pinpong初始化积木。
舵机示例
需要传入引脚的执行器,需要使用pwm引脚(带~标记的为PWM引脚),使用行空板中引脚积木插入对应执行器引脚对象中。
注0:如果接线及程序正常而舵机不转,尝试将pinpong库升级到0.5.2及以上版本。 [升级方法]。
注1:行空板板载接口为PH2.0接口,常规舵机线为2.54mm杜邦头,可使用PH2.0转杜邦2.54公头线 或 公公头转接线进行转接。
注2:行空板板载接口仅能连接9g舵机,请勿连接金属大舵机,大舵机需要的电流较大可能会损坏行空板上的电子部件,应该使用扩展板连接大舵机并独立供电。
功率计示例
I2C传感器,需要增加初始化pinpong的积木。
注:没有用到行空板主板中的积木,因此需要单独初始化。
WS2812 RGB灯带
插入行空板引脚初始化即可,数字信号,任何引脚均可,设置为黑色可以熄灭灯。
注:V0.6.0以下版本pinpong库只支持使用一条灯带,如需要同时使用多个灯带请升级pinpong库到最新版本。
注:因为行空板引脚控制积木默认会进行初始化操作,因此不在需要单独的pinpong初始化积木。
注:如果对ws2812进行外部供电,需要注意供3.3V电压以及共地
- 更多示例详情查看对应电子模块的产品维库或pinpong示例代码:
----------------
7 - 常见问题FAQ
暂时还没有常见问题,请在论坛行空板专区或行空板官网交流群进行交流。