2021全国电设(F题)灰度传感器——循迹红线

基于灰度传感器的循迹(红色循迹)

通过参加全国电子设计大赛F题总结出识别红色线路的循迹方法——灰度传感器

灰度传感器的工作原理

        灰度传感器利用不同颜色的检测面对光的反射程度不同,光敏电阻对不同检测面返回的光其阻值也不同的原理进行颜色深浅检测。

       在有效的检测距离内,发光二极管发出白光,照射在检测面上,检测面反射部分光线,光敏电阻检测此光线的强度并将其转换为机器人可以识别的信号。

        Arduino专用传感器扩展板结合使用,可以感知地面或桌面不同的颜色而产生相应的信号,可实现与颜色有相关的互动作品,也可以作为巡线小车的巡线传感器或者足球机器人的场地灰度识别。电源需要和控制器一致,通常为3.3V或5V

实物图

原理图

引脚定义

  • 输出信号(out)
  • 地(GND)
  • 电源(VCC)

arduino连接示意图

 示例代码

void setup()
{
    Serial.begin(9600); //打开串行端口,将波特率设置为9600 bps
}
void loop()
{
    int val;
    val=analogRead(0);   //将灰度传感器连接到模拟0
    Serial.println(val,DEC);//将值打印到串口          
    delay(100);
}

此代码为红色循迹示例代码

printf("此代码需要根据不同环境进行调试,直接套用可能会无法正确循迹\n");

//电机
#include <AFMotor.h>
AF_DCMotor motor1(1,MOTOR12_64KHZ);
AF_DCMotor motor2(2,MOTOR12_64KHZ);
AF_DCMotor motor3(3,MOTOR34_64KHZ);
AF_DCMotor motor4(4,MOTOR34_64KHZ);

//声明车子方向
void Forward();
void Backward();
void Moveleft();
void Moveright();
void Stop();

void setup() 
{
  Serial.begin(9600);
  Serial.println("Motor test!");
  //电机
  motor1.setSpeed(100);
  motor2.setSpeed(100);
  motor3.setSpeed(100);
  motor4.setSpeed(100);

  
  pinMode(A8,INPUT);
  pinMode(A9,INPUT);
  pinMode(A10,INPUT);
  pinMode(A11,INPUT);
}

void loop() 
{
  int a,b,c,d;
//定义输出口为8,9,10,11
  a = analogRead(8);
  b = analogRead(9);
  c = analogRead(10);
  d = analogRead(11);
//电机的PWM
  motor1.setSpeed(120);
  motor2.setSpeed(120);
  motor3.setSpeed(120);
  motor4.setSpeed(120);
  Forward();
//循迹自动更正
  if(a>555&&a<635)
  {
    Stop();
    delay(500);
    Moveleft();
    delay(250);
  }
  if(c>495&&c<585)
  {
    Stop();
    delay(500);
    Moveright();
    delay(250);
  }
}


void Forward()
{
  motor1.run(FORWARD);
  motor2.run(BACKWARD);
  motor3.run(BACKWARD);-
  motor4.run(FORWARD);
}
void Backward()
{
  motor1.run(BACKWARD);
  motor2.run(FORWARD);
  motor3.run(FORWARD);
  motor4.run(BACKWARD);
}

void Moveright()
{
  motor1.run(BACKWARD);
  motor2.run(BACKWARD);
  motor3.run(BACKWARD);
  motor4.run(BACKWARD);
}

void Moveleft()
{
  motor1.run(FORWARD);
  motor2.run(FORWARD);
  motor3.run(FORWARD);
  motor4.run(FORWARD);
}

void Stop()
{
  motor1.run(RELEASE);
  motor2.run(RELEASE);
  motor3.run(RELEASE);
  motor4.run(RELEASE);
}

欢迎各位莅临指导,交流!

  • 31
    点赞
  • 268
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于PID算法的灰度传感器循迹代码样例,供参考: ```arduino #define LEFT_SENSOR A0 // 左侧传感器引脚 #define RIGHT_SENSOR A1 // 右侧传感器引脚 #define MOTOR_L 10 // 左侧电机引脚 #define MOTOR_R 9 // 右侧电机引脚 float Kp = 0.2; // 比例系数 float Ki = 0.1; // 积分系数 float Kd = 0.1; // 微分系数 float error = 0; // 偏差值 float lastError = 0; // 上一次偏差值 float integral = 0; // 偏差积分值 float derivative = 0; // 偏差微分值 int leftSpeed = 0; // 左侧电机速度 int rightSpeed = 0; // 右侧电机速度 void setup() { pinMode(LEFT_SENSOR, INPUT); pinMode(RIGHT_SENSOR, INPUT); pinMode(MOTOR_L, OUTPUT); pinMode(MOTOR_R, OUTPUT); } void loop() { int leftValue = analogRead(LEFT_SENSOR); int rightValue = analogRead(RIGHT_SENSOR); error = (leftValue - rightValue) / 10.0; // 计算偏差值 integral += error; // 计算偏差积分值 derivative = error - lastError; // 计算偏差微分值 leftSpeed = constrain(100 + Kp * error + Ki * integral + Kd * derivative, 0, 255); // 计算左侧电机速度 rightSpeed = constrain(100 - Kp * error - Ki * integral - Kd * derivative, 0, 255); // 计算右侧电机速度 analogWrite(MOTOR_L, leftSpeed); // 控制左侧电机转速 analogWrite(MOTOR_R, rightSpeed); // 控制右侧电机转速 lastError = error; // 更新上一次偏差值 } ``` 在上述代码中,我们利用`analogRead()`函数读取左侧和右侧灰度传感器的值,用它们的差值计算出偏差值`error`。接着,我们使用PID算法计算出左侧和右侧电机的速度,最后利用`analogWrite()`函数控制电机的转速。在实际应用中,你还需要根据具体的硬件和场景进行调试和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值