NRF24L01 Kullanımı

Başlatan erdogan2734, 26 Haziran 2016, 00:07:04

gokhan_picer

kodu donanımda deneyemediğim için bu şekilde paylaşmak durumunda kaldım. Bana özel olarak link paylaşırsanız satın alabilirim. 3 modül aldım 2 si arızalı çıktı-çalıştırınca yanacak gibi ısındı-. 3.3 V ile çalıştırdığıma eminim.

ete

Şimdiye kadar bir çok satıcıdan aldım hiç bozuk çıkmadı.
Ancak çıkmaz anlamını taşımıyor bu söylediklerim.
Ben olsam satıcı değiştirirdim. Amazon dan almak bir nevi garanti demektir.
Araştır bakalım uygun fiyat ve adet de alabileceğin bir yer bulabilirmisin.

Ete

ahmet_zxc

Alıntı yapılan: ete - 29 Aralık 2025, 21:59:13Şimdiye kadar bir çok satıcıdan aldım hiç bozuk çıkmadı.
Ancak çıkmaz anlamını taşımıyor bu söylediklerim.
Ben olsam satıcı değiştirirdim. Amazon dan almak bir nevi garanti demektir.
Araştır bakalım uygun fiyat ve adet de alabileceğin bir yer bulabilirmisin.

Ete
abi artık birçok alışveriş sitesi hem kendi satış yapıyor hem de başklarının satış yapbilmesi için platform hizmeti veriyor.
amazondan aldığın ürünü amazon satmıyor olabilir. çinli bi vatandaş olabilir..
ayrıca amazon ürün iadesi ve para iadesi konusunda eskisi kadar güvenilir değil.
bu anlamda TR de hiçbir firma güvenilir değil...

ete

Amazon da koşulsuz iade seçeneği var en azından bu bozuk deyip geri verebilirsin aldığın ürünü. Ya da ne bileyim tipini beğenmedim dersin. Ama lehim yapmadan soket kullanarak test etmek gerekir. Diğer sitelerde bazı malzemeleri kullanıp bozabiliyorlar sonrada bozuk malzemeyi satışa koyuyorlar. Benimde başıma gelmişti. Amazon çok ciddi bir site bu tür olumsuzlukların en az yaşanabileceği bir yer. Amazon reklamı yapıyorum sanmayın. Sadece doğruları dile getiriyorum. Yoksa en azından fiyat politikası yüzünden bende pek sevmiyorum aslında ama bazen mecbur kalıyoruz işte mal almakta.

Ete


ahmet_zxc

abi 3-4 kere yaşadım çinli satıcılar dan gelen ürünlerde problem yaşadım amazon iade kabul etmediği gibi türlü bahanelerle yorumlarımı da engelledi. yorumlarımı resimlerle kanıtladığım halde...

özellikle amazon tr berbat ötesi. 2007 den beri kullanıyorum ama eski güvenilirlikleri yok.
aliex ve alibaba da öyle oldu son zamanlarda.. çin devletiyle ters düştüler çok kan kaybettiler..

mecburiyetten bankaları, kargoları, pazar yerlerini, operatörleri, taksileri(istanbul da) kullanıyoruz, sadece mecburiyetten yoksa ne olduklarını iyi biliyoruz.

Maxim

Ete abiye katılıyorum, ben amazon kadar acayip iade politikası uygulayan firma görmedim
eğer sen haklıysan ne aldıysan al hiç önemi yok anında para hesabında
geçmişte yanlış beden gönderilen 1 mont parası iade edildi + mont bende kaldı sizin olsun dediler
bacanağa verdim giyiyor, defalarca sordum göndereyim diye kabul etmediler (benim bedenimde değil)

(hah tam uyanık,kalitesiz,omurgasız insanlar için açık kapı bıraktım)
eskiden çok olurdu bu ebayde,
mal gelmedi, bozuk geldi veya eksik geldi diyip paypalden haksız yere iade alan omurgasızları hatırladım bir an.

bir keresinde gene yanlış gönderilen kazak bende kaldı parası iade edildi
3 ay önce aldığım skop üzerinde eğri gösterimi yapan tamir cihazı, adı aklıma gelmedi, curve testermı?
bozuk geldi çalışmıyor, para iadesi yapıldı üründe masanın üzerinde duruyor müsait vakit tamir etmeye çalışıcam.

Bu tip hatalı şeyler hep çin üreticilerden geldi, hiç direk amazon satışlarıyla ilgili problem yaşamadım.
Ayrıca ben amazon prime üyesiyim, belkide onun katkısıda vardır.

