3.1 - pinpong库说明

行空板上板载了一颗单片机协处理器负责板载元件及GPIO的控制,因此我们通过Python进行控制需要使用pinpong库。

更多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)三种

    • 示例程序:

# -*- 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_x()

    • 陀螺仪: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.2-模拟输出(PWM)

行空板支持8路10位PWM,分别对应引脚为: P0 P2 P3 P10 P16 P21 P22 P23

注意: 其中P8与P2共用一路PWM,P9与P10共用一路PWM,因此P8与P9也可以使用PWM,但使用时P2和P10不能使用。

# -*- 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初始化积木。

|- 舵机示例

需要传入引脚的执行器,使用行空板中引脚积木插入对应执行器引脚对象中。

注:因为行空板引脚控制积木默认会进行初始化操作,因此不在需要单独的pinpong初始化积木。

|- 功率计示例

I2C传感器,需要增加初始化pinpong的积木。

注:没有用到行空板主板中的积木,因此需要单独初始化。

|- WS2812 RGB灯带

插入行空板引脚初始化即可,设置为黑色可以熄灭灯。

注:因为行空板引脚控制积木默认会进行初始化操作,因此不在需要单独的pinpong初始化积木。


—————-

7 - 常见问题FAQ

暂时还没有常见问题,请在论坛行空板专区或行空板官网交流群进行交流。