zoukankan      html  css  js  c++  java
  • Arduino智能小车制作报告

    Arduino智能小车制作报告

    制作成员:20135224陈实  20135208贺邦  20135207王国伊

    前提:

    Arduino,是一个开源的单板机控制器,采用了基于开放源代码的软硬件平台,构建于开放源代码 simple I/O接口版,并且具有使用类似Java,C语言的Processing Wiring开发环境。选择Arduino作为智能小车的控制板,因为它的小巧但功能强大,能够方便的和传感器还有各种电子元件连接,而且还能和很多软件如Flash、Processing进行连接互动,但是最重要的是它的开源特性,它的电路设计图和IDE都是开源的,每个人都可以免费的修改和使用,这也是现在Arduino能够逐渐流行起来的原因,有什么比能够和别人自由地分享自己的制作更加有吸引力呢!(视频教材引入)

    制作流水线:

    1 了解必要的小车安装知识

    2 安装必要的程序软件

    3 学习视频教程

    4 安装小车硬件部分

    5 熟悉软件工具使用

    6 查看代码以及烧代码流程

    7 检验小车完成质量

    一,了解必要的小车安装知识

    相关书籍

    推荐来自百度

    据说这些都是传说级别的书籍,对于我们只能浅尝辄止

    二, 安装必要的程序软件

    安装Arduino开发软件arduino-1.0.5-windows

     

     

    三,学习视频教程

    视频中有大部分出现问题的讲解可以很好的调整自己的机器

    四,安装小车硬件部分

    安装小车具体顺序:

    电机---电池盒---万向轮---拓展面包板---航机云台---开发板

    注意细节明细:

    1 电机在安装时注意两个螺丝先不能拧的太紧,以免第二颗放不进去

    2 除电池外,其他器件固定防止小车在行走时晃动,电机电源根据卡扣方向插紧即可

    3 液晶屏比较注意顺序,类似于二极管与三极管连接,在数电模式中有提及

    4 给小车烤程序的时候小车状态要注意

    5 电位器控制由各项功能具体表示,在调试时可以根据灯亮区别判断所处的程序功能

    制作过程:

    五,熟悉软件工具使用

    运行界面

    基本功能为:

    对钩是编译程序

    向右的箭头是编译程序加烧录程序

    右上角那项是在用超声波时检测精确数据时使用,

    可以看到数据时分的精确

     

    六,查看代码以及烧代码流程

    一般都由小程序构建大操作的流程,由于实现函数代码被封装,一些功能实现有猜测成分

    先了解一般基础构建,前进操作代码:

    前进:

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

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

    void setup()
    {
    //初始化电机驱动IO为输出方式
    pinMode(Left_motor_go,OUTPUT); // PIN 8 (PWM)
    pinMode(Left_motor_back,OUTPUT); // PIN 9 (PWM)
    pinMode(Right_motor_go,OUTPUT);// PIN 10 (PWM)
    pinMode(Right_motor_back,OUTPUT);// PIN 11 (PWM)
    }
    void run(int time) // 前进
    {
    digitalWrite(Right_motor_go,HIGH); // 右电机前进
    digitalWrite(Right_motor_back,LOW);
    analogWrite(Right_motor_go,200);//PWM比例0~255调速,左右轮差异略增减
    analogWrite(Right_motor_back,0);
    digitalWrite(Left_motor_go,HIGH); // 左电机前进
    digitalWrite(Left_motor_back,LOW);
    analogWrite(Left_motor_go,200);//PWM比例0~255调速,左右轮差异略增减
    analogWrite(Left_motor_back,0);
    delay(time * 100); //执行时间,可以调整
    }

    void loop()
    {
    delay(500);
    run(10); //前进
    }

    -----------------------------------------------------------------

    前后左右复合:

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

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

    void setup()
    {
    //初始化电机驱动IO为输出方式
    pinMode(Left_motor_go,OUTPUT); // PIN 8 (PWM)
    pinMode(Left_motor_back,OUTPUT); // PIN 9 (PWM)
    pinMode(Right_motor_go,OUTPUT);// PIN 10 (PWM)
    pinMode(Right_motor_back,OUTPUT);// PIN 11 (PWM)
    }
    void run(int time) // 前进
    {
    digitalWrite(Right_motor_go,HIGH); // 右电机前进
    digitalWrite(Right_motor_back,LOW);
    analogWrite(Right_motor_go,200);//PWM比例0~255调速,左右轮差异略增减
    analogWrite(Right_motor_back,0);
    digitalWrite(Left_motor_go,HIGH); // 左电机前进
    digitalWrite(Left_motor_back,LOW);
    analogWrite(Left_motor_go,200);//PWM比例0~255调速,左右轮差异略增减
    analogWrite(Left_motor_back,0);
    delay(time * 100); //执行时间,可以调整
    }

    void brake(int time) //刹车,停车
    {
    digitalWrite(Right_motor_go,LOW);
    digitalWrite(Right_motor_back,LOW);
    digitalWrite(Left_motor_go,LOW);
    digitalWrite(Left_motor_back,LOW);
    delay(time * 100);//执行时间,可以调整
    }

    void left(int time) //左转(左轮不动,右轮前进)
    {
    digitalWrite(Right_motor_go,HIGH); // 右电机前进
    digitalWrite(Right_motor_back,LOW);
    analogWrite(Right_motor_go,200);
    analogWrite(Right_motor_back,0);//PWM比例0~255调速
    digitalWrite(Left_motor_go,LOW); //左轮不动
    digitalWrite(Left_motor_back,LOW);
    analogWrite(Left_motor_go,0);
    analogWrite(Left_motor_back,0);//PWM比例0~255调速
    delay(time * 100); //执行时间,可以调整
    }

    void spin_left(int time) //左转(左轮后退,右轮前进)
    {
    digitalWrite(Right_motor_go,HIGH); // 右电机前进
    digitalWrite(Right_motor_back,LOW);
    analogWrite(Right_motor_go,200);
    analogWrite(Right_motor_back,0);//PWM比例0~255调速
    digitalWrite(Left_motor_go,LOW); //左轮后退
    digitalWrite(Left_motor_back,HIGH);
    analogWrite(Left_motor_go,0);
    analogWrite(Left_motor_back,200);//PWM比例0~255调速
    delay(time * 100); //执行时间,可以调整
    }

    void right(int time) //右转(右轮不动,左轮前进)
    {
    digitalWrite(Right_motor_go,LOW); //右电机不动
    digitalWrite(Right_motor_back,LOW);
    analogWrite(Right_motor_go,0);
    analogWrite(Right_motor_back,0);//PWM比例0~255调速
    digitalWrite(Left_motor_go,HIGH);//左电机前进
    digitalWrite(Left_motor_back,LOW);
    analogWrite(Left_motor_go,200);
    analogWrite(Left_motor_back,0);//PWM比例0~255调速
    delay(time * 100); //执行时间,可以调整
    }

    void spin_right(int time) //右转(右轮后退,左轮前进)
    {
    digitalWrite(Right_motor_go,LOW); //右电机后退
    digitalWrite(Right_motor_back,HIGH);
    analogWrite(Right_motor_go,0);
    analogWrite(Right_motor_back,200);//PWM比例0~255调速
    digitalWrite(Left_motor_go,HIGH);//左电机前进
    digitalWrite(Left_motor_back,LOW);
    analogWrite(Left_motor_go,200);
    analogWrite(Left_motor_back,0);//PWM比例0~255调速
    delay(time * 100); //执行时间,可以调整
    }

    void back(int time) //后退
    {
    digitalWrite(Right_motor_go,LOW); //右轮后退
    digitalWrite(Right_motor_back,HIGH);
    analogWrite(Right_motor_go,0);
    analogWrite(Right_motor_back,150);//PWM比例0~255调速
    digitalWrite(Left_motor_go,LOW); //左轮后退
    digitalWrite(Left_motor_back,HIGH);
    analogWrite(Left_motor_go,0);
    analogWrite(Left_motor_back,150);//PWM比例0~255调速
    delay(time * 100); //执行时间,可以调整
    }

    void loop()
    {
    delay(2000); //延时2s后启动
    back(10); //后退1s
    brake(5);//停止0.5s
    run(10);//前进1s
    brake(5);//停止0.5s
    left(10);//向左转1s
    right(10);//向右转1s
    spin_right(20); //向右旋转2s
    spin_left(20);//向左旋转2s
    brake(5);//停车
    }

    前2段代码比较可以发现:就是将前进的功能按时间控制来调整到是后退还是左右

    左右的实现应该是以转速差别来实现,而转速可以从提供电压的函数实现

    ---------------------------------------------------------------------------

    后续代码:

    //#include <Servo.h>
    int Left_motor_back=8; //左电机后退(IN1)
    int Left_motor_go=9; //左电机前进(IN2)
    int Right_motor_go=10; // 右电机前进(IN3)
    int Right_motor_back=11; // 右电机后退(IN4)

    int key=7;//定义按键 数字7 接口
    int beep=12;//定义蜂鸣器 数字12 接口

    const int SensorRight = 3; //右循迹红外传感器(P3.2 OUT1)
    const int SensorLeft = 4; //左循迹红外传感器(P3.3 OUT2)

    int SL; //左循迹红外传感器状态
    int SR; //右循迹红外传感器状态

    void setup()
    {
    //初始化电机驱动IO为输出方式
    pinMode(Left_motor_go,OUTPUT); // PIN 8 (PWM)
    pinMode(Left_motor_back,OUTPUT); // PIN 9 (PWM)
    pinMode(Right_motor_go,OUTPUT);// PIN 10 (PWM)
    pinMode(Right_motor_back,OUTPUT);// PIN 11 (PWM)
    pinMode(key,INPUT);//定义按键接口为输入接口
    pinMode(beep,OUTPUT);
    pinMode(SensorRight, INPUT); //定义右循迹红外传感器为输入
    pinMode(SensorLeft, INPUT); //定义左循迹红外传感器为输入
    }

    -----------------------------------------------------------

    红外功能:

    #include <IRremote.h>//包含红外库
    int RECV_PIN = A4;//端口声明
    IRrecv irrecv(RECV_PIN);
    decode_results results;//结构声明
    int on = 0;//标志位
    unsigned long last = millis();

    long run_car = 0x00FF18E7;//按键2
    long back_car = 0x00FF4AB5;//按键8
    long left_car = 0x00FF10EF;//按键4
    long right_car = 0x00FF5AA5;//按键6
    long stop_car = 0x00FF38C7;//按键5
    long left_turn = 0x00ff30CF;//按键1
    long right_turn = 0x00FF7A85;//按键3
    //==============================
    int Left_motor_back=8; //左电机后退(IN1)
    int Left_motor_go=9; //左电机前进(IN2)

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

    void setup()
    {
    //初始化电机驱动IO为输出方式
    pinMode(Left_motor_go,OUTPUT); // PIN 8 (PWM)
    pinMode(Left_motor_back,OUTPUT); // PIN 9 (PWM)
    pinMode(Right_motor_go,OUTPUT);// PIN 10 (PWM)
    pinMode(Right_motor_back,OUTPUT);// PIN 11 (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);
    //analogWrite(Right_motor_go,200);//PWM比例0~255调速,左右轮差异略增减
    //analogWrite(Right_motor_back,0);
    digitalWrite(Left_motor_go,HIGH); // 左电机前进
    digitalWrite(Left_motor_back,LOW);
    //analogWrite(Left_motor_go,200);//PWM比例0~255调速,左右轮差异略增减
    //analogWrite(Left_motor_back,0);
    //delay(time * 100); //执行时间,可以调整
    }

    void brake() //刹车,停车
    {
    digitalWrite(Right_motor_go,LOW);
    digitalWrite(Right_motor_back,LOW);
    digitalWrite(Left_motor_go,LOW);
    digitalWrite(Left_motor_back,LOW);
    //delay(time * 100);//执行时间,可以调整
    }

    void left() //左转(左轮不动,右轮前进)
    {
    digitalWrite(Right_motor_go,HIGH); // 右电机前进
    digitalWrite(Right_motor_back,LOW);
    //analogWrite(Right_motor_go,200);
    //analogWrite(Right_motor_back,0);//PWM比例0~255调速
    digitalWrite(Left_motor_go,LOW); //左轮不动
    digitalWrite(Left_motor_back,LOW);
    //analogWrite(Left_motor_go,0);
    //analogWrite(Left_motor_back,0);//PWM比例0~255调速
    //delay(time * 100); //执行时间,可以调整
    }

    void spin_left() //左转(左轮后退,右轮前进)
    {
    digitalWrite(Right_motor_go,HIGH); // 右电机前进
    digitalWrite(Right_motor_back,LOW);
    //analogWrite(Right_motor_go,200);
    //analogWrite(Right_motor_back,0);//PWM比例0~255调速
    digitalWrite(Left_motor_go,LOW); //左轮后退
    digitalWrite(Left_motor_back,HIGH);
    //analogWrite(Left_motor_go,0);
    //analogWrite(Left_motor_back,200);//PWM比例0~255调速
    //delay(time * 100); //执行时间,可以调整
    }

    void right() //右转(右轮不动,左轮前进)
    {
    digitalWrite(Right_motor_go,LOW); //右电机不动
    digitalWrite(Right_motor_back,LOW);
    //analogWrite(Right_motor_go,0);
    //analogWrite(Right_motor_back,0);//PWM比例0~255调速
    digitalWrite(Left_motor_go,HIGH);//左电机前进
    digitalWrite(Left_motor_back,LOW);
    //analogWrite(Left_motor_go,200);
    //analogWrite(Left_motor_back,0);//PWM比例0~255调速
    //delay(time * 100); //执行时间,可以调整
    }

    void spin_right() //右转(右轮后退,左轮前进)
    {
    digitalWrite(Right_motor_go,LOW); //右电机后退
    digitalWrite(Right_motor_back,HIGH);
    //analogWrite(Right_motor_go,0);
    //analogWrite(Right_motor_back,200);//PWM比例0~255调速
    digitalWrite(Left_motor_go,HIGH);//左电机前进
    digitalWrite(Left_motor_back,LOW);
    //analogWrite(Left_motor_go,200);
    //analogWrite(Left_motor_back,0);//PWM比例0~255调速
    //delay(time * 100); //执行时间,可以调整
    }

    void back() //后退
    {
    digitalWrite(Right_motor_go,LOW); //右轮后退
    digitalWrite(Right_motor_back,HIGH);
    //analogWrite(Right_motor_go,0);
    //analogWrite(Right_motor_back,150);//PWM比例0~255调速
    digitalWrite(Left_motor_go,LOW); //左轮后退
    digitalWrite(Left_motor_back,HIGH);
    //analogWrite(Left_motor_go,0);
    //analogWrite(Left_motor_back,150);//PWM比例0~255调速
    //delay(time * 100); //执行时间,可以调整
    }

    void dump(decode_results *results)
    {
    int count = results->rawlen;
    if (results->decode_type == UNKNOWN)
    {
    //Serial.println("Could not decode message");
    brake();
    }

    void loop()
    {
    if (irrecv.decode(&results)) //调用库函数:解码
    {
    // If it's been at least 1/4 second since the last
    // IR received, toggle the relay
    if (millis() - last > 250) //确定接收到信号
    {
    on = !on;//标志位置反
    digitalWrite(13, on ? HIGH : LOW);//板子上接收到信号闪烁一下led
    dump(&results);//解码红外信号
    }
    if (results.value == run_car )//按键2
    run();//前进
    if (results.value == back_car )//按键8
    back();//后退
    if (results.value == left_car )//按键4
    left();//左转
    if (results.value == right_car )//按键6
    right();//右转
    if (results.value == stop_car )//按键5
    brake();//停车
    if (results.value == left_turn )//按键1
    spin_left();//左旋转
    if (results.value == right_turn )//按键3
    spin_right();//右旋转
    last = millis();
    irrecv.resume(); // Receive the next value
    }
    }

    可以发现:只要在前后左右的实现功能上加入控制信号,利用IF或者swich等选择实现程序的跳转

    烧录:将线连接起来,利用软件考入即可

    七, 检验小车完成质量

    小车不足:

    在运行中出现很多不良动作

    1 小车左右方向转动不平衡,这与很多因素有关难以避免

    2 小车对于一些障碍物无法判别:透明的,过低的,左右死角的

    3 没有预测,当速度调整过快的时候,会出现反应不过来的现象

    实践总结:

    1 通过本次实践,不仅在考验我们动手能力的同时,还能提高我们对于代码作用驱动具体行动的方式的了解

    2 学习的方式的多样化理解:纸上得来终觉浅,很多东西不一定要通过看书来了解的,动手同样是一种不可或缺的方式

    3 能力提升的表现:理解能力,学习能力,动手能力等等多种能力的提升是不言而喻的,这在以后对我们的学习与生活都是很好的教材与铺垫

    4 没有最好只有更好的意识:精益求精是我们不断超越自己的指导思想,小车的不足之处对于我们或许也是一种不可缺少的动力吧

  • 相关阅读:
    微服务、SpringCloud、k8s、Istio杂谈
    php环境安装
    最近重构公司消息服务的架构设计
    test
    博文目录(最新更新:2019.8.5)
    读过的书
    我在北京这几年(全)
    【原】深度学习的一些经验总结和建议 | To do v.s Not To Do
    如何高效利用一场技术分享?
    深度学习分布式训练及CTR预估模型应用
  • 原文地址:https://www.cnblogs.com/chuishi/p/4948580.html
Copyright © 2011-2022 走看看