'UART'에 해당되는 글 6건

  1. 2021.02.02 Hardware | ESP-12 사용기 6
  2. 2021.01.08 Hardware | ESP-07 사용기 2
  3. 2020.08.17 Hardware | ESP-03 사용기
  4. 2020.08.14 Hardware | ZE08-CH2O Formaldehyde 센서 사용해보기 4
  5. 2020.03.18 Hardware | CO2 센서인 MH-Z14A 를 활용해 보자 2
  6. 2019.03.18 Hardware | PN523 - RFID / NFC breakout 보드

Hardware | ESP-12 사용기

|

ESP-01 부터 시작한 ESP8266 시리즈 중, 이번에는 ESP-12 사용기 입니다.


* Hardware | ESP-07 사용기

https://chocoball.tistory.com/entry/Hardware-ESP07-using


* Hardware | ESP-03 사용기

https://chocoball.tistory.com/entry/Hardware-ESP03-using


* Hardware | ESP-01 or ESP8266 사용기 - 5

https://chocoball.tistory.com/entry/Hardware-ESP01-or-ESP8266-using-5


* Hardware | ESP-01 or ESP8266 사용기 - 4

https://chocoball.tistory.com/entry/Hardware-ESP01-or-ESP8266-using-4


* Hardware | ESP-01 or ESP8266 사용기 - 3

https://chocoball.tistory.com/entry/Hardware-ESP01-or-ESP8266-using-3


* Hardware | ESP-01 or ESP8266 사용기 - 2

https://chocoball.tistory.com/entry/Hardware-ESP01-or-ESP8266-using-2


* Hardware | ESP-01 or ESP8266 사용기 - 1

https://chocoball.tistory.com/entry/Hardware-ESP01-or-ESP8266-using-1




1. 구입


일전에 구입한 ESP-07 와 동일한 업자에게서 구입.


* ESP8266 ESP-01 ESP-01S ESP-07 ESP-12E ESP-12F remote serial Port WIFI wireless module intelligent housing system Adapter 2.4G

https://www.aliexpress.com/item/32339917567.html



도착 샷.



Pinout 정보가 새겨진 뒷면.





2. Pinout


ESP8266EX 칩을 충분히 활용할 수 있는 Pinout 구성으로 되어 있습니다.





3. Breakout 보드


중간의 0 ohm 을 제거해 주면, 뒷 면의 Voltage Regulator 를 사용할 수 있게 됩니다.

이는 ESP-07 에서도 다루었던 내용이라, 자세한 내용은 생략합니다.





4. Diagram


Programming (Flashing) 하는 연결도와 Normal (구동) 하기 위한 연결도는 다릅니다. 아래 사이트에서 정보를 얻었습니다.


* Programming ESP8266 ESP-12

https://www.instructables.com/Programming-ESP8266-ESP-12/



* Programming Mode


Flash 메모리에 새로은 firmware 나 source 를 올리기 위한 mode 입니다.

차이는 IO0 / 18 번 pin 을 pull-up 해주냐 마냐의 차이.



* Normal Use Mode (after Upload)


Flash chip 에 업로드한 프로그램을 실행시키기 위한 모드 입니다.


위의 Programming 모드와 Normal 모드를 결합한 연결 구성 입니다.

이 Programming mode 로 진입하기 위해서는, 스위치 버튼 눌러주면서 전원을 on 하면 됩니다.



실제 구성 사진은 다음과 같습니다.


사실은 Breakout 보드에 ESP-12 를 결합해 놨으므로, Breakout 보드상에 이미 장착된 저항을 이용하면, 추가로 저항 2개만 필요합니다.

위 / 아래 연결 구성은 Breakout 보드가 없을 때의 모습이지만, 필요한 Pin 에 Voltage/Ground 가 연결되어 있으므로 문제 없이 동작합니다.



ESP2866 계열에서는 그나마 끝판왕인 ESP-12 가 연결된 모습.





5. 기본 확인


기본으로 올려진 Firmware version 과 몇 가지 명령어 시험.

기본 버전은 2016년1.3.0.0 이군요.



AT+RST 를 이용하여 rebooting. 사용된 Flash Chip 정보를 알 수 있습니다. QIO 모드이면서 32Mbit (512KB+512KB) 라고 나옵니다.

32Mbit1024KB+1024KB 일 듯 한데... 일단 넘어 갑니다.



Internet 에 연결하여 AT+CIUPDATE 실행을 통하여 원격 update 를 시도해 봤으나, ERROR 를 냅니다. 역시나 옛날 버전.



Flash Chip 은 QUAD : 32Mbit 로 문제 없이 확인 됩니다.





6. Programming


일단은 문제가 없는 듯 하니, source 를 올려 봅니다. 테스트 해볼 소스는 BlinkCheckFlashConfig.



CheckFlashConfig 소스는 다음과 같습니다.


/*
  ESP8266 CheckFlashConfig by Markus Sattler

  This sketch tests if the EEPROM settings of the IDE match to the Hardware
*/

void setup(void) {
  Serial.begin(115200);
}

void loop() {

  uint32_t realSize = ESP.getFlashChipRealSize();
  uint32_t ideSize = ESP.getFlashChipSize();
  FlashMode_t ideMode = ESP.getFlashChipMode();

  Serial.printf("Flash real id:   %08X\n", ESP.getFlashChipId());
  Serial.printf("Flash real size: %u bytes\n\n", realSize);

  Serial.printf("Flash ide  size: %u bytes\n", ideSize);
  Serial.printf("Flash ide speed: %u Hz\n", ESP.getFlashChipSpeed());
  Serial.printf("Flash ide mode:  %s\n", (ideMode == FM_QIO ? "QIO" : ideMode == FM_QOUT ? "QOUT" : ideMode == FM_DIO ? "DIO" : ideMode == FM_DOUT ? "DOUT" : "UNKNOWN"));

  if (ideSize != realSize) {
    Serial.println("Flash Chip configuration wrong!\n");
  } else {
    Serial.println("Flash Chip configuration ok.\n");
  }

  delay(5000);
}


QIO4MiB 네요. 지금까지 완성품을 구입한 ESP8266 계열에서는 가장 좋은 Flash Chip 을 사용한 모듈 입니다.



소스가 업로드 되는 과정에 있어서도 문제 없습니다. 순탄한 흐름.


esptool.py v2.8
Serial port COM3
Connecting....
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: 50:02:91:78:d3:60
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Auto-detected Flash size: 4MB
Compressed 267104 bytes to 196785...
Wrote 267104 bytes (196785 compressed) at 0x00000000 in 17.5 seconds (effective 122.3 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...


보드상에 장착된 LED 를 깜빡이는 소스 입니다.


/*
  ESP8266 Blink by Simon Peter
  Blink the blue LED on the ESP-01 module
  This example code is in the public domain

  The blue LED on the ESP-01 module is connected to GPIO1
  (which is also the TXD pin; so we cannot use Serial.print() at the same time)

  Note that this sketch uses LED_BUILTIN to find the pin with the internal LED
*/

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);     // Initialize the LED_BUILTIN pin as an output
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, LOW);   // Turn the LED on (Note that LOW is the voltage level
  // but actually the LED is on; this is because
  // it is active low on the ESP-01)
  delay(1000);                      // Wait for a second
  digitalWrite(LED_BUILTIN, HIGH);  // Turn the LED off by making the voltage HIGH
  delay(2000);                      // Wait for two seconds (to demonstrate the active low LED)
}


예상한 것과 달리 문제 없이 동작.



지금까지 ESP8266 가지고 놀았던 과정 중, 전혀 문제 없이 여기까지 왔습니다.

ESP8266 을 Flashing 하는 작업은 이제 통달 한 듯 한 느낌.




7. Firmware Update


최신 firmware 를 사용합니다. 2020년에 공개된 Non-OS SDK 3.0.4 를 이용합니다.


ESP8266_NONOS_SDK-3.0.4.zip



Firmware upload 에 필요한 BIN 파일 및 Address 는, 최신 문서에 잘 나와 있습니다.

4a-esp8266_at_instruction_set_en.pdf



32 Mbit (4 MiB) 버전이므로, 아래 section 을 찾아 BIN / Address 정보를 그대로 사용합니다.


---------------------------------------------------------------------------------------------
|               BIN             | Address  |                 Description                    |
---------------------------------------------------------------------------------------------
| boot_v1.7.bin                 | 0x00000  | In /bin/at.                                    |
---------------------------------------------------------------------------------------------
| user1.2048.new.5.bin          | 0x01000  | In /bin/at/1024+1024.                          |
---------------------------------------------------------------------------------------------
| blank.bin                     | 0x3FB000 | Initializes RF_CAL parameter area.             |
---------------------------------------------------------------------------------------------
| esp_init_data_default_v08.bin | 0x3FC000 | Stores default RF parameter values,            |
|                               |          | has to be downloaded into flash at least once. |
|                               |          | If the RF_CAL parameter area is initialized,   |
|                               |          | this bin has to be downloaded too.             |
---------------------------------------------------------------------------------------------
| blank.bin                     | 0xFE000  | Initializes Flash user parameter area,         |
|                               |          | more details in Appendix.                      |
---------------------------------------------------------------------------------------------
| blank.bin                     | 0x3FE000 | Initializes Flash system parameter area,       |
|                               |          | more details in Appendix.                      |
---------------------------------------------------------------------------------------------


Flash chip 용량이 크고, SPI Mode 도 빠르기 때문에, 1024 KB + 1024 KB (32 Mbit-C1) 버전으로 입혀 봅니다.



별다른 문제 없이 성공. 최신 버전인 AT - 1.7.4 / SDK - 3.0.4 가 올라 갔습니다.




AT+RST 를 이용하여 rebooting sequence 를 보면, QIO / 32Mbit(1024KB+1024KB) 로 잘 동작 합니다.



참고로, "SpiAutoSet" 을 키고 업로드 하면, 강제로 32Mbit 으로 변경됩니다.



1024 KB + 1024 KB (32 Mbit-C1) 버전용 BIN / Address 를 사용하고 있으므로, 메뉴얼로 32Mbit-C1 을 선택해 줘야 합니다.




8. AT Command 확인


Internet 접속 및 전번적인 확인 작업. 특별히 문제 없슴.


* AT+CWMODE_CUR : Sets the Current Wi-Fi mode; Configuration Not Saved in the Flash

- 1: Station mode

- 2: SoftAP mode

- 3: SoftAP+Station mode


* AT+CWLAP : Lists Available APs


* AT+CWJAP_CUR : Connects to an AP; Configuration Not Saved in the Flash


* AT+CIFSR : Gets the local IP address


* AT+PING="www.google.com" : Ping packets




* AT+CIPSTATUS : Gets the connection status


* AT+CIPBUFSTATUS : Checks the status of TCP-send-buffer


* AT+CWQAP : Disconnects from the AP


AP 와 연결을 끊으면, internet 연결 정보가 깔끔하게 reset 되지 않고 일정 시간동안 남아 있습니다.

시간이 지나고 다시 확인하면 reset 되어 있슴.




* AT+CIUPDATE : Upgrades the software through network


역시 최신 firmware 라 그런지, FOTA - 인터넷을 통한 firmware update 가 가능합니다.



Firmware update 하면서 LED 가 깜빡거리는 모습이 좋아, 동영상으로 담아 봤습니다.




* AT+RESTORE : Restores the Factory Default Settings



모든 확인이 끝났습니다. 앞으로 sensor 들과 같이 활용할 기회에 사용하면 되겠네요.




FIN


중국 제조사 답게 WeChat 관련한 옵션이 새로 추가되었습니다.



And

Hardware | ESP-07 사용기

|

ESP8266 시리즈를 사용해 보면서, ESP-01 부터 시작하여 ESP-03 을 사용해 보았습니다.


* Hardware | ESP-03 사용기

https://chocoball.tistory.com/entry/Hardware-ESP03-using


* Hardware | ESP-01 or ESP8266 사용기 - 5

