Necessity is mother of invention. Even though in this case there was not a lot of invention, there was necessity. I wanted to play with the ESP8266 module and I wanted it badly. Unfortunately, I could not find any FTDI in my drawers, so I had to find a different way of talking to my ESP8266. I quickly concluded that I could use either Arduino or Raspberry Pi. I decided to start with Arduino but for whatever reason could not make it work. A little desperate, I decided to try Raspberry PI. This, thanks to the information I found on the Internet, got me much further. I found a few articles scattered over the web and after combining various pieces of information I was able not only to talk to my ESP8266 but also reprogram it. I decided to write this post so that all the information I found is in one place. Let’s get started.
The idea is to connect an ESP8266 module to Raspberry Pi’s GPIO serial pins and then use a serial communication terminal like
screen to talk to the module. Before we can do this, we need to reconfigure our Raspberry Pi so that the OS is not using the serial interface. The first step is to disable serial logins. The easiest way to achieve this is to use
raspi-config. Start the the
sudo raspi-config, go to Interfacing Options and then to Serial. You will be asked two questions – answer them as follows:
- Would you like a login shell to be accessible over serial?
- Would you like the serial port hardware to be enabled?
The second thing to do is to switch off sending bootup info to serial by removing references to
ttyAMA0 in the
/boot/cmdline.txt file – e.g.
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=PARTUUID=9815a293-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
dwc_otg.lpm_enable=0 console=tty1 root=PARTUUID=9815a293-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
Finally, you need to restart your Raspberry Pi for changes to take effect
sudo reboot now
Now, that we prepared our Raspberry Pi we need to wire the ESP8266 module. You need to power down Raspberry PI and connect your ESP8266 module as per the diagram below.
ESP8266 Raspberry Pi
CH_PD 3.3V (via a pull down resistor)
After wiring the ESP8266 module to the Raspberry Pi has been completed we can boot the Pi and connect to the ESP8266 using
screen (I am using
screen because it is installed by default but you can use
minicom if you prefer):
screen /dev/ttyAMA0 115200
To see if we connected successfully let’s send some commands to the module (note: when using
screen you need to press
CTRL+J to send the command).
Check if AT system works (
Display the version (AT+GMR)
AT version:188.8.131.52(Jul 1 2016 20:04:45)
Ai-Thinker Technology Co. Ltd.
Dec 2 2016 14:21:16
Connect to WiFi (a series of commands)
WIFI GOT IP
The full list of AT commands can be found on the espressif’s web site in the documents section – look for ESP8266 AT Instruction Set. Note that some commands from the document may not work if you are using an older version of the firmware.
We are able to communicate with our ESP8266. Now, let’s try updating the firmware. First, we need to power down the PI again and connect the
GPIO0 pin of the ESP8266 to the PI’s ground pin. This will make the module run in the flash mode.
The next step is to install the
esptool which we will use to transfer firmware files to the module:
sudo apt-get update
sudo apt-get install python
sudo apt-get install python-pip
sudo pip install esptool
Finally, we need a firmware that we will flash to the device. We can get a new firmware by cloning the espressif’s ESP8266_NONOS_SDK repo:
git clone https://github.com/espressif/ESP8266_NONOS_SDK
After the repo has been cloned we need to go to the
bin folder and run the following command:
esptool.py --port /dev/ttyAMA0 --baud 115200 write_flash --flash_freq 40m --flash_mode qio 0x0000 boot_v1.7.bin 0x1000 at/512+512/user1.1024.new.2.bin 0x7E000 blank.bin
The output of the command should look like this:
Detecting chip type... ESP8266
Chip is ESP8266
Configuring flash size...
Auto-detected Flash size: 1MB
Flash params set to 0x0020
Compressed 4080 bytes to 2936...
Wrote 4080 bytes (2936 compressed) at 0x00000000 in 0.3 seconds (effective 121.5 kbit/s)...
Hash of data verified.
Compressed 427060 bytes to 305755...
Wrote 427060 bytes (305755 compressed) at 0x00001000 in 27.9 seconds (effective 122.3 kbit/s)...
Hash of data verified.
Compressed 4096 bytes to 26...
Wrote 4096 bytes (26 compressed) at 0x0007e000 in 0.0 seconds (effective 4538.5 kbit/s)...
Hash of data verified.
Once the process is complete we can power down the Raspberry Pi and disconnect the ESP8266 GPIO0 pin from GND to make it run again in the normal mode. Now, we can start the PI, and dump the ESP8266 firmware version with the
AT version:184.108.40.206(May 5 2017 16:10:59)
compile time:May 5 2017 16:37:48
This is a much newer version than what we originally had so we were able to flash our ESP8266 successfully. Yay!
The following articles were instrumental in writing this post: