Cannot get Pico LTE to connect

I’ve been trying to get this to connect. All looks fine with the sim - it is green in the dashboard (active) and there is 1GB remaining.

I see this after many hours and many reboots. I know from the UK o2 LTE-M map that I should be covered in postcode SW15 6BF. Is there an AT command put the modem back to factory state as shipped, in case something has become mangled?

MPY: soft reboot
DEBUG: Response: [‘AT+CSQ\r\r\n+CSQ: 31,99\r\n\r\nOK\r\n’]
DEBUG: Processed: [‘AT+CSQ\r’, ‘+CSQ: 31,99’, ‘OK’]
{‘response’: [‘AT+CSQ\r’, ‘+CSQ: 31,99’, ‘OK’], ‘status’: 0}

MPY: soft reboot
DEBUG: Response: [‘AT+CREG?\r\r\n+CREG: 0,2\r\n\r\nOK\r\n’]
DEBUG: Processed: [‘AT+CREG?\r’, ‘+CREG: 0,2’, ‘OK’]
{‘response’: [‘AT+CREG?\r’, ‘+CREG: 0,2’, ‘OK’], ‘status’: 0}

MPY: soft reboot
DEBUG: Response: [‘AT+QNWINFO\r\r\n+QNWINFO: No Service\r\n\r\nOK\r\n’]
DEBUG: Processed: [‘AT+QNWINFO\r’, ‘+QNWINFO: No Service’, ‘OK’]
{‘response’: [‘AT+QNWINFO\r’, ‘+QNWINFO: No Service’, ‘OK’], ‘status’: 0}

To reset to the factory settings, “AT&F” command can be used. For detailed information, look section 2.10 of AT Command Manual.

I also suggest you take a look at the Troubleshooting page: Troubleshooting (sixfab.com)

Thanks, I had been following the troubleshooting steps. I think the factory reset may have resurrected it. But it still acts oddly, taking a very long while to find a signal – not possible indoors, though, where I am. But supposedly it should be possible. I am seeing all of this now with the device outside on my balcony.

MPY: soft reboot
DEBUG: Response: [‘AT+QNWINFO\r\r\n+QNWINFO: “eMTC”,“23410”,“LTE BAND 20”,6400\r\n\r\nOK\r\n’]
DEBUG: Processed: [‘AT+QNWINFO\r’, ‘+QNWINFO: “eMTC”,“23410”,“LTE BAND 20”,6400’, ‘OK’]
{‘response’: [‘AT+QNWINFO\r’, ‘+QNWINFO: “eMTC”,“23410”,“LTE BAND 20”,6400’, ‘OK’], ‘status’: 0}

MPY: soft reboot
DEBUG: Response: [‘AT+COPS?\r\r\n+COPS: 0,0,“O2 - UK”,8\r\n\r\nOK\r\n’]
DEBUG: Processed: [‘AT+COPS?\r’, ‘+COPS: 0,0,“O2 - UK”,8’, ‘OK’]
{‘response’: [‘AT+COPS?\r’, ‘+COPS: 0,0,“O2 - UK”,8’, ‘OK’], ‘status’: 0}

MPY: soft reboot
DEBUG: Response: [‘AT+CREG?\r\r\n+CREG: 0,5\r\n\r\nOK\r\n’]
DEBUG: Processed: [‘AT+CREG?\r’, ‘+CREG: 0,5’, ‘OK’]
{‘response’: [‘AT+CREG?\r’, ‘+CREG: 0,5’, ‘OK’], ‘status’: 0}

MPY: soft reboot
DEBUG: Response: [‘AT+CSQ\r\r\n+CSQ: 17,99\r\n\r\nOK\r\n’]
DEBUG: Processed: [‘AT+CSQ\r’, ‘+CSQ: 17,99’, ‘OK’]
{‘response’: [‘AT+CSQ\r’, ‘+CSQ: 17,99’, ‘OK’], ‘status’: 0}

Oh dear. This seems to be all over the place. I have successfully sent a few test messages to webhook.site but after 3 or 4 the connection goes. My CSQ numbers seem to be all over the place … currently 8,6 ! And No Network on QWINFO. Factory reset does not fix. A total repower sometimes get me back a connection (after a while) but most often not. Device is stationary, outside with what purports to be a strong signal (sometime I get CSQ 31).

