Forum: Mikrocontroller und Digitale Elektronik Atmega 644P mit nRF24L01+


von Janina M. (joe1205)


Lesenswert?

Hallo zusammen.

Ich habe die Aufgabe erhalten einen Mikrocontroller mit mehreren 
Sensoren zu erweitern. Der aktuelle Stand ist schon als 
"Platinenversion" vorhanden.
Bevor ich jedoch an der Platine rumlöte, wollte ich das ganze erst 
einmal auf dem Breadboard nachbauen.

Das Problem: Es funktioniert nicht.
Auf der Platine ist ein ATMEGA644P-20MU verbaut. Dieser hat 3 Sensoren 
angeschlossen und ein nRF24L01+ Modul zur Kommunikation mit der 
Empfängereinheit. Die Empfängereinheit sendet einen Startbefehl an den 
Atmega, woraufhin der Daten der Sensoren sammelt und sekündlich 
zurückschickt.


Für das Breadboard hab ich einen ATMEGA644P-20AU besorgt und auf eine 
Adapterplatine gelötet.
Original "platinencode" überspielt. Verbindungen gesteckt. 10 Mal schon 
nachgeschaut ob ich mich vertan habe, aber leider bringt das alles 
nichts. Der MC antwortet nicht dem Empfänger.

Gibt es unterschiede bei der Pinbelegung der beiden MCs? Soweit ich weiß 
nicht.

Muss man was bei der rf24 config.h oder in der rf24.h  ändern?

https://github.com/iot-playground/Arduino/blob/master/external_libraries/MySensors/utility/RF24_config.h


Codeschnipsel bzgl Wifi:


Atmega:
1
#include "RF24.h"
2
3
...
4
5
RF24 radio(21,22);
6
byte addresses[][6] = {"1Node","2Node"};
7
8
...
9
unsigned long hello = 0b11111111111111111111111111111111;
10
unsigned long error = 0b11111111111111111111111111111110;
11
unsigned long line  = 0b11111111111111111111111111111101;
12
13
...
14
15
  radio.begin();
16
  radio.setPALevel(RF24_PA_HIGH); //alt: RF24_PA_MAX RF24_PA_MIN
17
  radio.setDataRate(RF24_250KBPS); //alt: RF24_250KBPS RF24_1MBPS
18
  radio.setAutoAck(1);                    // Ensure autoACK is enabled
19
  
20
  radio.enableDynamicPayloads(); 
21
  radio.setCRCLength(RF24_CRC_8); 
22
  
23
  radio.enableAckPayload();               // Allow optional ack payloads
24
  radio.setRetries(0,30);                 // Smallest time between retries, max no. of retries
25
  radio.setPayloadSize(32);                // Here we are sending 1-byte payloads to test the call-response speed
26
  radio.openWritingPipe(addresses[1]);        // Both radios listen on the same pipes by default, and switch when writing
27
  radio.openReadingPipe(1,addresses[0]);      // Open a reading pipe on address 0, pipe 1
28
  
29
  
30
  radio.powerUp();
31
  //radio.printDetails();                   // Dump the configuration of the rf unit for debugging
32
  radio.write(&hello,4);
33
34
35
  
36
  // Start the radio listening for data
37
  radio.startListening();

Die Empfangseinheit:
1
#include "RF24.h"
2
3
...
4
bool radioNumber = 1;
5
6
...
7
8
radio.begin();
9
  radio.setPALevel(RF24_PA_HIGH); //alt: RF24_PA_MAX RF24_PA_MIN
10
  radio.setDataRate(RF24_250KBPS); //alt: RF24_250KBPS RF24_1MBPS
11
  radio.setAutoAck(1);                    // Ensure autoACK is enabled
12
  
13
  radio.enableDynamicPayloads(); 
14
  radio.setCRCLength(RF24_CRC_8); 
15
  
16
  radio.enableAckPayload();               // Allow optional ack payloads
17
  radio.setRetries(0,30);                 // Smallest time between retries, max no. of retries
18
  radio.setPayloadSize(32);                // Here we are sending 1-byte payloads to test the call-response speed
