当前位置:首页 > 单片机 > 电子电路开发学习
[导读]ML-L3是用于尼康部分型号相机的无线红外遥控器,可以通过红外方式来控制快门的释放,支持B门拍摄。官方售价100RMB左右,山寨版售价10RMB左右。虽然也能实现基本的遥控功能,但是功能还是比较单一,如不能实现定时拍摄,即用来拍摄制作延时视频的素材。本篇文章介绍如何通过Ardui...

ML-L3是用于尼康部分型号相机的无线红外遥控器,可以通过红外方式来控制快门的释放,支持B门拍摄。官方售价100RMB左右,山寨版售价10RMB左右。虽然也能实现基本的遥控功能,但是功能还是比较单一,如不能实现定时拍摄,即用来拍摄制作延时视频的素材。本篇文章介绍如何通过Arduino、MCU或FPGA来控制红外发射器,产生快门指令从而实现无线遥控快门的功能。

拆解ML-L3遥控器

为了实现ML-L3遥控器的功能,我们首先要了解无线遥控器的原理。当然最好的方式就是拆解一个ML-L3,然后看看内部的电路,然后测出红外的编码。但是手头又没有这样的一个遥控器,有国外的网友已经拆解了并且测出了红外编码的波形,如下图。

官方遥控器PCB板:

山寨遥控器PCB板:

从PCB板来看,果然还是官方的用料更足一些,通过测量红外发射引脚,在按下按钮时,红外发射头会发出一串脉冲信号,如下图所示:

其中黑色的部分是38KHz的PWM方波,空白部分是低电平,以上波形就表示一个快门指令。

红外遥控协议主要有两种:NEC协议和Philips RC-5协议,NEC采用PWM方式调制,RC-5采用PPM方式调制。其中使用最多的是NEC协议,38KHz载波,一般是由引导码 地址码 地址反码 数据 数据反码构成。其中逻辑0和逻辑1的编码如下:

基于Arduino的实现

好了,知道了快门指令的红外波形,我们只需要写个函数实现这一串脉冲信号就可以了。Arduino开发板,我手头上有的是Circuit Playground Express这款开发板,板载一对红外发射接收头,和两路按键,对于我们的功能已经是足够用了。在使用前需要先安装Cortex-M0的库。

程序非常简单,按下按键时,发出一个快门指令:

  1. #include


  2. #define IR_Pin 25

  3. #defineLed_Pin13

  4. #defineButtonA_Pin4

  5. #defineButtonB_Pin5


  6. #define LED_ON digitalWrite(Led_Pin, LOW)

  7. #define LED_OFF digitalWrite(Led_Pin, HIGH)

  8. #define LED_SET(x) digitalWrite(Led_Pin, x)


  9. #define IR_ON digitalWrite(IR_Pin, HIGH)

  10. #define IR_OFF digitalWrite(IR_Pin, LOW)


  11. #define GET_BUTTONA() digitalRead(ButtonA_Pin)

  12. #define GET_BUTTONB() digitalRead(ButtonB_Pin)


  13. int sts = 0;


  14. void setup()

  15. {

  16. pinMode(IR_Pin, OUTPUT);

  17. pinMode(Led_Pin, OUTPUT);

  18. pinMode(ButtonA_Pin, INPUT_PULLDOWN);

  19. pinMode(ButtonB_Pin, INPUT_PULLDOWN);


  20. Serial.begin(9600);

  21. }


  22. //Nikon ML-L3 红外遥控器快门编码:38KHz=26us

  23. void loop()

  24. {

  25. if(GET_BUTTONA())

  26. {

  27. delay(10);

  28. if(GET_BUTTONA())

  29. {

  30. sts = !sts;

  31. LED_SET(sts);

  32. Serial.println("Right button pressed!");

  33. OneShot();

  34. }

  35. }

  36. while(GET_BUTTONA()); //等待松开

  37. }


  38. voidOneShot()

  39. {

  40. int i = 0;

  41. for(i = 76; i > 0; i--) //2100ms

  42. {

  43. IR_ON; //13.5

  44. delayMicroseconds(12);

  45. IR_OFF; //13.7

  46. delayMicroseconds(12);

  47. }

  48. IR_OFF;

  49. delay(28); //2803us

  50. for(i = 15; i > 0; i--) //393us

  51. {

  52. IR_ON;

  53. delayMicroseconds(12);

  54. IR_OFF;

  55. delayMicroseconds(12);

  56. }

  57. IR_OFF;

  58. delayMicroseconds(1580); //1611us


  59. for(i = 15; i > 0; i--)

  60. {

  61. IR_ON;

  62. delayMicroseconds(12);

  63. IR_OFF;

  64. delayMicroseconds(12);

  65. }

  66. delayMicroseconds(3580);

  67. for(i = 15; i > 0; i--)

  68. {

  69. IR_ON;

  70. delayMicroseconds(12);

  71. IR_OFF;

  72. delayMicroseconds(12);

  73. }

  74. IR_OFF;

  75. }