I also get odd behaviour here … after I issue “AT+COPS=?” the board is unresponsive until I power-cycle. What is happening here? The blue led is still flashing,

MPY: soft reboot
DEBUG: Response: [‘AT+COPS=?\r’]
DEBUG: Processed: [‘AT+COPS=?\r’]
{‘response’: ‘timeout’, ‘status’: 2}

Bit stuck now. Flakey device? Flakey service? What can I do to further debug?

Thanks.

Pat

Hi @pat.molloy,

General question for UK, from AT+COPS=? do you just get O2 (23410) or have you ever seen Vodafone come up? I am using alt hardware/SIM, but having trouble with network registration (sometimes 2-3 minutes). CSQ of 27 and other checks seem fine.

I would like to try the Pico LTE, but I’m concerned it will fall at the first if O2 if network is actually not ready yet.

Hi @gavin67890,

I’m having a bit of a mare with it again. Cannot get connected to anything just at the moment. Once I do (and assuming I can) I’ll report back.

I’m finding it all a bit flakey!

Pat

I am pretty sure this is all I have ever seen … I’m in Central London …

DEBUG: Response: [‘\r\n+QNWINFO: “EDGE”,“23410”,“GSM 900”,120\r\n\r\nOK\r\n’]
DEBUG: Processed: [‘+QNWINFO: “EDGE”,“23410”,“GSM 900”,120’, ‘OK’]
{‘response’: [‘+QNWINFO: “EDGE”,“23410”,“GSM 900”,120’, ‘OK’], ‘status’: 0}

From my SIM supplier:

In regards to the issue with O2, they have denied all roaming partners access to the LTE-M network. At this point we have no timeline at all for resolving this issue.

O2 is 23410 in your debug. If I switch to mixed or NB-IoT only, I can see Vodafone. If I run command: AT+COPS=1,2,"23415",9 it will hold the session. O2 on LTE-M just creates and deletes session repeatedly.

Thanks @gavin67890

I’ll give this a shot tomorrow when I am back in the office.

Pat

So … success, I think … although I want to see if I can actually shift some data across the connection …

%Run -c $EDITOR_CONTENT
DEBUG: Response: [‘\r\n+CSQ: 13,99\r\n\r\nOK\r\n’]
DEBUG: Processed: [‘+CSQ: 13,99’, ‘OK’]
{‘response’: [‘+CSQ: 13,99’, ‘OK’], ‘status’: 0}
%Run -c $EDITOR_CONTENT
DEBUG: Response: [‘\r\n+CREG: 0,3\r\n\r\nOK\r\n’]
DEBUG: Processed: [‘+CREG: 0,3’, ‘OK’]
{‘response’: [‘+CREG: 0,3’, ‘OK’], ‘status’: 0}
%Run -c $EDITOR_CONTENT
DEBUG: Response: [‘\r\n+QNWINFO: “NBIoT”,“23430”,“LTE BAND 3”,1526\r\n\r\nOK\r\n’]
DEBUG: Processed: [‘+QNWINFO: “NBIoT”,“23430”,“LTE BAND 3”,1526’, ‘OK’]
{‘response’: [‘+QNWINFO: “NBIoT”,“23430”,“LTE BAND 3”,1526’, ‘OK’], ‘status’: 0}

Interesting, 23430 is not O2 (23410/band 20) and not Vodafone (23415). If you do a AT+COPS=? it might show the long operator code. A lookup of 23430 here shows EE, which would be good news to have another of the big four offering coverage in UK.

I am finding this device terribly hit and miss … here are a few logs from earlier … just a little test program sending some sensor reading to a webhook (sometimes!) These 707 errors pop in and out at random …

