2017-09-28
md
Another ESP8266 NodeMCU Development Board

Lately, Banggood has been offering the Geekcreit® NodeMcu Lua ESP8266 ESP-12E WIFI Development Board at less than 5$ CDN. I purchased one to see if this board has an advantage over the WeMos D1 mini that is about half the size. As the pictures show, what I actually received was an ESP12F DEVKIT V3 by DOIT.

bottom view

top view

Table of contents

  1. Who Makes This Thing?
  2. ESP-12F vs ESP-12E
  3. What $5 Bought
  4. Moving from NodeMCU to Arduino
  5. Pin Map
  6. Extra GPIO Pins?
  7. Defective 5V VIN
  8. Miscellanea
  9. Conclusion

Who Makes This Thing toc

On the metal cover of the ESP module there is an FCC certification number, FCC ID 2AL3B-ESP-F, which can be used to confirm that DOIT created the ESP12F module found on the board. Enter the grantee code "2AL3B" and Product Code "-ESP-F" at the FCC ID Search page to see that the actual name of DOIT is ShenZhen Doctors of Intelligence & Technology Co., Ltd.

So presumably, the good doctors make the ESP8266 module soldered on top of the board. Indeed the module can be found among the offerings of the company on its chinese language web site www.doit.am (I am relying on Google translate, here). Presumably, it offered ESP-12E modules in the past but this is no longer the case.

DOIT has an "official" AliExpress store where it offers the board with the same Geekcreit label. There are another two online stores that offer the product, see the SmartArduino wiki.

ESP-12F vs ESP-12E toc

Of course, I was curious to know if there is there a significant difference between the ESP-12F and the ESP-12E WiFi modules. I found this on the SmartArduino site

Which is not all intelligible, at least as far as I am concerned.

The Electrodragon ESP-12F page also boasts of a new four-layer board design with an improved antenna that increases the WiFi range by 30% to 50%. No small feat if true in the field. The vendor confirms that this newer version is the same size and has the same pins as the previous version the ESP-12E. The page for the ESP-12E states that the latter is no longer available since replaced with the ESP-12F. The 12E had added extra pins: CS0, MISO, GPIO9, GPIO10, MOSI, SCLK (connected to the following pins on the development board: CMD, SD0, SD2, SD3, SD1 CLK). That is appealing: 2 extra GPIO pins!

The conclusion appears to be that there is no loss in receiving a development board based on the ESP-12F instead of the advertised ESP-12E. It may actually be a gain for the consumer.

What $5 Bought toc