gokhan_picer

#216
Herkese merhaba,

Sistemi temel olarak çalıştırabildim. Tabi ki bazı pin durumlarının verdiği hatalar ve hata çözümleri için GPT'den destek de aldım. Sistemi test etmek adına verici tarafa bir de joystick bağladım ve buradan analog sinyal ölçüyorum.

Senaryo;

Joystick, 8 farklı konuma getirildiğinde(sağ,sol,yukarı,aşağı ve +4 ara yönler) farklı analog çıkışlar verir ve basit olarak bazı konumlarda vericinin sinyal göndermesini istedim. istenilen noktalarda sinyal göndermek için ADC dönüşümü gerekiyor ve yazılımda ADC modülünün yanı sıra timer modülü de var(isterseniz bazı beklemelerde timer1 modülünü kullanmak profesyonellik anlamında daha iyi olur). Vericiden nRF modülüne gönderilecek veri yüklendikten sonra bundan emin olmak adına verici LED kısa süreli yanar.

Alıcı tarafta ise MCU, nRF'i kontrol eder ve istenen paket gelmişse(ben kontrol işini sadece "RX BUFFER doluysa tamam" şeklinde yaptım) alıcı devre LED'i 1 saniye yanar. Yazılım, joystick orta konuma gelince bir önceki alıcı LED'i durumunu koruyacak şeklinde devam eder.

Burada paylaşmamda sıkıntı yoksa sizler tabi ki farklı donanım varyasyonları düşünebilirsiniz.

Verici Kod
//////////
#include <xc.h>
#include <stdint.h>

#pragma config FOSC = HS, WDTE = ON, PWRTE = ON, BOREN = ON
#pragma config LVP = OFF, CPD = OFF, WRT = OFF, CP = OFF

#define _XTAL_FREQ 8000000

#define CSN    RA5
#define CE      RB5
#define LED_TX  RB1

uint16_t adc0, adc1, adc_sum;
uint8_t tx_ready = 1;

// ================= SPI =================
void SPI_Init(void)
{
    TRISC3 = 0;
    TRISC5 = 0;
    TRISC4 = 1;
    SSPSTAT = 0x40;
    SSPCON  = 0x21;
}

unsigned char SPI_RW(unsigned char d)
{
    SSPBUF = d;
    while(!BF);
    return SSPBUF;
}

// ================= NRF =================
void NRF_WriteReg(unsigned char reg, unsigned char val)
{
    CSN = 0;
    SPI_RW(0x20 | reg);
    SPI_RW(val);
    CSN = 1;
}

unsigned char NRF_ReadReg(unsigned char reg)
{
    unsigned char val;
    CSN = 0;
    SPI_RW(reg);
    val = SPI_RW(0xFF);
    CSN = 1;
    return val;
}

void NRF_Command(unsigned char cmd)
{
    CSN = 0;
    SPI_RW(cmd);
    CSN = 1;
}

// ================= ADC =================
uint16_t ADC_Read(uint8_t ch)
{
    ADCON0 &= 0xC7;
    ADCON0 |= (ch << 3);
    __delay_us(5);
    GO_nDONE = 1;
    while(GO_nDONE);
    return (  (uint16_t)ADRESH << 8  ) | ADRESL;
}

// ================= MAIN =================
void main(void)
{
    TRISA0 = 1;
    TRISA1 = 1;
    TRISA5 = 0;
    TRISB1 = 0;
    TRISB5 = 0;

    LED_TX = 0;
    CSN = 1;
    CE  = 0;

    ADCON1 = 0x84;
    ADCON0 = 0x81;

    SPI_Init();
    __delay_ms(100);

    unsigned char addr[5] = {0xE7,0xE7,0xE7,0xE7,0xE7};

    NRF_WriteReg(0x00, 0x0E);  // TX
    NRF_WriteReg(0x01, 0x3F);
    NRF_WriteReg(0x02, 0x01);
    NRF_WriteReg(0x03, 0x03);
    NRF_WriteReg(0x05, 40);
    NRF_WriteReg(0x06, 0x06);

    NRF_WriteReg(0x11, 1);
    NRF_WriteReg(0x10, addr
[o]);

    NRF_Command(0xE1);
    NRF_WriteReg(0x07, 0x70);

    while(1)
    {
        CLRWDT();

        adc0 = ADC_Read(0);
        adc1 = ADC_Read(1);
        adc_sum = adc0 + adc1;

        if(adc_sum > 1525 && tx_ready)
        {
            tx_ready = 0;

            NRF_Command(0xE1);
            NRF_WriteReg(0x07, 0x70);

            CSN = 0;
            SPI_RW(0xA0);
            SPI_RW(0xA5);
            CSN = 1;

            CE = 1;
            __delay_us(20);
            CE = 0;

            LED_TX = 1;
            __delay_ms(200);
            LED_TX = 0;
        }

        if(adc_sum < 1525)
            tx_ready = 1;

        __delay_ms(40);
    }
}