%Run -c $EDITOR_CONTENT
INFO: Point 1
INFO: Point 2
INFO: Point 3
INFO: Point 4
INFO: Sending a POST request.
INFO: 21/11/2023 13:58:26
20.86 1016.94 41.33
TMP102 Temperature: 21.81 °C
BME280 Temperature: 20.86 °C Humidity: 41.33 % Pressure: 1016.94 hPa
INFO: {“BME280Temperature”: 20.86, “timeOfRequest”: [2023, 11, 21, 13, 58, 26, 1, 325], “BME280Humidity”: 41.33, “date”: “21/11/2023 13:58:26”, “BME280Pressure”: 1016.94, “message”: “SixFab PicoLTE HTTP Post Example”, “TMP102Temperature”: 21.8125}
INFO: {‘response’: [‘OK’, ‘+QHTTPPOST: 0,200’], ‘status’: 0}
INFO: Post request succeeded.
INFO: {‘response’: [‘OK’, ‘+QHTTPREAD: 0’], ‘status’: 0}

%Run -c $EDITOR_CONTENT
INFO: Point 1
INFO: Point 2
INFO: Point 3
INFO: Point 4
INFO: Sending a POST request.
INFO: 21/11/2023 14:44:08
21.15 1017.54 36.88
TMP102 Temperature: 21.88 °C
BME280 Temperature: 21.15 °C Humidity: 36.88 % Pressure: 1017.54 hPa
INFO: {“BME280Temperature”: 21.15, “timeOfRequest”: [2023, 11, 21, 14, 44, 8, 1, 325], “BME280Humidity”: 36.88, “date”: “21/11/2023 14:44:08”, “BME280Pressure”: 1017.54, “message”: “SixFab PicoLTE HTTP Post Example”, “TMP102Temperature”: 21.875}
INFO: {‘response’: [‘+CME ERROR: 707’], ‘status’: 1}
INFO: {‘response’: ‘timeout’, ‘status’: 2}

%Run -c $EDITOR_CONTENT
INFO: Point 1
INFO: Point 2
INFO: Point 3
INFO: Point 4
INFO: Sending a POST request.
INFO: 21/11/2023 15:08:15
21.26 1017.96 36.57
TMP102 Temperature: 22.06 °C
BME280 Temperature: 21.26 °C Humidity: 36.57 % Pressure: 1017.96 hPa
INFO: {“BME280Temperature”: 21.26, “timeOfRequest”: [2023, 11, 21, 15, 8, 15, 1, 325], “BME280Humidity”: 36.57, “date”: “21/11/2023 15:08:15”, “BME280Pressure”: 1017.96, “message”: “SixFab PicoLTE HTTP Post Example”, “TMP102Temperature”: 22.0625}
INFO: {‘response’: [‘+CME ERROR: 707’], ‘status’: 1}
INFO: {‘response’: ‘timeout’, ‘status’: 2}

%Run -c $EDITOR_CONTENT
INFO: Point 1
INFO: Point 2
INFO: Point 3
INFO: Point 4
INFO: Sending a POST request.
INFO: 21/11/2023 15:23:42
21.09 1018.03 37.9
TMP102 Temperature: 21.88 °C
BME280 Temperature: 21.09 °C Humidity: 37.90 % Pressure: 1018.03 hPa
INFO: {“BME280Temperature”: 21.09, “timeOfRequest”: [2023, 11, 21, 15, 23, 42, 1, 325], “BME280Humidity”: 37.9, “date”: “21/11/2023 15:23:42”, “BME280Pressure”: 1018.03, “message”: “SixFab PicoLTE HTTP Post Example”, “TMP102Temperature”: 21.875}
INFO: {‘response’: [‘OK’, ‘+QHTTPPOST: 0,200’], ‘status’: 0}
INFO: Post request succeeded.
INFO: {‘response’: [‘OK’, ‘+QHTTPREAD: 0’], ‘status’: 0}

%Run -c $EDITOR_CONTENT
DEBUG: Response: [‘\r\n+QNWINFO: “EDGE”,“23410”,“GSM 900”,120\r\n\r\nOK\r\n’]
DEBUG: Processed: [‘+QNWINFO: “EDGE”,“23410”,“GSM 900”,120’, ‘OK’]
{‘response’: [‘+QNWINFO: “EDGE”,“23410”,“GSM 900”,120’, ‘OK’], ‘status’: 0}

