自制一个SBUS的接收器吧~
RoboMaster S1资料汇总.1
RoboMaster S1 高清大图+改装建议
以前玩穿越机接触过这个SBUS的协议,后来不玩就忘记了。后来迷上大疆家的东西
S-BUS接口
因为知道这个东西,所以一直想做一些改装S1的通用可编程性,一直不是那么好。。。可是你说都折腾这个了,买个接收器插上意思不大,自己做一个最好了~
https://mp.weixin.qq.com/cgi-bin/appmsg?t=media/appmsg_edit_v2&action=edit&isNew=1&type=10&createType=0&token=258000972&lang=zh_CN
200-300之间
emmmm,我上面价钱去闲鱼看的
算了,请记住这个
这个也行,上面的接收器是建议购买
这个是平民的价钱,可能合适
https://bbs.dji.com/thread-233471-1-1.html
以上的这些请看大疆论坛的这个帖子,图都是来源于这里
https://dl.djicdn.com/downloads/robomaster-s1/20200324/RoboMaster_S1_User_Manual_v1.8_CHS.pdf
震惊。。。我居然没有看车子的文档
这个是写的,PWM输出接口
https://item.taobao.com/item.htm?spm=a2126o.11854294.0.0.747b4831TNo5w4&id=597135404779
发现一个将SBUS信号转换为电压信号的小东西
这是这个小玩意儿的输出情况
后来又找到一个完整的diy的接收器+遥控器的图
https://www.bilibili.com/read/cv8758980?share_medium=android&share_plat=android&share_source=COPY&share_tag=s_i×tamp=1608033941&unique_k=kZVcqT
这篇文章是菜籽写的,讲解各种
字节[0]:SBUS头,0x0F
字节[1-22]:16个伺服通道,每个伺服通道采用11位编码
字节[23]:
位7:数字通道17(0x80)
位6:数字通道18(0x40)
位5:丢帧(0x20)
位4:用来激活故障安全(0x10)
位0-3:n/a
字节[24]:SBUS结束字节,0x00
一帧SBUS的内容
我买的电子零件还在路上,所以这篇文章就先看原理图。
国内的参考文章,可能一查就是下面就是这几篇,所以就是看这个吧。
看这个
这里是先加了一个降压电路
这个通道是可以翻转的,就是以前是上,现在是下
串口下载的接口,没有什么好说的
无线发送的模块,这里是SPI的接口
其实是使用了5个
Arduino的板子,里面分为几个部分,无线发射+通道+通道翻转+串口
一个简单的电压检测电路
蜂鸣器
遥控器的输入IO口
大致的样子
TX0--RXD
RX1--TXD
VCC--3V3
GND--GND
遥控器端的烧录串口的连接
用到的库只有这些
RF24 radio(7, 8); // SPI通信,引脚对应关系:CE ->7,CSN ->8
struct Signal
{
byte roll;
byte pitch;
byte throttle;
byte yaw;
byte gyr;
byte pit;
};
前面的是声明引脚
下面搞一个结构体,把遥控器的即时数据保存去
写了一个函数来回中所有的摇杆
Signal data;
忘了说这样去声明一个结构体
还有这个函数,读取对应的电位器以后
换算成arduino规定的数据范围
// Serial.print("\t");Serial.print(data.roll);
// Serial.print("\t");Serial.print(data.pitch);
// Serial.print("\t");Serial.print(data.throttle);
// Serial.print("\t");Serial.print(data.yaw);
// Serial.print("\t");Serial.print(data.gyr);
// Serial.print("\t");Serial.println(data.pit);
如果你想在串口打印一下当前的数据,可以在loop里面写这个
发送于获取的主要逻辑
setup里面对按钮声明
最后测试一下电压情况
/* ArduinoProMini-6通道发射器
* by Bilibili 蔡子CaiZi
*
* A0~5 -> 模拟输入,2~5 -> 通道正反开关
* A6 -> 电压检测
* 6 -> 蜂鸣器
*
* NRF24L01 | Arduino
* CE -> 7
* CSN -> 8
* MOSI -> 11
* MISO -> 12
* SCK -> 13
* IRQ -> 无连接
* VCC -> 小于3.6V
* GND -> GND
*/
const uint64_t pipeOut = 0xBBBBBBBBB; //为何这么多B币?与接收器中相同的地址进行通信
RF24 radio(7, 8); // SPI通信,引脚对应关系:CE ->7,CSN ->8
struct Signal {
byte roll;
byte pitch;
byte throttle;
byte yaw;
byte gyr;
byte pit;
};
Signal data;
void ResetData()
{
data.roll = 127; // 横滚通道AIL(中心点127)
data.pitch = 127; // 俯仰通道ELE
data.throttle = 0; // 信号丢失时,关闭油门THR
data.yaw = 127; // 航向通道RUD
data.gyr = 0; //第五通道
data.pit = 0; //第六通道
}
void setup()
{
radio.begin();
radio.openWritingPipe(pipeOut);//pipeOut通信地址
radio.stopListening(); //发射模式
ResetData();//初始化6个通道值
Serial.begin(115200);
pinMode(2,INPUT);//正反通道开关为数字输入
pinMode(3,INPUT);
pinMode(4,INPUT);
pinMode(5,INPUT);
pinMode(6,OUTPUT);//蜂鸣器推挽输出
if (analogRead(A6)*3.28*3/1023<5){//调整3校准电压检测,5为报警电压
for(int i=0;i<3;i++){
digitalWrite(6,HIGH);//蜂鸣器响
delay(100);
digitalWrite(6,LOW);
delay(100);
}
}
else{
digitalWrite(6,HIGH);//蜂鸣器响
delay(100);
digitalWrite(6,LOW);
}
}
// 将ADC获取的0~1023转换到0~255
int chValue(int val, int lower, int middle, int upper, bool reverse)
{
val = constrain(val, lower, upper);//将val限制在lower~upper范围内
if ( val < middle )
val = map(val, lower, middle, 0, 128);
else
val = map(val, middle, upper, 128, 255);
return ( reverse ? 255 - val : val );
}
void loop()
{
Serial.print("\t");Serial.print(analogRead(A0));//将数据通过串口输出
Serial.print("\t");Serial.print(analogRead(A1));
Serial.print("\t");Serial.print(analogRead(A2));
Serial.print("\t");Serial.println(analogRead(A3));
// 需要对摇杆的最值、中值进行设置
data.roll = chValue( analogRead(A0), 59, 517, 882, digitalRead(2));
data.pitch = chValue( analogRead(A1), 115, 525, 896, digitalRead(3));
data.throttle = chValue( analogRead(A2), 145, 522, 920, digitalRead(4));
data.yaw = chValue( analogRead(A3), 70, 530, 925, digitalRead(5));
data.gyr = chValue( analogRead(A4), 0, 510, 1020, false );
data.pit = chValue( analogRead(A5), 0, 510, 1020, false );
radio.write(&data, sizeof(Signal));//将数据发送出去
// Serial.print("\t");Serial.print(data.roll);
// Serial.print("\t");Serial.print(data.pitch);
// Serial.print("\t");Serial.print(data.throttle);
// Serial.print("\t");Serial.print(data.yaw);
// Serial.print("\t");Serial.print(data.gyr);
// Serial.print("\t");Serial.println(data.pit);
}