DIY Telemetrie 2.4 gHz

Hallo,

ich bin gerade am entwickeln einer Telemetrie basierend auf dem nRF24L01+ Transceiver (2.4 gHz). Das Ziel ist eine möglichst kostengünstige
drahtlose Datenübertragung. Anwendung sind meine alte BMW R80 ST (Oeltemp. und Batteriespannung drahtlos an den Lenker)
sowie meine Elektrosegler mit dem alten Futaba FASST System. Heute hab ich die ersten HW/SW Test mit dem 2.4 GHz NRF24L01+
Funkmodul gemacht. Mit dem nRF24L01 Transceiver wird über das SPI Interface kommuniziert.
Das Schreiben und Lesen von Registern geht schon mal, zudem mit einer eigenen SPI Routine. Verwendet hab ich einen PIC16F690 für die ersten Tests. Er hat auch einen HW SPI. Für den ersten Test hab ich den HW SPI sowie meine eigene SPI Funktion verwendet. Mit der eigenen SPI Routine kann ich dann mit z. B. einem PIC 12F683 (8 Pins) eine Datenübertragung z. B. der Akkuspannung realisieren. Als Monitor zum lesen der Register verwende ich ein LCD Display als InOpMonitor. Die SW ist mit gcbasic geschrieben.

Siehe auch mein Post http://www.rc-network.de/forum/showthread.php/630243-LiPo-LiFePo-Monitor-mit-PIC16F1705
Datenblatt nRF24L01+ http://www.nordicsemi.com/eng/conte.../file/nRF24L01P_Product_Specification_1_0.pdf

Weitere Details werden folgen.

Gruss Micha

Code:
' nRF24L01 Test 1
' 13.09.2017
'                        ------------
'  V+                  -| 1       20 |- GND
'  PORTA.5             -| 2       19 |- PORTA.0 SER_OUT
'  PORTA.4             -| 3       18 |- PORTA.1
'  PORTA.3             -| 4       17 |- PORTA.2
'  PORTC.5             -| 5       16 |- PORTC.0
'  PORTC.4             -| 6       15 |- PORTC.1
'  PORTC.3         __  -| 7       14 |- PORTC.2
'  PORTC.6         SS  -| 8       13 |- PORTB.4 SDI
'  PORTC.7         SDO -| 9       12 |- PORTB.5
'  PORTB.7         CE  -| 10      11 |- PORTB.6 SCK
'                        ------------
'
'          nRF24L01 Pins top view
' ---------------------------------------
' | GND        1 *    * 2 V3.3P  __      |
' | CE         3 *    * 4 CSN   (SS)     |
' | SCK        5 *    * 6 MOSI  (SDO)    |
' | MISO (SDI) 7 *    * 8 IRQ            |
' |                                      |
' |                         ------       |
' |                        |Quarz |      |
' |                         ------       |
' ---------------------------------------
#chip 16F690,8
#config OSC=INTRC_OSC_NOCLKOUT, PWRTE = ON

#include "C:\gcbasic_src\software_uart_v11.h"
#include "nRF24L01.h"

'nRF24L01 Settings
#define STANDBY_I 0b01111010 'Power up, Interrupt's disabled

'Serial settings
#define BAUD_RATE 2400
#define SER_OUT PORTA.0
dir SER_OUT out

'SPI settings
#define SDO PORTC.7
dir SDO out

#define SDI PORTB.4
dir SDI in

#define SS PORTC.6
dir SS out

#define SCK PORTB.6
dir SCK out

#define CE PORTB.7
dir CE out

dim NRF_Status,Dummy as byte
NRF_Status = 0
Dummy = 0

wait 1 s
LCD_Clear
SerPrint("Test 1.1")
wait 2 s
LCD_Clear

POWER_UP
READ_REG(CONFIG)
LCD_Clear
print_byte(Dummy) 'should be 122 eq. 0b01111010
wait 2 s

Do
 set SS on
 set SS off
 NRF_Status = spi_transfer(WL_NOP) 'Status reg. page 55
 set SS on
 LCD_Clear
 print_byte(NRF_Status) 'should be 14 eq. 0b00001110
 wait 1 s
Loop


