找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3734|回复: 1
打印 上一主题 下一主题
收起左侧

Arduino智能车入门程序

[复制链接]
跳转到指定楼层
楼主
ID:336773 发表于 2018-5-23 19:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//引脚定义
const int left_Forward_PWM_Pin  = 3; //左电机正转控制引脚
const int left_Backward_PWM_pin = 5; //左电机反转控制引脚

const int right_Forward_PWM_Pin  = 6; //右电机正转控制引脚
const int right_Backward_PWM_pin = 9; //右电机正转控制引脚

const int AD_Left_Pin  = A0; //左电磁传感器AD引脚
const int AD_Right_Pin = A1; //右电磁传感器AD引脚

int pos; //传感器位置变量
int speed_Forward,left_speed_Forward,right_speed_Forward; //中心速度占空比、左、右电机占空比

void setup()
{
  Serial.begin(9600);  //串口设置,用于输出,波特率9600

  pinMode(left_Forward_PWM_Pin, OUTPUT);  //配置各电机控制引脚为输出
  pinMode(left_Backward_PWM_pin, OUTPUT);
  pinMode(right_Forward_PWM_Pin, OUTPUT);
  pinMode(right_Backward_PWM_pin, OUTPUT);

  analogWrite(left_Forward_PWM_Pin, 0);   //初始化各电机正转占空比, 0为停止
  analogWrite(left_Backward_PWM_pin, 0);
  analogWrite(right_Forward_PWM_Pin, 0);
  analogWrite(right_Backward_PWM_pin, 0);
}

void loop()
{
  DirectionControl(); //方向检测

  //根据方向量pos控制左右轮差速,当pos=0时小车直走,pos<0时左拐,pos>0时右拐
  left_speed_Forward  = speed_Forward + pos ;     //左轮
  right_speed_Forward = speed_Forward - pos + 10; //右轮, +10 为左右轮固有速度差补偿

  //限制电机PWM控制输出的极值(0<PWM<255)
  if(left_speed_Forward<20){left_speed_Forward=20;}
  if(left_speed_Forward>220){left_speed_Forward=220;}
  if(right_speed_Forward<20){right_speed_Forward=20;}
  if(right_speed_Forward>220){right_speed_Forward=220;}

  //设置电机正转占空比
  analogWrite(left_Forward_PWM_Pin, left_speed_Forward);    //左电机
  analogWrite(right_Forward_PWM_Pin, right_speed_Forward);  //左电机

  delay(33); //延时33ms
}

void DirectionControl() //方向检测函数
{
  static int AD_Left, AD_Right = 0; //左右电磁传感器AD值
  static float posTemp; //位置临时变量,为了提高精度,采用浮点型
  static float error,last_error=0.0;

  AD_Left  = analogRead(AD_Left_Pin);   //读左电磁传感器AD值
  AD_Right = analogRead(AD_Right_Pin);  //读右电磁传感器AD值H
  Serial.print(AD_Left); //串口输出,调试用
  Serial.print(",");
  Serial.println(AD_Right);

  if(AD_Left+AD_Right>50) //当左右电磁传感器AD值之和较大时
  //说明:如果左右电磁传感器AD值之和比较小,则说明传感器偏离太远,保持之前的舵机角度
  {
    error=AD_Left-AD_Right;
    if(last_error==0)
    last_error=error;
    posTemp=(last_error+error)/2;
    last_error=error;
    posTemp /=(AD_Left+AD_Right); //除以和值,为相对位置
    posTemp = 0 - posTemp*145; //转换成电磁线位置控制占空比(浮点),这里 *100 为比例值,值越大转向越灵敏
    pos = int(posTemp); //位置值取整

    speed_Forward = 265; //正常前进速度
  }
  else if(AD_Left+AD_Right<10) //如果当左右电磁传感器AD值之和特别小,则说明已经冲出赛道较远,改为蜗牛速
  {
    speed_Forward = 0;  //蜗牛速
  }
}


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2018-5-24 06:01 | 只看该作者
原理图能分享一下吗?
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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