参考案例

Python轻应用提供了丰富的案例及文档供开发者参考,下面是模块部分和功能实现的参考。


I 外设

Python轻应用提供了针对部分外设接口的示例程序,以方便开发者参考引用。


1: UART读写

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import haascv
from haascv import driver

uartObj = driver.uart()#获取uart 驱动的对象
uartObj.open(2, 3, 115200, 0, 0, 0)#port,bitwidth,baudrate,stop_bits,flow_control,parity
uart_read_buf = bytearray(4)#定义存储读取的数据的数组
uart_write_buf = bytearray([97, 98, 99, 100])#定义需要发送的数据

print(uart_write_buf)#打印发送的数据
uartObj.write(uart_write_buf)#开始写数据
readSize = uartObj.read(uart_read_buf)#读数据
print(readSize)#打印读到数据的大小
print(uart_read_buf)#打印读取到的数据内容
uartObj.close()#关闭uart模块

2: 延时和时间

1
2
3
4
5
6
7
import utime

utime.sleep(1)           # sleep for 1 second 延时1s
utime.sleep_ms(500)      # sleep for 500 milliseconds 延时500ms
utime.sleep_us(10)       # sleep for 10 microseconds 延时10us
start = utime.ticks_ms() # get value of millisecond counter 获取毫秒计数器的值
delta = utime.ticks_diff(utime.ticks_ms(), start) # compute time difference 计算时间差

3: LED 发光二极管

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import utime
import haascv
from haascv import driver

GPIO = driver.gpio()#获取gpio 类对象
leds=(34,35,36,40,41)#hass100 板子上led对应的GPIO口
for i in range(10):
    for led in leds:
        GPIO.open(led, 5, 0)
        GPIO.write(0)
        utime.sleep_ms(100)
        GPIO.write(1)
       utime.sleep_ms(100)
       GPIO.close()

4: 管脚和GPIO

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import haascv
from haascv import driver

gpioObj = driver.gpio();#获取GPIO对象

gpioObj.open(35, Pin.OUT_PP, 0)#配置成输出模式
gpioObj..write(0)#拉低
gpioObj..write(1)#拉高
gpioObj.toggle()#出发生效
gpioObj.close()#关闭模块

gpioObj.open(35, gpioObj .IN, gpioObj .PULL_UP)#配置成输入模式
gpio_value = gpioObj.read()#读取gpio口状态值
print(gpio_value)#打印状态值
gpioObj.close()#关闭模块

5: PWM脉宽调制

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import haascv
from haascv import driver

print("start pwm")
pwmObj = driver.pwm();#获取pwm对象
pwmObj.open(31, 0.2, 25, 0)#打开PWM模块

pwmObj.setFreq(3250000)#设置频率
pwmObj.setDuty(0.5)#设置duty

duty = pwmObj.getDuty()#获取duty值
print(duty)#打印获取的duty值
freq = pwmObj.getFreq()#获取频率值
print(freq)#打印频率值

pwmObj.close()#关闭pwm模块

6: SPI总线

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import haascv
from haascv import driver

spiObj = driver.spi();#获取SPI类对象
spiObj.open(0, 0, 2000000, 0)#打开SPI模块

spi_read_buf = bytearray(4)#定义存储读取数据的对象
spi_write_buf = bytearray([0x01, 0x02, 0x10, 0xaa])#定义待写的数据

print(spi_write_buf)#打印写的buffer
spiObj.write(spi_write_buf)#开发发送数据

spiObj.read(spi_read_buf)#读取数据
print(spi_read_buf)#打印读取的数据

spiObj.writeAndRead(spi_write_buf, spi_read_buf)#发送并读取数据
print(spi_read_buf)#打印读取的数据内容

spiObj.close()#关闭spi模块

7: I2C总线

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import haascv
from haascv import driver

i2cObj = driver.i2c();#获取i2c类对象
i2cObj.open(1, 8, 0, 0, 0x70, 0)#配置i2c模块

i2c_read_buf = bytearray(6)#定义存储读取数据的对象
i2c_write_buf = bytearray([1, 2, 3, 4, 5, 6])#定义待写的数据

print(i2c_write_buf)#打印写的buffer
i2cObj.write(i2c_write_buf)#开始写数据

i2cObj.read(i2c_read_buf)#读取数据
print(i2c_read_buf)#打印读取的数据

i2cObj.close()#关闭i2c模块

II AI/多媒体

Python轻应用提供了针对部分AI场景的应用案例,以方便开发者参考引用。开发者下载 AliOS-Things 后就可以按照下面的步骤编译验证了。

需要切换到 dev_3.1.0_haas 分支

