'연결'에 해당되는 글 1건
- 2019.08.14 Hardware | ESP-01 or ESP8266 사용기 - 5 2
이번 글을 읽기에 앞서, ESP8266 에 관하여 몇 차례에 걸쳐 다뤄 왔습니다.
ESP8266 을 활용하기 위해서는 여러 지식과 경험이 바탕이 되어야 추가적인 내용을 충분히 이해할 수 있습니다.
시간이 허락되신다면, 먼저 아래 포스팅 들을 참고해 주세요.
* Hardware | ESP-01 or ESP8266 사용기 - 1
- https://chocoball.tistory.com/entry/Hardware-ESP01-or-ESP8266-using-1
* Hardware | ESP-01 or ESP8266 사용기 - 2
- https://chocoball.tistory.com/entry/Hardware-ESP01-or-ESP8266-using-2
* Hardware | ESP-01 or ESP8266 사용기 - 3
- https://chocoball.tistory.com/entry/Hardware-ESP01-or-ESP8266-using-3
* Hardware | ESP-01 or ESP8266 사용기 - 4
- https://chocoball.tistory.com/entry/Hardware-ESP01-or-ESP8266-using-4
또한, 이 포스트에서 가장 많이 참고한 사이트는 여기 입니다.
* Using ESP8266 SPIFFS
- https://www.instructables.com/id/Using-ESP8266-SPIFFS/
1. SPIFFS
SPI Flash File System 의 약자로서,
ESP8266 등에 장착된 Flash memory chip 의 여유공간에 파일을 쓰기/읽기/삭제 등을 할 수 있게 해주는 기능입니다.
* ESP8266 Arduino Core
- https://arduino-esp8266.readthedocs.io/en/latest/filesystem.html
1 2 3 |
|--------------|-------|---------------|--|--|--|--|--| ^ ^ ^ ^ ^ Sketch OTA update File system EEPROM WiFi config (SDK) |
단, 일판 file system 처럼 directory 구조처럼 하위 폴더 개념이 없고, 1차원적으로 모든 파일을 한곳에 넣어서 사용해야 합니다.
궁극적인 목적으로는,
- ESP8266 등에 장착된 controller 가, 시간과 로드가 많이 걸리는 외부 저장장치에 접근하지 않고, 내부적으로 처리하기 위한 방법
- 파일이 자주 변하지 않으며, 주로 읽혀지는 파일
- 여타 파일 시스템 처럼 bad block 등의 검사나, 마킹을 할 수 없음
- HTML, CSS, JS 파일들을 올려놓고 ESP8266 에서 web server 를 돌릴 수 있슴
2. Arduino IDE 에서 환경 설정
파일을 올리는 툴은 Arduino IDE 에서 하게 되므로, SPIFFS 를 사용할 수 있도록 Arduino IDE 를 설정해야 합니다.
우선 Arduino IDE 에서 SPIFFS 메뉴를 활성화 시키기 위해 아래 순서대로 진행합니다.
A. Plug-In 인스톨
아래 사이트에서 최신 파일을 받습니다.
* esp8266/arduino-esp8266fs-plugin
- https://github.com/esp8266/arduino-esp8266fs-plugin/
* Latest version of ESP8266 Arduino
- https://github.com/esp8266/arduino-esp8266fs-plugin/releases/tag/0.4.0
혹시 모르니, 필요한 파일을 받아서 올렸습니다.
B. 파일을 설치
Arduino IDE 에서 설정된 sketch 폴더에 tools 라는 directory 를 만들어 서 그 안에 위의 파일을 해동하여 넣습니다.
sketch 폴더는 환경마다 다르므로, 현재 쓰고 있는 환경에서 sketch 폴더가 어디인지는 Preference 에서 확인 가능합니다.
C. 설치 완료 확인
설치 후, Arduino IDE 를 재시작 하여 Tools 메뉴에 가 보면,
아래 Before/After 처럼, 새롭게 "ESP8266 Sketch Data Upload" 매뉴가 활성화 된 것을 확인 할 수 있습니다.
Before
After
3. ESP8266 의 용량 확인
파일을 업로드 하기 전, ESP8266 에 달려 있는 Flash memory 의 용량을 확인해 봅니다.
사실 대략 알고 있다면 이 부분은 건너 뛰어도 됩니다.
우선 ESP8266 보드를 Arduino IDE 에서 직접 access 할 수 있도록, 보드를 등록해 봅니다.
보드 등록을 위한 관련 파일을 다운로드 받아 설치하려면, 아래 설정처럼 Preference 에 해당 정보가 등록되어 있어야 합니다.
File > Preference
1 |
|
아래처럼 등록하면 됩니다.
예전에 Digispark 를 DIY 한 흔적이 있네요. 다른 URL이 이미 있다면, 다음 줄에 등록하면 됩니다.
그럼, 아래 메뉴에서 ESP8266 보드 관련 파일을 설치할 수 있게 됩니다.
Tools > Board > Boards Manager
Boards Manager 에서 esp8266 으로 검색하여, 설치되어 있지 않으면 설치해 줍니다.
여기까지 왔다면, Board 메뉴에서 Generic ESP8266 Module 을 선택할 수 있게 됩니다.
특별히 할 설정은 없슴니다만, SPIFFS 를 2M 사용한다고 설정 했습니다.
다른 설정은 잘 모르겠네요.
이제 Flash memory 확인용 sketch 를 선택합니다.
File > Examples > ESP8266 > CheckFlashConfig
실제 소스는 다음과 같습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
/* 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); } |
!!주의!!
ESP8266 의 Flash memory 에 writing 하기 위해서는 아래 순서에 맞게 해야 합니다.
1. RST 의 스위치를 누른다.
2. FLASH 의 스위치를 누른다.
3. RST 의 스위치에서 손을 뗀다.
4. FLASH 의 스위치에서 손을 뗀다.
5. Flash program 에서 "시작" 을 누른다.
위의 구성처럼, 꼭 외부 전원으로 ESP8266 을 구동시키는 것과,
PC 와 Serial 연결 위한 FTDI 나 CP2102 의 GND 를, 외부전원의 GND 와 서로 연결해 주는 것을 빼먹으면 안됩니다. (동기)
FTDI 는 Serial 통신만을 위한 것이지, ESP8266 의 전원까지 공급하게 하면, 매우 높은 확률로 실패합니다.
컴파일된 sketch 가 잘 밀어들어가고 있고요.
문제 없이 끝났습니다.
Hard resetting via RTS pin... 이라고 나오고, 그 뒤 반응에 대한 내용은 나오지 않습니다.
Serial Monitor 로 확인해 보면, 올라간 sketch 가 잘 구동되는 것을 확인할 수 있습니다.
원래 1MB 였던 Flash memory 가 4MB 로 변경된 것이 확인 됩니다.
4. SPIFFS upload
이제 아까 Plug-in 을 이용해 구현했던 "ESP8266 Sketch Data Upload" 기능을 이용하여 실재로 data upload 를 해 봅니다.
sketch 폴더에 "data" 폴더를 만들고, 거기에 파일을 놔두면, 그 파일이 자동으로 upload 된다고 합니다.
으잉? 빈 깡통이라고 그러네요?
이미 위에서 알고 있는 sketch folder 와 또 다른 곳을 이야기 하는 듯 합니다.
IDE 메뉴의 "Show Sketch Folder" 를 이용하여 어디를 이야기 하는지 확인해 봅니다.
Sketch > Show Sketch Folder
Sketch 폴더가 여기였어? 이 SPIFFS 업로드용 sketch 폴더는 Temp 폴더로 잡혀있나 보네요.
data 폴더를 만들어 주고 업로드 하고 싶은 파일을 심어 놓습니다.
드디어 이 메뉴를 눌러 봅니다.
"SPIFFS Uploading Image..." 라고 뜨면서 막 뭐를 밀어 넣는 것 같습니다.
"SPIFFS Image Uploaded" 라고 뜨면서, "Hash of data verification" 까지 실행하고 끝납니다.
텍스트 파일이라서 그런지 data 압축도 자동으로 되는 것 같습니다.
Data upload 영역과 기존 firmware 영역이 잘 분리되어 있는지, 전원을 리셋하여 command 를 날려 봅니다.
기존 Wi-Fi firmware 영역은 완벽히 구분되어 잘 보존되어 있네요.
아래 그림에서 보이듯, SPIFFS 가 사용하는 File System 영역과 Program 영역이 분리되어 있는지 확인해 본 것입니다.
5. Upload 된 파일 확인
그럼 upload 되어 있는 파일이 진짜 내가 올린 파일인지 확인해 볼까요?
이 글, 맨 처음에 참조한 사이트에서 text 파일 확인용 소스가 있습니다. 그대로 활용해 봅니다. (Steve 고마워요~)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
/* Steve Quinn 06/03/17 Copyright 2017 Steve Quinn This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http: www.gnu.org="" licenses="">. Written to accompany the following Instructable; 'Using ESP8266 SPIFFS' Compiled using Arduino 1.6.9 */ #include "string.h" #include "FS.h" bool spiffsActive = false ; #define TESTFILE "/esp8266_SPIFFS.txt" void setup() { Serial.begin(115200); delay(1000); // Start filing subsystem if (SPIFFS.begin()) { Serial.println( "SPIFFS Active" ); Serial.println(); spiffsActive = true ; } else { Serial.println( "Unable to activate SPIFFS" ); } delay(2000); } void loop() { if (spiffsActive) { if (SPIFFS.exists(TESTFILE)) { File f = SPIFFS.open(TESTFILE, "r" ); if (!f) { Serial.print( "Unable To Open '" ); Serial.print(TESTFILE); Serial.println( "' for Reading" ); Serial.println(); } else { String s; Serial.print( "Contents of file '" ); Serial.print(TESTFILE); Serial.println( "'" ); Serial.println(); while (f.position() < f.size()) { s=f.readStringUntil( '\n' ); s.trim(); Serial.println(s); } f.close(); } Serial.println(); f = SPIFFS.open(TESTFILE, "a" ); if (!f) { Serial.print( "Unable To Open '" ); Serial.print(TESTFILE); Serial.println( "' for Appending" ); Serial.println(); } else { Serial.print( "Appending line to file '" ); Serial.print(TESTFILE); Serial.println( "'" ); Serial.println(); f.println( "This line has been appended" ); f.close(); } f = SPIFFS.open(TESTFILE, "r" ); if (!f) { Serial.print( "Unable To Open '" ); Serial.print(TESTFILE); Serial.println( "' for Reading" ); Serial.println(); } else { String s; Serial.print( "Contents of file '" ); Serial.print(TESTFILE); Serial.println( "' after append" ); Serial.println(); while (f.position() < f.size()) { s=f.readStringUntil( '\n' ); s.trim(); Serial.println(s); } f.close(); } } else { Serial.print( "Unable To Find " ); Serial.println(TESTFILE); Serial.println(); } } while ( true ) { yield(); } } </http:> |
프로그램 영역에 올려야 구동되므로, IDE 에서 일반 sketch upload 로 밀어 넣습니다.
프로그램이 올라가면 Serial Monitor 를 통해 확인해 봅니다.
제가 작성했던 text 파일이 잘 읽혀지네요. 신기~!
한글 및 ASCII 코드도 잘 읽혀서 변환되었습니다. (OS 가 한글이기도 하고, 파일 인코딩을 UTF-8 로 지정함)
이 소스는 Flash memory 에서 SPIFFS 를 사용하여,
일반 file system 의 IO 처럼, 추가 쓰기가 가능하다는 것을 보여주기 위해 append 기능이 부여되어 있습니다.
이 과정을 통해 기존 firmware 위에 확인용 sketch 가 overwrite 되었으므로,
다시 Wi-Fi firmware 를 입혀주고, 그렇게 해도 여전히 data 영역이 그래도 보존되는지 확인해 봅니다.
그 다음, 다시 위의 소스 sketch 를 입히고 실행시켜 보니, 아래와 같이 한줄 더 추가 되었습니다.
즉, data 영역은 프로그램 용 sketch 나, Wi-Fi firmware 와는 완전 분리된 상태로 관리 되고 있다는 것을 알 수 있습니다.
FIN
ESP8266 에 대해서 5회에 걸쳐 살펴봤습니다.
대략적인 사용법 - 개념, 환경 구성, Flash memory 사용법 - 은 훑어 본것 같습니다.
ESP8266 의 진정한 활용은 무선으로 연결하여 IoT data 나, 실시간 연결을 통한 제어가 주 목적이 되겠습니다.
다음부터는 센서를 가지고 놀면서, IoT 적인 활용법을 익혀 보겠습니다.
'Hardware' 카테고리의 다른 글
Hardware | LED 전등 교환기 (0) | 2019.08.28 |
---|---|
Hardware | 555 chip 알아보기 - 1 (0) | 2019.08.26 |
Hardware | ZP07-MP901 공기질 측정 센서 (0) | 2019.08.13 |
Hardware | ADS1115 16bit 4채널 ADC 를 사용해 보자 (6) | 2019.08.12 |
Hardware | Digital Compass - HMC5883L 사용기 - 3 (0) | 2019.08.10 |