模型论坛|模型中国

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: 长寿烙铁

自制迷你遥控器----萝丽1代的逐步改进过程

  [复制链接]
发表于 2015-11-7 22:28:20 | 显示全部楼层
  楼主| 发表于 5 小时前 | 只看该作者
smxzjs 发表于 2015-10-21 22:49
有同感, 顶!我想 还应增加电源低压报警功能。 你的汇控程序通过了吗? 我也想试试。关于混控我想应增加 ...

程序通过了,现在正在使用,我没有使用第四通道,所以借用了那个开关

谢谢 回来我改一下试试
回复 支持 2 反对 0

使用道具 举报

 楼主| 发表于 2016-1-20 20:45:22 | 显示全部楼层
本帖最后由 长寿烙铁 于 2016-10-15 15:58 编辑

我设想增加电量指示和计时提醒功能。

遥控器耗电很少,可以使用1S小电池。通过指示灯闪烁指示电量,闪烁周期2秒,占空比越大,表示电量越多。
指示灯不亮时电压大约为3.5V表示电量为0,亮0.5秒时电压大约为3.7V表示电量为25,
亮1秒时电压大约为3.8V表示电量为50,亮1.5秒时电压大约为3.9V表示电量为75,
亮2秒时电压大约为4.2V表示电量为100。

如果油门大于一定值持续几秒钟启动计时器,蜂鸣器每分钟提醒一次,短音表示1,长音表示5。
20分钟后重新开始,油门关闭30秒后停止计时。
回复 支持 3 反对 0

使用道具 举报

 楼主| 发表于 2016-2-3 22:16:54 | 显示全部楼层
本帖最后由 长寿烙铁 于 2016-10-16 23:06 编辑
smxzjs 发表于 2015-10-21 22:49
有同感, 顶!我想 还应增加电源低压报警功能。 你的汇控程序通过了吗? 我也想试试。关于混控我想应增加 ...


经过测试,遥控器的电压3.5V时可以工作,电流20mA,可以用1S小电池。
单片机12c5608的工作电压为3.5—5.5V,锂电池电压为3.5—4.2V
我买的3.3V稳压AMS1117有2种,经过测试,当输出3.2V0.2A 时,最小输入电压分别为4.2V和3.5V。
如果使用后者,可以直接用1S电池。如果使用前者,无线模块的工作电压偏低(2.5—3.2V),最好使用ht7333稳压。
回复 支持 3 反对 0

使用道具 举报

发表于 2016-3-21 21:34:44 | 显示全部楼层
老哥 你改的一代  加模拟器的能用吗?
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2016-3-21 22:01:24 | 显示全部楼层
本帖最后由 长寿烙铁 于 2016-11-5 21:40 编辑
小哥哥 发表于 2016-3-21 21:34
老哥 你改的一代  加模拟器的能用吗?


我重新修改了程序,经过反复试验,终于实现了无线模拟器功能。
接收机改成无线模拟器后不能控制舵机了,这样可以简化程序,保证可靠性。

