使用Arduino UNO硬件平台制作智能小车

目录

概述

1. 硬件组成

1.1 电机驱动模块

1.2 控制板

1.3 遥控器模块

2  机械结构

2.1 底盘介绍

2.2 转向功能实现

3 软件实现

4  运行测试

4.1 红外解码测试

4.2 电机运行测试


概述

       本文主要介绍使用整体结构小车底盘,外加Arduion控制板和LN298N控制板搭建一台智能遥控小车。以HX1838B作为控制信号接收模块,使用遥控器就能控制小车前进、后退、左转、右转功能。

1. 硬件组成

1.1 电机驱动模块

       电机驱动模块,主要用于驱动板上的四个电机。使用LN298N模块,其通过下图的真值表,控制四个电机的前进,后退,左转,右转。且该模块还有一个集成的5V电压模块:78M05e稳压电路,其可以输出5V的电压,用于对控制板供电。

关于该模块的详细资料,查看文档:L298N 电机驱动板 - 详细介绍 - 知乎 (zhihu.com)

LN298N驱动模块接口定义如下:

驱动板引脚功能介绍:

引脚功能介绍
VCC外部电源供电引脚
GND公共地控制板和外部电源GND都接在这个引脚上
5V控制板电源引脚
IN1,IN2左侧两个电机控制线连接控制板IO
IN3,IN4右侧两个电机控制线连接控制板IO
OU1,OUT2左侧电机驱动接口连接直流电机信号线
OU3,OUT4右侧电机驱动接口连接直流电机信号线

1.2 控制板

控制板使用Arduino UNO, 其实现功能如下:

1)控制电机驱动板 IN1、IN2、IN3、IN4的电平状态

2)接收遥控器信号

引脚功能定义如下:

控制板引脚功能介绍
AI-0连接控制板: IN-1左侧电机控制信号引脚
AI-1连接控制板: IN-2左侧电机控制信号引脚
AI-2连接控制板: IN-3右侧电机控制信号引脚
AI-3连接控制板: IN-4右侧电机控制信号引脚
D2连接IRHX1838B 信号接口

1.3 遥控器模块

        红外信号接收信号,用于接收要控制发送的控制码,以实现小车前进,后退,左转,右转。Arduino  UNO的公共库已经提供该模块的驱动,使用时仅需连接pin引脚。调用相应的接口函数,就可以实现解码功能。本系统使用IR模块为HX1838B。关于和红外遥控相关的代码可参考: 

https://github.com/Arduino-IRremote/Arduino-IRremote/blob/master/src/ir_NEC.hpp

2  机械结构

2.1 底盘介绍

在某宝上,可以采购现成的地盘,回来自己组装,价位一般在50RMB,包括4个车轮,测速码盘,直流电机。线路连接注意点:

1)左侧两个电机转动方向必须一致

2)右侧两个电机转动方向必须一致

2.2 转向功能实现

右转: 右侧两个电机向后运行,左侧两个电机向前运动

左转:  右侧两个电机向前运行,左侧两个电机向后运动

3 软件实现

使用Arduino IDE编写代码,主要实现,红外解码,控制电机转动方向,详细代码如下:

具体代码如下:

// ATMEL ATMEGA8 & 168 / ARDUINO
//
//                  +-\/-+
//            PC6  1|    |28  PC5 (AI 5)
//      (D 0) PD0  2|    |27  PC4 (AI 4)
//      (D 1) PD1  3|    |26  PC3 (AI 3)
//      (D 2) PD2  4|    |25  PC2 (AI 2)
// PWM+ (D 3) PD3  5|    |24  PC1 (AI 1)
//      (D 4) PD4  6|    |23  PC0 (AI 0)
//            VCC  7|    |22  GND
//            GND  8|    |21  AREF
//            PB6  9|    |20  AVCC
//            PB7 10|    |19  PB5 (D 13)
// PWM+ (D 5) PD5 11|    |18  PB4 (D 12)
// PWM+ (D 6) PD6 12|    |17  PB3 (D 11) PWM
//      (D 7) PD7 13|    |16  PB2 (D 10) PWM
//      (D 8) PB0 14|    |15  PB1 (D 9)  PWM
//                  +----+

#include <Arduino.h>
#include <IRremote.hpp>

//电机控制接口 
#define PIN_A0   (14)
#define PIN_A1   (15)
#define PIN_A2   (16)
#define PIN_A3   (17)

static const uint8_t MA0 = PIN_A0;
static const uint8_t MA1 = PIN_A1;
static const uint8_t MA2 = PIN_A2;
static const uint8_t MA3 = PIN_A3;

// IR 信号接口
#define IR_RECEIVE_PIN      2 // To be compatible with interrupt example, pin 2 is chosen here.


