【得捷电子Follow me第1期】规定动作1-2-3-4
[复制链接]
本帖最后由 北方 于 2023-5-11 14:44 编辑
得捷电子活动的规定动作
1、概述
感谢得捷电子和EEworld共同推出的活动,展示和记录以Raspberry Pi Pico W为核心的学习过程。在 Raspberry Pi Pico 基础上增加了一个经过认证的2.4GHz 802.11n无线模块,使其成为需要无线通信项目的理想解决方案。
通过以下的四个基本测试,可以完成快速了解的过程,从而准备完成自由设定的任务。
2、硬件
本次活动用到的硬件有5项
2.1 主控板:Raspberry Pi Pico w ——RP2040 收发器; 802.11 b/g/n(Wi-Fi,WiFi,WLAN) 2.4GHz 评估板,具有以下功能。
• 采用了 Raspberry Pi 官方自主设计的 RP2040 微控制器芯片, 搭载了双核 ARM Cortex M0 + 处理器,运行频率高达 133MHz 灵活时钟(可超频)
• 内置了 264KB 的 SRAM 和 2MB 的片上 Flash
• 板载2.4GHz无线接口芯片(802.11n或Wifi4), 支持蓝牙 5.2
• USB1.1 主机和设备支持
• 多达 26 个多功能的 GPIO 引脚
• 2 个 SPI,2 个 I2C,2 个 UART,3 个 12 位 ADC,16 个可控 PWM 通道
• 精确的片上时钟和定时器, 温度传感器
2.2 扩展板:103100142——方便将pico w开发板的信号引出,连接到各种 grove 设备
2.3 屏幕:104020208——I2C接口 单色 OLED显示屏,可以通过编程显示各种文字、图案
2.4 外设1:107020000——蜂鸣器,可以通过GPIO驱动发出声音
2.5 外设2:109020022——高性能、高集成度、低功耗的多模卫星定位导航模块,支持GPS/北斗/Galileo等多种定位系统主控板:Raspberry Pi Pico w ——RP2040 收发器; 802.11 b/g/n(Wi-Fi,WiFi,WLAN) 2.4GHz 评估板
3、规定的基本任务
3.1 任务1:熟悉thonny软件与micropython的基本语法
3.1.1 基于Rpi Pico W的开发工具有很多选择,其中thonny是最便捷和快速的,安装方法简单,在已经安装好python的电脑上,使用如下pip命令安装,
pip install thonny
直接输入
thonny
就可以启动,进入如下GUI的界面
这个工具分为上下两个主视窗,上面的是代码编辑区域,下面是输出区域。右下角的硬件状态显示当前的软件和硬件状态,即可以用本地python调试运行,也可以直接在PICO的硬件平台上编辑后运行
3.1.2 更新Miropython固件
从https://datasheets.raspberrypi.com/soft/micropython-firmware-pico-w-290622.uf2,下载固件micropython-firmware-pico-w-290622.uf2,
然后,按着PICO板上的BootSEL键插入USB接口上电,这时会显示为USB优盘模式,把micropython-firmware-pico-w-290622.uf2拖拽入这个新增的优盘,就实现了固件更新和下载的过程,
复制完这个新增的优盘就消失了,但是,已经启动了miropython固件,可以现在选择在PICO上开发和使用了。
3.1.3 MicroPython的语法和使用
MicroPython是标准python语句的一个子集,可以在https://micropython.org/help/ 这个官网上查到使用的说明和更新的手册。
具体到Pico开发板,有专门的页面,在标准库之外,还列出了完整的外设库
具体有如下库可以执行对硬件的访问,
-
PWM (pulse width modulation)
-
ADC (analog to digital conversion)
-
NeoPixel and APA106 driver
这样的资料也可以在https://www.raspberrypi.com/documentation/microcontrollers/这里找到。
简单设定主频的代码如下
import machine
machine.freq() # get the current frequency of the CPU
machine.freq(240000000) # set the CPU frequency to 240 MHz
点击保存,可以在Pico开发板上保存,并在上电后自动运行。
3.1.4 任务一小结
基于Raspberry Pico W的micropython固件更新及开发,使用thonny就可以快速完成,避免了复杂过程,快捷有效。
3.2 任务2:驱动外设
本任务使用的搭配器件:有Raspberry Pi Pico w开发板、GROVE SHIELD、GROVE OLED扩展板、GROVE BUZZER扩展板
3.2.1 驱动LED
本任务驱动板载LED,直接调用外设库machine,然后对led直接写入数值,加上延时函数就可以简单完成,代码如下,
import machine
import time
led = machine.Pin('LED', machine.Pin.OUT)
while (True):
led.on()
time.sleep(.5)
led.off()
time.sleep(.5)
显示图片如下,
视频效果如下
webwxgetvideo
LED控制运行成功。
3.2.2 驱动OLED显示屏
这里选用的OLED是I2C驱动的0.96点阵128x64的OLED,原理如下,
这样,这款SSD1315驱动,可以直接下载SSD1306驱动使用, , 下载后直接复制到Pico W开发板,
也可以直接在包管理器里面搜索,选择合适的下载,可以直接下载到PicoW开发板
然后的开发就是引用这个库,按照API的说明写代码就好了。连接到I2C0的接口,代码如下,
# OLED test
# 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(0) # 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")
#buffer = bytearray(b"\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x7f \xff \x00 \x00 \x00 \x00 \x00 \x1f \xff \xff \xfc \x00 \x00 \x00 \x41 \xff \xff \xff \xff \xc0 \x00 \x01 \x07 \xff \xff \xff \xff \xf8 \x00 \x02 \x3f \xff \xff \xff \xff \xfe \x00 \x08 \x7f \xff \xff \xff \xff \xff \x80 \x11 \x81 \x9f \xf3 \xe6 \x1f \xff \xc0 \x23 \x80 \x0f \xe3 \xc4 \x3f \xff \xf0 \x07 \x80 \xdf \xfb \xc4 \x7f \xff \xf8 \x4f \x19 \x10 \x03 \xc0 \xc0 \x08 \xf8 \x1f \x11 \x00 \x23 \xc1 \x80 \x08 \xfc \x1f \x10 \x02 \x00 \x03 \x88 \x08 \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("Raspberry Pi",5,5)
oled.text("Pico",5,15)
# Finally update the oled display so the image & text is displayed
oled.show()
运行结果如下,对应I2C的编号和通道参数,
照片如下,
OLED显示控制成果,其中自己制作了得捷的logo做成buff文件,显示代码有误,还需要再找找明确的说明才好。因为看源代码有文件头的description,含义待定。
3..2.3 驱动蜂鸣器
驱动蜂鸣器,可以用直接用pwm的驱动控制实现,因为语音的感受程度在20Hz~2000Hz之间,完全在PWM驱动范围内无压实现,这个范例实现的是频率从200Hz到2400Hz的逐步变化,到最高之后再从最低开始重新升高频率。代码如下,
import machine
import time
pizzo = machine.Pin(20)
pwm1 = machine.PWM(pizzo)
frep1 = 100
pwm1.freq(frep1)
pwm1.duty_u16(32768)
while True:
frep1 += 100
pwm1.freq(frep1)
time.sleep(.5)
if frep1 > 2400:
frep1 = 200
硬件连接有了grove开发板,就变得极其简单,如下,其中GROVE接口上有编号,这里选择了D20端子对应Pizzo的SIG信号线,运行通过。
3.3同步网络时间
3.3.1 同步网络时间,主要是学习网络的连接和参数查看等方法,网络同步时间是其中的应用。网络同步时间是专门提供一个网络时间同步服务器,不断给访问提供时间反馈和时间戳,这样,发送者从发送和接受的时间对比,可以比较精确地算出网络时延补偿,减去反馈的时间戳就是实际时间。这个就是ntp协议的主要内容。这个功能可以自己计算,也可以直接引入包。
这个功能,只用Raspberry Pi Pico w开发板就可以实现的。
3.3.2 network模块用法
Network模块是标准库,具体用法参加https://datasheets.raspberrypi.com/picow/connecting-to-the-internet-with-pico-w.pdf
总体来说,这个和arduino的wifi库相似,都是高度封装,只需要输入联网热点数据,依次执行连接,就可以读取信息并反馈数据。具体示例如下。
3.3.3 连接网络、查看网络参数等用法,
首先建立一个秘密代码文件,把有关认证信息录入。
class code:
def __init__(self):
self.ssid = ' '
self.pwd=' '
然后就可以连接网络
import network
import SECRECODE as sec
import time
#import ntptime
ssid=sec.code()
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid.ssid, ssid.pwd)
while not wlan.isconnected() and wlan.status() >= 0:
print("Waiting to connect:")
time.sleep(1)
print(wlan.ifconfig())
这样的连接后,就可以按照wifi协议读取网络数据并输出如MAC地址这样的数据
mac = ubinascii.hexlify(network.WLAN().config('mac'),':').decode()
print(mac)
print(wlan.config('channel'))
print(wlan.config('essid'))
print(wlan.config('txpower'))
3.3.4 实现通过网络同步系统时间。
这个采用封装的ntptime,首先在thonny的会话框,如下安装ntptime
import upip
upip.install("ntptime")
然后就可以直接引入并使用,见如下代码
import time
import utime
import machine
import ntptime
ntptime.NTP_DELTA = 3155644800
ntptime.host = 'ntp1.aliyun.com'
ntptime.settime()
print( time.localtime(time.time()))
rtc = machine.RTC()
while True:
t = rtc.datetime()
print(t)
time.sleep(5)
3.4 实现定位功能
3.4.1 掌握GNSS模块用法
器件:Raspberry Pi Pico w开发板、GROVE - GPS扩展板
GNSS是GPS定位功能,这个是Air530模块支持的全球定位系统模块,这个模块是通过UART串口进行数据交互的,具体搜索卫星和卫星定位的算法都是在模块内实现的。
在pico W中使用GPS功能,更进一步把UART的AT命令会话过程封装成gps库,可以直接简化读取。
3.4.2实现定位功能。
首先需要安装GPS模块,访问 ,然后下载其中的
根据源代码 ,可以直接使用这个文件库
直接读取gps坐标
from machine import Pin
import time
from gps import MicropyGPS
from machine import UART
com = UART(0,baudrate=9600, tx=Pin(0), rx=Pin(1))
my_gps = MicropyGPS(8)
my_gps.local_offset
time.sleep(1)
cc = com.readline()
for x in cc:
my_gps.update(chr(x))
gps_values = str(my_gps.latitude[0] + (my_gps.latitude[1] / 60)) + ',' + str(my_gps.longitude[0] + (my_gps.longitude[1] / 60))
print(gps_values)
对时间的访问和读取如下
#Print time
timestamp = my_gps.timestamp
hour = timestamp[0]
rtc = str(int(timestamp[0]))+":"+str(int(timestamp[1]))+":"+str(int(timestamp[2]))
print("Time:" + str(rtc))
4、小结
感谢得捷电子提供的完整开发工具和实用的工程包,这样可以避免了很多常见的坑。整个规定动作简单到令人发指,但是背后却凝聚了大量的适配和开发工作。
目测当下的这个Raspberry Pi Pico平台,含Pico W能够做到极简上手,极速开发,非常适合创客和艺术创作者使用。如果不是需要分析背后的代码库的使用和原理,都不像是攻城狮的本行。
那么,这样的平台,吸引者每个人去尝试做一下自选动作,看能够实现什么样的成果。
|