https://chocoball.tistory.com/entry/Hardware-ESP01-or-ESP8266-using-5


* Hardware | ESP-01 or ESP8266 사용기 - 4

https://chocoball.tistory.com/entry/Hardware-ESP01-or-ESP8266-using-4


* Hardware | ESP-01 or ESP8266 사용기 - 3

https://chocoball.tistory.com/entry/Hardware-ESP01-or-ESP8266-using-3


* Hardware | ESP-01 or ESP8266 사용기 - 2

https://chocoball.tistory.com/entry/Hardware-ESP01-or-ESP8266-using-2


* Hardware | ESP-01 or ESP8266 사용기 - 1

https://chocoball.tistory.com/entry/Hardware-ESP01-or-ESP8266-using-1


이번에는 ESP-07 입니다.




1. 구입


아래 AliExpress 링크에서 구입 했습니다.

ESP-12 도 함께 구입 했으니, 이 글 다음에는 ESP-12 에 대해서도 다뤄 보도록 하겠습니다.


* ESP8266 ESP-01 ESP-01S ESP-07 ESP-12E ESP-12F remote serial Port WIFI wireless module intelligent housing system Adapter 2.4G

https://www.aliexpress.com/item/32339917567.html



도착 샷. 깡통 쉴드로 전자파 차폐가 되어 있습니다.



PCB 밑부분은 IO Pin 정보가 기재되어 있습니다.

제조는 DOITING 이라는 회사인 듯 한데, PCB 는 AI-Thinker 로 보이네요. 설계가 동일한지라 완전 짬뽕.



Pinout 정보 입니다.





2. Breakout Board


ESP-03 때도 사용 했었지만, EPS-07 / ESP-12 도 Breakout 보드에 올렸습니다.

이 Breakout 보드가 없으면, 2.54mm 의 Pin 간격이 맞지 않아 빵판에서 그 대로 사용할 수 없게 되어 있습니다.



주의해야 할 사항으로는, Voltage Regulator 를 추가로 장착시에는 중간에 보이는 "0" resistor 를 제거해야 정상 동작 됩니다.


* Adding Wi-Fi telemetry to the Pixhawk flight controller with an ESP8266 module

https://rays-blog.de/2016/10/21/224/adding-wi-fi-telemetry-to-pixhawk-flight-controller-with-esp8266-module/



혹시 모를 전압 문제를 방지하고자, Voltage Regulator 를 장착 했습니다.

사실 3.3V 만 제대로 넣어 주면 상관 없는 것이긴 한데, 기판에 활용을 할 수 있게 해 놨으니 사용해 봅니다.


5V 를 인가하면, 3.3V 로 바꿔서 ESP-07 에 전압을 인가해 줍니다.



중간에 보이는 "0" ohm 저항은 이쁘게 제거.



그 위에 ESP-07 을 얹어 줍니다.



CH_PC 을 측정해 보면, 자동으로 전압이 Pull-down 되어 있는 것을 알 수 있습니다.





3. Diagram


Pinout 정보를 기반으로 연결해 보면 아래와 같이 됩니다.



다만, Breakout 보드에 Voltage Regulator 이외에, 필요한 Pull-down 저항이 구비되어 있으니, 연결은 좀 더 간단하게 할 수 있습니다.


* How to prepare your ESP8266 (ESP-12) for flashing

https://www.sensate.io/tutorial-how-to-prepare-your-esp8266-esp-12-for-flashing


아래는 Breakout 보드가 없는 경우의 생 연결도 입니다.




아래는 Breakout 보드를 사용 했을 때의 연결도 입니다. (저의 경우)



Breakout 보드가 있더라도 Breakout 보가 없는 연결 방법을 해도 문제는 없으나,

이왕이면 정식 + 간단한 방법인 연결을 사용하면 되겠습니다.



실제 연결 모습은 아래와 같습니다.





4. 기본 Firmware 확인


기본 firmware 이 장착된 상태 이니, 어떤 version 인지 확인해 봅니다.

1.1.0.0 이고, 2016년 병신년 버전이네요.



AT+RST 하면, 보통 Flash Chip 정보도 나옵니다만, 예전 버전이라서 그런지 그딴거 없습니다.



Internet 연결 후, AT+CIUPDATE 를 해봐도 ERROR 만 반겨 줍니다.





5. 삽질의 향연


새로운 Firmware 를 올리고 시험해 봤으나, 아래와 같이 err 만 내 뱉습니다.

또한, BAUD Rate 가 74880 baud 의 변태적인 설정에서만 문자가 보이는 것이 맘에 들지 않더군요.



ESP8266 DOWNLOAD TOOL 에서 ERASE 후, firmware 올려도 동일한 현상입니다.




* 문제 1 : 적절한 Board 선택


첫 번째 문제는, Flash Chip 확인 위한 소스를 올릴 때, Generic ESP8266 Module 이 아니라,

먼저 테스트 했던 ESP-12 Module 용으로 설정 했던 것이 원인이었습니다.


ESP-12 용으로 소스가 입혀지다 보니, memory address 의 시작 지점부터 꼬였었던 것이 아닌가 추측해 봅니다.




* 문제 2 : 적절한 Flash Chip 의 SPI Mode 선택


Flash ChipSPI Mode 가 Q 로 시작하는 QIO / QOUT 으로 설정한 것이 문제였습니다.



Flash Chip 은, ESP8266 DOWNLOAD TOOL 에서 "SpiAutoSet" 을 이용하여 자동 인식을 사용하면 QUAD 로 인식됩니다.

그리하여, 비슷한 QIO 또는 QOUT 로 설정하면 될 것 같으나, 사실은 DOUT 로 설정해야 정상 동작 합니다.


정상적일 때, Flash Chip 인식 소스를 이용하여 확인해 봐도, DOUT 으로 확인이 가능합니다.


File > Examples > ESP8266 > CheckFlashConfig


/*
  ESP8266 CheckFlashConfig by Markus Sattler

  This sketch tests if the EEPROM settings of the IDE match to the Hardware
*/

void setup(void) {
  Serial.begin(115200);
}

void loop() {

  uint32_t realSize = ESP.getFlashChipRealSize();
  uint32_t ideSize = ESP.getFlashChipSize();
  FlashMode_t ideMode = ESP.getFlashChipMode();

  Serial.printf("Flash real id:   %08X\n", ESP.getFlashChipId());
  Serial.printf("Flash real size: %u bytes\n\n", realSize);

  Serial.printf("Flash ide  size: %u bytes\n", ideSize);
  Serial.printf("Flash ide speed: %u Hz\n", ESP.getFlashChipSpeed());
  Serial.printf("Flash ide mode:  %s\n", (ideMode == FM_QIO ? "QIO" : ideMode == FM_QOUT ? "QOUT" : ideMode == FM_DIO ? "DIO" : ideMode == FM_DOUT ? "DOUT" : "UNKNOWN"));

  if (ideSize != realSize) {
    Serial.println("Flash Chip configuration wrong!\n");
  } else {
    Serial.println("Flash Chip configuration ok.\n");
  }

  delay(5000);
}


DOITING 사의 원가 절감이나, Fake Chip 을 이용한 Flash 메모리 구성이 이런 결과를 초래한 것 같습니다.





6. Firmware 최신


하루 동안의 삽질을 끝내고, 겨우 최신 firmware 로 업데이트가 가능 했습니다.

아래 사이트에서 최신 버전의 firmware 를 다운로드 받습니다.


* ESPRESSIF

https://www.espressif.com/

ESP8266_NONOS_SDK-3.0.4.zip


2021년 1월 기준, V3.0.4 가 최신입니다.



관련 문서를 보면, 8 Mbit = 1MiB Flash 를 update 와 관련한 address 와 해당 파일에 잘 나와 있습니다.


4a-esp8266_at_instruction_set_en.pdf



사용될 파일과 Address 정보는 다음과 같습니다.


---------------------------------------------------------------------------------------------
|               BIN             | Address  |                 Description                    |
---------------------------------------------------------------------------------------------
| boot_v1.7.bin                 | 0x00000  | In /bin/at.                                    |
---------------------------------------------------------------------------------------------
| user1.2048.new.2.bin          | 0x01000  | In /bin/at/512+512.                            |
---------------------------------------------------------------------------------------------
| blank.bin                     | 0xFB000  | Initializes RF_CAL parameter area.             |
---------------------------------------------------------------------------------------------
| esp_init_data_default_v08.bin | 0xFC000  | Stores default RF parameter values,            |
|                               |          | has to be downloaded into flash at least once. |
|                               |          | If the RF_CAL parameter area is initialized,   |
|                               |          | this bin has to be downloaded too.             |
---------------------------------------------------------------------------------------------
| blank.bin                     | 0x7E000  | Initializes Flash user parameter area,         |
|                               |          | more details in Appendix.                      |
---------------------------------------------------------------------------------------------
| blank.bin                     | 0x3FE000 | Initializes Flash system parameter area,       |
|                               |          | more details in Appendix.                      |
---------------------------------------------------------------------------------------------


ESP8266 Download Tool 을 이용하여 Flashing 합니다.



짜잔~~ 최신 버전으로 update 되었습니다.





7. 최신 Firmware 확인


AT+RST 를 통해 booting sequence 를 확인해 봅니다.

SPI ModeDOUT 이며, 8Mbit (512KB+512KB) 버전이라는 것을 알 수 있습니다.



Internet 연결을 위한 AT 명령어들을 차례로 확인해 봅니다.


AT+CWMODE_CUR=3 : Sets the Current Wi-Fi mode. Configuration Not Saved in the Flash.

-- 1: Station mode

-- 2: SoftAP mode

-- 3: SoftAP+Station mode


AT+CWLAP : Lists Available APs


* AT+CWJAP_CUR : Connects to an AP; Configuration Not Saved in the Flash


* AT+CIFSR : Gets the local IP address


* AT+PING="www.google.com" : Ping packets



* AT+CIPSTATUS : Gets the connection status


* AT+CIPBUFSTATUS : Checks the status of TCP-send-buffer




* AT+CIUPDATE : Upgrades the software through network


최신버전이라서 그런지, 인터넷을 통한 업데이트도 잘 됩니다.

신기한건, 분명 동일한 소스인데, 이렇게 인터넷을 통해 업데이트 하면 compile time 이 3초 (17초에서 20초로 변경) 정도 차이 납니다.

또한, jump to run user2 @ 81000 이라고 뜨면서, user 와 그 뒤의 숫자가 변경됩니다. 아마 모드가 바뀌면서 그런 듯.



* AT+RESTORE : Restores the Factory Default Settings


RESTORE 를 사용하면, 공장 초기화 및 rebooting 을 합니다.



궁금하여, AT+CIUPDATE 를 한번 더 했더니만, user 와 숫자가 원래 대로 되돌아 왔습니다.

Running 과 Control 모드, 두 개가 각각 번갈아 가면서, 동작을 관장 하는 것 같네요.



참고로, AT+CIUPDATE 동작하는 동영상을 올립니다. 다운로드 > Flashing > rebooting 의 일련의 과정이 한 번에 일어납니다.





8. Source 확인


Blink 소스를 올려 봤습니다.


File > Examples > ESP8266 > Blink


/*
  ESP8266 Blink by Simon Peter
  Blink the blue LED on the ESP-01 module
  This example code is in the public domain

  The blue LED on the ESP-01 module is connected to GPIO1
  (which is also the TXD pin; so we cannot use Serial.print() at the same time)

  Note that this sketch uses LED_BUILTIN to find the pin with the internal LED
*/

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);     // Initialize the LED_BUILTIN pin as an output
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, LOW);   // Turn the LED on (Note that LOW is the voltage level
  // but actually the LED is on; this is because
  // it is active low on the ESP-01)
  delay(1000);                      // Wait for a second
  digitalWrite(LED_BUILTIN, HIGH);  // Turn the LED off by making the voltage HIGH
  delay(2000);                      // Wait for two seconds (to demonstrate the active low LED)
}


이쁘게 잘 동작 합니다.



FIN


And

Hardware | ESP-03 사용기

