文档章节

Arduino智能小车的走路程序

小穷博士
 小穷博士
发布于 2014/05/24 12:28
字数 607
阅读 6279
收藏 2

功能就是沿着一面墙走。非常简单,但是手头上的这个小车非常的差,做工不好不说,配的两边的电机参数差别非常大,同样的控制PWM,两侧的速度能相差一倍,更别提行走时晃晃悠悠的差点就掉下来的轮子了。另外,只配备了一个超声波测距模块,,不能同时检测多个方向上的障碍物,是这个软件难编写的一个原因。

视频地址:

http://v.youku.com/v_show/id_XNzAyOTg0Nzc2.html


代码:

int outputPin = 5;
int inputPin = 4;
int cmdPin = 3;
int pinI1=8;//定义I1接口
int pinI2=9;//定义I2接口
int speedpin1=11;//定义EA(PWM调速)接口
int pinI3=6;//定义I3接口
int pinI4=7;//定义I4接口
int speedpin2=10;//定义EB(PWM调速)接口
int average_speed_l = 150;
int average_speed_r = 100;
int speed_limit_l = 80;
int speed_limit_r = 60;
int target_distance = 30;//in cm
int lost_distance = 80;
float detect_distance()
{
      digitalWrite(outputPin, LOW);   // 讓超聲波發射低電壓2μs
      delayMicroseconds(2);
      digitalWrite(outputPin, HIGH);  // 讓超聲波發射高電壓10μs,這裡至少是10μs
      delayMicroseconds(10);
      digitalWrite(outputPin, LOW);    // 維持超聲波發射低電壓
      float Fdistance = pulseIn(inputPin, HIGH);  // 讀差相差時間
      Fdistance= Fdistance/5.8/10;       // 將時間轉為距離距离(單位:公分)
      Serial.print("F distance:");      //輸出距離(單位:公分)
      Serial.println(Fdistance);         //顯示距離
      return Fdistance;
}
void rightSpeed(int speed_r)
{
  if(speed_r < speed_limit_r)
  {
    speed_r = 0;
  }
 analogWrite(speedpin1,speed_r);//输入模拟值进行设定速度
 digitalWrite(pinI1,HIGH);//使直流电机(左)顺时针转
 digitalWrite(pinI2,LOW);
}
void leftSpeed(int speed_l)
{
  if(speed_l < speed_limit_l)
  {
    speed_l = 0;
  }
   analogWrite(speedpin2,speed_l);//输入模拟值进行设定速度
   digitalWrite(pinI3,LOW);//使直流电机()顺时针转
   digitalWrite(pinI4,HIGH);
}
void stop_l()
{
   digitalWrite(speedpin2,LOW);//输入模拟值进行设定速度
   digitalWrite(pinI3,LOW);//使直流电机()顺时针转
   digitalWrite(pinI4,LOW);
}
void stop_r()
{
 digitalWrite(speedpin1,LOW);//输入模拟值进行设定速度
 digitalWrite(pinI1,LOW);//使直流电机(左)顺时针转
 digitalWrite(pinI2,LOW);
}
void turn_l()
{
  leftSpeed(100);
  rightSpeed(150);
}
void turn_r()
{
  leftSpeed(200);
  rightSpeed(80);
}
void noturn()
{
  leftSpeed(100);
  rightSpeed(80);
}
void rotate()
{
  leftSpeed(200);
  rightSpeed(0);
}
void setup()
{
  Serial.begin(9600);
  pinMode(outputPin, OUTPUT);
  pinMode(inputPin, INPUT);
  pinMode(pinI1,OUTPUT);
  pinMode(pinI2,OUTPUT);
  pinMode(speedpin1,OUTPUT);
  pinMode(pinI3,OUTPUT);
  pinMode(pinI4,OUTPUT);
  pinMode(speedpin2,OUTPUT);
  pinMode(cmdPin, INPUT);
}
void loop()
{
  if(digitalRead(cmdPin) == LOW){
     
    float dis = detect_distance();
    if(dis > lost_distance){
      while(true)
      {
        rotate();
        delay(100);
        stop_l();
        stop_r();   
        delay(100);    
        dis = detect_distance();
        if(dis < lost_distance) break;
      }
    }else{
      if(dis > target_distance){
        if(dis - target_distance > 2){ //if the difference is small enough, it can be neglected. 
          turn_r();
        }else{
          noturn();
        }
      }
      if(dis < target_distance){
        if(target_distance - dis > 2){
          turn_l();
        }else{
          noturn();
        }
      }
    }
   }else{
      stop_l();
      stop_r();
   }
  delay(100);
}



