Arduino und der Sparkfun Transceiver nRF2401A ???

Hallo,

weiß jemand wie man diesen Transceiver an einen Arduino anschließt?

Hat da schon mal jemand einen Beispiel Code für geschrieben?

Hat überhaput schon mal jemand versucht diesen Transceiver mit Arduinos zu verwenden?

irgendwie kann ich sparkfun gerade nicht aufrufen deshalb versuche ich es mal mit dem Datasheet...

So.. http://www.nordicsemi.com/index.cfm?obj=product&act=display&pro=64#

Im unteren Teil des Sheets wird beschrieben in welche Pinzustaende du alles stellen musst um damit zu senden/empfangen etc. Das ganze sieht einiges komplizierter aus als das, was ich bisher genutzt habe, obwohl es vom Arbeitsablauf ein wenig an LCD Controller erinnert (also dieses Pins HIGH und LOW schalten)...
In meinen Augen wirst du da nicht drum herum kommen eine entsprechende Library zu schreiben - schwierig duerfte das nicht nicht wirklich sein, aber Fingerspitzengefuehl brauchst du schon (siehe Timingcharts).
Unmoeglich ist es nicht das Ding zum laufen zu bringen, aber auch nicht wirklich einfach - am besten du machst eine klasse in der du die einzelnen Zustaende genau wie in dem Sheet nachbaust.. das sollte der beste weg sein. Danach kannst du das ja verfeinern indem du immer weider gleiche Teile zusammenlegst und so weiter..
Wuerd dir gerne dabei helfen, da das ungefaehr nach dem aussieht, was mir fuer mein kleines Projekt gefallen koennte, aber mir gefaellt an dem Chip das Format nicht - oder hast du das Teil irgendwo als DIP gefunden? Ich hab bisher nur QFN gesehen...

Viel Glueck damit!

Oha das hört sich für mich echt grausam schweirig an, ist wohl nicht die plug-and-play Lösung...

Da scheint auch die zweite Funklösung zu scheitern, die einfachen Sende/Empfängermodule von Sparkfun haben leider auch nicht funktioniert.

Vielleicht hat doch schon mal jemand die Transceiver um laufen gebracht?

Gibt´s noch eine andere Alternative zu den Xbee-Shields die funktioniert?

Also ich hab von Seeedstudio die 315Mhz Receiver/Transmitter Module im Einsatz, die mittels VirtualWire ganz ordentlich laufen. Was genau willst du denn bewerkstelligen?
Was deine Transceiver angeht - schwierig ist das mit sicherheit nicht, wuerd idr ja sogar helfen, aber bei mir scheiterts schonmal allein an der Bauform... kann sowas ueberhaupt nicht loeten...

Ich will eigentlich nur so einfach wie möglich Funken, hab erst die Sparkfun 433mhz Module verwendet aber sie haben auch mit Virtual WIre nicht funktioniert.

Ich würde auch andere Module verwenden, die Seeedstudio Module gibts ja auch in 433mhz und die gleichen den von dir verwendeten im Aufbau denke ich. Vielleicht probiere ich die mal. Wo hast du die denn in Deutschland gekauft? Diese hier meine ich.

http://www.seeedstudio.com/depot/433mhz-rf-link-kit-p-127.html

(Übrigens sind die 315mhz in Deutschland soviel ich weiß nicht erlaubt, das ist hier keine freie Frequenz.)

Die Transveiver Module gibts doch fertig, da muss man nur noch Pins dranlöten, da sind keine besonderen Fähigkeiten nötig.

Aber ich hab mittlerweile echt respekt vor Funk, das hat bis jetzt noch nie geklappt und ich brauche unebedingt Funkende Arduinos für meine Diss. und ich kann die Xbees nicht verwenden, da ich ohne Adresierung funken will.

Hm, hab das Teil nur in QFN Form bisher gefunden... mit Pins dran waere das wirklich SEHR interessant (Die Sparkfun Seite laesst sich einfach nicht oeffnen ><)

Meine 315Mhz Dinger hab ich direkt bei Seeedstudio bestellt, ich such da nie lange wenn ich sowas sehe - idR dauert der Versandt eh nicht lange und ist meist guenstiger als wenn ich den Kram in De kaufe.