git clone https://github.com/alibaba/AliOS-Things.git -b dev_3.1.0_haas

1: 数字识别

通过HaasCV 模块,完成数据源的封装处理,图⽚的解码,图⽚数据的格式转换和缩放等功能,最后将处理好的数据喂给ML 模块进⾏推理得到预期结果.

编译

make distclean
make mpy_odla_ocr_demo@haas100 -c config
make

代码

 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
import haascv
from haascv import ml
print("-------------------Welcome HaasAI MicroPython--------------------")

print("-----ml odla demo start-----")
#test data
#"/data/odla/test0.bmp"
#"/data/odla/test1.bmp"
#"/data/odla/test2.bmp"
#"/data/odla/test3.bmp"
#"/data/odla/test4.bmp"
#"/data/odla/test5.bmp"
#"/data/odla/test6.bmp"
#"/data/odla/test7.bmp"
#"/data/odla/test8.bmp"
#"/data/odla/test9.bmp"
mlobj = ml();
mlobj.open(ml.ML_ENGINE_ODLA);
mlobj.setInputData("/data/odla/test4.bmp");
mlobj.loadNet("default");
mlobj.predict();
responses_value = bytearray(10)
mlobj.getPredictResponses(responses_value);
print(responses_value);
mlobj.unLoadNet();
mlobj.close();
print("-----ml odla demo end-----")

2: 人脸对比

通过HaasCV 模块,完成数据源的封装处理,图⽚的解码,图⽚数据的格式转换和缩放等功能,最后将处理好的数据喂给ML 模块,ML 模块通过Alibaba Cloud SDK引擎和达摩院的视觉开放智能平台进⾏交互,得到预期结果.

编译

make distclean
make mpy_ucloud_facebody_comparing_demo@haas100 -c config
make

代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import haascv
from haascv import ml
print("-------------------Welcome HaasAI MicroPython--------------------");

print("-----ml ucloud FacebodyComparing demo start-----");
OSS_ACCESS_KEY = "XXX";
OSS_ACCESS_SECRET = "XXX";
OSS_ENDPOINT = "XXX";
OSS_BUCKET = "XXX";
ML_MYFACE_PATH = "XXX";

mlobj = ml();
mlobj.open(ml.ML_ENGINE_CLOUD);
mlobj.config(OSS_ACCESS_KEY, OSS_ACCESS_SECRET, OSS_ENDPOINT, OSS_BUCKET, ML_MYFACE_PATH);
mlobj.setInputData("/data/capture.jpg");
mlobj.loadNet("FacebodyComparing");
mlobj.predict();
responses_value = bytearray(10)
mlobj.getPredictResponses(responses_value);
print(responses_value);
mlobj.unLoadNet();
mlobj.close();
print("-----ml ucloud FacebodyComparing demo end-----")

3: 人物动漫化

通过HaasCV 模块,完成数据源的封装处理,图⽚的解码,图⽚数据的格式转换和缩放等功能,最后将处理好的数据喂给ML 模块,ML 模块通过Alibaba Cloud SDK引擎和达摩院的视觉开放智能平台进⾏交互,得到预期结果.

编译

make distclean
make mpy_ucloud_anime_style_demo@haas100 -c config
make

代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
import haascv
from haascv import ml
print("-------------------Welcome HaasAI MicroPython--------------------");

print("-----ml ucloud AnimeStyle demo start-----");
OSS_ACCESS_KEY = "XXX";
OSS_ACCESS_SECRET = "XXX";
OSS_ENDPOINT = "XXX";
OSS_BUCKET = "XXX";

mlobj = ml();
mlobj.open(ml.ML_ENGINE_CLOUD);
mlobj.config(OSS_ACCESS_KEY, OSS_ACCESS_SECRET, OSS_ENDPOINT, OSS_BUCKET, "NULL");
mlobj.setInputData("/data/capture.jpg");
mlobj.loadNet("AnimeStyle");
mlobj.predict();
responses_value = bytearray(10)
mlobj.getPredictResponses(responses_value);
print(responses_value);
mlobj.unLoadNet();
mlobj.close();
print("-----ml ucloud AnimeStyle demo end-----")

4: 目标检测

通过HaasCV 模块,完成数据源的封装处理,图⽚的解码,图⽚数据的格式转换和缩放等功能,最后将处理好的数据喂给ML 模块,ML 模块通过Alibaba Cloud SDK引擎和达摩院的视觉开放智能平台进⾏交互,得到预期结果.

编译

make distclean
make mpy_ucloud_objectdet_demo@haas100 -c config
make

代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
import haascv
from haascv import ml
print("-------------------Welcome HaasAI MicroPython--------------------");

