5iMX宗旨:分享遥控模型兴趣爱好

5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)
楼主: LooksSoYaung
打印 上一主题 下一主题

[坦克] 基于纸模设计的油电四号坦歼(A)

[复制链接]
21
 楼主| 发表于 2020-6-3 10:52 | 只看该作者
本帖最后由 LooksSoYaung 于 2020-6-22 07:57 编辑

这楼讲讲程序吧,建议看不懂的直接跳过!
使用arduino系统进行处理,编程方便快捷多了(相较于51单片机),不过由于系统固有特性,会导致出现某些匪夷所思的问题,接下来会有提到。
以前用arduino接收遥控信号都是用pulseIn函数,读取接收机pwm信号引脚的高电平脉冲时长,但这个函数会死等每次信号脉冲结束,在此期间无法做别的事,因此读取信号的路数越多整体运行就越卡,通常三路以上就能明显感受,所以这并不是个好办法。
然后就把注意力集中在接收机的sbus信号引脚上,它这一个信号就能解读出所有通道的数据。经过学习,发现所谓的sbus其实是一种串口通信方式,不过比较**的一点是它是负逻辑,需要接一个电平反向电路才能让单片机正常通信,还好三个元件能搞定 ,其次,接收机Sbus的数据帧格式总共25个字节,包含1个起始位  ,8个数据位,1个奇偶校验位, 两个终止位1,波特率100000,以上这些决定了它只能被接在arduino的硬件串口上,只有这才能被准确设置,软件串口除了设置波特率啥也调不了

解决了信号读取,还得搞信号处理,sbus把每个通道的数据分段组合在一个个数据段中,需要用数学方法重新分解还原,网上有教程(不过给arduino的少之又少)。
需要特别提醒的是软件串口和舵机控制函数不能同时开启!他俩的定时器调用有冲突,会导致舵机运行时有莫名其妙的跳动。我程序里的软件串口是用来检查读取到的信号用的(需要外接一个USB转TTL下载器传到电脑串口助手显示),当真正用作接收机时就打上双斜杠屏蔽掉。
通过软件串口我获知我这遥控器的中位信号值是1000而不是1500(其实可以搞一个初始化程序让arduino记住遥控器各通道的中位值和最大最小值)。油门通道要特别注意不管是往前还是往后打杆都是要增加电机驱动的占空比,而且发动机风门也都是要逐渐开大,唯一不同的是倒车时倒车继电器会启动,使通过驱动电机的电流反向;转向时内侧履带占空随杆量增大而减小,反正都算是数学逻辑问题啦。


#include <stdio.h>
#include <Servo.h>
//#include <SoftwareSerial.h>
//SoftwareSerial mySerial(10,9);
volatile int pos[16];//16路舵机
Servo servo_3;
Servo servo_4;
Servo servo_5;
int Speed,l_speed,r_speed,L_speed,R_speed=0;//
int fangxiang=90;//瞄准方向

void setup(){

  Serial.begin(100000,SERIAL_8E2);//设置串口
  servo_3.attach(3);//油门舵机
  servo_4.attach(4);//俯仰舵机
  servo_5.attach(5);//方向舵机
  servo_5.write(90);//方向舵机初始角度
  pinMode(2, OUTPUT);//接开炮继电器
  pinMode(7, OUTPUT);//接发动机启动继电器
  pinMode(12, OUTPUT);//接倒车继电器
  pinMode(13, OUTPUT);//接倒车继电器
//mySerial.begin(115200);  
}

