3. Pika 派开发板快速上手

今天我们不聊驱动开发还有架构原理这些令人头大的硬核内容,我们就单纯的用 Pika 派开发板玩玩 Python 编程!在单片机上点亮一个“人生苦短,我用 Python ”的成就!

视频链接

3.1. 开发板获取

如果手里还没有 Pika 派开发板的话,可以用下面的链接购买:

https://item.taobao.com/item.htm?spm=a21dvs.23580594.0.0.52de3d0dt7rqAx&ft=t&id=654947372034

开发板长下面这个样子,板载一个 STM32G0 芯片,上面有4个炫彩 RGB ,采用 Type-C 接口。

可选配置:

  • Lite 青春版:STM32G030 + CH340 串口芯片 64k flash 8k ram

  • Pro 专业版:STM32G030 + DAPLink 调试器 64K flash 8k ram

  • Plus 顶配版:STM32G070 + DAPLink 调试器 128k flash 32k ram

_images/1641204913846-15059096-75ac-4aa1-9c5f-27cbde8d77d9.png 这个开发板由 PikaScript 项目官方支持,持续滚动更新,PikaScript 的最新内核,最新功能,都可以在这个开发板上抢先体验到。

这个开发板也由项目官方适配了丰富外设模块、包括 GPIO、TIME、ADC、IIC、LCD、KEY、PWM 等模块的驱动都已经开发好,可以直接用 python 进行编程。

3.2. 视频教程

https://space.bilibili.com/5365336/channel/seriesdetail?sid=1034902

3.3. 如何给单片机下载Python程序

下载方法非常简单,只需要连接上 Type-C 数据线就可以了。

_images/200332_3e87979e_5521445.png

我们用一根 USB 数据线,连接电脑和 Pika 派开发板,就可以下载程序了。 下载程序的时候,需要使用一个串口助手工具,我们可以使用正点原子开发的 XCOM 助手,在正点原子的论坛可以下载到。 http://www.openedv.com/thread-279749-1-1.html

_images/200618_b8f264a8_5521445.png 选择好 COM 口,然后波特率选为 115200,再点打开串口,这时候,就和 Pika 派连接上了。直接发送一个 Pthon 脚本文件,就可以给 Pika 派下载 Python 程序了。为了验证下载能不能成功,我们使用 PikaScript 源码仓库里面的示例 Python 脚本。 我们进入 PikaScript 的代码仓库 https://gitee.com/Lyon1998/pikascript 惯例点一个 Star~ 屏幕截图.png 然后我们点击 examples 文件夹,里面放的就是可以运行的 Python 例程。 _images/201133_2caa690c_5521445.png 我们打开 GPIO 文件夹,来点亮一下流水灯看看~ _images/201304_ee6f19c7_5521445.png GPIO 文件夹里面的 main.py 就是 GPIO 的示例代码了 _images/201351_226525cc_5521445.png 我们可以点开 main.py 看看~

  1. import PikaStdLib
  2. import machine
  3. mem = PikaStdLib.MemChecker()
  4. io1 = machine.GPIO()
  5. time = machine.Time()
  6. io1.init()
  7. io1.setPin('PA8')
  8. io1.setMode('out')
  9. io1.enable()
  10. io1.low()
  11. print('hello pikascript')
  12. print('mem.max :')
  13. mem.max()
  14. print('mem.now :')
  15. mem.now()
  16. while True:
  17. io1.low()
  18. time.sleep_ms(500)
  19. io1.high()
  20. time.sleep_ms(500)

先不解释里面的内容,我们直接下载这个脚本看看。 我们也在桌面新建一个 main.py 文件,然后把这段代码复制进去。

_images/201535_8f49da20_5521445.png

我们选择这个 main.py 文件 _images/201639_79a783b1_5521445.png 然后点击”发送文件”, 就可以把脚本下载进去了! 我们可以看到 [ OK ]: Programing ok! 的提示,这就是说明下载成功了! _images/201816_13337449_5521445.png 这时开发板上面的 LED 就会闪动起来! _images/202935_f82345e6_5521445.png

恭喜你达成单片机玩 Python 的成就!

3.4. GPIO的脚本里写了什么?

下面我们来逐行解析一下 GPIO 的这个例程。

  1. import PikaStdLib
  2. import machine

首先是第一行和第二行,这表示导入了两个模块,一个是PikaStdLib模块,一个是machine模块。PikaStdLib 是 PikaScript 的标准库,里面有一些系统的功能,比如可以检查内存的占用。第四行里面,我们就新建了一个 mem 对象,这个对象的类是 PikaStdLib.MemChecker()。

  1. mem = PikaStdLib.MemChecker()

