(추가) 사진 보충설명과 ESP32에 코드만 공요합니다.  

 

PC쪽은 너무 복잡해서 공유와 설명이 도저히 불가능합니다.

 

(PC쪽에 가장 중요한 내용은 firewall에서 통신을 막으니 실험중에 firewall을 중지시키는 방법과 아니면 inbound와 outbound 룰을 사용하실 포트번호로 추가하여 여는 방법이 있습니다.)

 

 

 

 

칩에 1 써있는 모듈이 ESP32 Development Board입니다.

바로 옆에 있는 모듈은 Step-Down Variable Buck Converter로 

 9V 밧데리의 전압을 3V3으로 조정해 주는 파워모듈입니다.

그 위에 녹색 모듈이 MPU9250 (9축 센서),

그 옆에 보라색 모듈이 VL53L0X (레이저 거리측정센서) 

 

이번에는 VL53L0X는 사용을 안했고, 

  MPU9250의 기능도 딱 3D-Compass만 사용했습니다.

현재 모든 시리얼 관련코드들은 //로 막아놨는데 그냥 풀면 됩니다.

 

 

각각의 라이브러리는 

MPU9250 : https://github.com/asukiaaa/MPU9250_asukiaaa

VL53L0X : https://github.com/pololu/vl53l0x-arduino/releases

 

// Copyright : FREE for ALL. 맘껏 복사하고 고치고 필요에 맞게 쓰세요.

 

#include <WiFi.h>

#include <WiFiUdp.h>

#include <Wire.h>

#include <MPU9250_asukiaaa.h>

 

#define _ESP32_HAL_I2C_H_

 

#ifdef _ESP32_HAL_I2C_H_

#define SDA_PIN 21

#define SCL_PIN 22

#endif

 

#define BUFFER_SIZE 100

 

// WiFi network name and password:

const char * networkName = "******";  // 집이나 사무실 와이파이 아이디

const char * networkPswd = "******";  // 와이파이 연결 비밀번호

 

//IP address to send UDP data to:

// either use the ip address of the server or 

// a network broadcast address

const char * udpAddress = "192.168.1.200";   // 저의 PC의 고정주소

const int udpPort = 6767;                    // 제가 로봇용으로 주로 사용하는 포트번호

 

//The udp library class

WiFiUDP udp;

 

//Are we currently connected?

boolean connected = false;

 

// 9 DOF Gyro, Accel, Mag Sensor; here I only use 3 Axis Mag

MPU9250_asukiaaa DOF9Sensor;

 

float mDirection, mx, my, mz;

 

int r = 0; // Simple Counter to replace delay() in the main loop

 

String s; // Temporary string for general purpose

 

void setup()

{

//   while(!Serial);

//   Serial.begin(19200);

 

   //Connect to the WiFi network

   connectToWiFi(networkName, networkPswd);   

 

#ifdef _ESP32_HAL_I2C_H_ // For ESP32

   Wire.begin(SDA_PIN, SCL_PIN); // SDA, SCL

#else

   Wire.begin();

#endif

 

   //////////////// MPU9250 9-DOF SENSOR //////////////////////// 

   DOF9Sensor.setWire(&Wire);

   DOF9Sensor.beginMag();

 

   // 이 오프셋은 제 책상에서 사용하는 장비의 위치에서 나오는 기본 오차량

   DOF9Sensor.magXOffset = 66;

   DOF9Sensor.magYOffset = 18;

   DOF9Sensor.magZOffset = 41;

 

//   Serial.println("SensorId: " + String(DOF9sensorId));

 

   delay(1000);

}

 

void connectToWiFi(const char * ssid, const char * pwd){

//   Serial.println("Connecting to WiFi network: " + String(ssid));

 

   // delete old config

   WiFi.disconnect(true);

   //register event handler

   WiFi.onEvent(WiFiEvent);

  

   //Initiate connection

   WiFi.begin(ssid, pwd);

 

   connected = true;

 

//   Serial.println("Waiting for WIFI connection...");

}

 

//wifi event handler

void WiFiEvent(WiFiEvent_t event){

    switch(event) {

      case SYSTEM_EVENT_STA_GOT_IP:

          //When connected set 

//          Serial.print("WiFi connected! IP address: ");

//          Serial.println(WiFi.localIP());  

          //initializes the UDP state

          //This initializes the transfer buffer

          udp.begin(WiFi.localIP(),udpPort);

          connected = true;

          break;

      case SYSTEM_EVENT_STA_DISCONNECTED:

//          Serial.println("WiFi lost connection");

          connected = false;

          break;

    }

}

 

void print9DOF() {

   s = "<R=3Mag:4,";

   s += mx; s += ","; s += my; s += ","; s += mz; s += ",";

   s += mDirection; s += ">";

//   Serial.println(s);

 

   //only send data when connected

   if(connected){

      //Send a packet

      udp.beginPacket(udpAddress,udpPort);

      udp.print(s);

      udp.endPacket();

   }  

}

 

