舵机转向小车-红外遥控版本2.0


头像
电子DIY
原创
发布时间: 2026-07-25 18:09:59 | 阅读数 0收藏数 0评论数 0
封面
本项目基于Arduino Uno主控板,搭建一款红外遥控两驱小车。摒弃传统PS2摇杆控制方式,采用HX1838红外接收模块实现无线遥控操控,通过L298N电机驱动模块控制左右电机正反转,搭配MG995舵机实现前轮左右转向。操作简单、稳定性高,可实现红外按键控制舵机左转、右转,小车全速前进、后退,松开按键立即停机,适合单片机硬件实训、智能小车入门制作。

准备工作:

材料:


序号

元器件名称

规格型号

数量

1

Arduino Uno主控板

标准版

1

2

L298N电机驱动模块

直流电机驱动

1

3

MG995舵机

180°大扭力

1

4

HX1838红外接收模块

万能红外接收

1

5

红外遥控器

普通家电遥控器

1

6

直流减速电机+车轮

小车专用

2

7

小车车架

两驱小车车架

1

8

杜邦线

公对母、公对公

若干

9

外部6V电源/电池盒

5V/2A

1


1

硬件引脚接线定义

1. 红外接收模块(HX1838)

  1. VCC → Arduino 5V
  2. GND → Arduino GND
  3. OUT → Arduino D11

2. 转向舵机(MG995)

  1. 红线 → 外部5V正极
  2. 棕线 → 公共GND
  3. 橙线(信号线)→ Arduino D3

3. L298N电机驱动模块

  1. ENA → D5
  2. IN1 → D6
  3. IN2 → D7
  4. ENB → D9
  5. IN3 → D10
  6. IN4 → D12
  7. L298N外接电源:12V电池/5V电源供电,GND与Arduino共地


2

接线注意事项

  1. 严禁引脚冲突:D11引脚固定分配给红外接收器
  2. 必须共地:舵机、电机驱动、Arduino所有设备的GND必须连接在一起,否则信号紊乱、舵机抖动、电机乱转。
  3. 禁止板载供电:MG995舵机和电机工作电流大,Arduino Uno板载5V电流不足以负载,必须外部独立供电,解决抖动、死机问题。
  4. 接线顺序规范:先接GND地线,再接电源线,最后接信号线;避免带电插拔杜邦线,防止烧毁芯片。
  5. 舵机限位保护:程序内置45°~135°角度限位,接线安装时禁止机械硬掰舵机,防止齿轮损坏。
  6. 电机接线区分正反转:若前进后退反向,直接调换电机两根接线即可,无需修改程序。


3

程序

软件环境配置

打开Arduino IDE,选择开发板为 Arduino Uno,选择对应COM端口;安装依赖库:Servo库、IRremote 4.7.1版本红外库,等待库安装完成无报错。

粘贴最终优化版程序,点击上传;上传成功后小车自动初始化,舵机自动归中90°中位,待机等待红外指令。

功能调试

打开串口监视器,查看红外按键码:

  1. 按键0x45:舵机快速左转
  2. 按键0x46:舵机快速右转
  3. 按键0x44:小车全速前进
  4. 按键0x40:小车全速后退

调试无误后,固定所有线材,整理走线,完成整体制作。


完整程序:

/*

Arduino Uno 红外遥控小车

IRremote 4.x 适配版本

红外接收信号脚 D11

按键定义:

0X45 → 舵机左转

0X46 → 舵机右转

0X44 → 小车全速前进

0X40 → 小车全速后退

松开按键电机停止

*/

#include <Servo.h>

#include <IRremote.hpp> //4.x新版头文件


/************************** 引脚定义 **************************/

const int irRecvPin = 11; //红外接收器信号引脚


// L298N电机驱动

const int ENA = 5;

const int IN1 = 6;

const int IN2 = 7;

const int ENB = 9;

const int IN3 = 10;

const int IN4 = 12; //D11分配给红外,IN4接到D12


const int servoPin = 3; //转向舵机


/************************** 全局变量 **************************/

Servo steeringServo;

const int servoMin = 45;

const int servoMid = 90;

const int servoMax = 135;

int servoAngle = servoMid;

const int servoStep = 6; //原值3,翻倍,舵机响应加快2倍


const int FULL_SPEED = 255; //电机直接全速

int motorSpeed = 0;


/************************** 初始化 **************************/

void setup() {

Serial.begin(9600);


//L298N引脚初始化

pinMode(ENA, OUTPUT);

pinMode(IN1, OUTPUT);

pinMode(IN2, OUTPUT);

pinMode(ENB, OUTPUT);

pinMode(IN3, OUTPUT);

pinMode(IN4, OUTPUT);


//舵机初始化

steeringServo.attach(servoPin);

steeringServo.write(servoMid);

delay(500);


//启动红外接收

IrReceiver.begin(irRecvPin, DISABLE_LED_FEEDBACK);


Serial.println("红外遥控小车初始化完成!");

Serial.println("按键:0x45左转舵机 0x46右转舵机 0x44前进 0x40后退");

}


/************************** 主循环 **************************/

void loop() {

bool keyPressed = false;


if (IrReceiver.decode()) {

uint8_t cmd = IrReceiver.decodedIRData.command;

Serial.print("收到按键命令: 0x");

Serial.println(cmd, HEX);

keyPressed = true;


switch (cmd) {

case 0x45: //舵机左转

servoAngle -= servoStep;

break;

case 0x46: //舵机右转

servoAngle += servoStep;

break;

case 0x44: //全速前进

motorSpeed = FULL_SPEED;

setMotorDir(1);

break;

case 0x40: //全速后退

motorSpeed = FULL_SPEED;

setMotorDir(0);

break;

default:

break;

}

IrReceiver.resume(); //准备接收下一条红外信号

}


//无按键按下,电机停止

if (!keyPressed) {

motorSpeed = 0;

setMotorDir(2);

}


//限制舵机角度范围,防止机械堵转

servoAngle = constrain(servoAngle, servoMin, servoMax);

steeringServo.write(servoAngle);


//输出电机速度

analogWrite(ENA, motorSpeed);

analogWrite(ENB, motorSpeed);


delay(30);

}


/************************** 电机控制函数 **************************/

//dir:1前进,0后退,2停止

void setMotorDir(int dir) {

switch (dir) {

case 1: //前进

digitalWrite(IN1, HIGH);

digitalWrite(IN2, LOW);

digitalWrite(IN3, HIGH);

digitalWrite(IN4, LOW);

break;

case 0: //后退

digitalWrite(IN1, LOW);

digitalWrite(IN2, HIGH);

digitalWrite(IN3, LOW);

digitalWrite(IN4, HIGH);

break;

case 2: //停止

digitalWrite(IN1, LOW);

digitalWrite(IN2, LOW);

digitalWrite(IN3, LOW);

digitalWrite(IN4, LOW);

break;

}

}


INO
IRremote.ino
3.33KB
4

调试完成


阅读记录0
点赞0
收藏0
禁止 本文未经作者允许授权,禁止转载
猜你喜欢
评论/提问(已发布 0 条)
头像
评论 评论
收藏 收藏
分享 分享
pdf下载 下载
pdf下载 举报