|

ESP8266 을 사용하면서 GPIO 핀이 많은 모듈이 필요해 졌습니다.


기존 ESP-01 은 arduino 와 연결하여 WiFi 부분을 커버하는 것 외에 sensor 로부터 값을 입력 받을 수 있는 추가 Pin 이 없습니다.

포름알데히드 센서를 이용해 보면서, ESP-01 말고 GPIO 핀이 많은 것을 찾게 되었습니다.


* Hardware | ZE08-CH2O Formaldehyde 센서 사용해보기

https://chocoball.tistory.com/entry/Hardware-ZE08-CH2O-Formaldehyde-sensor-using




1. ESP-01


처음엔 몰랐지만, ESP2866 이라는 것은 ESP-01 만 뜻하는 것이 아니라, ESP8266EX 을 사용한 WiFi module 의 총칭이었던 것입니다.

지금까지 ESP8266 = ESP-01 로 알고, 입출력 Pin 이 더 필요한 경우, SoftwareSerial 을 어떻게 처리해야 하는지 히고 있었습니다.



위의 도식처럼 ESP8266EX 는, 많은 GPIO 를 지원하고 있었습니다.


단순히, ESP-01 의 pin out 갯수가 적었던 것이였죠. 더 많은 연결을 위해 ESP-01 도 pin out 을 처음부터 늘려 줬으면 어떠했을까 합니다.

어떤 사람이 "it's a shame to have such a small number of GPIOs at ESP-01" 라고 쓴 글을 본것 같습니다.


ESP8266EX chip 의 가느다란 다리에 직접 선을 납땜하면 사용할 수 있습니다. 시도해 봅니다.



실패.




2. ESP-03


ESP8266EX 를 사용하면서 GPIO 핀을 활용할 수 있는 breakout 보드들이 존재 했었습니다. ESP-03 / ESP-07 / ESP-12 등등...

ESP32 를 쓰면 쉽게 문제 해결 되지만, 굳이 어려운 방법으로 도전해 보기로 합니다.


우선 ESP-03 만 보더라도 GPIO 가 8개나 Pinout 으로 구성되어 있습니다.



자세한 Pinout 정보 입니다.



참고로, RST pinout 은 따로 구비되어 있지 않고, 아래 사진처럼 보드 위에 마련되어 있습니다.

Program 을 입힐 때, RST 가 있으면 편하나, 전원을 껐다 키면서 IO 0 (HIGH Run, LOW Flash) 핀을 이용하여 되니, 사용하지 않기로 합니다.


사용 전력을 아끼는 Sleep mode 구현시에는 필요하다 하나, 지금은 필요 없으니 그냥 놔두기로 합니다.



우선 ESP-03 을 구입.


* 1PC ESP8266 serial WIFI model ESP-03 Authenticity Guaranteed esp03 for arduino

https://www.aliexpress.com/item/32641401163.html



잊어먹고 있으니, 어느새 도착.



ESP8266EX 메인 칩과, 25Q40CT 라고 쓰인 Flash memory 가 보입니다.



사용된 오실레이터는 26MHz 입니다.





3. 어뎁터 보드 구매


ESP-03 의 Pin 들은, 빵판에 바로 연결할 수 있는 2.54mm 간격이 아니고, pin 들 사이가 더 조밀합니다.

이를 해결하기 위해, 자가로 pin header 를 붙일 수도 있고, 직접 선을 연결할 수 있으나 지저분해 집니다.


원래는 ESP-07 / ESP-12 용으로 나와 있는 어뎁터가 있는데, 잘만 하면 맞을 것 같더군요.

어차피 ESP-07 / ESP-12 구매하면 필요할 듯 하여, 5개가 한 묶음인 아래 어뎁터 보드도 구매합니다.


* 5pcs/lot ESP8266 serial WIFI Module Adapter Plate Applies to ESP-07, ESP-12F, ESP-12E

https://www.aliexpress.com/item/32971304797.html



잊을만 하니 도착.



양쪽에 male pin header 를 연결할 수 있게 되어 있고, ESP-07 / ESP-12 pin 과 맞닿는 부분을 납땜하게 되어 있습니다.



ESP-03 을 얹어 보니, 납땜 부위와 간격이 많이 떨어져 있으나, 납물을 길게 연결하여, 어찌어찌 연결할 수 있을 것 같습니다.





4. ESP-03 을 어뎁터 보드에 납땜


친절하게도 전원 관련된 저항이 어뎁터에 이미 실장되어 있습니다.



뒷면에는 3.3V 용 레귤레이터 자리도 마련되어 있습니다. 전압이 over shoot 나지 않게 안정적인 전원 공급을 위해 있으면 좋은 것이죠.



마침 3.3V regulator 가 있으니 붙여 줍니다.



원래는 ESP-07 / ESP-12 를 위한 저항과 레귤레이터 회로겠으나, 아래를 참고하면서 ESP-03 에서도 활용할 수 있는지 확인해 봅니다.


* MY METHOD FOR BREADBOARDING AN ESP-03

https://www.esp8266.com/viewtopic.php?p=18369



일반 사용 모드와, flashing 모드를 위해서는 push switch 도 붙여야겠네요.



확인에 또 확인하고 아래와 같이 만들어 봤습니다.



실패...


저항이고 레귤레이터고, 스위치고 점퍼고 다 제거했습니다. 단순하게 사용하는게 최고 입니다.

납땜은 아래처럼 길게 늘여뜨리면, 이 어뎁터를 ESP-03 용으로 사용 가능합니다.





5. Flash memory 크기 확인


25Q40CT 라고 씌인 Flash memory 사양을 검색해 보니 대충 다음과 같은 사양입니다.


- GIGADEVICE [GigaDevice Semiconductor (Beijing) Inc.]

- GD25Q40CTEG : 3.3V Uniform Sector Dual and Quad Serial Flash

- GigaDevice Semiconductor (Beijing) Inc.

- 4M-bit (512K-byte)


GD25Q40C.PDF


4Mbit = 512KiB... 털썩.

FTDI 모듈과 TX/RX 를 연결하여 본격적으로 활용해 봅니다. ESP-03 의 연결 정보는 다음과 같습니다.



전원과 FTDI 그리고 flashing 을 위한 스위치 연결 구성은 다음과 같아요.

가능하면 전원 공급은 FTDI 를 통해서 얻는것 보다, 분리하는 것이 좋습니다.



실재 구현 모습입니다.



FTDI 를 이용하여 PC 에 연결해, 확인해 봅니다. 역시군요.



기본으로 입혀져 있는 firmware 는 AI-Thinker 의 Boot 모드인 듯 합니다.



ESP8266 library 를 인스톨 하면, 기본으로 제공되는 Flash Check 소스를 입혀 봅니다.


File > Examples > ESP8266 > CheckFlashConfig



Flash mode 를 위해, 달아 놓은 스위치를 누르면서 전원을 넣고, flashing 을 해 봅니다. 잘 flashing 되네요.



그렇습니다... 틀림없는 512KiB 네요.





6. firmware update


Flash memory 를 교체하여 용량을 늘릴 예정이지만, 512KiB 에 올릴 수 있는 firmware 를 찾아 봅니다.

찾는 와중에 알게된 용어 정리.


APIs of "ESP8266_RTOS_SDK" are same as "ESP8266_NONOS_SDK"


중국산 모듈에 가장 많이 쓰이는 AI-Thinker.


* Ai-thinker

- v0.9.5.2

https://wiki.aprbrother.com/en/Firmware_For_ESP8266.html



파일명에 9600 표시가 없는 firmware : one for 9600 baud rate

파일명에 9600 표시가 없는 firmware : one for 115200 baud rate




* Updating ESP8266 Firmware

https://os.mbed.com/users/sschocke/code/WiFiLamp/wiki/Updating-ESP8266-Firmware

ESP8266_RTOS_SDK_v1.1_512kb.zip


Firmware 파일 못지 않게 중요한 address 정보.


---------------------------------------
|             BIN           | Address |
---------------------------------------
| boot_v1.1.bin             | 0x00000 |
| user1.bin                 | 0x01000 |
| esp_init_data_default.bin | 0x7C000 |
| blank.bin                 | 0x7E000 |
---------------------------------------


잘 동작함.




Espressif Systems (SDK V2.0.0 / AT V1.3)

4a-esp8266_at_instruction_set_en.pdf

esp8266_nonos_sdk_v2.0.0_16_08_10.zip


4Mbit = 512KiBSDK V2.0.0AT V1.3 이 올라간다고 메뉴얼에 적혀 있습니다만, 저는 되지 않더군요.




[SDK Release] ESP8266_NONOS_SDK_V1.4.0_15_09_18

https://bbs.espressif.com/viewtopic.php?f=46&t=1124

esp_iot_sdk_v1.4.0_15_09_18.zip


많은 firmware 를 테스트 하다 보니, 이 버전의 firmware update 후의 화면인지 기억이 잘... 여튼 성공 했었던것 같아요. 



Online 으로 firmware 를 업데이트 하는 FOTA 방식을 테스트 해봤습니다.

만, 마지막까지 문제 없이 진행되더니만 실패. Flash memory 용량이 적어 실패하는 듯. 





7. 32Mbit / 4MiB 로 업그레이드


우선 Flash chip 양쪽에 납을 충분히 먹이고 인두로 지지니 쉽게 떨어집니다. 무리해서 힘주지 않는게 포인트.



원래 실장되어 있던 flash memory 와 교체하려는 flash memory 크기만 비교해 봐도 꽤 다릅니다.



32Mbit Flash memory chip 을 납땜합니다. Oscillator 와 사이가 좁아서 힘들었습니다.



512KiB 칩은 조그마한 크기였는데, 4MiB 칩은 좀 큰 편이라, 기존 자리에 납땜 하려면 다리를 안쪽으로 구부려야 합니다.



ESP8266 DOWNLOAD TOOL 로 확인해 보니, 문제 없이 flash memory upgrade 가 완료 되었습니다.



구울 firmware 버전은 Non-OS 중에서 가장 최신 버전.


ESP8266_NonOS_AT_Bin_V1.7.4.zip



Flashing 할 때는, Address 를 정확히 따라야 합니다. V1.7.4 의 32Mbit (1024 KB + 1024 KB) 설정은 다음과 같습니다.



메뉴얼 대로 Address 잘 기입해서 flashing~!



문제 없이 booting 됩니다.



웃긴건, booting 할 때는 76,800 baud rate 로 동작하고 (위의 스샷에서 글씨가 깨지는 부분), 기본 모드에서는 115,200 baud 로 동작합니다.




8. WiFi 기능과 Sensor 값 입력을 동시에 수행


용량도 늘었으니, WiFi 기능을 사용하면서 sensor 값을 GPIO 14 으로 받아 internet 을 통해 값을 쏴주는 과정을, 아래 포스트에서 진행.


* Hardware | ZE08-CH2O Formaldehyde 센서 사용해보기

https://chocoball.tistory.com/entry/Hardware-ZE08-CH2O-Formaldehyde-sensor-using


Serial Monitor 에서 확인할 결과, GPIO 14 에서 입력 받은 값들도 정상적으로 확인.



인터넷을 통해서도 잘 값들이 전달됨도 확인 하였습니다. (자세한건 위의 포스트에서 확인 가능합니다.)





9. 추가 구매


이참에 ESP8266EX 시리즈를 추가로 구매 했습니다. 가지고 있는 ESP-01 이 납땜 실패로 사용할 수 없으니, ESP-01 도 추가 구매.


* ESP8266 ESP-01 ESP-01S ESP-07 ESP-12E ESP-12F remote serial Port WIFI wireless module intelligent housing system Adapter 2.4G
    - https://www.aliexpress.com/item/32339917567.html


ESP-01



언제 사용해 보겠냐며, ESP-07 도 구매.


ESP-07



ESP8266 chip 의 끝판왕 breakout 보드인 ESP-12F 도 구매.


ESP-12F



다음 포스팅 들은 ESP-07 / ESP-12F 에 대한 이야기가 되겠네요.


