PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : DIY Telemetrie 2.4 gHz



lastdownxxl
13.09.2017, 19:59
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/content/download/2726/34069/file/nRF24L01P_Product_Specification_1_0.pdf

Weitere Details werden folgen.

Gruss Micha



' 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




' 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
18.09.2017, 09:21
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

lastdownxxl
18.09.2017, 11:21
Hallo Marcel,

ich hab mir vor einiger Zeit auch ein Vario mit einem analogen Drucksensor gebaut. Das läuft auf meiner FrSky Telemetrie.
Ziel ist das Vario auch mit dem nRF zu nutzen. Wie sieht es mit der Reichweite der nRF Module aus?

https://www.rcgroups.com/forums/showpost.php?p=26026220&postcount=1385
https://www.rcgroups.com/forums/showpost.php?p=31954151&postcount=1428

Gruss Micha

I3uLL3t
18.09.2017, 12:09
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

lastdownxxl
19.09.2017, 15:46
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

1841263
1841264

1841259

I3uLL3t
20.09.2017, 06:43
Bei Pic s bin ich leider raus :D Ich habe noch ein paar hier liegen weil ich mich in meiner Lehrzeit damit mal beschäftigen wollte, dann kamen aber die Arduinos und das Thema war für mich gegessen :D
Aber weiterhin viel erfolg :)

LG Marcel

lastdownxxl
21.09.2017, 17:19
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

1842131
1842132

I3uLL3t
22.09.2017, 06:58
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?

lastdownxxl
22.09.2017, 08:51
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

lastdownxxl
22.09.2017, 17:33
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

1842517
1842518



' 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

lastdownxxl
25.09.2017, 19:39
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

1843980
1843981

lastdownxxl
27.09.2017, 19:06
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/showthread.php/202547-Wer-hat-Erfahrung-mit-dem-System-FrSky-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

1844847

lastdownxxl
21.10.2017, 18:09
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



' 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
'------------------------------------------------------------------------------

lastdownxxl
14.03.2018, 19:09
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

I3uLL3t
16.03.2018, 14:07
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 :)

lastdownxxl
17.03.2018, 07:41
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

I3uLL3t
20.03.2018, 12:59
für mich als kleiner Elektroniker für Betriebstechnik ist das leider nicht ganz so einfach. :D
Du bist nicht der einzige der auf den Frühling wartet....heute ist ja immerhin schonmal offiziell Frühling :D