void loop() {

 

   r++;

   if (r == 22000){ // THIS IS DESCENT DELAY

 

      DOF9Sensor.magUpdate();

      mx = DOF9Sensor.magX();

      my = DOF9Sensor.magY();

      mz = DOF9Sensor.magZ();

      mDirection = DOF9Sensor.magHorizDirection();

      

      print9DOF();

 

      r = -22000;

   }

 

}

비행 시뮬레이션을 위한 게임용 입력 컨트롤러들.



   잠시 그냥 궁상스런 생각을 해 봤습니다.  무엇인가 컨트롤을 한다면 저에게는 항상 건담이 떠 오릅니다.   건담시드에 나오는 조종석.  현실적으로 이족 보행(bi-ped) 로봇을 격렬한 전투기능까지 갖춰야 한다면 인공지능이 아니고서는 이런 단순 컨트롤로 조종이 과연 가능할까 하며 허무맹랑하게 봤습니다.   대한민국 로봇대전 같은데서 보면 사람이 리모트로 조종하는 장난감크기의 이족보행로봇들이 완전 바보같은 움직임으로 발로 차고 주먹질하고 경기를 하지만 진짜 전투라면 미사일 한방에 죽음이라 상황은 전혀 달라집니다.    하지만 전투용을 만드는 것도 아닌데 시도를 한번 해 보는건 재미있겠다고 느껴왔습니다.   물론 컨트롤유닛까지만.   건담 자체를 만든다는건 크기를 아무리 작게 10살짜리 어린이 크기로 만들어도 상당한 비용과 시간이 드는 일이기 때문에 거기까지는 노리지 않고 3D 시뮬래이션정도로 만족을 해야 하지 않을까요?   뭐 그건 쉽나요?


만화영화에 나오는 건담의 조종석



진짜 갖고 놀고 싶지만 너무 크기가 커서 놔둘곳이 마땅치 않은 상황.  쩝.



신형 F-16C는 이런 전자오락용 게임컨트롤러를 닳은 조종기를 쓰네요.



에어버스 380조차 조종석과 부조종석에 다 게임용 조종기 스타일로 나오는군요.






델파이 조이스틱 컨트롤 라이브러리 (최고성능)


Delphi 10.2.3 Joystick Control Library - The Best Library.

(Tested with Latest Delphi 10.2.3 Community Edition - Free Version)







 기능 

 Capability

 최대 32 버튼

 32 Buttons Max

 두개의 3축 조종

 Two of 3-Axis Input

 시야 변경 지원

 P.O.V. entry

 2개의 장비 동시 지원

 Supports 2 equipments

 

 



윈도우에서 로지텍 윙맨의 시그널을 받는 데모.    현재 사용한 라이브러리의 원 제작자는 NLDelphi라는 아이디로 인터넷에 많은 좋은 것을 올렸던 네덜란드분이신데 이제는 그 자취를 찾아볼수 없고 모든 링크조차 사라졌습니다.   다행이 인터넷 어딘가에 다른 프로젝트에 낑겨서 남아있던 모듈을 겨우 찾아서 올립니다.  참고로 이 라이브러리는 제 윙맨만을 위한 것이 아니고 모든 일반 조이스틱종류의 라이브러리입니다.   최신 Delphi 10.2.3에 문제없이 작동하게 아주아주 약간 고쳤는데 어딜 고쳤는지도 잊어버렸습니다.   원본에는 데모가 안따라와서 데모도 만들어서 같이 올립니다.    라이센스는 완전 자유.   32비트 윈도우7, 64비트 윈도우 서버 2016에서 실험 통과.


Finally I was able utilize logitech wingman game controller to my windows program for own purposes.    This library is originally written by NLDelphi(id), however, all of his links were vanished from web.     Luckily, I found this library code from other project and was able to inherit his legacy.   BTW, this library is not only for my logitech wingman controller but for general purposed joystick type input devices for windows.

Original license is open for public without any tags or strings attached (License Free).     I have fixed very tiny portion while compiling for latest Delphi 10.2.3, however, I cannot remember where I fixed.    This library is minor modified version + my demo.    It is tested on both 32 bit Windows 7 and 64 bit Windows Server 2016.


File : 

NLDJoystick.zip



----------------------------------------------------------------------


메이커들의 조이스틱 사용 예 :

Example of how makers use joystick for :




My MPU-9250 


US $ 5.10


 
Name: MPU-9250 module (three-axis gyroscope + three-axis acceleration + three-axis magnetic field)
Module Model: GY-9250
Use chip: MPU-9250
Power supply: 3-5V (internal low voltage regulator)
Communication method: Standard IIC communication protocol
Chip built-in 16bit AD converter, 16-bit data output
Gyroscope range: ± 250 500 1000 2000 ° / s
Acceleration range: ± 2 ± 4 ± 8 ± 16g
Magnetic field range: ± 4800uT
Pin spacing: 2.54mm
Module size: 15mm * 25mm
 
