硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5801|回复: 19
收起左侧

[客户分享] 用Python轻松调试单片机 - Ameba MicroPython

  [复制链接]

27

主题

20

回帖

101

积分

初级会员

积分
101
发表于 2021-2-5 18:08:46 | 显示全部楼层 |阅读模式
本帖最后由 simon西 于 2021-5-14 11:42 编辑

MicroPython项目已经上线许久了,但是使用的人还不是很多,今天就跟大家稍稍分享一下使用MicroPython在瑞昱的Ameba RTL8722无线开发板上的体验:

RTL8722介绍
瑞昱(Realtek)推出了一款支持2.4G/5G Hz的双频WiFi + BLE 5.0的物联网单片机,叫Ameba RTL8722DM。 这个开发板使用ARM Cortex-M33构架,有大小双核,大核运行程序,小核可以帮助省电。此外还有超大的内存:512KB SRAM + 4MB PSRAM,可以处理应付绝大多数物联网场景。 这个单片机的主要配置如下,




CPU
32-bit Arm®Cortex®-M4, up to 200MHz
32-bit Arm®Cortex®-M0, up to 20MHz

MEMORY
512KB SRAM + 4MB PSRAM

KEY FEATURES
Integrated 802.11a/n Wi-Fi SoC
Trustzone-M Security
Hardware SSL Engine
Root Trust Secure Boot
USB Host/Device
SD Host
BLE5.0
Codec
LCDC
Key Matrix

OTHER FEATURES
1 PCM interface
4 UART interface
1 I2S Interface
2 I2C interface
7 ADC
17 PWM
Max 54 GPIO

除此之外,这个开发板还支持标准C语言SDK, Arduino还有MicroPython(皆已开源),因此这里我们会着重分享MicroPython在这个板子上的使用和应用


了解更多详情,可点击官网链接:https://www.amebaiot.com/cn/

如果对演示视频感兴趣,也可关注B站账号
https://space.bilibili.com/457777430


以最简单的点灯为例,以下是详细的步骤,

材料准备
  • Ameba x 1, LED x 1, 电阻(220欧姆) x 1
范例说明
闪烁LED是开始了解并使用MicroPython最好示例。
首先,如下图所示将PB_22引脚连接到与限流电阻串联的LED的阳极引脚,再将GND连接到LED的阴极引脚:
然后,复制以下代码并在REPL界面中按Ctrl + E进入REPL的粘贴模式(有关REPL和粘贴模式的更多信息,请检查“Getting started”页面)。如果使用Tera Term,只需右键单击终端的任何空白处即可将代码粘贴到REPL,然后按Ctrl + D执行代码。如果一切正常,就可以看到LED在3秒钟内闪烁3次。

  1. from machine import Pin
  2. a = Pin("PB_22", Pin.OUT)
  3. a.value(1)
  4. time.sleep_ms(500)
  5. a.value(0)
  6. time.sleep_ms(500)
  7. a.on()
  8. time.sleep_ms(500)
  9. a.off()
  10. time.sleep_ms(500)
  11. a.toggle()
  12. time.sleep_ms(500)
  13. a.toggle()
复制代码





回复

使用道具 举报

27

主题

20

回帖

101

积分

初级会员

积分
101
 楼主| 发表于 2021-5-17 17:24:46 | 显示全部楼层
ADC - 读取模拟信号

材料准备
  • Ameba x 1, 电位器x 1
范例说明
这里我们把ameba连接到一个电位器上来读取它的数值,连接方式如下
复制粘贴以下代码到REPL上
  1. import socket
  2. a = ADC(0)
  3. a.read()
复制代码

其实真正要用的只有一行,是不是超级简单? 随用随敲入代码,非常方便!



回复

使用道具 举报

5

主题

519

回帖

534

积分

金牌会员

积分
534
发表于 2021-5-18 09:35:21 | 显示全部楼层
感觉做测试工装比较合适。做产品,限制地方太多。
积累的C代码,都用不上。
回复

使用道具 举报

27

主题

20

回帖

101

积分

初级会员

积分
101
 楼主| 发表于 2021-5-19 11:47:45 | 显示全部楼层
hqgboy 发表于 2021-5-18 09:35
感觉做测试工装比较合适。做产品,限制地方太多。
积累的C代码,都用不上。

其实MicroPython的固件都是用C写的,全部都是C,因为MicroPython本事就是基于CPython,所以积累的C代码只要用MicroPython自己的API封装一下,就可以使用Python3来操控了,十分方便
回复

使用道具 举报

27

主题

20

回帖

101

积分

初级会员