'------------------------------------ subs ---------------------------------------
'SPI_CPOL = 0 & SPI_CPHA = 0
function spi_transfer(in Dout as byte) as byte
    dim Din as byte 'Input Data from nRF24L01

    Din = 0
    set SCK off
    set SDO off

    Repeat 8
      rlf Dout,f 'equ. Dout << 1
      if (Carry = 1) then set SDO on
      if (Carry = 0) then set SDO off
      set SCK on
      wait 8 us
      Din = Din * 2 'equ. Din << 1
      if (SDI = 1) then Din = Din + 1
      set SCK off
    End Repeat

    spi_transfer = Din
end function
'---------------------------------------------------------------------------------
sub POWER_UP 'Standby Mode I
    WRITE_REG(CONFIG,STANDBY_I)
    wait 2 ms 'nRF24L01 is in Standby Mode I
end sub
'---------------------------------------------------------------------------------
'Read content of a 1 byte register
sub READ_REG(in Register as byte)
    set SS on
    set SS off
    Dummy = spi_transfer(R_REGISTER + Register)
    Dummy = spi_transfer(R_REGISTER)
    set SS on
end sub
'---------------------------------------------------------------------------------
'Write 1 byte to register
sub WRITE_REG(in Register as byte,in Data as byte)
    set SS on
    set SS off
    Dummy = spi_transfer(W_REGISTER + Register)
    Dummy = spi_transfer(Data)
    set SS on
end sub

Code:
' nRF24L01 Test 2, HW SPI used
' 13.09.2017
'                        ------------
'  V+                  -| 1       20 |- GND
'  PORTA.5             -| 2       19 |- PORTA.0 SER_OUT
'  PORTA.4             -| 3       18 |- PORTA.1
'  PORTA.3             -| 4       17 |- PORTA.2
'  PORTC.5             -| 5       16 |- PORTC.0
'  PORTC.4             -| 6       15 |- PORTC.1
'  PORTC.3         __  -| 7       14 |- PORTC.2
'  PORTC.6         SS  -| 8       13 |- PORTB.4 SDI
'  PORTC.7         SDO -| 9       12 |- PORTB.5
'  PORTB.7         CE  -| 10      11 |- PORTB.6 SCK
'                        ------------
'
'          nRF24L01 Pins top view
' ---------------------------------------
' | GND        1 *    * 2 V3.3P  __      |
' | CE         3 *    * 4 CSN   (SS)     |
' | SCK        5 *    * 6 MOSI  (SDO)    |
' | MISO (SDI) 7 *    * 8 IRQ            |
' |                                      |
' |                         ------       |
' |                        |Quarz |      |
' |                         ------       |
' ---------------------------------------
#chip 16F690,8
#config OSC=INTRC_OSC_NOCLKOUT, PWRTE = ON

#include "C:\gcbasic_src\software_uart_v11.h"
#include "nRF24L01.h"

'nRF24L01 Settings
#define STANDBY_I 0b01111010 'Power up, Interrupt's disabled

'Serial settings
#define BAUD_RATE 2400
#define SER_OUT PORTA.0
dir SER_OUT out

'SPI settings
SPIMode MasterSlow,0

#define SDO PORTC.7
dir SDO out

#define SDI PORTB.4
dir SDI in

#define SS PORTC.6
dir SS out

#define SCK PORTB.6
dir SCK out

#define CE PORTB.7
dir CE out

dim Dummy as byte
Dummy = 0

wait 1 s
LCD_Clear
SerPrint("Test 2")
wait 2 s
LCD_Clear

POWER_UP
READ_REG(CONFIG)
LCD_Clear
print_byte(Dummy) 'should be 122 eq. 0b01111010
wait 2 s

Do
 set SS on
 set SS off
 SPITransfer WL_NOP,Dummy
 set SS on
 LCD_Clear
 print_byte(Dummy) 'should be 14 eq. 0b00001110
 wait 1 s
Loop


'------------------------------------ subs ---------------------------------------
'SPIMode ( MasterSlow,0)
'SPITransfer tx, rx

'---------------------------------------------------------------------------------
sub POWER_UP 'Standby Mode I
    'init SPI & CE pin
    'set SDO off
    'set SCK off 'CPOL = 0 the base value of the clock is zero, idle state is off
    'set CE off
    WRITE_REG(CONFIG,STANDBY_I)
    wait 2 ms 'nRF24L01 is in Standby Mode I
end sub
'---------------------------------------------------------------------------------
'Read content of a 1 byte register
sub READ_REG(in Register as byte)
    dim Dout as byte

    Dummy = 0
    Dout = R_REGISTER + Register

    set SS on
    set SS off
    SPITransfer Dout,Dummy
    SPITransfer R_REGISTER,Dummy
    set SS on
