'오실레이터'에 해당되는 글 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. 2019.10.25 Hardware | Arduino 를 DIY 해보자 - 3
  5. 2019.08.26 Hardware | 555 chip 알아보기 - 1
  6. 2018.11.11 Hardware | RTC DS3231 부품 사용기 - 1 2

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 | Arduino 를 DIY 해보자 - 3

|

이 글은 아래 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 파일을 참고하였습니다.


* 보드프리

BL-381(BOM).pdf

BL-381(duemilanove).pdf

* 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

https://www.aliexpress.com/item/Single-row-female-2-54mm-Pitch-PCB-Female-Pin-Header-Connector-Straight-Single-Row-2-3/32838866439.html



도착은 주문한데로 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

https://www.aliexpress.com/item/20PCS-LOT-1812-SMD-SMD-self-healing-fuse-0-5A-500mA-15V-MF-MSMF050-2/32842202101.html



무리없이 도착.



수령한 제품은 웹사이트에서 본 사진과는 다르지만, 한번 믿고 써보기로 합니다.





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

https://www.aliexpress.com/item/hc-49s-Crystal-Oscillator-electronic-Kit-resonator-ceramic-quartz-resonator-hc-49-DIP-7-kinds-X/32844442076.html



필요한건 16 Mhz 이지만, 낱개로 파는 경우는 없어서 세트로 구매합니다.



요로코롬 생겼네요.






5. LED


아래 링크의 제품을 구매하면 필요한 색깔이 모두 들어 있습니다.

* 100pcs=5colors x 20pcs 5050 5730 1210 1206 0805 0603 LED Diode Assortment SMD LED Diode Kit Green/ RED / White / Blue / Yellow




이왕이면 한꺼번에 받기위해 한 업체에 몇가지를 같이 주문하였습니다.



왠지 LED 부품은 받을때마다 기분이 좋습니다.






6. Capacitor


Capacitor 는 세라믹과 둥그런 알루미늄 캡 캐패시터 두가지를 사용합니다.


* MCIGICM 100pcs 0805 smd capacitor ceramic 22pf 100nf 1uf 2.2uf 4.7uf 10uf 47uf 22uf capacitors kit sets 0.5pF-47uF


부품이 많다 보니, 10uF 은 빼고 처음 주문을 넣어버려, 다른거 주분할 때 같이 주문했습니다.



0805 SMD 버전이라 100개씩 묶음이라고 해도 배송 용량이 적네요.



알루미늄 캡 캐패시터는 LED 구입한 업체에서 같이 구입해서 이미 도착했습니다.


* Free Shipping 20pcs SMD 50V 35V 25V 16V 10V 100UF 220UF 47UF 33UF 22UF 10UF 4.7UF 2.2UF 1UF Aluminum Electrolytic Capacitor


100uF 35V 버전입니다. 사양서에는 25V로 정의되어 있으나, 보다 더 넓은 영역에서 동작할 수 있는 35V 를 구매.
여러 사이트를 뒤져봐도 캐패시터 용량 큰거는 문제 없다고 합니다.





7. Resistor


저항은 1K 와 10K 두가지가 필요합니다.


* 20Value * 20PCS =400PCS 0805 SMD Resistor Kit 1% 1/8W (10 ohm~1M ohm) component diy samples kit free shipping


위의 세트구성은 다음과 같습니다.

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

https://www.aliexpress.com/item/5-0805-SMD-resistor-pack-80-kinds-of-commonly-used-precision-resistor-for-each-25-Total/32297723532.html



위의 세트구성은 다음과 같습니다.


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


이전 Wi-Fi 모듈을 firmware upgrade 하기 위해 구입한 tactile switch 에 포함되어 있어,
이번에 추가로 구입하지 않았습니다.

* Hardware | 스위치 부품 구매하기


* Smart Electronics 10 Kinds of Tactile Switches Push Button SMD Tact Switch Switch 100pcs


도착한 PCB 에 필요한 부품은 through hole 부품이네요.
SMD 부품도 같이 있어서 필요시에는 SMD 버전을 사용해도 될 것 같습니다.




9. Diode


M7 은 1N4007 이라는 diode 의 별칭인 것이라는 것을 처음 알았습니다.

* 7 kinds*10pcs=70pcs/lot SMD diode package / M1 (1N4001) / M4 (1N4004) / M7 (1N4007)/ SS14 US1M RS1M SS34 KIT