edit
Nachtrag: Konnte die Sparkfun Seite tatsaechlich einmal oeffnen - da gibt es einen Code fuer PIC.. das ganze sieht doch ordentlich aus.. das kann man doch ganz gut auf Arduino umwandeln?

Mir ist nicht bekannt, dass schonmal jemand Code für das Board veröffentlicht hätte. Wäre also super, wenn jemand die Vorlage vom PIC einfach zum Arduino porten könnte.

Und meist reicht es, wenn man Pins auf die Boards von Sparkfun lötet und diese dann in den Arduino steckt, meistens auf der Seite wo die analogen Pins sind... denn die bei Sparkfun denken oft mit. Aber kann man bei dem Board natürlich nicht wissen und ohne funktionstüchtigen Sketch kann man Board oder Arduino zerstören, aber das ist ja klar.

Versuch also mal den Code zu portieren und ich denke, dass wir Dir helfen werden soweit das hier im Forum möglich ist. Ohne Board kann man aber den Code schlecht testen...

Also ich bin leider ein ziehmlicher Prgrammier Anfänger, zehre gerade noch so von meinen C64 basic Kenntnissen, ich kann also den Pic Code nicht in Arduino übersetzen.

Die Funkmodule sind nicht direkt für die Arduinos gedacht, man kann sie nicht direkt auf die Arduino Pins aufstecken.

Eigentlich sind die Module für SPI Schnittstellen gedacht, die gibts auch am Arduino aber ich kann keine Vollständige SPI-Pin-Belegung des Arduinos finden.

Ich würde meine Module ja jemandem zur Verfügung stellen, der eine Library dafür schreiben möchte.

Sobald es die SEEDSTUDIO 433mhz Funkmodule wider gibts werde ich diese probiren, die sind aber viel größer und uneleganter als die Transceiver von Sparkfun. Ich würde schon lieber die Transceiver benutzen.

Du kannst die SPI Lib aus dem Playground mal testen:
http://www.arduino.cc/playground/Code/Spi

wichtig ist, dass die Pins so benutzt werden wie auf der Seite angegeben, also:

pin 13 SCK SPI clock
pin 12 MISO SPI master in, slave out
pin 11 MOSI SPI master out, slave in
pin 10 SS SPI slave select

ich kann dazu noch als Tipp sagen, dass man auch die Pins vom ICSP benutzen kann und zwar:
ISCP pin 3: SCK
ISCP pin 4:MOSI
ISCP pin 1:MISO
SS findest Du allerdings wirklich nur auf pin 10 vom Arduino, nicht auf dem ICSP header.

Zu beachten ist auch, das SCK einen Pull-Down Widerstand mit 1kOhm fest verdrahtet hat.

Ich sehe allerdings nicht, dass diese Module SPI unterstützen. Ich weiss allerdings nicht, was dieses ShockBurst ist, das ein 3-wire Protokoll zu sein scheint. Vielleicht ist das irgendwie SPI kompatibel?

Man kann die Module aber auch im direct mode benutzen, dann benötigt man sogar nur 6 Pins, da der DR1 Pin nicht unterstützt wird in diesem Fall. Daten werden dann 1:1 so raus geschickt wie sie am Chip ankommen. Allerdings muss man sich um alle Details kümmern, wie Preamble, Checksum und bei mehreren Teilnehmern auch Adressen...

Ich glaube, der PIC Beispielcode verwendet diesen ShockBurst Modus, habe mir das aber nur grob angeguckt.

Das Board benötigt 7 Pins um den Kanal1 zu benutzen, die kann man sicht natürlich auf den Arduino legen. Wie man möchte. Nur die 3.3V stellen ein echtes Problem dar.

Falls ich Zeit finde - arbeite gerade an einigen Protokollen - werde ich versuchen den PIC Code mal so brauchbar wie moeglich zu uebersetzen, so, dass du hoffentlich nur noch debuggen brauchst.

