ESP-05 와의 UDP 첫 걸음
(*) 내가 ESP-05를 사용하는 이유 (개발 방향)
내게 필요한 것은 마치 PC에 네트웍 카드하나 껴 있는 것같은 단순하지만, Arduino 에 붙여
IP address와 무선 UDP통신이 가능한 모듈이다. 그리고 최소한 통신 거리도 100미터
이상은 나오고, 방향형 안테나를 쓰면 1000미터정도 통신거리가 나와주는 것을 원했다.
다른 8266시리즈는 자체 프로그램이 가능하고 더 많은 기능이 있지만,
오히려 ESP-05처럼 전혀 통신기능 외에는 아무것도 없고 단순하게 서브모듈처럼 조용히
문제 안 일으키고 시키는 일만 잘하는 장비가 내게는 최고다.
NodeMCU는 프로그램도 쉽고 한두개 센서를 붙여서 IoT를 구현하는데는 아주 적합하다.
핀 수도 많아서 꽤나 다양한 일도 할수 있을것 같지만 실제로는 많이 빈약하다.
Arduino Nano로는 아주 쉽게 되는 일들이 NodeMCU에서는 정말 힘들게 되던지 잘 안된다.
그래서 실제로 상당히 많은 A/D 나 핀들이 필요하거나 많은 수의 모터컨트롤이 필요하면
메가를 사용하고 단순한 통신 칩을 사용하는게 현실적으로 가장 유용한 대안이다.
단 사용자가 미리 알고 있어야 할 일은, ESP-05는 ESP 8266 시리즈중에서 유일하게
프로그램이 안돼는 통신모듈용이다. 따라서 아래와 같은 라이브러리를 사용할 수 없다.
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
통신도 AT command를 사용해서 해야하는 불편함이 있지만, 한번만 잘 만들어 놓으면,
다음에는 똑 같은 코드로 쓰는 것이니 사실 처음이 어렵지 나중에 가면 갈수록 쉽다.
NodeMCU에 익숙한 분들은 처음에는 무척 당황스럽겠지만, NodeMCU와 아듀이노
를 함께 연동하려고 해보신 분들은 왜 내가 이런 방향을 선호하는지 고통스러웠던
경험으로 아실것 입니다.
(*) Arduino Mega를 기본 커멘드 툴로 사용하기.
윗 그림대로 연결된 상태에서 아래 코드만 넣고 메가를 돌리면 Arduino IDE의 Serial Monitor 창을 AT Command를 넣는 창으로 쓸 수 있읍니다.
void setup() {
Serial.begin(115200);
Serial2.begin(115200);
}
void loop() {
while (Serial2.available()) Serial.write(Serial2.read());
while (Serial.available()) Serial2.write(Serial.read());
}
(*) AT Command 로 기본 준비하기.
AT+GMR // retrieve the firmware info.
AT+RST // reset
AT+CWMODE_DEF=3 // _DEF means that it will be stored in flash.
AT+CWJAP_DEF="your_ssid","your_password"
AT+CIPMUX=1 // Enable multiple connections
AT+CIPSTART="UDP","0",0,6767,2 // for test, UDP doesn't need IP to get info.
(*) 기초 통신 세팅 확인실험. Simple Test for setting.
from Linux, on Shell : echo “TEST STRING” > /dev/udp/192.168.1.110/6767
- Here, 192.168.1.110 is presetted IP for my ESP-05 at my router, and 6767 is port
* in the picture, I have used ip of 109, that is for other device.
(*) Arduino + ESP-05 UDP 시작 코드
////UNO & M328P
// #include <SoftwareSerial.h>
// SoftwareSerial terminal(10, 11); // RX, TX
// HardwareSerial & esp05 = Serial;
// Arduino MEGA code (나는 이번에 메가를 사용해서 실험함.)
HardwareSerial & terminal = Serial;
HardwareSerial & esp05 = Serial2;
#define BUFFER_SIZE 512
int j;
int sbLength; // Send Buffer Length
char buffer[BUFFER_SIZE];
String sendbuff;
String commandstring;
// By default we are looking for OK\r\n
char OKrn[] = "OK\r\n";
byte wait_for_espSerial_respSerialonse(int timeout, char* term = OKrn) {
unsigned long t = millis();
bool found = false;
int i = 0;
int len = strlen(term);
// wait for at most timeout milliseconds
// or if OK\r\n is found
while (millis() < t + timeout) {
if (esp05.available()) {
buffer[i++] = esp05.read();
if (i >= len) {
if (strncmp(buffer + i - len, term, len) == 0) {
found = true;
break;
}
}
}
}
buffer[i] = 0;
terminal.print(buffer);
return found;
}
void setup() {
esp05.begin(115200);
terminal.begin(115200);
terminal.println("Bot #10 : Mega with ESP-05 UDP comm.");
setupWiFi();
}
void SendUDPMessage(){
commandstring = "010:TEST:1,"; // 시험용 값
commandstring += j++; // 시험용 값
sbLength = commandstring.length();
sendbuff = "AT+CIPSEND=2,";
sendbuff += sbLength;
esp05.println(sendbuff);
if (wait_for_espSerial_respSerialonse(2000, "> ")) {
esp05.println(commandstring);
wait_for_espSerial_respSerialonse(1000);
}
}
void loop() {
while (esp05.available()) terminal.write(esp05.read());
while (terminal.available()) esp05.write(terminal.read());
}
void setupWiFi() {
// 모든 기초 와이파이 네트웍 록인은 미리 칩에 저장해 놓아서 켜질때 자동으로
// 록인 되게 방금 전 작업에서 다 저장해 놓을것.
// 여기서는 플래시에 저장이 안되는 명령어만 실행함.
// 그리고 록인시 아이피도 라우터에 지정해서 항상 같은 장비는 같은 아이피를 갖게 함.
// All network configs of ESP-05 is already in flash by previous step.
// That includes, SSID, password, etc...
// So, when Bot is powered on, remaining configuration is those that CANNOT
// be stored in flash.
// Also, IP address is reserved using home router by ESP-05's MAC address
// AT+CIPMUX=1 // Enable multiple connections
esp05.println("AT+CIPMUX=1");
wait_for_espSerial_respSerialonse(1000);
// My Main server is xxx.xxx.x.100, and port is 6767 for in / out
// AT+CIPSTART=2,"UDP","192.168.1.100",6767,6767,0
esp05.println("AT+CIPSTART=2,\"UDP\",\"192.168.1.100\",6767,6767,0");
wait_for_espSerial_respSerialonse(1000);
// Send to PC test message for speed 피시로 실험 전송.
delay(2000);
for (j = 1; j <= 50; j++){
SendUDPMessage();
}
}
* 다음 그림은 중앙 관리 프로그램으로 ESP-05에 시험 명령을 50번 쏘는 실험입니다.)
(This image is for the test of receiving commands from Main Control App using UDP.)
새로 발견한 난제 : 신기하게도 ESP-05를 Network에 연결되면, 그때부터 Mega의 I2C가 작동하지 않았다. 엉뚱한 결과값을 주는 현상이 나와서 현재 애를 먹고 있는중.
Updated at 5-16-2016, 문제 해결 됨
- ESP-05대신 ESP-07로 바꿔서 해결. ESP-07을 AT Command mode로 사용해서 해결됨. 현재 ESP-07에 관련해서 내용 준비중.
Updated at 5-30-2016, 해결 : ESP-05에 전류가 부족했던 문제였던것 같음. 하지만 ESP-07이 더 안정적이라 메가와는 ESP-07이 궁합이 잘맞았음.)
예: ESP-07 선 연결
'ESP-05 (ESP8266)' 카테고리의 다른 글
ESP-05 + Arduino NANO + UDP (0) | 2016.05.06 |
---|