This post collects observations when using MAix GO board with Arduino IDE, call Maixduino.
Macros how special pins on board MAix GO are called, can be found in pins_arduino.h of MAix GO., like PIN_KEY_PRESS which has an external pull up resistor (see schematic).
When testing example code of libraries function Serial.begin() seems to need a little time to initialize. Console output worked after adding 300mS delay. (How much is the minimal delay required?):
Serial.begin(115200);
delay(300);
Below libraries are listed which have example code that compiles and runs with MAix GO board (maybe the code needs minimal modification like replacing BUILTIN_LED by LED_BUILTIN; use compiler error messages – Preferences/Show verbose output during compilation):
- WiFiEsp (included with Maixduino board addon of Arduino IDE)
- RingBuffer by locoduino (installable with Arduino Library Manager)
(Maybe EspRingBuffer coming as part of of WiFiEsp bundled with Maixduino, folder src/utility, is of interest as well.) - ArduinoJson by Benoît Blanchan (Arduino Library Manager)
- ArduinoMqtt by Oleg Kovalenk which is based on eclipse paho (Arduino Library Manager)
Use the example ConnectEsp8266WiFiClient and replace: ESP8266WiFi.h by WiFiEsp.h (included in Maixduino), WiFiClient by WiFiEspClient, ESP.reset() by WiFi.reset() and copy WiFi setup code from example of WiFiEsp. – If not properly initialized might stop k210 cpu with illegal instruction. - pubsubclient by Nick O’Leary (Arduino Library Manager). Same remarks as shown above (ArduinoMqtt).
According to Kendryte K210 datasheet (available here) the speed of the 4 uart interfaces of K210 can run with up to 5 MHz baud rate. Communication with esp8285 used as wifi chip runs by default with 115200 baud and seems to run with 2000000 baud as well. (Tested with sketch Examples/Maix Go/WiFiEsp/Test/EspDebug: use command AT+UART_CUR:2000000,8,1,0,1). AT command reference is here. Using the _CUR command means that after reboot the default settings get restored. Storing the settings permanently bears the risk to make esp8266 inaccessible (if not reflashed).
Source of AT command firmware is here at github, if you select tag v2.2.1 (examples/at). – Install compiler (folder dist in https://github.com/noduino/xtensa-toolchain or http://domoticx.com/sdk-esp8266-xtensa-architecture-toolchain/) and add it to path. Inside SDK folder copy folder examples/at to root folder of SDK. Run script gen_misc and choose: boot_v1.2+, user1.bin (or user2.bin), spi 40MHz, spi DOUT, 1024KB (512KB+512KB); result is in folder bin/. Uploading to esp8285 would require to shorten ground and the pad GPIO0 in the corner of the antenna connector (info from sipeed forum).
notes about using esptool.py to flash firmware (hide expanded file):
00001 00002 00003 00004 00005 00006 00007 00008 00009 | to verify size of flash python utils/esptool.py --port /dev/cu.usbserial-143110 --baud 115200 flash_id nodemcu board, 4MB=32000kbit, successfully flashed with python utils/esptool.py --port /dev/cu.usbserial-143110 --baud 115200 write_flash 0x00000 bin/eagle.flash.bin 0x10000 bin/eagle.irom0text.bin 0x7E000 bin/blank.bin 0x3FE000 bin/blank.bin 0x3FC000 bin/esp_init_data_default.bin (tested by konsole of arduino ide; firmware has default baud rate of 115200; boot messages are sent with 74880 baud ->technical reference of esp8266) esp8285, 1MB=4096kbit, should be flashable with python utils/esptool.py --port /dev/cu.usbserial-143110 --baud 115200 write_flash 0x00000 bin/eagle.flash.bin 0x10000 bin/eagle.irom0text.bin 0x7E000 bin/blank.bin 0xFE000 bin/blank.bin 0xFC000 bin/esp_init_data_default.bin |
To use WiFiEsp lib with 2000000 baud without setting it permanently WiFiEsp has to be patched: by default WiFi.init(&Serial1) function does call AT+RST which reboots esp8285. In patched version you can call WiFi.init(&Serial1, false) to avoid this reboot:
WiFiEsp_disable_at_rst_in_init.diff (hide expanded diff file):
00001 00002 00003 00004 00005 00006 00007 00008 00009 00010 00011 00012 00013 00014 00015 00016 00017 00018 00019 00020 00021 00022 00023 00024 00025 00026 00027 00028 00029 00030 00031 00032 00033 00034 00035 00036 00037 00038 00039 00040 00041 00042 00043 00044 00045 00046 00047 00048 00049 00050 00051 00052 00053 00054 00055 00056 00057 00058 00059 00060 00061 00062 00063 00064 00065 00066 00067 00068 00069 00070 00071 00072 00073 00074 00075 00076 00077 00078 00079 00080 00081 00082 00083 00084 00085 00086 00087 00088 00089 00090 00091 00092 00093 00094 00095 00096 00097 00098 00099 00100 00101 00102 00103 00104 00105 00106 00107 00108 | diff -ur orig/WiFiEsp.cpp new/WiFiEsp.cpp --- orig/WiFiEsp.cpp 2019-07-15 17:14:20.000000000 +0200 +++ new/WiFiEsp.cpp 2019-08-07 11:32:14.000000000 +0200 @@ -33,8 +33,14 @@ void WiFiEspClass::init(Stream* espSerial) { + init(espSerial, true); +} + + +void WiFiEspClass::init(Stream* espSerial, bool run_at_rst) +{ LOGINFO(F("Initializing ESP module")); - EspDrv::wifiDriverInit(espSerial); + EspDrv::wifiDriverInit(espSerial, run_at_rst); } diff -ur orig/WiFiEsp.h new/WiFiEsp.h --- orig/WiFiEsp.h 2019-07-15 17:14:20.000000000 +0200 +++ new/WiFiEsp.h 2019-08-07 11:33:01.000000000 +0200 @@ -51,6 +51,8 @@ */ static void init(Stream* espSerial); + static void init(Stream* espSerial, bool do_at_rst); + /** * Get firmware version diff -ur orig/utility/EspDrv.cpp new/utility/EspDrv.cpp --- orig/utility/EspDrv.cpp 2019-07-15 17:14:20.000000000 +0200 +++ new/utility/EspDrv.cpp 2019-08-07 12:04:48.000000000 +0200 @@ -70,8 +70,15 @@ uint8_t EspDrv::_remoteIp[] = {0}; + void EspDrv::wifiDriverInit(Stream *espSerial) { + wifiDriverInit(espSerial, true); +} + + +void EspDrv::wifiDriverInit(Stream *espSerial, bool run_at_rst) +{ LOGDEBUG(F("> wifiDriverInit")); EspDrv::espSerial = espSerial; @@ -95,7 +102,7 @@ return; } - reset(); + reset(run_at_rst); // check firmware version getFwVersion(); @@ -114,13 +121,23 @@ } + void EspDrv::reset() { + reset(true); +} + + +void EspDrv::reset(bool run_at_rst) +{ LOGDEBUG(F("> reset")); - sendCmd(F("AT+RST")); - delay(3000); - espEmptyBuf(false); // empty dirty characters from the buffer + if(run_at_rst) + { + sendCmd(F("AT+RST")); + delay(3000); + espEmptyBuf(false); // empty dirty characters from the buffer + } // disable echo of commands sendCmd(F("ATE0")); diff -ur orig/utility/EspDrv.h new/utility/EspDrv.h --- orig/utility/EspDrv.h 2019-07-15 17:14:20.000000000 +0200 +++ new/utility/EspDrv.h 2019-08-07 11:38:57.000000000 +0200 @@ -123,6 +123,9 @@ static void wifiDriverInit(Stream *espSerial); + static void wifiDriverInit(Stream *espSerial, bool run_at_rst); + + /* Start Wifi connection with passphrase * * param ssid: Pointer to the SSID string. @@ -279,6 +282,8 @@ static bool ping(const char *host); static void reset(); + static void reset(bool do_at_rst); + static void getRemoteIpAddress(IPAddress& ip); static uint16_t getRemotePort(); |
To be continued.