Ok.. das ist nun quick&dirty und so wahrscheinlich so falsch, wie etwas nur falsch sein kann - aber ich hab es mal versucht hier neben dem Steinegucken umzuschreiben.
Die PinModes, speziell bei RX duerften ein wenig herumzicken, da musst du mal schauen inwiefern es da noch editierbedarf gibt.. auch die Umrechnungen von Byte nach Bit waren so ein kleineres Problem - WIE ging das noch gleich? Stehe da total auf dem Schlauch.
Ansonsten habe ich so viel im Originalzustand belassen, wie moeglich war.. Nur der Kram mit dem auf 8Mhz takten.. das verstehe ich nicht und da muesstest du entsprechend schauen, wie du das mit dem Arduino hinbekommst.. evtl einen externen Quarz einbauen oder so...
Achja.. und da ich keine AHnung vom PIC habe kommt mir '0b.0010.0011' spanisch vor. Ich tippe darauf, dass das bytes sind - aber wie sie genau gelesen werden weis ich nicht, vielleicht kann da jemand anderes was dazu sagen.. ich hab mal von rechts nach links gezaehlt...

Hoffe dir hilft das ein wenig weiter:

/*
      Quick and dirty translation of the Sparkfun 24G-256bit example.
      Not tested! Nachtwind (martin@shalmirane.de)
*/

#define Clock_8MHz
#define Baud_9600


/* Ports */

///would be nice to have some Port expander for this...
#define TX_CE      12
#define TX_CS      11
#define TX_CLK1    10
#define TX_DATA    9

#define RX_CE       7
#define RX_CS       6
#define RX_CLK1     5
#define RX_DATA     4
#define RX_DR       3

int data_array[29];
int counter;
int packet_number;





void setup()
{
//Pinmodes
      pinMode(TX_CE, OUTPUT);
      pinMode(TX_CS, OUTPUT);
      pinMode(TX_CLK1, OUTPUT);
      pinMode(TX_DATA, OUTPUT);

      pinMode(RX_CE, INPUT);    
      pinMode(RX_CS, INPUT);    
      pinMode(RX_CLK1, INPUT);          
      pinMode(RX_DATA, INPUT);    
      pinMode(RX_DR, INPUT);    
      
//    printf("\n\rRF-24G Testing:\n\r", 0);
    
    delay(1000); ///Debug: can be removed.

      configure_transmitter();
    configure_receiver();
}

void loop()
{
            int i;
            long elapsed_time;

        packet_number++;
        
        //Put some data in the ougoing array
        data_array[0] = packet_number;
        for(i = 1 ; i < 29 ; i++)
            data_array[i] = ++counter;

        transmit_data();
    
        
        if(digitalRead(RX_DR) == 1) //We have data!
            receive_data();
        
        delay(10); //Have a second between transmissions just for evaluation
    
        
}


//This will clock out the current payload into the data_array
void receive_data(void)
{
      int i, j, temp;

    digitalWrite(RX_CE,LOW);//Power down RF Front end

    //Erase the current data array so that we know we are looking at actual received data
    for(i = 0 ; i < 29 ; i++)
        data_array[i] = 0x00;

    //Clock out the data
    for(i = 0 ; i < 29 ; i++) //29 bytes
    {
        for(j = 0 ; j < 8 ; j++) //8 bits each
        {
            temp <<= 1;
            temp = digitalRead(RX_DATA);
                  digitalWrite(RX_CLK1,HIGH);
                  digitalWrite(RX_CLK1,LOW);          
        }

        data_array[i] = temp; //Store this byte
    }
    
    //if(RX_DR == 0) //Once the data is clocked completely, the receiver should make DR go low
    //    printf("DR went low\n\r", 0);
    
//      printf("Received packet %d\n\r", data_array[0]);
    //This prints out the entire array - very large!
    /*
    printf("\n\rData Received:\n\r", 0);
    for(i = 0 ; i < 29 ; i++)
    {
        printf("[%d]", i);
        printf(" : %h - ", data_array[i]);
    }
    */
    

      digitalWrite(RX_CE,HIGH);      //Power up RF Front end
}

