Skip to content

Commit c85d79a

Browse files
committed
Patch by janakelarsson: Library use of POWER_ON and RESET_N #47
1 parent bff3ad4 commit c85d79a

File tree

4 files changed

+86
-31
lines changed

4 files changed

+86
-31
lines changed

examples/Tools/SerialSARAPassthrough/SerialSARAPassthrough.ino

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,29 +10,28 @@
1010
Circuit:
1111
- MKR NB 1500 board
1212
- Antenna
13-
- 1500 mAh or higher lipo battery connected
1413
- SIM card
1514
16-
Make sure the Serial Monitor's line ending is set to "Both NL and CR"
15+
Make sure the Serial Monitor's line ending is set to "Both NL and CR" or "Carriage Return"
1716
18-
create 11 December 2017
17+
created 11 December 2017
1918
Sandeep Mistry
2019
*/
2120

2221
// baud rate used for both Serial ports
2322
unsigned long baud = 115200;
2423

2524
void setup() {
26-
// enable the POW_ON pin
27-
pinMode(SARA_PWR_ON, OUTPUT);
28-
digitalWrite(SARA_PWR_ON, HIGH);
29-
30-
// reset the ublox module
25+
// NEVER EVER use RESET_N
3126
pinMode(SARA_RESETN, OUTPUT);
32-
digitalWrite(SARA_RESETN, HIGH);
33-
delay(100);
3427
digitalWrite(SARA_RESETN, LOW);
3528

29+
// Send Poweron pulse
30+
pinMode(SARA_PWR_ON, OUTPUT);
31+
digitalWrite(SARA_PWR_ON, HIGH);
32+
delay(150);
33+
digitalWrite(SARA_PWR_ON, LOW);
34+
3635
Serial.begin(baud);
3736
SerialSARA.begin(baud);
3837
}

src/Modem.cpp

Lines changed: 54 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,12 @@
2424
ModemUrcHandler* ModemClass::_urcHandlers[MAX_URC_HANDLERS] = { NULL };
2525
Print* ModemClass::_debugPrint = NULL;
2626

27-
ModemClass::ModemClass(Uart& uart, unsigned long baud, int resetPin, int powerOnPin) :
27+
ModemClass::ModemClass(Uart& uart, unsigned long baud, int resetPin, int powerOnPin, int vIntPin) :
2828
_uart(&uart),
2929
_baud(baud),
3030
_resetPin(resetPin),
3131
_powerOnPin(powerOnPin),
32+
_vIntPin(vIntPin),
3233
_lastResponseOrUrcMillis(0),
3334
_atCommandState(AT_COMMAND_IDLE),
3435
_ready(1),
@@ -37,19 +38,42 @@ ModemClass::ModemClass(Uart& uart, unsigned long baud, int resetPin, int powerOn
3738
_buffer.reserve(64);
3839
}
3940

