红外遥控的实现由于时间有限,并且协议的难度也比较大,因此我们借助于Arduino对信息进行解码,再通过自己编码实现红外遥控。
如果想使用FPGA实现红外遥控,具体实现方式可以参考:FPGA之红外遥控
目录
1. 红外模块介绍
红外遥控系统由红外发射部分和红外接收部分组成。发射部分由遥控案件、编码以及调制电路、红外发光二极管等组成。接收部分由光敏二极管、解调电路等组成,最后将解调的信号输入FPGA内进行解码输出。
我们使用的是NEC编码协议。NEC协议使用的是PPM(脉冲位置调制)进行编码,当按下遥控器的一个按键时,会发送一帧的数据,一帧数据由引导码、地址码、地址反码、数据码、数据反码以及一位结束位组成。
2. 自制的编码解码方式
编码方式如下:
FPGA只能0-1信号,因此可以用n个IO口进行编码,总共有个信号,拿两个IO举例:
IO电平值 | 信息 |
00 | 停止 |
01 | 前进 |
10 | 左转 |
11 | 右转 |
即使用两个IO便可实现个信息的编码,在Vivado中进行解码,便可实现通信。
这种方式的优点是设计十分简单粗暴,同时能实现通信,但是缺点也十分明显。需要占用大量的IO口,并且需要外置单片机进行解码。其实就相当于脱裤子放屁,不过因为时间与水平有限,这也是一种折中的实现方法。
具体流程如下:
3. Arduino代码
#include <IRremote.h>
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
String str;
void setup() {
Serial.begin(115200);
irrecv.enableIRIn();
pinMode(2, OUTPUT);
pinMode(7, OUTPUT);
pinMode(3, OUTPUT);
pinMode(5, OUTPUT);
}
void loop() {
if (irrecv.decode(&results))
{
str = String(results.value); // 将结果转换为十六进制字符串
switch (results.value) {
case 16718055:
Serial.println("Forward");
digitalWrite(2, HIGH);
break;
case 16730805:
Serial.println("Back");
digitalWrite(7, HIGH);
break;
case 16716015:
Serial.println("Left");
digitalWrite(3, HIGH);
break;
case 16734885:
Serial.println("Right");
digitalWrite(5, HIGH);
break;
case 16726215:
Serial.println("Stop");
digitalWrite(2, LOW);
digitalWrite(7, LOW);
digitalWrite(3, LOW);
digitalWrite(5, LOW);
break;
}
irrecv.resume();
}
}
str的值需要根据实际测试。
4.Verilog代码
//红外遥控指令
if(Mode_Control==1)//如果遥控模式标志符置高
begin
if(signal==5'b0000)//停止
mode<=0;
if(signal==5'b0001)//前进
mode<=2;
if(signal==5'b0010)//后退
mode<=1;
if(signal==5'b0100)//左转
mode<=3;
if(signal==5'b1000)//右转
mode<=4;
end
简单的解码,判断mode的值。电机控制代码在之前已经给出。