Arduino Uno R4 WiFi의 소켓 서버 예제를 테스트해봤습니다. 이후 에코 서버로 발전시킬 예정입니다.
2024. 1. 23 최초작성
2024. 1. 25 코드 개선
1. Arduino Uno R4 WiFi 개봉
2. 사용 준비
3. WiFiChatServer 예제 테스트 - 1차
4. WiFiChatServer 예제 테스트 - 2차
1. Arduino Uno R4 WiFi 개봉
Arduino Uno R4 WiFi 박스에는 간단한 사양이 적혀있습니다.
Arduino Uno R4 WiFi 보드 바닥면에 Arduino R3와 달리 투명 플라스틱 판이 껴져있는게 특이했습니다.
기본적인 모양은 거의 R3와 동일합니다.
전원 연결을 C타입으로 할수 있는게 달라진점이네요.
이 부분이 WiFi를 담당하는 모듈인가 싶네요.
Arduino Uno R4 WiFi를 PC에 연결하니 하트를 표시해주는 도트 매트릭스(?) 부분이 있어요.
2. 사용 준비
Arduino IDE를 실행하여 Arduino Uno R3 사용하던 설정 그대로 테스트를 진행해보려 했습니다.
툴 > 보드 > Arduino AVR Boards > Arduino Uno가 선택되어 있습니다.
메뉴 툴 > 포트에 잡혀있는 COM7을 선택했습니다.
추가 설치가 필요한가 봅니다. Arduino IDE 하단에 다음 메시지가 보여 클릭했습니다. 다음 메시지가 보이지 않으면 메뉴에서 툴 > 보드 > 보드 메니저를 선택한 후, 다음에 보이는 스크릿샷에 보이는 검색어를 입력하여 설치를 진행하면 됩니다.
보드 매니저에서 검색된 Arduino UNO R4 Boards 패키지를 설치했습니다.
설치 완료후 메뉴에서 보드 > Arduino Renesas UNO R4 Boards > Arduino UNO R4 WiFi를 선택할 수 있었습니다.
3. WiFiChatServer 예제 테스트 - 1차
메뉴의 파일 > 예제를 선택해보면 Arduino UNO R4 WiFi의 예제라는 항목이 보입니다. 그 중에 WiFiS3에 있는 WiFiChatServer를 선택해봅니다.
다음 코드가 불러와집니다. 코드를 보면 한글자를 수신받아 바로 다시 전송하도록 되어있습니다.
다음 2줄을 공유기의 SSID와 패스워드로 교체해줍니다.
char ssid[] = SECRET_SSID; // your network SSID (name)
char pass[] = SECRET_PASS; // your network password (use for WPA, or use as key for WEP)
예를 들어 다음처럼 바꾸면 됩니다.
char ssid[] = "SSID"; // your network SSID (name)
char pass[] = "PASSWORD"; // your network password (use for WPA, or use as key for WEP)
/* Chat Server A simple server that distributes any incoming messages to all connected clients. To use, telnet to your device's IP address and type. You can see the client's input in the serial monitor as well. This example is written for a network using WPA encryption. For WEP or WPA, change the WiFi.begin() call accordingly. Circuit: * Board with NINA module (Arduino MKR WiFi 1010, MKR VIDOR 4000 and Uno WiFi Rev.2) created 18 Dec 2009 by David A. Mellis modified 31 May 2012 by Tom Igoe Find the full UNO R4 WiFi Network documentation here: https://docs.arduino.cc/tutorials/uno-r4-wifi/wifi-examples#wi-fi-chat-server */ #include <WiFiS3.h> #include "arduino_secrets.h" ///////please enter your sensitive data in the Secret tab/arduino_secrets.h char ssid[] = SECRET_SSID; // your network SSID (name) char pass[] = SECRET_PASS; // your network password (use for WPA, or use as key for WEP) int keyIndex = 0; // your network key index number (needed only for WEP) int status = WL_IDLE_STATUS; WiFiServer server(23); boolean alreadyConnected = false; // whether or not the client was connected previously void setup() { //Initialize serial and wait for port to open: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } // check for the WiFi module: if (WiFi.status() == WL_NO_MODULE) { Serial.println("Communication with WiFi module failed!"); // don't continue while (true); } String fv = WiFi.firmwareVersion(); if (fv < WIFI_FIRMWARE_LATEST_VERSION) { Serial.println("Please upgrade the firmware"); } // attempt to connect to WiFi network: while (status != WL_CONNECTED) { Serial.print("Attempting to connect to SSID: "); Serial.println(ssid); // Connect to WPA/WPA2 network. Change this line if using open or WEP network: status = WiFi.begin(ssid, pass); // wait 10 seconds for connection: delay(10000); } // start the server: server.begin(); // you're connected now, so print out the status: printWifiStatus(); } void loop() { // wait for a new client: WiFiClient client = server.available(); // when the client sends the first byte, say hello: if (client) { if (!alreadyConnected) { // clear out the input buffer: client.flush(); Serial.println("We have a new client"); client.println("Hello, client!"); alreadyConnected = true; } if (client.available() > 0) { // read the bytes incoming from the client: char thisChar = client.read(); // echo the bytes back to the client: server.write(thisChar); // echo the bytes to the server as well: Serial.write(thisChar); } } } void printWifiStatus() { // print the SSID of the network you're attached to: Serial.print("SSID: "); Serial.println(WiFi.SSID()); // print your board's IP address: IPAddress ip = WiFi.localIP(); Serial.print("IP Address: "); Serial.println(ip); // print the received signal strength: long rssi = WiFi.RSSI(); Serial.print("signal strength (RSSI):"); Serial.print(rssi); Serial.println(" dBm"); } |
이제 업로드해봤습니다.
컴파일 후, 업로드 하는데 까지 4초 정도 걸리네요.
메뉴에서 툴 > 시리얼 모니터를 선택합니다.
아무 것도 안보여서 보드에 있는 RESET 버튼을 눌렀더니 할당된 아이피가 보입니다.
간단한 파이썬 소켓 클라이언트로 테스트를 해봤습니다.
import socket import threading import sys class ChatClient: def __init__(self, host='localhost', port=5555): self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: self.sock.connect((host, port)) print(f"서버 연결 성공: {host}:{port}") except Exception as e: print(f"서버 연결 실패: {e}") sys.exit(1) def receive_messages(self): while True: try: message = self.sock.recv(1024).decode('utf-8') if message: print(f"\r받은 메시지: {message}") print("메시지: ", end='', flush=True) except: print("\n서버와의 연결이 끊어졌습니다.") self.sock.close() break def send_messages(self): while True: try: message = input("메시지: ") if message.lower() == 'quit': break self.sock.send(message.encode('utf-8')) except: break self.sock.close() def start(self): receive_thread = threading.Thread(target=self.receive_messages) receive_thread.daemon = True receive_thread.start() send_thread = threading.Thread(target=self.send_messages) send_thread.daemon = True send_thread.start() send_thread.join() if __name__ == "__main__": client = ChatClient(host="192.168.45.154", port=23) client.start() |
실행 결과 입니다.
서버 연결 성공: 192.168.45.154:23
메시지: hello 처음 어떤 메시지를 입력하고 엔터를 누르든
받은 메시지: Hello, client! 똑같은 메시지가 보입니다.
받은 메시지:
메시지: hello 첫번째 문자 h만
받은 메시지: h 리턴되어 돌아옵니다.
메시지: 1
메시지: 23456789 첫번째 문자 2만
받은 메시지: 2 리턴되어 돌아옵니다.
시리얼 모니터에 We have a new client라는 메시지가 보이고 이후 전송된 문자열중 첫번째 글자만 출력됩니다.
4. WiFiChatServer 예제 테스트 - 2차
에코 서버로서 동작하도록 코드를 수정했습니다. \n 문자가 수신될때까지 문자를 누적했다가 한꺼번에 송신해줍니다.
#include <WiFiS3.h> #include "arduino_secrets.h" char ssid[] = SECRET_SSID; char pass[] = SECRET_PASS; int status = WL_IDLE_STATUS; WiFiServer server(23); String inputLine = ""; void setup() { Serial.begin(9600); while (!Serial); if (WiFi.status() == WL_NO_MODULE) { Serial.println("Communication with WiFi module failed!"); while (true); } while (status != WL_CONNECTED) { Serial.print("Attempting to connect to SSID: "); Serial.println(ssid); status = WiFi.begin(ssid, pass); delay(10000); } server.begin(); printWifiStatus(); } void loop() { WiFiClient client = server.available(); if (client && client.connected()) { while (client.available() > 0) { char thisChar = client.read(); if (thisChar == '\n') { client.print(inputLine + "\n"); Serial.println("Echo: " + inputLine); inputLine = ""; } else { inputLine += thisChar; } } } } void printWifiStatus() { Serial.print("SSID: "); Serial.println(WiFi.SSID()); IPAddress ip = WiFi.localIP(); Serial.print("IP Address: "); Serial.println(ip); long rssi = WiFi.RSSI(); Serial.print("signal strength (RSSI):"); Serial.print(rssi); Serial.println(" dBm"); } |
파이썬 클라이언트 코드도 수정하여 \n 문자를 같이 보내도록합니다.
import socket import threading import sys class ChatClient: def __init__(self, host='localhost', port=5555): self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: self.sock.connect((host, port)) print(f"서버 연결 성공: {host}:{port}") except Exception as e: print(f"서버 연결 실패: {e}") sys.exit(1) def receive_messages(self): while True: try: message = self.sock.recv(1024).decode('utf-8') if message: print(f"\r받은 메시지: {message}") print("메시지: ", end='', flush=True) except: print("\n서버와의 연결이 끊어졌습니다.") self.sock.close() break def send_messages(self): while True: try: message = input("메시지: ") if message.lower() == 'quit': break self.sock.send((message + '\n').encode('utf-8')) except: break self.sock.close() def start(self): receive_thread = threading.Thread(target=self.receive_messages) receive_thread.daemon = True receive_thread.start() send_thread = threading.Thread(target=self.send_messages) send_thread.daemon = True send_thread.start() send_thread.join() if __name__ == "__main__": client = ChatClient(host="192.168.45.154", port=23) client.start() |
파이썬쪽에서 실행결과입니다.
시리얼 모니터에는 다음처럼 보입니다.
'Arduino Uno R4 WiFi' 카테고리의 다른 글
Arduino Uno R4 WiFi의 LED Matrix를 사용해보기 (0) | 2025.01.26 |
---|