//This sends out the data stored in the data_array
//data_array must be setup before calling this function
void transmit_data(void)
{
    int i, j, temp, rf_address;

    digitalWrite(TX_CE,HIGH);

    //Clock in address
    rf_address = 17;
      ///Umrechnung von Byte auf Bit.. keine Idee wie das noch ging... Kann das auch grad dummerweise nicht testen...
    for(i = 0 ; i < 8 ; i++)
    {
        digitalWrite(TX_DATA,!!VALUE!!);
        digitalWrite(TX_CLK1,HIGH);
        digitalWrite(TX_CLK1,LOW);   
        
        rf_address <<= 1;
    }
    
    //Clock in the data_array
    for(i = 0 ; i < 29 ; i++) //29 bytes
    {
        temp = data_array[i];
        
        for(j = 0 ; j < 8 ; j++) //One bit at a time
        {
            digitalWrite(TX_DATA,!!VALUE!!);
            digitalWrite(TX_CLK1,HIGH);
            digitalWrite(TX_CLK1,LOW);   
            
            temp <<= 1;
        }
    }
      digitalWrite(TX_CE,LOW);      //Start transmission   

}

//2.4G Configuration - Receiver
//This setups up a RF-24G for receiving at 1mbps
void configure_receiver(void)
{
    int i, j, temp;
    byte config_setup[14];

    //During configuration of the receiver, we need RX_DATA as an output
      pinMode(RX_DATA, OUTPUT);    

    //Config Mode
      digitalWrite(RX_CE, LOW);
      digitalWrite(RX_CS, HIGH);
    
    //Setup configuration array
    //===================================================================
    //Data bits 111-104 Max data width on channel 1 (excluding CRC and adrs) is 232
    config_setup[0] = 232;

    //Data bits 103-64 Channel 2 address - we don't care, set it to 200 
    config_setup[1] = 0;
    config_setup[2] = 0;
    config_setup[3] = 0;
    config_setup[4] = 0;
    config_setup[5] = 200;

    //Data bits 63-24 Channel 1 address - set it to 17
    config_setup[6] = 0;
    config_setup[7] = 0;
    config_setup[8] = 0;
    config_setup[9] = 0;
    config_setup[10] = 17;
    
    //Data bits 23-16 Address width and CRC
    config_setup[11] = 49; //0b.0010.0011; ???
    
    //Data bits 15-8 
    config_setup[12] = 89; //0b.0100.1101; ???
    
    //Data bits 7-0
    config_setup[13] = 13; //0b.0000.1101; ???
    //===================================================================

      
      
      
    //Clock in configuration data
      
      ///I am somewhat clueless here. Its something simple. You iterate through the 14 values of the configuration and end up setting the RX_DATA port according to the Bit you read.
      ///unfortunately i dont remember how to convert from byte to bit - shame on me ;0) 
    for(i = 0 ; i < 14 ; i++)
    {
        temp = config_setup[i];
        
        for(j = 0 ; j < 8 ; j++)
        {   
            digitalWrite(RX_DATA,!!VALUE!!);
            digitalWrite(RX_CLK1,HIGH);
            digitalWrite(RX_CLK1,LOW);                    
        }
    }
    
    //Configuration is actived on falling edge of CS (page 10)
    digitalWrite(RX_CE,LOW); 
      digitalWrite(RX_CS,LOW); 

    //After configuration of the receiver, we need RX_DATA as an input
      pinMode(RX_DATA,input);


    //Start monitoring the air
    digitalWrite(RX_CE,HIGH); 
      digitalWrite(RX_CS,LOW); 

//    printf("RX Configuration finished...\n\r", 0);

}    