%Run -c $EDITOR_CONTENT
DEBUG: Response: [‘\r\n+CREG: 0,5\r\n\r\nOK\r\n’]
DEBUG: Processed: [‘+CREG: 0,5’, ‘OK’]
{‘response’: [‘+CREG: 0,5’, ‘OK’], ‘status’: 0}

%Run -c $EDITOR_CONTENT
DEBUG: Response: [‘\r\n+CSQ: 24,99\r\n\r\nOK\r\n’]
DEBUG: Processed: [‘+CSQ: 24,99’, ‘OK’]
{‘response’: [‘+CSQ: 24,99’, ‘OK’], ‘status’: 0}

In case it helps, in the manual for the modem there is a summary of error codes:
707 HTTP(S) network open failed

Looking at the block 3rd from bottom, suggests operator O2 (23410) over EDGE in use. Assuming you have some control over the AT commands, perhaps try fixing the technology and/or operator.

I heard that O2 are not supporting roaming operators on LTE-M at the moment, which I have experienced. Although also O2, your comms over Edge might be ok, but I am a little suspicious you are only sometimes getting the messages away before maybe the session is dropped.

If you can run an AT+COPS=? (with pause/wait for response), it should list the operators available to play with.

I think AT+QCFG (maybe branched after AT+QCFG) would allow toggling of say Edge only vs eMTC (LTE-M?) vs NB-IoT to test/investigate.

Hi @gavin67890

Thanks again. I’ll give all of this a shot … I have a little debug script that allows me to send AT commands and see the output. I initially thought it was a dud board, but I bought another and it’s the same. So it’s either coverage, operator or tech.

Will report back. I’m in Central London so would expect most things just to work!

Hi @gavin67890,

Here is what I see …