void setup() {
    // put your setup code here, to run once:
    IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
    Serial.begin(9600);

    pinMode(MA0, OUTPUT);
    pinMode(MA1, OUTPUT);
    pinMode(MA2, OUTPUT);
    pinMode(MA3, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
    if (IrReceiver.decode()) {      // Grab an IR code
            IrReceiver.printIRResultShort(&Serial);
            //IrReceive
            Serial.println(IrReceiver.lastDecodedCommand, HEX); // Print "old" raw data

            switch( IrReceiver.lastDecodedCommand )
            {
                case 0x18:    //前进
                 digitalWrite(MA0, LOW);
                 digitalWrite(MA1, HIGH);
                 digitalWrite(MA2, LOW);
                 digitalWrite(MA3, HIGH);

                break;

                case 0x52:    //后退
                 digitalWrite(MA0, HIGH);
                 digitalWrite(MA1, LOW);
                 digitalWrite(MA2, HIGH);
                 digitalWrite(MA3, LOW);


                break;

                case 0x08:    // 左转
                 digitalWrite(MA0, HIGH);
                 digitalWrite(MA1, LOW);
                 digitalWrite(MA2, LOW);
                 digitalWrite(MA3, HIGH);
                break;

                case 0x5a:     //右转
                 digitalWrite(MA0, LOW);
                 digitalWrite(MA1, HIGH);
                 digitalWrite(MA2, HIGH);
                 digitalWrite(MA3, LOW);

                break;
              case 0x45: 
              default:
                 digitalWrite(MA0, LOW);
                 digitalWrite(MA1, LOW);
                 digitalWrite(MA2, LOW);
                 digitalWrite(MA3, LOW);
              break;
            }
    }
    IrReceiver.resume();                            // Prepare for the next value
}

4  运行测试

4.1 红外解码测试

红外解码测试:

 地址位:

数据位:

数据码信息,控制板能准确解析遥控器的编码信息:

4.2 电机运行测试

遥控器按键和小车运行方向关系:

通过按遥控器按键,可以自由控制小车运行方向:

实验测试视频

智能小车测试视频

现场测试图片:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/378206.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】文件的软硬链接

文章目录 一、文件和目录的一些命令ls 命令stat 命令 二、链接的概念三、软链接&#xff08;symbolic link&#xff09;创建和删除软链接的示例软链接的特性软链接的应用使用 find 查找链接文件 四、硬链接&#xff08;hard link&#xff09;创建和删除硬链接的示例硬链接的特性…

Git简单了解

文章目录 1、Git概述2、Git下载与安装3、Git代码托管服务3.1、使用码云托管服务 1、Git概述 什么是Git Git是一个分布式版本控制工具&#xff0c;主要用于管理开发过程中的源代码文件&#xff08;Java类、xml文件、html页面等&#xff09;&#xff0c;在软件开发过程中被广泛使…

2/7 算法每日N题(二分+双指针)

第一题&#xff1a; class Solution { public:int search(vector<int>& nums, int target) {int left 0, right nums.size() - 1;while(left < right){int mid (right - left) / 2 left;int num nums[mid];if (num target) {return mid;} else if (num >…

STM32TIM定时器(1)

文章目录 前言一、介绍部分TIM简介了解定时器类型基本定时器框图通用定时器框图高级定时器框图定时器级联关系 所需简化定时器中断流程图时序部分预分频器时序计数器时序无影子寄存器计数器时序有影子寄存器计数器时序 时钟树 二、实例部分使用定时器计数使用对射红外传感器来控…

[计算机提升] 还原系统:系统映像

6.4 还原系统&#xff1a;系统映像 1、打开系统设置&#xff0c;进入到恢复页面&#xff0c;然后点击高级启动中的立即重新启动进入到高级启动页面。 2、点击疑难解答 3、点击高级选项 4、点选查看更多恢复选项到下一步系统映像修复&#xff1a; 5、点选系统映像恢复 …

.NET Core 实现 JWT 认证

写在前面 JWT&#xff08;JSON Web Token&#xff09;是一种开放标准, 由三部分组成&#xff0c;分别是Header、Payload和Signature&#xff0c;它以 JSON 对象的方式在各方之间安全地传输信息。通俗的说&#xff0c;就是通过数字签名算法生产一个字符串&#xff0c;然后在网络…

实例分割论文阅读之:《Mask Transfiner for High-Quality Instance Segmentation》

1.摘要 两阶段和基于查询的实例分割方法取得了显著的效果。然而&#xff0c;它们的分段掩模仍然非常粗糙。在本文中&#xff0c;我们提出了一种高质量和高效的实例分割Mask Transfiner。我们的Mask Transfiner不是在规则的密集张量上操作&#xff0c;而是将图像区域分解并表示…

Pymysql之Cursor常用API

Cursor常用API 1、cursor.execute(query, argsNone)&#xff1a;执行sql语句。 参数: query (str)&#xff1a;sql语句。 args (tuple, list or dict)&#xff1a;sql语句中如果有变量&#xff0c;或者格式化输出&#xff0c;会在这里填充数据。 Returns&#xff1a;返…

springboot项目启动报错:dynamic-datasource can not find primary datasource

项目启动报错信息 Caused by: com.baomidou.dynamic.datasource.exception.CannotFindDataSourceException: dynamic-datasource can not find primary datasourceat com.baomidou.dynamic.datasource.DynamicRoutingDataSource.determinePrimaryDataSource(DynamicRoutingDat…

七、Nacos源码系列:Nacos服务发现

目录 一、服务发现 二、getServices()&#xff1a;获取服务列表 2.1、获取服务列表 2.2、总结图 三、getInstances(serviceId)&#xff1a;获取服务实例列表 3.1、从缓存中获取服务信息 3.2、缓存为空&#xff0c;执行订阅服务 3.2.1、调度更新&#xff0c;往线程池中…

DC-8靶机渗透详细流程

信息收集&#xff1a; 1.存活扫描&#xff1a; arp-scan -I eth0 -l └─# arp-scan -I eth0 -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:dd:ee:6a, IPv4: 192.168.10.129 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.10…

uni使用openlayer加载本机离线地图

manifest.json添加配置 "runmode": "liberate"(默认为normal) 把地图打包进apk&#xff0c;这样手机每次访问地图就可以访问到工程文件夹的地图资源了&#xff0c;不用每次都请求云资源&#xff0c;消耗流量太大了

第9章 安全漏洞、威胁和对策(9.11-9.16)

9.11 专用设备 专用设备王国疆域辽阔&#xff0c;而且仍在不断扩张。 专用设备是指为某一特定目的而设计&#xff0c;供某一特定类型机构使用或执行某一特定功能的任何设备。 它们可被看作DCS、物联网、智能设备、端点设备或边缘计算系统的一个类型。 医疗设备、智能汽车、…

《MySQL 简易速速上手小册》第3章:性能优化策略(2024 最新版)

文章目录 3.1 查询优化技巧3.1.1 基础知识3.1.2 重点案例3.1.3 拓展案例 3.2 索引和查询性能3.2.1 基础知识3.2.2 重点案例3.2.3 拓展案例 3.3 优化数据库结构和存储引擎3.3.1 基础知识3.3.2 重点案例3.3.3 拓展案例 3.1 查询优化技巧 让我们来聊聊如何让你的 MySQL 查询跑得像…

【python】if __name__ == ‘__main__‘:

if __name__ __main__: 是一个Python脚本中使用的常见结构&#xff0c;用来判断该脚本文件是直接运行的还是被导入到其他文件中运行的。 当一个Python文件被运行时&#xff0c;Python解释器会自动创建一些特殊的变量&#xff0c;__name__就是其中之一。如果这个文件是作为主程…

米贸搜|Facebook在购物季使用的Meta广告投放流程

一、账户简化 当广告系列开始投放后&#xff0c;每个广告组都会经历一个初始的“机器学习阶段”。简化账户架构可以帮助AI系统更快获得广告主所需的成效。例如&#xff1a; 每周转化次数超过50次的广告组&#xff0c;其单次购物费用要低28%&#xff1b;成功结束机器学习阶段的…

Ondo宣布将其原生稳定币USDY带入Sui生态

重要提示&#xff1a;USDY是由短期美国国债支持的token化票据&#xff0c;持有者享受稳定币的实用性同时获得收益。USDY不得在美国或向美国人出售或以其他方式提供。USDY也未根据1933年美国证券法注册。 不到一年的时间&#xff0c;Sui已经成为全链TVL排名前十的区块链&#xf…

Netty源码 之 ByteBuf自适应扩缩容源码

Netty体系如何使得ByteBuf根据实际IO收发数据场景进行自适应扩容缩容的&#xff1f; IO收发数据的过程&#xff1a; read 读取&#xff08;"I"&#xff09;&#xff1a;网卡硬件通过网络传输介质读取对端传输过来的数据&#xff0c;网卡硬件再把数据写到recv-socke…

Flask 入门7:使用 Flask-Moment 本地化日期和时间

如果Web应用的用户来自世界各地&#xff0c;那么处理日期和时间可不是一个简单的任务。服务器需要统一时间单位&#xff0c;这和用户所在的地理位置无关&#xff0c;所以一般使用协调世界时&#xff08;UTC&#xff09;。不过用户看到 UTC 格式的时间会感到困惑&#xff0c;他们…

Linux系统安装(CentOS Vmware)

学习环境安装 VMware安装 VMware下载&安装 访问官网&#xff1a;https://www.vmware.com 在此处可以选择语言 点击China&#xff08;简体中文&#xff09; 点击产品&#xff0c;点击Workstation Pro 下滑&#xff0c;点击下载试用版 下滑找到Workstation 17 Pro for Wi…
最新文章