data verzenden nRF24L01

IDE gerelateerde berichten
Berichten: 21
Geregistreerd: 01 Feb 2017, 14:03
Woonplaats: Zeeland

data verzenden nRF24L01

Berichtdoor Gregoryvl » 27 Okt 2017, 22:28

Hallo,

Ik probeer beter mijn weg te vinden in programmeren, helaas loop ik nu vast.
Ik probeer een gemeten afstand te verzenden naar een andere arduino.
Bij de data transmissie loop ik keer op keer vast, dit ondanks het oneindig aantal youtube filmpjes die ik heb bekeken.

Kan er iemand mij een duwtje in de rug geven en zien wat er fout gaat?
De code die ik heb gekopieerd om mijn data te verzenden komt van een weerstation.

Alvast bedankt!!!

PS: sorry voor de slordige manier van schrijven


///Transmitter!

cpp code
#include <Wire.h>
#include <LIDARLite.h>
#include <SPI.h>
#include "RF24.h"
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,2,16);

// Globals
LIDARLite lidarLite;
int cal_cnt = 0;

/// SETTING UP WIRELESS

RF24 myRadio (7, 8);
byte addresses[][6] = {"0"};


struct package
{
float dist ;
};

typedef struct package Package;
Package data;



void setup()
{
Serial.begin(9600); // Initialize serial connection to display distance readings

delay (1000);

/// SETTING UP LIDAR

lidarLite.begin(0,62); // Set configuration to default and I2C to 400 kHz
lidarLite.configure(0); // Change this number to try out alternate configurations

/// Transmission
Serial.begin(9600); // Initialize serial connection to display distance readings
myRadio.begin();
myRadio.setChannel(115);
myRadio.setPALevel(RF24_PA_MAX);
myRadio.setDataRate( RF24_250KBPS ) ;
myRadio.openWritingPipe( addresses[0]);
delay(1000); }




void loop()
{


int dist;

// At the beginning of every 100 readings,
// take a measurement with receiver bias correction
if ( cal_cnt == 0 ) {
dist = lidarLite.distance(); // With bias correction
} else {
dist = lidarLite.distance(false); // Without bias correction

}

// Increment reading counter
cal_cnt++;
cal_cnt = cal_cnt % 100;



// Display distance
Serial.print(dist);
Serial.println(" cm");
myRadio.write(&data, sizeof(data));
delay(500);




}



/// Receiver!


cpp code
#include <Wire.h>
#include <LIDARLite.h>
#include <SPI.h>
#include "RF24.h"
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,2,16);

RF24 myRadio (6, 8);
byte addresses[][6] = {"0"};

float remotedist;

struct package
{
float dist ;

};
typedef struct package Package;
Package data;

void setup() {
// put your setup code here, to run once:

Serial.begin(9600);
startWirelessCommunication();


}

void loop() {
// put your main code here, to run repeatedly:
checkForWirelessData();
}

void startWirelessCommunication()
{
myRadio.begin();
myRadio.setChannel(115);
myRadio.setPALevel(RF24_PA_MAX);
myRadio.setDataRate( RF24_250KBPS ) ;
myRadio.openReadingPipe(1, addresses[0]);
myRadio.startListening();
delay(1000);

}

void checkForWirelessData()
{
if ( myRadio.available())
{
while (myRadio.available())
{
myRadio.read( &data, sizeof(data) );

remotedist = data.dist;

}
Serial.print("\nPackage:");
Serial.print("\n");
Serial.println(data.dist);
delay(1000);

}
}

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: data verzenden nRF24L01

Berichtdoor Koepel » 27 Okt 2017, 23:55

Die werkt toch op 3.3V terwijl de data pinnen wel 5V tolerant zijn ?
De algemeen gangbare manier, is om voor beide een test sketch te maken. Dus een test sketch die alleen heeft wat nog niet werkt. Alle andere code er uit, en het liefst ook alle hardware verwijderen die niet nodig is. Meestal zit er een voorbeeld bij de library, dat is het beste om mee te beginnen. Heb je een goede up-to-date library ? of zomaar iets ergens van internet gedownload ?

Je kunt de Arduino IDE twee keer opstarten. Dan kun je beide naast elkaar tegelijk gebruiken.

