본문 바로가기

ESP-05 (ESP8266)

ESP-05 와의 첫 걸음

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