【得捷电子Follow me第1期】+ Raspberry Pi Pico W 汇总
[复制链接]
本帖最后由 qwert1213131 于 2023-6-14 20:32 编辑
6月14日
以前搞开发的时候都是使用的C语言,采用编译、下载的方式,很耗时;而使用micropython作为开发单片机的语言,就可以简化开发流程,非常感谢得捷和eeworld论坛举办的活动。
任务1:熟悉micropython的基本语法
向Raspberry Pi Pico w开发板烧写固件
在插入usb之前,按住BOOTSEL按钮,然后插入usb,就会出现一个盘符为RPI-RP2的U盘。
打开INFO_UF2.TXT,里面记录了板子的一些信息
点击U盘中的HTM文件,则会跳转到树莓派的网站,可以查看开发板的相关资源
点击上图的MicroPython则可以跳转到页面并下载相关固件
下载的固件是uf2格式的文件,将其拖入到u盘中,传输完成后,开发板就会自动重启
安装Mu软件,去官网下载安装即可
https://codewith.mu/en/
点击REPL按钮可看到如下信息
至此,开发板就已经可以正常使用micropython来开发了。
Hello World
想要通过串口打印hello world,则只要调用print函数即可,简直不要太简单了
print('Hello World')
1s间隔打印一次
import time
while True:
print('Hello World')
time.sleep(1.0)
使用for循环遍历列表
list_fruit_cn = ['苹果','桔子','樱桃','香蕉']
for fruit in list_fruit_cn:
print(fruit)
任务2:驱动外设
使用Pin模块来驱动led闪烁
from machine import Pin
import time
led = Pin('LED',Pin.OUT)
while True:
led.toggle()
time.sleep(0.5)
驱动OLED,使用I2C模块
使用ssd1306库
from machine import Pin, I2C
i2c1 = I2C(1,sda=Pin(6), scl=Pin(7))
from ssd1306 import SSD1306_I2C
oled = SSD1306_I2C(128, 64, i2c1)
import time
oled.fill(1)
oled.show()
time.sleep(1.0)
oled.fill(0)
oled.show()
time.sleep(1.0)
oled.text('Hello', 0, 0)
oled.text('World', 0, 10)
oled.show()
驱动蜂鸣器
将gpio16引脚连接无源蜂鸣器,使用PWM模块来驱动发声
from machine import Pin, PWM
import utime
pwm0 = PWM(Pin(16)) # create PWM object from a pin
pwm0.freq() # get current frequency
pwm0.freq(1000) # set frequency
pwm0.duty_u16() # get current duty cycle, range 0-65535
pwm0.duty_u16(1000) # set duty cycle, range 0-65535
utime.sleep(1.0)
pwm0.deinit() # turn off PWM on the pin
任务3:同步网络时间
使用network模块来配置和连接网络
import network
import time
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect('wifi','pass')
while not wlan.isconnected() and wlan.status()>=0:
print("Waiting to connect:")
time.sleep(1)
print(wlan.ifconfig())
通过ntptime模块来获取网络时间
import ntptime
while True:
try:
print('获取时间中')
ntptime.host = 'ntp1.aliyun.com'
ntptime.settime()
print('成功获取')
break
except:
print('获取失败')
time.sleep(1)
while True:
print(time.localtime())
time.sleep(1.0)
任务4:实现定位功能
定位解析使用了大佬的库
主要使用了UART模块,与Air530模块进行通信
from machine import Pin, I2C, UART
i2c1 = I2C(1,sda=Pin(6), scl=Pin(7))
from ssd1306 import SSD1306_I2C
oled = SSD1306_I2C(128, 64, i2c1)
import time
oled.fill(0)
oled.text('GPS', 0, 0)
oled.show()
time.sleep(1.0)
import hashlib
from micropyGPS import MicropyGPS
my_gps = MicropyGPS(local_offset=8)
uart0 = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1))
while True:
if uart0.any()>0:
# print(uart0.read(1))
state = my_gps.update(uart0.read(1).decode('utf-8'))
if state:
state = None
oled.fill(0)
lat_disp = my_gps.latitude_string()
oled.text(lat_disp,5,10)
lon_disp = my_gps.longitude_string()
oled.text(lon_disp,5,20)
date_disp = my_gps.date_string('s_mdy')
oled.text(date_disp,5,30)
time_disp = str(my_gps.timestamp[0]) +':'+str(my_gps.timestamp[1])+':'+str(my_gps.timestamp[2])
oled.text(time_disp,5,40)
oled.show()
已经可以看到获取到的时间了,不过因为在房间的缘故,定位信息获取的比较慢,还得在窗户边;
不过在室外应该就能很容易获取位置信息了,可以在视频中看到
任务5:随机获取网站的小猫图片
这个项目主要是从http://placekitten.com/网站获取不同尺寸的小猫图片,并显示到TFT彩屏上,因此需要用到PICO W的很多功能模块
network负责wifi的连接
urequests负责网站资源的获取
random用来随机生成图片的尺寸
SPI用来与st7789的1.3寸屏幕通信
JPEGdecoder负责jpeg图片的解析
除此之外还需要用到外部驱动,JPEGdecoder.py和st7789py.py
# 在这里写上你的代码 :-)
import network
import time
import gc
import urequests
import random
from machine import Pin,SPI
#from machine import Pin,SoftSPI,
import st7789py as st7789
spi = SPI(0, baudrate=20_000_000, polarity=1, phase=1, bits=8, sck=Pin(6), mosi=Pin(7), miso=Pin(4))
# spi = SoftSPI(baudrate=30000000, polarity=1, sck=Pin(6), mosi=Pin(7), miso=Pin(4))
tft = st7789.ST7789(
spi,
240,
240,
reset=Pin(9, Pin.OUT),
cs=Pin(5, Pin.OUT),
dc=Pin(8, Pin.OUT),
backlight=Pin(13, Pin.OUT),
rotation=0)
tft.fill(st7789.BLACK) # clear screen
print(gc.mem_free())
gc.collect() # We're really gonna need that RAM!
print(gc.mem_free())
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect('ssid','pass')
while not wlan.isconnected() and wlan.status()>=0:
print("Waiting to connect:")
time.sleep(1)
print(wlan.ifconfig())
# 访问ip地址 api
html = "http://placekitten.com/{0}/{1}"
WIDTH=100
HEIGHT = 100+random.randint(0,10)
html = html.format(WIDTH,HEIGHT)
print(html)
r = urequests.get(html)
# print(r)
# print(r.content) # 返回响应的内容
print("size:%d" % len(r.content))
def rgb24_to_rgb565(color24):
r = (color24>>16) &0xff
g = (color24>>8) &0xff
b = (color24>>0) &0xff
r = (r >> 3) & 0x1F
g = (g >> 2) & 0x3F
b = (b >> 3) & 0x1F
return (r << 11) | (g << 5) | b
def draw(x,y,color):
# tft.pixel(x,y,rgb24_to_rgb565(color))
tft.rect(x*2,y*2,2,2,rgb24_to_rgb565(color))
print("T:%d" % time.ticks_ms())
from JPEGdecoder import jpeg
jpeg(r.content,4,callback=draw ).render(10, (120-HEIGHT)>>1)
print("T:%d" % time.ticks_ms())
print(gc.mem_free())
# It's mandatory to close response objects as soon as you finished
# working with them. On MicroPython platforms without full-fledged
# OS, not doing so may lead to resource leaks and malfunction.
r.close()
print(gc.mem_free())
gc.collect() # We're really gonna need that RAM!
print(gc.mem_free())
这就是网站获取到的图片,未来可以考虑将TFT屏幕换成大一些墨水屏,可以更新不同的猫猫图片,又省电有好玩。
再次感谢本次活动,终于体会到了用micropython开发的乐趣。
希望第二期能尽早举办,多多参与。
相关源代码
codes.zip
(22.63 KB, 下载次数: 1)
|