Je beschrijving mag iets uitgebreider. Wat bedoel je met dat je vast loopt ? Zit er lijm op de vloer waardoor je schoenen blijft plakken ?

Transmitter:
Een element van de union heet 'dist', dat is een float. Verder declareer je ook nog een integer 'dist'. Dus dat is vragen om problemen.
Een 'typedef' voor een 'struct' is tegenwoordig niet meer nodig.
Je verstuurt 'data', dat is je struct. Maar data.dist wordt nergens gevuld.

cpp code
struct Package
{
float doe_mij_maar_een_naam_die_niet_voor_problemen_zorgt;
};
Package data;

Hier is de eerste regel "struct Package" meteen al een typedef van 'Package'.

Receiver:
Een delay ?
Ik zou die while er uit halen. Gewoon als er iets available is, dan de ontvangen data inlezen. Daarna meteen weer terug keren naar de loop, en klaar staan voor het volgende. Als je een boek leest, dan hou je na iedere zin toch ook niet steeds een plaspauze ?

Berichten: 21
Geregistreerd: 01 Feb 2017, 14:03
Woonplaats: Zeeland

Re: data verzenden nRF24L01

Berichtdoor Gregoryvl » 28 Okt 2017, 10:05

Dank je wel voor de snelle reply, Koepel!

Ik heb de nRF24L01 aangesloten op de 3.3V supply van de Arduino Uno zelf.
Elke keer als ik wat opzoek, begin ik met knippen en plakken. Zo blijft er wel eens een "while" achter en wordt het verhaal, voor mezelf, steeds meer onduidelijker.

Ik ga jou tip een keer proberen. Als dat niet lukt; nog een keer van 0 beginnen met de voorbeeld library.

Berichten: 21
Geregistreerd: 01 Feb 2017, 14:03
Woonplaats: Zeeland

Re: data verzenden nRF24L01

Berichtdoor Gregoryvl » 30 Okt 2017, 17:04

Hi,

Het lijkt erop dat ze niet willen communiceren. Zelfs niet na het omwisselen van de transceivers.
Ik probeer nu op de meest eenvoudige manier, 2 arduino's te laten communiceren.
Ik gebruik hiervoor deze tutorial: https://www.youtube.com/watch?v=JSHJ-RLbNJk

Het lijkt erop dat de ene zend, maar niets terugontvangt van de andere. Via de serial comm zie ik bijvoorbeeld "Sent: 150, received: 0" bij de TX, de RX laat alleen dit "THIS IS THE RECEIVER CODE - YOU NEED THE OTHER ARDUINO TO TRANSMIT" maar zien...

De codes zijn copy paste van die beste man zijn pagina. Nog steeds gaat het niet goed.

Wat heb ik al geprobeerd:
- Pinouts tientallen keren opnieuw aangesloten
- Transceivers vervangen door andere
- RX en TX arduin's met elkaar omgewisseld
- andere pinouts dan 7, 8 toegewezen
- verschillende tutorials geprobeerd
- transceiver aan labvoeding

Weet jij wat ik fout doe?

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: data verzenden nRF24L01

Berichtdoor nicoverduin » 30 Okt 2017, 17:59

Er is al meer in het verleden gedaan met die nrf's. Inclusief voorbeelden
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 21
Geregistreerd: 01 Feb 2017, 14:03
Woonplaats: Zeeland

Re: data verzenden nRF24L01

Berichtdoor Gregoryvl » 30 Okt 2017, 21:20

Er is al meer in het verleden gedaan met die nrf's. Inclusief voorbeelden

Dat klopt! Ik heb ze volgens mij allemaal afgeschuimd. Straffer nog, ik heb voorheen al wel eens wat gemaakt met nRF24's en toen werkte het.

Is er een manier om uit te sluiten dat mijn vier nRF24 transceivers niet stuk zijn?

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: data verzenden nRF24L01

Berichtdoor nicoverduin » 30 Okt 2017, 21:22

Test progje maken en indivueel testen
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 21
Geregistreerd: 01 Feb 2017, 14:03
Woonplaats: Zeeland

Re: data verzenden nRF24L01

Berichtdoor Gregoryvl » 31 Okt 2017, 22:18