end sub
'---------------------------------------------------------------------------------
'Write 1 byte to register
sub WRITE_REG(in Register as byte,in Data as byte)
    dim Dout as byte

    Dummy = 0
    Dout = W_REGISTER + Register

    set SS on
    set SS off
    SPITransfer Dout,Dummy
    SPITransfer Data,Dummy
    set SS on
end sub
 

I3uLL3t

User
Schön schön :)

Hoffentlich bringt dich der nrf24 nicht auch zum verzweifeln wie er mich gebracht hat xD

Aktuell läuft bei mir ein Vario und ein Neo6m GPS Modul. Das GPS ist aber noch nicht so ganz Stabil im auslesen über Software Serial.
Die Akkuspannung lese ich nur für eine Zelle an einem Analogen Eingang aus. Das Reicht für mich als grobe Aussage über den Zustand des Akkus.

LG Marcel
 

I3uLL3t

User
Die Reichweite ist so ne Sache.... Das wichtigste bei den Modulen ist eine gescheite Filterung der Eingangsspannung. Ist die mist dann kommst du kaum 100m. Das nächste ist die Ausrichtung der antennen. Im Model ist das leider etwas schwierig. Ich habe mit der Standard Stabantenne im gfk Rumpf nun ca. 450m testen können ohne abbrüche. Weiter ging einfach nicht dann wurde das Modell echt zu klein.
Viel soll auch die Art und Weise ausmachen wie du die Daten übermittelst und Vorallem wieviele Daten.

LG Marcel
 
TX/RX Testprogramm

TX/RX Testprogramm

Die Datenübertragung mit den Transceivern funktioniert. Ich sende 2 Bytes (Zähler). Später werde ich mit den Daten einen rollierenden Zähler
übertragen. Somit kann man den Zählerstand abspeichern und mit dem aktuellen vergleichen. Somit kann man einen Built In Test
realisieren. Als nächstes wird die Reichweite getestet. Im Anhang ist das TX und RX Testprogramm.

Gruss Micha

nRF_TX.jpg
nRF_RX.jpg

Anhang anzeigen nRF24L01+ Telemetrie.pdf
 
Reichweitentest

Reichweitentest

Hallo,

ich hab heute die Reichweite der DIY Telemetrie getestet. Der nRF-Sender lag auf einem Tisch auf dem Flugplatz. Hab mich
zirka 230 m mit dem nRF-Empfänger entfernt. Der Empfang war einwandfrei. Alle gesendeten Frames sind angekommen. Auf dem Sender nRF Modul hab ich eine Drahtantenne geschirmt mit 3 cm ohne Schirmung gelötet. Die Antenne auf dem PCB hab ich mit Lötzin kurzgeschlossen. Bei dem Versuch war Flugbetrieb.

Gruss Micha

TX.jpg
RX2.jpg
 

I3uLL3t

User
Erstaunlich das du so eine Reichweite mit den Modulen ohne LNA PA erreichst :confused: Bei den Meißten ist ist nach 80m Freie Fläche schluss bei den dingern.
Wie hast du die Eingangsspannung der Module (NRF24) geglättet?
Was für Leitung ist das die du als Antenne benutzt?
 
Hallo Marcel,

der Spannungsregler L78L33 für die beiden PIC16F690 sowie den TX/RX nRF24L01 ist am Eingang mit 4.7 uF/16 Volt Tantal Kondensator und am Ausgang mit 100 nF gefiltert. Das Kabel ist die Zuleitung von einer alten DVBT Stick Antenne. Die gesamte Kabellänge der Antenne am Transmitter beträgt 13.5 cm wie bei meinen Futaba FASST Empfängern. Sehr wichtig ist auch eine saubere Masseführung auf den beiden Platinen. Die Masse geht Sternförmig und kurz von einem Punkt an alle GND's. Mit einer schlechten Groundplane (Masseschleifen) versaut man sich die beste Schaltung.

Gruss Micha
 
Erstflug mit DIY Telemetrie

Erstflug mit DIY Telemetrie