Package includes:
 
1 x GY-9250 9 Axis Sensor Module




'DRONE' 카테고리의 다른 글

미완성 ESP32 와이파이 드론 코드.  (0) 2019.09.04

샤오미 Yi 액션 캠


3년쯤 전에 완전 집돌이 생활패턴을 벗어던지고 와일드한 패턴으로 바꿔보려고 바닷물 속에 들어가 랍스터나 크랩도 잡는  꿈에 젖어 구입했던 샤오미 액션캠입니다.   꿈은 꿈이었을 뿐이었나...바닷물속에 나를 맡기고 물고기들과 유영하고 하는 기적같은 일은 일어나지 않았습니다.   태평양 바닷물이 이렇게 얼음장일줄은 꿈에도 몰랐습니다.  7mm 방수복을 입어도 뼛속까지 전해지는 냉기에 후덜덜덜...


검정색 밴드는 머리에 잠수용 카메라 방수케이스를 부착하게 해 주는 밴드입니다.   이 놈들을 다시 꺼낸 이유는 실험할때 셀폰으로 찍었더니 한 손을 못쓰니깐 너무 힘들어서 앞으로는 새로운 방식으로 촬영하려고 합니다.   몸에 부착하는 밴드도 구입했지만 야외에 나가서 촬영하지 않는 이상에는 필요가 없을것 같습니다.   















새로 주문한 ESP32 보드들이 며칠전 도착했는데  바빠서 던져놔뒀다 오늘에야 뜯어봅니다.

두개는 OLED가 부착된 기종이고 다른 3개는 가장 최소한의 세팅으로 기본에 충실한 보드들인데

저는 기본에 충실한 단순한 보드들이 좋습니다.   

이 보드들을 전에도 3개를 주문했었는데 그 중 하나는 불량품이 와서 처음부터 못썼고

또 하나는 매일 갖고 다니며 쓰다가 어디 뒀는지 몰라서 하나밖에 안남았습니다.

이제 3개를 보충하니 마음껏 만들고 싶은걸 해 볼 생각입니다.





 OLED 가 부착된 보드는 괜히 샀나 싶을정도로 글씨가 작고 핀들을 많이 소모해서 뭔가 아쉽습니다.

더 큰 문제는 나의 효자 케이블로도 프로그램 업로드가 잘 안되고 있습니다.   다른 기종보다도 Flash burning할때 전력이 부족한 것 같습니다.    역시 단순한 모델이 최곱니다.


OLED 부착돤 모델에 처음 전력을 공급한 상태



OLED Version (Wemos Lorin 32)'s Pin-out


이 OLED 통합보드들은 하루만에 사용불능상태에 빠졌습니다.   코드를 업로드를 못하는 상황이라 해결방법을 찾을때까지 서랍에나 쳐박아둬야겠습니다.    그리고 열받아서 나의 사랑스런 기초에 충실한 보드에 외부 OLED를 붙여서 프로그램을 해봤습니다.   쉬우면 다신 이렇게 OLED가 붙은 기종을 절대로 안살려고 합니다. 


일단 공개라이브러리 다운받아 시험해봤더니 난이도가 그리 높지 않았읍니다.  


시계 Demo


아래는 그래픽 Demo.


아래는 Font 데모.  



라이브러리 화일 : ESP32_OLED_SSD1306.zip





ESP-07S & ESP-12S 의 AT Command Set



AT Command List SET


 

 1. Basic AT Commands

 

 

AT – Test AT startup

AT+RST – Restart module 
AT+GMR – View version info
AT+GSLP – Enter deep-sleep mode
ATE – AT commands echo
AT+RESTORE – Factory reset
AT+UART – UART configuration
AT+UART_CUR – current UART configuration
AT+UART_DEF – default UART configuration 
AT+SLEEP – sleep mode
AT+WAKEUPGPIO – set a GPIO to wake ESP8266 up from light-sleep mode
AT+RFPOWER – set maximum value of RF TX Power
AT+RFVDD – set RF TX Power according to VDD

 

 

 2. Wi-Fi AT Commands

 

 

AT+CWMODE – WiFi mode

