'오실레이터'에 해당되는 글 6건
- 2021.02.02 Hardware | ESP-12 사용기 6
- 2021.01.08 Hardware | ESP-07 사용기 2
- 2020.08.17 Hardware | ESP-03 사용기
- 2019.10.25 Hardware | Arduino 를 DIY 해보자 - 3
- 2019.08.26 Hardware | 555 chip 알아보기 - 1
- 2018.11.11 Hardware | RTC DS3231 부품 사용기 - 1 2
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)
위의 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) 라고 나옵니다.
32Mbit 면 1024KB+1024KB 일 듯 한데... 일단 넘어 갑니다.
Internet 에 연결하여 AT+CIUPDATE 실행을 통하여 원격 update 를 시도해 봤으나, ERROR 를 냅니다. 역시나 옛날 버전.
Flash Chip 은 QUAD : 32Mbit 로 문제 없이 확인 됩니다.
6. Programming
일단은 문제가 없는 듯 하니, source 를 올려 봅니다. 테스트 해볼 소스는 Blink 와 CheckFlashConfig.
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); }
QIO 및 4MiB 네요. 지금까지 완성품을 구입한 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 를 이용합니다.
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 관련한 옵션이 새로 추가되었습니다.
'Hardware' 카테고리의 다른 글
Hardware | CJMCU-103 Rotary Angle Sensor (6) | 2021.02.16 |
---|---|
Hardware | 보조배터리 분해해 보기 (0) | 2021.02.11 |
Hardware | Digi-Key 에서 전자부품 주문해 보기 (2) | 2021.02.01 |
Hardware | TIMER 수리기 (6) | 2021.01.21 |
Hardware | JLCPCB 에서 PCB 주문을 해보자 (2) | 2021.01.19 |
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
혹시 모를 전압 문제를 방지하고자, 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 Chip 의 SPI 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
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 Mode 가 DOUT 이며, 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
'Hardware' 카테고리의 다른 글
Hardware | TIMER 수리기 (6) | 2021.01.21 |
---|---|
Hardware | JLCPCB 에서 PCB 주문을 해보자 (2) | 2021.01.19 |
Hardware | 필립스 HR2195 믹서기 수리기 (0) | 2021.01.07 |
Hardware | bGeigie Nano 충전을 wireless 로 바꿔보자 (0) | 2021.01.06 |
Hardware | Anker PowerConf 간단 사용기 (0) | 2020.11.04 |
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)
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 = 512KiB 에 SDK V2.0.0 과 AT 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 에 대한 이야기가 되겠네요.
'Hardware' 카테고리의 다른 글
Hardware | INSTOCK PD594A 구입기 (0) | 2020.10.12 |
---|---|
Hardware | Fuji Xerox CP116w 수리 성공기 (52) | 2020.10.07 |
Hardware | ZE08-CH2O Formaldehyde 센서 사용해보기 (4) | 2020.08.14 |
Hardware | ROKU 로 화면 미러링 사용해 보기 (0) | 2020.07.29 |
Hardware | SK 스마트미러링 사용해 보기 (2) | 2020.07.28 |
이 글은 아래 Arduino 를 직접 만들어보는 작업의 3편이 되겠습니다.
* Hardware | Arduino 를 DIY 해보자 - 1
- http://chocoball.tistory.com/entry/Hardware-Arduino-DIY-itself-1
* Hardware | Arduino 를 DIY 해보자 - 2
- http://chocoball.tistory.com/entry/Hardware-Arduino-DIY-itself-2
0. Duemilanove
저번에 실패한 Arduino Nano 는 뒤로 하고, 이번에는 Duemilanove 입니다.
위는 정품 layout 이고, 밑에 사진이 이번에 작업할 보드 입니다.
1. Part list
Arduino Duemilanove 에 들어가는 부품 리스트 입니다.
아래 리스트는 보드프리의 PDF 파일과 arduino 사이트에서 EAGLE 파일을 참고하였습니다.
* 보드프리
* Arduino
arduino-duemilanove-schematic.pdf
arduino-duemilanove-reference-design.zip
------------------------------------------------------------------------------------------------------- | name | value | type | ------------------------------------------------------------------------------------------------------- | C1, C4, C5, C8, C9, C10, C11, C12, C13 | 100nF | 0805 SMD | | C2, C3 | 22pF | 0805 SMD | | C6, C7 | 100uF 35V | Aluminum Electrolytic Capacitor | ------------------------------------------------------------------------------------------------------- | R1, R10, R11 | 10k Ohm | 0805 SMD | | R4, R5, R6, R7, R8, R9 | 1k Ohm | 0805 SMD | | L, PWR, RX, TX | LED | 0805 SMD | ------------------------------------------------------------------------------------------------------- | D1 | M7 (1N4007) | Rectifier Diode | | F1 | 500mA 15V | L1812 Resetable Fuse | ------------------------------------------------------------------------------------------------------- | J1, J3 | 8 | single row female 2.54mm pitch pinhead | | J2, POWER | 6 | single row female 2.54mm pitch pinhead | | ICSP | 6 | double row male 2.54mm pitch pinhead | | S1 | B3F-10XX | OMRON B3F-10XX series switch | | X2 | DC-21MM | 5.5/2.1mm female DC power jack plug socket | | X4 | USB B type | USB B type female socket | ------------------------------------------------------------------------------------------------------- | IC1 | ATMEGA328P-PU | DIP28 8-bit Microcontroller | | IC2 | FT232RL | SSOP28 USB UART interface IC | | IC4 | MC33269D-5.0 | 5V 800mA LDO voltage regulator | | IC5 | LM358D | SOP8 Op Amp | | Q2 | 16MHz | HC-49S crystal oscillator | | T1 | NDT2955 | SOT-23 MOSFET | ------------------------------------------------------------------------------------------------------- | R2 | 100_NM | no need to implement "no-mount" | | RESET-EN | jumper | "auto-reset" on ATmega168 | | X3 | JP4 | use like FTDI breakout board | -------------------------------------------------------------------------------------------------------
이제 위의 리스트를 가지고 하나씩 구매한 이력을 남겨 봅니다.
그냥 arduino duemilanove 하나 사면 3천원대에서 clone 제품을 구할 수 있으나,
이참에 준비하면서 부품들도 구해보고, 사용법도 알아보고 공부하기 위한 목적으로 진행했습니다.
2. Pin Header
외부 기기와 연결되기 위한 Pinout 용 Header 입니다.
기존에 보유하고 있는 긴 한줄읠 pin header 를 잘라서 사용할 수 있으나, 지저분해 질 수 있고,
깔끔하게 보이고 싶어서 궂이 구입했습니다.
* Single row female 2.54mm Pitch PCB Female Pin Header Connector Straight Single Row 2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/20/40Pin
도착은 주문한데로 6pin 용과 8pin용, 10개씩 배달되었습니다.
요로코롬 생겼습니다.
3. Fuse
실장되는 Fuse 는 전기적인 규격이 동일하고, 과전류가 흐른 뒤 다시 스스로 복구되는 Self Healing (Self Resetting) Fuse 입니다.
* 20PCS/LOT 1812 SMD SMD self-healing fuse 0.5A 500mA 15V MF-MSMF050-2
무리없이 도착.
수령한 제품은 웹사이트에서 본 사진과는 다르지만, 한번 믿고 써보기로 합니다.
4. Oscillator
CPU를 돌리고 명령어를 전달하는 역할을 하는 oscillator 입니다.
* hc-49s Crystal Oscillator electronic Kit resonator ceramic quartz resonator hc-49 DIP 7 kinds X 5pcs 32.768K 4 8 12 16 20 25 MHZ
필요한건 16 Mhz 이지만, 낱개로 파는 경우는 없어서 세트로 구매합니다.
요로코롬 생겼네요.
5. LED
이왕이면 한꺼번에 받기위해 한 업체에 몇가지를 같이 주문하였습니다.
왠지 LED 부품은 받을때마다 기분이 좋습니다.
6. Capacitor
Capacitor 는 세라믹과 둥그런 알루미늄 캡 캐패시터 두가지를 사용합니다.
부품이 많다 보니, 10uF 은 빼고 처음 주문을 넣어버려, 다른거 주분할 때 같이 주문했습니다.
0805 SMD 버전이라 100개씩 묶음이라고 해도 배송 용량이 적네요.
알루미늄 캡 캐패시터는 LED 구입한 업체에서 같이 구입해서 이미 도착했습니다.
7. Resistor
저항은 1K 와 10K 두가지가 필요합니다.
위의 세트구성은 다음과 같습니다.
10R / 22R / 47R / 100R / 220 / 470R / 750R / 1K / 2K2 / 4K7 / 6K8 / 10K
22K / 47K / 75K / 100K / 220K / 470K / 750K / 1M
* 2000pcs 0805 SMD Resistor Kit Assorted Kit 1ohm-1M ohm 5% 80valuesX 25pcs=2000pcs Sample Kit
위의 세트구성은 다음과 같습니다.
10 / 100 / 1K / 10K / 100K
12 / 120 / 1K2 / 12K / 120K
15 / 150 / 1K5 / 15K / 150K
20 / 200 / 2K / 20K / 200K
22 / 220 / 2K2 / 22K / 220K
27 / 270 / 2K7 / 27K / 270K
30 / 300 / 3K / 30K / 300K
33 / 330 / 3K3 / 33K / 330K
39 / 390 / 3K9 / 39K / 390K
47 / 470 / 4K7 / 47K / 470K
51 / 510 / 5K1 / 51K / 510K
62 / 620 / 6K2 / 62K / 620K
68 / 680 / 6K8 / 68K / 680K
75 / 750 / 7K5 / 75K / 750K
82 / 820 / 8K2 / 82K / 820K
91 / 910 / 9K1 / 91K / 910K
엄청 작네요. 이것이 0805 SMD 저항이군요.
8. Switch
9. Diode
LED 도착시 같이 왔습니다. 생각보다 이것도 크기가 꽤 작네요.
10. FT232RL
USB 통신을 위한 controller 입니다.
ATmega328P 는 CPU 자체에 USB 컨트롤러 부분이 없어서 이렇게 추가 USB controller chip 이 필요합니다.
참고로, Arduino Micro 에 사용되는 ATmega32U4 는 내장 USB controller 가 있어,
이렇게 추가 USB controller chip 이 필요 없습니다.
이제야 chip 들이 도착하는군요.
이번에 구입한 FTDI chip 은 마킹이 깔끔해 보여서 흔한 fake chip 은 아닌 듯 합니다.
모두 조립 후, 한번 확인해 볼께요.
11. Voltage regulator
5V 800mA 용량의 레귤레이터 입니다.
좀더 큰 용량으로 하고 싶었으나, 이쪽 지식이 충분치 않고, 과전류시 chip 들의 안전이 보장되지 않기에 스펙대로 구매했습니다.
* Free shipping 10pcs/lot MC33269DT-5.0G 5V .8A MC33269DT-5. 33269DT MC33269DT 33269DT MC33269 MC33269DT-5.0RKG
전압/전류 관련 부품이다 보니, 다른 부품들보다 크기가 큽니다.
기존 DC adapter 에도 잘 맞습니다.
PCB 에도 맞춰 보니 문제 없네요.
중요 부품이지만, 그런거 없습니다. 여타 부품처럼 평이하게 도착했습니다.
선명하게 CPU 마킹이 되어 있습니다. Socket 이랑 같이 찍어봤습니다. 이쁘다...
* 5pcs DIP-28 Round Hole 28 Pins 2.54MM DIP DIP28 IC Sockets Adaptor Solder Type 28 PIN 2.54 IC Connector
구멍이 round hole 과 lead 방식이 있습니다.
자주 chip 을 뺏다 꼈다 할 경우에 round hole 이 장점이 있고, lead 방식은 오랜동안 그냥 놔둘 경우 좋다고 합니다.
사실 lead 방식이 접점이 확실합니다.
다만, 이왕 하는 김에 고급지게 해보고자 round hole 타입을 구매해 봤습니다.
round hole 은 금속 다리 부분이 주조 방식으로 제작되므로 좀더 비쌉니다. 그리고 점점도 나쁘지 않아요.
PCB 에 잠깐 얹어 봤습니다. 아주 부드럽게 잘 맞습니다.
* 50PCS LM358DR SOP8 LM358 SOP LM358DT SOP-8 SMD LM358DR2G new and original IC
ATmega328P 과 함께 도착한 부품입니다.
* HMICICAWK Original 100% NEW 2955 NDT2955 SOT-223 10PCS/LOT
씌여진 문구에 SOT-223 이라고 되어 있습니다만, 배송된 것은 DPAK 버전으로 큰게 왔습니다.
크고 좋아보입니다만 보드에 맞질 않습니다.
Dispute 환불을 걸고 다른 업자에게 주문했더니만, SOT-233 버전을 또 보냈더랬습니다.
마킹이 조금 이상합니다만 문제 없겠죠?
다시 보낸다는 이야기가 없어, 다른 판매자에게 이미 주문을 또 했더랬습니다.
* BQ24040DSQR AP3608EG-G1 SN74LVC2G66DCTR NDT2955 MMFT2955 NTF2955 SP202EEN IR2153S STP100N8F6 MBR40100CT TPS60400DBVR D15XB80
SOT-233 버전의 MOSFET 이 또 왔어!
이놈은 마킹이 프린팅 되어 있네요.
대략 실장될 부품을을 위치 시켜보구요.
Flux Paste 를 바르면서 진행해야 하므로, 부품들이 도망가지 않게 테이프에 layout 에 맞게 안착/준비 시켜 놓습니다.
한땀 한땀... 이라고 하기엔 다소 지저분하게 작업을 진행합니다.
오븐을 통해 구워져 나오진 첫번째 Duemilanove 작품.
온도 조정에 실패해, 흰색 기판이 빵색으로 되었습니다.
결국 LED 극성을 거꾸로 해버려, 부품 때어 내다가 패턴이 나가는 사태가... 폐기 처분.
꽤 시간이 지난 후, 다시 새로 PCB 받아서 심기일전, 다시 시작.
이번에는 Flux Paste 를 적정량 도포할 정도로 실력이 조금 향상.
구워지기 전 사진.
오븐에 구워져 나온 후, USB, Power Jack, Pin header, Switch 등등, CPU 만 빼고 모두 장착.
마지막으로 CPU 장착.... 아... 감격.
17. bootloader
이제, arduino 를 IDE 등을 통해 소스코드 넣고 동작시키려면 bootloader 를 올려야 합니다. 지금은 완전 깡통 상태.
위의 사진의 ICSP 부분을 통해서 bootloader 를 밀어 넣을 수 있습니다.
연결법은, 예전 bootloader update 할 때의 방법과 동일합니다.
* Software | Arduino Nano Bootloader 를 update 해보자
- https://chocoball.tistory.com/entry/Software-Arduino-Nano-Bootloader-update
======================================== | Source (Nano) | Target (Duemilanove) | ======================================== | D12 | MISO (pin 1) | | 5V | 5V (pin 2) | | D13 | SCK (pin 3) | | D11 | MOSI (pin 4) | | D10 | RESET (pin 5) | | GND | GND (pin 6) | ----------------------------------------
처음 작업 시, Arduino Micro 를 활용해서, 스샷이 이렇게 되었네요. 소스 아두이노를 Nano 로 하면 Nano로 선택.
Source 아두이노에 "Arduino ISP" 스케치를 올립니다.
Programmer 를 "Arduino as ISP" 를 선택.
이제 다른건 다 놔두고, target arduino 기종을 선택. 대망의 Duemilanove 선택!
"Burn Bootloader" ~~~~~~~~~~!!!
동영상은 예의.
크아~~~~ 성공.
1년 이상 걸려서 조금 지친감이 없지 않아 있지만, 기분 너무 좋습니다.
이제 자가 Arduino Duemilanove 가 생겨, 다양한 프로젝트를 동시에 할 수 있는 여유가 생겼습니다.
'Hardware' 카테고리의 다른 글
Hardware | Arduino Gemma 를 DIY 해보자 (2) | 2019.11.07 |
---|---|
Hardware | 블랙박스 아이머큐리 TOPAZ 수리기 (5) | 2019.11.01 |
Hardware | SMD 솔더링에 대한 고찰 (0) | 2019.10.23 |
Hardware | 레트로 led 글자판 HPDL-1414 사용기 - 1 (0) | 2019.10.15 |
Hardware | 공기질 측정용 MiCS-6814 센서를 사용해 보자 - 1 (26) | 2019.10.12 |
1. History
원래는 4x4 DIP socket 이 필요해서 찾아보던 중, 555 chip 에 소켓도 같이 딸려오는 패키지가 있어, 555 를 접하게 되었습니다.
이 555 chip 은 아날로그를 디지털화 시켜주는 chip 으로써, 개발하신 분도 이렇게까지 널리 사용될 줄은 몰랐다고 합니다.
1972년에 소개된 것이, 지금도 여전히 많이 사용되고 있고, 그 갯수가 한해 10억개에 이른다 합니다.
기본적인 사용처로는, timer, pulse generation, 그리고 oscillator 등에 사용된다고 합니다.
사용법은 간단하여, 입력단의 저항과 캐패시터, 또는 스위치를 이용하여 output 을 조절한다고 합니다.
* 555 timer IC
- https://en.wikipedia.org/wiki/555_timer_IC
2. 구매
원래 DIP socket 구매의 주 목적은, ATtiny85 flashing 시, 잘못된 fuse bit 를 flashing 하게 되면 ATtiny85 가 벽돌이 됩니다.
이를 환생시켜 주기 위해서는 9~12V 를 이용하여 chip 을 reset 해줘야 하는 데, 그 회로를 만들기 위해 4x4 DIP 소켓이 필요했습니다.
아래 글에서 나와 있듯이 ATtiny85 를 Digispark 로 만들어 보면서 필요하게 된 내용 입니다.
* Hardware | ATtiny85 개발 보드를 이용하여 Digispark 를 DIY 하기
- https://chocoball.tistory.com/entry/Hardware-Digispark-DIY-using-ATtiny85
* MCIGICM 20pcs , (10 each) NE555 IC 555 & 8 Pin DIP Sockets
- https://www.aliexpress.com/item/32701785561.html
도착은 아래와 같습니다.
도착샷을 올리는 것은, 포스트 내용을 길게 빼기 위해서 항상 빠질 수 없는 짓 입니다.
원하는 4x4 DIP 소켓을 얻게 되었구요.
NE555 chip 이 부차적으로(?) 딸려 왔습니다. :-D
사양 문서는 아래 올려 놨습니다.
3. 기본 원리
555 에 대해서 동영상과 설명이 가장 잘 되어 있는 사이트는 아래와 같습니다.
* 555 Timer IC – Working Principle, Block Diagram, Circuit Schematics
언뜻 보기엔 어려워 보이지만, 전자공학과 관련된 기초적인 지식만 가지고 있으면 이해할 수 있다고 봅니다.
아래 설명들은 위의 내용을 간략해서 올려 봅니다.
555 의 물리적인 diagram 과 논리적인 diagram 은 다음과 같습니다.
논리적인 구성은 다음과 같고, 전체적으로 보면,
입력 voltage 를 나누고 > 비교하고 > Flip-Flop > 방전 시키면서 출력에 변화를 가하는 회로로 이해 할 수 있습니다.
실제 구현을 살펴 보기 전에, 전체적인 흐름을 설명하면 다음과 같습니다.
우선 Vcc 를 통해서 받은 voltage 가 모든 것의 시작이 됩니다.
아래 예에서는 12V 를 입력하여, comparators 에 들어가는 input 을 저항을 통해 6V/3V 로 바꿔서 넣어 줍니다.
Threshold / Trigger 입력단을 통해, Vcc 의 1/3, 2/3 voltage 인 6V/3V 와 비교시켜, flip-flop 의 입력으로 사용합니다.
참고로 flip-flop 은 다음 그림과 같이, NAND gate 를 가지고 논리적인 output 값을 가집니다.
저도 처음 해보는 지라, 설명을 해 놓고도 이게 뭔말인가 싶습니다.
실제로 관련된 회로를 꾸며봐야 이해하기 쉬울 듯 합니다.
우리 주위에서 가장 흔히 볼 수 있는 활용 예는, 경찰차 표시등이나, 규칙적인 전구의 점등 등이 있겠습니다.
4. Mode : Bistable
위의 동작방식을 가지고 꾸며 볼 수 있는 방법이 3가지가 있습니다.
그 중, 먼저 Bistable 모드에 대해 알아봅니다.
아래처럼 Vcc 와 Trigger / Reset 사이에 저항과 스위치를 각각 가지고 있는 회로를 보겠습니다.
우선 스위치를 누르지 않았을 때의 초기 상태는 0 이 output 으로 출력됩니다.
Trigger 스위치를 누르게 되면, comparator 가 1 로 바뀌고, 결과적으로 output state 가 1 로 바뀌게 됩니다.
그 후, Reset 스위치를 누르면, 다시 초기 상태로 되돌아 옵니다.
이는 555 chip 을 flip-flop 처럼 사용하고 싶을 때 구성하는 방식이 되겠습니다.
아래 그림처럼, Trigger 와 Reset 은,
연속적으로 입력받는다 할 지라도, 최종 output 에는 영향 주지 않으며, 상태를 계속 유지하게 됩니다.
활용도 면에서는 memory cell 이 있겠습니다. Reset 되기 전 까지는 Trigger 가 한번이라도 되면 그 값을 계속 유지하게 되니까요.
5. Mode : Monostable
Trigger 단자에는 스위치 하나와 저항 하나, 그리고 ,Threshold 에는 캐페시터가 연결되어 있고,
Discharge 단자에 이 캐페시터가 연결되어 있는 구조 입니다.
처음에는 Trigger 단자로 Vcc 가 연결되어 있으니 활성화 되어 있고,
Q-bar 와 연결된 트랜지스터가 활성화 되어 Discharge 단자로 들어오는 Vcc 가 상쇄됩니다.
결과적으로 output 은 0 인 상태이고, 회로 전체적으로 아무 변화를 일으키지 않는 상태 입니다.
이 안정된 상태에서 Trigger 스위치가 눌리면, Q-bar 상태가 0 로 변경되면서 트랜지스터가 비활성화 됩니다.
연관하여 이 트랜지스터와 연결되어 있던 Discharge 단자가 차단되고, 캐페시터에 전압이 쌓이게 됩니다.
이 캐패시터의 전압이 2/3 Vcc 에 다다르면, Comparator 에 역전이 일어나면서 전체 회로가 초기 상태로 되돌아 갑니다.
Trigger 입력으로부터 초기 상태로 되돌아가기 까지는 캐패시터와 그와 연결된 저항값에 따라 조절될 수 있습니다.
한번 입력을 넣어 놓으면, 일정 시간이 지나고 자동으로 되돌아 오는 기능이 필요시 사용되는 모드 입니다.
6. Mode : Astable
Astable 모드는 주파수 발진기로 사용될 수 있습니다.
입력받는 저항 및 캐패시터에 의해 정해지는 시간을 주기로 반복적으로 output 값이 1/0 을 나타내게 됩니다.
초기 상태는 트랜지스터가 비활성화된 상태이므로, 캐패시터에 전자가 쌓이게 되고, 1/3 Vcc 지점까지 올라갑니다.
처음 1/3 Vcc 는 Trigger 쪽 Comparator 를 1에서 0 으로 변화시키지만, Q-bar 값을 변화시키지 않으므로, 기존 상태를 유지합니다.
이제 캐패시터가 2/3 Vcc 까지 다다르게 되면, Threshold 쪽 Comparator 상태변화에 따라 최종 output 값이 0으로 바뀌게 됩니다.
이 바뀐 상태가 트랜지스터의 Discharge 회로를 활성화 시키며, 캐패시터의 전자들이 방전되기 시작합니다.
그러면서 1/3 Vcc 까지 떨어지면, 전 회로 상태가 바뀌어, 다시 output 이 1로 변경됩니다.
이제, 캐패시터 voltage 는 1/3 Vcc 에서 2/3 Vcc 사이를 왔다갔다 하면서 충방전이 일어나며, 전체 output 을 0 / 1 변하게 됩니다.
결국 주파수 신호 발생기, pulse generator 역할을 하게 됩니다.
Output 이 1인 상태로 유지하는 시간과 0 을 유지하는 시간은, 저항 2개와 캐패시터 하나의 값에 따라 정해지게 됩니다.
휴.... 이론적인 부분은 여기까지 입니다.
7. Pulse Generator
단순한 구조와 넓은 입력 voltage 값, 잘 고장나지 않는 구조때문에 적용 범위가 엄청 많이 있습니다.
이대로 끝내면 아쉬우니 Astable 상태를 가지고 pulse generation 회로를 꾸며 봤습니다.
아래 사이트를 전적으로 참고하였습니다.
실제 전자 부품이 연결된 모양은 다음과 같습니다.
FIN
555 chip 을 알기 위해선 flip-flop 도 이해해야 하고, Op-amp 를 이용한 comparator 도 이해 해야 하고,
대학교 수업 때, 무식하게 외웠던 내용들을 이 나이 되어서야 logic 적으로 이해할 수 있는 계기가 되는 실험이었습니다.
이제 기초적인 내용을 정리해 봤으니,
앞으로는 실생활에 여전히 많이 쓰이는 555 에 대하여, 시간 날 때마다 하나씩 실험해 보겠습니다.
마지막으로, 555 에 대해 나름 유명한 cookbook 들이 있어 PDF 파일을 올려 놓습니다.
Forrest Mims - 555 Timer IC Circuits.pdf
ICTimerCookbook1stEd1977_WalterGJung.zip.001
'Hardware' 카테고리의 다른 글
Hardware | Dual-axis XY Joystick Module (0) | 2019.09.08 |
---|---|
Hardware | LED 전등 교환기 (0) | 2019.08.28 |
Hardware | ESP-01 or ESP8266 사용기 - 5 (2) | 2019.08.14 |
Hardware | ZP07-MP901 공기질 측정 센서 (0) | 2019.08.13 |
Hardware | ADS1115 16bit 4채널 ADC 를 사용해 보자 (6) | 2019.08.12 |
이 포스트는 DS3231 에 대한 이야기 이며, 후속편에 이어집니다.
* Hardware | RTC DS3231 부품 사용기 - 2
- http://chocoball.tistory.com/entry/Hardware-RTC-usning-DS3231-2
1. RTC
보통 internet 이 달린 기기라면 NTP Server 와 연동하여 시간을 맞추고,
특정 시간에 정확하게 일을 시킬 수가 있습니다.
Internet 에 연결되지 않은 기기의 경우는 다음과 같은 과정이 필요하겠죠.
A) 시간을 설정한다.
B) 시간을 기억한다.
C) 특정 시간에 일을 시킨다.
Internet 이 연결되지 않은 기기와 비교해 보면 B) 항목이 필요합니다.
이 "시간을 기억" 하고, 언제든지 현재 시간 정보를 가져올 수 있는 부품이 DS3231 입니다.
그래서 이번에는 DS3231 을 구입하고 사용해 보겠습니다.
자세한 내용은 아래 Arduino 사이트를 참조해 보세요.
* RTC Library
- https://www.arduino.cc/en/Reference/RTC
2. 구입
말할것도 없이 AliExpress 입니다.
배송까지 40일 걸렸습니다. 이정도 되면 배송에 대해서는 해탈해야 합니다.
* 1PCS DS3231 AT24C32 IIC Precision RTC Real Time Clock Memory Module For Arduino new original
건전지 미포함 1.06 USD 무료배송이면 고민거리는 아닙니다.
(배송기간 빼고)
인터넷을 뒤지니, 위의 부품으로 거의 통일되어 있는것 같았습니다.
3. 도착
요로코롬 도착했습니다.
부품 확대 사진입니다.
메인 chip 에 DS321 이라고 적혀 있네요.
발진기인 오실레이터도 보이고, 밑에는 AT24C32 EEPROM (32Kb) 도 있습니다.
참고로 DS3231 칩 안에는 추가로 온도센서도 존재합니다.
- Data sheet : DS3232.pdf
특이하게 "왜 온도센서?" 냐 하면,
전자 발진기 - 오실레이터 - 는 온도에 따라 그 값이 변합니다.
그래서 온도에 따른 변화를 보정하기 위해 온도센서가 자리잡고 있는 것이지요.
뒷면에는 CR2032 버튼 전지를 끼울 수 있는 플라스틱이 존재합니다.
이는 전원이 차단되더라도 "시간을 기억" 하기고 있기 위한 것이지요.
이 건전지 한개로 몇년은 쓴다고 하네요.
4. Layout
배선은 일반 IIC 배선과 동일합니다.
SLA 은 A4에, SCL은 A5 이죠.
DS3231 | Arduino Nano ------------------------- VCC | 3.3V GND | GND SDC | A5 SDA | A4 ------------------------- SSD1306 | Arduino Nano ------------------------- VCC | 3.3V GND | GND SDC | A5 SDA | A4 -------------------------
실재 배선 모양입니다.
I2C의 특성상, 다른 센서 / 부품들 중, I2C 방식이면 arduino 의 동일한 pin 에 꼽아도 따로 인식 됩니다.
이는 각 device 가 가지는 address 가 다르기 때문이지요.
이는 I2C Scanner 를 이용해서 살펴보면, 각각 따로 인식하는 것을 알 수 있습니다.
아래에서 0x3c 는 OLED 이고, 0x68 이 DS3231 입니다.
추가로 나오는 0x57 은 AT24C32 EEPROM 입니다.
여기서 이상한 점은 0x5f 라는 address 입니다.
무얼까... 답을 찾지는 못했지만, 찾는 와중에 한가지 새로운 사실을 알게 됩니다.
5. EEPROM
EEPROM 으로는 ATmega 사의 AT24C32 이 쓰입니다.
이것의 실제 chip 번호는 ATML332 라고 적혀 있습니다.
- https://www.kynix.com/Detail/447536/ATMLH745.html
그렇습니다. EEPROM 이 original 이 아니고 fake 제품인 것이죠.
그러나 제품 구동은 정상적으로 돌아갑니다.
100% original chip 과 동일하지 않기 때문에 보다 복잡한 작업을 시키면 정상적으로 동작하지 않을 지도 모릅니다.
여튼, 앞으로 싼 부품은 좀 걸러야 할지도 모르겠네요.
6. Library 등록
인터넷에 돌아다니는 source 를 등록해서 사용할 수 있지만,
IDE 에서 지원해주는 Library 등록 기능을 이용하여 Example source 를 등록해 봅니다.
우선 IDE 메뉴에서 "Sketch > Add File... > Manage Libraries..." 를 선택합니다.
이건 이제 매번 써먹는 방법이지요?
Libarry Manager 의 검색창에서 "ds3231" 을 쳐서 검색합니다.
그러면 여러가지 source 들이 나오는데, 왠만하면 제일 위에 나오는 것을 선택하면 됩니다.
아래 그림처럼 adafruit 에서 만든 library 이니, 쓸만 할껍니다.
이렇게 하면 IDE 메뉴의 "File > Examples > DS3231" 항목이 생기고 sample source 를 이용할 수 있습니다.
6. sketch - 시간 설정
인터넷에 돌아다니는 source 를 등록해서 사용할 수 있지만,
위에서처럼 Arduino IDE 의 Library Manager 를 통해서 얻은 소스를 활용해 봅니다.
일단 시간을 입력합니다.
소스에 보이듯이 Serial Monitor 에 "YYMMDDwHHMMSS" 를 넣고, 마지막에 "x" 를 붙이면 설정됩니다.
------------------------------------------------
YYMMDDwHHMMSS, with an 'x' at the end
------------------------------------------------
/* Sets the time and prints back time stamps for 5 seconds Based on DS3231_set.pde by Eric Ayars 4/11 Added printing back of time stamps and increased baud rate (to better synchronize computer and RTC) Andy Wickert 5/15/2011 */ #include "DS3231.h" #include "Wire.h" DS3231 Clock; byte Year; byte Month; byte Date; byte DoW; byte Hour; byte Minute; byte Second; bool Century=false; bool h12; bool PM; void GetDateStuff(byte& Year, byte& Month, byte& Day, byte& DoW, byte& Hour, byte& Minute, byte& Second) { // Call this if you notice something coming in on // the serial port. The stuff coming in should be in // the order YYMMDDwHHMMSS, with an 'x' at the end. boolean GotString = false; char InChar; byte Temp1, Temp2; char InString[20]; byte j=0; while (!GotString) { if (Serial.available()) { InChar = Serial.read(); InString[j] = InChar; j += 1; if (InChar == 'x') { GotString = true; } } } Serial.println(InString); // Read Year first Temp1 = (byte)InString[0] -48; Temp2 = (byte)InString[1] -48; Year = Temp1*10 + Temp2; // now month Temp1 = (byte)InString[2] -48; Temp2 = (byte)InString[3] -48; Month = Temp1*10 + Temp2; // now date Temp1 = (byte)InString[4] -48; Temp2 = (byte)InString[5] -48; Day = Temp1*10 + Temp2; // now Day of Week DoW = (byte)InString[6] - 48; // now Hour Temp1 = (byte)InString[7] -48; Temp2 = (byte)InString[8] -48; Hour = Temp1*10 + Temp2; // now Minute Temp1 = (byte)InString[9] -48; Temp2 = (byte)InString[10] -48; Minute = Temp1*10 + Temp2; // now Second Temp1 = (byte)InString[11] -48; Temp2 = (byte)InString[12] -48; Second = Temp1*10 + Temp2; } void setup() { // Start the serial port Serial.begin(57600); // Start the I2C interface Wire.begin(); } void loop() { // If something is coming in on the serial line, it's // a time correction so set the clock accordingly. if (Serial.available()) { GetDateStuff(Year, Month, Date, DoW, Hour, Minute, Second); Clock.setClockMode(false); // set to 24h //setClockMode(true); // set to 12h Clock.setYear(Year); Clock.setMonth(Month); Clock.setDate(Date); Clock.setDoW(DoW); Clock.setHour(Hour); Clock.setMinute(Minute); Clock.setSecond(Second); // Give time at next five seconds for (int i=0; i<5; i++){ delay(1000); Serial.print(Clock.getYear(), DEC); Serial.print("-"); Serial.print(Clock.getMonth(Century), DEC); Serial.print("-"); Serial.print(Clock.getDate(), DEC); Serial.print(" "); Serial.print(Clock.getHour(h12, PM), DEC); //24-hr Serial.print(":"); Serial.print(Clock.getMinute(), DEC); Serial.print(":"); Serial.println(Clock.getSecond(), DEC); } } delay(1000); }
시각을 입력하니 잘 등록되고 읽어집니다.
7. sketch - 시간 설정 + 시간 가져오기 + 온도
기본 sample 을 사용해도 되지만, 찾아다니면서 하나로 된 소스는 아래인것 같습니다.
Serial Monitor 의 입력창에 "T1124154091014" 등으로 입력하면 시각이 입력되면서,
그냥 와두면, "시간 + 온도" 를 표시해 준다.
* Tutorial – Using DS1307 and DS3231 Real-time Clock Modules with Arduino
#include "Wire.h" #define DS3231_I2C_ADDRESS 104 // SCL - pin A5 // SDA - pin A4 // To set the clock, run the sketch and use the serial monitor. // Enter T1124154091014; the code will read this and set the clock. See the code for full details. byte seconds, minutes, hours, day, date, month, year; char weekDay[4]; byte tMSB, tLSB; float temp3231; void setup() { Wire.begin(); Serial.begin(9600); } void loop() { watchConsole(); get3231Date(); Serial.print(weekDay); Serial.print(", "); Serial.print(date, DEC); Serial.print("/"); Serial.print(month, DEC); Serial.print("/"); Serial.print(year, DEC); Serial.print(" - "); Serial.print(hours, DEC); Serial.print(":"); Serial.print(minutes, DEC); Serial.print(":"); Serial.print(seconds, DEC); Serial.print(" - Temp: "); Serial.println(get3231Temp()); delay(1000); } // Convert normal decimal numbers to binary coded decimal byte decToBcd(byte val) { return ( (val/10*16) + (val%10) ); } void watchConsole() { if (Serial.available()) { // Look for char in serial queue and process if found if (Serial.read() == 84) { //If command = "T" Set Date set3231Date(); get3231Date(); Serial.println(" "); } } } void set3231Date() { //T(sec)(min)(hour)(dayOfWeek)(dayOfMonth)(month)(year) //T(00-59)(00-59)(00-23)(1-7)(01-31)(01-12)(00-99) //Example: 02-Feb-09 @ 19:57:11 for the 3rd day of the week -> T1157193020209 // T1124154091014 seconds = (byte) ((Serial.read() - 48) * 10 + (Serial.read() - 48)); // Use of (byte) type casting and ascii math to achieve result. minutes = (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48)); hours = (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48)); day = (byte) (Serial.read() - 48); date = (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48)); month = (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48)); year = (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48)); Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0x00); Wire.write(decToBcd(seconds)); Wire.write(decToBcd(minutes)); Wire.write(decToBcd(hours)); Wire.write(decToBcd(day)); Wire.write(decToBcd(date)); Wire.write(decToBcd(month)); Wire.write(decToBcd(year)); Wire.endTransmission(); } void get3231Date() { // send request to receive data starting at register 0 Wire.beginTransmission(DS3231_I2C_ADDRESS); // 104 is DS3231 device address Wire.write(0x00); // start at register 0 Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 7); // request seven bytes if(Wire.available()) { seconds = Wire.read(); // get seconds minutes = Wire.read(); // get minutes hours = Wire.read(); // get hours day = Wire.read(); date = Wire.read(); month = Wire.read(); //temp month year = Wire.read(); seconds = (((seconds & B11110000)>>4)*10 + (seconds & B00001111)); // convert BCD to decimal minutes = (((minutes & B11110000)>>4)*10 + (minutes & B00001111)); // convert BCD to decimal hours = (((hours & B00110000)>>4)*10 + (hours & B00001111)); // convert BCD to decimal (assume 24 hour mode) day = (day & B00000111); // 1-7 date = (((date & B00110000)>>4)*10 + (date & B00001111)); // 1-31 month = (((month & B00010000)>>4)*10 + (month & B00001111)); //msb7 is century overflow year = (((year & B11110000)>>4)*10 + (year & B00001111)); } else { //oh noes, no data! } switch (day) { case 1: strcpy(weekDay, "Sun"); break; case 2: strcpy(weekDay, "Mon"); break; case 3: strcpy(weekDay, "Tue"); break; case 4: strcpy(weekDay, "Wed"); break; case 5: strcpy(weekDay, "Thu"); break; case 6: strcpy(weekDay, "Fri"); break; case 7: strcpy(weekDay, "Sat"); break; } } float get3231Temp() { //temp registers (11h-12h) get updated automatically every 64s Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0x11); Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 2); if(Wire.available()) { tMSB = Wire.read(); //2's complement int portion tLSB = Wire.read(); //fraction portion temp3231 = (tMSB & B01111111); //do 2's math on Tmsb temp3231 += ( (tLSB >> 6) * 0.25 ); //only care about bits 7 & 8 } else { //oh noes, no data! } return temp3231; }
Serial Monitor 의 결과 입니다.
8. sketch - 시간 설정 + 시간 가져오기 + 온도 + OLED
위의 소스를 조금 바꾸어 OLED 에 표시해주는 소스로 살짝 바꾸었습니다.
일주일 지난 뒤, 측정하니 여전히 잘 동작하고 있네요.
살짝 바꾼 소스 올려 봅니다.
#include "SPI.h" #include "Wire.h" #include "Adafruit_GFX.h" #include "Adafruit_SSD1306.h" Adafruit_SSD1306 display = Adafruit_SSD1306(); #define DS3231_I2C_ADDRESS 104 // SCL - pin A5 // SDA - pin A4 // To set the clock, run the sketch and use the serial monitor. // Enter T1124154091014; the code will read this and set the clock. See the code for full details. byte seconds, minutes, hours, day, date, month, year; char weekDay[4]; byte tMSB, tLSB; float temp3231; void setup() { Serial.begin(9600); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 128x32) display.clearDisplay(); display.display(); delay(1000); Wire.begin(); } void loop() { watchConsole(); get3231Date(); display.clearDisplay(); display.setTextColor(WHITE); display.setCursor(0,0); display.setTextSize(1); display.print("DATE : "); display.print(weekDay); display.print(", "); display.print(date, DEC); display.print("/"); display.print(month, DEC); display.print("/"); display.println(year, DEC); display.print("TIME : "); display.print(hours, DEC); display.print(":"); display.print(minutes, DEC); display.print(":"); display.println(seconds, DEC); display.print("TEMP : "); display.println(get3231Temp()); display.display(); delay(1000); } // Convert normal decimal numbers to binary coded decimal byte decToBcd(byte val) { return ( (val/10*16) + (val%10) ); } void watchConsole() { if (Serial.available()) { // Look for char in serial queue and process if found if (Serial.read() == 84) { //If command = "T" Set Date set3231Date(); get3231Date(); Serial.println(" "); } } } void set3231Date() { //T(sec)(min)(hour)(dayOfWeek)(dayOfMonth)(month)(year) //T(00-59)(00-59)(00-23)(1-7)(01-31)(01-12)(00-99) //Example: 02-Feb-09 @ 19:57:11 for the 3rd day of the week -> T1157193020209 // T1124154091014 seconds = (byte) ((Serial.read() - 48) * 10 + (Serial.read() - 48)); // Use of (byte) type casting and ascii math to achieve result. minutes = (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48)); hours = (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48)); day = (byte) (Serial.read() - 48); date = (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48)); month = (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48)); year = (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48)); Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0x00); Wire.write(decToBcd(seconds)); Wire.write(decToBcd(minutes)); Wire.write(decToBcd(hours)); Wire.write(decToBcd(day)); Wire.write(decToBcd(date)); Wire.write(decToBcd(month)); Wire.write(decToBcd(year)); Wire.endTransmission(); } void get3231Date() { // send request to receive data starting at register 0 Wire.beginTransmission(DS3231_I2C_ADDRESS); // 104 is DS3231 device address Wire.write(0x00); // start at register 0 Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 7); // request seven bytes if(Wire.available()) { seconds = Wire.read(); // get seconds minutes = Wire.read(); // get minutes hours = Wire.read(); // get hours day = Wire.read(); date = Wire.read(); month = Wire.read(); //temp month year = Wire.read(); seconds = (((seconds & B11110000)>>4)*10 + (seconds & B00001111)); // convert BCD to decimal minutes = (((minutes & B11110000)>>4)*10 + (minutes & B00001111)); // convert BCD to decimal hours = (((hours & B00110000)>>4)*10 + (hours & B00001111)); // convert BCD to decimal (assume 24 hour mode) day = (day & B00000111); // 1-7 date = (((date & B00110000)>>4)*10 + (date & B00001111)); // 1-31 month = (((month & B00010000)>>4)*10 + (month & B00001111)); //msb7 is century overflow year = (((year & B11110000)>>4)*10 + (year & B00001111)); } else { //oh noes, no data! } switch (day) { case 1: strcpy(weekDay, "Sun"); break; case 2: strcpy(weekDay, "Mon"); break; case 3: strcpy(weekDay, "Tue"); break; case 4: strcpy(weekDay, "Wed"); break; case 5: strcpy(weekDay, "Thu"); break; case 6: strcpy(weekDay, "Fri"); break; case 7: strcpy(weekDay, "Sat"); break; } } float get3231Temp() { //temp registers (11h-12h) get updated automatically every 64s Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0x11); Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 2); if(Wire.available()) { tMSB = Wire.read(); //2's complement int portion tLSB = Wire.read(); //fraction portion temp3231 = (tMSB & B01111111); //do 2's math on Tmsb temp3231 += ( (tLSB >> 6) * 0.25 ); //only care about bits 7 & 8 } else { //oh noes, no data! } return temp3231; }
동영상도 올려 봅니다.
FIN
DS3231 에 대해서는 이야기 할 내용이 더 있어서 2편에서 더 다루어 보겠습니다.
'Hardware' 카테고리의 다른 글
Hardware | MAX30105 파티클 센서 - 1 (0) | 2018.11.23 |
---|---|
Hardware | RTC DS3231 부품 사용기 - 2 (0) | 2018.11.20 |
Hardware | Transistor 구매 (0) | 2018.11.10 |
Hardware | 스위치 부품 구매하기 (0) | 2018.11.09 |
Hardware | ipTIME N704BCM 무선 공유기 (2) | 2018.11.06 |