void loop(){

SBUS();

if(900<pos[0]&&pos[0]<1100)/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
{l_speed=0;
r_speed=0;}
if(pos[0]>1100)//左拐
{
l_speed=(map(pos[0], 1100, 2000, 0, 255));
r_speed=0;
}
if(pos[0]<900)//右拐
{
r_speed=(map(pos[0], 900, 1, 0, 255));
l_speed=0;
}

if(900<pos[1]&&pos[1]<1100)//静止********************************************************************************************************
{Speed=0;
digitalWrite(12,LOW);
digitalWrite(13,LOW);
}
if(pos[1]>1100)//前进
{servo_3.write((map(pos[1], 1100, 2000,135,45)));
Speed=(map(pos[1], 1100, 2000, 50, 255));
digitalWrite(12,LOW);
digitalWrite(13,LOW);
}
if(pos[1]<900)//后退
{servo_3.write((map(pos[1], 900, 1, 135,45)));
Speed=(map(pos[1], 900, 1, 50, 255));
digitalWrite(12,HIGH);//倒车继电器启动
  digitalWrite(13,HIGH);
}

L_speed=Speed-l_speed;
if(L_speed<0){L_speed=0;}
R_speed=Speed-r_speed;
if(R_speed<0){R_speed=0;}
analogWrite(11,(constrain(L_speed, 0, 255)));//速度输出*************************************************************************
analogWrite(6,(constrain(R_speed, 0, 255)));

servo_4.write((map(pos[2], 1, 2100, 60, 160)));//俯仰舵机映射

if(pos[3]>1200)//方向瞄准*************************************
{fangxiang--;
delay(20);
if(fangxiang<25)fangxiang=25;
}
if(pos[3]<800)
{fangxiang++;
delay(20);
if(fangxiang>155)fangxiang=155;
}
servo_5.write(fangxiang);

if(pos[5]<1500)//fire**********************************************************************************************************************************************
{ digitalWrite(2,HIGH);
delay(200);
digitalWrite(2,LOW);
delay(1000);
}
else digitalWrite(2,LOW);

if(pos[6]>1500)//启动发动机***************************************************************************************************************************************
{ digitalWrite(7,HIGH);
}
else digitalWrite(7,LOW);

}


//---Start--//SBUS信号处理代码开始
int sublowbit(byte data,int flags){//取任意设定位数二进制低位
int rdata=0,bitdata=0;
for (int i=0;i<flags;i++){
bitdata=bitRead(data,i);
rdata=rdata+(bitdata<<i);  
}
return(rdata);  
}

int subhightbit(byte data,int flags){//取任意设定位数二进制高位
int rdata=0,bitdata=0;
int h=flags;
for (int i=7;i>=(8-flags);i--){
bitdata=bitRead(data,i);
rdata=rdata+(bitdata<<(--h));
}
return(rdata);
}

void SBUS(){
byte SBUS_date[25];
if (Serial.available()>0)
{
if(Serial.peek()==0x0F)//判断数据包头文件
{
Serial.readBytes(SBUS_date,25);
pos[0]=(sublowbit(SBUS_date[2],3)<<8)+subhightbit(SBUS_date[1],8);
pos[1]=(sublowbit(SBUS_date[3],6)<<5)+subhightbit(SBUS_date[2],5);
pos[2]=(sublowbit(SBUS_date[5],1)<<10)+(sublowbit(SBUS_date[4],8)<<2)+subhightbit(SBUS_date[3],2);
pos[3]=(sublowbit(SBUS_date[6],4)<<7)+subhightbit(SBUS_date[5],7);
pos[4]=(sublowbit(SBUS_date[7],7)<<4)+subhightbit(SBUS_date[6],4);
pos[5]=(sublowbit(SBUS_date[9],2)<<9)+(sublowbit(SBUS_date[8],8)<<1)+subhightbit(SBUS_date[7],1);
pos[6]=(sublowbit(SBUS_date[10],5)<<6)+subhightbit(SBUS_date[9],6);
pos[7]=(sublowbit(SBUS_date[11],8)<<3)+subhightbit(SBUS_date[10],3);
pos[8]=(sublowbit(SBUS_date[13],3)<<8)+subhightbit(SBUS_date[12],8);
pos[9]=(sublowbit(SBUS_date[14],6)<<5)+subhightbit(SBUS_date[13],5);


}


while(Serial.read()>=0){
for(int i=0; i<25; i++){
  SBUS_date=00000000;
}
}
}

}


//---End---//SBUS信号处理代码结束




这是我目前的底盘驱动程序,修改自从别人那弄来的sbus接收程序,源程序埋了一些坑,比如没必要的延时程序导致系统响应缓慢,没有舵机驱动等等,只有真正理解了运作机理才能对别人的程序做出合理的修改。

欢迎继续阅读楼主其他信息

22
 楼主| 发表于 2020-6-3 16:58 | 只看该作者