这个类有 max() 方法和 now() 方法,使用这两个方法,就可以打印出当前 PikaScript 所使用的内存大小。

  1. print('hello pikascript')
  2. print('mem.max :')
  3. mem.max()
  4. print('mem.now :')
  5. mem.now()

我们可以看看串口的打印输出,可以看到最大的内存占用是 1.51kB,而当前的内存占用是 0.61kB,是不是很小!

屏幕截图.png屏幕截图.png

time 对象是通过 machine 的 Time() 类新建的,可以提供基本的延时功能。

  1. time = machine.Time()

通过 time.sleep_ms() 方法,就可以按毫秒进行延时了,比如下面代码的作用就是延时500ms。

  1. time.sleep_ms(500)

io1 就是我们今天的主角了,这是一个 GPIO 对象,是用 machine .GPIO() 类新建的。

  1. io1 = machine.GPIO()

在新建了 io1 对象之后,我们要给这个 io 进行初始化,init() 用于对象初始化,在最前面使用,然后 setPin(‘PA8’) 表示使用 PA8 口 setMode(‘out’) 表示使用输出模式,而 enable() 表示启动 io1 的硬件,low() 将 io1 的电平拉低。PA8 上连接了 Pika 派上面的一个 led 灯,只要控制 PA8 的电平,就可以控制灯的亮灭了。

  1. io1.init()
  2. io1.setPin('PA8')
  3. io1.setMode('out')
  4. io1.enable()
  5. io1.low()

而在程序的主循环里面,对 io1 进行高低电平的切换,就可以使 LED 闪动了~

  1. while True:
  2. io1.low()
  3. time.sleep_ms(500)
  4. io1.high()
  5. time.sleep_ms(500)

3.5. 其他的Python例程解读

3.5.1. ADC

我们再解读一下 examples 里面的其他例程,比如这个 ADC 例程,就是读取 PA1 管脚上面的模拟电压值,然后打印出来~

  1. import PikaStdLib
  2. import machine
  3. time = machine.Time()
  4. adc1 = machine.ADC() #create an ADC objcet
  5. adc1.init() # init the ADC object
  6. adc1.setPin('PA1') # config Pin
  7. adc1.enable() # launch the hardware
  8. while True:
  9. val = adc1.read() # read the value of ADC and store to 'val'
  10. print('adc1 value:') # print out the value
  11. print(val)
  12. time.sleep_ms(500) # wait 0.5s

3.5.2. UART

下面是串口的例程,功能是读取收到的两个字节,然后打印出来

  1. import PikaStdLib
  2. import machine
  3. time = machine.Time()
  4. uart = machine.UART() #create a uart object
  5. uart.init()
  6. uart.setId(1) # set number of uart
  7. uart.setBaudRate(115200) # set baudrate
  8. uart.enable() #启动硬件
  9. while True:
  10. time.sleep_ms(500)
  11. readBuff = uart.read(2) # read two chars
  12. print('read 2 char:')
  13. print(readBuff) # print out the char

3.5.3. PWM

再下面这个是 PWM 的例程,可以指定管脚输出PWM波,可以设置频率和占空比

  1. import PikaStdLib
  2. import machine
  3. time = machine.Time()
  4. pwm = machine.PWM()
  5. pwm.setPin('PA8') # setup the pin numbcer
  6. pwm.setFrequency(2000) # setup the frequency
  7. pwm.setDuty(0.5) # set the duty to 50%
  8. pwm.enable()
  9. while True:
  10. time.sleep_ms(500)
  11. pwm.setDuty(0.5)
  12. time.sleep_ms(500)
  13. pwm.setDuty(0.001) # set the duty to 0.1%

3.5.4. RGB

再下面这个就是 RGB 的例程了~

  1. import machine
  2. import PikaStdLib
  3. time = machine.Time()
  4. adc = machine.ADC()
  5. pin = machine.GPIO()
  6. pwm = machine.PWM()
  7. uart = machine.UART()
  8. rgb = machine.RGB() # create an RGB object
  9. mem = PikaStdLib.MemChecker()
  10. rgb.init() # init the object
  11. rgb.enable() # launch the hardware
  12. print('hello 2')
  13. print('mem used max:')
  14. mem.max()
  15. while True:
  16. print('flowing')
  17. rgb.flow() # let RGB flow

这个例程可以驱动板载的4个 RGB 流水灯~

_images/205338_ae2e2de2_5521445.png

3.5.5. LCD

还有一个 LCD 的例程,可以在 LCD 上面显示一个小方块,而你可以使用板载的四个按键控制小方块运动~