Heute bin ich mit der DIY Telemetrie geflogen. Übertragen werden die Spannung vom Antriebsakku sowie ein Modulo Frame Counter.
Mit dem Frame Counter überprüfe ich die Datenübertragung, vergleich aktueller Zählerstand zum vorherigen. Die Reichweite im Flug ist gut.
Die max. geschätzte Entfernung lag bei guten 300 m. Dank guter Thermik betrug die max. Flughöhe geschätzt um die 200 m. Der Transceiver
nRF24L01 ist eine kostengünstige Lösung für eine eigene Telemetrie. Damit können auch alte Flieger ohne Telemetrie für wenig Geld
mit Telemetrie ausgerüstet werden. Das Programm vom Transmitter ist bis auf das übertragen der Akkuspannung identisch mit dem Programm in dem nRF24L01+ Telemetrie.pdf Dokument. Die Unterprogramme stehen jetzt in der nRF24L01.h Library.

Gruss Micha

Telemetrie.jpg
Telemetrie1.jpg

Code:
' nRF24L01 Telemetrie_RX_V1
' 21.09.2017
'                                ------------
'  V3.3P                       -| 1       20 |- GND
'  PORTA.5                     -| 2       19 |- PORTA.0 SER_OUT
'  PORTA.4                     -| 3       18 |- PORTA.1
'  PORTA.3         PUSH_BUTTON -| 4       17 |- PORTA.2
'  PORTC.5                     -| 5       16 |- PORTC.0
'  PORTC.4                     -| 6       15 |- PORTC.1
'  PORTC.3         ALARM   __  -| 7       14 |- PORTC.2
'  PORTC.6                 SS  -| 8       13 |- PORTB.4 SDI
'  PORTC.7                 SDO -| 9       12 |- PORTB.5
'  PORTB.7                 CE  -| 10      11 |- PORTB.6 SCK
'                               ------------
'
'          nRF24L01 Pins top view, SMD view
' ---------------------------------------
' | GND        1 *    * 2 V3.3P  __      |
' | CE         3 *    * 4 CSN   (SS)     |
' | SCK        5 *    * 6 MOSI  (SDO)    |
' | MISO (SDI) 7 *    * 8 IRQ            |
' |                                      |
' |                         ------       |
' |                        |Quarz |      |
' |                         ------       |
' ---------------------------------------
#chip 16F690,8
#config OSC=INTRC_OSC_NOCLKOUT, PWRTE = ON

#include "C:\gcbasic_src\software_uart_v2.h"
#include "nRF24L01.h"

'nRF24L01 Settings and defined commands
#define FlushRX Write_Cmd(FLUSH_RX) 'used in RX mode, discard packet

' received data array index
#define FRAME_COUNTER 1
#define VOLTAGE       2

'Alarm threshold LiPo
#define VOLT_9P9 139 'Voltage divider with 22uF, 10K/(10K+47K), Vref = 3.3 Volt nominal
#define CONF_13SEC 26

#define STANDBY_I 0b01110010 'Power up, Interrupt's disabled
#define RX_LENGTH 2 ' Number of bytes to receive

'Serial settings
#define BAUD_RATE 9600
#define SER_OUT PORTA.0
dir SER_OUT out

bsf IOC,IOCA3 'enable Interrupt PORTABChange on PORTA.3
On Interrupt PORTABChange Call ISR1 'Interrupt Service Routine 1

#define ALARM PORTC.3 'Buzzer
dir ALARM out

'SPI pin settings
#define SDO PORTC.7
dir SDO out

#define SDI PORTB.4
dir SDI in

#define SS PORTC.6
dir SS out

#define SCK PORTB.6
dir SCK out

#define CE PORTB.7
dir CE out

'variables
dim Dummy,conf_counter,err_counter,f_counter_old,rx_counter,lq as byte

Dummy = 0
f_counter_old = 0
conf_counter = 0
err_counter = 0
rx_counter = 0
lq = 0

dim RXTX_ADDR(3) 'RX TX 3 byte address data pipe 0
dim rx_data(RX_LENGTH) 'data bytes to receive

rx_data(FRAME_COUNTER) = 0
rx_data(VOLTAGE) = 0

dim PUSH_BUTTON as bit 'later Menu setup
PUSH_BUTTON = 0

'Start up
wait 1 s 'wait for LCD ready
LCD_Clear
SerPrint("V1.1")
wait 2 s
LCD_Clear

'nRF_Setup
'init SPI & CE pin

SPIMode MasterSlow,0 'SPI Mode Setup

set SDO off
set SCK off
set SS on
set CE off

