940|1

83

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【得捷电子Follow me第1期】项目总结 [复制链接]

 
  • 演示视频

项目总结

本来是想自己上传视频的,没想到文件太大了,只能这样子了

  • 项目总结报告

项目描述

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的生态非常好,学习资源也非常丰富。通过这次活动,我学习并巩固了以前所接触过或没有接触过的一些外设,学习起来非常方便。

最后,希望电子工程世界和得捷电子越办越好,以后能够多多的举办这样的活动,也希望大家能够从中收获满满。

 

led.py

143 Bytes, 下载次数: 0

beep.py

319 Bytes, 下载次数: 0

buzzer_music.py

7.31 KB, 下载次数: 0

checkconfig.py

470 Bytes, 下载次数: 0

checktime.py

1.31 KB, 下载次数: 0

gps.py

872 Bytes, 下载次数: 0

micropyGPS.py

28.86 KB, 下载次数: 1

oled.py

1.63 KB, 下载次数: 0

ssd1306.py

4.48 KB, 下载次数: 0

最新回复

楼主的视频讲解的非常详细:)   详情 回复 发表于 2023-6-30 11:06
点赞 关注
 
 

回复
举报

2万

帖子

74

TA的资源

管理员

沙发
 

楼主的视频讲解的非常详细:)

加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
个人签名

加油!在电子行业默默贡献自己的力量!:)

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表