LED 도착시 같이 왔습니다. 생각보다 이것도 크기가 꽤 작네요.






10. FT232RL


USB 통신을 위한 controller 입니다.

ATmega328P 는 CPU 자체에 USB 컨트롤러 부분이 없어서 이렇게 추가 USB controller chip 이 필요합니다.


참고로, Arduino Micro 에 사용되는 ATmega32U4 는 내장 USB controller 가 있어,

이렇게 추가 USB controller chip 이 필요 없습니다.


* 5pcs/lot New FT232RL FT232 FTDI USB FS SERIAL UART SSOP28 serial chips imported original In Stock


이제야 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

https://www.aliexpress.com/item/Free-shipping-5pcs-lot-MC33269DT-5-0G-5V-8A-MC33269DT-5-33269DT-MC33269DT-33269DT-MC33269-MC33269DT/32826048602.html



배송 포장 표기는 Cable Tools... 무엇?



전압/전류 관련 부품이다 보니, 다른 부품들보다 크기가 큽니다.






12. DC power jack plug socket

일전에 Transistor Tester 를 DIY 할 때, power jack 의 안쪽 심 두께가 달라서 기존 adapter 들을 사용 못하는 상황이 있었습니다.
결국 맞는 사양으로 이식했고, 그 뒤로 내경이 2.1mm 용으로만 통일하고 있습니다.

다행히 Duemilanove 스펙에도 5.5/2.1mm 사양으로 되어 있네요.

* 10Pcs PCB Mount 5.5 x 2.1 mm Female DC Power Black Jack Plug Socket Connector G08 Drop ship


잘 도착했구요.


내경도 2.1mm 인듯 하구요.


기존 DC adapter 에도 잘 맞습니다.



PCB 에도 맞춰 보니 문제 없네요.






13. ATmega328P

드디어! main chip 인 ATmega328P 입니다.

* 1PCS ATMEGA328P-PU DIP28 ATMEGA328-PU DIP ATMEGA328P U DIP-28 328P-PU new and original IC



중요 부품이지만, 그런거 없습니다. 여타 부품처럼 평이하게 도착했습니다.



선명하게 CPU 마킹이 되어 있습니다. Socket 이랑 같이 찍어봤습니다. 이쁘다...






14. DIP28 Socket

ATmega328P 을 얹일 DIP28 socket 입니다.

* 5pcs DIP-28 Round Hole 28 Pins 2.54MM DIP DIP28 IC Sockets Adaptor Solder Type 28 PIN 2.54 IC Connector

https://www.aliexpress.com/item/10pcs-Round-Hole-28-Pins-2-54MM-DIP-IC-Sockets-Adaptor-Solder-Type-28-PIN-2/32799885322.html




구멍이 round hole 과 lead 방식이 있습니다.

자주 chip 을 뺏다 꼈다 할 경우에 round hole 이 장점이 있고, lead 방식은 오랜동안 그냥 놔둘 경우 좋다고 합니다.


사실 lead 방식이 접점이 확실합니다.

다만, 이왕 하는 김에 고급지게 해보고자 round hole 타입을 구매해 봤습니다.

round hole 은 금속 다리 부분이 주조 방식으로 제작되므로 좀더 비쌉니다. 그리고 점점도 나쁘지 않아요.



PCB 에 잠깐 얹어 봤습니다. 아주 부드럽게 잘 맞습니다.






15. SOP8 OP AMP

다리가 8개인 OP AMP 입니다.


* 50PCS LM358DR SOP8 LM358 SOP LM358DT SOP-8 SMD LM358DR2G new and original IC

https://www.aliexpress.com/item/10PCS-LM358DR-SOP8-LM358-SOP-LM358DT-SMD-LM358DR2G-new-and-original-IC-free-shipping/32533323519.html



ATmega328P 과 함께 도착한 부품입니다.






16. SOT-23 MOSFET

Transistor 의 digital 버전이라고 불릴 수 있는 MOSFET 입니다.


* HMICICAWK Original 100% NEW 2955 NDT2955 SOT-223 10PCS/LOT

- https://www.aliexpress.com/item/NDT2955-DT2955-T2955-2955-SOT-223-Original-100-NEW-10PCS-LOT/32734398979.html



씌여진 문구에 SOT-223 이라고 되어 있습니다만, 배송된 것은 DPAK 버전으로 큰게 왔습니다.