' nRF Setup
RXTX_ADDR(1) = 0xB1
RXTX_ADDR(2) = 0xB2
RXTX_ADDR(3) = 0xB3

Write_Reg(CONFIG, STANDBY_I)    ' STANDBY_I Mode
Write_Reg(EN_AA, 0x00)          ' Disable auto ack
Write_Reg(EN_RXADDR, 0x01)      ' Enable data pipe 0
Write_Reg(SETUP_AW, 0x01)       ' 3 byte address
Write_Reg(SETUP_RETR, 0x00)     ' Retransmit disabled
Write_Reg(RF_CH, 0x3F)          ' RF channel 63
Write_Reg(RF_SETUP, 0x26)       ' 250kbps, 0dBm
Write_Reg(RX_PW_P0, RX_LENGTH)  ' RX payload, num of bytes, max 32
Write_Addr_Pipe(RX_ADDR_P0)     ' 3 byte RX addres data pipe 0
RX_Mode
FlushRX
' end nRF_Setup

'Power Up Test Buzzer
set ALARM on
wait 1 s
set ALARM off

'------------------------------------ main ---------------------------------------
Do
  Read_Payload

  if (rx_data(VOLTAGE) < VOLT_9P9) then
     conf_counter++
     if (PUSH_BUTTON = 0) and (conf_counter >= CONF_13SEC) then
        set ALARM on
        conf_counter = CONF_13SEC
     end if
  end if
  if (rx_data(VOLTAGE) >= VOLT_9P9) then
     set ALARM off
     conf_counter = 0
  end if
  if (PUSH_BUTTON = 1) then
     set ALARM off
     conf_counter = CONF_13SEC
  end if

  if (f_counter_old = rx_data(FRAME_COUNTER)) then err_counter++
  rx_counter++
  if (rx_counter = 10) then
     lq = (10 - err_counter) * 10
     rx_counter = 0
     err_counter = 0
  end if

  LCD_Clear
  SerPrint("LQ:")
  print_byte(lq)
  LCD_Line2
  print_2p1(rx_data(VOLTAGE)*72)
  SerPrint(" V")
  f_counter_old = rx_data(FRAME_COUNTER)

  wait 500 ms
Loop

'----------------------------------- subs -------------------------------------
sub ISR1 'Interrupt Service Routine
    PUSH_BUTTON = 1
    wait 255 ms
end sub 'ISR1
 
Zuletzt bearbeitet:
Hallo,

hab mir noch einen kleinen Sender gebaut. Die Einstellungen und die Payload werden mittels einer Software SPI Routine
gemacht. Somit kann ein Telemetrie Voltage Monitor TX mit einem PIC mit 6 - I/O-Pins und ADC realisiert werden. Somit
funktioniert ein Low Voltage Monitor selbst mit einem PIC 12F675. Die Kosten für ein TX-Modul liegen bei ca. 5-6 Euro.
Als PIC würde sich ein 12F1572 PDIP-8 gut eignen. Kostet 1 Euro beim Reichelt.

Der Empfänger mit einem LCD Display vom Pollin kostet ca. 10 Euro. Im Anhang ist die Software.

Gruss Micha

TX_Mini.JPG
Telemetrie2.jpg
 

Anhänge

  • nRF24L01 TX_RX Software.pdf
    24,8 KB · Aufrufe: 343
Hallo,

gestern und heute bin ich mit meinem kleinem TX-Modul ohne Drahtantenne an meinem Haushang geflogen. Die Reichweite ist geringer, dennoch für mich ausreichend. Dank super Thermik hab ich ca. 300 m an Höhe gemacht. Der Empfang ist dann ab und zu mal abgebrochen, je nach Flugrichtung vom Segler. Da ich den Motor nur kurz vor dem Absaufen und in Hangnähe einschalte, macht der Ausfall von Frames kein Problem. Der alte Wert wird wird bis zum Empfang eines neuen Frames gehalten. Den Sender kann man übrigens universell machen. Die Messung der Akkuspannung kann man auch auslagern. Den Eingang vom ADC kann man z.B. auf eine Servobuchse legen. Den notwendigen Spannungsteiler zur Messung der Akkuspannung kann man dann auf eine kleine Lochrasterplatine mit Servostecker legen. Die Spannungsversorgung des Senders (TX Modul) erfolgt dann z.B. über einen freien Empfängerkanal. Dazu muss natürlich ein LDO 3.3 Volt Spannungsregler auf der TX-Platine für die PIC- und nRF Supply verwendet werden. Als Beispiel für den Spannungsteiler siehe folgender Post.

