Wireless Chat Using NRF24L01+ 2.4GHz RF Transceiver on Arduino & Raspberry Pi Ubuntu Linux
After a bit of success implementing an Arduino 2.4GHz Transceiver , I was encouraged to explore a more familiar environment, something with Python and Linux in the mix.
After a short period of research I landed on the circuitpython-nrf24l01 pypi project page, and quickly began digging through their examples .
It wasn’t long after I had a working prototype that mirrored my Arduino code quite closely:
Components
- CanaKit Raspberry Pi Zero W (Wireless) Complete Starter Kit - 16 GB Edition
- RF24L01+ 2.4GHz Wireless RF Transceiver Module
import sys
import select
from circuitpython_nrf24l01 import RF24
import board
import digitalio as dio
# addresses needs to be in a buffer protocol object (bytearray)
address = b'Nessy'
# change these (digital output) pins accordingly
ce = dio.DigitalInOut(board.D4)
csn = dio.DigitalInOut(board.D5)
# using board.SPI() automatically selects the MCU's
# available SPI pins, board.SCK, board.MOSI, board.MISO
spi = board.SPI() # init spi bus object
# initialize the nRF24L01 on the spi bus object
nrf = RF24(spi, csn, ce, ask_no_ack=False, data_rate=250)
nrf.dynamic_payloads = False # this is the default in the TMRh20 arduino library
nrf.payload_length = 32
# get username
username = input('Enter Username: ')
# set address of RX node into a TX pipe
nrf.open_tx_pipe(address)
# set address of TX node into a RX pipe
nrf.open_rx_pipe(1, address)
nrf.listen = True
print('Welcome %s' % username)
while True:
# handle write
if select.select([sys.stdin,],[],[],0.0)[0]:
nrf.listen = False
for line in sys.stdin:
msg = b'[%b] %b' % (username.encode(), line.rstrip().encode())
nrf.send(msg)
break
# handle recieve
if not nrf.listen:
nrf.listen = True
if nrf.any():
# retreive the received packet's payload
buffer = nrf.recv()
data = buffer.decode().replace('\x00', '')
print(data)