本帖最后由 LooksSoYaung 于 2020-6-14 10:40 编辑

用的遥控是MC6C,虽然说是6通道遥控,但实际有些mc6c压根就准备好了第七通道,只需要拆开遥控,右上角的空位装上买来的拨杆开关,焊好插头,插在遥控主板上预留的某个插座上就得到一个二段开关通道了
这辆车尾的发动机排气管其实是装饰,真正的排气口长在实车上原本是用来整顿散热风扇传动轴的舱盖上


23
 楼主| 发表于 2020-6-3 22:03 | 只看该作者
回到最关心的开车问题,第一次下地运行,毫不意外的没有成功,不过原因显而易见,当加大油门时,发动机转速提高,但发电机转速却在下降,正是之前提到的负载加大发电机阻力上升,我的发动机与发电机之间是靠两根黑细皮带传动的,显然摩擦力还不够出现了打滑现象,动力损失很大。

正当我打开TB搜索更好的皮带时候,发现网上最拿得出手的居然是之前就已经弄过的聚氨酯皮带,这玩意需要自行裁成合适长度,用火烤融两头后熔接在一起变成环形(需要额外清理接头溢出来的胶),接头强度还是很足的(千万别用蜡烛火烤X3)。

我先后做了三圈,拿两根合适的替换之前的皮带,这下摩擦力显著提升,坦克终于首次实现下地跑了!
视频晚些时候送上

24
 楼主| 发表于 2020-6-4 08:38 | 只看该作者

25
 楼主| 发表于 2020-6-5 16:54 | 只看该作者
然而事情到这还没完!底盘在瓷砖地和水泥地表现良好,但是当去更复杂的地形越野时却显现出低劣的攀爬特性,甚至在平地上越不过一把锉刀,堪比韩国人的K1~不过好歹K1是履带打滑,但这个四号根本停转了,检视发现越障导致负载增加时聚氨酯皮带还是和皮带轮发生了打滑,甚至几次下来都被磨出粉末,皮带内侧还被皮带轮磨成V形。看来,换装更坚实可靠的传动势在必行,看来只能选择同步带了。
等了几天同步带和同步带轮到货,不过由于前期并不是考虑同步带轮尺寸而设计的定位孔,这下有的忙了,还得重新打孔,不光整体结构强度因此下降,更要命的是手工精度问题导致稳定性急剧下降,发电机组运行时震动极其强烈,螺丝都能震松掉。现在这个二号地盘地板真是饱受摧残,1.5mm厚度木板硬抗活蹦乱跳的甲醇机实在勉为其难,看来准备得考虑上碳纤维了。
底盘布局:

顶盖采用磁吸形式,本来想来四组,但买的磁钢太强了,怕到时候掀起盖头更加困难,所以只装了两组

顺带一提火炮制作中
26
 楼主| 发表于 2020-6-5 21:39 | 只看该作者
纸模的炮盾部分不靠谱,找到这幅剖面结构图,一下子明朗许多。值得注意的是俯仰耳轴和炮管轴线不在一个平面上 可惜手头上的铜管不够长,无法做成L70炮了,只能缩水成L48炮了

说实在还是四号坦歼V型更顺眼,不过当初弄到的相应图纸太过简陋



27
 楼主| 发表于 2020-6-7 20:27 | 只看该作者
讲一下干这个工程新吸取的一些经验教训吧:
1.水冷用的冷却液最好还是用汽车上用的那些吧,反正也不贵,普通的自来水会导致管路内的铁质零件生锈,严重时甚至堵塞管道;
2.自制电路板的露出的排针引脚啥的还是要用绝缘胶遮挡住,防止在挪动的过程当中跟其它部位接触导致无意的短路,我就因此差点毁掉一块2S锂电;
3.发动机能不用皮带传动就尽量不用,同步带它不香么,齿轮也行啊,不过同步带需要精确测算距离,除非有专门的张紧轮,这里我倒不建议用可调轴间距的长条固定孔设计,因为发动机的震动会使得设备能轻易移位;
4.所有螺丝钉都要考虑上螺丝胶,搞不好越野跑掉零件那还难找。不过小心螺丝胶这玩意涂多了还能紧固到再也拧不下来钉子的地步。
28
 楼主| 发表于 2020-6-8 10:40 | 只看该作者