积分
101
 楼主| 发表于 2021-5-19 11:50:49 | 显示全部楼层
I2C - 发送与接收
MicroPython玩I2C也是相当的方便!


材料准备
  • Ameba x 1, Arduino UNO x 1
范例说明
I2C是一个微控制器上非常常见的模块,它只需要两根线就可以实现最大3.4Mbps的传输速度。它使用主从模式,一个主机可以同时连接最多128个从机,因此经常用在微控制器与感应器之间的数据传输。这里我们使用ameba作为主机来连接从机Arduino UNO,来验证I2C的发送和接受。

在连接之前,请先将以下代码上传到Arduino UNO中,“Examples -> Wire -> Slave_receiver”
接下来,请按以下所示来连接,此处我们选择PA_26 作为 SDA引脚,PA_25 作为 SCL.
注意: 目前仅支持一组I2C在MicroPython上使用,引脚如下


Unit
SDA
SCL
0

PA_26

PA_25



请一行接一行地复制粘贴以下代码到REPL上,来观察代码效果。
  1. from machine import Pin, I2C
  2. i2c = I2C(scl = "PA_25", sda = "PA_26", freq=100000) # configure I2C with pins and freq. of 100KHz
  3. i2c.scan()
  4. i2c.writeto(8, 123) # send 1 byte to slave with address 8
  5. i2c.readfrom(8, 6) # receive 6 bytes from slave
复制代码

之前有小伙伴讨论说如果用C封装好的话,也是可以达到Python的精简程度,这点上我非常同意,没有一个语言比另一个完全更好的,但是MicroPython有意思,也是不同于C程序的是,你可以一边输入代码,一边观察单片机的表现,而不用编译->上传之后才能看得到,这点上MicroPython真很方便。


回复

使用道具 举报

27

主题

20

回帖

101

积分

初级会员

积分
101
 楼主| 发表于 2021-5-21 11:49:43 | 显示全部楼层
PWM - 让LED渐明渐暗
PWM和GPIO一样都是很常用的外设,可以控制LED明暗之外,还能控制直流马达移动,算是一个非常实用的外设,那么就一起来看看PWM在MicroPython上的表现吧


材料准备
  • Ameba x 1, LED x 1, 电阻(220欧姆) x 1
范例说明
PWM脉宽调变控制输出脉波周期来实现对LED亮度和马达的控制。下面是我们用LED来展示PWM是如何来实做的。
连接PA_26至LED的正极和电阻串联在一起, 然后GND接至LED负极。如图


然后, 逐行复制下面的代码去REPL并观察结果, LED会慢慢的渐变明亮。
  1. from machine import Pin, PWM
  2. import time
  3. p = PWM(pin = "PA_26")
  4. # 0 duty cycle thus output 0
  5. p.write(0.0)
  6. # 10% duty cycle
  7. p.write(0.1)
  8. # 50% duty cycle
  9. p.write(0.5)
  10. # 100% duty cycle
  11. p.write(1.0)
复制代码

MicroPython的特性除了既写既现之外,还能帮助我们很好的学习和观察外设以及其他部件的运作模式,是它的一大特色和优势



回复

使用道具 举报

2

主题

269

回帖

275

积分

高级会员

积分
275
发表于 2021-5-21 16:44:48 | 显示全部楼层
请问,RTL8722是双核,那么MicroPython支持么,或者多任务怎么呢。或者也有支持RTOS
回复

使用道具 举报

27

主题

20

回帖

101

积分

初级会员

积分
101
 楼主| 发表于 2021-5-24 17:47:15 | 显示全部楼层
cctv180 发表于 2021-5-21 16:44
请问,RTL8722是双核,那么MicroPython支持么,或者多任务怎么呢。或者也有支持RTOS

是双核没有错,但是目前的版本只有开放大核(200MHz)给用户使用,小核(20MHz)主要是做硬件启动和节电,所以没有开放。 MicroPython其实也是在FreeRTOS上的一个线程上运行的,如果你熟悉C语言,你可以自己编译固件,增加新的线程上去。MicroPython上的FreeRTOS API还在开发中,如果想要从MicroPython层面上调用多线程,可能要再等一等,或者加入开发,所有的源码都是开源放在Github上面的,搜索ambiot ambd_micropython就能找到
回复

使用道具 举报

27

主题

20

回帖

101

积分

初级会员

积分
101
 楼主| 发表于 2021-5-24 17:48:29 | 显示全部楼层
RTC - 时间显示

RTC (Real Time Clock) 可以帮助用户快速查询时间,对于时间敏感的应用是很有必要的


准备材料
  • Ameba x 1