크고 좋아보입니다만 보드에 맞질 않습니다.



Dispute 환불을 걸고 다른 업자에게 주문했더니만, SOT-233 버전을 또 보냈더랬습니다.



마킹이 조금 이상합니다만 문제 없겠죠?



다시 보낸다는 이야기가 없어, 다른 판매자에게 이미 주문을 또 했더랬습니다.


* BQ24040DSQR AP3608EG-G1 SN74LVC2G66DCTR NDT2955 MMFT2955 NTF2955 SP202EEN IR2153S STP100N8F6 MBR40100CT TPS60400DBVR D15XB80

https://www.aliexpress.com/item/BQ24040DSQR-AP3608EG-G1-SN74LVC2G66DCTR-NDT2955-MMFT2955-NTF2955-SP202EEN-IR2153S-STP100N8F6-MBR40100CT-TPS60400DBVR-D15XB80/32908941557.html



SOT-233 버전의 MOSFET 이 또 왔어!



이놈은 마킹이 프린팅 되어 있네요.






16. 실장

모든 부분이 준비되었고, SMD 실장을 위한 Flux Paste 와 오븐이 구비되었으니, 작업을 시작합니다.
(대략 준비기간 1년.... 눈물)



대략 실장될 부품을을 위치 시켜보구요.



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 가 생겨, 다양한 프로젝트를 동시에 할 수 있는 여유가 생겼습니다.


And

Hardware | 555 chip 알아보기 - 1

|

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


뭐, 시작이 어찌 되었 건, 555 chip 을 접할 수 있는 계기가 되었으니 즐겁게 구매를 진행해 봅니다.

*  MCIGICM 20pcs , (10 each) NE555 IC 555 & 8 Pin DIP Sockets

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



도착은 아래와 같습니다.



도착샷을 올리는 것은, 포스트 내용을 길게 빼기 위해서 항상 빠질 수 없는 짓 입니다.



원하는 4x4 DIP 소켓을 얻게 되었구요.



NE555 chip 이 부차적으로(?) 딸려 왔습니다. :-D



사양 문서는 아래 올려 놨습니다.

lm555.pdf





3. 기본 원리


555 에 대해서 동영상과 설명이 가장 잘 되어 있는 사이트는 아래와 같습니다.


* 555 Timer IC – Working Principle, Block Diagram, Circuit Schematics

https://howtomechatronics.com/how-it-works/electronics/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 회로를 꾸며 봤습니다.


아래 사이트를 전적으로 참고하였습니다.


* Introducing 555 Timer IC – Tutorial

연결 회로는 다음과 같습니다.


실제 전자 부품이 연결된 모양은 다음과 같습니다.



무난하게 잘 동작했습니다.

아쉬우니 동영상으로도 남겨 봅니다.






FIN


555 chip 을 알기 위해선 flip-flop 도 이해해야 하고, Op-amp 를 이용한 comparator 도 이해 해야 하고,

대학교 수업 때, 무식하게 외웠던 내용들을 이 나이 되어서야 logic 적으로 이해할 수 있는 계기가 되는 실험이었습니다.


이제 기초적인 내용을 정리해 봤으니,

앞으로는 실생활에 여전히 많이 쓰이는 555 에 대하여, 시간 날 때마다 하나씩 실험해 보겠습니다.


마지막으로, 555 에 대해 나름 유명한 cookbook 들이 있어 PDF 파일을 올려 놓습니다.


Forrest Mims - 555 Timer IC Circuits.pdf


ICTimerCookbook1stEd1977_WalterGJung.zip.001

ICTimerCookbook1stEd1977_WalterGJung.zip.002


50-555Circuits.pdf


555_basics.zip.001

555_basics.zip.002



And

Hardware | RTC DS3231 부품 사용기 - 1

|

이 포스트는 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

https://www.aliexpress.com/item/1PCS-DS3231-AT24C32-IIC-Precision-RTC-Real-Time-Clock-Memory-Module-For-Arduino-new-original/32830730519.html



건전지 미포함 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 라고 적혀 있습니다.


24C32-Datasheet.pdf



그런데 제가 가지고 있는 DS3231 의 EEPROM 부분은 다음과 같습니다.



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

https://tronixstuff.com/2014/12/01/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편에서 더 다루어 보겠습니다.


And
prev | 1 | next