入门任务:开发环境搭建,BLINK,驱动液晶显示器进行显示(没有则串口HelloWorld)
搭配器件: W5500-EVB-Pico、 Adafruit Sharp Memory Display Breakout
一.搭建开发环境
背景:
I/O |
Pin Name |
Description |
I |
GPIO16 |
Connected to MISO on W5500 |
O |
GPIO17 |
Connected to CSn on W5500 |
O |
GPIO18 |
Connected to SCLK on W5500 |
O |
GPIO19 |
Connected to MOSI on W5500 |
O |
GPIO20 |
Connected to RSTn on W5500 |
I |
GPIO21 |
Connected to INTn on W5500 |
I |
GPIO24 |
VBUS sense - high if VBUS is present, else low |
O |
GPIO25 |
Connected to user LED |
I |
GPIO29 |
Used in ADC mode (ADC3) to measure VSYS/3 |
|
|
|
O |
GP10 |
SPI0 SCK (LCD) |
O |
GP11 |
SPI0 TX(LCD) |
I |
GP12 |
SPI0 RX(LCD) |
O |
GP13 |
SPI0 Csn(LCD) |
1.1 搭建CircuitoPython环境
本次任务使用CircuitPython完成任务,首先下载CircuitPython最新固件,可通过以下链接获取:
https://learn.adafruit.com/getting-started-with-raspberry-pi-pico-circuitpython/circuitpython
下载完成后,通过Thony下载uf2固件,步骤如下图:
1.2 安装WIZnet 库
安装WIZnet Ethernet 库,通过以下路径下载https://learn.adafruit.com/ethernet-for-circuitpython/circuitpython-setup
下载完成后将以下三个文件夹拷贝至CircuitPython文件夹
1.3 安装显示屏库
打开以下路径:https://github.com/adafruit/Adafruit_CircuitPython_Bundle/releases 下载8.x版本bundle库
下载完成后可按下图将相关库文件放至lib文件夹
至此我们已经完成了开发环境搭建,接着开始最经典的点灯环节。
import random
import time
from adafruit_display_text.label import Label
from terminalio import FONT
from adafruit_bitmap_font import bitmap_font
import board
import displayio
import framebufferio
import sharpdisplay
import digitalio
import busio
def LCD_Init():
#SPI1
SPI1_SCK = board.GP10
SPI1_TX = board.GP11
SPI1_RX = board.GP12
chip_select_pin = board.GP13
# Release the existing display, if any
displayio.release_displays()
#display setting
bus = busio.SPI(SPI1_SCK, MOSI=SPI1_TX, MISO=SPI1_RX)
# Select JUST ONE of the following lines:
# For the 400x240 display (can only be operated at 2MHz) 144*168
framebuffer = sharpdisplay.SharpMemoryFramebuffer(bus, chip_select_pin, 144, 168)
# For the 144x168 display (can be operated at up to 8MHz)
#framebuffer = sharpdisplay.SharpMemoryFramebuffer(bus, chip_select_pin, width=144,height=168, baudrate=8000000)
display = framebufferio.FramebufferDisplay(framebuffer)
return display
def show(display):
#creat the text label
label = Label(font=FONT, text="BLACK\nLIVES\nMATTER", x=0, y=4, scale=1,line_spacing=1.2)
#show it
display.root_group = label
def LED_Init():
led = digitalio.DigitalInOut(board.LED)
led.direction = digitalio.Direction.OUTPUT
return led
def led_flush(led):
led.value = not led.value
time.sleep(0.5)
def U_show():
print("hello world")
if __name__ == '__main__':
display = LCD_Init()
led = LED_Init()
show(display)
while True:
led_flush(led)
基础任务一:完成主控板W5500初始化(静态IP配置),并能使用局域网电脑ping通,同时W5500可以ping通互联网站点;通过抓包软件(Wireshark、Sniffer等)抓取本地PC的ping报文,展示并分析。
搭配器件: W5500-EVB-Pico、 Adafruit Sharp Memory Display Breakout
增加W5500 ping网功能
eth = WIZNET5K(spi_bus, cs, is_dhcp=False, mac=MY_MAC)
# Set network configuration
eth.ifconfig = (IP_ADDRESS, SUBNET_MASK, GATEWAY_ADDRESS, DNS_SERVER)
print("Chip Version:", eth.chip)
print("MAC Address:", [hex(i) for i in eth.mac_address])
print("My IP address is:", eth.pretty_ip(eth.ip_address))
基础任务二:主控板建立TCPIP或UDP服务器,局域网PC使用TCPIP或UDP客户端进行连接并发送数据,主控板接收到数据后,送液晶屏显示(没有则通过串口打印显示);通过抓包软件抓取交互报文,展示并分析。(TCP和UDP二选一,或者全都操作)
搭配器件: W5500-EVB-Pico、 Adafruit Sharp Memory Display Breakout
通过任务一我们已经开启了W550的网络功能,接着我们开启Socket通信,
# Initialize a socket for our server
socket.set_interface(eth)
server = socket.socket() # Allocate socket for the server
server_ip = None # IP address of server
server_port = 50007 # Port to listen on
server.bind((server_ip, server_port)) # Bind to IP and Port
server.listen() # Begin listening for incoming clients
conn, addr = server.accept() # Wait for a connection from a client.
print("socket connected")
结果:
1.通过串口打印可以获取Pico的IP为192.168.124.13,接着我们通过TCP工具与Pico进行连接,并发送“123456789 ”数据。
2.通过wireshark捕获IP 17向IP 13发送的数据,可以知道通信协议为TCP协议,数据为”123456789“。
进阶任务:从NTP服务器(注意数据交互格式的解析)同步时间,获取时间送显示屏(串口)显示。
搭配器件: W5500-EVB-Pico、 Adafruit Sharp Memory Display Breakout
注意库Ntp库没有recv函数没有写入接收长度,因此需对以下函数进行修改
核心代码
#NTP
ntpserver_ip = eth.pretty_ip(eth.get_host_by_name("ntp.aliyun.com"))
print("NTP : %s" % ntpserver_ip) #DNS Domain
ntp = NTP(iface = eth, ntp_address =ntpserver_ip ,utc=8)
cal = ntp.get_time()
print("The date is %s %d/%d/%d" %(days[cal.tm_wday], cal.tm_mday,cal.tm_mon,cal.tm_year))
print("The time is %d:%02d:%02d" %(cal.tm_hour,cal.tm_min,cal.tm_sec))
■ 终极任务二:使用外部存储器,组建简易FTP文件服务器,并能正常上传下载文件。
搭配器件: W5500-EVB-Pico、 Adafruit Sharp Memory Display Breakout
【得捷Follow me第4期】FTP文件服务器
因本人没有SD模块,因此使用Pico内存模拟内存,使用MicroPython作为开发语言(从鲜de芒果 坛友了解到circuitpython对存储访问的管理较为严格,实现文件存储比较复杂,因此转为使用MicroPython进行开发。
总结
我是第一次使用python对Pico进行开发,因此此次任务对我来说还是具有很强的学习意义的,非常感谢EEWORLD联合德捷的此次任务,给了我们很多学习的机会。因为第一次接触用python去开发Pico,由于工作繁忙,很多接口还不会使用,我会继续阅读学习使用c开发Pico,以熟悉此中开发方式原理并进行分享。
最后再次感谢EEWorld提供此学习机会及分享的平台。非常感谢
附录:
1.源码路径
2.视频说明