范例说明
RTC 模组会帮助微控制器来追踪时间,是时间模组必须的一部分。我们在这里有一个示例,来展示如何来得到本地时间和上传时间。
复制下面的代码贴至REPL,观察结果。

  1. rtc = RTC()
  2. rtc.datetime() # get date and time
  3. rtc.datetime((2020, 12, 31, 4, 23, 58, 59, 0)) # set a specific date and time (year, month, day, weekday(0 for Monday), hour, minute, second, total seconds)
  4. rtc.datetime() # check the updated date and time
复制代码



回复

使用道具 举报

2

主题

269

回帖

275

积分

高级会员

积分
275
发表于 2021-5-25 20:19:44 | 显示全部楼层
simon西 发表于 2021-5-24 17:47
是双核没有错,但是目前的版本只有开放大核(200MHz)给用户使用,小核(20MHz)主要是做硬件启动和节电 ...

明白了,谢谢解答
回复

使用道具 举报

27

主题

20

回帖

101

积分

初级会员

积分
101
 楼主| 发表于 2021-5-31 19:06:38 | 显示全部楼层
SPI - 作为从设备接收消息


SPI作为单片机上常见的高速通讯协议之一,也是非常必要的,下面就用一个Arduino UNO来和使用MicroPython的瑞昱RTL8722DM 物联网单片机使用SPI来一个“深入交流”

材料准备
  • Ameba x 1, Arduino UNO x 1
范例说明
SPI是一种快速且强大的通讯协议,并通常在微处理器中被用来接受传感器的数据或输出图像讯号。在这个示例中将示范ameba如何透过MicroPython以从属模式接收数据。
在通讯连接建立之前,需要先将以下代码烧录到Arduino UNO。
  • ///////////////////////
  • // SPI Master Write //
  • ///////////////////////
  • #include
  • void setup (void) {
  •    Serial.begin(115200); //set baud rate to 115200 for usart
  •    digitalWrite(SS, HIGH); // disable Slave Select
  •    SPI.begin ();
  • }
  • void loop (void) {
  •    char c;
  •    digitalWrite(SS, LOW); // enable Slave Select
  •    // send test string
  •    for (const char * p = "Hello, world!\r" ; c = *p; p++) {
  •       SPI.transfer(c);
  •       Serial.print(c);
  •    }
  •    Serial.println();
  •    digitalWrite(SS, HIGH); // disable Slave Select
  •    delay(2000);
  • }

[color=rgb(51, 102, 153) !important]复制代码


Arduino UNO将以如下图所示的连接方式和Ameba连接,我们使用第“0”组SPI作为从机, 并将Arduino UNO当作SPI的主机。
然后复制以下代码并粘贴到REPL的粘贴模式窗口,并等待代码生效。

  • from machine import SPI
  • s1= SPI(0 , mode = SPI.SLAVE)
  • for i in range(14):
  • chr(s1.read())

[color=rgb(51, 102, 153) !important]复制代码



回复

使用道具 举报

27

主题

20

回帖

101

积分

初级会员

积分
101
 楼主| 发表于 2021-6-2 16:13:23 | 显示全部楼层

Time - 延迟和计时

时间控制是所有单片机应用的核心,MicroPython上也不例外,接下来我们一起来看看Time模块在RTL8722DM上的表现和使用吧~

材料准备
  • Ameba x 1
范例说明
MicroPython 提供了很多函数来处理延迟和计时,以下是一些示例。
复制下面的代码至REP来观察结果。


  1. import time
  2. time.sleep(1) # sleep for 1 second
  3. time.sleep_ms(500) # sleep for 500 milliseconds
  4. time.sleep_us(10) # sleep for 10 microseconds
  5. start = time.ticks_ms() # get millisecond counter
复制代码

回复

使用道具 举报

27

主题

20

回帖

101

积分

初级会员

积分
101
 楼主| 发表于 2021-6-4 18:31:52 | 显示全部楼层
Timer -周期性定时器


Timer的用处非常广泛,从安排周期性任务到PWM运行,甚至RTOS都是基于Timer的运用,在RTL8722DM上面用MicroPython来控制Timer也是很简单的,一下来看一下示例吧,

材料准备
  • Ameba x 1
范例说明
这里有3个定时器可以使用, 全部是32kHz, 分别是定时器1/2/3。
我们使用定时器1来示范一个周期性定时器是怎样工作的。
复制下面最初的3行代码至REPL来查看结果。
  • from machine import Timer
  • t = Timer(1) # Use Timer 1/2/3 only
  • t.start(2000000, t.PERIODICAL) # Set GTimer fired periodically at duration of 2 seconds, printing text on the terminal
  • # To stop the periodical timer, type
  • t.stop()