基于STM32的实现

在STM32F103上的实现也是非常简单,主要用到了GPIO控制和精确延时函数。红外控制引脚和按键引脚可根据需要来调整。

  1. //根据Nikon ML-L3红外遥控器编码协议,产生快门指令

  2. voidOneShot(void)

  3. {

  4. int i = 0;

  5. for(i = 76; i > 0; i--) //2100ms

  6. {

  7. IR_ON; //13.5

  8. delay_us(12);

  9. IR_OFF; //13.7

  10. delay_us(12);

  11. }

  12. IR_OFF;

  13. delay_ms(28); //2803us

  14. for(i = 15; i > 0; i--) //393us

  15. {

  16. IR_ON;

  17. delay_us(12);

  18. IR_OFF;

  19. delay_us(12);

  20. }

  21. IR_OFF;

  22. delay_us(1580); //1611us


  23. for(i = 15; i > 0; i--)

  24. {

  25. IR_ON;

  26. delay_us(12);

  27. IR_OFF;

  28. delay_us(12);

  29. }

  30. delay_us(3580);

  31. for(i = 15; i > 0; i--)

  32. {

  33. IR_ON;

  34. delay_us(12);

  35. IR_OFF;

  36. delay_us(12);

  37. }

  38. IR_OFF;

  39. }

基于FPGA的实现

对于FPGA来说,这种波形的产生,时间可以控制的更精确,这取决于FPGA的时钟,时钟越高精度越高,而且可控性更强一些,就是实现起来稍微麻烦一些。

Verilog文件

  1. module ml_l3_pulse_gen(


  2. input clk_50M, //20ns

  3. input rst_n,

  4. input trig, //negedge trig


  5. output pulse

  6. );


  7. parameter T1_2000US = 100000;

  8. parameter T2_28000US = 1400000;

  9. parameter T3_400US = 20000;

  10. parameter T4_1580US = 79000;

  11. parameter T5_400US = T3_400US;

  12. parameter T6_3580US = 179000;

  13. parameter T7_400US = T3_400US;


  14. parameter T1_STS = 1;

  15. parameter T2_STS = 2;

  16. parameter T3_STS = 3;

  17. parameter T4_STS = 4;

  18. parameter T5_STS = 5;

  19. parameter T6_STS = 6;

  20. parameter T7_STS = 7;

  21. parameter T8_STS = 8;

  22. parameter T0_STS = 0;

  23. parameter TIME_38KHZ = 658;


  24. reg [7:0] cur_sts;

  25. reg [31:0] cnt_38khz;

  26. reg [31:0] cnt;

  27. reg [31:0] cnt_max;


  28. reg en;

  29. reg pwm_38k;

  30. reg trig_reg;


  31. assign pulse = (en) ? pwm_38k : 0;


  32. always @ (posedge clk_50M)

  33. begin

  34. trig_reg <= trig;

  35. end


  36. always @ (posedge clk_50M)

  37. begin

  38. if(!rst_n)

  39. cnt_max <= 0;

  40. else

  41. begin

  42. case(cur_sts)

  43. T0_STS : cnt_max <= 0;

  44. T1_STS : cnt_max <= T1_2000US;

  45. T2_STS : cnt_max <= T2_28000US;

  46. T3_STS : cnt_max <= T3_400US;

  47. T4_STS : cnt_max <= T4_1580US;

  48. T5_STS : cnt_max <= T5_400US;

  49. T6_STS : cnt_max <= T6_3580US;

  50. T7_STS : cnt_max <= T7_400US;

  51. default: cnt_max <= 0;

  52. endcase

  53. end

  54. end


  55. always @ (posedge clk_50M)

  56. begin

  57. if(!rst_n)

  58. en <= 0;

  59. else

  60. begin

  61. case(cur_sts)

  62. 1,3,5,7: en <= 1;

  63. 2,4,6,0: en <= 0;

  64. default: en <= 0;

  65. endcase

  66. end

  67. end


  68. always @ (posedge clk_50M)

  69. begin

  70. if(!rst_n)

  71. cnt <= 0;

  72. else

  73. begin

  74. if(cur_sts != T0_STS
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