当前位置:   article > 正文

基于视觉的自寻物小车(openmv+arduino)_arduino视觉巡线

arduino视觉巡线
     断断续续学openmv和arduino一个月,所以没什么编程基础,所以这个写的比较简单,只希望作为引子记录一下第一个小实验然后好好把视觉一只学下去,虽然现在看来很简单,但入门时可谓处处碰壁,做出来还是挺开心。话不多说,开始介绍吧。
  • 1

所需基本知识:串口通讯,字符串处理,电机控制,识别色块,arduino编程基础(C/C++),会调用openmvIde里的一些函数,会配置和使用openmv

材料清单;
6v电机2;
openmv4;
arduinomega2560;
l298n电机驱动
1;
小车底座;
牛眼轮1;
普通轮胎
2;
电源;
蓝色物料;

思路: 通过UART在openmv和arduino之间通信,openmv识别物料并确定物料中心坐标发送给arduino,arduino接收并读取字符串,然后设定一个阈值(中心点的值),用if else对阈值进行比较 ,大于阈值也就是在右侧,小于阈值在左侧。

附上接线图(不含电源) :openmv p4脚(TX)接arduino 10脚(RX),gnd接gnd(共地),l298n 逻辑输入口(1-4)分别接arduino6,7,8,9脚
使能端接5,11脚
在这里插入图片描述

arduino程序

#include <SoftwareSerial.h>
SoftwareSerial softSerial(10,11); //定义软串口,rx为10号端口,tx为11号端口
int x;
int input1 = 6;  //定义输出引脚
int input2 = 7; //定义输出引脚
int input3 = 8; //定义输出引脚
int input4 = 9; //定义输出引脚
int ENA=5;//定义使能端引脚(下同)
int ENB=11;




void setup()
{
  pinMode(input1,OUTPUT);//下列配置各引脚为输出模式
pinMode(input2,OUTPUT);
pinMode(input3,OUTPUT);
pinMode(input4,OUTPUT);
pinMode(ENA,OUTPUT);
pinMode(ENB,OUTPUT);
  softSerial.begin(9600); //初始化虚拟串口
  Serial.begin(9600); //初始化硬串口
  
}
String A_String = "";//定义用来存数据的字符串

void loop()
{
  
  
  
  if (softSerial.available() > 0) //判断软串口是否接收到openmv数据,然后读取,然后在串口监视器打印
  {
    if(softSerial.peek() != '\n')
    {
      A_String += (char)softSerial.read();//把串口读的单个字符逐加到字符串
    }
    else
    {
      softSerial.read();
     
      
       x=A_String.toInt();//把字符串转成int类型存放
   
       if(x>80)//坐标和阈值进行判断
       {
        Serial.println("1");//串口打印数字1
          Serial.println(x);//串口打印坐标
         left();//左转
       }
       else if(x<80)
       {
         Serial.println("2");//串口打印数字2
          Serial.println(x);//串口打印坐标
          right();//右转
       }
       else
       {
        stop1();//停转
       }
       A_String = "";//重置字符串
    }
  }
}

void right()   //右转
{
  analogWrite(ENA,240);
 
  digitalWrite(input1,HIGH); 
  digitalWrite(input2,LOW);  
  digitalWrite(input3,LOW); 
  digitalWrite(input4,LOW);   
}


void stop1()//停转
{
 
  digitalWrite(input1,LOW); 
  digitalWrite(input2,LOW);  
  digitalWrite(input3,LOW); 
  digitalWrite(input4,LOW);   
}

void left()//左转
{
 
  analogWrite(ENB,240);
  digitalWrite(input1,LOW); 
  digitalWrite(input2,LOW);  
  digitalWrite(input3,HIGH); 
  digitalWrite(input4,LOW);   
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96

openmv程序

import sensor, image, time
from pyb import UART
import json
bule_threshold   = (48,12,-19,33,-49,-14)//蓝色的阈值
sensor.reset() # Initialize the camera sensor.
sensor.set_hmirror(True)
sensor.set_vflip(True)
sensor.set_pixformat(sensor.RGB565) 
sensor.set_framesize(sensor.QQVGA) 
sensor.skip_frames(10)
sensor.set_auto_whitebal(False) 
clock = time.clock()

uart = UART(3, 9600)//串口波特率需要和arduino一致 这里设为9600
def find_max(blobs):
    max_size=0
    for blob in blobs:
        if blob.pixels() > max_size:
            max_blob=blob
            max_size = blob.pixels()
    return max_blob //寻找最大色块并返回最大色块的坐标

while(True):
    img = sensor.snapshot()//采集图像

    blobs = img.find_blobs([blue_threshold])
    if blobs:
        max_blob=find_max(blobs)
        img.draw_rectangle(max_blob.rect())//框选最大色块
        img.draw_cross(max_blob.cx(), max_blob.cy())//在最大色块中心画十字
        pcx = max_blob.cx()//定义pcx为最大色块中心的横坐标


      
        output_str=json.dumps(max_blob.cx()) //把pcx用json字符串的形式发送给arduino
        uart.write(output_str + '\r\n')
        print(pcx)//打印输出pcx
    else:
        print('not found!')

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/399465
推荐阅读
相关标签
  

闽ICP备14008679号