开发板连接方式如下图:
    项目3  红外遥控小车 - 图1

    马达 马达驱动板
    马达1(右轮)接近地面引脚 OUT1
    马达1(右轮)接近底板引脚 OUT2
    马达2(左轮)接近地面引脚 OUT3
    马达2(左轮)接近底板引脚 OUT4
    马达驱动板 Arduino开发板
    IN1 4
    IN2 5
    IN3 6
    IN4 7
    马达驱动板 外接电源
    VCC 电源正极
    GND 电源负极和Arduino GND
    5V Arduino Vin引脚
    红外模块 Arduino开发板
    IN D8
    VCC 5V
    GND GND

    小车组装效果图如下:

    上部:
    项目3  红外遥控小车 - 图2

    底部:
    项目3  红外遥控小车 - 图3

    对应代码如下:

    1. // 库源码放在本项目所在目录
    2. #include "IRremote.h"
    3. // 设置接收IRDA数据的引脚
    4. int RECV_PIN = 8;
    5. // 初始化IRDA模块
    6. IRrecv irrecv(RECV_PIN);
    7. // 准备读取数据的数据结构
    8. decode_results results;
    9. //使用L298N驱动板
    10. // IN1连接引脚4
    11. // IN2连接引脚5
    12. // IN3连接引脚6
    13. // IN4连接引脚7
    14. int IN1=4;
    15. int IN2=5;
    16. int IN3=6;
    17. int IN4=7;
    18. const int WHEEL_MOVE_IDEL = 0;
    19. const int WHEEL_MOVE_FORWARD = 1;
    20. const int WHEEL_MOVE_BACKWARD = 2;
    21. const long IRDA_ACTION_FORWARD = 0x00FF18E7; //2
    22. const long IRDA_ACTION_BACKWARD = 0x00FF4AB5; //8
    23. const long IRDA_ACTION_LEFT = 0x00FF10EF; //4
    24. const long IRDA_ACTION_RIGHT = 0x00FF5AA5; // 6
    25. const long IRDA_ACTION_STOP = 0x00FF38C7; // 5
    26. unsigned long last = millis();
    27. void setup() {
    28. //初始化电机不动
    29. pinMode(IN1, OUTPUT);
    30. digitalWrite(IN1, HIGH);
    31. pinMode(IN2, OUTPUT);
    32. digitalWrite(IN2, HIGH);
    33. pinMode(IN3, OUTPUT);
    34. digitalWrite(IN3, HIGH);
    35. pinMode(IN4, OUTPUT);
    36. digitalWrite(IN4, HIGH);
    37. // 初始化引脚
    38. pinMode(RECV_PIN, INPUT);
    39. // 初始化串口
    40. Serial.begin(9600);
    41. // 启动IRDA接收模块,随时接收数据
    42. irrecv.enableIRIn();
    43. }
    44. void loop() {
    45. if (millis() - last < 250)
    46. {
    47. return;
    48. }
    49. last = millis();
    50. bool shouldMove = false;
    51. bool shouldTurn = false;
    52. bool shouldKeep = false;
    53. //读取红外输入信息
    54. if (irrecv.decode(&results)) {
    55. Serial.println(results.value, HEX);
    56. switch(results.value) {
    57. case IRDA_ACTION_FORWARD:
    58. goForward();
    59. Serial.println("go forward");
    60. shouldMove = true;
    61. break;
    62. case IRDA_ACTION_BACKWARD:
    63. goBackward();
    64. Serial.println("go backward");
    65. shouldMove = true;
    66. break;
    67. case IRDA_ACTION_LEFT:
    68. turnLeft();
    69. Serial.println("turn left");
    70. shouldTurn = true;
    71. break;
    72. case IRDA_ACTION_RIGHT:
    73. turnRight();
    74. Serial.println("turn right");
    75. shouldTurn = true;
    76. break;
    77. case IRDA_ACTION_STOP:
    78. stopMove();
    79. Serial.println("stop");
    80. break;
    81. default:
    82. shouldKeep = true;
    83. break;
    84. }
    85. irrecv.resume();
    86. }
    87. if(!shouldTurn && !shouldMove && !shouldKeep){
    88. keepIdle();
    89. }
    90. }
    91. void keepIdle() {
    92. rightMove(WHEEL_MOVE_IDEL);
    93. leftMove(WHEEL_MOVE_IDEL);
    94. }
    95. void goForward() {
    96. rightMove(WHEEL_MOVE_FORWARD);
    97. leftMove(WHEEL_MOVE_FORWARD);
    98. }
    99. void goBackward() {
    100. rightMove(WHEEL_MOVE_BACKWARD);
    101. leftMove(WHEEL_MOVE_BACKWARD);
    102. }
    103. void turnLeft(){
    104. rightMove(WHEEL_MOVE_FORWARD);
    105. leftMove(WHEEL_MOVE_IDEL);
    106. }
    107. void turnRight(){
    108. rightMove(WHEEL_MOVE_IDEL);
    109. leftMove(WHEEL_MOVE_FORWARD);
    110. }
    111. void stopMove(){
    112. rightMove(WHEEL_MOVE_IDEL);
    113. leftMove(WHEEL_MOVE_IDEL);
    114. }
    115. void rightMove(int state) {
    116. switch(state){
    117. case WHEEL_MOVE_FORWARD:
    118. digitalWrite(IN1,HIGH);
    119. digitalWrite(IN2,LOW);
    120. break;
    121. case WHEEL_MOVE_BACKWARD:
    122. digitalWrite(IN1,LOW);
    123. digitalWrite(IN2,HIGH);
    124. break;
    125. case WHEEL_MOVE_IDEL:
    126. digitalWrite(IN1,LOW);
    127. digitalWrite(IN2,LOW);
    128. break;
    129. }
    130. }
    131. void leftMove(int state) {
    132. switch(state){
    133. case WHEEL_MOVE_FORWARD:
    134. digitalWrite(IN3,HIGH);
    135. digitalWrite(IN4,LOW);
    136. break;
    137. case WHEEL_MOVE_BACKWARD:
    138. digitalWrite(IN3,LOW);
    139. digitalWrite(IN4,HIGH);
    140. break;
    141. case WHEEL_MOVE_IDEL:
    142. digitalWrite(IN3,LOW);
    143. digitalWrite(IN4,LOW);
    144. break;
    145. }
    146. }