arduino 单片机机器人爱好者之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2702|回复: 6

基于OpenCV的全向轮追踪机器人,arduino UNO

[复制链接]

签到天数: 477 天

[LV.9]以坛为家II

发表于 2019-12-3 16:45:05 | 显示全部楼层 |阅读模式
本帖最后由 AllBlue 于 2020-3-31 07:50 编辑


全向轮追踪机器人

OpenCV Bot实际上通过图像处理检测或跟踪任何实时对象。此应用程序可以使用其颜色检测任何对象,并在手机屏幕中创建X,Y位置和区域area,使用此应用程序,数据通过蓝牙发送到微控制器。它已经过蓝牙模块测试,适用于各种设备。我们通过手机下载此APP来实现颜色的追踪,通过蓝牙发送数据到Arduino UNO上进行数据分析后执行运动命令。

在手机上安装APP软件(见底部链接),如可以科学上网可以自行下载,链接:https://play.google.com/store/apps/details?id=xyz.cruxlab.opencvbot,安装后图如下:

连接蓝牙(先在设置里匹配好,pin1234,再到APP里面选择连接)

OpenCV Bot1.png

点击需要识别的物体(颜色不要与周围有冲突,影响识别效果)

OpenCVBot2.jpg

识别中我们可以看到在图像的上部显示出X,Y,Area值,X表示左右,Y表示上下,Area表示前后,通过得到的数值我们可以很轻松的判断球向哪里运动,通过蓝牙传输数据到Arduino UNO主板中,我们就可以控制机器人怎么运动。(由于抓捕物体的大小不同,参数值也会不同,所以需要根据实际使用的物体大小进行选取判断值)

底盘车架选用灵活的全向轮,行走灵活,无死角的旋转和行走,方便实行我们跟随目标;当然,Mecanum wheels也是不错的选择。我们安装好底盘,每个轮子使用单独的驱动(灵活运动的关键),具体配件如下:

1:4WD全向轮底盘,3WD全向轮底盘,麦克纳姆轮底盘都可以;

2:安卓手机,支持安卓5以上;

3:Arduino UNO R3主板,兼容型号都可以,或者其余单片机等等;

4:2块PM-R3,叠加结构,引脚相同所以需要外部加工修改引脚的位置;

5:18650电池,3S;

6:固定手机的支架;

7:最好准备防滑毯,效果会很好;


如下是安装好的样子

omniwheels.jpg

示例代码如下,检测的X,Y,Area值在串口里面查看,代码驱动部分需要自行修改以适配不同的电机驱动

[C] 纯文本查看 复制代码
[b][size=3]#include <SoftwareSerial.h>
 
SoftwareSerial mySerial(2, 3); // RX, TX
 
//Initialize global variables
String bluetoothRead;
unsigned short x, y, area;
unsigned short strLength;
 
//Configure motor pin
int pwmMotorA = 11;
int pwmMotorB = 10;
int leftMotorA = 9;
int leftMotorB = 8;
int rightMotorA = 7;
int rightMotorB = 6;
 
//Set motor speed
int motorSpeed = 140;
 
void setup() {
 
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  Serial.println("OpenCV Bot");
 
  // Set the baud rate of (HC-05) Bluetooth module
  mySerial.begin(38400);
 
  //Setup pins
  pinMode(pwmMotorA, OUTPUT);
  pinMode(pwmMotorB, OUTPUT);
 
  pinMode(leftMotorA, OUTPUT);
  pinMode(leftMotorB, OUTPUT);
 
  pinMode(rightMotorA, OUTPUT);
  pinMode(rightMotorB, OUTPUT);
 
  analogWrite(pwmMotorA, motorSpeed);
  analogWrite(pwmMotorB, motorSpeed);
}
 