19
  radio.openWritingPipe(addresses[1]);        // Both radios listen on the same pipes by default, and switch when writing
20
  radio.openReadingPipe(1,addresses[0]);      // Open a reading pipe on address 0, pipe 1
21
  
22
  
23
  radio.powerUp();
24
  //radio.printDetails();                   // Dump the configuration of the rf unit for debugging
25
  radio.write(&hello,4);
26
27
28
  
29
  // Start the radio listening for data
30
  radio.startListening();


Verbunden ist das ganze wie folgt:

nRF24L01+ -    Atmega
1   GND   -    GND
2   VCC   -    3.3V  (mit 0.1uF Kondesator zu GND)
3   CE    -    PCINT21
4   CS    -    PCINT22
5   SCK   -    SCK
6   MOSI  -    MOSI
7   MISO  -    MISO
8   IRQ   -    Keine Verbindung

Ist irgendetwas falsch? Vielen Dank schon einmal für den Aufwand.

von NRFTestGuy (Gast)


Lesenswert?

Jannis J. schrieb:
> Das Problem: Es funktioniert nicht.

Das Problem: du weisst nicht ob der Sender oder der
Empfänger nicht funktioniert.

Ich hab da mal (vor längerer Zeit) was vorbereitet (das
wäre mein Lösungsansatz):

Beitrag "NRF24L01+ test program for Arduino Mega"
Beitrag "NRF24L01+ test program for Arduino Uno"
Beitrag "NRF24L01 - Testprogramm für Windows PC"

Jannis J. schrieb:
> radio.setRetries(0,30);

Ich kenne die Lib nicht von innen, daher weiss ich nicht ob das
wirklich funktioniert, aber der NRF24 erlaubt für sich nur
maximal 15 Retries. Das höher zu setzen oder zu begrenzen wäre
eine Kunst der Lib.

von Pete K. (pete77)


Lesenswert?

Kann der ATMega auch 20Mhz mit 3,3V?

Die 0,1µF sollten bestimmt 0,1nF heissen. Sind alle VCC des ATMega 
abgeblockt und angeschlossen?

Schaltplan?

von NRFTestGuy (Gast)


Lesenswert?

Pete K. schrieb:
> Kann der ATMega auch 20Mhz mit 3,3V?

Können schon, aber nicht garantiert.

Pete K. schrieb:
> Die 0,1µF sollten bestimmt 0,1nF heissen.

Nein, 0.1uF. Es darf auch gerne mehr sein, denn die Versorgung
ist meist so wackelig dass ein 10uF Elko und 0.1uF Kerko
empfehlenswert sind.

Siehe auch meine Wirings und Beispiel-Aufbauten in den Links oben!

von Janina M. (joe1205)


Lesenswert?

Hui, da sind ja schon die ersten antworten.
Den Schaltplan kann ich morgen mal bereit stellen.

Ich weiß ,dass der empfänger, also der mc der die messdaten erhält, 
funktioniert. Schließlich funktioniert die platinenversion mit dem 
empfänger ja. Ich benutzt auch den selben Mc als empfänger und änder an 
dem nichts.

Weiß nicht ob der atmega auch 20mhz kann, er ist jedenfalls auf 8mhz mit 
3,3v programmiert.

Es sind in der tat 100 nF also 0,1 uF zwischen gnd und vcc. Kein 
Schreibfehler. Ebenso bei sämtlichen vcc und gnd des Mc.

Zur info vorweg: das ganze Projekt ist mehr oder weniger von amateuren 
zusammengebastelt worden. Hässliche codes und nen komischen schaltplan 
inklusive. Ich selber hab auch wenig erfahrung mit arduinos und mcs.

von Janina M. (joe1205)


Lesenswert?

Hi,
also ich habe herausgefunden, dass es definitiv ein Problem mit dem Wifi 
gibt. ich kann zum Beispiel nicht den Befehl radio.printDetails(); 
ausführen. Es kommt einfach nichts zurück.

Deshalb wollte ich mal das testprogramm drüber laufen lassen. Wie genau 
bekommt man den hex code auf den microcontroller? Ich hab noch nen 
arduino pro mini hier rumliegen, geht das damit auch?

vg

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.