NRF24L01 六通道摇控器PPM
本帖最后由 pww999 于 2012-11-9 14:19 编辑上次发了一个2通道PWM,
http://www.geek-workshop.com/forum.php?mod=viewthread&tid=1228
这次顺手写了个 六通道PPM,只要转变一下就行了
未测试过哦,自己测试吧
去片:
-------------------------发送端--------------------------------
//MISO -> D12
// * MOSI ->D11
// * SCK ->D13
//* CE ->D8
//* CSN ->D7
#include "SPI.h" //24L01库文件
#include "Mirf.h"
#include "nRF24L01.h"
#include "MirfHardwareSpiDriver.h"
int aaa;
int aaaa;
int bbb;
int bbbb;
int ccc;
int cccc;
int ddd;
int dddd;
int eee;
int eeee;
int fff;
int ffff;
void setup(){
Mirf.spi = &MirfHardwareSpi;//加载24L01SPI
Mirf.init(); //开始
Mirf.setTADDR((byte *)"serv1");//发送到"接收地址"
Mirf.payload = sizeof(int); //数据类型(整数)
Mirf.config();//发送通道??
}
void loop(){
aaa=analogRead(A0); //读取电平(0至1023)
bbb= analogRead(A1);
ccc=analogRead(A2);
ddd= analogRead(A3);
eee=analogRead(A4);
fff= analogRead(A5);
aaa=map(aaa,0,1023,0,999) ;
bbb=map(bbb,0,1023,1000,1999) ;
ccc=map(ccc,0,1023,2000,2999) ;
ddd=map(ddd,0,1023,3000,3999) ;
eee=map(eee,0,1023,4000,4999) ;
fff=map(fff,0,1023,5000,5999) ;
//这里如果模拟口多的话,还可以分出更多通道.........
if (aaa !=aaaa) //如果 X 向电平与之前电平不一样则执行
{
Mirf.send((byte *)&aaa); //发送X向电平
while(Mirf.isSending()){ //等待或继续发送??
}
aaaa=aaa;//保存当前电平
}
if (bbb !=bbbb) //如果 Y 向电平与之前电平不一样则执行
{
Mirf.send((byte *)&bbb);//发送Y向电平
while(Mirf.isSending()){ //等待或继续发送?
}
bbbb=bbb;//保存当前电平
}
//ccc~fff同上,自己写吧
//(也可以不用IF自己简化吧)
delay(10); // 等待0.01秒
}
---------------------接收端--------------------------------
//MISO -> D12
// * MOSI ->D11
// * SCK ->D13
//* CE ->D8
//* CSN ->D7
//LCD 1602 IIC SDA---A4328
//LCD 1602 IIC SCL---A5 328
#include "Wire.h" //LCD1602 IIC 库文件
#include <LiquidCrystal_I2C.h>;
LiquidCrystal_I2C lcd(0x27,16,2);
#include "SPI.h" //24L01库文件
#include "Mirf.h"
#include "nRF24L01.h"
#include "MirfHardwareSpiDriver.h"
int data;
int aaa;
int bbb;
int ccc;
int ddd;
int eee;
int fff;
void setup(){
lcd.init(); //加载LCD1602 IIC
lcd.backlight();
//lcd.setBacklight(120); //设置LCD背光亮度,好象没作用
delay(20);
Mirf.spi = &MirfHardwareSpi; //加载24L01SPI
Mirf.init();
Mirf.setRADDR((byte *)"serv1"); //接收地址" "
Mirf.payload = sizeof(int); //数据类型(整数)
Mirf.config();
}
void loop(){
if(Mirf.dataReady()){ //如果接收到数据则执行
Mirf.getData((byte *)&data); //接收数据
if (data>=0&&data<=999)
{
aaa=map(data,0,999,1100,1900); //这里为模拟量比例成 PPM频率 1100-1900,
}
if (data>=1000&&data<=1999)
{
bbb=map(data,1000,1999,1100,1900);
}
//ccc~fff自己写吧....
Mirf.rxFifoEmpty(); //清理24L01援存??
}
lcd.clear(); //清屏
lcd.setCursor(0, 0);
lcd.print(aaa);
lcd.setCursor(6, 0);
lcd.print(bbb);
delay(10);
} :o:o:o干什么的 本帖最后由 pww999 于 2012-11-9 09:13 编辑
由于使用int 0-99, 每次ppm频率跳变为约=8,所以精度不高,
更改0-999,这样比例提高10倍,每次ppm频率跳变为约=1了, 非常感谢LZ分享,正好要用到 学习学习,也正在做24L01+5110LCD+ARDUINO UNO作主控机,24L01+5110LCD+ARDUINO mini作客户机{:soso_e182:} 但双向通信时,运行几分钟后死机了。{:soso_e127:} 有测试过的吗,好用吗 不知道是否可以用来作为航模的接收机和遥控器呢?比如四轴 mak 一下。 xpaul 发表于 2012-11-11 17:38 static/image/common/back.gif
但双向通信时,运行几分钟后死机了。
最后出来没?我最近在做双工的,一直没结果 双工的能实现吗?
最近出了点问题! 非常感谢大神,我的遥控总算有下落了 弱弱的问句那是连续性的吗?? 可以在采集6个数据后一次以数组形式发送 可以控制六路继电器动作吗?
页:
[1]
2