Monday, April 15, 2019

Install both ESP32 and ESP8266 on Arduino IDE, run on Ubuntu.

Before install ESP32/8266 on Arduino IDE running on Ubuntu, python is needed to be installed. Otherwise, you will be reported with error of:
exec: "python": executable file not found in $PATH

To install python and wget on Ubuntu, run the command in terminal:
$ sudo apt install python
$ sudo apt install python-pip
$ pip install wget

The simplest way to install ESP32/8266 on Arduino IDE is using Boards Manager,

To add boards manager, click in the menu
> File > Preferences >

Enter https://dl.espressif.com/dl/package_esp32_index.json (for ESP32) or/and http://arduino.esp8266.com/stable/package_esp8266com_index.json (for ESP8266) in Additional Boards Manager URLs. When add multiple URLs, separating them with commas.

This video show how:


If you run with error of:
ImportError: No module named serial.tools.list_ports

Most likely the pyserial is too old, re-install it with:
$ pip install pyserial


Wednesday, April 10, 2019

Install Arduino IDE 1.8.9 on Ubuntu 18.10 and set permission for serial port

This video show how to install the latest Arduino IDE 1.8.9 on a fresh new Ubuntu 18.10 (on VirtualBox 6.0/Windows 10).



This installation is very straightforward:
- visit Arduino Software download page to download the Linux 32 bits or 64 bits version corresponding to your system.
- Extract the downloaded file to the where you want to install.
- Open Terminal to run the install.sh with sudo.
$ sudo ./install.sh

After finished, you can start Arduino IDE with arduino command or from Application launcher.

But...up to this step, you have no permission to access the serial port. When you download the code to Arduino devices, you will be reported with error:

avrdude: ser_open(): can't open device "/dev/ttyACM0": Permission denied


To fix it, you have to add permission:
- Open Terminal, enter the command:
$ sudo usermod -a -G dialout <username>
$ sudo chmod a+rw /dev/ttyACM0


Saturday, April 6, 2019

ESP32 + OLED Module

It's a ESP32 module with integrated OLED.



It pre-load with a demo program. In first power-up, the OLED show a all ON screen and a welcome message alternatively.



Make the OLED work:

First of all, I install both ESP32 and ESP8266 on Arduino IDE.

The first thing I want to do is make the OLED work. But it's only limit info from the seller, only mention that it's WEMOS LoLin32, without any about the OLED. So I have to search, guess and try.

After searched in some Chinese website, I guess that the OLED driver for this module should be SSD1306, with I2C interface. and the I2C pin should be 5 and 4 for ESP32.

Then I have to identify the I2C address. I found a i2c_scanner example from Arduino Playground. Have to modify the code Wire.begin() to Wire.begin(5,4) for ESP32.

The full code is here:
// Copy from Arduino Playground - i2c_scanner
// https://playground.arduino.cc/Main/I2cScanner/
// --------------------------------------
// i2c_scanner
//
// Version 1
//    This program (or code that looks like it)
//    can be found in many places.
//    For example on the Arduino.cc forum.
//    The original author is not know.
// Version 2, Juni 2012, Using Arduino 1.0.1
//     Adapted to be as simple as possible by Arduino.cc user Krodal
// Version 3, Feb 26  2013
//    V3 by louarnold
// Version 4, March 3, 2013, Using Arduino 1.0.3
//    by Arduino.cc user Krodal.
//    Changes by louarnold removed.
//    Scanning addresses changed from 0...127 to 1...119,
//    according to the i2c scanner by Nick Gammon
//    https://www.gammon.com.au/forum/?id=10896
// Version 5, March 28, 2013
//    As version 4, but address scans now to 127.
//    A sensor seems to use address 120.
// Version 6, November 27, 2015.
//    Added waiting for the Leonardo serial communication.
// 
//
// This sketch tests the standard 7-bit addresses
// Devices with higher bit address might not be seen properly.
//

#include <Wire.h>


void setup()
{
  Wire.begin(5,4);  //Modifed for ESP32

  Serial.begin(9600);
  while (!Serial);             // Leonardo: wait for serial monitor
  Serial.println("\nI2C Scanner");
}


void loop()
{
  byte error, address;
  int nDevices;

  Serial.println("Scanning...");

  nDevices = 0;
  for(address = 1; address < 127; address++ ) 
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");

      nDevices++;
    }
    else if (error==4) 
    {
      Serial.print("Unknown error at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");

  delay(5000);           // wait 5 seconds for next scan
}

Remember to select board of "WEMOS LoLin32" before download.

The I2C address is 0x3C.

Then I tried to find any library suitable in Arduino IDE, and found "ESP8266 and ESP32 Oled Driver for SSD1306 by Daniel Eichhorn, Fabrice Weinberg".

Luckily it work as expect.

Tried to load the example of SSD1306SimpleDemo, simple modify the code
SSD1306Wire  display(0x3c, D3, D5);

to
SSD1306Wire  display(0x3c, 5, 4);

to make it work for this module.



This video show how to:




A minimum exercise to display simple text.

/*
 * A ESP32/OLED exercise to display simple text
 * Board:
 * esp32 by Espressif Systems version 1.0.4
 * OLED library:
 * ESP8266 and ESP32 Oled Driver for SSD1306 displays version 4.1.0
 */

#include <Wire.h>               // Only needed for Arduino 1.6.5 and earlier
#include "SSD1306Wire.h"        // legacy: #include "SSD1306.h"
#include "images.h"


// Initialize the OLED display using Arduino Wire:
SSD1306Wire  display(0x3c, 5, 4);

void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.println();


  // Initialising the UI will init the display too.
  display.init();

  display.flipScreenVertically();
  display.setTextAlignment(TEXT_ALIGN_LEFT);
  display.setFont(ArialMT_Plain_16);

}

void loop() {

  display.clear();
  display.drawString(0, 0, "ESP32/OLED");
  display.drawString(0, 15, "exercise:");
  display.drawString(0, 30, "To display");
  display.drawString(0, 45, "simple text");

  display.display();

  delay(100);
}