项目总结
本来是想自己上传视频的,没想到文件太大了,只能这样子了
项目描述
1. 前言
由于本人能力及精力有限,所以本期活动只完成了前四项任务,至于第五项拓展任务并没有完成,对此感到十分抱歉。
2. 自我介绍
各位电子工程世界的网友,大家好!我是bitter,很高兴能够参与本次由得捷电子与电子工程世界举办的follow me 第1期活动。本人是一名刚刚步入职场的嵌入式工程师,在大学时只学习过C语言与51单片机、stm32单片机,工作后也慢慢的接触了一些其它的芯片、开发板。但是,本次活动无论是使用的micropython编程还是使用树莓派 PICO W,对于我而言都是一种全新的体验。十分感谢得捷电子与电子工程世界,让我能够接触一些新鲜事物。
3. 硬件介绍
本次活动使用了树莓派PICO W开发板、拓展板、LCD屏幕、蜂鸣器和卫星定位导航模块。
首先介绍树莓派PICO W开发板。这块开发板搭载了双核ARM Cortex M0 +处理器,运行频率高达133MHz灵活时钟,板载2.4GHz无线接口芯片,多达26个多功能的GPIO引脚,2个SPI,2个I2C,2个UART,3个12位ADC,16个可控PWM通道。本次活动,主要使用到了GPIO、I2C、UART、PWM等外设和板载的2.4GHz无线接口芯片。
然后,是其它的一些硬件外设。拓展板:利用这个拓展板,我们可以很方便的将树莓派PICO W开发板的信号引出,从而可以很方便的连接各种外设。屏幕:使用I2C接口,单色(白色)OLED屏幕,无源显示模式,点像素为128*64,控制器类型为SSD1315,可以通过编程显示各种图案和文字。蜂鸣器:使用GPIO驱动即可发出声音,其产生的谐振频率为2300±300Hz。GPS(AIR530)模块:高性能、高集成度、低功耗的多模卫星定位导航模块,支持GPS/北斗/Galileo等多种定位系统,使用UART进行通信。
4. 任务过程
1) 首先,我们将最新的固件下载到树莓派PICO W开发板后,下载Mu Editor并选择对应的树莓派 RP2040模式,即可进行编译开发了。在这个过程中,我学会了如何使用Mu Editor,对micropython也有了一些了解。
2) 根据手册,树莓派PICO W是通过WIFI芯片(CYW43439)外扩的IO口WL_GPIO0,因为树莓派PICO W已经对板载LED底层进行了封装,只需要调用“LED”这个对象即可。驱动其它外设,如蜂鸣器、屏幕等,也是如同驱动LED一样,十分的简单便捷。在这个过程中,我发现了micropython的强大和灵活性,对比于C语言,它是如此是的灵活与方便,但是同样也是因为这个原因,相比于C语言失去了一些严谨,对于底层的一些操作也不是很了解。
3) 使用树莓派PICO W板载的2.4GHz无线接口芯片,连接WLAN,参考网络参数,实现网络时间同步。在这个过程中,我掌握了一些有关network模块用法,对于WLAN的相关知识也有了更加深入的了解。这个开发板还支持蓝牙,可惜由于种种原因并没有体验一番,希望之后能有时间学习体验一下。
4) 最后,就是使用GPS模块了。通过接收卫星信号,使用UART通信,我们可以获取相应的地理位置信息。在这个过程中,我了解了定位模块的工作原理。
任务一:熟悉micropython的基本语法
1.固件下载
使用MicroUSB将pico-w开发板到PC,如果默认没有程序,就会枚举出存储设备。
从MicroPython - Python for microcontrollers网站中下载最新的固件,下载完成后,将对于的固件拖入移动盘即可,重启就可以使用micrioPython进行编程了。
2.下载Mu Editor并了解基本使用方法
从https://codewith.mu/en/download网站下载并安装完成后,我们打开Mu python时选择对应树莓派 RP2040模式即可。使用也是十分简便的,基本没什么难度。
我这里主要介绍一下文件的使用,点击文件后(如果无法点击,请先检查是否开启REPL,如果开启,点击REPL关闭REPL),会出现如下界面:
其中电脑上的文件是我们保存在本地的文件,当我们选择一个文件并右击它的时候会出现以下选项:
主要解释“写入到设备上的main.py”的意思,当我们选择这个选项后,会发现在设备的文件下会出现一个名为main.py的文件。在我们给树莓派上电之后会自动运行在设备的文件下的名为main.py的文件。选择电脑上的文件下的任意一个文件,用鼠标拖动到设备的文件下,即可实现复制。
3.micropython的基本语法
micropython的基本语法可以参考相关文档:Pico Python SDK使用手册。
虽然以前没用接触过python,但是毕竟也是学习过C语言的,所以一些基本的语法参考示例代码也是基本能看懂和使用的。下面主要介绍一些不太一样的:
def()函数
通过使用def,我们可以创建函数,提高应用的模块性和代码的重复利用率。可以参考一下这篇文章:Python教程——def()函数_python 函数def_Woo_home的博客-CSDN博客。
任务二:驱动外设
1.驱动LED
根据手册,树莓派PICO的LED是GPIO25,而树莓派PICO W是通过WIFI芯片(CYW43439)外扩的IO口WL_GPIO0,因为树莓派PICO W已经对板载LED底层进行了封装,只需要调用“LED”这个对象即可。
通过Shell调试窗口可以查询相关帮畔ⅲ琺achine.Pin类函数以及参数如下:
time类函数以及参数如下:
以下是直接间隔1秒点亮熄灭LED。
from machine import Pin
import time
led = Pin("LED",Pin.OUT)
while True:
led.value(1)
time.sleep(1)
led.value(0)
time.sleep(1)
2.驱动蜂鸣器
根据蜂鸣器的规格书可以知道只需要使用GIPO即可驱动蜂鸣器发出声音,其产生的谐振频率为2300±300Hz。
machine.PWM类函数以及参数如下:
接下来我们使用PWM波来驱动蜂鸣器发出不同频率的声音:
import time
from machine import Pin, PWM
pwm = PWM(Pin(20))
pwm.freq(1000)
duty = 0
direction = 1
for _ in range(8 * 256):
duty += direction
if duty > 255:
duty = 255
direction = -1
elif duty < 0:
duty = 0
direction = 1
pwm.duty_u16(duty * duty)
time.sleep(0.001)
如果相关演奏音乐的话,网上有大佬开源的,我们直接下载对应的文件导入进树莓派 PICO W即可。
3.驱动OLED
根据OLED的规格书可以知道OLED使用I2C进行通信,根据树莓派PICO W的数据手册,我们可以知道其一共有两个I2C接口,其参数如下:
machine.I2C类函数以及参数如下:
网上有大佬对SSD1306进行了开源,虽然我们这个是SSD1315,但是也是可以用的。 下载对应的文件导入PI PICO W中即可。
在OLED屏幕上显示信息:
# Display Image & text on I2C driven ssd1306 OLED display
from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
import framebuf
WIDTH = 128 # oled display width
HEIGHT = 64 # oled display height
i2c = I2C(1) # Init I2C using I2C0 defaults, SCL=Pin(GP9), SDA=Pin(GP8), freq=400000
print("I2C Address : "+hex(i2c.scan()[0]).upper()) # Display device address
print("I2C Configuration: "+str(i2c)) # Display I2C config
oled = SSD1306_I2C(WIDTH, HEIGHT, i2c) # Init oled display
# Raspberry Pi logo as 32x32 bytearray
buffer = bytearray(b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00|?\x00\x01\x86@\x80\x01\x01\x80\x80\x01\x11\x88\x80\x01\x05\xa0\x80\x00\x83\xc1\x00\x00C\xe3\x00\x00~\xfc\x00\x00L'\x00\x00\x9c\x11\x00\x00\xbf\xfd\x00\x00\xe1\x87\x00\x01\xc1\x83\x80\x02A\x82@\x02A\x82@\x02\xc1\xc2@\x02\xf6>\xc0\x01\xfc=\x80\x01\x18\x18\x80\x01\x88\x10\x80\x00\x8c!\x00\x00\x87\xf1\x00\x00\x7f\xf6\x00\x008\x1c\x00\x00\x0c \x00\x00\x03\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
# Load the raspberry pi logo into the framebuffer (the image is 32x32)
fb = framebuf.FrameBuffer(buffer, 32, 32, framebuf.MONO_HLSB)
# Clear the oled display in case it has junk on it.
oled.fill(0)
# Blit the image from the framebuffer to the oled display
oled.blit(fb, 96, 0)
# Add some text
oled.text("Hello!!!",5,5)
oled.text("Raspberry Pi",5,15)
oled.text("Pico",5,25)
# Finally update the oled display so the image & text is displayed
oled.show()
任务三:同步网络时间
1.学习network模块用法
根据树莓派PICO W的数据手册,树莓派PICO W拥有一个2.4 GHz无线接口,遵循802.11n标准。因此,当我们连接WiFi时,需要注意其支不支持2.4 GHz。具体的信息,可以参考:https://edm.eeworld.com.cn/digikey_followme_01_Connecting-to-the-internet-with-pico-w.pdf
2.掌握连接网络、查看网络参数等用法
连接网络并查看网络参数:
import network
import time
import ubinascii
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect('ChinaNet-vshV', 'tlhpqgjh')
while not wlan.isconnected() and wlan.status() >= 0:
print("Waiting to connect:")
time.sleep(1)
print(wlan.ifconfig())
mac = ubinascii.hexlify(network.WLAN().config('mac'),':').decode()
print(mac)
print(wlan.config('channel'))
print(wlan.config('essid'))
print(wlan.config('txpower'))
3.实现网络同步时间
NTP全称是Network Time Protocol,网络时间协议,是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正。Micropython中自带了ntptime库,我们参考官方历程调用即可。
import time
import network
ssid = 'ChinaNet-vshV' #wifi名称
password = 'tlhpqgjh' #wifi密码
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)
#尝试联网
max_wait = 10
while max_wait > 0:
if wlan.status() < 0 or wlan.status() >= 3:
break
max_wait -= 1
print('等待连接')
time.sleep(1)
#判断联网状态
if wlan.status() != 3:
raise RuntimeError('联网失败')
else:
print('网络已连接')
status = wlan.ifconfig()
print('ip = ' + status[0])
#访问互联网测试
import urequests
r = urequests.get("https://www.digikey.cn/zh")
print(r.status_code)
print(r.headers)
r.close()
def show_local_time(timezone=8):
rtc = RTC()
now = time.time()
now += timezone * 3600
t = time.localtime(now)
print(f'{t[0]} - {t[1]:02d}-{t[2]:02d} {t[3]:02d}:{t[4]:02d}:{t[5]:02d}')
#NTP网络校时演示
from machine import RTC
import ntptime
#先手动设置一个错误时间,模拟系统时间不准
rtc = RTC()
rtc.datetime((2020, 1, 1, 3, 9, 0, 0, 0)) #年、月、日、星期、时、分、秒、亚秒
print('校时前系统时间:')
show_local_time()
#NTP校时
print('开始NTP校时...')
ntptime.host = 'ntp1.aliyun.com'
ntptime.settime()
print('校时后系统时间:')
show_local_time()
任务四:实现定位功能
1.掌握GNSS模块用法
根据GROVE - GPS (AIR530)的数据手册,我们知道GROVE - GPS (AIR530)使用UART进行通信。
machine. UART类函数以及参数如下:
2.实现定位功能
根据网上大佬开源的代码,下载导入即可。
获取定位数据:
from machine import UART, Pin
import time
import hashlib
from micropyGPS import MicropyGPS
import framebuf
uart0 = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1))
time.sleep(0.1)
rxData = bytes()
my_gps = MicropyGPS()
while True:
if uart0.any():
stat = my_gps.update(uart0.read(1).decode('ascii')) # Note the conversion to to chr, UART outputs ints normally
if stat:
print('Latitude:', my_gps.latitude_string())
print('Longitude:', my_gps.longitude_string())
print('Speed:', my_gps.speed_string('kph'), 'or', my_gps.speed_string('mph'), 'or', my_gps.speed_string('knot'))
print('Date (Long Format):', my_gps.date_string('long'))
print('Date (Short D/M/Y Format):', my_gps.date_string('s_dmy'))
print('timestamp (Short [H,M,S] Format):', my_gps.timestamp)
stat = None
很高兴能够参加本期由EEWORLD和得捷电子共同举办得捷电子Follow me第1期活动。本期活动使用的开发板是树莓派Pico w开发板。这次活动,有很多的大佬参与进来,学习起来非常之方便。虽然以前没有接触过micropython,但是也是很方便的可以进行开发学习,这是因为micropython的生态非常好,学习资源也非常丰富。通过这次活动,我学习并巩固了以前所接触过或没有接触过的一些外设,学习起来非常方便。
最后,希望电子工程世界和得捷电子越办越好,以后能够多多的举办这样的活动,也希望大家能够从中收获满满。
|