//2.4G Configuration - Transmitter
//This sets up one RF-24G for shockburst transmission
void configure_transmitter(void)
{
    int i, j, temp;
    int config_setup[14];

    //Config Mode
      digitalWrite(TX_CE, LOW);
      digitalWrite(TX_CS, HIGH);    
    //Setup configuration array
    //===================================================================
    //Data bits 111-104 Max data width on channel 1 (excluding CRC and adrs) is 232
    config_setup[0] = 232;

    //Data bits 103-64 Channel 2 address - we don't care, set it to 200 
    config_setup[1] = 0;
    config_setup[2] = 0;
    config_setup[3] = 0;
    config_setup[4] = 0;
    config_setup[5] = 200;

    //Data bits 63-24 Channel 1 address - set it to 17
    config_setup[6] = 0;
    config_setup[7] = 0;
    config_setup[8] = 0;
    config_setup[9] = 0;
    config_setup[10] = 17;
    
    //Data bits 23-16 Address width and CRC
    config_setup[11] = 49; //0b.0010.0011; ???
    
    //Data bits 15-8 
    config_setup[12] = 89; //0b.0100.1101; ???
    
    //Data bits 7-0
    config_setup[13] = 12; //0b.0000.1100; ???
    //===================================================================

    //Clock in configuration data
      ///I am somewhat clueless here. Its something simple. You iterate through the 14 values of the configuration and end up setting the RX_DATA port according to the Bit you read.
      ///unfortunately i dont remember how to convert from byte to bit - shame on me ;0)       
    for(i = 0 ; i < 14 ; i++)
    {
        temp = config_setup[i];
        
        for(j = 0 ; j < 8 ; j++)
        {   
            digitalWrite(TX_DATA,!!VALUE!!);
            digitalWrite(TX_CLK1,HIGH);
            digitalWrite(TX_CLK1,LOW);     
        
//            temp <<= 1;
        }
    }
    
    //Configuration is actived on falling edge of CS (page 10)
    digitalWrite(TX_CE,LOW); 
      digitalWrite(TX_CS,LOW);       

//    printf("TX Configuration finished...\n\r", 0);
}

Achja.. und da ich keine AHnung vom PIC habe kommt mir '0b.0010.0011' spanisch vor. Ich tippe darauf, dass das bytes sind

das sind bits. Konkret wird damit das config word definiert. 0b ist das Praefix, das angibt, dass alles nach dem b nun binaer zu verstehen ist. Die Nibbles (4bits) werden dabei durch Kommata getrennt.

Von rechts nach links zaehlen ist korrekt und insgesamt hast Du das sehr richtig gemacht mit dem config word. Das MSB, also das bit ganz links in diesem Fall muss als erstes geschickt werden dann... die Umwandlung des confgi words in bits ist in der Tat etwas knifflig, da der avr compiler da keinen sinnvollen mechanismus fuer hat. Man koennte ein uint32 nehmen und dann die bits durch shiften schlage ich vor. Allerdings gibt es in der Tat auch viele 8 Bit Teilwoerter... der ganze Chip ist sehr abenteuerlich :slight_smile:

Den Rest vom Code gucke ich mir mit und mit mal an...

Was ich noch gar nicht verstanden habe: wieso unterscheiden die eigentlich RX und TX Pins? Ich sehe immer nur ein DATA pin und ein CLOCK Pin, jeweils als RX oder als TX zu verstehen, je nach Mode... kann man da nicht die gleichen Pins verwenden fuer Senden und Empfangen?

Was noch nicht klappt ist das mit den Timern... die verhalten sich beim AVR natuerlich anders als beim PIC. Bedeutet: Pakete koennen noch nicht empfangen werden (siehe loop() )

Der Code muss also noch weiter bearbeitet werden, aber zusammen mit dem Code von Nachtwind kann man da vielleicht schon was basteln... Man sollte die Timer direkt mit 16MHz beruecksichtigen und ich denke auch, dass hier und da noch Pausen fehlen, da der PIC ja ne Ecke langsamer unterwegs ist bei gewissen Operationen...

Ansonsten mal hier mein Versuch:

void setup()
{
    packet_number = 0;
    counter = 0;
    
    //SETUP PINS FEHLT NOCH

    pinMode(RX_DR, INPUT);
    digitalWrite(RX_DR, LOW);

    delay(100);

    configure_transmitter();
    configure_receiver();
}

void loop()
{
    uint8_t i;
    uint16_t elapsed_time;
    packet_number++;
        
        //Put some data in the ougoing array
        data_array[0] = packet_number;
        for(i = 1 ; i < 29 ; i++)
        {
            data_array[i] = ++counter;
        }

        transmit_data();
        
        /*
        
        NOCH NICHT PORTIERT
    
        //Here we monitor how many clock cycles it takes for the receiver to register good data
        //elasped_time is in cycles - each cycles is 500ns at 8MHz so 541 cycles = 270.5us
        //==============================================
        TMR1IF = 0;
        TMR1L = 0 ; TMR1H = 0 ; TMR1ON = 1;
        while(RX_DR == 0)
            if (TMR1IF == 1) break; //If timer1 rolls over waiting for data, then break
        TMR1ON = 0;
        elapsed_time.high8 = TMR1H;
        elapsed_time.low8 = TMR1L;
        //==============================================
        
        */
        
        if(digitalRead(RX_DR) == HIGH) //We have data!
            {
          receive_data();
        }
        
        delay(10); //Have a second between transmissions just for evaluation
}