AT+CWMODE_CUR – current WiFi mode
AT+CWMODE_DEF – default WiFi mode
AT+CWJAP – Connect to AP
AT+CWJAP_CUR – Connect to AP, for current
AT+CWJAP_DEF – Connect to AP, save as default
AT+CWLAPOPT – Set configuration for command AT+CWLAP
AT+CWLAP – List available Aps
AT+CWQAP – Disconnect from AP
AT+CWSAP – Configuration of softAP mode
AT+CWSAP_CUR – Current config of softAP mode
AT+CWSAP_DEF – Default config of softAP mode
AT+CWLIF – IP of stations 
AT+CWDHCP – Enable/Disable DHCP
AT+CWDHCP_CUR – Enable/Disable DHCP
AT+CWDHCP_DEF – Enable/Disable DHCP and save to flash
AT+CWDHCPS_CUR – Set the IP address allocated by ESP8266 soft-AP DHCP, does not save to flash
AT+CWDHCPS_DEF – Set the IP address allocated by ESP8266 soft-AP DHCP, save to flash
AT+CWAUTOCONN – Auto connect to AP or not
AT+CIPSTAMAC – Set MAC address of station
AT+CIPSTAMAC_CUR – Set MAC address of station
AT+CIPSTAMAC_DEF – Set MAC address of station, save as default
AT+CIPAPMAC – Set MAC address of softAP 
AT+CIPAPMAC_CUR – Set MAC address of softAP
AT+CIPAPMAC_DEF – Set MAC address of softAP and save as default
26. AT+CIPSTA – Set IP address of station
AT+CIPSTA_CUR – Set IP address of station
AT+CIPSTA_DEF – Set IP address of station and save as default
AT+ CIPAP – Set IP address of softAP
AT+CIPAP_CUR – Set IP address of softAP
AT+CIPAP_DEF – Set IP address of softAP, save as default
AT+CWSTARTSMART – Start SmartConfig
AT+CWSTOPSMART – stop SmartConfig
AT+CWSTARTDISCOVER – Start the mode that ESP8266 can be found by WeChat 
AT+CWSTOPDISCOVER – Stop the mode that ESP8266 can be found by WeChat 
AT+WPS – Set WPS function 
AT+MDNS – Set MDNS function

 

 

 3. TCP/IP Related AT Commands 

 

 


AT+CIPSTATUS – Check network connection status

AT+CIPDOMAIN – DNS function
AT+CIPSTART – Establish TCP connection, UDP transmission or SSL connection
AT+CIPSSLSIZE – Set the size of SSL buffer
AT+CIPSEND – Send data 
AT+CIPSENDEX – Send data 
AT+CIPSENDBUF – Write data into TCP-send-buffer
AT+CIPBUFSTATUS – Check status of TCP-send-buffer
AT+CIPCHECKSEQ – Check if a specific segment was sent successfully
AT+CIPBUFRESET – Reset segment ID count 
AT+CIPCLOSE – Close TCP, UDP or SSL connection
AT+CIFSR – Get local IP address
AT+CIPMUX – Enable multiple connections
AT+CIPSERVER – Configure as TCP server
AT+CIPMODE – Set transfer mode
AT+SAVETRANSLINK – Save transparent transmission link to flash 
AT+CIPSTO – Set TCP server timeout 
AT+PING – Function Ping
AT+CIUPDATE – Update through network
AT+CIPDINFO – Show remote IP and port with "+IPD"
+IPD – Receive network data

 

 

 

 

 

 

 





이미 KC 인증된 IoT 제품을 활용하기


(너무 많은 부분을 포함해서 부족한 내용을 계속 다음는 중입니다.)



 

 

 

 ESP8266 ESP-07S 시리얼 와이파이 모듈 KC인증

 

 ESP8266 ESP-12S 시리얼 와이파이 모듈 KC인증

 KC 인증제품(인증번호: MSIP-CRM-Eas-ESP07S)

 

 KC 인증제품(인증번호: MSIP-CRM-Eas-ESP07S)



 

 

 ESP-07S의 뒷면 사진.      

 ESP-07S의 앞면에서 보는 PIN-OUT.   ESP-07S & ESP-12S는 핀아웃이 똑같다.


KC 인증된 ESP8266 ESP-07S 시리얼 와이파이 모듈나 ESP8266 ESP-12S 시리얼 와이파이 모듈을 활용하여 아듀이노나 메가에 붙여서 마치 구식 컴에 와이파이 카드를 붙인것처럼 사용하기에 대해서 알아보겠다.   두 제품 다 사실상 PIN-OUT까지 똑같아서 구현 방법은 거의 같아서 설명을 ESP-07S로만 하겠다.   사실상 개인적으로 12보다는 07을 더 선호하는데 긴 안테나를 붙일수 있기 때문이다. (아래 안테나를 붙인 사진들 참조)

여기에 제품명 끝에 빨강색으로 S를 붙인 이유는 그 S가 붙은 제품만 KC 인증된 제품이기 때문이다.  

주문시 주의해야 할 것이다.    여기서 KC인증은 통신인증까지 포함됬다.

두 제품 다 가격이 국내에서 대략 5000원 + 부가가치세쯤인것 같다.


다음은 이 두 제품의 기본 특징이다.  


1. IoT용 무선랜WiFi모듈(802.11 b/g/n 지원)
2. ESP8266 과Software 100%호환
3. KC 인증제품(인증번호: MSIP-CRM-Eas-ESP07S)
4. FCC/CE등인증
5. AT Command 지원   <=== 이것이 주목해야 하는 핵심 기능.


