ARDUINO2560版本的6路寻迹程序

此程序为比赛开发,采用外部中断作为防丢失的保险,PID调节,并有红外壁纸,指定距离停车功能。以下为源代码

#include <LiquidCrystal.h>
#include <Wire.h>
#include "Adafruit_PWMServoDriver.h"

Adafruit_PWMServoDriver pwm1 = Adafruit_PWMServoDriver(0X40);
Adafruit_PWMServoDriver pwm2 = Adafruit_PWMServoDriver(0X41);


//电机电压:6.1V左右的参数,如果不加积分项,可以循线跑,但是无法回到中间传感器位置。
float Kp , Ki , Kd ;
static float error = 0, P = 0, I = 0, D = 0, PID_value = 0;
float previous_error = 0, previous_I = 0;
static int initial_motor_speed ; //期望速度
int left_motor_speed = 0;
int right_motor_speed = 0;
uint8_t irs = 0;
static int a , b, c, d;
static int flag = 0;
static int reset = 0;
static int TIME = 0;
int  an = 90;
static float distanceL;
static float distanceR;

//引脚定义
const int IR_PIN[] = {A0, A1, A2, A3, 4, 6, 7, 8, 9, 10}; //红外对管引脚定义
const int IN_A1 = 11;   // 电机A1
const int IN_A2 = 12;  // 电机A2
const int IN_B1 = 5;  // 电机B1
const int IN_B2 = 2;  // 电机B2
LiquidCrystal lcd(49, 47 , 45 , 35 , 33 , 31 , 29 );
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40);
void read_ir_values(void);
void read_HC_SR04_values(void);
void read_HC_SR04_values1(void);
void calculate_pid(void);
void motor_control(void);
void LCD_PRINT(void);
void LCD_PRINT1(void);
void ISRR1();
void ISRL1();
void FRONT1();
void KEY1();
void print_debug();

void setup()
{
  // 初始化
  pinMode(IN_A1, OUTPUT);
  pinMode(IN_A2, OUTPUT);
  pinMode(IN_B1, OUTPUT);
  pinMode(IN_B2, OUTPUT);
  pinMode(27,  INPUT);
  pinMode(25,  OUTPUT);
  pinMode(22, OUTPUT);
  pinMode(24, INPUT);
  pinMode(26, OUTPUT);
  pinMode(28, INPUT);
  pinMode(0, OUTPUT);
  pinMode(1, OUTPUT);
  for (int i = 0; i < 10; i++)
  {
    pinMode(IR_PIN[i], INPUT);
  }
  lcd.begin(16, 2);
  {
    Kp = analogRead(A15) / 10;
    Ki = analogRead(A13) / 10;
    Ki = Ki / 100;
    Kd = analogRead(A11) / 10;
    a = analogRead(A14) / 10;
    c = analogRead(A12) / 10;
    b = (a + c) / 2;
    initial_motor_speed = analogRead(A10) / 2;

  }
  attachInterrupt(5, ISRL1, FALLING); //开启外部中断2
  attachInterrupt(4, ISRR1, FALLING); //开启外部中断3
  attachIn

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于Arduino的红外两寻迹小车程序: ```c++ int leftPin = 2; // 左边传感器连接的引脚 int rightPin = 3; // 右边传感器连接的引脚 int leftVal; // 左边传感器的值 int rightVal; // 右边传感器的值 int leftSpeed = 5; // 左边电机的PWM引脚 int rightSpeed = 6; // 右边电机的PWM引脚 int leftMotor1 = 4; // 左边电机的正向控制引脚 int leftMotor2 = 7; // 左边电机的反向控制引脚 int rightMotor1 = 8; // 右边电机的正向控制引脚 int rightMotor2 = 9; // 右边电机的反向控制引脚 void setup() { pinMode(leftPin, INPUT); // 左边传感器设为输入模式 pinMode(rightPin, INPUT); // 右边传感器设为输入模式 pinMode(leftSpeed, OUTPUT); // 左边电机PWM引脚设为输出模式 pinMode(rightSpeed, OUTPUT); // 右边电机PWM引脚设为输出模式 pinMode(leftMotor1, OUTPUT); // 左边电机正向控制引脚设为输出模式 pinMode(leftMotor2, OUTPUT); // 左边电机反向控制引脚设为输出模式 pinMode(rightMotor1, OUTPUT); // 右边电机正向控制引脚设为输出模式 pinMode(rightMotor2, OUTPUT); // 右边电机反向控制引脚设为输出模式 } void loop() { leftVal = digitalRead(leftPin); // 读取左边传感器的值 rightVal = digitalRead(rightPin); // 读取右边传感器的值 if (leftVal == HIGH && rightVal == HIGH) { // 如果两边都检测到黑线 digitalWrite(leftMotor1, HIGH); // 左边电机正转 digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, HIGH); // 右边电机正转 digitalWrite(rightMotor2, LOW); analogWrite(leftSpeed, 200); // 控制左边电机的速度 analogWrite(rightSpeed, 200); // 控制右边电机的速度 } else if (leftVal == LOW && rightVal == HIGH) { // 如果只有右边检测到黑线 digitalWrite(leftMotor1, HIGH); // 左边电机正转 digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, LOW); // 右边电机反转 digitalWrite(rightMotor2, HIGH); analogWrite(leftSpeed, 150); // 控制左边电机的速度 analogWrite(rightSpeed, 100); // 控制右边电机的速度 } else if (leftVal == HIGH && rightVal == LOW) { // 如果只有左边检测到黑线 digitalWrite(leftMotor1, LOW); // 左边电机反转 digitalWrite(leftMotor2, HIGH); digitalWrite(rightMotor1, HIGH); // 右边电机正转 digitalWrite(rightMotor2, LOW); analogWrite(leftSpeed, 100); // 控制左边电机的速度 analogWrite(rightSpeed, 150); // 控制右边电机的速度 } else { // 如果两边都没有检测到黑线 digitalWrite(leftMotor1, LOW); // 左边电机停止 digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, LOW); // 右边电机停止 digitalWrite(rightMotor2, LOW); analogWrite(leftSpeed, 0); // 控制左边电机的速度为0 analogWrite(rightSpeed, 0); // 控制右边电机的速度为0 } } ``` 在该代码中,通过左右两个红外传感器检测地面上是否有黑线,根据检测到的情况控制小车左右转动或停止。其中,通过PWM控制电机速度,使小车能够平稳地运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值