//This will clock out the current payload into the data_array
void receive_data(void)
{
    uint8_t i, j, temp;

            digitalWrite(RX_CE, LOW);//Power down RF Front end
     

    //Erase the current data array so that we know we are looking at actual received data
    for(i = 0 ; i < 29 ; i++)
        data_array[i] = 0x00;

    //Clock out the data
    for(i = 0 ; i < 29 ; i++) //29 bytes
    {
        for(j = 0 ; j < 8 ; j++) //8 bits each
        {
            temp <<= 1;
            if(digitalRead(RX_DATA) == HIGH)
                  {
                        temp |= (1 << 0);
                  }
                  {
                        temp &= ~(1 << 0);
                  }
            digitalWrite(RX_CLK1, HIGH);
                    digitalWrite(RX_CLK1, LOW);
        }

        data_array[i] = temp; //Store this byte
    }
    
   
    
            digitalWrite(RX_CE, HIGH);//Power up RF Front end
}

//This sends out the data stored in the data_array
//data_array must be setup before calling this function
void transmit_data(void)
{
    uint8_t i, j, temp, rf_address;

    digitalWrite(TX_CE, HIGH);

    //Clock in address
    rf_address = 17;
    for(i = 0 ; i < 8 ; i++)
    {
                if(rf_address & (1 << 7))
        {
              digitalWrite(TX_DATA, HIGH);
        }
        else
        {
              digitalWrite(TX_DATA, LOW);
        }
        
        
        digitalWrite(TX_CLK1, HIGH);
        digitalWrite(TX_CLK1, LOW);
        
        rf_address <<= 1;
    }
    
    //Clock in the data_array
    for(i = 0 ; i < 29 ; i++) //29 bytes
    {
        temp = data_array[i];
        
        for(j = 0 ; j < 8 ; j++) //One bit at a time
        {
              if(temp & (1 << 7))
                    {
                          digitalWrite(TX_DATA, HIGH);
                    }
                    else
                    {
                          digitalWrite(TX_DATA, LOW);
                    }
            
            digitalWrite(TX_CLK1, HIGH);
            digitalWrite(TX_CLK1, LOW);
            
            temp <<= 1;
        }
    }
    
    digitalWrite(TX_CE, LOW);//Start transmission      
}

//2.4G Configuration - Receiver
//This setups up a RF-24G for receiving at 1mbps
void configure_receiver(void)
{
    uint8_t i, j, temp;
    uint8_t config_setup[14];

    //During configuration of the receiver, we need RX_DATA as an output
    pinMode(RX_DATA, OUTPUT);
    digitalWrite(RX_DATA, LOW);
    
    pinMode(RX_DR, INPUT);
    digitalWrite(RX_DR, LOW);//not sure
   
   
    //Config Mode   
    digitalWrite(RX_CE, LOW);
    digitalWrite(RX_CS, HIGH);
    
    
    //Setup configuration array
    //===================================================================
    //Data bits 111-104 Max data width on channel 1 (excluding CRC and adrs) is 232
    config_setup[0] = 232;

    //Data bits 103-64 Channel 2 address - we don't care, set it to 200 
    config_setup[1] = 0;
    config_setup[2] = 0;
    config_setup[3] = 0;
    config_setup[4] = 0;
    config_setup[5] = 200;

    //Data bits 63-24 Channel 1 address - set it to 17
    config_setup[6] = 0;
    config_setup[7] = 0;
    config_setup[8] = 0;
    config_setup[9] = 0;
    config_setup[10] = 17;
    
    //Data bits 23-16 Address width and CRC
    config_setup[11] = 0b00100011;
    
    //Data bits 15-8 
    config_setup[12] = 0b01001101;
    
    //Data bits 7-0
    config_setup[13] = 0b00001101;
    //===================================================================

    //Clock in configuration data
    for(i = 0 ; i < 14 ; i++)
    {
        temp = config_setup[i];
        
        for(j = 0 ; j < 8 ; j++)
        {   
                    if(temp & (1 << 7))
                    {
                          digitalWrite(RX_DATA, HIGH);
                    }
                    else
                    {
                          digitalWrite(RX_DATA, LOW);
                    }
              digitalWrite(RX_CLK1, HIGH);
              digitalWrite(RX_CLK1, LOW);
             
     
            temp <<= 1;
        }
    }
    
    //Configuration is actived on falling edge of CS (page 10)
    digitalWrite(RX_CE, LOW);
    digitalWrite(RX_CS, LOW);

    //After configuration of the receiver, we need RX_DATA as an input
    pinMode(RX_DR, INPUT);
    pinMode(RX_DATA, INPUT);
    
    //Start monitoring the air
    digitalWrite(RX_CE, HIGH);
    digitalWrite(RX_CS, LOW);
}    