DEBUG: Response: [‘AT+COPS=?\r’]
DEBUG: Processed: [‘AT+COPS=?\r’]
DEBUG: Response: [‘\r\n+COPS: (1,“O2 - UK”,“O2 - UK”,“23410”,0),(1,“vodafone UK”,“voda UK”,“23415”,9),(1,“O2 - UK”,“O2 - UK”,“23410”,8),(1,“EE”,“EE”,“23430”,9),(1,“EE”,“EE”,“23430”,0),(1,“vodafone UK”,“voda UK”,“23415”,0),(0,1,2,3,4),(0,1,2)\r\n\r\nOK\r\n’]
DEBUG: Processed: [‘AT+COPS=?\r’, ‘+COPS: (1,“O2 - UK”,“O2 - UK”,“23410”,0),(1,“vodafone UK”,“voda UK”,“23415”,9),(1,“O2 - UK”,“O2 - UK”,“23410”,8),(1,“EE”,“EE”,“23430”,9),(1,“EE”,“EE”,“23430”,0),(1,“vodafone UK”,“voda UK”,“23415”,0),(0,1,2,3,4),(0,1,2)’, ‘OK’]
{‘response’: [‘AT+COPS=?\r’, ‘+COPS: (1,“O2 - UK”,“O2 - UK”,“23410”,0),(1,“vodafone UK”,“voda UK”,“23415”,9),(1,“O2 - UK”,“O2 - UK”,“23410”,8),(1,“EE”,“EE”,“23430”,9),(1,“EE”,“EE”,“23430”,0),(1,“vodafone UK”,“voda UK”,“23415”,0),(0,1,2,3,4),(0,1,2)’, ‘OK’], ‘status’: 0

I had to increase the timeout value massively in a file called pico_lte\utils\atcom.py

Great. Just FYI, the max response time for a “test” command to return on my modem is 45s and yours is apparently 180s. I’ve reordered the list of availables as follows:

# GSM (0)
  (1,“O2 - UK”,“O2 - UK”,“23410”,0)
, (1,“vodafone UK”,“voda UK”,“23415”,0)
, (1,“EE”,“EE”,“23430”,0)
# eMTC/LTE-M (8)
, (1,“O2 - UK”,“O2 - UK”,“23410”,8)
# NB-IoT (9)
, (1,“vodafone UK”,“voda UK”,“23415”,9)
, (1,“EE”,“EE”,“23430”,9)

I’m thinking that you are connecting on (1,“O2 - UK”,“O2 - UK”,“23410”,0). If you are now able to run AT+COPS?, instead of AT+COPS=?, it should confirm the network actually in use.

Comparing documentation (for your BG95-M3 and my SIM7080G ) the “write” command is almost the same, so AT+COPS=<mode>[,<format>[,<oper>[,<Act>]]] would have the following possible combinations:

<mode> = 1
<format> = 2
<oper> = "23410", "23415", "23430"
<act> =  0 GSM, 8 eMTC, 9 NB-IoT (my modem uses 7 LTE-M, yours 8)

I first tried ‘AT+COPS=1,2,“23410”,7’ (SIM708G), but I could see in the provider portal endless sessions were being created and deleted. I switched to ‘AT+COPS=1,2,“23415”,9’, which was stable although only NB-IoT (for now).

Assuming you are wanting to test LTE-M/NB-IoT, rather than GSM, your three “write” options:
‘AT+COPS=1,2,“23410”,8’
‘AT+COPS=1,2,“23415”,9’
‘AT+COPS=1,2,“23430”,9’

Please keep me posted how you get on.

Some progress … this one is working. I also had a go at Voda NBIoT but got CME 30’s all the way … more to follow. I’m being lazy copy/pasting the actual output … hence all the duplicates!

%Run -c $EDITOR_CONTENT
DEBUG: Response: [‘AT+COPS=1,2,“23410”,8\r’]
DEBUG: Processed: [‘AT+COPS=1,2,“23410”,8\r’]
DEBUG: Response: [‘\r\n+CME ERROR: 30\r\n’]
DEBUG: Processed: [‘AT+COPS=1,2,“23410”,8\r’, ‘+CME ERROR: 30’]
{‘response’: [‘AT+COPS=1,2,“23410”,8\r’, ‘+CME ERROR: 30’], ‘status’: 1}

%Run -c $EDITOR_CONTENT
DEBUG: Response: [‘AT+COPS=1,2,“23410”,8\r’]
DEBUG: Processed: [‘AT+COPS=1,2,“23410”,8\r’]
DEBUG: Response: [‘\r\nOK\r\n’]
DEBUG: Processed: [‘AT+COPS=1,2,“23410”,8\r’, ‘OK’]
{‘response’: [‘AT+COPS=1,2,“23410”,8\r’, ‘OK’], ‘status’: 0}

%Run -c $EDITOR_CONTENT
DEBUG: Response: [‘AT+COPS?\r\r\n+COPS: 1\r\n\r\nOK\r\n’]
DEBUG: Processed: [‘AT+COPS?\r’, ‘+COPS: 1’, ‘OK’]
{‘response’: [‘AT+COPS?\r’, ‘+COPS: 1’, ‘OK’], ‘status’: 0}

%Run -c $EDITOR_CONTENT
DEBUG: Response: [‘AT+QNWINFO\r\r\n+QNWINFO: “eMTC”,“23410”,“LTE BAND 20”,6400\r\n\r\nOK\r\n’]
DEBUG: Processed: [‘AT+QNWINFO\r’, ‘+QNWINFO: “eMTC”,“23410”,“LTE BAND 20”,6400’, ‘OK’]
{‘response’: [‘AT+QNWINFO\r’, ‘+QNWINFO: “eMTC”,“23410”,“LTE BAND 20”,6400’, ‘OK’], ‘status’: 0}

Unfortunately, whilst the network connection seems fine and stays up … I never get past debug point 3 below in my little network test script. So it hangs at “picoLTE.network.register_network()” … script does not return even after 60 mins!

import machine
import json
import time
import bme280

from pico_lte.utils.status import Status
from pico_lte.core import PicoLTE
from pico_lte.common import debug

debug.info(“Point 1”)

picoLTE = PicoLTE()

debug.info(“Point 2”)

i2c = machine.I2C(0, scl=machine.Pin(13), sda=machine.Pin(12), freq=100000)
tmp102_address = 0x48 # TMP102 I2C address (default set to 0x48).

bme = bme280.BME280(i2c=i2c) #BME280 object created

local_time = time.localtime()

debug.info(“Point 3”)
picoLTE.network.register_network()
debug.info(“Point 4”)