[color=rgb(51, 102, 153) !important]复制代码


信息“–timer triggered. to stop: type t.stop()–” 每2秒会被打印在端口。如需停止定时器, 输入 t.stop()。

回复

使用道具 举报

27

主题

20

回帖

101

积分

初级会员

积分
101
 楼主| 发表于 2021-6-7 18:41:43 | 显示全部楼层
UART - 发送和接收


串口的重要性不必多言,从调试日志到下载固件,硬件沟通,样样精通,所以RTL8722上的UART模块也做的小巧轻快,方便大家轻松上手!
材料准备
  • Ameba x 1, USB转TTL串行模块 x 1
范例说明
UART是一种非常通用的通信协议,是微控制器的一个重要组成部分。 USB转TTL串行传输模块是一种可以将UART信号转换为USB信号的集成电路,以便我们可以在PC上看到UART日志。该模块经常用于包括Ameba在内的许多开发板上。但是,该模块在Ameba上的功能被保留用于LOG UART和固件上传,所以我们需要其他独立模块在Ameba和PC之间进行通信。


在此示例中,我们使用第“0”组UART引脚来示范UART在Ameba上的工作方式。
如下图所示,将USB转TTL串行传输模块连接到引脚PA_21和PA_22
然后,将以下代码逐行复制并粘贴到REPL中,以查看其效果。

  1. from machine import UART
  2. uart = UART(tx="PA_21", rx= "PA_22")
  3. uart.init()
  4. uart.write('hello')
  5. uart.read(5) # read up to 5 bytes
复制代码


回复

使用道具 举报

27

主题

20

回帖

101

积分

初级会员

积分
101
 楼主| 发表于 2021-6-9 18:06:23 | 显示全部楼层
WiFi 扫描

终于来到最激动人心的时刻--RTL8722DM最大的特色就是双频WiFi,2.4Ghz和5GHz通吃,让你的wifi无死角,使用wifi scan功能还可以轻松扫描出所有附近的WiFi信号,想连哪个连哪个!

材料准备
  • Ameba x 1


范例说明
WiFi扫描功能可以帮助我们快速发现周围有哪些WiFi网络。该范例不需要任何其他硬件,因此只需复制以下代码并将其粘贴到REPL中即可查看其作用。

  1. from wireless import WLAN
  2. wifi = WLAN(mode = WLAN.STA)
  3. wifi.scan()
复制代码

扫描发现周围的WiFi就是这么简单~


回复

使用道具 举报

27

主题

20

回帖

101

积分

初级会员

积分
101
 楼主| 发表于 2021-6-11 12:14:59 | 显示全部楼层
WiFi 连接


扫描WiFi之后,就可以连接上你想要的WiFi网络啦,方法很简单,只需要在wifi.connect() API里面输入WiFi名字和密码就好啦,

材料准备
  • Ameba x 1
范例说明
Ameba可以使用开放安全性或WPA2安全类型连接到WiFi接入点,WPA2安全类型是家用无线路由器中最常用的安全类型。在这里我们将使用下面的代码连接到WiFi接入点,将以下代码逐行复制并粘贴到REPL中,以查看其作用。

  1. from wireless import WLAN
  2. wifi = WLAN(mode = WLAN.STA)
  3. wifi.connect(ssid = "WiFi名字", pswd = "WiFi密码")
复制代码

撇除第一行import,实际上只用了2行Python代码就能搞定,是不是很方便?



回复

使用道具 举报

27

主题

20

回帖

101

积分

初级会员

积分
101
 楼主| 发表于 2021-6-14 17:04:39 | 显示全部楼层
Socket - Echo服务器与客户端

WiFi网络沟通最简单的就是使用Socket来进行点对点的沟通,想要知道你搭建的Server和client有没有正确的运作,就可以找来两个可以使用WiFi的设备,让他们之间互联并且echo(回应同样的信息)彼此的信息来做验证,以下就是上手啦,


材料准备
  • Ameba x 2