//2.4G Configuration - Transmitter
//This sets up one RF-24G for shockburst transmission
void configure_transmitter(void)
{
    uint8_t i, j, temp;
    uint8_t config_setup[14];
    
    //Config Mode
    digitalWrite(TX_CE, LOW);
    digitalWrite(TX_CS, HIGH);

    
    //Setup configuration array
    //===================================================================
    //Data bits 111-104 Max data width on channel 1 (excluding CRC and adrs) is 232
    config_setup[0] = 232;

    //Data bits 103-64 Channel 2 address - we don't care, set it to 200 
    config_setup[1] = 0;
    config_setup[2] = 0;
    config_setup[3] = 0;
    config_setup[4] = 0;
    config_setup[5] = 200;

    //Data bits 63-24 Channel 1 address - set it to 17
    config_setup[6] = 0;
    config_setup[7] = 0;
    config_setup[8] = 0;
    config_setup[9] = 0;
    config_setup[10] = 17;
    
    //Data bits 23-16 Address width and CRC
    config_setup[11] = 0b00100011;
    
    //Data bits 15-8 
    config_setup[12] = 0b01001101;
    
    //Data bits 7-0
    config_setup[13] = 0b00001100;
    //===================================================================

    //Clock in configuration data
    for(i = 0 ; i < 14 ; i++)
    {
        temp = config_setup[i];
        
        for(j = 0 ; j < 8 ; j++)
        {   
                    if(temp & (1 << 7))
                    {
                          digitalWrite(TX_DATA, HIGH);
                    }
                    else
                    {
                          digitalWrite(TX_DATA, LOW);
                    }
            digitalWrite(TX_CLK1, HIGH);
            digitalWrite(TX_CLK1, LOW);
            
            temp <<= 1;
        }
    }
    
    //Configuration is actived on falling edge of CS (page 10)
    digitalWrite(TX_CE, LOW);
    digitalWrite(TX_CS, LOW);
}

Die ueberlegung mit den Pins ist mir auch gekommen..
Aber ich meine auf der Platine gesehen zu haben, dass da auch zwischen den TX und RX Sachen unterschieden wird - und wenn ich an das Datasheet denke, wuerde ich mich wundern, wenn ein 'zusammenlegen' wirklich funktionieren taete, da die dort ja fuer jeden Zustand schon fast einen Modus haben...
Was die Timergeschichte angeht wuerd ich sagen, dass man da einen Interrupt braucht, da das ja irgendwie Zeitkritisch ist.. also im Endeffekt so wie bei der Virtualwire Lib..

config_setup[13] = 0b00001101;

Wusste gar nicht, dass das so beim Arduino funktioniert, nette kleine Sache :0)

Auch waere es eine Ueberlegung wert die configure_ Funktionen zusammenzulegen. Beim 'uebersetzen' ist mir aufgefallen, dass die codes stellenweise redundant sind und man einiges auslagern koennte um evtl Sketchplatz zu sparen..

Ja, da ist einiges redundant. Am Ende können wir eine Lib erstellen und sie im Playground veröffentlichen. Ich habe allerdings wirklich wenig Zeit gerade und es wäre gut, wenn sich hier noch andere einklinken könnten um die Sache voran zu bringen.

Das würde vielleicht auch Zeichen setzen, dass die deutsche Community nicht nur die Sachen aus USA klaut, sondern dass hier durchaus fähige Leute sind, die auch mal was produktiv und am liebsten gemeinsam umsetzen.