http://www.rc-network.de/forum/show...rSky-2-4-GHz?p=2146045&viewfull=1#post2146045

Mit Normierung der Lipospannung auf 4.2 Volt im LCD Display benötigt man sogar nur eine RX Version für verschiedene Zellenanzahlen.

Gruss Micha

TX_Mini3.jpg
 
Gateway Serial to nRF24L01

Gateway Serial to nRF24L01

Hallo,

hab mir ein Gateway von Serial zu nRF gebaut. Mit dem Gateway kann ich über eine serielle Software-Schnittstelle serielle Daten mit 9600 baud
empfangen und über den Transceiver nRF24L01 an den Empfänger senden. Damit kann ich z.B. mit meinem LiPo/LiFePo Monitor mit PIC 16F1705
die Spannung der Zellen bis 4S über den Tranceiver senden. Zur Synchronisation der empfangenen Daten wartet die serielle Funktion auf das Startbit. Das serielle Gateway muss vor dem seriellen Sensor ready sein. Somit erfolgt automatisch die synchronisation der Daten. Zusätzlich werden die Daten in einen Frame mit Start Byte und End Byte gesendet. Zur Unterscheidung meiner Sensoren sendet der Sensor im Flieger eine SENSOR_ID. Somit kann ich im Empfänger automatisch das entsprechende Programm selektieren.

Gruss Micha

Code:
'  Telemetrie TX with SER_IN Interface
'  17.10.2017
'
'              -----------
'  V5P       -| 1       8 |- GND
'  RA5   CE  -| 2       7 |- RA0 SCK
'  RA4   CSN -| 3       6 |- RA1 SER_IN
'  RA3       -| 4       5 |- RA2 SDO
'              -----------
'
'     nRF24L01 Pins top view, SMD view
' ---------------------------------------
' | GND        1 *    * 2 V3.3P          |
' | CE         3 *    * 4 CSN            |
' | SCK        5 *    * 6 MOSI  (SDO)    |
' | MISO       7 *    * 8 IRQ            |
' |                                      |
' |                         ------       |
' |                        |Quarz |      |
' |                         ------       |
' ---------------------------------------
'
'Chip model
#chip 12F1572,8
#config OSC = INTOSC, PWRTE = ON

#include "nRF24L01_sw_spi.h"

' nRF24L01 defines
#define FlushTX Write_Cmd(FLUSH_TX) 'used in TX mode, flush TX FIFO

' Number of bytes to send
#define TX_LENGTH 8

' nRF TX data array index
#define FRAME_COUNTER 1
#define SENSOR_ID     2
#define USER_DATA1    3
#define USER_DATA2    4
#define USER_DATA3    5
#define USER_DATA4    6
#define USER_DATA5    7
#define USER_DATA6    8

#define STANDBY_I 0b01110010 'Power up, Interrupt's disabled

#define START_BYTE 0xFE
#define END_BYTE   0xFD

' SER_IN Frame:
' -----------------------------
' byte_count 1: START_BYTE
' byte_count 2: SENSOR_ID
' byte_count 3: USER_DATA1
' byte_count 4: USER_DATA2
' byte_count 5: USER_DATA3
' byte_count 6: USER_DATA4
' byte_count 7: USER_DATA5
' byte_count 8: USER_DATA6
' byte_count 9: END_BYTE

#define SER_IN PORTA.1
dir SER_IN in

'SPI settings
'SPI pin settings
#define SCK  PORTA.0
dir SCK out

#define SDO PORTA.2
dir SDO out

#define CSN PORTA.4
dir CSN out

#define CE  PORTA.5
dir CE out

' Serial Data
dim byte_count,f_counter,START_FRAME,Temp as byte
byte_count = 0
f_counter = 0
Temp = 0
START_FRAME = FALSE

' nRF Data
dim RXTX_ADDR(3) 'RX TX 3 byte address data pipe 0
dim tx_data(TX_LENGTH) 'data bytes to send

wait 100 ms 'wait for nRF ready

' nRF_Setup
' init SPI & CE pin
set SDO off
set SCK off
set CSN on
set CE off

RXTX_ADDR(1) = 0xB1
RXTX_ADDR(2) = 0xB2
RXTX_ADDR(3) = 0xB3