41+
void ModemClass::setVIntPin(int vIntPin)
42+
{
43+
// Allow setting only if unset, used to track state
44+
if (_vIntPin==SARA_VINT_OFF || _vIntPin==SARA_VINT_ON) {
45+
_vIntPin=vIntPin;
46+
}
47+
}
48+
49+
int ModemClass::isPowerOn()
50+
{
51+
if (_vIntPin==SARA_VINT_OFF) {
52+
return 0;
53+
} else if (_vIntPin==SARA_VINT_ON) {
54+
return 1;
55+
}
56+
return digitalRead(_vIntPin);
57+
}
58+
4059
int ModemClass::begin(bool restart)
4160
{
61+
// datasheet warns not to use _resetPin, this may lead to an unrecoverable state
62+
digitalWrite(_resetPin, LOW);
63+
64+
if (restart) {
65+
shutdown();
66+
end();
67+
}
68+
4269
_uart->begin(_baud > 115200 ? 115200 : _baud);
4370

4471
// power on module
45-
pinMode(_powerOnPin, OUTPUT);
46-
digitalWrite(_powerOnPin, HIGH);
47-
48-
if (_resetPin > -1 && restart) {
49-
pinMode(_resetPin, OUTPUT);
50-
digitalWrite(_resetPin, HIGH);
51-
delay(100);
52-
digitalWrite(_resetPin, LOW);
72+
if (!isPowerOn()) {
73+
digitalWrite(_powerOnPin, HIGH);
74+
delay(150); // Datasheet says power-on pulse should be >=150ms, <=3200ms
75+
digitalWrite(_powerOnPin, LOW);
76+
setVIntPin(SARA_VINT_ON);
5377
} else {
5478
if (!autosense()) {
5579
return 0;
@@ -78,13 +102,29 @@ int ModemClass::begin(bool restart)
78102
return 1;
79103
}
80104

105+
int ModemClass::shutdown()
106+
{
107+
// AT command shutdown
108+
if (isPowerOn()) {
109+
send("AT+CPWROFF");
110+
if (waitForResponse(40000) != 1) {
111+
return 0;
112+
}
113+
setVIntPin(SARA_VINT_OFF);
114+
}
115+
return 1;
116+
}
117+
81118
void ModemClass::end()
82119
{
83120
_uart->end();
84-
digitalWrite(_resetPin, HIGH);
85-
86-
// power off module
87-
digitalWrite(_powerOnPin, LOW);
121+
// Hardware pin power off
122+
if (isPowerOn()) {
123+
digitalWrite(_powerOnPin, HIGH);
124+
delay(1500); // Datasheet says power-off pulse should be >=1500ms
125+
digitalWrite(_powerOnPin, LOW);
126+
setVIntPin(SARA_VINT_OFF);
127+
}
88128
}
89129

90130
void ModemClass::debug()
@@ -340,4 +380,4 @@ void ModemClass::setBaudRate(unsigned long baud)
340380
_baud = baud;
341381
}
342382

343-
ModemClass MODEM(SerialSARA, 115200, SARA_RESETN, SARA_PWR_ON);
383+
ModemClass MODEM(SerialSARA, 115200, SARA_RESETN, SARA_PWR_ON, SARA_VINT);

src/Modem.h

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,26 @@
2525

2626
#include <Arduino.h>
2727

28+
/* The NB 1500 does not connect the SARA V_INT pin so that it can be monitored.
29+
The below constants and associated code enables connecting SARA_VINT to a digital input
30+
using a level shifter (1.8V to 5V) or simply a MOS transistor, say a 2N7000.
31+
The code does rudimentary tracking of the on/off state if this is not available.
32+
*/
33+
#define SARA_VINT_OFF (-1)
34+
#define SARA_VINT_ON (-2)
35+
36+
#ifndef SARA_VINT
37+
#define SARA_VINT SARA_VINT_OFF
38+
#endif
39+
2840
class ModemUrcHandler {
2941
public:
3042
virtual void handleUrc(const String& urc) = 0;
3143
};
3244

3345
class ModemClass {
3446
public:
35-
ModemClass(Uart& uart, unsigned long baud, int resetPin, int powerOnPin);
47+
ModemClass(Uart& uart, unsigned long baud, int resetPin, int powerOnPin, int vIntPin=SARA_VINT);
3648

3749
int begin(bool restart = false);
3850
void end();
@@ -45,6 +57,9 @@ class ModemClass {
4557

4658
int noop();
4759
int reset();
60+
int shutdown();
61+
int isPowerOn();
62+
void setVIntPin(int vIntPin);
4863

4964
size_t write(uint8_t c);
5065
size_t write(const uint8_t*, size_t);
@@ -69,6 +84,7 @@ class ModemClass {
6984
unsigned long _baud;
7085
int _resetPin;
7186
int _powerOnPin;
87+
int _vIntPin;
7288
unsigned long _lastResponseOrUrcMillis;
7389

7490
enum {

src/NB.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -124,17 +124,17 @@ int NB::isAccessAlive()
124124

125125
bool NB::shutdown()
126126
{
127-
if (_state == NB_READY) {
128-
MODEM.send("AT+CPWROFF");
129-
MODEM.waitForResponse(40000);
127+
// Attempt AT command shutdown
128+
if (_state == NB_READY && MODEM.shutdown()) {
129+
_state = NB_OFF;
130+
return true;
130131
}
131-
MODEM.end();
132-
_state = NB_OFF;
133-
return true;
132+
return false;
134133
}
135134

136135
bool NB::secureShutdown()
137136
{
137+
// Hardware power off
138138
MODEM.end();
139139
_state = NB_OFF;
140140
return true;

0 commit comments

Comments
 (0)