Für die Timer muss man die Hardware auf dem Tisch liegen haben, das kann ich jetzt schon sagen. Timing ist extrem wichtig bei solchen RF Geschichten, da muss man auch genaustens auf das Datenblatt achten. Aber selbst wenn man zwei Module mit dem Arduino verbunden hat ist es sicher noch nervtötend, bis die endlich mal kommunizieren, also bitte nicht zu einfach vorstellen. Geduld ist das wichtigste. Immerhin haben die Boards wohl eingebaute Antennen, da hat man da schonmal keinen Stress mit.

RX und TX kann ich aber nach wie vor nicht auf den Platinen erkennen, ich denke, dass es wirklich ein bidirektionales Interface ist und deswegen wundert mich dieser Beispielcode doch sehr.

Stimmt, jetzt wo du es sagst seh ich das auch. Laut dem Bild von der Platine sind 'nur'

VCC
CE
CS
DR1
CLK
DAT
GND

zu erkennen, also keine Unterscheidung ob RX oder TX...
Insgesamt scheint die Platine, wenn ich den Datasheet richtig erkenne, genau das zusammenzufassen, was das Datasheet zusammenzufassen im Blockdiagramm zeigt (Seite 2). Wenn ich das alles im Kopf so hingedreht bekomme, wie es moeglich zu sein scheint komme ich auch auf die Platine, die bei Sparkfun zu bekommen ist.. wobei das ganze wuerde in meinen Augen bedeuten, dass der Beispielcode fuer die Ansteuerung des Chips selbst gedacht ist und nicht fuer die Ansteuerung ueber die Platine direkt.. was aber im besten Falle bedeutet, dass Pins gespart werden und man einiges mehr an redundantem Code haette...
Was mir auch grad auffaellt.. ist da nicht ein 16Mhz Kristall auf der Platine von Sparkfun?!

Und da ich ja auch auf der Suche nach einem guten RF System bin frag ich mich grad mehr und mehr ob ich nicht selbst zwei von den Modulen besorgen soll... an sich gefallen die mir ja schon recht gut...
Speziell, da man so eine Lib wirklich mal gut als Zeichen fuer die Deutsche Community einsetzen koennte...

edit
Nebenbei faellt mir grad noch an den Bildern auf, dass die rund 3 oder 4 Verschiedene Platinen da liegen haben bei denen nicht nur die Antenne unterschiedlich ist. die die wir hier besprechen hat zB wesentlich weniger Pinouts als die anderen zT haben... irgendwie kommt mir das spanisch vor..

kimmi, kannst Du mal gute Bilder von Deinen Platinen posten?

und wegen dem Quartz: die Platine ist sicher mit 16MHz getaktet, aber das PIC Board, für den der Code ist konnte ja nur mit 8MHz getaktet werden, da die das ganze PIC Board auf 3.3Volt runter geregelt haben und da bereits 8MHz ausserhalb der Spec sind.

Der Duemilanove arbeitet mit 5V, den würde ich nicht runter schrauben. Also sollte man wohl wirklich nicht die Pins direkt in den Arduino stecken, sondern ein Shield bauen, das am besten mit Optokopplern die Sache sauber löst. Oder man nimmt einen anderen Arduino, der 3V kann, was vieles vereinfachen würde...

Hallo Freunde, Sparkfun hat sich zwar nicht um den Arduino gekümmert aber SEEEDSTUDIO hat sich die Mühe gemacht:

http://www.seeedstudio.com/depot/24g-rf-module-nrf24l01-p-214.html

das ist der gleiche Transceiver würd ich sagen und am Code steht:

Library for Arduino - working.

.. oha hab grad mal reingeschaut, ist nicht gut Dokumentiert aber es ist ein Beispielsketch dabei (den ich aber noch nicht durchschaut habe).
Könnte aber die Lösung sein ;o)

Die sind gut.

Bitte teste mal und berichte von Deinen Ergebnissen.

Die Boards sind wirklich sehr ähnlich. Aber mit den 3.3V bin ich immernoch ein wenig skeptisch, vielleicht haben die ja was dazu geschrieben, kann das rar file hier gerade nicht öffnen.