And

Hardware | ZE08-CH2O Formaldehyde 센서 사용해보기

|

1. 환경 호르몬


사람은 호르몬으로 살아간다고 해도 과언이 아닙니다.

컨디션, 감정, 치유, 성장, 성향, 행동 등, 인간의 몸안에서 일어나는 거의 모든 화학작용과 관련이 되어 있으며, 몸을 컨트롤 합니다.


다만 아쉽게도, 현대 사회로 진입하면서 생활은 편해졌지만, 화학 물질 등으로 인하여 몸 안의 호르몬들이 교란을 잃으키고 있습니다.

더 무서운 것은 이 "환경 호르몬" 은 거의 모든 곳에 도사리고 있다는 것이지오.

특히 환경 호르몬 중에서는 "포름알데히드" 가 그 주범 물질 중 하나 입니다.


* Formaldehyde

https://en.wikipedia.org/wiki/Formaldehyde



* 포름알데하이드

https://namu.wiki/w/%ED%8F%AC%EB%A6%84%EC%95%8C%EB%8D%B0%ED%95%98%EC%9D%B4%EB%93%9C


메탄올을 잘못 마셨을 때, 실명이나 사망을 일으키는 것도 이 포름알데히드 때문이다. 메탄올이 신체 내부로 유입되면 간에서 포름알데히드 및 포름산이라는 물질로 변환되는데, 특히 포름알데히드는 시신경을 손상시키고 단백질 조직을 변성시켜 굳혀버리는 효과를 갖고 있기 때문에 이런 위험한 상황이 발생하게 되는 것이다.


가구, 특히 MDF를 사용한 가구에서는 본드와 페인트에 의해 포름알데히드가 공기 중으로 방출된다. 소위 새집증후군, 아토피의 원인으로 지목되고 있으며, 새 가구를 샀을 때 매캐한 냄새, 눈이나 목의 따가움을 느꼈다면 이것 때문이다. 포름알데히드는 성인은 물론 특히 어린이에게 매우 유해하기 때문에 실내가구의 방출량은 각국에서 규제하고 있다. 다만 포름알데히드 측정에 대한 국제 표준이 없기 때문에 국가별로 측정방법 및 규정이 다른 상태다.


다이X 같은 곳에 가면, 온갖 화학물질이 공기 중에 떠다니는 것을 대번에 느낄 수 있습니다. 이게 환경호르몬 = 포름알데히드 입니다.


값싸게 제품을 만들다 보니, 출처가 불분명한 재료와, 후처리 되지 않은 채로 공장에서 나와 유통되기 때문이죠.

특히 중국산 물건에서 많이 느낄 수 있습니다. 손이 쥐여지는 것을 입으로 쉽게 가져가는 애기들을 생각하면 소름 돋는 장소라고 생각합니다.




2. 포름알데히드 센서


그럼, 포름알데히드를 측정할 수 있는 센서는 없을까, 하고 찾아 봤습니다. 있네요.

구매를 작년 9월쯤 했을 때에는 위의 가격이었는데, 요즘은 조금 저렴해 졌습니다.


* Formaldehyde sensor ZE08-CH2O serial output formaldehyde concentration measurement with cable

https://ko.aliexpress.com/item/32842350486.html



이 센서에 사용된 "ZE08-CH2O" 는 그리 널리 사용되지 않지만, 아두이노 센서 breakout 보드를 생산하는 DFRobot - Gravity 회사에서도 출시 했을 만큼 완전 무명도 아닙니다. (이 글의 후반부에서 그림과 함께 조금 설명 해놨습니다.)


* ZE08-CH2O formaldehyde gas sensor module

https://www.winsen-sensor.com/sensors/ch2o-gas-sensor/ze08-ch2o.html

ZE08-CH2O_V1.0.pdf




3. 도착


도착샷은 예의 입니다.



센서는 PCB 보드 윗쪽에 얹혀져 있습니다.



Breakout 보드 밑부분은 센서값 처리를 위한 회로 및 IC chip 들로 빼빽하게 차 있습니다.

센서 종류로 14 USD 나 하는, 비싼 값을 하는 이유가 있네요.





4. Specification


메인 chip 에 붙어 있는 IC20 이라는 스티커를 제거하면, chip 명칭을 알 수 있습니다.



사진으로는 흐릿하게 나와서, 제품 설명 그림을 가져와 봤습니다.

STMicroelectronics 사의 32-bit ARM Cortex-M 프로세서라는 것을 알 수 있습니다.


stm32f030f4.pdf



STM32F030F4 네요. 아래 장표를 보면 32-bit ARM Cortex-M 에서 Mainstream 에 해당하는 chip 입니다.



동일 계열의 칩 중에서는 USB 인터페이스가 생략되어 있고, 메모리가 가장 적은 버전이군요.



ZE08-CH2O 의 인터페이스는 다음과 같습니다.



인터페이스 선들을 살펴 보면, 신호를 받는 방식이 PWM, UART, 그리고 DAC 세 가지 임을 알 수 있습니다.

아래는 default 연결인 Active Upload type 방식이라고 하는데, 기본적으로 TX/RX 를 사용하는 UART 방식을 표시합니다.





5. Arduino 용 Active Upload 소스


Default 방식인 Active Upload (UART) 소스 입니다.


* Serial Communication CH2O sensor
    - https://forum.arduino.cc/index.php?topic=547952.0


Sketch 는 다음과 같습니다.


#include "arduino.h"
#include "SoftwareSerial.h"

#define MAXLENGTH 9
#define VREF 5.0 // voltage on AREF pin

long tenMinutes = 10 * 60 * 1000L; // on time of heater
SoftwareSerial mySerial(10, 11);

byte receivedCommandStack[MAXLENGTH];
byte checkSum(byte array[], byte length);
boolean receivedFlag;

void setup() {
	// put your setup code here, to run once
	mySerial.begin(9600);
	Serial.begin(115200);
}

void loop() {
	ze08_PPM();
}

byte checkSum(byte array[], byte length) {
	byte sum = 0;
	for (int i = 1; i < length - 1; i ++) {
		sum += array[i];
	}
	sum = (~sum) + 1;
	return sum;
}

boolean available1() { //new data was recevied
	while (mySerial.available()) {
		for (byte index = 0; index < MAXLENGTH - 1; index++) {
			receivedCommandStack[index] = receivedCommandStack[index + 1];
		}
		receivedCommandStack[MAXLENGTH - 1] = mySerial.read();
		
		byte sumNum = checkSum(receivedCommandStack, MAXLENGTH);
		if ( (receivedCommandStack[0] == 0xFF) && (receivedCommandStack[1] == 0x17) && (receivedCommandStack[2] == 0x04) && (receivedCommandStack[MAXLENGTH - 1] == sumNum) ) { //head bit and sum are all right
			receivedFlag = 1; //new data received
			return receivedFlag;
		} else {
			receivedFlag = 0; //data loss or error
			return receivedFlag;
		}
	}
	return receivedFlag;
}

float ze08_PPM() {
	if (available1() == 1) {
		receivedFlag = 0;
		
		float ppb = (unsigned int) (receivedCommandStack[4] * 256) + receivedCommandStack[5]; // bit 4: ppm high 8-bit; bit 5: ppm low 8-bit
		float ppm = ppb / 1000; // 1ppb = 1000ppm
		delay (1000);
		Serial.print("Formalin ppm == ");
		Serial.println(ppm);
		return ppm;
	}
}

float analogReadPPM() {
	float analogVoltage = analogRead(A0) / 1024.0 * VREF;
	float ppm = 3.125 * analogVoltage - 1.25; //linear relationship (0.4V for 0 ppm and 2V for 5ppm)
	
	if( ppm < 0 ) {
		ppm = 0;
	} else if( ppm > 5 ) {
		ppm = 5;
	}
	delay (1000);
	return ppm;
}


Arduino 와의 Pin 연결은 다음과 같습니다.


 ZE08-CH2O | Arduino Nano
--------------------------
   6 (TX)  |      D10
   5 (RX)  |      D11
--------------------------
           |     POWER
--------------------------
    VCC    |      3.3V
    GND    |      GND
--------------------------


회로 diagram 도 그려 봤습니다.


실재로 연결할 선들은 CO2 센서인 MH-Z14A 와 갯수와 크기가 동일하여, 만들어 놨던 선을 사용 했습니다.


* Hardware | CO2 센서인 MH-Z14A 를 활용해 보자

https://chocoball.tistory.com/entry/Hardware-CO2-sensor-MH-Z14A


사용하지 않는 선들은 빵판 고정용으로 사용. :-)



아래와 같이 값이 표시됩니다. Calibration 이 적용되지 않아서, 이 값이 정확한 것인지는 모르겠습니다.

센서 주변 공기가 바뀌면, 그에 따라서 센서값도 달라집니다.





6. DFRobot 용 소스 - DAC


UARTDAC 를 스위치 하나로 변경하면서 사용할 수 있는 breakout 보드를 DFRobot 에서 출시한 제품도 있습니다.


* Gravity: Formaldehyde (HCHO) Sensor
    - https://www.dfrobot.com/product-1574.html



깔끔하게 잘 만들었네요. 저는 비싸서 구입하지 않았습니다.



Breakout 보드도 Pin 별로 이미 구분되어 있어서, 조금 아는 사람이면 굳이 DFRobot 제품을 구매할 필요는 없을 듯 하다.


DFRobot / DFRobotHCHOSensor - A library for DFRobot Gravity HCHO Sensor, Arduino Compatible.

https://github.com/DFRobot/DFRobotHCHOSensor

DFRobotHCHOSensor.zip


* Gravity HCHO WiKi
    - https://wiki.dfrobot.com/Gravity__HCHO_Sensor_SKU__SEN0231


DFRobot 도 동일한 센서를 사용했으므로, DAC 소스를 가져다 사용해 봅시다.


/***************************************************
 DFRobot Gravity: HCHO Sensor
 "https://www.dfrobot.com/wiki/index.php/Gravity:_HCHO_Sensor_SKU:_SEN0231"

 ***************************************************
 This example reads the concentration of HCHO in air by DAC mode.

 Created 2016-12-15
 By Jason "jason.ling@dfrobot.com@dfrobot.com"

 GNU Lesser General Public License.
 See "http://www.gnu.org/licenses/" for details.
 All above must be included in any redistribution
 ****************************************************/

 /***********Notice and Trouble shooting***************
 1. This code is tested on Arduino Uno with Arduino IDE 1.0.5 r2.
 2. In order to protect the sensor, do not touch the white sensor film on the sensor module,
 and high concentration of Hydrogen sulfide, hydrogen, methanol, ethanol, carbon monoxide should be avoided.
 3. Please do not use the modules in systems which related to human being’s safety.
 ****************************************************/

#define SensorAnalogPin A2 // this pin read the analog voltage from the HCHO sensor
#define VREF 5.0 // voltage on AREF pin

void setup() {
	Serial.begin(115200);
}

void loop() {
	Serial.print(analogReadPPM());
	Serial.println("ppm");
	delay(1000);
}

float analogReadPPM() {
	float analogVoltage = analogRead(SensorAnalogPin) / 1024.0 * VREF;
	float ppm = 3.125 * analogVoltage - 1.25;    //linear relationship(0.4V for 0 ppm and 2V for 5ppm)
	
	if( ppm < 0) {
		ppm = 0;
	} else if( ppm > 5) {
		ppm = 5;
	}
	return ppm;
}


Arduino 와 연결되는 Pin 정보는 다음과 같습니다.


 ZE08-CH2O | Arduino Nano
--------------------------
  2 (DAC)  |      A2
--------------------------
           |     POWER
--------------------------
    VCC    |      3.3V
    GND    |      GND
--------------------------


Layout 구성도 입니다.



실재로 구현한 사진 :-)



Default 연결 방식인 Active Upload 방식과는 값의 차이가 많이 날 뿐더러, 일관적인 값을 보여주지 않습니다.





7. DFRobot 용 소스 - UART


