본문 바로가기
IT/IoT | Hardware

Raspberry Pi Pico + Ethernet 연결하기 3 - DHCP 라즈베리파이 피코 W5500

이제 소프트웨어 환경과 간단하게 Ping 테스트가 가능한 IoT 기기 비슷하게 만들어 보았다.

2021.04.19 - [IT/IoT | Hardware] - Raspberry Pi Pico + Ethernet 연결하기 1 - 라즈베리파이 피코 W5500

 

Raspberry Pi Pico + Ethernet 연결하기 1 - 라즈베리파이 피코 W5500

MicroPython vs CircuitPython for 이더넷 기능 Raspberry Pi Pico 보드에 Ethernet 기능을 추가하기 위해 위즈네트 W5500 칩을 연결해 보도록 하자. 마이크로 파이썬에서 제공하는 라이브러리가 있으면 더 좋은데.

wiznxt.tistory.com

2021.04.19 - [IT/IoT | Hardware] - Raspberry Pi Pico + Ethernet 연결하기 2 - 라즈베리파이 피코 W5500

 

Raspberry Pi Pico + Ethernet 연결하기 2 - 라즈베리파이 피코 W5500

이제 소프트웨어 환경은 Raspberry Pi Pico + Ethernet 연결하기 1 - 라즈베리파이 피코 W5500 에서 완성이 되었고, Raspberry Pi Pico W5500 Ethernet 하드웨어 연결 Raspberry Pi Pico 보드와 W5500 내장한 WIZ8..

wiznxt.tistory.com

그래도 약간 부족한 부분이 있다. 

DHCP 라는 게 필요하다. 보통의 네트워크 환경은 수동 IP설정이 아니라 DHCP서버(즉, 집에 있는 공유기 같으거)에서 IP를 받아오는 것이 일반적이다.

 

그래서 한번 더 Ping test 를 해보자. 이건 DHCP에서 IP를 받아서 동작하는 테스트이다.

 

1. 라이브러리 준비하기

앞선 2번 게시글과 같다. 단 DHCP를 위해서는 반드시 아래 GitHub Repo 에서 받은 라이브러리를 써야 한다.

Adafruit 에서 제공되는 WIZNET5K library 를 약간 수정한 곳이 있으므로, 반드시 아래 GitHub 에 있는 코드를 복사해 넣도록 한다.

 

아래 lib 파일들을 각각 다운로드 받아서, (폴더내의 파일과 폴더 이름도 동일하게 다운해야 한다)

github.com/bjnhur/pico-W5500/tree/main/lib

 

bjnhur/pico-W5500

Add W5500 Ethernet to Raspberry Pi Pico. Contribute to bjnhur/pico-W5500 development by creating an account on GitHub.

github.com

  • adafruit_wiznet5k 폴더와 파일들
  • adafruit_bus_device 폴더와 파일들
  • adafruit_requests.mpy 파일

RPi Pico 보드의 lib 폴더 아래에 복사해둔다. 그럼 WIZNET5K 라는 W5500 라이브러리를 CircuitPython 환경하에서 사용할 수 있게 된다.

2. 하드웨어 연결

2번 게시글

2021.04.19 - [IT/IoT | Hardware] - Raspberry Pi Pico + Ethernet 연결하기 2 - 라즈베리파이 피코 W5500

과 동일하다. 

 

3. code.py 수정하기 - 코딩하기

아래 코드를 그대로 라즈베리파이 피코 Raspberry Pi Pico 보드 드라이버에 있는 code.py 에 넣고 저장하면 된다.

물론 아래 코드는 간단한 Echo 를 위해서 만들어진 코드이긴 하지만 DHCP 테스트에도 쓰일 수 있다.

import board
import busio
import digitalio
import time
from adafruit_wiznet5k.adafruit_wiznet5k import WIZNET5K
import adafruit_wiznet5k.adafruit_wiznet5k_socket as socket

SPI1_SCK = board.GP10
SPI1_TX = board.GP11
SPI1_RX = board.GP12
SPI1_CSn = board.GP13
W5500_RSTn = board.GP15

print("Wiznet5k SimpleServer Test (DHCP)")

# Setup your network configuration below
# random MAC, later should change this value on your vendor ID
MY_MAC = (0x00, 0x01, 0x02, 0x03, 0x04, 0x05)
IP_ADDRESS = (192, 168, 0, 111)
SUBNET_MASK = (255, 255, 0, 0)
GATEWAY_ADDRESS = (192, 168, 0, 1)
DNS_SERVER = (8, 8, 8, 8)

led = digitalio.DigitalInOut(board.GP25)
led.direction = digitalio.Direction.OUTPUT

ethernetRst = digitalio.DigitalInOut(W5500_RSTn)
ethernetRst.direction = digitalio.Direction.OUTPUT

# For Adafruit Ethernet FeatherWing
cs = digitalio.DigitalInOut(SPI1_CSn)
# For Particle Ethernet FeatherWing
# cs = digitalio.DigitalInOut(board.D5)

spi_bus = busio.SPI(SPI1_SCK, MOSI=SPI1_TX, MISO=SPI1_RX)

# Reset W5500 first
ethernetRst.value = False
time.sleep(1)
ethernetRst.value = True

# # Initialize ethernet interface without DHCP
# eth = WIZNET5K(spi_bus, cs, is_dhcp=False, mac=MY_MAC, debug=True)
# # Set network configuration
# eth.ifconfig = (IP_ADDRESS, SUBNET_MASK, GATEWAY_ADDRESS, DNS_SERVER)

# Initialize ethernet interface with DHCP
eth = WIZNET5K(spi_bus, cs, is_dhcp=True, mac=MY_MAC, debug=True)

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

# 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")
while True:
    led.value = not led.value
    time.sleep(1)
    with conn:
        # data = conn.recv()
        # print(data)
        # conn.send(data)  # Echo message back to client
        while True:
            data = conn.recv(10)
            if data:
                print(data)
                conn.send(data)  # Echo message back to client
                break

print("Done!")

앗 그런데 받은 IP를 print 문을 통해 출력하게 되어 있는데 REPL 환경이 설정되어 있지 않으면 이 콘솔 출력 값을 볼 수 없다. 

4. REPL 환경 설정

보통 말하는 콘솔창이다. 이런 임베디드 보드들은 보통 UART, Serial 터미널을 통해 살펴볼 수 있다. 

당연히 라즈베리파이 피코 보드에도 이 기능을 사용할 수 있다. 

 

시리얼 터미널을 아무거나 실행하고, (없다면 Putty 라도 받아서 설치하고 다음 동작으로 들어오세요)

Raspberry Pi Pico REPL 설정

COM 포트를 아래 처럼 확인하고, 속도는 115200으로 오픈하면 된다.

COM Port 는 장치관리자 혹은 Device Manager를 열면 확인할 수 있다.

Device Manager 실행
REPL Com port 확인

이제 시리얼 터미널 창으로 print 에서 출력한 값을 볼 수 있다.

REPL 출력 창

5. Ping Test 결과 확인

터미널에서 보면 192.168.0.20 이라는 IP 값을 할당 받은 것을 볼 수 있다. 

여기로 Ping 을 보내보면, 성공 확인

Ping test 결과

Done. 좀 간단한 네트워크 통신 예제를 준비해야 겠네요. 이젠~~~

이 코드도 간단한 Echo 는 되는데 따로 준비하지 머 너무 기니깐.

Raspberry Pi Pico + W5500 Ethernet + DHCP

BJ.