看这篇文章前先看下面这篇
自制S-Bus接收器(控制dji EP车)
我们继续看这个,这个是发射端的数结构包
使用这段代码发送出去
接收端的代码,多了一个舵机的库
int ch_width_1 = 0, ch_width_2 = 0, ch_width_3 = 0, ch_width_4 = 0, ch_width_5 = 0, ch_width_6 = 0;
这里使用int的类型,声明几个通道
Servo ch1;
Servo ch2;
Servo ch3;
Servo ch4;
Servo ch5;
Servo ch6;
初始化几个舵机的控制类
然后再配置代码里面写应该调用那些引脚
作为PWM输出的信号脚
回中的函数在这里
完整的配置代码
CE:模块控制线,CSN为低时,CE协同CONFIG寄存器共同决定NRF24L01状态
CSN:SPI片选线
SCK:SPI时钟线
MOSI:SPI数据线(主机输出从机输入)
MISO:SPI数据线(主机输入从机输出)
IRQ:中断信号线。中断时变为低电平,在以下三种情况变低:Tx FIFO发完并且收到ACK(使能ACK情况下)、Rx FIFO收到数据、达到最大重发次数
const uint64_t pipeIn = 0xBBBBBBBBB; //与发射端地址相同
发送端的地址,就好像是个管道一样
const uint64_t pipeOut = 0xBBBBBBBBB; //为何这么多B币?与接收器中相同的地址进行通信
接收的时候也要这个东西
先开始
然后发射端,把这个地址发出去
stop,发射模式
也好理解,就管发射,就不听周遭环境的其它信号了
在接收端,对偶的接收这个地址
开始听环境中的信号
radio.setPALevel(RF24_PA_MIN);
也可以设置发射的电平
radio.stopListening()函数,它将模块设置为发送器,
radio.startListening()函数,它将模块设置为接收器。
在接收端,专门写了一个接收使用的函数
在循环里面
先执行接收函数,顺便把发送时间拿到手
接着做一个简单的判断,来看看信号是不是不可以用了
使用时间来判断,同时也显式的控制LED的亮暗
然后对数据进行数据范围的转换
将0~255映射到1000~2000,即1ms~2ms/20ms的PWM输出
Serial.print("\t");
Serial.print(ch_width_1);
Serial.print("\t");
Serial.print(ch_width_2);
Serial.print("\t");
Serial.print(ch_width_3);
Serial.print("\t");
Serial.print(ch_width_4);
Serial.print("\t");
Serial.print(ch_width_5);
Serial.print("\t");
Serial.println(ch_width_6);
处理完,打印一下。完全可以可视化的绘图。
最后输出去
PWM版本的接收机代码就是这样,真简单。
SBUS是硬件级别的取反
就是高电平变低,反之这样的
前面是SBUS只有一个线传输数据
后面是只接在串口的Tx引脚
波特率为100000、8个数据位,偶数奇偶校验位和2个停止位的反向串行逻辑。
SERIAL_8E2
这样的
协议(要用到位操作)
数据头(1字节)+数据(22字节)+标志位(1字节)+数据尾(1字节)
同时也要知道通道之间的转换
SBUS有高速和低速的发送模式:
a.高速模式:每4ms发送一次
b.低速模式:每14ms发送一次
100Khz不是标准的串口速率,不好用电脑接收
下篇文章继续讲解代码问题以及协议问题。