이번에는 DFRobot 에서 나온 UART 방식의 소스를 이용해 봅니다.


/***************************************************
 DFRobot Gravity: HCHO Sensor
 "https://www.dfrobot.com/wiki/index.php/Gravity:_HCHO_Sensor_SKU:_SEN0231"

 ***************************************************
 This example reads the concentration of HCHO in air by UART mode.

 Created 2016-12-15
 By Jason "jason.ling@dfrobot.com@dfrobot.com"

 GNU Lesser General Public License.
 See "http://www.gnu.org/licenses/" for details.
 All above must be included in any redistribution
 ****************************************************/

 /***********Notice and Trouble shooting***************
 1. This code is tested on Arduino Uno with Arduino IDE 1.0.5 r2.
 2. In order to protect the sensor, do not touch the white sensor film on the sensor module,
 and high concentration of Hydrogen sulfide, hydrogen, methanol, ethanol, carbon monoxide should be avoided.
 3. Please do not use the modules in systems which related to human being’s safety.
 ****************************************************/

#include "DFRobotHCHOSensor.h"
#include "SoftwareSerial.h"

#define SensorSerialPin 10 // this pin read the uart signal from the HCHO sensor

SoftwareSerial sensorSerial(SensorSerialPin, SensorSerialPin);
DFRobotHCHOSensor hchoSensor(&sensorSerial);

void setup() {
	sensorSerial.begin(9600); // the baudrate of HCHO is 9600
	sensorSerial.listen();
	Serial.begin(115200);
}

void loop() {
	if(hchoSensor.available() > 0) {
		Serial.print(hchoSensor.uartReadPPM());
		Serial.println("ppm");
	}
}


Arduino 와의 Pin 연결은 다음과 같습니다.


 ZE08-CH2O | Arduino Nano
--------------------------
   6 (TX)  |      D10
--------------------------
           |     POWER
--------------------------
    VCC    |      3.3V
    GND    |      GND
--------------------------


Layout 그림도 그려 봤습니다.



실재 구성 모습 입니다.



처음 시도한 UART 소스의 결과값과 거의 동일하게 나옵니다.
DFRobot 라이브러리에서 거의 모든 처리가 이루어 지지만, 처음 시도한 UART 방식과 동일한 듯 합니다.




8. ESP8266 용 소스


인터넷 바다를 떠돌다가, ESP8266 을 이용한 소스를 발견하게 됩니다.


* rsalinas/ze08-ch2o-arduino

https://github.com/rsalinas/ze08-ch2o-arduino


Remember that this sensor requires 5V in Vcc but does NOT tolerate 5V in its RX input. If you just want to use the default, active mode, you don't even need to connect this pin, so you can connect directly 5V, GND and Arduino's RX.


ZE08-CH2O.zip


궁극적으로는 WiFi > internet 을 통하여 sensor data 를 올리고, 모니터링 방식이 좋으므로, 잘 되었습니다.

ESP8266 에서 돌아가는 소스라면, WiFi 연결 코드만 추가하면 추가로 arduino 필요 없이 바로 구현이 가능 하겠습니다.


지금까지는, arduino 와 sensor 를 연결하고, ESP8266 은 오로지 WiFi 용으로만 사용하는 구성이었습니다.

ESP8266 에서 sensor 값 감지와 WiFi 가 동시에 되면, arduino 를 사용할 필요가 없어 효율이 좋겠네요.


ZIP 파일을 그대로 Library 에 추가 합니다.


Sketch > Include Library



Libraries 폴더에 보면, 새롭게 올라가 있는 것을 확인할 수 있습니다.



소스를 보면 Basic 하나만 등록되어 있습니다.


File > Examples > ze08-ch2o > Basic



Sketch 는 다음과 같습니다. SoftwareSerial 에서 조금 손을 봤습니다.


#include "ze08_ch2o.h"
#include "SoftwareSerial.h"

// Instantiate a serial port, whatever Stream you have
// SoftwareSerial ch2oSerial(4, SW_SERIAL_UNUSED_PIN); // RX, TX
SoftwareSerial ch2oSerial(14, 14); // RX, TX

// Instantiate a sensor connected to the previous port
Ze08CH2O ch2o{&ch2oSerial};

void setup() {
	ch2oSerial.begin(9600);
	ch2oSerial.listen();
	Serial.begin(115200); // Serial Monitor
}

void loop() {
	Ze08CH2O::concentration_t reading;
	
	if (ch2o.read(reading)) {
		Serial.print("New value: ");
		Serial.println(reading);
	}
}


여기서 한가지 문제가 있습니다.

ESP8266 에는 RX pin 이 하나만 있어, Serial Monitor 를 이용하면서 "수신" 을 받을 수 있는 pin 이 없다는 것이죠.

즉, sensor 를 연결할 수 있는 Pin 이 없습니다.



남아있는 GPIO2 는 TX 용도이고, 부팅 후에는 HIGH 로, 3V 전압이 걸려 있습니다.

그럼 도대체 이 소스 제작자는 어떻게 확인한 것일 까요?


사실은 ESP2866 이라는 것은 ESP-01 만 뜻하는 것이 아니라, ESP8266EX 을 사용한 WiFi module 의 총칭이었던 것입니다.

저는 지금까지 ESP8266 = ESP-01 인줄 알고, SoftwareSerial 부분에서 더 이상 진행을 못하고 있었습니다.



위의 도식처럼 ESP8266EX 에는, 더 많은 GPIO 를 지원하고 있었습니다.

단순히, ESP-01 의 pin out 갯수가 적었던 것이였죠. 더 많은 연결을 위해 ESP-01 도 pin out 을 처음부터 늘려 줬으면 어떠했을까 합니다.

어떤 사람이 "it's a shame to have such a small number of GPIOs at ESP-01" 라고 쓴 글을 본것 같습니다.


저도 chip diagram 을 보고, 납땜을 시도 했습니다.... 만 실패 했습니다. 너무 조밀합니다.



굴하지 않고, ESP8266EX chip 을 사용하면서 Pinout 이 확장된 breakout 모델인 ESP-03 을 구입해서 연결 했습니다!

연결할 수 있는 Pinout - GPIO 가 많아서 행복합니다.



Pin 연결도는 다음과 같습니다.


 ZE08-CH2O |  ESP-03
----------------------
   6 (TX)  | GPIO 14
----------------------
           |  POWER
----------------------
    VCC    |   3.3V
    GND    |   GND
----------------------


실재 구성도는 다음과 같습니다.



Serial Monitor 까지 연결한 모습이 다음과 같습니다. ESP-03 의 GPIO 14 에 ZE08-CH2O 의 TX 와 연결되어 있습니다.




기본 소스에 IoT 솔루션인 Blynk 소스를 입혀 봤습니다. 자세한 내용은 아래 포스트에 올려 놨습니다.


* Software | Blynk 사용해 보기

https://chocoball.tistory.com/entry/Software-Blynk-howto


이렇게 하므로써, WiFi 연결까지 소스에 한방에 녹여 놓을 수 있습니다.


#include "ze08_ch2o.h"
#include "SoftwareSerial.h"
 
SoftwareSerial ch2oSerial(14, 14); // RX, TX
Ze08CH2O ch2o{&ch2oSerial};
 
int sensorData;
 
/* Comment this out to disable prints and save space */
#define BLYNK_PRINT Serial
 
#include "ESP8266WiFi.h"
#include "BlynkSimpleEsp8266.h"
 
// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
 
// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "XXXXXXXXXXXX";
char pass[] = "YYYYYYYYYYYYYYYYYYY";
 
BlynkTimer timer;
 
// This function sends Arduino's up time every second to Virtual Pin (5).
// In the app, Widget's reading frequency should be set to PUSH. This means
// that you define how often to send data to Blynk App.
void myTimerEvent() {
    // You can send any value at any time.
    // Please don't send more that 10 values per second.
     
    Ze08CH2O::concentration_t reading;
    if (ch2o.read(reading)) {
        Serial.print("ZE08-CH2O : ");
        Serial.println(reading);
         
        sensorData = reading;
    }
    Blynk.virtualWrite(V5, sensorData);
}
 
void setup() {
    // Debug console
    Serial.begin(115200);
     
    ch2oSerial.begin(9600);
    ch2oSerial.listen();
     
    Blynk.begin(auth, ssid, pass);
    // You can also specify server:
    //Blynk.begin(auth, ssid, pass, "blynk-cloud.com", 80);
    //Blynk.begin(auth, ssid, pass, IPAddress(192,168,1,100), 8080);
     
    // Setup a function to be called every second
    timer.setInterval(5000L, myTimerEvent);
}
 
void loop() {
    Blynk.run();
    timer.run(); // Initiates BlynkTimer
}


아래와 같이 값들이 표시됩니다.

값의 범위가 50 ~ 150 정도여서, 기준을 모르겠어나, 값의 변동이 기민하게 발생하는 것을 보니, 문제 없을 듯 합니다.

나누기 100 을 하면, UART 방식의 값과 거의 비슷해 집니다.



문제 없이 Blynk 어플에서 값들을 확인할 수 있습니다.





FIN


ZE08-CH2O 의 연결 방식인 DAC / UART 는 시험해 봤으나, PWM 은 정보가 없어서 시도해 보지 못했네요.

나중에 알게 되면 추가하도록 하겠습니다.


Formaldehyde 센서 확인도 끝났으니, 자 다음 센서요~.


And

Hardware | CO2 센서인 MH-Z14A 를 활용해 보자

|

1. 이산화탄소


이산화탄소는 지구로 들어 왔다가 빠져나가는 태양광 복사열을 차폐하여 온실효과를 내는 주범 입니다.

매년 기온이 상승하고 있습니다. 기온 상승으로 인하여 지구에서는 지금까지 겪지 못했던 일들이 일어나고 있죠.


전 지구적으로 본다면, 과거로부터 CO2 의 농도 변화는 일정한 주기를 가져 왔습니다.



하지만, 현재의 CO2 농도는 과거의 주기적인 범위에서 한참을 벗어나 있습니다.

측정 데이터를 가지고 본다면, 산업혁명 이후 꾸준히 증가 중 이라는 것을 알 수 있습니다.



산업혁명 이전은 280 ppm 이하였고, 그 이후 약 300년 사이에 140 ppm 정도 늘었습니다.

옛날과 비교하면 150% 가 되어있는 셈 입니다. 수백만년동안 일정한 주기를 가지던 패턴이 300년 동안 완전히 붕괴된 것이죠.


예전 개그 프로에서 봤던, 공기좋은 알프스에서 채집한 공기를 깡통에 넣어 팔아도 되는 시대가 올지도 모르겠습니다.



참고로, 현재 우리가 살고 있는 "요즈음" 은, 410 ppm 정도가 일반적인 수치임을 위의 그래프를 통해 알 수 있습니다.




2. MH-Z14A


생활 공간의 쾌적한 조성은, 삶에 있어서 행복감을 줄 수 있는 요소 중 하나 입니다.


이를 위해, 산소 발생기를 만들어 볼 생각이 났습니다.

다만, 산소 발생기를 만들더라도, 현재의 상황 - 농도 - 를 알고 있어야 조정이 가능하니, CO2 측정 방법을 찾아 봅니다.


CO2 센서로는 몇 가지가 존재하나, MH-Z14A 라는 것이 심심치 않게 사용되고 있네요.

거의 2만원이 넘는 가격이지만, 구입합니다. 기체 포집 센서들은 꽤나 가격이 높게 형성되어 있습니다.


* Free shipping NDIR CO2 SENSOR MH-Z14A infrared carbon dioxide sensor module,serial port, PWM, analog output with cable MH-Z14

https://www.aliexpress.com/item/Free-shipping-NDIR-CO2-SENSOR-MH-Z14A-infrared-carbon-dioxide-sensor-module-serial-port-PWM-analog/32617820781.html



센서의 스펙은 다음과 같습니다.


