设为首页 收藏本站 切换风格
 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 15460|回复: 20
打印 上一主题 下一主题

萝丽迷你接收,集成电调与两通电磁舵

[复制链接]

9

主题

39

帖子

71

积分

注册会员

Rank: 2

积分
71
QQ
跳转到指定楼层
楼主
发表于 2016-3-4 14:30:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 JackeyKing 于 2016-1-21 11:42 编辑

首先感谢萝丽的开源控,自己15年9月份左右才看到萝丽的贴子,然后就一发不可收拾,买了近2000的电子元器件了,做了三个控,越做越小,但是萝丽的原贴中,接收机还是太大,虽然迷你接收只有2克多点,但再加上电调与舵机,就重了,于是一直想做个迷你的集成电调与舵机的,苦于自己对单片机也是个门外汉,只好边啃书本,边四处翻贴子,直到发现了这个贴子: http://bbs.mx3g.com/thread-496612-1-1.html 受 乡村男孩 的启发,突然想明白了,对于小飞机,对舵机的控制,不一定要比例控制,可以先简陋一点,做成开关通道。估计 乡村男孩 最后没有去研究萝丽控与他的程序集成的事,我来班门弄斧,于是就有了现在的这个贴子。
既然萝丽是开源的,用了他的代码,自然也开源,先放上源程序:


  • //#include
  • #include
  • #include
  • #define u8 unsigned char
  • #define u16 unsigned int

  • typedef unsigned char uchar;
  • typedef unsigned char uint;

  • sfr T2H=0xd6;
  • sfr T2L=0xd7;

  • sbit LED=P1^0; //定义指示灯

  • //sbit CH1=P1^1; //定义6个通道输出
  • //sbit CH2=P3^7;
  • //sbit CH3=P3^3;
  • //sbit CH4=P3^2;
  • sbit CH5=P3^1;
  • sbit CH6=P3^0;
  • sbit pwm1 = P3^2;
  • sbit pwm2 = P3^3;
  • sbit pwm3 = P3^6;
  • sbit pwm4 = P3^7;

  • sbit MDO= P1^3; //定义无线模块的管脚
  • sbit SCK= P1^5;
  • sbit CE= P5^5;
  • sbit IRQ= P1^2;
  • sbit MDI= P1^4;
  • sbit CSN= P5^4;


  • u8 rx[17]; //接收的6字节数据
  • u8 tx[17]={0xc3,0x3c,12};
  • u8 k,n,w,tt,m;
  • u8 channel,connecting,hopping_turn;
  • bit cha,chb,chc,chd,che;
  • u8 missing_data[4];
  • u8 address[5];
  • u8 hopping[5];
  • bit first;
  • bit lose;
  • bit jump_1,jump_2;

  • bit restar;

  • void delay1ms() //@12.000MHz
  • {
  • unsigned char i, j;

  • _nop_();
  • _nop_();
  • i = 11;
  • j = 168;
  • do
  • {
  • while (--j);
  • } while (--i);
  • }

  • void delay4us() //@12.000MHz
  • {
  • unsigned char i;

  • i = 8;
  • while (--i);
  • }

  • void delay(u8 i)
  • {
  • while(i--)
  • delay4us();
  • }
  • void delay_ms(u8 i)
  • {
  • while(i--)
  • delay1ms();
  • }
  • u8 EEPROM_read(u8 address)
  • {
  • IAP_CMD=0x01;
  • IAP_ADDRH=0;
  • IAP_ADDRL=address;
  • IAP_TRIG=0x5a; //EEPROM读写密码,不同系列单片机不同
  • IAP_TRIG=0xa5;
  • return IAP_DATA;
  • }

  • void EEPROM_write(u8 address,u8 byte)
  • {
  • IAP_CMD=0x02;
  • IAP_DATA=byte;
  • IAP_ADDRH=0;
  • IAP_ADDRL=address;
  • IAP_TRIG=0x5a;
  • IAP_TRIG=0xa5;

  • }

  • void EEPROM_clean(u8 address)
  • {
  • IAP_CMD=0x03;
  • IAP_ADDRH=0;
  • IAP_ADDRL=address;
  • IAP_TRIG=0x5a;
  • IAP_TRIG=0xa5;
  • }

  • void DATA_read()
  • {
  • IAP_CONTR=0x82;
  • if(EEPROM_read(0)!=0xf5)
  • {
  • first=1;
  • missing_data[0]=127;
  • missing_data[1]=127;
  • missing_data[2]=0;
  • missing_data[3]=127;
  • }
  • else
  • {
  • hopping[0]=EEPROM_read(1);
  • hopping[1]=EEPROM_read(2);
  • hopping[2]=EEPROM_read(3);
  • hopping[3]=EEPROM_read(4);
  • hopping[4]=EEPROM_read(5);
  • address[0]=EEPROM_read(6);
  • address[1]=EEPROM_read(7);
  • address[2]=EEPROM_read(8);
  • address[3]=EEPROM_read(9);
  • address[4]=EEPROM_read(10);

  • missing_data[0]=EEPROM_read(11);
  • missing_data[1]=EEPROM_read(12);
  • missing_data[2]=EEPROM_read(13);
  • missing_data[3]=EEPROM_read(14);
  • }


  • IAP_CONTR=0;
  • }
  • void DATA_save()
  • {
  • IAP_CONTR=0x82;
  • EEPROM_clean(0);
  • EEPROM_write(0,0xf5);
  • EEPROM_write(1,hopping[0]);
  • EEPROM_write(2,hopping[1]);
  • EEPROM_write(3,hopping[2]);
  • EEPROM_write(4,hopping[3]);
  • EEPROM_write(5,hopping[4]);
  • EEPROM_write(6,address[0]);
  • EEPROM_write(7,address[1]);
  • EEPROM_write(8,address[2]);
  • EEPROM_write(9,address[3]);
  • EEPROM_write(10,address[4]);

  • EEPROM_write(11,missing_data[0]);
  • EEPROM_write(12,missing_data[1]);
  • EEPROM_write(13,missing_data[2]);
  • EEPROM_write(14,missing_data[3]);
  • IAP_CONTR=0;
  • }


  • u8 SPI(u8 byte)
  • {
  • u8 i;
  • for(i=0;i14)lose=0,jump_2=1; //第一跳之后仍无信号,开始第二跳
  • }
  • else
  • {
  • if(m>22)m=0,lose=0,jump_1=0; //第二跳之后仍无信号,复位重新跳。
  • }
  • }
  • DUOJI_pwm();
  • if(rx[2] > 250){
  • CCAP0L=0;
  • CCAP0H=0;
  • }else if(rx[2] < 5){
  • CCAP0L=255;
  • CCAP0H=255;
  • }else{
  • CCAP0L=255 - rx[2];
  • CCAP0H=255 - rx[2];
  • }
  • }


  • void et2()interrupt 12 //定时器2用作信号统计,定时周期65ms
  • {
  • tt++;w++;

  • if(w==15) //每秒统计接收到的有效信号数量,小于20个点亮LED示警,表示信号微弱
  • {
  • if(k30)//如果tt增长到30,表示已经有两秒未收到有效信号,执行失控保护舵量
  • {
  • tt=30;
  • rx[0]=missing_data[0];
  • rx[1]=missing_data[1];
  • rx[2]=missing_data[2];
  • rx[3]=missing_data[3];
  • pwm1=0;
  • pwm2=0;
  • pwm3=0;
  • pwm4=0;
  • CCAP0L=255;
  • CCAP0H=255;
  • }
  • }


复制代码

固件: test.zip


先说说目前的成果:已经在面包板上试验通过,包括失控保护部分,LED灯等,完全工作正常。
但是,在我的微型接收上,还没有成功,我是在1.27mm的洞洞板上焊的微型接收,不加电容,焊完全重2.04克(电容大约0.35克),正如 乡村男孩所说,焊这个太费神了,估计是我哪没有焊好,能对上码,对完码就失控(LED灯亮),电调输出一直是高电平,舵机为低电平。
更新:微型接收也成功了,用662K转3.3V电压时,需要在662K的输出端并上个电容。我并的是47uf的,已经更新到接线图中去了

二楼上使用方法以及硬件等

差点忘了感谢群里面的浅雪,昨天问过他问题,谢谢他的解答
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享
回复

使用道具 举报

7

主题

36

帖子

71

积分

新手上路

Rank: 1

积分
71
QQ
沙发
发表于 2016-3-4 14:31:20 | 只看该作者
JackeyKing 发表于 2016-1-19 15:32
占个楼,一会画原理图
接线图:


上网查了下662K和7333-1的管脚定义是一样的。
回复 支持 反对

使用道具 举报

7

主题

42

帖子

71

积分

新手上路

Rank: 1

积分
71
QQ
板凳
发表于 2016-3-4 14:31:58 | 只看该作者
这种帖一定要顶起来!
回复 支持 反对

使用道具 举报

6

主题

30

帖子

72

积分

新手上路

Rank: 1

积分
72
QQ
地板
发表于 2016-3-4 14:33:20 | 只看该作者
JackeyKing 发表于 2016-1-19 15:32
占个楼,一会画原理图
接线图:


仔细再看了电路图,发现怎么单片机的第八脚没有接地,反而第六脚出来却接到负极去了,有点看不懂。
回复 支持 反对

使用道具 举报

5

主题

32

帖子

73

积分

新手上路

Rank: 1

积分
73
QQ
5#
发表于 2016-3-4 14:33:37 | 只看该作者
sgsd00775 发表于 2016-1-19 19:33
根据楼主的电路图,结合萝丽的四通接受图,画出来这个,不知道是否和楼主的图一样可行,应该刷个固件就能 ...


8205上面的2K电阻,我又加上去了。不加的话,在失控时,会导致电机狂转
回复 支持 反对

使用道具 举报

0

主题

27

帖子

20

积分

新手上路

Rank: 1

积分
20
QQ
6#
发表于 2016-3-4 14:33:47 | 只看该作者
本帖最后由 JackeyKing 于 2016-1-26 01:28 编辑

占个楼,一会画原理图
接线图:
       layout.png (216.4 KB, 下载次数: 16)
      
画的不好看,见谅
2016-1-26 01:18 上传
  


   
果然漏了个东西,在上面的接线图中,在输入电源正负极上,记得并上个电解电容。我用的是470uf的,小容量的应该也可以。输入电源记得接两个针脚出来,图中我又忘记画了。注意加了个2K的电阻,不加的话,在失控时,电机会狂转
感谢 sgsd00775 提醒,原图中电源负极连错线了,已经更正

元器件清单:
       list.png (324.85 KB, 下载次数: 15)
      
  2016-1-19 16:07 上传
  


   
图中虽然我买了8810,实际上,我仍然用的是8205(跟乡村男孩学的,手机废电池中拆出来的)
萝丽新控中的7333也可以用来给2.4G模块供电,但是我称了下,7333重量是在0.1克级的,而662K是0.01克级的,毕竟是飞小飞机,能省一点就省一点吧。至于二代控中的AMS1117-3.3V就更不用想了,这货重达0.5X克

烧写设置:
       write.png (163.55 KB, 下载次数: 15)
      
  2016-1-19 16:11 上传
  


   
       write2.png (71.87 KB, 下载次数: 9)
      
  2016-1-21 11:39 上传
  


   

使用说明:
使用基本跟萝丽接收一样,只是对码时,短接的引脚不一样:
短接P3.0与P3.1,进行对码(迷你接收,最好焊两根细线出来,对完码后再弄掉)

嗯,应该没有漏掉什么了吧,有了上面的,应该可以玩起来了。如有遗漏,告诉我一声,我补进来

STC15W408AS是支持3路PWM信号的,我还在研究怎么把它用起来,目前只用了一路用来控制小电机。
之前我做过萝丽的微型电调(改成了电磁舵),是可以比例遥控的,虽然比例不是那么精准,所以还是希望在不增加元器件的情况下,尽量让电磁舵也可以比例遥控(目前是开关)
另外,电机的回路中我没接肖基特二极管防回流,这个应该没啥事吧,毕竟这么小的电机,有哪位大侠给分析一下,先谢谢
还有8205中,我没接2k的那个电阻(相比乡村男孩的电路),这个有影响吗?也请大侠给一块分析了吧 2K的电阻最后还是加上了,不加的话,在失控时,电机会狂转
回复 支持 反对

使用道具 举报

4

主题

41

帖子

55

积分

新手上路

Rank: 1

积分
55
QQ
7#
发表于 2016-3-4 14:36:03 | 只看该作者
JackeyKing 发表于 2016-1-26 23:03
2502给个具体的型号吧,我去查一查引脚的定义。
如果你是指用2502场效应管代替8810,那么是完全可行的。 ...


就是SOT-23封装的2502场效应管,淘宝上面搜搜就有,形状就和你用的662K一样,大小也一样的。
回复 支持 反对

使用道具 举报

6

主题

43

帖子

83

积分

注册会员

Rank: 2

积分
83
QQ
8#
发表于 2016-3-4 14:36:51 | 只看该作者
本帖最后由 JackeyKing 于 2016-1-24 23:09 编辑

仔细再看了电路图,发现怎么单片机的第八脚没有接地,反而第六脚出来却接到负极去了,有点看不懂。



       pin.png (8.38 KB, 下载次数: 7)
      
  2016-1-24 23:03 上传
  


   
662K的输出脚跟AMS1117的输出脚不太一样,接第6脚的那个是正极
STC15W408AS的第6脚是正极,第8脚是负极接地。
另外,15W408AS的支持电压是2.4V-5.5V,所以662K输出的3.3V电源,可以给无线模块供电的同时也给单片机供电(已经通过焊mini接收试验过了,能支持),当然也可以让3.3V仅给无线模块供电,15W408AS直接接到1S的电源上

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

4

主题

36

帖子

52

积分

新手上路

Rank: 1

积分
52
QQ
9#
发表于 2016-3-4 14:41:09 | 只看该作者
厉害厉害
回复 支持 反对

使用道具 举报

5

主题

28

帖子

58

积分

新手上路

Rank: 1

积分
58
QQ
10#
发表于 2016-3-4 14:41:55 | 只看该作者
sgsd00775 发表于 2016-1-19 18:57
上网查了下662K和7333-1的管脚定义是一样的。


7333是我记错了,我买了还没有用呢,就称了称重量,然后选用了662K
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


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