print("-----ml ucloud ObjectDet demo start-----");
OSS_ACCESS_KEY = "XXX";
OSS_ACCESS_SECRET = "XXX";
OSS_ENDPOINT = "XXX";
OSS_BUCKET = "XXX";

mlobj = ml();
mlobj.open(ml.ML_ENGINE_CLOUD);
mlobj.config(OSS_ACCESS_KEY, OSS_ACCESS_SECRET, OSS_ENDPOINT, OSS_BUCKET, "NULL");
mlobj.setInputData("/data/capture.jpg");
mlobj.loadNet("ObjectDet");
mlobj.predict();
responses_value = bytearray(10)
mlobj.getPredictResponses(responses_value);
print(responses_value);
mlobj.unLoadNet();
mlobj.close();
print("-----ml ucloud ObjectDet demo end-----")

5: 表情识别

通过HaasCV 模块,完成数据源的封装处理,图⽚的解码,图⽚数据的格式转换和缩放等功能,最后将处理好的数据喂给ML 模块,ML 模块通过Alibaba Cloud SDK引擎和达摩院的视觉开放智能平台进⾏交互,得到预期结果.

编译

make distclean
make mpy_ucloud_recognize_expression_demo@haas100 -c config
make

代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
import haascv
from haascv import ml
print("-------------------Welcome HaasAI MicroPython--------------------");

print("-----ml ucloud RecognizeExpression demo start-----");
OSS_ACCESS_KEY = "XXX";
OSS_ACCESS_SECRET = "XXX";
OSS_ENDPOINT = "XXX";
OSS_BUCKET = "XXX";

mlobj = ml();
mlobj.open(ml.ML_ENGINE_CLOUD);
mlobj.config(OSS_ACCESS_KEY, OSS_ACCESS_SECRET, OSS_ENDPOINT, OSS_BUCKET, "NULL");
mlobj.setInputData("/data/capture.jpg");
mlobj.loadNet("RecognizeExpression");
mlobj.predict();
responses_value = bytearray(10)
mlobj.getPredictResponses(responses_value);
print(responses_value);
mlobj.unLoadNet();
mlobj.close();
print("-----ml ucloud RecognizeExpression demo end-----")

III 云端连接/控制

基于MicroPython,提供了HaaS100同阿里云物联网平台连接和控制的接口.让开发者可以轻松实现数据上云,以及通过云端控制和调用设备端硬件接口和软件服务的能力.

上述文档中中实现的功能如下:

  • 设备联网

  • 连接物联网平台

  • 等待云端控制消息,并实现设备控制

 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
58
from linkkit import linkkit
import netmgr as nm
import utime
# 物联网平台连接成功的标志
connected = 0
# 物联网平台申请到的产品和设备信息
PRODUCT_KEY = "a1uTFk4xjko"
PRODUCT_SECRET = "xxxxxxx"
DEVICE_NAME  =    "mpy_001"
DEVICE_SECRET  =   "xxxxxxxxxxxxxxx"
# 连接wifi 函数
def connect_wifi():
    nm.init()
    nm.connect("KIDS","12345678")
# 物联网平台连接成功的回调函数
def on_connect():
    global  connected
    print('linkkit is connected ')
    connected =  1
# 云端 控制led 的 消息接收和处理函数
def on_prop_set(request):
    from haascv import driver
    import ujson
    ON = 0
    OFF = 1
    payload = ujson.loads(request)
    stat = payload["LEDSwitch"]
    GPIO = driver.gpio()
    led = 34
    GPIO.open(led, 5, 0)
    if stat == 1:
        GPIO.write(ON)
    else:
        GPIO.write(OFF)
    utime.sleep_ms(200)
    GPIO.close()
# 连接wifi
connect_wifi()
# 初始化linkkit sdk 并设置回调函数
lk = linkkit.LinkKit(host_name="cn-shanghai",
    product_key=PRODUCT_KEY,
    device_name=DEVICE_NAME,
    device_secret=DEVICE_SECRET,
    product_secret=PRODUCT_SECRET)

lk.on_connect = on_connect
lk.on_prop_set  = on_prop_set
# 异步连接物联网平台
lk.connect_async()
if(connected == 0):
    print(" wait for linkkit conneted callback ")
    utime.sleep_ms(100)
# 触发物联网平台消息接收函数并设置超时
while(True):
    lk.do_yield(200)
    import haascv
    from haascv import ml
    print("-------------------Welcome HaasAI MicroPython--------------------");

修改上述代码中的wifi ssid,密码,以及物联网相关key信息,将修改过后的代码保存到sdcard根目录的linkkit_test.py 文件中,机器插入sdcard并重启,通过串口输入命令

micropython /sdcard/linkkit_test.py