智能车教程(红外、蓝牙、OpenMV追踪)

动手制作一个智能小车教程未完成

能亲手制作智能车、机器人,大概是我们每一位marker都想实现的事情,那么今天我们就来看看如何制作一辆可以红外、蓝牙控制,并且可以用openmv摄像头实时追踪色块的智能车吧。


1.小车功能设计

现在我们手上有一套智能车模型套件、红外遥控器及传感器、蓝牙模块、一块OpenMV摄像头模块。

  • 首先,要快速完成一辆小车的制作,我们可以选用智能车模型套件,直接拼装成智能车,这可以节省我们不少设计的功夫,将精力放在功能实现上面。
  • 其次,我们可以使用红外遥控和红外接收模块,对小车进行红外控制;
  • 再次,我们可以通过蓝牙模块,通过手机app,蓝牙远程遥控智能车;
  • 最后,车子要做到智能,那必不可少的就是图像识别,我们可以使用OpenMV摄像头对颜色进行实时识别和跟踪。

那就让我们开始实现以上的想法吧,JUST DO IT

2.应用学到那些知识

做这个项目之前,你需要有:

  • 一点基础的编程语法知识(任何语言)
  • 一颗耐心和创客的激情

做完这个项目,你可以掌握:

  • 电机驱动板L298N的使用方法
  • arduino的使用方法
  • 红外模块的使用方法
  • 蓝牙模块HC-05的调试方法
  • 手机控制蓝牙的方法
  • OpenMV摄像头模块颜色识别的方法
  • OpenMV与arduino板子通信的方法

3.材料准备

1.智能车部分:模型套件,如下图
通用智能车模型套件
2.控制电路部分:如下表

材料 数量
arduino模块 1块
L298N电机驱动模块 1块
红外接收模块 1块
红外遥控器 1件
蓝牙模块 1块
USB转TTL模块(可选) 1块
OpenMV3 摄像头模块 1块
9-12V电源(博主使用三节18560串联,推荐) 1件
杜邦线 若干
螺丝、螺母、铜柱 若干
热熔胶枪 1把
螺丝刀套件 1套
L298N电机驱动模块 1块
焊烙铁(可选) 1件
剥线钳(可选) 1把
电压表(可选) 1件
android手机(使用软件) 1部

3.摄像头部分:OpenMV摄像头模块,如下图
在这里插入图片描述

4.组装小车

按照说明书装配小车模型。
电子模块我是如下图安装的,当然大家可以按照自己的习惯安装。
注意:

  • 导线可以先不接,之后可以根据每一次实现的功能再接
  • 连接OpenMV的支架为博主自行切割的,大家可以动手自己设计支架

在这里插入图片描述

小车各模块安装示意图

在这里插入图片描述

小车各模块实际安装图

5.制作红外小车

准备工作都做好了,那我们开始动手制作最简单的红外小车吧。

  1. 如下图连接杜邦线
    在这里插入图片描述
红外小车连线图
  1. 电路原理
    1. 红外接收器
    2. L298N电机驱动板
    3. 电源选择
    4. Arduino UNO引脚分类与供电方式
  2. 打开Arduino开发环境并添加库文件,如未安装,点击这里
  3. 上传代码
//红外小车代码及解释
#include <IRremote.h>//打开IDE:项目→加载库→添加→搜索IRremote→安装IRredmote库
int RECV_PIN = 11;//红外接收端口
IRrecv irrecv(RECV_PIN);
decode_results results;//结构声明

//==============================
int Left_motor_back=3;     //左电机后退(IN1)
int Left_motor_go=4;     //左电机前进(IN2)

int Right_motor_go=9;    // 右电机前进(IN3)
int Right_motor_back=10;    // 右电机后退(IN4)

void setup()
{
   
   
  //初始化电机驱动IO为输出方式
  pinMode(Left_motor_go,OUTPUT); // PIN 5 (PWM)
  pinMode(Left_motor_back,OUTPUT); // PIN 6 (PWM)
  pinMode(Right_motor_go,OUTPUT);// PIN 9 (PWM) 
  pinMode(Right_motor_back,OUTPUT);// PIN 10 (PWM)
  pinMode(13, OUTPUT);////端口模式,输出
  Serial.begin(9600);   //波特率9600
  irrecv.enableIRIn(); // Start the receiver
}
void run()     // 前进
{
   
   
  digitalWrite(Right_motor_go,HIGH);  // 右电机前进
  digitalWrite(Right_motor_back,LOW);     
  digitalWrite(Left_motor_go,HIGH);  // 左电机前进
  digitalWrite(Left_motor_back,LOW);
}

