From cd1230c4971caec57808c80208782102f71b1f26 Mon Sep 17 00:00:00 2001 From: Andi Dittrich Date: Sat, 27 Aug 2016 07:59:38 +0000 Subject: [PATCH] added documentation regarding reset-on-connect issue --- CHANGES.md | 3 +- README.md | 2 ++ docs/Reset_on_Connect.md | 55 +++++++++++++++++++++++++++++++++ docs/nodemcu-reset-circuit.jpg | Bin 0 -> 38656 bytes lib/NodeMcuConnector.js | 2 +- 5 files changed, 60 insertions(+), 2 deletions(-) create mode 100755 docs/Reset_on_Connect.md create mode 100755 docs/nodemcu-reset-circuit.jpg diff --git a/CHANGES.md b/CHANGES.md index 72d96b8..57c5ada 100755 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,7 +1,8 @@ -### 2.0.0-BETA1 ### +### 2.0.0 ### * Added: `reset` command to Hard-Reset the NodeMCU module using DTR/RTS reset circuit (like NodeMCU DEV Kit) * Added: RAW output format to `fsinfo` command - feature requested [on GitHub](https://github.com/AndiDittrich/NodeMCU-Tool/issues/13) #13 * Added: `--connection-delay` option to fix broken reset circuits which cause a immediate hard-reset on opening the serial connection (dts/rts lines) #14 +* Added: Documentation regarding to [Reset-on-Connect Issues / Broken Reset Circuits](docs/Reset_on_Connect.md) * Changed: Default baudrate to **115200** - newer firmware versions using automatic baudrate detection which allows to use higher connection speeds by default * Changed: footprints of NodeMCU-Tool.js functions - port/baudrate are set globally by setOptions instead by each function * Changed: [logging-facility](https://github.com/AndiDittrich/Node.Logging-Facility) is used for global log output management diff --git a/README.md b/README.md index 544f035..3ba655d 100755 --- a/README.md +++ b/README.md @@ -38,7 +38,9 @@ Related Documents * [Common Use-Cases and Examples](docs/Examples.md) * [Programmatic Usage](docs/ProgrammaticUsage.md) +* [Fixing Reset-on-Connect Issue](docs/Reset_on_Connect.md) * [Contribution Guidelines](CONTRIBUTE.md) +* [NodeMCU DEVKIT Schematics](https://github.com/nodemcu/nodemcu-devkit-v1.0/blob/master/NODEMCU_DEVKIT_V1.0.PDF) * [Changelog](CHANGES.md) * [License](LICENSE.md) diff --git a/docs/Reset_on_Connect.md b/docs/Reset_on_Connect.md new file mode 100755 index 0000000..96e2233 --- /dev/null +++ b/docs/Reset_on_Connect.md @@ -0,0 +1,55 @@ +Fixing Reset-on-Connect Issue / Broken Reset Circuits +===================================================== + +Regarding to Issue #14 + +Build-In Reset Circuit +---------------------- + +The original [NodeMCU DEVKIT](https://github.com/nodemcu/nodemcu-devkit-v1.0) includes a build-in circuit to pull down the reset (RST) and/or flash (GPIO0) pins via the serial connection using the DTR/RTS lines. +This allows the user to execute a hard-reset or flash command via software. + +**Reset Circuit** (from [NodeMCU DEVKIT Schematics](https://github.com/nodemcu/nodemcu-devkit-v1.0/blob/master/NODEMCU_DEVKIT_V1.0.PDF)) +![Reset Circuit of NodeMCU DEVKIT](nodemcu-reset-circuit.jpg) + + +The Issue +--------------------- +It's a very useful feature, but on some modules these circuits cause a **reset on connect** which make the module inaccessible with NodeMCU-Tool: +on opening the serial connection software side, the module will be reset immediately and it reboots. Directly after reboot, the **auto-baudrate** detection of NodeMCU is capturing the serial input to determinate the used baudrate. +And this is the issue: NodeMCU-Tool sends a few hearbeat messages to the module to check its state, but these messages are list because of the auto-baudrate detection. Therefore the module is threatened as unavailable and a error message is raised. + +This behaviour can be caused by a hardware issue: wrong transistors, wrong series-resistors **or** a usb driver failure, which invokes the DTR/RTS lines asynchronous + +**Timeline** + +1. **NodeMCU-Tool** is establishing the serial connection +2. DTR/RTS lines are invoked +3. NodeMCU will do a hard-reset or go into flash mode +4. **NodeMCU-Tool** sends heartbeat sequence +5. NodeMCU Auto-Baudrate Detection is capturing the input or the module is not ready yet the receive incoming data +6. **NodeMCU-Tool** will not receive the hearbeat response - the module is threatened as unavailable + + +How to fix it +--------------------- + +NodeMCU-Tool v2.0.0 includes a special delay flag `--connection-delay N` which waits **N** milliseconds after establishing the connection and sends additional dummy sequences to trigger the auto-baudrate detection. + +**Timeline** +1. **NodeMCU-Tool** establishes the serial connection +2. **NodeMCU-Tool** is waiting **N** milliseconds until the hard-reset/reboot is done +3. **NodeMCU** becomes ready and starts the auto-baudrate detection +4. **NodeMCU-Tool** sends dummy sequence 1 to trigger the auto-baudrate detection +5. **NodeMCU-Tool** is waiting **N** milliseconds for baudrate detection +6. **NodeMCU-Tool** sends dummy sequence 2 to trigger the auto-baudrate detection +7. **NodeMCU-Tool** is waiting **N** milliseconds for baudrate detection +8. **NodeMCU** set its baudrate based on the previous dummy sequences +9. **NodeMCU-Tool** starts the regular heartbeat detection + +The connection delay is applied 3 times, between each step. A value between **300...500ms** has been approved as best option. + +**Example 1** +```bash +$ ./nodemcu-tool upload helloworld.lua --connection-delay 300 --baud 115200 +``` diff --git a/docs/nodemcu-reset-circuit.jpg b/docs/nodemcu-reset-circuit.jpg new file mode 100755 index 0000000000000000000000000000000000000000..807562e22a9495547b21c45f00b536f7dede3b2e GIT binary patch literal 38656 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 literal 0 HcmV?d00001 diff --git a/lib/NodeMcuConnector.js b/lib/NodeMcuConnector.js index 26cfc8a..30e3099 100755 --- a/lib/NodeMcuConnector.js +++ b/lib/NodeMcuConnector.js @@ -524,7 +524,7 @@ NodeMcuConnector.prototype.deviceInfo = function(showAll, cb){ // NodeMCU v1.1 - CP2102 Adapter | 0x10c4 Cygnal Integrated Products, Inc }else{ cb(null, ports.filter(function(item){ - return (item.vendorId == '0x1a86' || item.vendorId == '0x10c4' ); + return (item.vendorId == '0x1a86' || item.vendorId == '0x10c4'); })); } });