[作品提交] 【得捷Follow me第4期】+FTP服务器(任务汇总帖)

jone5   2024-2-25 12:06 楼主

入门任务:开发环境搭建,BLINK,驱动液晶显示器进行显示(没有则串口HelloWorld)

搭配器件: W5500-EVB-Pico、 Adafruit Sharp Memory Display Breakout

 一.搭建开发环境

背景:

image-20240225114152-1.png  

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

image-20240225114152-2.png  

下载完成后,通过Thony下载uf2固件,步骤如下图:

image-20240225114152-3.png  

 

image-20240225114152-4.png  

1.2 安装WIZnet 库

安装WIZnet Ethernet 库,通过以下路径下载https://learn.adafruit.com/ethernet-for-circuitpython/circuitpython-setup

下载完成后将以下三个文件夹拷贝至CircuitPython文件夹

 

image-20240225114152-5.png  

 

1.3 安装显示屏库

打开以下路径:https://github.com/adafruit/Adafruit_CircuitPython_Bundle/releases   下载8.x版本bundle库

image-20240225114152-6.png  

下载完成后可按下图将相关库文件放至lib文件夹

 

image-20240225114153-7.png  

 

至此我们已经完成了开发环境搭建,接着开始最经典的点灯环节。

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))

image-20240225114153-8.png  

 

基础任务二:主控板建立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“。

image-20240225114153-9.png  

 

image-20240225114153-10.png  

 

 

进阶任务:从NTP服务器(注意数据交互格式的解析)同步时间,获取时间送显示屏(串口)显示。

搭配器件: W5500-EVB-Pico、 Adafruit Sharp Memory Display Breakout

注意库Ntp库没有recv函数没有写入接收长度,因此需对以下函数进行修改

image-20240225114153-11.png  

 

核心代码

#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))

image-20240225114153-12.png  

 

■  终极任务二:使用外部存储器,组建简易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.视频说明


 

本帖最后由 jone5 于 2024-2-27 01:07 编辑

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复