(추가) 사진 보충설명과 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;

   }

 

}


새로 주문한 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





내가 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