_images/210940_f30be3d5_5521445.png

  1. from PikaObj import *
  2. import PikaStdLib
  3. import machine
  4. lcd = machine.LCD()
  5. lcd.init()
  6. lcd.clear('white') # init LCD set background to white
  7. mem = PikaStdLib.MemChecker()
  8. key = machine.KEY() # new a KEY object
  9. key.init()
  10. time = machine.Time()
  11. h = 10
  12. w = 10
  13. x = 10
  14. y = 10 #Used to represent the height, width, and coordinates of small squares
  15. x_last = x
  16. y_last = y #Record the last location and use it for erasure
  17. is_update = 0 #A flag variable that controls the refresh screen
  18. print('mem used max:')
  19. mem.max()
  20. lcd.fill(x, y, w, h, 'blue') #Draw small blue squares
  21. while True:
  22. key_val = key.get() # Gets the value of the key
  23. if key_val != -1:
  24. x_last = x
  25. y_last = y
  26. is_update = 1 #Start the refresh
  27. if key_val == 0:
  28. x = x + 5 #Change the coordinates of small squares
  29. if key_val == 1:
  30. y = y - 5
  31. if key_val == 2:
  32. y = y + 5
  33. if key_val == 3:
  34. x = x - 5
  35. if is_update: #Refresh the screen
  36. is_update = 0
  37. lcd.fill(x_last, y_last, w, h, 'white') #Erase off the previous position
  38. lcd.fill(x, y, w, h, 'blue') #Draw the new location

当你熟悉了 LCD 驱动之后,可以试试自己开发小游戏哦~

3.6. 交互式运行

main.py 执行完毕后,就会进入交互式运行,因此只要取消 main.py 中的 while True :,使其能够执行完退出,就可以进入交互式运行。 _images/1641953728408-8fbffe1c-643a-4f18-855e-5d60578eb194.jpeg 交互式运行支持单行,多行输入,和通用 Python 用法一致。建议使用 PuTTY 串口终端。 输入 exit() 则会直接重启系统。 注意事项

  1. 固件版本需要不低于v1.3.2。

  2. 如果使用 PuTTY 终端无法正常运行,请使用 XCOM。

  3. 在终端中应全部使用英文输入法。

  4. 缩进应使用4个空格,不要使用TAB键。

3.7. LCD屏幕安装

  1. 参考下图焊接长脚排母

_images/1641957159752-18f9f608-8389-4a43-9c1d-ea6ce44c3e4a.png

  1. 插上屏幕,参考绿色小旗的方向,屏幕能亮就说明插的方向是对的,插反了不会亮

_images/1641957159517-c3adbb12-118a-4c9f-9662-c1801df59276.png

3.8. 固件升级

Pika派的固件是滚动更新的,会不断推出新的固件版本,不断提供新的功能,而有一些新的功能只有升级固件才能玩到,所以学会升级固件也是很重要的~

3.8.1. 编译固件

固件是一个 Keil 工程,编译非常简单。 下载固件工程: 进入 pikascript 官网 http://pikascript.com Lite 版和 Pro版使用 stm32g030 平台。 Plus 版使用 stm32g070 平台。 然后点击 “开始生成”。 (选择平台后会自动选择默认的模块) _images/1644129110261-049ad5bb-21af-40e2-9533-a1c8c86790f1.png 直接打开 Keil 工程就可以编译了。 编译时需要使用不低于 V5.36 的 Keil,需要激活。 _images/1642145123916-644fdd52-a1d3-41be-bd74-8a9e05386397.png

3.8.2. 使用SWD升级

Lite 版自行连接 J-Link \ DAP-Link \ ST-Link 即可SWD升级。 Pro 版和 Plus 版板载 DAP-Link,直接连接USB即可SWD升级。 Lite 版和 Pro版使用 bsp/stm32g030 工程。 Plus 版使用 bsp/stm32g070 工程。 在使用SWD升级时,应选择”部分擦除”的下载方式 _images/1642144820993-a1c6c5e9-e3ca-4406-aa93-3ae3911738f6.png

3.8.3. 使用固件下载Python程序

固件在编译时会加载 pikascript/main.py 作为默认 Python 程序。

3.9. 常见问题

1 工程编译报错,缺少文件: 工程需要远程拉取模块和预编译,需要先运行 pikascript/pikaPackage.exe 和 pikascript/rust-msc-win10-latest.exe 再编译工程。

3.10. 原理图

3.10.1. Lite青春版

_images/1641204367325-7c0751ac-7fe8-4029-a4c2-ee6ebb1e2733.png

3.10.2. Pro专业版

_images/1641733841411-d3a3ed0f-4609-49eb-9985-b3a635e72b51.png

3.10.3. Plus顶配版

_images/1641733943438-bdd0d52f-1e34-4a8e-a3bb-c53508ce4fc1.png

3.10.4. LCD

_images/1645715736921-0dcd26b4-732b-42bf-b17a-1ef3ce3d3ea6.png