void brake()         //刹车,停车
{
   
   
  digitalWrite(Right_motor_go,LOW);
  digitalWrite(Right_motor_back,LOW);
  digitalWrite(Left_motor_go,LOW);
  digitalWrite(Left_motor_back,LOW);
}

void left()         //左转(左轮不动,右轮前进)
{
   
   
  digitalWrite(Right_motor_go,HIGH);    // 右电机前进
  digitalWrite(Right_motor_back,LOW);
  digitalWrite(Left_motor_go,LOW);   //左轮不动
  digitalWrite(Left_motor_back,LOW);
}

void spin_left()         //左转(左轮后退,右轮前进)
{
   
   
  digitalWrite(Right_motor_go,HIGH);    // 右电机前进
  digitalWrite(Right_motor_back,LOW);
  digitalWrite(Left_motor_go,LOW);   //左轮后退
  digitalWrite(Left_motor_back,HIGH);
}

void right()        //右转(右轮不动,左轮前进)
{
   
   
  digitalWrite(Right_motor_go,LOW);   //右电机不动
  digitalWrite(Right_motor_back,LOW);
  digitalWrite(Left_motor_go,HIGH);//左电机前进
  digitalWrite(Left_motor_back,LOW);
}

void spin_right()        //右转(右轮后退,左轮前进)
{
   
   
  digitalWrite(Right_motor_go,LOW);   //右电机后退
  digitalWrite(Right_motor_back,HIGH);
  digitalWrite(Left_motor_go,HIGH);//左电机前进
  digitalWrite(Left_motor_back,LOW);
}

void back()          //后退
{
   
   
  digitalWrite(Right_motor_go,LOW);  //右轮后退
  digitalWrite(Right_motor_back,HIGH);
  digitalWrite(Left_motor_go,LOW);  //左轮后退
  digitalWrite(Left_motor_back,HIGH);
}

//=============================================================================
//读取各个按键需要用到这段代码
//=============================================================================

void read_key()
{
   
   
    if(irrecv.decode(&results)){
   
     //如果接收到信息
        Serial.print("code:");
        Serial.println(results.value,HEX);//results.value为16进制,unsigned long
        Serial.print("bits:");
        Serial.println(results.bits);//输出元位数
        irrecv.resume();
      } 
}



void loop()
{
   
   
  read_key();
  if(irrecv.decode(&results)){
   
     //如果接收到信息
   switch(results.value){
   
   
     case 0xFF18E7:  //前,对应2
       run();
       break;
     case 0xFF4AB5:  //后,对应8
       back();
       break;
     case 0xFF10EF:  //左,对应4
       left();
       break;
     case 0xFF5AA5:  //右,对应6
       right();
       break;
     case 0xFF38C7:  //停止,对应5
       brake();
       break;
     default:
       break;
   }
  irrecv.resume();
  }
}
  1. 测试成果
    在这里插入图片描述
红外小车实际控制

6.添加蓝牙控制功能

  1. 如下图连接杜邦线
    在这里插入图片描述
蓝牙小车连线图
  1. 电路原理及注意
    1. HC-05蓝牙模块原理
    2. 蓝牙模块与Arduino交叉连接(即蓝牙RX连接板子TX、蓝牙TX连接板子RX)
    3. 此处红外模块无需拆下,红外接线对蓝牙功能没有影响,正好同时使用两种功能
  2. 上传代码
//蓝牙小车代码及解释
#include <IRremote.h>//打开IDE:项目→加载库→添加→搜索IRremote→安装IRredmote库
int RECV_PIN = 11;//红外接收端口
IRrecv irrecv(RECV_PIN);
decode_results results;//结构声明

//==============================
int Left_motor_back=3;     //左电机后退(IN1)
int Left_motor_go=4;     //左电机前进(IN2)

int Right_motor_go=9;    // 右电机前进(IN3)
int Right_motor_back=10;    // 右电机后退(IN4)

void setup()
{
   
   
  //初始化电机驱动IO为输出方式
  pinMode
评论 37
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值