두 제품 다 각자 독립적인 컨트롤러의 기능을 수행할 수 있지만, 쓰기에 무척 불편하고 3V3제품이라 많은 센서들과 전기적으로 호환성이 떨어지고 일반 아듀이노 우노, 나노, 메가같은 5V에 다수의 A/D와 다수의 I/O핀을 지닌 제품과는 상대적으로 개발환경이 비교가 불가능할 정도로 열악하다.  그리고 무엇보다도 아듀이노계열을 선호하게 되는 가장 큰 이유는 이미 10여년간 쌓여온 방대한 온라인 자료와 라이브러리다.     다량의 센서를 단 쬐끔 복잡한 장난감 자동차를 만들어도 자체적 통신기능이 있는 NodeMCU같은 제품으로 손쉽게 만들것 같지만 구조가 복잡해지면 질수록 NodeMCU같은 제품이 얼마나 열악한지 뼈저리게 경험하게 될 것이다.   최악의 경우는 사용하고자 하는 센서나 부품의 라이브러리가 아듀이노용으로는 흔한데 NodeMCU용으로는 없어서 라이브러리까지 만들어야 하는 황당한 경우일 것이다.       아주 단순하게 센서 한두개쯤 읽어서 통신으로 보고하는 지극히 단순한 체계를 벗어나면 실제로 복잡한 구조에서는 단순 통신 능력은 전체 프로젝트의 아주 작은 일부분에 지나지 않는다.   


예를 들면 대학동아리 프로젝트로 조그만 탱크바퀴와 로봇팔과 카메라 좌우상하조종, 다량의 센서, 음향기능등이 들어간 로봇을 1대를 만든다면 나는 아듀이노 나노나 메가에 HC-12 433 SI4463 serial wireless 같은 단순한 통신모듈을 쓰라고 권하겠다.    하지만 이런 것을 5대를 만들어 상호교류를 해야 한다던지 통합 컨트롤을 해야 한다던지, 20대, 200대 등등 수량이 늘어나면 날수록 정말 잘 정렬된 통합 통신방법이 아주 절실해진다.    이런 경우에 개당 6천원정도의 추가 비용으로 TCP/IP의 로컬 고정 주소를 갖고 비교적 빠른 속도 56k bps로도 통신이 가능하고 TCP/IP나 UDP 프로토콜로 중앙 컨트롤 PC와의 양방향 정보교환능력을 더할수 있다면 이건 옛날에는 꿈에서나 가능한 이야기였다.    


 

 

내가 거주하는 곳은 FCC 인증만 되면 되는 곳이라 ESP-07을 그냥 쓰면 된다.  외관이 ESP-07S와 쪼금 다르지만 100% 같은 제품.

 

 


첫 스텝 : AT 펌웨어 플래싱하기.

ESP-05는 기본적으로  AT 모드 Firmware로 되어나오지만 다른 기종 ESP-07S, ESP-12S은 LUA Firmware가 설치되어 올수도 있으므로 AT Firmware가 아니라면  AT Firmware를 Flash에 넣어줘야 한다.   

물건 주문시 AT Firmware가 기본적으로 설치되어 있느지를 확인한다면 정말 고생하나를 안해도 된다.

나는 필요할때 언제든지 그냥 집어쓰려고 2년 전 거의 20개정도의 ESP-07과 ESP-12를 AT Firmware로 Flashing을 해 놓아서 지금 다시 플래싱하는 법을 찾으려니 잘 기억이 안나서 그냥 링크만 걸어놓겠다. (주의 : 펌웨어 플래싱할때는 핀 연결 세팅이 다르다.  아래 그림 참조.)


 

 (비고 : 펌웨어 플래싱하는 방법은 직접 실험을 통해 확인한것이 아니라 부정확할수도 있습니다.) 


다음은 펌웨어 플래싱하는 방법을 소개한 링크이다.   http://www.instructables.com/id/ESP-12F-Flashing-AT-Firmware/

 이 사이트의 정보가 100% 맞는지는 확인 안했지만 스스로 찾아서 해도 충분히 할 수 있을듯 하다.

 


다음 툴들은 https://www.espressif.com/en/products/hardware/esp8266ex/resources 에서 다운받은 화일들.


최신 8266 AT Firmware (ESP8266 AT Bin, V1.6.1, 2018/02/13) 

esp8266_at_bin_v1.6.1.zip


최신 8266 플레싱 툴 (Windows PC용,   V3.6.4,  2018/03/06)    

FLASH_DOWNLOAD_TOOLS_V3.6.4.zip



둘째 스텝 : 펌웨어가 잘 들어갔나를 테스트하기.

 

그림에서는 간단하게 하기 위해서 보드의 3V3에 직접 연결했지만 통신모듈은 전력소모가 크기 때문에 전력원을 보드에서 빼는것은 좋은 방법이 아니다.

 