Write_Reg(CONFIG, STANDBY_I)    ' STANDBY_I Mode
Write_Reg(EN_AA, 0x00)          ' Disable auto ack
Write_Reg(SETUP_AW, 0x01)       ' 3 byte address
Write_Reg(SETUP_RETR, 0x00)     ' Retransmit disabled
Write_Reg(RF_CH, 0x3F)          ' RF channel 63
Write_Reg(RF_SETUP, 0x26)       ' 250kbps, 0dBm
Write_Addr_Pipe(TX_ADDR)        ' 3 byte TX addres data pipe 0
TX_Mode
FlushTX
' end nRF_Setup
'-------------------------------------- MAIN ----------------------------------

Do
   Wait Until SER_IN = 1
   Temp = SerInInv

   if ((byte_count = 0) and (Temp = START_BYTE)) then START_FRAME = TRUE
   if START_FRAME then
     byte_count++
     'byte_count 1 is START_BYTE, not used to transmit
     'tx_data(1) = f_counter, not received via SerInInv
     if (byte_count > 1) and (byte_count < (TX_LENGTH + 1)) then tx_data(byte_count) = Temp

     if (byte_count = TX_LENGTH + 1) then
        if (Temp = END_BYTE) then
           tx_data(FRAME_COUNTER) = f_counter
           f_counter++
           Write_Payload
           wait 1 ms
           FlushTX
        end if
        byte_count = 0
        Temp = 0
        START_FRAME = FALSE
     end if 'byte_count = 8
  end if 'START_FRAME
Loop


'------------------------------------ subs ------------------------------------
'
'********************* AsyncRx invert ******************
'* Asynchronous serial receive byte function           *
'* 1 start bit + 8 data bits  + 1 stop bit             *
'* INVERTED                                            *
'* Baud Rate: 9600                                     *
'* Processor clock assumed: 8Mhz                       *
'*                                                     *
'* Uses: SerInInv(byte to received) as output of func  *
'* Uses: SER_IN as SerIn PIN, SER_IN pin must be       *
'* defined at program start  #define SER_IN PORT.X     *
'* oneBitdelay [us]  99, halfBitdelay  49  @9600 baud  *
'*******************************************************

function SerInInv as byte
    SerInInv = 0

    wait 49 us 'halfBitdelay, mid of Start Bit
    for bitCount = 1 to 8
        wait 99 us 'oneBitdelay
        SerInInv = SerInInv / 2
        if (SER_IN = 0) then SerInInv = SerInInv + 0b10000000
    next
    wait 99 us 'oneBitdelay
end function 'SerInInv
'------------------------------------------------------------------------------
 
Hallo ,

heute bin ich mit meinem LiPo/LiFePo Monitor mit PIC 16F1705 und neuer SW sowie meinem Gateway Serial to nRF24L01 geflogen. Es werden 7 Byte an Daten übertragen. Meinen nRF24L01 Empfänger an der inzwischen alten FC18 hab ich mit einer Antenne aus einem alten Wlan Router modifiziert. Die Reichweite ist echt super. Das erste Bild ist nach der Landung. Falls interesse besteht, kann ich den Code gerne zur Verfügung stellen.

LiPo/LiFePo Monitor: http://www.rc-network.de/forum/showthread.php/630243-LiPo-LiFePo-Monitor-mit-PIC16F1705

Gruß
Micha
 

Anhänge

  • DSCF0021.jpg
    DSCF0021.jpg
    276,9 KB · Aufrufe: 298
  • DSCF0006.jpg
    DSCF0006.jpg
    467,1 KB · Aufrufe: 284

I3uLL3t

User
Super Arbeit!!!
wenn ich mir das so durchlese bekomme ich echt bock mich wieder mit PIC´s zu beschäftigen leider lässt das meine Zeit nicht wirklich zu.
Aber mach weiter so für dich scheint das ja alles ein Klaks zu sein :)
 
Hallo Marcel,

vielen Dank für dein Lob. Auch für mich ist das nicht alles ein Klaks. Ich profitiere halt noch von meiner
früheren Berufserfahrung als Entwicklungsingenieur im Bereich Avionik. Jetzt hab ich erst mal genug vom basteln, die vom Vater
wegen schwerer Krankheit übernommenen Flieger/Sender sind jetzt ja auch telemetriefähig.
Ich warte und warte und warte nur noch auf den Frühling.:rolleyes:

Gruß
Micha
 
Ansicht hell / dunkel umschalten
Oben Unten