Alıcı kod
/////////
#include <xc.h>
#include <stdint.h>

#pragma config FOSC = HS, WDTE = ON, PWRTE = ON, BOREN = ON
#pragma config LVP = OFF, CPD = OFF, WRT = OFF, CP = OFF

#define _XTAL_FREQ 8000000

#define CSN    RA5
#define CE      RB5
#define LED_RX  RB1

// ================= SPI =================
void SPI_Init(void)
{
    TRISC3 = 0;
    TRISC5 = 0;
    TRISC4 = 1;
    SSPSTAT = 0x40;
    SSPCON  = 0x21;
}

unsigned char SPI_RW(unsigned char d)
{
    SSPBUF = d;
    while(!BF);
    return SSPBUF;
}

// ================= NRF =================
void NRF_WriteReg(unsigned char reg, unsigned char val)
{
    CSN = 0;
    SPI_RW(0x20 | reg);
    SPI_RW(val);
    CSN = 1;
}

unsigned char NRF_ReadReg(unsigned char reg)
{
    unsigned char val;
    CSN = 0;
    SPI_RW(reg);
    val = SPI_RW(0xFF);
    CSN = 1;
    return val;
}

void NRF_Command(unsigned char cmd)
{
    CSN = 0;
    SPI_RW(cmd);
    CSN = 1;
}

void NRF_WriteBuf(unsigned char reg, unsigned char *buf, unsigned char len)
{
    CSN = 0;
    SPI_RW(0x20 | reg);
    for(unsigned char i = 0; i < len; i++)
        SPI_RW(buf[i]);
    CSN = 1;
}

// ================= MAIN =================
void main(void)
{
    TRISA5 = 0;
    TRISB1 = 0;
    TRISB5 = 0;

    LED_RX = 0;
    CSN = 1;
    CE  = 0;

    SPI_Init();
    __delay_ms(100);

    unsigned char addr[5] = {0xE7,0xE7,0xE7,0xE7,0xE7};

    NRF_WriteReg(0x00, 0x0F);  // RX mode
    NRF_WriteReg(0x01, 0x3F);
    NRF_WriteReg(0x02, 0x01);
    NRF_WriteReg(0x03, 0x03);
    NRF_WriteReg(0x05, 40);
    NRF_WriteReg(0x06, 0x06);
    NRF_WriteReg(0x11, 1);

    NRF_WriteBuf(0x0A, addr, 5);

    NRF_Command(0xE1);          // FLUSH_TX
    NRF_Command(0xE2);          // FLUSH_RX
    NRF_WriteReg(0x07, 0x70);  // clear flags

    CE = 1;

    while(1)
    {
        CLRWDT();

        unsigned char status = NRF_ReadReg(0x07);

        if(status & 0x40)      // RX_DR
        {
            CE = 0;            // RX durdur

            CSN = 0;
            SPI_RW(0x61);      // R_RX_PAYLOAD
            SPI_RW(0xFF);
            CSN = 1;

            NRF_WriteReg(0x07, 0x40);
            NRF_Command(0xE2);  // RX FIFO flush

            LED_RX = 1;
            __delay_ms(1000);
            LED_RX = 0;

            CE = 1;            // RX tekrar aktif
        }
    }
}


Donanım

////////Verici

PIC16F877A, NRF24L01 MODULE, LED, JOYSTICK, 8MHZ CRYSTAL OSCILLATOR, NRF24L01 3.3 V ADAPTER, 5 V DC SUPPLY

////////Alıcı

PIC16F877A, NRF24L01 MODULE, LED, 8MHZ CRYSTAL OSCILLATOR, NRF24L01 3.3 V ADAPTER, 5 V DC SUPPLY

Ayrıca her iki taraf için de direnç, kapasitör gibi gerekli komponentler.

Kod paylaşmamda sıkıntı olmazsa daha ayrıntılı açıklama da yapacağım. Hayırlı günler.


Powered by EzPortal
▲