AT Firmware가 잘 들어갔다면 윗 핀넘버로 ESP-07S을 RX,TX를 연결된 상태에서 코드를 업하고 NANO를 돌리면 

Arduino IDE의 Serial Monitor 창을 AT Command를 넣는 창으로 쓸 수 있읍니다.


// NANO에 연결한 경우 샘플 테스트용 코드다.   

// MEGA는 시리얼이 원래 두개라 두번째걸 그냥 쓰면 된다. 그래서 위에 두 줄이 필요가 없다.

#include <SoftwareSerial.h>

SoftwareSerial Serial2(10, 11); // RX, TX 나노에서.


// Mega에서는 다음처럼 Serial2를 initialize한다.

// HardwareSerial & terminal = Serial;

// HardwareSerial & esp05 = Serial2;



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 가 있는 커맨드는 플래시에 저장되는 내용.


AT+CWJAP_DEF="당신의 와이파이 이름","와이파이 패스워드"   // 와이파이에 나중에 자동연결됨.

   // 이제 이 장비는 전원만 들어오면 자동으로 그 장소의 와이파이에 자동으로 접속되고,

   // 라우터에서 이 장비의 MAC 주소를 특정 아이피 주소로 지정해 놓으면 이 장비는 항상 같은 로컬 고정 아이피를 갖는다.

   // 이 기능이 공장이나 농장의 자동화에 얼마나 중요한지는 알만한 사람들은 다 공감할 것이다.


AT+CIPMUX=1     //  다중 접속 허용


AT+CIPSTART="UDP","0",0,6767,2    //  실험때는, UDP 는 특정 IP를 입력 안해도 메세지를 받는다.


============================================================================



참고용 AT 명령어 리스트 링크 :  2018/03/16 - [Reference Items] - ESP-07S & ESP-12S 의 AT Command Set




다음은 Ubuntu에서의 연결 실험이다.   Windows라면 다른 방법을 써야 하겠지만 구글링으로 쉽게 찾을수 있다.

여기서 보면 ESP-07에서 받은 메세지는 앞에 +IPD, 14: 나 +IPD, 2, 14: 등이 포함되 있기 때문에 : 이전 텍스트는 걸러줘야 한다.   


예문 :  샘플 NANO 코드 :  

     단순한 예 : MEGA_ESP-05_SAMPLE_CODE.ino

     좀 더 복잡한 예: HMC5883L_MPU6050.ino


모든 아듀이노 코드를 보면 알겠지만 각 장비와 계속 대화를 나눠주는 PC 의 어플이 없으면 안된다.

PC의 통합 관리 프로그래밍은 그 자체만으로도 시그널을 받아서 필요하면 데이타베이스에 넣어주고,

웹에 포스팅도 해주고, 이멜도 보내주고 등등 그 기능이 너무 방대해서 따로 다루기로 하겠다.


아래 사진은 장비(Bot) 10개의 다른 개체에 한개씩 통신 테스트를 하는 사진이다.  지금 이 사진은 10번 Bot (Mega + ESP-05)으로 중앙 관리 프로그램에서 50번 시그널을 쏘는 테스트다.   10번 Bot은 와이파이로 받은 시그널을 시리얼포트로 넘겨줘서 아듀이노 IDE의 시리얼모니터로 시그널을 잘 받는지 확인하는 모습이다.   이 실험에 사용된 10번 Bot은 ESP-05를 넷카드로 사용했지만 ESP-07을 쓰든 ESP-12를 쓰든 방법이 다 똑같다.   모두 ESP8266코어를 사용해서 커맨드까지 똑같다.   여기서 보면 #010(기계번호)-TO## (1..50) ....  구조로 데이타를 보냈는데 ESP8266 를 AT모드 외에 다른 모드에서는 저정도의 속도로 계속 시그널을 보내면 엄청난 데이타실종사태가 벌어진다.  중간에 듬성듬성 몇줄씩이 사라지고 통신의 신뢰성을 심각하게 의심하게 만든다.  여러 실험을 해 본 결과 AT모드가 ESP8266의 통신에서는 가장 안정적이란 결론을 내리게 됬다.


윗 실험에 사용된 실제 모델.


------------------------------------------------------------------------------------------------------------------------------


가상실습


한번 위에 기술을 응용해서 아주 단순한 문제를 갖고 가상 실습의 예를 보겠다.

   

가령 어느 기업에서 사람이 직접 하루에 한번씩 돌면서 해오던 100개의 커다란 발효탱크의 상황검사를 자동화하기로 결정했다고 하자.  모니터링할 자료는 각 탱크의 특정 기체의 농도, 온도, 습도 딱 세가지 정보.   그리고 이왕에 자동화하는 김에 하루에 한번이 아니라 30분마다 자동으로 DB에 상황을 기록하고 이상현상이 있으면 경보알람 + 담당자들에게 이메일을 하게 만들기로 했다고 치자.