Product Name: MH-Z14A infrared type, carbon dioxide detection sensor
1. the working voltage: DC 4.5-5.5V
2. Working current: Mean < 60mA; peak 150mA
3. the detection range: 0-5000ppm
4. the detection accuracy: ± (50ppm + 3% reading value)
5. Warm-up time: 3min
6. the output signal:
   1) analog output voltage: (D1 port 0V-2.5V) (D2 port 0.4-2V) linear output
   2) serial port (UART) (TTL level)
   3) PWM
7. response time: T90 < 120s
8. the working temperature: 0-50C
9. Humidity: 0-95% RH
10. life: 5 years
11. size: 57mm X 35mm X 15mm
12. weight size: 17g

Package Including: 1pcs X CO2 sensors



3. 도착


도착샷은 예의.



평범하게 배달.



리본 케이블이 딸려 있습니다만, pin hole 로도 연결이 가능합니다.



뒷면은 레귤레이터와 신호 처리 chip 이 달려 있습니다. 그리고 방수 코팅도 되어 있네요.





4. 통신 과 연결 방법


메뉴얼과 스펙 문서를 첨부합니다.


mh-z14a_co2-manual-v1_01.pdf

mh-z14_co2.pdf


문서를 보니, 이 센서와 통신할 수 있는 방법은 3가지가 됩니다. 각각의 사용법은 밑에서 다뤄 보겠습니다.


Analog

PWM

UART (RX/TX)


Pin header 정보 입니다.



리본 케이블을 사용할 경우, 각 선의 의미는 아래 그림과 같습니다.



새로 납땜해야 하는 pin header 말고, 리본 케이블을 사용하여 깔끔하게 연결해 보도록 하겠습니다.



5. 리본 케이블용 커넥터


리본 케이블을 이용하여 예쁘게 연결하고 싶으니, 리본 케이블 커넥터나 연장을 생각해 봅니다.

일단 측정해 봅니다. 대략 1mm 정도 되겠네요. 아래 규격일 듯 합니다.


* JST SH 1.0mm

- http://www.jst-mfg.com/product/detail_e.php?series=231



알리에서 검색해 보니, 아래 제품이 맞을 듯.

* 10 sets 1.0mm 1.25mm 1.5mm 2.0 2.54mm 2PIN /3/4/5/6/12P Pin Male & Female PCB Connector SH JST ZH PH XH 2 Pin
    - https://www.aliexpress.com/item/32733307616.html



잘 도착 했습니다.



커넥터의 female / male 이 짝으로 도착했습니다.



도착한 커넥터와 센서에 딸려 나온 커넥터를 비교해 보니... 덴장.

기존 커넥터의 pin 피치를 비교해 보면, 좀더 조밀합니다.



빵판이나 일반적인 연결 용도로 사용되는 (2.54mm) Pin connector 도 주문 했더랬습니다.

빵판에 prototype 회로를 만드려면, pin 이 필요하니까요.


* 100PCS 2.54mm Dupont Jumper Wire Cable Housing Female/Male Pin Connector Terminal Kit
    - https://www.aliexpress.com/item/32908083223.html



암수 모양 한세트를 주문 했습니다.



이걸 제대로 사용하기 위해선는 찝는 툴이 필요하다는 것을, 물건 받아보고 나서야 깨닫습니다.



한가지 아쉬운건, 캐스팅 된 핀이 아니라, 프레스된 철판을 구부려서 만든 모양 입니다.



프레스로 된 pin 은 잘 구부러질 뿐만 아니라, 빵판 안에서 부러져 버리면 꺼낼 수가 없어, 죽은 소켓이 되어버리기 때문입니다.
(그래 뽰자 큰 영향은 없지만...)




6. 연결은 결국...


결국 빵판에 연결 방법으로는, 선 끝을 자르고, 기존 pin 을 이식하는 것으로 정했습니다.



Female 소켓에서 한 땀 한 땀 분리합니다.



혹시? 하고 이것 그대로 직접 연결하면 어떨까 하여 연결해 보니, 진동에 의한 결선 이탈이 쉽게 일어나므로 포기.



원래 생각했던 대로, pin 달린 jumper 에서 pin 만을 잘라 이식합니다.



선을 서로 꼬아준 다음, 납땜해 주고, 수축튜브 이용하여 마무리 했습니다. (완벽)



드디어 arduino 와 연결하여 측정이 가능하게 되었습니다.




7. UART


우선 아래 blog 를 많이 참고했습니다.


* Dr. Monk's DIY Electronics Blog

- http://www.doctormonk.com/2018/03/review-and-test-of-mh-z14a-ndir-co2.html


다만, 위의 링크에서 제시한 UART (Software Serial) 포트를 Arduino 의 digital pin 로 측정하는 것은 잘못된 방법입니다.

Analog pin 에 RX/TX 를 접속 시켜야 하며, PWM / Analog 입력을 동시에 받으면, 모든 값이 뒤틀립니다.

그래서 UART 따로, PWM / Analog 를 따로 측정해 봤습니다. (많은 삽질의 결과)


우선 UART. 센서에 3.3V 를 먹이고, TX/RX 를 analog pin 에 연결하여 데이터를 받습니다.



처음으로 센서를 동작시켜본 기념으로 동영상을 올립니다.

센서 가동중에는 네 귀퉁이에 어렴풋이 불이 켜졌다가 꺼지기를 반복합니다.


참고로, TX / RX 에 접속시킨 채로 sketch 를 upload 하면 error 가 나는군요.


#include "SoftwareSerial.h"

const long samplePeriod = 10000L;

SoftwareSerial sensor(A2, A3); // RX, TX
const byte requestReading[] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79};
byte result[9];
long lastSampleTime = 0;

void setup() {
  Serial.begin(9600);
  sensor.begin(9600);
}

void loop() {
  long now = millis();
  if (now > lastSampleTime + samplePeriod) {
    lastSampleTime = now;
    int ppmS = readPPMSerial();
    Serial.println(ppmS);
  }
}

int readPPMSerial() {
  sensor.flush();
  for (int i = 0; i < 9; i++) {
    sensor.write(requestReading[i]); 
  }
  
  while (sensor.available() < 9) {}; // wait for response
  for (int i = 0; i < 9; i++) {
    result[i] = sensor.read(); 
  }
  int high = result[2];
  int low = result[3];
  return high * 256 + low;
}


결과 입니다. UART 는 값 보정이 필요해 보입니다.


보정을 위해서는 기준값을 알아야 하는데, 기준값을 도출하기 위해서는 정확히 조성된 환경에서 보정작업이 이루어져야 합니다.

저는 그런 환경이나 챔버가 없으므로, calibration 은 무시.





8. Analog / PWM


그나마 현실적인 값을 도출하는 Analog 와 PWM 값 확인 입니다.


#include "SoftwareSerial.h"

const int analogPin = A0; // analog pin
const int pwmPin = 6; // digital pin

const long samplePeriod = 10000L;

long lastSampleTime = 0;

void setup() {
  Serial.begin(9600);
  pinMode(pwmPin, INPUT_PULLUP);
}

void loop() {
  long now = millis();
  if (now > lastSampleTime + samplePeriod) {
    lastSampleTime = now;
    int ppmV = readPPMV();
    int ppmPWM = readPPMPWM();
    Serial.print(ppmV); 
    Serial.print("\t"); 
    Serial.println(ppmPWM); 
    }
}

int readPPMV() {
  float v = analogRead(analogPin) * 5.0 / 1023.0;
  int ppm = int((v - 0.4) * 3125.0);
  return ppm;
}

int readPPMPWM() {
  while (digitalRead(pwmPin) == LOW) {}; // wait for pulse to go high
  long t0 = millis();
  while (digitalRead(pwmPin) == HIGH) {}; // wait for pulse to go low
  long t1 = millis();
  while (digitalRead(pwmPin) == LOW) {}; // wait for pulse to go high again
  long t2 = millis();
  long th = t1-t0;
  long tl = t2-t1;
  long ppm = 5000L * (th - 2) / (th + tl - 4);
  while (digitalRead(pwmPin) == HIGH) {}; // wait for pulse to go low
  delay(10); // allow output to settle.
  return int(ppm);
}


결과값은 다음과 같습니다. 왼쪽이 Analog 값, 오른쪽이 PWM 입니다.



위에서 알 수 있듯, 값의 변화나 지구의 CO2 농도를 참고했을 때, PWM 이 좀더 현실적인 값이 아닌가 합니다.




9. WiFi 연결


일반적으로 센서를 가지고 변화 추이를 확인하려면, 상당히 긴 시간동안의 데이터를 수집해야 합니다.

지금까지는 PC를 켜 놓고 Arduino IDE 의 Serial Monitor 를 사용하여 측정 했었습니다.


Cloud 시대인 만큼, 이번에는 WiFi 를 이용하여 ThingSpeak 에 측정 데이터를 보내주기로 합니다.

ThingSpeak 등록 및 기본 사용법은 아래 포스트에서 다뤘습니다.


* Software | ThingSpeak 등록하여 IoT 데이터 펼처보기
    - https://chocoball.tistory.com/entry/Software-ThingSpeak-IoT-monitoring


힘들었던 것은, ESP-01 의 WiFi command 를 이용하여, 필요한 command 를 하나씩 확인하는 작업이었습니다.



위 스샷은 "AT+CIPMUX" 를 통하여 single channel / multi channel 통신을 정의하는 것 입니다.

값에 "0" 을 정의하면 single 이고, 1~4 숫자면 multi channel 입니다.


참조한 블로그 처럼, Multi Channel 을 이용하면 좋을 듯 하지만,

다른 명령어에서 channel 번호를 명시해야 하는 등 번거로워서 Single Channel 설정으로 "AT+CIPMUX=0" 이용.


이외 명령어들은, 연결할 호스트 정의 및 HTTP data 전송에 관련한 부분입니다.


AT+CIPMUX=0
AT+CIPSTART="TCP","api.thingspeak.com",80
AT+CIPSEND=49
GET /update?api_key=XXXXXXXXXXXXXXXX?field1=351
AT+CIPCLOSE


- AT+CIPMUX=0 > Single Channel 로 통신 시작

- AT+CIPSTART="TCP","api.thingspeak.com",80 > 연결할 host 명과 port 정의
- AT+CIPSEND=49 > 전송할 데이터 사이즈를 미리 정의
- GET /update?api_key=XXXXXXXXXXXXXXX?field1=351 > HTTP GET request
- AT+CIPCLOSE > session close



위는 FTDI 를 이용하여, 직접 Serial Monitor 를 이용하여 WiFi 통신"만" 테스트해 보는 스샷입니다.

FTDI 를 이용한 자세한 활용 방법은 아래 글에서 다뤘습니다.


* Hardware | ESP-01 or ESP8266 사용기 - 2
    - https://chocoball.tistory.com/entry/Hardware-ESP01-or-ESP8266-using-2


참고한 blog 의 소스에는 ">" 캐릭터가 나오면 send 명령어를 실행하게끔 되어 있습니다만, 실패가 계속 나더군요.

테스트 해본 결과, 제가 가지고 있는 ESP-01 모듈은 ">" 이 나오기 전, "OK" 가 먼저 뜨므로, 기준을 "OK" 문자로 해야 합니다.


이렇듯, 소스를 하나하나 검증하면서 제대로 동작하는 command 들을 끼워 맞추기까지 오래 걸렸습니다.

없는 시간 쪼개어 가며 테스트하고 삽질하였더니만 2개월 정도 걸린 듯 합니다.




10. 최종 버전


아래는 arduino / MH-Z14A / ESP-01 간의 pin 연결표 입니다.


 MH-Z14A | Arduino Nano
------------------------
   PWM   |     D6
   GND   |     GND
   VCC   |     5V
------------------------


  ESP-01 | Arduino Nano
------------------------
   TX    |     D10
   RX    |     D11
   VCC   |     3.3V
   GND   |     GND
  CHPD   |     3.3V
------------------------


아래는 layout 입니다. 추가 전원을 위해 MB102 도 사용했습니다.



아래는 실제로 연결한 arduino nano / MH-Z14A / ESP-01 / MB102 입니다.