Ik ben er eindelijk achtergekomen wat er mis ging. 1 van mijn draadjes maakte niet goed contact.
Nu naar de volgende stap, data verzenden...

Berichten: 21
Geregistreerd: 01 Feb 2017, 14:03
Woonplaats: Zeeland

Re: data verzenden nRF24L01

Berichtdoor Gregoryvl » 01 Nov 2017, 11:27

Het is deels voor elkaar! Nu zie ik dat hij foute waarden doorstuurt als deze groter is dan 254.
zie screen shot. Hoe kan dit?

IDE.jpg
IDE.jpg (67.11 KiB) 10249 keer bekeken


Ook gaat de terugkoppeling tussen de transceivers opvallend traag. De TX zend continu data, de RX ontvangt +- om de 5sec wat. Terwijl er geen delay tussenstaat...

Dit is de gebruikte code van TX:
cpp code
#include <Wire.h>
#include <LIDARLite.h>
#include "Arduino.h"
#include <SPI.h>
#include <RF24.h>

// Hardware, configuration: Set up nRF24L01 radio on SPI bus (pins 10, 11, 12, 13) plus pins 7 & 8
RF24 radio(7, 8);

byte addresses[][6] = {"1Node", "2Node"};



// Globals
LIDARLite lidarLite;
int cal_cnt = 0;

void setup()
{
Serial.begin(9600); // Initialize serial connection to display distance readings

lidarLite.begin(0,62); // Set configuration to default and I2C to 400 kHz
lidarLite.configure(0); // Change this number to try out alternate configurations

// Initiate the radio object
radio.begin();

// Set the transmit power to lowest available to prevent power supply related issues
radio.setPALevel(RF24_PA_MAX);

// Set the speed of the transmission to the quickest available
radio.setDataRate(RF24_2MBPS);

// Use a channel unlikely to be used by Wifi, Microwave ovens etc
radio.setChannel(124);

// Open a writing and reading pipe on each radio, with opposite addresses
radio.openWritingPipe(addresses[1]);
radio.openReadingPipe(1, addresses[0]);

}
void loop()
{
int dist;

// At the beginning of every 100 readings,
// take a measurement with receiver bias correction
if ( cal_cnt == 0 ) {
dist = lidarLite.distance(); // With bias correction
} else {
dist = lidarLite.distance(false); // Without bias correction
}

// Increment reading counter
cal_cnt++;
cal_cnt = cal_cnt % 100;

// Display distance
Serial.print(dist);
Serial.println(" cm");

delay(10);
// Generate a single random character to transmit
unsigned char data = dist;

// Ensure we have stopped listening (even if we're not) or we won't be able to transmit
radio.stopListening();

// Did we manage to SUCCESSFULLY transmit that (by getting an acknowledgement back from the other Arduino)?
// Even we didn't we'll continue with the sketch, you never know, the radio fairies may help us
if (!radio.write( &data, sizeof(unsigned char) )) {
Serial.println("No acknowledgement of transmission - receiving radio device connected?");
}

// Now listen for a response
radio.startListening();

// But we won't listen for long, 200 milliseconds is enough
unsigned long started_waiting_at = millis();

// Loop here until we get indication that some data is ready for us to read (or we time out)
while ( ! radio.available() ) {

// Oh dear, no response received within our timescale
if (millis() - started_waiting_at > 200 ) {
Serial.println("No response received - timeout!");
return;
}
}

// Now read the data that is waiting for us in the nRF24L01's buffer
unsigned char dataRx;
radio.read( &dataRx, sizeof(unsigned char) );

// Show user what we sent and what we got back
Serial.print("Sent: ");
Serial.print(data);
Serial.print(", received: ");
Serial.println(dataRx);

// Try again 1s later
delay(1000);
}



Code van RX:

cpp code
#include "Arduino.h"
#include <SPI.h>
#include <RF24.h>

#include <Wire.h>
#include <LIDARLite.h>
#include <SPI.h>
#include "RF24.h"
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2
#define LOGO16_GLCD_HEIGHT 16
#define LOGO16_GLCD_WIDTH 16

