+nRF24L01 mit Python3

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
HeAdLeSs
User
Beiträge: 22
Registriert: Dienstag 8. März 2016, 09:22

Hallo zusammen.

Ich brauch mal eure Hilfe.

Ich versuche einen +nRF24L01 unter Python3 zum laufen zu kriegen. Aber es funktioniert irgendwie nicht.
Ich habe mittlerweile so viele Libraries probiert, das ich schon gar nicht mehr sagen kann von wo ich es nun installiert habe.
Die Hardware habe ich mit einem Arduino getestet, die läuft.

Hier ist mein Testscript:

Code: Alles auswählen

import RPi.GPIO as GPIO
from libs.lib_nrf24 import NRF24
import time
import spidev
from time import gmtime, strftime
pipes = [[0xf0, 0xf0, 0xf0, 0xf0, 0xe1], [0xf0, 0xf0, 0xf0, 0xf0, 0xd2]]
gpio_pin = 22
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
print(spidev.SpiDev())
radio = NRF24(GPIO, spidev.SpiDev())
radio.begin(0, gpio_pin)
radio.enableDynamicPayloads()
radio.setRetries(15, 15)
radio.setPayloadSize(32)
radio.setChannel(20)
radio.setDataRate(NRF24.BR_250KBPS)
radio.setPALevel(NRF24.PA_LOW)
radio.setCRCLength(NRF24.CRC_8)
radio.setAutoAck(1)
radio.openWritingPipe(pipes[1])
radio.openReadingPipe(1, pipes[0])
radio.enableAckPayload()
radio.printDetails()
radio.stopListening()
print("Payload size: " + str(radio.getPayloadSize()))
buf = bytes("4|1|255|255|255|255|127|0|0|0", "UTF-8")
# send a packet to receiver
radio.write(buf)
# did it return with a payload?
pipe = [0]
radio.startListening()
timeout_counter = 0
timeout = False
while not radio.available(pipe):
    time.sleep(10000 / 1000000.0)
    if timeout_counter == 100:
        timout = True
        break
    else:
        timeout_counter += 1
if timeout == True:
    print("timeout")
else:
    recv_buffer = []
    radio.read(recv_buffer, radio.getDynamicPayloadSize())
    recv = ""
    for c in recv_buffer:
        recv += chr(c)
    print(recv)
Die Ausgabe sieht wie folgt aus:
pi@RPI2:~/bob2 $ sudo python3 test8.py
STATUS = 0x03 RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=1 TX_FULL=1
RX_ADDR_P0-1 = 0xfefefefefe 0xfefefefefc

RX_ADDR_P2-5 =
0xf8
0xf9
0xf9
0xf9


TX_ADDR =
0xfefefefefe

RX_PW_P0-6 =
0x0c
0x0c
0x00
0x00
0x00
0x00


EN_AA = 0x0f
EN_RXADDR = 0x00
RF_CH = 0x07
RF_SETUP = 0x03
CONFIG = 0x03

DYNPD/FEATURE =
0x03
0x01

Data Rate = 1MBPS
Model = nRF24L01
CRC Length = Disabled
PA Power = PA_LOW
Die Hardware scheint er zu erkennen, aber wie man ziemlich gut sieht werden die Einstellungen des 'radio' nicht übernommen. Zum Beispiel an der Data Rate oder PA Power erkennt man es gut. Ich konnte aber nicht rausfinden warum es nicht übernommen wird. Es gibt auch keine Fehlermeldung oder sonst irgendwas.

Hat zufällig jemand das gute Stück bei sich unter Python3 am laufen? Oder hat eine Idee was es sein könnte?

Es ist an einem RPi2 mit Raspbian Strech Lite.

Danke schon mal und beste Grüße
HeAdLeSs
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist alles kraut und rueben. Ein bisschen aufraeumen und nur das zeigen, was wirklich wichtig ist, kann nicht schaden.

Was aber sofort ins Auge sticht:

Code: Alles auswählen

buf = bytes("4|1|255|255|255|255|127|0|0|0", "UTF-8")
Das macht ganz bestimmt nicht das, was du haben moechtest. Du willst doch garantiert die entsprechenden Bytes mit den Werten 4, 1, 255 etc verschicken.

Was du da aber zusammenbaust ist ein ASCII-String (UTF-8 spielt da keine Rolle) mit 52 statt 4, 49 statt 1 etc. Und dazwischen auch noch munter Pipe-Zeichen (124) gestreut. Warum machst du nicht einfach

Code: Alles auswählen

buf = bytes([4, 1, 255, ...])
?
HeAdLeSs
User
Beiträge: 22
Registriert: Dienstag 8. März 2016, 09:22

Hallo deets.
Was ist denn Unwichtig? Gut, den Teil nach den Settings hätte ich weglassen können... wie es gesendet und empfangen wird, wäre egal gewesen. Kann ich jetzt aber leider nicht mehr editieren.

Der zu sendende String passt so schon. Hätte aber mit dem eigentlichen Problem auch nichts zu tun.
Antworten