여기서 온라인에 떠 있는 대부분의 ESP8266계열들의 샘플은 누군가 각기의 기기에 웹브라우저로 접속해서 접속하는 내용들이 주류를 이룬다.   왜냐면 대부분의 샘플들이 한개의 모니터링 장비 위주로 아마추어들이 쉽게 이해되도록 만들어졌기 때문이다.   이런 방식은 효율성이 없어서 기업에서는 정말 쓸모가 없다.  특히 대기업에서는 온라인에 교육용으로 나와있는 허접한 방식을 제안했다가는 망신당하기 딱 좋다.


이제 프로처럼 문제를 풀어보자.   중앙컨트롤 프로그램에서 30분마다 자동반복실행되는 timer기능에 Tank로 이름붙인 DB의 Table을 읽고 모든 모니터링 기기에 3초당 한 기기씩 그 기기의 고유 로컬 아이피주소로 TCP/IP로든 UDP로든 Wifi 로 "#001:REPORT>" 명령어를 보낸다.  여기서 #는 명령어 시작, 001은 기기 번호(탱크번호), REPORT는 보고하라는 명령, >는 흔히 무전할때 오버! 하는 끝마침표.   이런 규약은 프로그래머가 자신이 원하는 방식대로 정하기만 하면 된다.  어차피 기기에 들어갈 그 명령어를 받고 해석하는 코딩도 본인이 할 것이기 때문이다.   

그럼 기기가 메세지를 받고 

   자신의 번호와 명령받은 번호가 일치하나 확인하고,

   명령어가 무엇인가 확인하고,  만약 명령어가 REPORT라면 센서들을 읽고 답신을 한다.

   R001:CONC;1.3> ;설명하자면 Respond from Tank 001, gas CONCentration is 1.3 ppm 

   R001:TEMP;48>    ; TEMPerature 48C

   R001:MOIS;15>    ; MOISture level 15%

이 세 메세지를 중앙컨트롤 프로그램에서 받으면 그 시간과 탱크번호(기기번호)와 자료를 모두 DB에 입력한다.  동시에 데이타값에 이상신호가 있으면 상황발생 알람을 울리고 메일을 보내준다.  그래서 각 기기들은 아주 단순한 통신기능 + 3가지 센서만 딸랑 있으면 나머지는 중앙컨트롤 프로그램에서 다 알아서 해 준다.  각 기기는 자신이 언제 보고하는지 시간도 몰라도 된다.  그냥 명령어 받으면 센서값을 읽고 딱 3문장만 보고하면 끝.   


100개의 탱크를 다 모니터하는데 걸리는 시간은 5분.  관리실에 컴에 메인 창에는 특별한 정보 없이 평소때는 큰 글씨로 "이상 무" 와 옆에 현재 잘 작동하고 있다는 표시로 깜빡이는 부호만 나온다.   보다  fancy한 효과를 주려면 이쁜 그래픽으로 현재 모니터링 하는 탱크를 나타내 준다던가 마지막 모니터링한 시간, 다음 모니터링할 시간등 추가 정보도 줘도 된다. 

특별히 문제가 발생하면 소리알람과 함께 깜빡이는 큰 글씨로 "상황발생: <상황의 자세한 내용, 시간과 몇번 탱크에 무슨 문제인가>"를 표기해 준다.   그리고 나중에 경영진이 검사할 수 있도록 문제발생내역도 DB에 자동으로 입력해 준다.  차후 담당직원이 그 상황을 어떻게 대처했나를 직접 입력하게도 해 주어야 한다.      그리고 DB에 들어 있는 자료를 사용해 언제든지 쿼리와 리포팅 툴로 얼마든지 경영진이 원하는 정보를 만들어낼수 있다.


(*) 내용이 너무 복잡해질까봐 까다로운 내용은 모두 감추고 단순히 메세지 전달부분만을 최대한 간결하게 요약한 내용이다.





내가 ESP32를 ESP8266계열보다 선호하는 이유  #1.


신호의 정확성 : ESP32는 Wifi로 빠른 속도로 다량의 신호를 보낼때 ESP8266계열보다 훨씬 정확합니다.    


   제가 주로 프로그램하는 방식은 (다수의 조그만 노드들 + 강력한 중앙 컨트롤 타워 프로그램) 을 선호하는데,

그 이유는 이 방식으로 처음부터 연습이 되야 먼 훗날

   공장을 관리하든, 

   농장을 관리하든, 

   자동화 주택을 만들든,

   협동 운영 무기체계를 만들든,

   도시를 관리하든,

   나라를 관리하든,

