Radijo ryšio moduliai nRF24L01

Neseniai eBay nusipirkau keletą radijo ryšio modulių nRF24L01. Jų kaina šiuo metu juokinga – mažiau nei 1$ už vnt. Tai mažo galingumo (iki 1mW) 2,4 GHz dažnio moduliai. Ryšys dvikryptis, t.y. ir siųstuvas, ir imtuvas viename. Lengva pajungti prie Arduino, yra keletas bibliotekų tam. Pabandžiau panaudoti juos balansuojančio roboto valdymui.

nrf1

Prie kontrolerio jie pasijungia per SPI. Kaip Arduino panaudojau atmega8 su vidiniu 8MHz generatoriumi. Įrašiau atitinkamą bootloader‘į. Nereikia čia nei stabilumo, nei didesnio greičio. Bendravimui su moduliais aš panaudojau Mirf biblioteką. Yra keli pavyzdžiai ir kurių matosi, kad viskas labai paprasta. Vienintelis nepatogumas, kad dar reikia ir 3,3V. Galėtų ant pačio modulio būti stabilizatorius. Deja, jo nėra. Kad valdymas būtų patogus, pasijungiau analoginį džoistiką.

nrf2

Džoistiko valdymo svirtį galima paspausti, suveikia jungiklis, kurį panaudojau papildomai komandai perduoti. Aš naudoju „return to home“ įjungimui. Dar įdėjau porą šviesos diodų. Vienas iš jų rodo, kad įjungtas režimas grįžti atgal, kitas pradeda mirksėti kai baigiasi akumuliatorius. Jie užsidega tik tada, kai gauna atitinkamą komandą iš roboto. Ryšys dvikryptis. Perduodant informaciją nereikia galvoti, ar ji bus priimta teisingai, tuo rūpinasi pati biblioteka. Tereikia pasirinkti kokiu kanalu veiks, kokiu greičiu, adresą (priims tik tas modulis, kurio adresas bus toks pat), ir nurodyti kiek baitų bus perduodama.

nrf3

Veikia puikiai, tiesa atstumas nedidelis, bandymai rodo, kad apie 10 metrų. Toliau ryšys jau pradeda trūkinėt. Gaunasi visai neblogas, paprastas ir pigus valdymas, kurį galima naudoti bet kam valdyti nedideliu atstumu.

This entry was posted in Elektronika, Programavimas, Robotai. Bookmark the permalink.

13 Responses to Radijo ryšio moduliai nRF24L01

  1. ecka333 says:

    Na o palyginimui nRF24L01 ir HC-05. Kokie abiejų pliusai ir minusai?

  2. ReM says:

    Bluetooth – kai reikia ryšio su kompiuteriu, telefonu, planšete. Tokiu atveju su bluetooth daug paprasčiau, nes vienam gale jis jau yra. O šitie moduliai puikiai tinka kai reikia padaryt ryšį tarp dviejų mikrokontrolerių.

  3. Andrius says:

    sveiki, norejau paklausti gal galite pasidalinti savo programos kodu, pats bandau kurti ale pulteli su WIFI moduliais ir norisi kodo pwz, o gal ir visa koda pritaikyciau. aciu

  4. ReM says:

    Ne, viso kodo nedėsiu. Bet jei yra kokių klausimų, kas nors neveikia, galėčiau pagelbėt (jei tai bus mano sugebėjimų ribose).

  5. Andrius says:

    preblema yra tame kad vienas nrf24l01 prijungtas prie arduino nano, irasau pati paprasciausia koda kad siustu duomenis pvz ADC reiksme. nepavyksta issiusti, grazina FALSE reiksme o kitas arduino mega nieko nepavyksta gauti, daug pavyzdziu isbandziau, neveikia, nebesugalvoju ka daryt. buvau rades kad 3,3v maitinimas per silpnas tai pagal rekomandacijas uzkabinau po 10uF kondika, bet niekas nepadeda. gal tau kokiu pacioje pradzioje buvo betu sujungiant tuos du nrf24l01 kad eitu valdyti
    pultas toks https://drive.google.com/file/d/0B7l6SxJ3dkyCNkJlbElvdzVsQ00/view?usp=sharing

  6. ReM says:

    Jei naudojama Mirf…
    Setup:
    Mirf.cePin = 16; // prie ko pajungta
    Mirf.csnPin = 10;
    Mirf.spi = &MirfHardwareSpi;
    Mirf.init();
    Mirf.setRADDR((byte *)”1234″); // adresas
    Mirf.payload = 3; // kelis baitus perdavinejam
    Mirf.channel = 90; // koks nors kanalas
    Mirf.config();
    Mirf.configRegister(RF_SETUP,0x06); // Set 1MHz data rate – this increases the range slightly
    Mirf.configRegister(EN_AA, 0x00); //Disable auto-acknowledge

    Išsiuntimas:
    Mirf.setTADDR((byte *)”1234″); // adresas
    Mirf.send((byte *)&txdata); // txdata – keletas perduodamų baitų
    while(Mirf.isSending()); // būtina palaukt kol perduos

    Gavimas:
    if(Mirf.dataReady()){
    Mirf.getData(rxdata); // gaunam kelis baitus
    }

  7. Andrius says:

    bandziau ir su MIRF biblioteka tavo pateikta varianta, nieko nenusiuncia. kazkur kazka esu priveles. siaip bandau naudoti RF24 library

  8. Andrius says:

    viskas veikia, tiesiog pries siunciant reik duomenis sudeti i masyva, o nusiuntus, vel pasiimi is masyvo ir viskas puikiai veikia, nors pvz ir be masyvo veikia. istrink mano pasikartojancius komentarus.

  9. ReM says:

    Taip, žinoma į masyvą, jei perduodama keletas baitų.

  10. minde says:

    O kiek tie moduliukai kainuoja, o tarkim jei noriu padaryt su 5 relem valdyma pulteliu per wifi gal imanoma rast koki jau padaryta projekta, nes nelabai programuot moku o noretusi kazka tokio padaryt ;)

  11. ReM says:

    Tai juk parašyta kiek kainuoja… :) O tokių kaip tu nori pilnas ebay…

  12. Andrius says:

    sveikas dar karta, duomenis is pulteliu nusiuncia, robotukas viska gauna nera problemu, bet bandant pasidaryt kad pultelis ir siustu ir kartu ir gautu duomenis, man su pulteliu nepavyksta gauti, tiksliau su if(Mirf.dataReady()){Mirf.getData(&a);} gaunu duomenis kuriuos issiuncia i pulteli robotas, bet man reik kad juo rodytu realiu laiku. darau su while(!Mirf.dataReady()){} Mirf.getData(&a); ir tiesiog negauna jokiu duomenu. jei uzkomentuoju issiuntima i robota, tada gauna pultelis duomenis tavrkingai, bet kartu siusti ir gauti nesugeba, tiesiog pultelis nuluzsta. robotuke to nera jis pasiima duomenis apdoroja ir grazina man i pulteli tvarkingai. robote yra arduino mega, pultelis su arduino nano, kur ieskoti problemu, gal tiesiog arduino nano per silnas?
    while(!Mirf.dataReady()){Serial.println(“loading…”);} ir kai nano luzsta visalaik sukasi ciklas. negauna tipo duomenu, nors su if karrt nuo karto atsinaujina duomenys, kas kelias sekundes.

  13. ReM says:

    Kas pas tave yra “a”? Masyvas? Pabandyk Mirf.getData(a); Bet šiaip sunku suprast kame gali būti reikalas… Per mažai info…

Leave a Reply

Your email address will not be published. Required fields are marked *