照相机

本项目主要是按键应用和拍照的相结合,这些内容可以在前面的实验找到,这里不再重复

外部中断按键实验:请参阅 4.4 外部中断 章节内容;

拍摄照片实验:请参阅 5.9 图片拍摄 章节内容。

拍照后我们应该让图片停留一段时间,让用户观察照片的拍摄情况,然后再进行继续拍摄。代码编写流程如下:

代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import sensor, lcd, utime
from Maix import GPIO
from fpioa_manager import fm

#注册 KEY 的外部 IO
fm.register(16, fm.fpioa.GPIOHS0, force=True)

#构建 KEY 对象
KEY=GPIO(GPIO.GPIOHS0, GPIO.IN, GPIO.PULL_UP)

#摄像头初始化

sensor.reset() # Initialize the camera sensor.
sensor.set_pixformat(sensor.RGB565) # or sensor.GRAYSCALE
sensor.set_framesize(sensor.QVGA) # or sensor.QVGA (or others)
sensor.skip_frames(30) # Let new settings take affect.

#sensor.set_vflip(1) #摄像头后置模式

#LCD 初始化
lcd.init()

key_node = 0 #按键标志位
name_num = 0 #照片名字

##############################################
# 按键和其回调函数
##############################################

def fun(KEY):

global key_node
utime.sleep_ms(10) #消除抖动
if KEY.value()==0: #确认按键被按下
key_node = 1

#开启中断,下降沿触发

KEY.irq(fun, GPIO.IRQ_FALLING)

while True:

lcd.display(sensor.snapshot()) # LCD 实时显示

if key_node==1: #按键被按下
key_node = 0 #清空按键标志位

#拍照并保存,保存文件用时间来命名。
lcd.display(sensor.snapshot().save(str(name_num)+".jpg"))

name_num=name_num+1 #名字编码加 1

print("Done! Reset the camera to see the saved image.")

#延时 3 秒,观看拍摄图片

utime.sleep_ms(3000)

 

 

视频播放器

音视频解码是一个复杂的过程,但 K210 底层 MicroPython 库写好后,着重应用来编程就变得非常简单了。和以往一样,我们只需要熟悉模块用法即可。

本实验实验 01Studio 音频模块,基于 PAM8403 的一款 D 类功放 IC,和麦克风一样使用 I2S 接口通信,这里不再重复 I2S 内容。

而视频播放被封装成 video 模块,在前面视频录制章节内容已经介绍过,这里重温一下,模块说明如下

 

构造函数

1
2
3
import video

v=vedio.open((path, record=False, interval=100000, quality=50,width=320, height=240, audio=False, sample_rate=44100, channels=1))

播放或录制视频文件。

【path】文件路径,比如:/sd/badapple.avi;

【record】=True 表示视频录制,=False 表示视频播放;

【interval】录制帧间隔,单位是微妙;FPS=1000000/interval,默认值

是 100000,即 FPS 默认是 10(每秒 10 帧);

【quality】jpeg 压缩质量(%),默认 50;

【width】录制屏幕宽度,默认 320;

【height】录制屏幕高度,默认 240;

【audio】是否录制音频,默认 False;

【sample_rate】录制音频采样率,默认 44100(44.1k);

【channels】录制音频声道数,默认 1,即单声道。

使用方法

1
v.play()

播放视频;

1
v.volume([value])

设置音量值。

【value】0-100;

1
v.revord ()

录制音视频;

1
v.revord_finish ()

停止录制;

*更多使用说明请阅读官方文档:

https://maixpy.sipeed.com/zh/libs/machine_vision/video.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
'''
实验名称:视频播放器
版本:v1.0
日期:2019.12
翻译和注释:01Studio
说明:AVI视频播放。
'''

import video,time
from Maix import GPIO
from board import board_info
from fpioa_manager import fm
import lcd

lcd.init()

# 音频使能IO
AUDIO_PA_EN_PIN = 32

#注册音频使能IO
if AUDIO_PA_EN_PIN:
fm.register(AUDIO_PA_EN_PIN, fm.fpioa.GPIO1, force=True)
audio_en=GPIO(GPIO.GPIO1, GPIO.OUT,value=1)

#注册音频控制IO
fm.register(34, fm.fpioa.I2S0_OUT_D1, force=True)
fm.register(35, fm.fpioa.I2S0_SCLK, force=True)
fm.register(33, fm.fpioa.I2S0_WS, force=True)

#播放avi文件
v = video.open("/sd/badapple.avi")

#打印视频文件信息
print(v)

#音量调节
v.volume(5)

while True:
if v.play() == 0: #播放完毕
print("play end")
break

v.__del__() #销毁对象,释放内存

本实验播放的视频是 badapple.avi,文件在本例程文件夹中,先将该文件拷贝到 sd 卡。然后将 sd 卡插到 pyAI-K210。

接上 01Studio 音频模块,运行本实验程序代码,可以见到串口终端打印了avi 视频信息后,开发板便开始播放视频。

 

 

NES 游戏机

MaixPy 集成了 NES 的 MicroPython 模块,用户通过几行代码就可以实现游戏的加载,已经使用键盘或者标准游戏手柄来操控。NES 对象如下:

构造函数

1
import nes

导入 nes 模块;

使用方法

1
nes.init(rc_type=nes.KEYBOARD, cs, mosi, miso, clk, repeat=16,vol=5)

初始化 nes 游戏模拟器;

【rc_type】遥控类型。nes.KEYBOARD:REPL 中使用键盘;nes.JOYSTICK:PS2 手柄。

【cs,mosi,miso,clk】使用 PS2 手柄时的引脚配置;

【repeat】键盘按键重复率;

【vol】音量

1
nes.run(xx.nes)

运行 nes 文件。

*更多使用说明请阅读官方文档:

 

键盘和手柄的快捷键如下:

键盘(串口)

【移动】:WSAD(上下左右)

【A】:J

【B】:K

【start】:M 或 Enter

【option】:N 或\

【退出】:ESC

【音量-】:-

【音量+】:=

【运行速度-】:R

【运行速度+】:F

PS2 手柄

【移动】:方向键(上下左右)

【A】:口

【B】:X

【start】:START

【option】:SELECT

【退出】:暂无

【音量-】:R2

【音量+】:R1

【运行速度-】:L1

【运行速度+】:L2

从上表 NES 对象看到,只需要简单的初始化和运行语句,即可运行 NES 游戏模拟器,编程思路如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

import nes, lcd
from Maix import GPIO
from fpioa_manager import fm

# 音频使能IO
AUDIO_PA_EN_PIN = 32

#注册音频使能IO
if AUDIO_PA_EN_PIN:
fm.register(AUDIO_PA_EN_PIN, fm.fpioa.GPIO1, force=True)

#LCD初始化
lcd.init()

#初始化nes,配置为键盘控制
nes.init(nes.KEYBOARD)

#运行游戏
nes.run("/sd/Bomberman.nes")