뭔가 진짜 쓸만한 것을 만들수 있기 때문입니다.
처음에는 좀 더 힘들지만 마치 옛날 몽골족이 아기 걸음마 할때부터 말위에 앉히듯이 말입니다.


   이런 디자인에 필수요소는 TCP/IP나 UDP 통신입니다.   TCP/IP를 사용하면 코드가 더 복잡해 져서 저는 UDP를 선호합니다.   중앙 시스템(주로 강력한 PC에 실행되는 프로그램)과 수없이 많은 센서와 기계들이 쉴틈없이 서로 정보를 주고 받아야만 하는데 지금까지 실험해 본 ESP8266계열의 메세지 전달 능력은 극도로 심각하다 할 정도로 데이타의 Loss가 많았습니다.    가령 '#(incremental number) + ABCDEFGHIJKLMNOPQRSTUVWZYZ' 를 50번을 1..50 까지 쉴틈없이 이어서 보내면 농담이 아니라 1/5정도는 PC로 데이타가 전달이 안됩니다.   맨 앞에 자동으로 1씩 더해서 보내면 놓치는 줄이 보이는데 너무 심각할 정도로 자료를 공중에 잃어버려서 장난감이 아닌가 할 정도의 수준이었습니다.     ESP8266의 제작자들도 이 문제를 풀기 위해 후속 기종인 ESP32에서는 듀얼코어에 평소에 코어 하나가 네트웍을 전담하게 했습니다.    ESP32로 같은 실험을 하면 거의 놓치는 자료없이 전달되는 것을 눈으로 확인하고 완전히 푹 빠졌습니다.   


   위에 나열한 통합시스템들중 공장, 농장, 자동화주택같은 근거리 형태, 즉 반경 300m 이내의 조그만 크기 (28만 sq.m / 85,000평 / 28 헥타르) 까지는 특별한 초고가의 장비를 안쓰고도 고급기종의 일반 wifi 라우터와 wifi repeater들과 단순 네트웍 케이블만 써도 큰 돈 안들이고도 통합관리가 실제로 가능합니다.     실제로 PC와 싸구려지만 제대로 된 통신능력을 갖춘 ESP32들만로도 과거에는 규모있는 기업에서나 감당하던 일들이 이젠 일반 개인들도 구현이 가능해졌습니다.

   

 

 

다음은 제가 8개월 전 구입한 ESP32 보드들입니다.

 

이 사진에서 최고의 관심사는 저 둔탁한 케이블.

 

 

 

조그만 놈은 Geekcreit (doit) 에서 만든 기종이고,

 

좀 길고 18650밧데리를 낄수있게 만든 놈은 Wemos 에서 만든 기종입니다.

 

각 기종을 3개씩 구입했는데 조그만 놈중 하나는 처음부터 아예 작동을 안하는 불량품(불량률 33%).

 

여기에 USB 케이블까지 사진에 올린데에는 케이블이 너무나도 중요한 사항이기 때문입니다.

 

처음 ESP32를 구입해서 가장 큰 문제점은 아듀이노 IDE에서 시리얼로 못잡는 문제였습니다.

 

제가 NodeMCU와 아무 문제없이 써 온 마이크로 USB케이블들이 다 ESP32는 시리얼을 못잡아냈고,

 

딱 한 케이블은 시리얼을 잡아서 프로그램도 업로드까지 가능해서 잘 썼는데,

 

코드에서 ESP32의 자체 와이파이 기능을 작동시키는 순간 시리얼 통신이 뚝 끈겼습니다.

 

느낌에 전력이 부족한듯 해서 보드에 외부전력을 따로 공급해서 겨우 살려내긴 했지만 

 

평소에 외부 전력선을 계속 달고서는 개발작업하기는 힘들어 애를 먹었습니다. 

 

사진에 USB케이블은 그 후 집을 다 뒤져서 찾아낸 옛날에 다이소에서 $1불씩 주고 두개 구입해 놓은 놈으로, 

 

길이가 너무 짧고 부드럽지도 않아서 그냥 아무데나 던져놓고 거의 안썼던 케이블이었는데,

 

신기하게도 유일하게 이 케이블 두개만 어떤 경우에도 ESP32와 항상 늘 아무 문제없이 작동해왔습니다.

 

진짜 효자 케이블!!!

 

위에 설명한 micro-USB케이블과 ESP32와의 문제는 5개의 다른 컴퓨터에서 똑같이 나타난 문제점이라

 

아마도 일반적인 문제가 아닌가 싶습니다.

 

 

WeMos® WiFi + Bluetooth + 18650 Battery ESP32 Development Tool

 

 

 

Geekcreit® ESP32 Development Board WiFi+Bluetooth 

Ultra Low Power Consumption Dual Cores ESP-32 ESP-32S Board (DOIT 제품)

 

 

--------------------------------------------------------------------------------------------------------------------------------

셀폰으로 사진 찍고 옮기고 하는 과정이 너무 번거로와서 

Ubuntu에서 Cheese 웹켐 프로그램으로 찍어서 화질이 좀 구립니다.

+ Recent posts