|
楼主 |
发表于 2016-6-18 20:21:12
|
显示全部楼层
这是测速模块和超声波测距模块一起运行的代码,就是无线模块的收发代码怎么写不知道
#include <TimerOne.h>
#define U_Pin 6
// 设定SR04连接的Arduino引脚
const int TrigPin = 2;
const int EchoPin = 3;
float distance;
int servopin=6;//定义舵机接口数字接口6
int myangle;//定义角度变量
int pulsewidth;//定义脉宽变量
int val;
void servopulse(int servopin,int myangle)//定义一个脉冲函数
{
pulsewidth=(myangle*11)+500;//将角度转化为500-2480的脉宽值
digitalWrite(servopin,HIGH);//将舵机接口电平至高
delayMicroseconds(pulsewidth);//延时脉宽值的微秒数
digitalWrite(servopin,LOW);//将舵机接口电平至低
delay(20-pulsewidth/1000);
}
long counter_val[2] = {0, 0}; //定义数组,用于存放外部中断计数值
byte CurCnt = 0; //定义当前计数器标志,用于判断当前正在计数的数组
int j = 0; //定义定时器中断标志,用于判断是否发生中断
float Speed; //设置变量time,计时
void setup(){
Serial.begin(9600);
attachInterrupt(0, counter, RISING);
Timer1.initialize(100000); // 设置定时器中断时间,单位微秒,此处为0.1秒
Timer1.attachInterrupt( timerIsr ); // 打开定时器中断
interrupts(); //打开外部中断
pinMode(servopin,OUTPUT);//设定舵机接口为输出接口
Serial.begin(9600);//连接到串行端口,波特率为9600
Serial.println("servu=o_seral_simple ready" ) ; // put your setup code here, to run once:
// 初始化串口通信及连接SR04的引脚
Serial.begin(9600);
pinMode(TrigPin, OUTPUT);
// 要检测引脚上输入的脉冲宽度,需要先设置为输入状态
pinMode(EchoPin, INPUT);
Serial.println("Ultrasonic sensor:");
}
void loop()
{
long lTemp = 0; //定义临时存储数据变量
if (j == 1) //判断是否发生定时器中断,即定时时间是否到达
{
j = 0; //清除定时器中断标志位
if ((CurCnt & 0x01) == 0) //当前使用的是偶数计数器,则上次频率值存放在第二个元素中
{
lTemp = counter_val[1]; //读取数组第二个元素中的数值
counter_val[1] = 0; //读完清除原来的数值,以便下次使用
}
else //当前使用的是奇数计数器,则上次频率值存放在第一个元素中
{
lTemp = counter_val[0]; //读取数组第二个元素中的数值
counter_val[0] = 0; //读完清除原来的数值,以便下次使用
}
Speed = (lTemp / 10) * 600;
Serial.print("S"); //发送帧头大写S
Serial.print( Speed); //发送频率数据,并回车换行
Serial.print("rpm");
}
val=Serial.read();//读取串行端口的值
if(val>'0'&&val<='9')
{
val=val-'0';//将特征量转化为数值变量
val=val*(180/9);//将数字转化为角度
Serial.print("moving servo to ");
Serial.print(val,DEC);
Serial.println();
for(int i=0;i<=50;i++)//给予舵机足够的时间让它转到指定角度
{
servopulse(servopin,val);//引用脉冲函数
}
} // put your main code here, to run repeatedly:
// 产生一个10us的高脉冲去触发TrigPin
digitalWrite(TrigPin, LOW);
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);
// 检测脉冲宽度,并计算出距离
distance = pulseIn(EchoPin, HIGH) / 58.00;
Serial.print(distance);
Serial.print("cm");
Serial.println();
delay(1000);
}
void counter()
{
//通过当前计数器来实现对外部中断计数值存储的切换
counter_val[CurCnt & 0x01] += 1; //发生一次中断则加1
}
void timerIsr()
{
j = 1; //置位定时器中断标志位
CurCnt++; //当前计数器的值加1,实现另一个计数值切换
}
这是论坛里找的nrf24l01的代码,可以稍微改一下再套用吗?
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
void setup()
{
Serial.begin(9600);
Mirf.cePin = 8; //设置CE引脚为D9
Mirf.csnPin = 7; //设置CE引脚为D10
Mirf.spi = &MirfHardwareSpi;
Mirf.init(); //初始化nRF24L01
//设置接收标识符"Sen01"
Mirf.setRADDR((byte *)"Sen01");
Mirf.payload = sizeof(unsigned int);//在这把2 修改成4
Mirf.channel = 3;
Mirf.config();
//注意一个Arduino写Sender.ino,另一个写Receiver.ino。
//这里标识写入了Sender.ino
Serial.println("I'm Sender...");
}
unsigned int adata = 0,bdata = 0;
void loop()
{
//读取值到adata
adata = speed;
bdata = distance;
//由于nRF24L01只能以byte单字节数组形式发送Mirf.payload个数据,
//所以必须将所有需要传输的数据拆成byte。
//下面定义byte数组,存放待发数据,因为Mirf.payload = sizeof(unsigned int);
//实际下面等于byte data[2];
byte data[Mirf.payload];
//adata是unsigned int双字节数据,必须拆开。
//将adata高低八位拆分:
data[0] = adata & 0xFF; //低八位给data[0],
data[1] = adata >> 8; //高八位给data[1]。
data[2] = bdata & 0xFF; //低八位给data[0],
data[3] = bdata >> 8;
//设置向"serv1"发送数据
Mirf.setTADDR((byte *)"Rec01");
Mirf.send(data);
//while死循环等待发送完毕,才能进行下一步操作。
while(Mirf.isSending()) {}
Serial.println(adata);
Serial.print("*****");
Serial.println(bdata,DEC);
delay(3000);
} |
|