范例说明
WiFi连接完成后即可使用Socket来使用网路。 Socket就像一个假想的乙太网路介面,你可以用它把你的PC连接到互联网上的服务器上,比如Google或Github。即使是像HTTP这样的应用层协议也是建立在socket之上的。一旦给定了IP地址和端口号,就可以自由地连接到远程设备并与其进行通信。连接流程如下图所示。
下面是一个使用服务器socket和客户端socket互相传送消息的范例,要使用这个范例,您需要两个ameba RTL8722来运行MicroPython,在REPL 的paste模式下分别将下面的代码复制并粘贴到两个ameba。
以下是服务器代码
  1. import socket
  2. from wireless import WLAN
  3. wifi = WLAN(mode = WLAN.STA)
  4. wifi.connect(ssid = "YourWiFiSSID", pswd = "YourWiFiPassword") # change the ssid and pswd to yours
  5. s = socket.SOCK()
  6. port = 5000
  7. s.bind(port)
  8. s.listen()
  9. conn, addr = s.accept()
  10. while True:
  11.     data = conn.recv(1024)
  12.     conn.send(data+"from server")
复制代码

以下是客户端代码

  1. import socket
  2. from wireless import WLAN
  3. wifi = WLAN(mode = WLAN.STA)
  4. wifi.connect(ssid = "YourWiFiSSID", pswd = "YourWiFiPassword") # change the ssid and pswd to yours
  5. c = socket.SOCK()
  6. # make sure to check the server IP address and update in the next line of code
  7. c.connect("your server IP address", 5000)
  8. c.send("hello world")
  9. data = c.recv(1024)
  10. print(data)
复制代码


这样,你在客户端(client)这边发送的hello world就会被服务器端收到并打印出来了


回复

使用道具 举报

27

主题

20

回帖

101

积分

初级会员

积分
101
 楼主| 发表于 2021-6-16 19:02:11 | 显示全部楼层
Socket - 从HTTP网站获取信息

上次只是本地的socket互相发送东西,这次,我们直接用socket来从MicroPython的官网上面抓一点网站上的信息下来,同样很简单,但是为了简化步骤,下面的示例定义了一个function从而可以让代码更清晰,

材料准备
  • Ameba x 1
范例说明
创建socket后,我们可以访问HTTP网站并从中获取信息。在粘贴模式下,将以下代码复制并粘贴到REPL中。

  1. import socket
  2. from wireless import WLAN
  3. wifi = WLAN(mode = WLAN.STA)
  4. wifi.connect(ssid = "YourWiFiSSID", pswd = "YourPassword") # change the ssid and pswd to yours

  5. def http_get(url):
  6.     _, _, host, path = url.split('/', 3)
  7.     c = socket.SOCK()
  8.     # We are visiting MicroPython official website's test page
  9.     c.connect(host, 80)
  10.     c.send(bytes('GET /%s HTTP/1.0\r\nHost: %s\r\n\r\n' % (path, host), 'utf8'))
  11.     while True:
  12.         data = c.recv(100)
  13.         if data:
  14.             print(str(data,'utf8'), end='')
  15.         else:
  16.             break

  17. http_get('http://micropython.org/ks/test.html')
复制代码

如果你收到“It's working if you can read this!”的字符串打印在REPL上,就说明你成功了! 恭喜,物联网已经成功走出大门了!

回复

使用道具 举报

27

主题

20

回帖

101

积分

初级会员

积分
101
 楼主| 发表于 2021-6-18 18:55:14 | 显示全部楼层
SDFS - SD卡的读写1


文件系统可以帮助我们存储和读取较大的文件,特别适合网络传输所用的html文件,图片文件或是音频视频文件,如何使用RTL8722DM上面的SDIO来快速读写呢? 请看下面,


  1. import sdfs

  2. s=sdfs            # create a short form
  3. s.listdir()       # listing the files and folders under current path
  4. s.mkdir("test")   # create a folder named "test" under current path
  5. s.chdir("test")   # change directory to test folder
  6. s.pwd()           # print out present working directory(current path)
  7. s.chdir("/")      # change directory bach to root directory
  8. s.rm("test")      # delete the test folder
复制代码




MicroPython这边使用了和linux相似的API命名方式,方便大家快速、直观的上手, listdir就是展示当前所有文件,mkdir就是创建文件夹,以此类推
回复

使用道具 举报

27

主题

20

回帖

101

积分

初级会员

积分
101
 楼主| 发表于 2021-6-21 18:38:31 | 显示全部楼层
SDFS - SD卡的读写2

上次看了文件系统的文件夹管理,这次着重看一下文件的处理:


  1. import sdfs

  2. s=sdfs                  # create a short form
  3. s.create("ameba.txt")   # create a file named "ameba.txt"
  4. s.write("ameba.txt", "ameba supports sd card file system!") # write a string to the file just created
  5. s.read("ameba.txt")     # read the content from the same file
  6. s.rm("ameba.txt")       # delete the file
复制代码



开心的话就用create()创建一个新的文件“ameba.txt" , 不开心就可以用rm()来删除它,是不是超方便?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 05:58 , Processed in 0.225274 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表