© 著作权归作者所有

小穷博士
粉丝 3
博文 16
码字总数 12242
作品 0
杭州
私信 提问
加载中

评论(1)

cya
cya
不错,我也想整一个
Arduino教程汇总

原始链接:Arduino教程汇总贴 (有更新) 初识arduino http://www.arduino.cn/thread-1083-1-1.html 常见arduino版本比较 http://www.arduino.cn/thread-1192-1-1.html arduino驱动安装方法 ht......

小堤
2013/05/26
25.4K
15
基于pcDuino的WiFi实时视频监控智能小车——硬件部分(一)

一、组装前准备工具: 斜口钳、尖嘴钳、3毫米套筒、2毫米一字螺丝刀、3毫米十字螺丝刀、5毫米十字螺丝刀、万用表电烙铁、焊锡、胶带、镊子、壁纸刀(可能用到的工具还不止这些,只要好用大家...

pc朵拉
2013/07/30
1K
0
TPYBoard之DIY一个无线装甲小车

  *本文作者:_橙子 ゝ,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。   智能小车作为现代的新发明,是以后的发展方向,他可以按照预先设定的模式在一个环境里自动的运作,不需要人...

FreeBuf
2018/07/26
0
0
[MicroPython]TPYBoard智能小车“飞奔的TPYBoard装甲一号”

智能小车作为现代的新发明,是以后的发展方向,他可以按照预先设定的模式在一个环境里自动的运作,不需要人为的管理,可应用于科学勘探等等的用途。智能小车能够实时显示时间、速度、里程,具...

bodasisiter
2018/07/19
145
0
基于pcDuino的WiFi实时视频监控智能小车-——前言

随着嵌入式软硬件的发展 ,各项技术的集成度越来越高。软硬件结合开发的门槛越来越高,工程师学习的周期也越来越长。 这两年,以Arduino为代表的开源硬件运动在世界范围内越来越普及,用户群...

pc朵拉
2013/07/30
914
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot 2 实战:使用 Spring Boot Admin 监控你的应用

1. 前言 生产上对 Web 应用 的监控是十分必要的。我们可以近乎实时来对应用的健康、性能等其他指标进行监控来及时应对一些突发情况。避免一些故障的发生。对于 Spring Boot 应用来说我们可以...

码农小胖哥
今天
6
0
ZetCode 教程翻译计划正式启动 | ApacheCN

原文:ZetCode 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远。 ApacheCN 学习资源 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 ...

ApacheCN_飞龙
今天
4
0
CSS定位

CSS定位 relative相对定位 absolute绝对定位 fixed和sticky及zIndex relative相对定位 position特性:css position属性用于指定一个元素在文档中的定位方式。top、right、bottom、left属性则...

studywin
今天
7
0
从零基础到拿到网易Java实习offer,我做对了哪些事

作为一个非科班小白,我在读研期间基本是自学Java,从一开始几乎零基础,只有一点点数据结构和Java方面的基础,到最终获得网易游戏的Java实习offer,我大概用了半年左右的时间。本文将会讲到...

Java技术江湖
昨天
7
0
程序性能checklist

程序性能checklist

Moks角木
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部