• 【Espruino】NO.15 nRF24L01+无线收发器


    http://blog.csdn.net/qwert1213131/article/details/35853747

    本文属于个人理解,能力有限,纰漏在所难免,还望指正!

    【小鱼有点电】

    【Espruino中文社区】

    nRF24L01+(或nRF24L01P)是一款工作在2.4~2.5GHz 世界通用ISM 频段的单片无线收发器芯片。无线收发器包含:频率发生器、增强型SchockBurst模式控制器、功率放大器、晶体振荡器调制器、解调器。输出功率频道选择和协议的设置能够通过SPI接口进行设置。
    极低的电流消耗,当工作在发射模式下发射功率为0dBm时电流消耗为11.3mA,接收模式时为13.5mA,掉电模式和待机模式下电流消耗更低。
    由于在无线通讯应用中常常会遇到远距离通讯的要求,眼下有一些nRF24L01+无线模块在原设计上添加了PA(功率放大器)和LNA(低噪声放大器)的型号,如“nRF24L01+PA”等。在发射部分通过PA电路将nRF24L01+最大0dBm的输出功率放大到+22dBm左右,同一时候在接收部分通过LNA电路添加接收信号的强度。通过这样的方式能够有效的添加nRF24L01+无线模块的通讯距离,在空旷环境下最高可添加到2km。【以上段落摘自百度百科
    对于这个器件已经有模块库能够直接调用,很方便,不须要理会底层硬件怎样工作。
    须要注意的:每一个器件都有发送和接收地址,不能同一时候进行收发,收发包大小上限为32字节。
    模块与板子的连接例如以下所看到的,当然也能够使用其它引脚:
    NRF24L01+ Name Espruino Type
    1 GND GND GND
    2 3.3V 3.3 3.3v
    3 CE B1 GPIO Out
    4 CSN B0 GPIO Out
    5 SCK A5 SPI SCK
    6 MOSI A7 SPI MOSI
    7 MISO A6 SPI MISO
    8 IRQ unused GPIO In

    NRF24L01P的模块库已经封装好了对应的数据处理函数,我们能够发生命令、接收数据,甚至对设备又一次编程。

    因为NRF24L01P使用SPI接口,因此需首先配置SPI接口,SPI1.setup({sck:A5, miso:A6, mosi:A7});然后调用NRF24L01P模块,var nrf =require("NRF24L01P").connect( SPI1, B0, B1);

    配置从机:

    SPI1.setup({sck:A5, miso:A6, mosi:A7});
    var nrf = require("NRF24L01P").connect( SPI1, B0, B1 );
    function onInit() {
      nrf.init([0,0,0,0,1], [0,0,0,0,2]);
    }
    onInit();
    setInterval(function() {
      nrf.slaveHandler();
    }, 50);
    配置主机:

    SPI1.setup({sck:A5, miso:A6, mosi:A7});
    var nrf = require("NRF24L01P").connect( SPI1, B0, B1 );
    function onInit() {
      nrf.init([0,0,0,0,2], [0,0,0,0,1]);
    }
    onInit();
    setInterval(function() {
      nrf.masterHandler();
    }, 50);
    须要注意的是,init函数里面的两个地址,一个是接收地址,一个是发送地址,将init函数放到onInit()函数中,能够在Espruino启动时自己主动调用onInit()。把以上代码分别下载进两个板子后,就能够開始以下的操作了。

    我们在web IDE中,操作主机板使用sendCommand函数来向从机发送命令,则会收到从机返回的结果。

    若输入nrf.sendCommand("1+2",function(r){print("=="+r);});则会收到“=3”。

    若输入nrf.sendCommand("LED2.set()",function(r){print("=="+r);});则会收到“=undefined”,而且从机的LED2点亮。

    当然我们还能够对Espruino无线编程,

    nrf.sendCommand("function on() { LED3.set(); }");
    nrf.sendCommand("on();");

    当然slaveHandler和masterHandler不是必须的,我们还能够直接调用send和dataReady来进行通讯,示比例如以下所看到的:
    发送端代码例如以下:

    SPI1.setup({sck:A5, miso:A6, mosi:A7});
    var nrf = require("NRF24L01P").connect( SPI1, B0, B1 );
    function onInit() {
      nrf.init([0,0,0,0,1], [0,0,0,0,2]);
    }
    onInit();
    setInterval(function() {
      var value = analogRead(A0); // 读取A0电压值
      nrf.sendString(""+value);   //将电压值发送出去
    }, 5000);
    接收端代码例如以下:

    SPI1.setup({sck:A5, miso:A6, mosi:A7});
    var nrf = require("NRF24L01P").connect( SPI1, B0, B1 );
    function onInit() {
      nrf.init([0,0,0,0,2], [0,0,0,0,1]);
    }
    onInit();
    
    dataLine = "";
    setInterval(function() {
      while (nrf.dataReady()) {
        var data = nrf.getData();
        for (var i in data) {
          var ch = data[i];
          if (ch===0 && dataLine!=="") {
            console.log(dataLine);
            // 我们能够将数据保存到SD卡,使用require('fs').appendFile("log.txt", dataLine+"
    ");
            dataLine = "";
          } else if (ch!==0) {
            dataLine += String.fromCharCode(ch);
          }
        }
      }
    }, 50);

  • 相关阅读:
    js 跳转链接的几种方式
    js 指定分隔符连接数组元素join()
    Ajax async属性
    非负数正则表达式
    firefox因 HTTP 严格传输安全(HSTS)机制无法打开网页
    查看linux系统某宏的定义(另类)
    ctags高级用法
    ctags简明用法
    关于数组和指针的一道例题的解读
    让gcc和gdb支持intel格式的汇编
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4488051.html
Copyright © 2020-2023  润新知