5.如果不是我的问题,那就说明这款无刷发电机是真的不行

外强中干,空载输出电压可以达到惊人的50V,摸上去都能触电的那种,但是接个电机负载后电压就被拉到极低的水平,若没有高转速带动,发出来的电根本无法使用。
29
 楼主| 发表于 2020-6-8 18:33 | 只看该作者
发电机的震动始终让人恼火,分析原因之一是当初同步带长度判断不准造成皮带松弛,然后做了一个像这样的同步带张紧装置

固定在同步带下方托着,然后发电机颤振问题居然就解决了!

还改了一下发电机布局,车底那些多余的固定孔准备补上。
30
 楼主| 发表于 2020-6-11 22:53 | 只看该作者
搞事情



双弹簧反后座机构。以后有条件还是搞银焊吧,锡焊强度在此捉急。
31
 楼主| 发表于 2020-6-12 18:20 | 只看该作者
今天打印了炮架
炮管的重心意外的合适,在耳轴上,如果是L70就得加装弹簧补偿装置用以hold住前段过重的炮管
不过这后坐距离搞不好会怼到其他设备啊

还拿筷子做了两根牵引杆,这样可以跑火车了




32
 楼主| 发表于 2020-6-17 17:54 | 只看该作者
整了俯仰,不过在不知晓这个成品扇齿的分度圆直径的情况下难以设计出尺寸刚好的俯仰舵机固定架,试了好几次才凑合

33
 楼主| 发表于 2020-6-18 12:30 | 只看该作者
方向瞄准现在也改用扇齿,之前用连杆暴露出严重虚位晃动的问题。 因为遥控器摇杆横向是带回中的,为了保持瞄准方向得从程序入手解决。

34
 楼主| 发表于 2020-6-19 16:01 | 只看该作者
大揭秘
推进剂用的这种变魔术的玩意

高温电弧点火。值得提醒的是电弧可能会引起接收机当场失灵,造成整个系统失去信号宕机状态,必须在程序上限制点火时间。另外就是,小心走火!!!
35
 楼主| 发表于 2020-6-20 11:04 | 只看该作者
德国车的另一大优势就是可以在表面敷上一层防磁装甲,这样甚至可以掩盖掉失真的装甲焊缝
用的环氧AB补土做防磁,1M齿条和一字螺丝刀做纹理。不过我没想到的一点是塑封袋可以抗环氧树脂的粘接,却扛不住这AB补土。本想在塑封袋里把它擀成薄皮再糊到车上,现在只能直接在车上擀开了。


36
 楼主| 发表于 2020-6-21 15:49 | 只看该作者
驾驶员登场
才18块的史上最低价摄像头加图传

当然视线也好不到哪去,而且目前怎么炮瞄也是个问题


37
发表于 2020-6-21 22:13 | 只看该作者
太复杂了,完全没看明白
38
 楼主| 发表于 2020-6-29 12:26 | 只看该作者
自从试车成功后就怠惰了,动工速度一下放缓了,只敷设了部分防磁,另外把两车车顶都重新整顿一番一。一号车实际用的二号车的车顶,二号则新造 但这个舱门铰链却不怎么省心,尤其车长舱门铰链还会和油门舵机干涉,这也是把二号车顶换给一号的重要原因 上面是切割版下面是打印版,原本铰链与舱门的连接部分应该也能旋转才对


39
发表于 2020-6-29 15:35 | 只看该作者
散热可以改成电脑的冷排+风扇,多种规格可选,你的空间可以试试80冷排。散热效能肯定比全自制强一大截。
另外注意铜铝反应。
40
 楼主| 发表于 2020-6-29 23:12 | 只看该作者
joyescz 发表于 2020-6-29 15:35
散热可以改成电脑的冷排+风扇,多种规格可选,你的空间可以试试80冷排。散热效能肯定比全自制强一大截。
...

水冷排都太大了塞不下去,倒是我的A7V能用的了。现在是把原先的自制铝管散热器换成了铜管焊接的 能多保证热量接触与传递
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

【站内推荐】上一条 /2 下一条

快速回复 返回顶部 返回列表