static const unsigned char PROGMEM logo16_glcd_bmp[] =
{ B00000000, B11000000,
B00000001, B11000000,
B00000001, B11000000,
B00000011, B11100000,
B11110011, B11100000,
B11111110, B11111000,
B01111110, B11111111,
B00110011, B10011111,
B00011111, B11111100,
B00001101, B01110000,
B00011011, B10100000,
B00111111, B11100000,
B00111111, B11110000,
B01111100, B11110000,
B01110000, B01110000,
B00000000, B00110000 };

#if (SSD1306_LCDHEIGHT != 32)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

// This is just the way the RF24 library works:
// Hardware configuration: Set up nRF24L01 radio on SPI bus (pins 10, 11, 12, 13) plus pins 7 & 8
RF24 radio(7, 8);

byte addresses[][6] = {"1Node","2Node"};

// -----------------------------------------------------------------------------
// SETUP SETUP SETUP SETUP SETUP SETUP SETUP SETUP SETUP
// -----------------------------------------------------------------------------
void setup() {
Serial.begin(9600);
Serial.println("THIS IS THE RECEIVER MODULE - YOU NEED THE OTHER ARDUINO TO TRANSMIT");

// by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 128x32)
// init done

// Show image buffer on the display hardware.
// Since the buffer is intialized with an Adafruit splashscreen
// internally, this will display the splashscreen.


// Clear the buffer.
display.clearDisplay();

// text display tests
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(20,0);
display.println("naam");

display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(20,21);
display.println("naam");
display.display();
delay(5000);
display.clearDisplay();

// Initiate the radio object
radio.begin();

// Set the transmit power to lowest available to prevent power supply related issues
radio.setPALevel(RF24_PA_MAX);

// Set the speed of the transmission to the quickest available
radio.setDataRate(RF24_2MBPS);

// Use a channel unlikely to be used by Wifi, Microwave ovens etc
radio.setChannel(124);

// Open a writing and reading pipe on each radio, with opposite addresses
radio.openWritingPipe(addresses[0]);
radio.openReadingPipe(1, addresses[1]);

// Start the radio listening for data
radio.startListening();
}

// -----------------------------------------------------------------------------
// We are LISTENING on this device only (although we do transmit a response)
// -----------------------------------------------------------------------------
void loop() {

// This is what we receive from the other device (the transmitter)
unsigned char data;

// Is there any data for us to get?
if ( radio.available()) {

// Go and read the data and put it into that variable
while (radio.available()) {
radio.read( &data, sizeof(char));
}

// No more data to get so send it back but add 1 first just for kicks
// First, stop listening so we can talk
radio.stopListening();
data;
radio.write( &data, sizeof(char) );

// Now, resume listening so we catch the next packets.
radio.startListening();

// Tell the user what we sent back (the random numer + 1)
Serial.print("Sent response ");
Serial.println(data);


}
display.setTextSize(3.5);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.print(data);
display.println(" cm");
display.display();
display.clearDisplay();

}

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: data verzenden nRF24L01

Berichtdoor nicoverduin » 01 Nov 2017, 12:39

er zijn wel meerdere issues met de code:
a) maak van cnt een uint16_t. Of zet hem elke keer naar 0 na 100 cycles
b) data snap ik ff niet
cpp code
// No more data to get so send it back but add 1 first just for kicks
// First, stop listening so we can talk
radio.stopListening();
data;
radio.write( &data, sizeof(char) );

Daarnaast zit je de schrijven naar de serial.

je schrijft maar 1 byte weg
cpp code
// This is what we receive from the other device (the transmitter)
unsigned char data;

// Is there any data for us to get?
if ( radio.available()) {

// Go and read the data and put it into that variable
while (radio.available()) {
radio.read( &data, sizeof(char));
}

// No more data to get so send it back but add 1 first just for kicks
// First, stop listening so we can talk
radio.stopListening();
data;
radio.write( &data, sizeof(char) );

// Now, resume listening so we catch the next packets.
radio.startListening();

// Tell the user what we sent back (the random numer + 1)
Serial.print("Sent response ");
Serial.println(data);

Ik denk dat je er goed aan doet om de code eens te bestuderen wat je eigenlijk aan het doen bent. Zo ingewikkeld is het in deze niet.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Volgende

Terug naar Arduino IDE

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 11 gasten