DOIT sells the ESP-100 which it identifies as its version of the ESP-12F as found on the development board for $2.18 US (about $2.76 CDN). Electrodragon sells the ESP-12F module for $2.40 US (about $3.00 CDN at today's exchange rate). That means that whoever produces the development board (Geekcreit, or DOIT) adds a CH341G USB to TTL converter, an AMS1117 5V to 3.3V voltage regulator, two transistors, two tactile switches, a micro USB connector, an LED, numerous resistors and capacitors and mounts everything on a relatively small "motherboard" with two 15 pin male headers soldered in for an extra $2.00 to $2.60 CDN. From my point of view, there is really no good reason to purchase an ESP module by itself. The exceptions would be when there are space considerations and when powering the device with a battery or solar cell where the extra current used to power the USB to TTL converter and other unnecessary components could be a problem.

All that is needed to connect to the board with a Ubuntu desktop is a micro USB cable. Windows users may have to install a driver for the CH340G USB to serial adaptor. I did not test that, but I did verify that clicking on the link on the Banggood site does download a Windows application.

The board comes with NodeMCU firmware installed. I used miniterm.py to access the Lua interpreter and ascertained that the version of the firmware was 2.0.0:

michel@hp:~$ miniterm.py --- Available ports: --- 1: /dev/ttyUSB0 USB2.0-Serial --- Enter port index or full name: 1 --- Miniterm on /dev/ttyUSB0 9600,8,N,1 --- --- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H --- ��������������� > > o,␛[2~ stdin:1: unexpected symbol near 'char(27)' > print(node.info()) 2 0 0 3708327 1458376 4096 2 40000000

I connected to another board with the Arduino IDE serial monitor. Pressing the reset button of the NodeMCU, I got the following information.

Surprisingly boards purchased almost at the same time had different versions of the NodeMCU firmware: 1.5.4 and 2.0.0. It does not really matter because most users of NodeMCU firmware will modify it to add missing modules and to remove unneeded modules to meet their needs. I suspect the steps taken to do this with the Wemos D1 mini (the post was named Wemos D1 mini and NodeMCU), will work without change with this development kit.

Moving from NodeMCU to Arduino toc

I was more interested in using Arduino with this board. There are many sites that explain how to add ESP8266 based boards to the Arduino IDE including my own French language post Programmation du Sonoff dans l'EDI Arduino (1). Broadly speaking, it is a two-step procedure. First the URL http://arduino.esp8266.com/stable/package_esp8266com_index.json must be added to the Additional Boards Manager URLs: box in the Preferences menu of the Arduino IDE. The second step is to install the esp8266 by ESP8266 Community boards using the Boards Manager in the IDE.

For a first test, I uploaded the TestEspApi example sketch by Max Vilimpoc. It can be located in the IDE menu File/Examples/ESP8266. Then, I selected the following board in the Tools/Board IDE menu: "NodeMCU 1.0 (ESP-12E Module)" and set the Tools/Upload Speed: to 115200 bps. Accordingly, I changed the first line of the setup() function in the sketch to

void setup() 
{
    // Reuse default Serial port rate, so the bootloader
    // messages are also readable.
    
    Serial.begin(115200);

I also made a few corrections to the code. These are indicated below.

const char * const EVENT_NAMES[]
{
    "EVENT_STAMODE_CONNECTED",
    "EVENT_STAMODE_DISCONNECTED",
    "EVENT_STAMODE_AUTHMODE_CHANGE",
    "EVENT_STAMODE_GOT_IP",
    "EVENT_STAMODE_DHCP_TIMEOUT",            //<<md
    "EVENT_SOFTAPMODE_STACONNECTED",
    "EVENT_SOFTAPMODE_STADISCONNECTED",
    "EVENT_SOFTAPMODE_PROBEREQRECVED",       //<<md
    "EVENT_MAX"
};

const char * const EVENT_REASONS[]
{
    "",
    "REASON_UNSPECIFIED",
    "REASON_AUTH_EXPIRE",
    "REASON_AUTH_LEAVE",
    "REASON_ASSOC_EXPIRE",
    "REASON_ASSOC_TOOMANY",
    "REASON_NOT_AUTHED",
    "REASON_NOT_ASSOCED",
    "REASON_ASSOC_LEAVE",
    "REASON_ASSOC_NOT_AUTHED",
    "REASON_DISASSOC_PWRCAP_BAD",
    "REASON_DISASSOC_SUPCHAN_BAD",
    "",                                  //<<md
    "REASON_IE_INVALID",
    "REASON_MIC_FAILURE",
    "REASON_4WAY_HANDSHAKE_TIMEOUT",
    "REASON_GROUP_KEY_UPDATE_TIMEOUT",
    "REASON_IE_IN_4WAY_DIFFERS",
    "REASON_GROUP_CIPHER_INVALID",
    "REASON_PAIRWISE_CIPHER_INVALID",
    "REASON_AKMP_INVALID",
    "REASON_UNSUPP_RSN_IE_VERSION",
    "REASON_INVALID_RSN_IE_CAP",
    "REASON_802_1X_AUTH_FAILED",
    "REASON_CIPHER_SUITE_REJECTED"
};

const char * const EVENT_REASONS_200[]
{
    "REASON_BEACON_TIMEOUT",
    "REASON_NO_AP_FOUND",
    "REASON_AUTH_FAIL",                 //<<md
    "REASON_ASSOC_FAIL",                //<<md
    "REASON_HANDSHAKE_TIMEOUT"          //<<md 
};
The first two are the only important changes because the EVENT_REASONS and EVENT_REASONS_200 strings are not used in the sketch.

After uploading the corrected sketch, the Serial monitor showed "system_get_time(): xxxxxxxxx" at one second intervals with occasional sequences of a few "EVENT_SOFTAPMODE_PROBEREQRECVED()". When I connected another computer to the ESP access point named "TestAP" (password: "testtesttest"), then the following event was reported EVENT_SOFTAPMODE_STACONNECTED (a9:dd:65:ef:51:0b, aid: 1). When the computer was disconnected a similar report was displayed on the serial monitor: EVENT_SOFTAPMODE_STADISCONNECTED (a9:dd:65:ef:51:0b, aid: 1).

The program worked without problems, even when doubling the frequency of the chip. That was comforting, it looks very much like this particular NodeMCU type board will be just as easy to use as the WeMos D1 mini. But this is just the beginning of my "investigation".

Pin Map toc

The Geekcreit site is all but empty and, as much as I searched, I could not find a map of the board pins on the DOIT sites. It does have a link to the NodeMCU GitHub site with a pin map of version 1.0 of its development kit. The labels correspond pretty much to those found on the V3 board from DOIT/GEEKCREIT. The following schema shows the two layouts. This is the view from above the board, the shield of the ESP module is visible and at the top, the micro USB connector is at the bottom.


              +---------------+
GPIO | DEVKIT |      DOIT     | DEVKIT | GPIO
     |  V1.0  |       V3      |  V1.0  |
-----|--------+---------------+--------------
     |    A0  | AD0        D0 |  D0    |  16
     |   RSV  | RSV       ~D1 |  D1    |   5
     |   RSV  | RSV       ~D2 |  D2    |   4
 10  |   SD3  | SD3       ~D3 |  D3    |   0
  9  |   SD2  | SD2       ~D4 |  D4    |   2
     |   SD1  | SD1       3V3 |  3V3   |
     |   CMD  | CMD       GND |  GND   |
     |   SD0  | SD0       ~D5 |  D5    |  14 
     |   CLK  | CLK       ~D6 |  D6    |  12
     |   GND  | GND       ~D7 |  D7    |  13
     |   3V3  | 3V3       ~D8 |  D8    |  15
     |    EN  | EN        RX< |  D9    |   3
     |   RST  | RST       TX> |  D10   |   1
     |   GND  | GND       GND |  GND   |
     |   Vin  | Vin       3V3 |  3V3   |
              +---------------+

        Not accurate, please see the conclusion

The descriptions found on the online stores include the following: "10 GPIO, every GPIO can be PWM, I2C, 1-wire". On the other hand the manual for the ESP-12F from DOIT states that there is a maximum of 11 GPIO. There is no real discrepency as GPIO 16 (D0) is often identified as strictly an input or output pin not capable of I2C or 1-wire functions.

The 11 GPIO pins on the right-hand side of the board are the same as those found on the WeMos D1 mini. The tildes in front of the D1 to D8 labels are not an indication of reversed logic. Writing a 1 (or HIGH) to GPIO 4 will set the ~D2 pin to 3.3 volts. I think the tilde is to indicate that the D1 to D8 pins can do I2C, PWM, SPI and so on while D0 cannot.

Apparently, V3 of the board means that the extra pins found at the bottom of the ESP-12E and ESP-12F modules have been brought out to the top left side of the board. Does that mean that there are an additional two GPIO pins GPIO 9 and 10? I did confirmed with a VOM that the SD2 and SD3 pins of the development board are indeed connected to the GPIO 9 and 10 pins of the ESP-12F module. However there is some doubt as to their nature since they are labeled SD2 and SD3 not D11 and D12 and there is no tilde in front of the label indicating their I2C, PWM etc. capabilities.

Extra GPIO Pins? toc

Information on the web casts doubt on the possibility of using SD2 and SD3 (GPIO9 and GPI010) for input/output purposes . A comment by porkyneal on the newer ESP-12S sold as fully compatible with the ESP-12E and ESP-12F pointed out that the extra pins at the bottom of the module were not present on the ESP-12S but that did not matter because "these were not that useful (connected internally to flash I believe)". On the other hand, costo at LETS CONTROL IT said there were plans to free up the GPIO 9 and 10 pins on NodeMCU boards, and that was back in April 2016. Perhaps that was done in version 3 of the development kit? To further confuse the issue, there is a discussion on the Espressif Forum about using the two GPIO pins on the ESP-12E. Clearly mileage depends on the car... I mean card used.

Standard serial flash memory is read or written one bit at a time and therefore is connected to the micro-controller with one data line and a clock line. To speed things up, newer flash memory can be read or written two bits at a time (dio for dual i/o) or ever four bits per clock cycle (qio for quad i/o). Of course, dio mode uses 2 data lines and qio mode uses 4 data lines.

The flash chip id of the ESP12F module is 0x1640C8. The lower bit, 0xC8, denotes GigaDevice as the manufacturer and the part id is 4016. According to the list at the flashrom project, the part number is a GD25Q32 (said to be the same as GD25Q32B). I could not find a GD25Q32 or GD25Q32B on the manufacturer's web site, but there is a GD25Q32C which seems close enough. The common "Q32" in the part numbers stands for 32 Mbit (4Mbyte) quad i/o flash memory.

The content of the Arduino description file for the NodeMCU board, ~/.arduino15/packages/esp8266/hardware/esp8266/2.3.0/boards.txt,

nodemcuv2.name=NodeMCU 1.0 (ESP-12E Module)
...
nodemcuv2.build.mcu=esp8266
nodemcuv2.build.f_cpu=80000000L
nodemcuv2.build.board=ESP8266_NODEMCU
nodemcuv2.build.core=esp8266
nodemcuv2.build.variant=nodemcu
nodemcuv2.build.flash_mode=dio
nodemcuv2.build.flash_size=4M
nodemcuv2.build.flash_freq=40
...
says that only two lines of data are used for data transfers with the memory since it is flashed in dio mode. Since the used data lines are presumably, SD0 and SD1 it would appear that SD2 and SD3 are not needed.

However, simple experiments using an LED and a tactile switch showed that SD2 cannot be used as a input or output pin. Attempts to use SD2 would freeze the device. Indeed the schematic in the DOIT ESP-12F manual (page 8) shows SD2 and SD3 connected to the /HOLD and /WP pins of the flash memory chip.

Surprisingly, SD3 can be used as an input or output pin. I found I could flash the development board when it is powered up no matter if the pin is grounded or pulled high. And I was able to use the pin to blink an LED and perform over the air upgrades of the sketch without any problem. So I feel confident that SD3 (GPIO 10) can indeed be viewed as a general purpose input/output pad.

I did try to flash the ESP-12F in quad i/o mode by changing boards.txt file to

nodemcuv2.name=NodeMCU 1.0 (ESP-12E Module)
...
nodemcuv2.build.mcu=esp8266
nodemcuv2.build.f_cpu=80000000L
nodemcuv2.build.board=ESP8266_NODEMCU
nodemcuv2.build.core=esp8266
nodemcuv2.build.variant=nodemcu
#nodemcuv2.build.flash_mode=dio
nodemcuv2.build.flash_mode=qio
nodemcuv2.build.flash_size=4M
nodemcuv2.build.flash_freq=40
...
(you could also use NodeMCU 0.9 (ESP-12 Module) which is the same board definition as NodeMCU 1.0 (ESP-12E Module) except for the qio flash mode). Flashing completed, the serial monitor got as far as showing
1384, room 16 
tail 8
chksum
but then the device froze.

This makes no sense to me. Since the flash memory is being used in dual i/o mode only, two GPIO pins should be available, not just one.

Defective 5V VIN toc

Fortunately, preliminary tests show that the ESP start correctly when power is applied via the 5V VIN pin contrary to a review found on the Banggood site. Perhaps that problem was limited to the ESP12E development kit or, more likely, the problem was linked to the the power supply used by that reviewer. I have done better testing and I can confirm that I get this problem with 3 different power supplies. I need to manually press the reset button after applying power to get the board to boot correctly. Surprisingly, the ESP8266 boots properly when these same power supplies are connected through the micro-USB port.

Miscellanea toc

It turns out that the top reserved pin (below AD0) is connected directly to the TOUT pin of the ESP8266. Thus, that second pin is a connection to the analog to digital converter (ADC) and has a range of 0 to 1.0 volt. The top pin, AD0, is connected to the same ADC via a voltage divider and its input range is 0 to 3.3 V.

The NodeMCU pinout shows a USER switch connected to D0 (GPIO16). The schematic for vers 0.9 shows a _RST/USER switch connected to the RST pin that can optionally be connected to D0. As far as I can tell, the switch labelled RESET is connected to the RST pin on the DOIT/Geekcreit board.

Marcel Stör, who runs NodeMCU custom builds, has written an informative page entitled Comparison of ESP8266 NodemMCU development boards that explains the difference between version 2 and 3. From what I understand, V2 and V3 are just 2nd generation Version 1.0 NodemMCU open source hardware. Version 0.9 (also referred to as V1) had a wider form factor and used a ESP-12 module. Version 1.0 (also referred to as V2, duh!) has the narrower, breadboard friendly board which uses an ESP-12E module. Some manufacturers now produce a version 3 still based on the version 1.0 NodeMCU specification. I presume that DOIT calls its new board V3 because it uses the ESP-12F. LoLin/WeMos also has a "new NodeMcu V3" board with a slightly different pinout but with the old wide form factor. I could not find mention of that board on the WeMos site. Both boards are sold by Banggood under the GEEKCREIT banner.

Here is the pertinent part of an Arduino sketch that I used to identify the SPI flash memory chip and its size on the development board.

  long fid = ESP.getFlashChipId();
  Serial.printf("Flash chip ID: %d (0x%x)\n", fid, fid);
  Serial.printf("  - manufacturer id: %d (0x%x)\n", (fid & 0xFF), (fid & 0xFF));
  Serial.printf("  - part id %x%x\n", (fid >> 8) & 0xFF, (fid >> 16) & 0xFF);
  Serial.printf("Flash chip real size: %d\n", ESP.getFlashChipRealSize());
  Serial.printf("Flash chip size: %d\n", ESP.getFlashChipSize());
  Serial.printf("Flash chip speed: %d\n", ESP.getFlashChipSpeed());
  Serial.printf("Flash chip mode: %d\n\n", ESP.getFlashChipMode());  

I should mention the Happy Bison review of ESP8266 modules. It includes the ESP-12D which does free up two GPIO pins. Is it vapourware? It does not seem to be available from the usual sources.

Conclusion toc

Here is the pinout of the Geekcreit ESP12F DEVKIT V3 as far as I can make it out.

pinout

GPIO3 and GPIO1, labelled RX and TX above, are accessed as D9 and D10 in the NodeMCU 1.0 (ESP-12) board definition of the ESP8266 Arduino library. There is no "nice" name for GPIO10 (SD3). If you want to use it as a GPIO pin, you can use the gpio number as in setMode(10, INPUT_PULLUP). You can also include a preprocessor declaration such as

   #DEFINE SD3 10
or
   #DEFINE D11 10
(or both if wanted) in an Arduino sketch. Finally you could proceed as in the ESP8266 board definitions and add
  static const uint8_t SD3 = 10;
  static const uint8_t D11 = 10;
Either approaches makes it possible to set the pin to a logical high value with
  setMode(D11, OUTPUT);
  digitalWrite(D11, HIGH);

I started this post wondering about the relative merits of the Wemos D1 mini and the Geekcreit/DOIT Devkit V3. Since both are based on the "original" NodeMCU hardware, they are very similar. Here is a comparison of the two boards.

DOIT V3Wemos D1 mini
ESP8266 moduleESP-12FESP-12S
Flash memory4Mbytes
Flash i/o modedual (dio) (1)
Common GPIO11 pins: 0, 1, 2, 3, 4, 5, 12, 13, 14, 15, 16
Extra GPIO1 pin: GPIO10 (2)-
Extra analog pinADC (3)-
3.3V pins31
Ground pins41
Headerssoldered, 2x15 pin maleunsoldered, 2x8 pin (3 sets: male, female, female feed-through)
Shieldsnomany such as a DHT sensor, relay, buzzer.
Breadboard
friendly
yes, 1 tie point per pinyes, 1 tie point per pin
2 with female feed-through header
Width25.8 mm25.6 mm
Length48.6 mm34.3 mm
Thickness (4)4.3 mm7.4 mm
Pricecan be found at around 5$ CDN
(1)At least in the Arduino IDE.
(2)Labelled SD3, this is not advertised and, hence, subject to change.
(3)This is not an extra ADC channel. The reserved pin, RSV, just below AD0, is connected directly to the ESP8266 ADC whereas AD0 is high voltage of a voltage divider connected to the ADC.
(4)Excluding height of headers.

Like much in life, it's a tradeoff. An extra GPIO pin, direct access to the single analog to digital input and more power and ground connections can be had with the Geekcreit/DOIT board foregoing quad I/O access to the flash memory, occupying more real estate and losing use of the VIN pin.

I do feel that DOIT missed an opportunity. Solving the VIN pin problem and freeing up SD2 to be used as a general purpose input/output pin would make the V3 devkit much more compeling. But then, what do I know... perhaps neither of these things are easily accomplished.

Hopefully, the information in this post is accurate. Because that is a difficult goal to achieve, please, send a message if you find an error or if you notice an omission. Click on my name at the bottom of the page and the "mailto" link should bring up your default mail program.