지금까지 확인한 내용이 모두 담긴 소스 입니다.


#include "SoftwareSerial.h"

// HM-Z14A
const int pwmPin = 6; // digital pin

// ESP-01
#define RX 10
#define TX 11
SoftwareSerial AT(RX, TX);

// WiFi
String ssid = "XXXXXXXXX"; //Wifi SSID
String password = "XXXXXXXXX"; //WiFi Pass
String apiKeyIn = "XXXXXXXXX"; // API Key
const unsigned int writeInterval = 25000; // write interval (in ms)

// ThingSpeak
String host = "api.thingspeak.com"; // API host name
String port = "80"; // port

int AT_cmd_time;
boolean AT_cmd_result = false; 

void setup() {
  Serial.begin(9600);
  pinMode(pwmPin, INPUT_PULLUP);
  
  // WiFi status
  Serial.println("---------- Program Start");
  AT.begin(115200);
  Serial.println("Initiate AT commands with ESP8266 ");
  sendATcmd("AT",5,"OK");
  sendATcmd("AT+CWMODE=1",5,"OK");
  Serial.print("Connecting to WiFi:");
  Serial.println(ssid);
  sendATcmd("AT+CWJAP=\""+ ssid +"\",\""+ password +"\"",20,"OK");
}

void loop() {
  // get CO2 data
  int ppmPWM = readPPMPWM();
  
  // Create the URL for the request
  String url = "GET /update?api_key=";
  url += apiKeyIn;
  url += "&field1=";
  url += ppmPWM;
  url += "\r\n";
  Serial.println("---------- Open TCP connection");
  sendATcmd("AT+CIPMUX=0", 10, "OK");
  sendATcmd("AT+CIPSTART=\"TCP\",\"" + host +"\"," + port, 20, "OK");
  sendATcmd("AT+CIPSEND=" + String(url.length()), 10, "OK");
  
  Serial.print("---------- requesting URL: ");
  Serial.println(url);
  AT.println(url);
  delay(2000);
  sendATcmd("AT+CIPCLOSE", 10, "OK");
  
  Serial.println("---------- Close TCP Connection ");
  Serial.println("");
  
  delay(writeInterval); // delay
}

// PWM function
int readPPMPWM() {
  while (digitalRead(pwmPin) == LOW) {}; // wait for pulse to go high
  long t0 = millis();
  while (digitalRead(pwmPin) == HIGH) {}; // wait for pulse to go low
  long t1 = millis();
  while (digitalRead(pwmPin) == LOW) {}; // wait for pulse to go high again
  long t2 = millis();
  long th = t1-t0;
  long tl = t2-t1;
  long ppm = 5000L * (th - 2) / (th + tl - 4);
  while (digitalRead(pwmPin) == HIGH) {}; // wait for pulse to go low
  delay(10); // allow output to settle
  return int(ppm);
}

// sendATcmd
void sendATcmd(String AT_cmd, int AT_cmd_maxTime, char readReplay[]) {
  Serial.print("AT command:");
  Serial.println(AT_cmd);
  
  while(AT_cmd_time < (AT_cmd_maxTime)) {
    AT.println(AT_cmd);
    if(AT.find(readReplay)) {
      AT_cmd_result = true;
      break;
    }
    
    AT_cmd_time++;
  }
  
  Serial.print("...Result:");
  if(AT_cmd_result == true) {
    Serial.println("DONE");
    AT_cmd_time = 0;
  }
  
  if(AT_cmd_result == false) {
    Serial.println("FAILED");
    AT_cmd_time = 0;
  }
  
  AT_cmd_result = false;
}


참조한 blog 에서는, URL 을 만들 때, 단순히 4 bytes 를 추가한 size 를 CIPSEND 하라고 했지만, 제대로 동작하지 않습니다.

Line feed / carriage return 을 GET method 뒤에 추가되어야 정상 동작 합니다. (아래 소스의 제일 마지막 줄)


...
  String url = "GET /update?api_key=";
  url += apiKeyIn;
  url += "&field1=";
  url += ppmPWM;
  url += "\r\n";
...

성공한 결과물을 Serial Monitor 로 확인해 보면 다음과 같습니다.

WiFi 연결 및 HTTP Get method 로 REST API 동작을 확인 할 수 있어요.





11. 결과


ThingSpeak 사이트에서 확인한 결과 입니다.



거실에 설치 후, 외출하면서 CO2 농도가 떨어짐.

외출에서 귀가하면서 농도가 한번 급등하고, 그 후에 지속적으로 오름.

취침시간을 기점으로 점점 떨어지다가 기상과 더불어 다시 올라가는 그래프를 보여 줬습니다.


우리 집은 CO2 농도가 꽤나 높은 것으로 나오네요.




12. Update - 20200328


약 10일간 측정한 데이터 입니다.


feeds.csv



잘못 들어간 쓰레기 값들을 조금 조정했습니다. 전원 문제도 있고, 빵판의 접점 문제 등으로 가끔 쓰레기값이 나오는 듯 해요.



5일 그래프를 겹쳐 봤습니다.

1000 ppm 이상의 값에 대해 비정상임을 의심해 봤으나, 전체적으로 보면 정상 수치임을 알 수 있습니다.

저녁에 가족 4명이 거실에 있으면, 대략 1300대의 값을 보여 줬습니다. 모두 잠든 새벽에는 400 언저리 수치를 보여줘, 전 지구의 값과 동일하다는 것을 확인 할 수 있었어요.


요일별로 늦게 일어나는 주말에는 점심 언저리부터 값이 증가하고, 외출해 있을 때에는 거의 값의 변화가 없었으며, 저녁 12시 취침시간을 기점으로 아침 기상까지 수치가 떨어지는 그래프를 보여 줬습니다.


산소 발생기와 연동한다면, 새벽 외에는 하루 종일 틀어놔야 겠군요. 물론, 400 수치로 돌아오면 멈추는 루틴이 필요하겠지만.



And

Hardware | PN523 - RFID / NFC breakout 보드

|

이 글은, 아래 포스트에서 예고 했듯이, RFID / NFC 를 arduino 를 이용하여 tag를 인식시켜 보는 글 입니다.


* Book | 훤히 보이는 RFID/USN - Get to know RFID/USN

https://chocoball.tistory.com/entry/Book-Get-to-know-RFID-USN





1. 대응 가능한 chip


RFID / NFC 를 읽을 수 있는 chip 중에 PN532 가 FeliCa 도 인식할 수 있으며, 대중적으로 구입 가능하다는 것을 알게 되었습니다. (범용)


* RFID Selection Guide - Adafruit Industries

https://cdn-shop.adafruit.com/datasheets/rfid+guide.pdf

rfid+guide.pdf



PN5xx 시리즈 중에서 시중에서 구입 가능한, 그리고 xx 부분의 숫자가 큰 것으로는 PN532 가 있더군요.

가장 우수한 chip 으로는 PN544 입니다만, 관련 breakout 은 5만원 이상이었습니다.


저렴하게 AliExpress 에서 골라서 구입합니다.


* 1Set GREATZT PN532 NFC RFID Wireless Module V3 User Kits Reader Writer Mode IC S50 Card PCB Attenna I2C IIC SPI HSU For Arduino

https://www.aliexpress.com/item/1Set-GREATZT-PN532-NFC-RFID-Wireless-Module-V3-User-Kits-Reader-Writer-Mode-IC-S50-Card/32859551116.html



- User manual : PN532_Manual_V3.pdf


[Features]

1. Gilt PCB and Small dimension and easy to embed into your project

2. Support I2C, SPI and HSU (High Speed UART), Change between those modes

3. Support RFID reading and writing

  1) SupportP2P communication with peers

  2) Support NFC with Android phone


4. Typical Operating Distance have been updated to 5cm~7cm reading distance

5. Work in NFC Mode or RFID reader/writer Mode

6. RFID reader/writer supports:

  1) 1k, 4k, Ultralight, and DesFire cards

  2) ISO/IEC 14443-4 cards such as CD97BX, CD light, Desfire, P5CN072 (SMX)

  3) Innovision Jewel cards such as IRT5001 card

  4) FeliCa cards such as RCS_860 and RCS_854


7. Plug and play, for compatible

8. Built in PCB Antenna, with 4cm~6cm communication distance

9. On-board level shifter, Standard 5V TTL for I2C and UART, 3.3V TTL SPI

10. Work as RFID reader/writer

11. Work as 1443-A card or a virtual card

12. Exchange data with other NFC devices such as smartphone



[Package Included]

1 x1PCS*PN532 NFC RFID Module

1x 2.54mm spacing 4pin Cable

1xMifare One S50 White Card

1xMifare One S50 Key Card

1x12P bended male pins


사양을 보면 FeliCa 도 읽을 수 있다고 되어 있습니다.

FeliCa 는 일본 지하철 / 국철에서 사용할 수 있는 Suica / PASMO 카드에 사용된 기술입니다.

마침 일본에서 사용했던 Suica / Pasmo 카드를 가지고 있으니, FeliCa 대응 가능한 이 breakout 을 이용할 수 있겠네요.


다만, fake 제품은 읽을 수 없다고 합니다. (나중에 안 사실)

AliExpress 에서 구매할 수 있는 저가품이다 보니, 아마 불가능할 것 같다는 느낌은 듭니다.





2. 도착


배송에 한달정도 소요되었습니다.



구성품은 다음과 같습니다.

Tag 종류가 둥그런 것과 카드형식, 두가지가 들어 있네요.



Breakout 보드의 확대 사진입니다.



뒷면입니다. I2C 용 pin head 와 SPI 용이 따로 구분되어 있습니다.



Arduino 와 연결하기 위해서 pin head 들을 납땜 했습니다.

납땜 팁이 오래 쓰면서 산화되어 버려 이제는 납볼이 잘 생성되지 않았지만, 어떻게든 이쁘게 된것 같네요.







3. Library 설치


이 보드에 관한 제작 / 판매하는 사이트를 따라가다 보면 Seeed Studio 라는 회사가 떠오릅니다.

관련한 source 들은 아래 GitHub 에서 공유되어 있습니다.


* elechouse/PN532

https://github.com/elechouse/PN532


위의 사이트에서 설명되어 있기론, 아래 두 파일을 Arduino libraries 폴더에 압축을 풀어서 copy 하라고 합니다.

결국 위의 GitHub 의 파일과, 추가로 Don 이라는 사람이 만든 NDEF 파일을 Arduino > libraries 에 설치하면 준비는 끝납니다.


PN532-PN532_HSU.zip

NDEF-master.zip


위에서 시키는 대로 하면, PN532 directory 가 많아지므로, 구분을 위해 prefix "elechouse" 를 붙여서 아래처럼 저장했어요.



다른 source 로는, 가장 유명한 adafruit 에서 나온 PN532 library 를 설치하면 됩니다.


* adafruit/Adafruit-PN532

https://github.com/adafruit/Adafruit-PN532


위에서 파일을 다운로드 받아 libraries 에 copy 해도 되고, 아래처럼 Library Manager 를 이용하여 install 해도 됩니다.



다만, adafruit 소스에는 HSU (High Speed UART) 연결방식이 지원되지 않습니다.

그러니 HSU 를 사용하고 싶으면, 처음에 소개된 elechouse source 가 필요합니다.





4. I2C 연결


이제 소스를 올리고 RFID 인식을 시켜 봅니다.

Arduino 와 연결 방식은 I2C / SPI / HSU 가 있으니, 먼저 가장 단순한 I2C 를 이용해 봅니다.


아래처럼 DIP switch 를 I2C 방식으로 변경합니다.



문제 없이 I2C 통신이 이루어 지는지 I2C detect 소스로 확인해 봅니다.

방법은 예전에 올렸던 아래 포스트에서 확인해 보세요.


* Hardware | Gyroscope GY-521 MPU-6050 을 사용해 보자

https://chocoball.tistory.com/entry/Hardware-Gyroscope-GY521-MPU6050



