Connecting Nordic’s new nRF9151 to Golioth
We got an early look at Nordic’s new cellular modem, the nRF9151, and it already works with Golioth!
With any new board, we ask ourselves “can we connect it to Golioth?”. You may remember a similar post when the nRF7002-DK first came out. Of course the answer for these two boards, and pretty much all other network-enabled embedded systems, is: yes, you can use them with Golioth. So today we’ll walk though the experience of connecting the nRF9151 to Golioth for the first time.
What’s new with the nRF9151?
We love the nRF9160 cellular modem and have support for it in all of the Golioth Firmware SDK samples, as well as using it in the Hardware-in-the-Loop (HIL) testing that is connected to our continuous integration infrastructure. So what’s the deal with the new part?
Most obviously, it’s really really small. The 9151 is about a 20% size reduction from the 9160 (new dimensions are approximately 11×12 mm). Here you can see it’s smaller than the fingernail on my pointer finger. The smaller sized also delivers lower peak current consumption. As with the recently announced nRF9161, the nRF9151 supports DECT NR+. And Nordic indicates the new design is fully compatible with the existing nRF91 family of chips.
This is also the first Nordic dev board I’ve seen that uses a USB-C connector. While you can’t get your hands on one of these just yet, since Golioth is partners with Nordic they were kind enough to send us one of these nRF9151 Development Kits to take for a test drive.
Building Golioth examples with the nRF9151
This board is not yet available to order, but support has already been added to Zephyr. To get it working with Golioth, we needed a fix that Nordic merged after their v2.6.1 release of the nRF Connect SDK (NCS). So today I’ll be checking out a commit in between releases. When Nordic releases v2.7.0 everything will work without this extra step.
0. Install the Golioth Firmware SDK
You will need an NCS build environment along with the Golioth SDK. You can follow the Golioth Docs to install an NCS workspace, or add Golioth to your existing NCS workspace.
1. Update NCS version (if needed)
If you are using NCS v2.7.0 (not yet released at the time of writing) or newer, you can skip this step. Otherwise, edit your west manifest and update the NCS version. Below is the west-nrf.yml file from the Golioth SDK with the changed line highlighted.
manifest: projects: - name: nrf revision: 85097eb933d93374fe270ce4c004bea10ee80e97 url: http://github.com/nrfconnect/sdk-nrf import: true self: path: modules/lib/golioth-firmware-sdk
This happened to be the commit at the tip of main when writing this post. We usually recommend against targeting commits in between releases, so consider this experimental.
2. Add a board Kconfig file for the nRF9151
Add the board-specific configuration to the boards’ directory. For today’s post, I’m building the Golioth stream sample so I’ve added this nrf9151dk_nrf9151_ns.conf
board file to that sample directory.
# General config CONFIG_HEAP_MEM_POOL_SIZE=4096 CONFIG_NEWLIB_LIBC=y # Networking CONFIG_NET_SOCKETS_OFFLOAD=y CONFIG_NET_IPV6=y CONFIG_NET_IPV6_NBR_CACHE=n CONFIG_NET_IPV6_MLD=n # Increase native TLS socket implementation, so that it is chosen instead of # offloaded nRF91 sockets CONFIG_NET_SOCKETS_TLS_PRIORITY=35 # Modem library CONFIG_NRF_MODEM_LIB=y CONFIG_NRF_MODEM_LIB_ON_FAULT_APPLICATION_SPECIFIC=y # LTE connectivity with network connection manager CONFIG_NRF_MODEM_LIB_NET_IF=y CONFIG_NRF_MODEM_LIB_NET_IF_AUTO_START=y CONFIG_NRF_MODEM_LIB_NET_IF_AUTO_CONNECT=y CONFIG_NRF_MODEM_LIB_NET_IF_AUTO_DOWN=y CONFIG_NET_CONNECTION_MANAGER=y CONFIG_NET_CONNECTION_MANAGER_MONITOR_STACK_SIZE=1024 # Increased sysworkq size, due to LTE connectivity CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048 # Disable options y-selected by NCS for no good reason CONFIG_MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED=n CONFIG_MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED=n # Generate MCUboot compatible images CONFIG_BOOTLOADER_MCUBOOT=y
3. Build the Golioth stream sample
Building and running this sample is now quite simple. I have included the option to use runtime credentials in this build so that we can provision the device from the Zephyr shell.
$ cd examples/zephyr/stream $ west build -b nrf9151dk/nrf9151/ns -- -DEXTRA_CONF_FILE=../common/runtime_settings.conf $ west flash
4. Provision and run the sample
Golioth is free for individual use so sign up for an account if you have not already done so. After creating a project and device we can provision the PSK-ID/PSK by opening a serial connection to the device.
uart:~$ settings set golioth/psk-id <your-psk-id> uart:~$ settings set golioth/psk <your-psk>
Here’s the terminal output during my tests:
*** Booting nRF Connect SDK v2.6.99-85097eb933d9 *** *** Using Zephyr OS v3.6.99-18285a0ea4b9 *** [00:00:00.538,452] <inf> fs_nvs: 2 Sectors of 4096 bytes [00:00:00.538,482] <inf> fs_nvs: alloc wra: 0, fb8 [00:00:00.538,482] <inf> fs_nvs: data wra: 0, 68 [00:00:00.538,879] <dbg> golioth_stream: main: Start Golioth stream sample [00:00:00.539,001] <inf> golioth_samples: Bringing up network interface [00:00:00.539,001] <inf> golioth_samples: Waiting to obtain IP address [00:00:01.691,894] <inf> lte_monitor: Network: Searching uart:~$ settings set golioth/psk-id 20240603190757-nrf9151dk@nrf9151-demo Setting golioth/psk-id to 20240603190757-nrf9151dk@nrf9151-demo Setting golioth/psk-id saved as 20240603190757-nrf9151dk@nrf9151-demo uart:~$ settings set golioth/psk e487ea809e5fa705c2af4050150f822c Setting golioth/psk to e487ea809e5fa705c2af4050150f822c Setting golioth/psk saved as e487ea809e5fa705c2af4050150f822c [00:01:10.748,168] <inf> lte_monitor: Network: Registered (roaming) [00:01:10.748,901] <inf> golioth_mbox: Mbox created, bufsize: 1232, num_items: 10, item_size: 112 [00:01:12.994,964] <inf> golioth_coap_client_zephyr: Golioth CoAP client connected [00:01:12.995,025] <inf> golioth_stream: Sending temperature 20.000000 (sync) [00:01:12.995,269] <inf> golioth_stream: Golioth client connected [00:01:12.995,269] <inf> golioth_coap_client_zephyr: Entering CoAP I/O loop [00:01:13.543,975] <dbg> golioth_stream: temperature_push_cbor: Temperature successfully pushed [00:01:18.544,067] <inf> golioth_stream: Sending temperature 20.500000 (async) [00:01:20.953,582] <wrn> golioth_coap_client: Resending request 0x2001e2c0 (reply 0x2001e308) (retries 2) [00:01:23.544,311] <inf> golioth_stream: Sending temperature 21.000000 (sync) [00:01:25.544,677] <wrn> golioth_stream: Failed to push temperature: 9 [00:01:25.772,186] <wrn> golioth_coap_client: Resending request 0x2001e2c0 (reply 0x2001e308) (retries 1) [00:01:25.947,631] <wrn> golioth_coap_client: Resending request 0x2001e440 (reply 0x2001e488) (retries 2) [00:01:30.544,738] <inf> golioth_stream: Sending temperature 21.500000 (async) [00:01:30.581,359] <dbg> golioth_stream: temperature_async_push_handler: Temperature successfully pushed [00:01:30.949,401] <dbg> golioth_stream: temperature_async_push_handler: Temperature successfully pushed [00:01:35.544,952] <inf> golioth_stream: Sending temperature 22.000000 (sync) [00:01:36.326,812] <dbg> golioth_stream: temperature_push_cbor: Temperature successfully pushed [00:01:41.326,873] <inf> golioth_stream: Sending temperature 22.500000 (async) [00:01:42.582,946] <dbg> golioth_stream: temperature_async_push_handler: Temperature successfully pushed [00:01:46.327,117] <inf> golioth_stream: Sending temperature 23.000000 (sync) [00:01:46.947,204] <dbg> golioth_stream: temperature_push_cbor: Temperature successfully pushed [00:01:51.947,296] <inf> golioth_stream: Sending temperature 23.500000 (async) [00:01:52.718,261] <dbg> golioth_stream: temperature_async_push_handler: Temperature successfully pushed [00:01:56.947,540] <inf> golioth_stream: Sending temperature 24.000000 (sync) [00:01:57.663,665] <dbg> golioth_stream: temperature_push_cbor: Temperature successfully pushed [00:02:02.663,726] <inf> golioth_stream: Sending temperature 24.500000 (async) [00:02:03.725,708] <dbg> golioth_stream: temperature_async_push_handler: Temperature successfully pushed [00:02:07.663,970] <inf> golioth_stream: Sending temperature 25.000000 (sync) [00:02:08.589,111] <dbg> golioth_stream: temperature_push_cbor: Temperature successfully pushed [00:02:13.589,172] <inf> golioth_stream: Sending temperature 25.500000 (async)
5. View the data sent from the device
In the Golioth web console I can navigate to the LightDB Stream
tab for the device and see the data as it arrives on the cloud. Try out Pipelines to transform and send that data to a destination.
What will you do with the nRF9151?
We see a lot of IoT deployments using the nRF9160 to provide a cellular connection. They’re versatile parts with plenty of peripherals. The new nRF9151 part number is nice for your board footprint, and your power budget. And of course, every fleet needs management and data handling. Golioth already works with this SoC and so many more!
Start the discussion at forum.golioth.io