void et0()interrupt 1                        //信号输出
{

        c++;
        switch(c)
        {
               
             case 1: PPM=0;TL0=0x70,TH0=0xfe;      //固定0.4ms低电平
             ds=64935-4*rx[0];
             t_l=ds;t_h=ds>>8;break;                               
             case 2: PPM=1;TL0=t_l;TH0=t_h;break;  //0.6到1.6ms高电平

             case 3: PPM=0;TL0=0x70,TH0=0xfe;
             ds=64935-4*rx[1];                    //65535-64935=600为0.6ms
             t_l=ds;t_h=ds>>8;break;                               
             case 4: PPM=1;TL0=t_l;TH0=t_h;break;

             case 5: PPM=0;TL0=0x70,TH0=0xfe;  
             ds=64935-4*rx[2];                    //256级*4为1024约1ms
             t_l=ds;t_h=ds>>8;break;                               
             case 6: PPM=1;CH3=1;TL0=t_l;TH0=t_h;break;

             case 7: PPM=0;CH3=0;TL0=0x70,TH0=0xfe;
             ds=64935-4*rx[3];
             t_l=ds;t_h=ds>>8;break;                               
             case 8: PPM=1;TL0=t_l;TH0=t_h;break;  

             case 9: PPM=0;TL0=0x70,TH0=0xfe;  
             ds=64935-4*rx[4];
             t_l=ds;t_h=ds>>8;break;                               
             case 10: PPM=1;TL0=t_l;TH0=t_h;break;

             case 11: PPM=0;TL0=0x70,TH0=0xfe;   
             ds=64935-4*rx[5];
             t_l=ds;t_h=ds>>8;break;                               
             case 12: PPM=1;TL0=t_l;TH0=t_h;break;
                       
             case 13: PPM=0;TL0=0x70,TH0=0xfe;break;                               
             case 14: PPM=1;TL0=0xf0,TH0=0xd8;     //同步脉冲10ms

             c=0;break;
               
               
        }

               
            

}
回复 支持 1 反对 0

使用道具 举报

发表于 2016-4-11 07:21:28 来自手机 | 显示全部楼层
你这是又要成立一个遥控器品牌了吗
回复 支持 1 反对 0

使用道具 举报

发表于 2016-5-28 10:49:26 | 显示全部楼层
非常棒,我也挺喜欢简单一点的遥控
回复 支持 反对

使用道具 举报

发表于 2016-6-19 20:17:38 | 显示全部楼层
这帖要火
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-3 17:36:28 | 显示全部楼层
阿萨德发生 发表于 2015-8-1 19:44
做到最简洁!无需添加模拟器功能,去掉通道反向开关,也不需要微调,在飞机上调节即可