PN532 breakout 의 측정된 주소로 "0x24" 가 나왔네요.

연결은 다음과 같이 합니다.


   PN531  | Arduino Nano
-------------------------
    VCC   |     5V
    GND   |     GND
    SDA   |     A4
    SDL   |     A5
-------------------------


연결 layout 은 다음과 같습니다.

구매한 breakout 보드와 동일한 fritzing 파트를 찾을 수 없어서 adafruit 에서 나온 것을 사용하였습니다.



여타 I2C 연결이 그러하듯 동일합니다.



아래 sample source 를 arduino 에 로드합니다. iso14443a_uid 가 처음 시작하기에 가장 평범한 소스라고 하네요.


File > Examples > elechouse_PN532 > iso14443a_uid



Serial Monitor 에서 확인하면 다음과 같이 인식합니다!



위의 소스의 단점은 준비 상태로 되는 것과 카드를 태킹하면 인식에 시간이 좀 걸린다는 것 입니다.

실생활에 전혀 사용할 수 없는 수준이네요.


그럼 이번에는 Adafruit 의 동일한 소스를 사용해 봅니다.


File > Examples > Adafruit PN532 > iso14443a_uid


adafruit 소스는 먼저번 소스와는 다르게, IRQ 와 RESET (RSTO) 를 추가로 연결하는 부분이 존재합니다.


// If using the breakout or shield with I2C, define just the pins connected
// to the IRQ and reset lines.  Use the values below (2, 3) for the shield!
#define PN532_IRQ   (2)
#define PN532_RESET (3)  // Not connected by default on the NFC Shield

// Uncomment just _one_ line below depending on how your breakout or shield
// is connected to the Arduino:

// Use this line for a breakout with a SPI connection:
//Adafruit_PN532 nfc(PN532_SCK, PN532_MISO, PN532_MOSI, PN532_SS);

// Use this line for a breakout with a hardware SPI connection.  Note that
// the PN532 SCK, MOSI, and MISO pins need to be connected to the Arduino's
// hardware SPI SCK, MOSI, and MISO pins.  On an Arduino Uno these are
// SCK = 13, MOSI = 11, MISO = 12.  The SS line can be any digital IO pin.
//Adafruit_PN532 nfc(PN532_SS);

// Or use this line for a breakout or shield with an I2C connection:
Adafruit_PN532 nfc(PN532_IRQ, PN532_RESET);


위의 소스의 일부분에서 보여주는 것 처럼 SPI 부분을 주석처리 하고, I2C 부분을 활성화 시킵니다.

두개의 pin 연결이 아래처럼 추가되었습니다.


   PN531  | Arduino Nano
-------------------------
    VCC   |     5V
    GND   |     GND
    SDA   |     A4
    SDL   |     A5
    IRQ   |     D2
   RSTO   |     D3
-------------------------


결과는 인식률과 인식 속도가 엄청 빨라졌습니다.

결국 IRQ / RESET 핀이 준비상태 및 인식 처리를 추가로 담당한다는 것을 예상할 수 있습니다.

Serial Monitor 결과는 다음과 같습니다.



참고로 위의 소스로 신용카드 (버스카드) 를 인식 시키면 "Mifare Classic" 으로 읽어보라고 메시지가 뜹니다.


File > Examples > Adafruid PN532 > readMifareClassic 을 로드 시켜 봅니다.



뭔가 정보를 더 많이 뿌려줌과 동시에, "Mifare Classic" 이라고 이야기 해 줍니다.


조금 벗어난 이야기 이지만,

RFID / NFC 분야도 존재하는 규격이 많아서 chip 제조사로서는 골치가 아플 듯 합니다.


이것도 결국 기술 로열티와 표준 제정 이권싸움의 결과겠죠.

Thunderbolt 도, 결국은 Thunderbolt 3 = USB Type-C 로 통합되듯, 언젠가 RFID / NFC 도 통합이 되었으면 좋겠습니다.





5. SPI 연결


이제 SPI 연결을 시도해 봅니다. 역시 많은 데이터 교환은 I2C 보다는 SPI 방식입니다.

먼저, Software SPI 연결법 입니다.


   PN531  | Arduino Nano
-------------------------
    VCC   |     5V
    GND   |     GND
    SCK   |     D2
    MISO  |     D5
    MOSI  |     D3
    SS    |     D4
-------------------------


소스는 adafruit 의 것을 이용해 봅니다. (elechouse 것도 상관 없슴)


File > Examples > Adafruit PN532 > readMifare


이미 소스에서 SCK / MOSI / SS / MISO 의 pin 번호를 정희해 놨으므로, 그에 맞게 arduino 와 연결해 줍니다.



TIMEOUT! 이 뜨긴 합니다만, 결과는 아래와 같이 잘 나옵니다.

아무래도 Software SPI 여서 그런 듯 합니다.



역시 SPI 는 Hardware SPI 죠. Hardware SPI 법으로 구동해 봅니다.


   PN531  | Arduino Nano
-------------------------
    VCC   |     5V
    GND   |     GND
    SCK   |     D13
    MISO  |     D12
    MOSI  |     D11
    SS    |     D4
-------------------------


SS pin 은 어느 digital IO pin 이나 상관 없습니다.

이미 PN532_SS 를 4 번 pin 으로 정의해 놨으니, 그 pin 을 그대로 사용합니다.



나머지 pin 들은 각각의 arduino 에 맞게 연결하면 됩니다.

참고로 arduino nano 는 위의 주석에 설명되어 있는 것처럼 SCK = 13, MOSI = 11, MISO = 12 로 맞추면 됩니다.

이는 아래 그림처럼 실제 nano 의 pin out 과 동일합니다.



결과는 다음과 같이 나옵니다. TIMEOUT! 도 없고 인식도 가장 빠른것 같아요.



동영상도 올려 봅니다.






6. FeliCa 인식


FeliCa 가 된다고 하니, electhouse 소스의 FeliCa_Card_Read 를 실행해 봅니다.


File > Examples > elechouse_PN532 > FeliCa_Card_Read


실망스럽게도 PASMO 는 인식되지 않았습니다.

당연하게도 Mifare (ISO14443A) 카드들에게는 전혀 반응하지 않았구요.


단, 희한하게도 일본에서 사용했던 Times (한국의 SOCAR 같은 서비스) 카드는 이 소스로 읽혔습니다.



FeliCa 도 여러 종류가 있는 듯 합니다.

아쉽게도 지하철에 사용되는 FeliCa 인, 일본의 PASMO 와 싱가포르의 EZ-Link 는 어떤 소스에도 읽히지 않았습니다.





7. High Speed UART 연결


특이하게 HSU 라는 연결 방법을 제공합니다. 이는 High Speed UART 의 약자.

이 HSU 는 Hardware Serial (Serial1) 을 바탕으로 소스가 만들어졌습니다.



다만, 위의 표에서 보이듯이, Hardware Serial 를 사용하는 지라, 일부 arduino 에서는 Serial Monitor 를 열어서 확인할 수 없게 됩니다.

Arduino Nano 도 Hardware Serial 은 USB 통신에 점유되어 있어서 "Serial1" 을 사용할 수 없었습니다.



하늘이 무너져도 솟아날 구멍은 있다던가요, 가지고있는 arduino micro 에서는 사용 가능했습니다.

그럼 아래 source 를 arduino micro 에 업로드 해봅니다.


File > Examples > electhouse_PN532 > iso14443a_uid


PN532_HSU 쪽을 활성화면서 "Serial1" 을 사용하게 합니다.



Arudino micro 와의 pin 연결은 다음과 같습니다.


   PN531  | Arduino Micro
--------------------------
    VCC   |     5V
    GND   |     GND
    SDA   |     RX
    SDL   |     TX
--------------------------


잊지 말아야 할 것은, DIP switch 를 HSU 으로 설정해 둬야 합니다.



Arduino micro 의 RX / TX 와 연결하여 HSU 인겁니다.



오오오오! 느낌적으로 SPI 보다 더 빠른 듯 합니다. 이게 가장 빠르네요.




결과는 이렇게 보이구요.



동영상도 올려 봅니다.



그럼 arduino nano 처럼 Hardware Serial 여유가 없는 arduino 는 안되는거냐!

찾아보니 방법을 GitHub 의 설명에서 친절하게 알려주고 있었습니다.


아래 소스처럼 "SoftwareSerial.h" 를 이용하여 구현이 가능합니다.

우선 바로 아래는 Hardware Serial 로 구현된 부분을...


#include "PN532_HSU.h"
#include "PN532.h"

PN532_HSU pn532hsu(Serial1);
PN532 nfc(pn532hsu);

void setup(void)
{
	nfc.begin();
	//...
}


아래처럼 SoftwareSerial.h 를 추가하고 관련된 pin 을 정의해 주면 됩니다.

뭐, 관련된 함수를 "PN532_SWHSU.h" 에서 구현해 줘서 가능한 것이지만 말입니다.


#include "SoftwareSerial.h"
#include "PN532_SWHSU.h"
#include "PN532.h"

SoftwareSerial SWSerial( 10, 11 ); // RX, TX

PN532_SWHSU pn532swhsu( SWSerial );
PN532 nfc( pn532swhsu );

void setup(void)
{
	nfc.begin();
	//...
}


최종적으로 Hardware Serial 관련 부분을 주석처리 하고, SoftwareSerial 을 활성화 하는 코드를 추가하면 됩니다.



Pin 연결은 위에서 정의한 D10 과 D11 에 각각 연결하면 됩니다.

참고로, SDA 는 TX 이고, SDL 은 RX 이므로, SDA(TX) <--> D10 (RX), SDL(RX) <--> D11(TX) 가 됩니다.


   PN531  | Arduino Nano
-------------------------
    VCC   |     5V
    GND   |     GND
    SDA   |     D10
    SDL   |     D11
-------------------------


잘 구동합니다만, 뭔가 타이밍이 맞지 않은지 authentication fail 이 뜹니다.

소스코드에서 수정해야 할 부분이 있는듯 보입니다만, 확인이 어느정도 되었으니 패스.






8. 확인한 RFID / NFC 카드들


마지막으로, 본 포스트에서 확인용으로 사용된 카드들을 소개합니다.



위는 PN532 breakout board 를 구입하면 기본으로 딸려오는 tag 들 입니다. 하나는 원형, 하나는 카드 모양입니다.



위는 싱가포르 출장때 구입해서 사용했던 지하철 패스카드 입니다. 충전식이죠.

아쉽지만, 구입한 PN532 가 짝퉁이라서 못 읽는 것인지 모든 소스와 연결 방법에서 읽기를 실패했습니다.



마찬가지 FeliCa 인식에서 실패한 일본 PASMO 입니다. 일본에서 거주할때 신세를 졌었죠.



저의 회사 출입 카드 입니다. 5년전에 찍은 거라 얼굴이 지금보다 젊어 보이네요. ㅠㅠ



버스카드 겸용인 신용카드 입니다. Mifare Classic 입니다. 잘 읽힙니다.

전용 어플을 이용하면 RFID 정보도 덮어 씌기가 될 듯 한데, 이번에는 도전하지 않았습니다.



유일하게 읽힌 FeliCa 카드 입니다!

다른 소스에서는 전혀 읽히지 않았고, FeliCa Read 소스에서만 유일하게 읽힌 놈입니다.

일본에서 자가용을 운용할 여유가 안되어서, 잘 빌려서 타고 다녔습니다. (SOCAR 같은 서비스)





9. FIN


역시 아쉬운 점은 지하철용 FeliCa 를 읽을 수 없었다는 점 입니다.

뿌듯한건 모든 인터페이스 - HSU, Software HSU, I2C, I2C with RST, Hardware SPI, Software SPI - 모두를 확인해 봤다는 점 입니다.


기회가 되면, 아래 스샷처럼 NXP 에서 나온 어플을 가지고 완벽하게 debugging 을 해보고 싶습니다.

다만, PN544 breakout 보드가 5만원 이상이라는 것 때문에, 일단 여기서 멈춥니다.



And
prev | 1 | next