void loop() {
  register byte ndx = 0;
  char commandbuffer[50];
 
  if (mySerial.available() > 0) {
    delay(10);
    while ( mySerial.available() && ndx < 50) {
      commandbuffer[ndx++] = mySerial.read();
    }
 
    commandbuffer[ndx] = '\0';
    bluetoothRead = (char*)commandbuffer;
    strLength = bluetoothRead.length();
    //Serial.println(bluetoothRead);
 
    if (bluetoothRead.substring(0, 1).equals("X")) {
      uint8_t pos, i = 1;
 
      while (bluetoothRead.substring(i, i + 1) != ("Y")) {
        i++;
      }
 
      x = bluetoothRead.substring(1, i).toInt();
      //Serial.print("X: ");
      //Serial.println(x);
 
      pos = i + 1;
      while (bluetoothRead.substring(i, i + 1) != ("A")) {
        i++;
      }
 
      y = bluetoothRead.substring(pos, i).toInt();
      //Serial.print("Y: ");
      //Serial.println(y);
 
      area = bluetoothRead.substring(i + 1, strLength).toInt();
      //Serial.print("Area: ");
      //Serial.println(area);
 
      if (x < 750) {
        Serial.println("Left");
        Left();
      }
      if (x > 1100) {
        Serial.println("Right");
        Right();
      }
      if (x >= 750 && x <= 1100) {
        if (area < 150) {
          Serial.println("Forward");
          Forward();
        }
        if (area >= 150 && area <= 250) {
          Serial.println("Stop");
          Stop();
        }
        if (area > 250) {
          Serial.println("Back");
          Back();
        }
      }
    }
  }
  // all data has been sent, and the buffer is empty.
  Serial.flush();
}
 
void Left() {
  digitalWrite(leftMotorA, LOW);
  digitalWrite(leftMotorB, HIGH);
 
  digitalWrite(rightMotorA, HIGH);
  digitalWrite(rightMotorB, LOW);
}
 
void Right() {
  digitalWrite(leftMotorA, HIGH);
  digitalWrite(leftMotorB, LOW);
 
  digitalWrite(rightMotorA, LOW);
  digitalWrite(rightMotorB, HIGH);
}
 
void Forward() {
  digitalWrite(leftMotorA, HIGH);
  digitalWrite(leftMotorB, LOW);
 
  digitalWrite(rightMotorA, HIGH);
  digitalWrite(rightMotorB, LOW);
}
 
void Back() {
  digitalWrite(leftMotorA, LOW);
  digitalWrite(leftMotorB, HIGH);
 
  digitalWrite(rightMotorA, LOW);
  digitalWrite(rightMotorB, HIGH);
}
 
void Stop() {
  digitalWrite(leftMotorA, LOW);
  digitalWrite(leftMotorB, LOW);
 
  digitalWrite(rightMotorA, LOW);
  digitalWrite(rightMotorB, LOW);
}[b][size=3]


串口打印值如下:

串口输出.png





Opencvbot_Omniwheels_demo.rar

1.34 KB, 阅读权限: 10, 下载次数: 12, 下载积分: 辛勤 -1

APK.rar

1.48 MB, 下载次数: 18, 下载积分: 辛勤 -1

签到天数: 10 天

[LV.3]偶尔看看II

发表于 2020-4-22 07:59:07 | 显示全部楼层
很好学习了
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2020-5-11 01:38:12 | 显示全部楼层
OpenCV 得学习下
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2020-5-11 01:57:41 | 显示全部楼层
opencv manager package was not found    科学上网也破不了 怎么办   谷歌市场也搜不到这manager package
回复 支持 反对

使用道具 举报

签到天数: 477 天

[LV.9]以坛为家II

 楼主| 发表于 2020-5-28 09:32:52 | 显示全部楼层
anshilike 发表于 2020-5-11 01:57
opencv manager package was not found    科学上网也破不了 怎么办   谷歌市场也搜不到这manager package

好像被下架了
回复 支持 反对

使用道具 举报

签到天数: 477 天

[LV.9]以坛为家II

 楼主| 发表于 2020-5-28 09:34:18 | 显示全部楼层
anshilike 发表于 2020-5-11 01:57
opencv manager package was not found    科学上网也破不了 怎么办   谷歌市场也搜不到这manager package

直接下载apk安装试试
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2020-6-9 10:05:44 | 显示全部楼层
openCV确实有学习的必要
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|联系我们|YFRobot ( 苏ICP备20009901号  

GMT+8, 2020-8-14 07:46 , Processed in 0.106157 second(s), 27 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表