我学习了2代的跳频部分程序,加了简单注释,想用于1代遥控。
main()
{       
        delay_ms(200);delay_ms(200);//开机延时以避过电源波动
        initial();

        TR0=1;                //打开定时器
        LED=1;
        channel_set(hopping[0]); //使用1号频道
        lose=1;
        while(1)
        {       
                while(IRQ&&lose);   //IRQ与lose都为1时循环等待
               //等待有效信号(IRQ=0)(发射周期20ms)时执行if(lose)
               //或无信号(IRQ=1)m>7(和m>14,m>22)(等待21ms,lose为0)时执行else
                 TR1=1;       
                if(lose)  //有信号跳频,lose=1(IRQ=0且m<=7)时执行
                {
                        tt=0;m=0;jump_1=0;jump_2=0;        //收到有效信号后刷新跳频器
                        k++;                                //有效信号计数
                        FIFO_read(rx,8);                //读取接收数据
                        CE=0;
                        REG_write(0x07,0x40);        //清除无线模块中断信号
                        CE=1;
                        hopping_turn++;         //顺序跳频序号
                        if(hopping_turn>4)hopping_turn=0;
                        channel_set(hopping[hopping_turn]);
                }
                else     //无信号延时跳频,lose=0,IRQ=1,m>7(和m>14,m>22)时执行一次
                {
                         hopping_turn++;         //顺序跳频序号
                        if(hopping_turn>4)hopping_turn=0;
                        channel_set(hopping[hopping_turn]);
                        lose=1;   //准备等待有效信号或m>14,m>22时执行else
                }
               
       
        }
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-3 17:40:44 | 显示全部楼层
阿萨德发生 发表于 2015-8-1 19:46
最需要改进的地方是需要2.4g自动跳频功能,否则非常容易受到干扰失控

我参考了3代的跳频部分程序,加了简单注释,这个有点复杂了。
main()
{       
        delay_ms(200);delay_ms(200);//开机延时以避过电源波动
       
        initial();
        ADC_CONTR=0x80;                 //ADC配置

                 
        IP=0x02;
        IE=0x82;
        IE2=0x04;
       
        T2L=0x47,T2H=0xf4;
        AUXR=0x10;           //打开定时器2,开始统计信号

       
        NRF_channel(hopping[0]); //使用1号频道
               
        while(IRQ);      //收到有效信号时(IRQ=0)向下执行
        TR0=1;
        lose=1;
        LED=1;
        while(1)
        {       
                while(IRQ&lose);    //IRQ与lose都为1时循环等待
               //等待有效信号(IRQ=0)(发射周期20ms)时执行if(lose)
               //或无信号(IRQ=1)m>7(和m>14,m>22)(等待21ms,lose为0)时执行无信号延时跳频
                if(lose)  //有信号跳频,lose=1(IRQ=0且m<=7)时执行
                {       
                        jump_1=0;jump_2=0;    //跳频标志位
                        hopping_count=0;      //刷新跳频次数
                        receive++;            //有效信号计数
                        timer1=0;timer3=0;m=0;               
                       
                        FIFO_read(rx,11);        //读取接收数据
                        CE=0;
                        REG_write(0x07,0x40);        //清除无线模块中断信号
                        CE=1;
                       
                        TX_mode();           //发射模式
                        tx[0]=rx_num;
                        voltage_bec=32385/adc1;
                        tx[1]=voltage_bec>>8;
                        tx[2]=voltage_bec;
                        voltage_total=(long)adc2*voltage_bec*3/1024;
                        tx[3]=voltage_total>>8;
                        tx[4]=voltage_total;
                       
                        FIFO_write(tx,11);
                        Delay1ms();

                        RX_mode();           //接收模式
                                               
                        if(jump_mode)        //跳转模式时进行随机跳频
                        {
                                jump_mode=0;
                                hopping_turn=random[hopping_num]; //使用随机数值
                        }
                        hopping_turn++;      //顺序跳频序号
                        if(hopping_turn>4)hopping_turn=0;
                        NRF_channel(hopping[hopping_turn]);
       


                }
                else     //无信号延时跳频,lose=0,IRQ=1,m>7(和m>14,m>22)时执行一次
                {
                         hopping_count++;   //跳频次数
                        if(hopping_count>5)jump_mode=1;
                           //顺序跳频5次后进行随机跳频
                       
                        if(jump_mode)     //随机跳频
                        {
                                hopping_num++;   //随机跳频序号
                                if(hopping_num>99)hopping_num=0;
                                NRF_channel(hopping[random[hopping_num]]);
                                lose=1;   //准备等待有效信号或m>14,m>22时执行无信号延时跳频
                        }
                        else             //顺序跳频
                        {
                                hopping_turn++;   //顺序跳频序号
                                if(hopping_turn>4)hopping_turn=0;
                                NRF_channel(hopping[hopping_turn]);
                                lose=1;   //准备等待有效信号或m>14,m>22时执行无信号延时跳频
                        }
                       
                }
               
        }
       
}


回复 支持 反对

使用道具 举报

发表于 2016-7-4 21:50:01 | 显示全部楼层
本帖最后由 smxzjs 于 2016-7-4 21:59 编辑
我学习了2代的跳频部分程序,加了简单注释,想用于1代遥控。

看了注释 还是不太明白 PPM输出部分 跳频部分怎么和一代源程序结合 等你改造的结果
回复 支持 反对

使用道具 举报

发表于 2016-7-6 18:29:08 来自手机 | 显示全部楼层
楼主啊,我也想弄个简单的遥控器,能把代码分享一下吗
回复 支持 反对

使用道具 举报

发表于 2016-7-6 18:47:43 来自手机 | 显示全部楼层
5110屏太差劲了,买了两个都是坏的,我也想弄个不用屏的遥控器
回复 支持 反对

使用道具 举报

发表于 2016-7-6 18:51:41 来自手机 | 显示全部楼层
最好把PWM控制部分也加进去方便接空心杯
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-8 21:55:41 | 显示全部楼层
春到湘江 发表于 2016-7-6 18:29
楼主啊,我也想弄个简单的遥控器,能把代码分享一下吗

我准备试验一下,功能完善后,将公布源代码,希望大家提出意见和建议。
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|     repair

GMT+8, 2018-5-27 06:03

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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