循迹小车Arduino 程序

合集下载

Arduino小车巡线程序的灰度阈值优化方案

Arduino小车巡线程序的灰度阈值优化方案

Arduino小车巡线程序的灰度阈值优化方案1. 引言1.1 介绍Arduino小车巡线是一种常见的智能小车控制技术,通过灰度传感器感知地面的黑线,从而实现小车的自动跟随和导航。

灰度阈值作为控制小车转向的重要参数,直接影响着小车沿线行驶的稳定性和精度。

为了更好地优化灰度阈值选择,提高小车巡线的效果,本文研究了灰度阈值的选择方法和优化算法。

在进行灰度阈值优化之前,首先需要了解灰度传感器的原理。

灰度传感器是通过测量不同光强下反射出来的灰度值来判断地面颜色的传感器。

根据地面颜色和照明条件不同,灰度值也会有所变化,因此灰度传感器需要根据具体情况进行校准和调整。

灰度阈值选择方法是确定灰度传感器识别黑线和白地的分界点。

通常采用的方法是通过实验和调试,手动调节灰度阈值,直到小车能够稳定行驶在黑线上。

手动调节存在时间长、效率低的问题,因此需要设计优化算法来自动选择最佳的灰度阈值。

灰度阈值优化算法是通过对不同的灰度阈值进行试验和比较,最终确定最佳的灰度阈值。

常用的算法包括遗传算法、模糊控制算法等,通过这些算法能够快速准确地找到最佳的灰度阈值。

实验验证和结果分析则是通过实际测试和数据分析来验证优化算法的有效性和性能。

通过本文的研究和实验,我们可以更好地理解灰度传感器的原理,选择合适的灰度阈值,并通过优化算法提高小车巡线的效果。

这对于提高小车自动导航的精度和可靠性具有重要意义。

希望未来能进一步深入研究和应用灰度阈值优化算法,实现更智能化的小车控制技1.2 研究背景在Arduino小车巡线程序中,灰度传感器扮演着至关重要的角色。

灰度传感器是一种能够测量物体反射光亮度的传感器,通过检测地面上黑色线条与白色背景之间的灰度差异,可以实现小车沿着线路自动行驶的功能。

在实际应用中,灰度传感器所测量到的灰度值受到多种因素的影响,例如环境光线、地面颜色等因素都会对传感器的测量结果产生影响,导致小车在巡线过程中出现偏离轨道的情况。

为了提高Arduino小车巡线程序的稳定性和准确性,需要寻找一种灰度阈值优化方案,通过调整灰度阈值来适应不同的环境条件,提高小车巡线的成功率。

简单易懂的Arduino制作巡线AGV小车

简单易懂的Arduino制作巡线AGV小车

用红外传感器或者磁条感应器,制作巡线小车使用材料:1.带PWM控制器的,伺服或者马达两个2.arduino 2560作为主控板3.电池或者电瓶作为动力电源4.颜色传感接收器接线原理图如下:arduino 2560完整主控程序如下:int MotorLeft_DR=2; //左侧马达正反转int MotorLPWM=3; //左侧马达int MotorRight_DR=4; //右侧马达正反转int MotorRPWM=5; //右侧马达const int Sensorzt=A1; //暂停感測器狀態const int Sensorzx=7; //转向感測器狀態const int Sensorxz=6; //选择线路const int Sensorbjd=13;int zt;int VAL1;int VAL2;int VAL3;int zx;int xz; //选择int bjd; //选择const int Sensor11=22; //前进感測器狀態const int Sensor12=24;const int Sensor13=26;const int Sensor14=28;const int Sensor15=30;const int Sensor16=32;const int Sensor17=34;const int Sensor18=36;const int Sensor19=38;const int Sensor1A=40;const int Sensor1B=42;const int Sensor1C=44;int S11;int S12;int S13;int S14;int S15;int S16;int S17;int S18;int S19;int S1A;int S1B;int S1C;const int Sensor21=23; //后退感測器狀態const int Sensor22=25;const int Sensor23=27;const int Sensor24=29;const int Sensor25=31;const int Sensor26=33;const int Sensor27=35;const int Sensor28=37;const int Sensor29=39;const int Sensor2A=41;const int Sensor2B=43;const int Sensor2C=45;int S21;int S22;int S23;int S24;int S25;int S26;int S27;int S28;int S29;int S2A;int S2B;int S2C;void setup(){pinMode(MotorRight_DR, OUTPUT); // 腳位2 (PWM) pinMode(MotorLeft_DR, OUTPUT); // 腳位4 (PWM) pinMode(MotorLPWM, OUTPUT); // 腳位3 (PWM) pinMode(MotorRPWM, OUTPUT); // 腳位5 (PWM) pinMode(Sensorzt,INPUT); //定義右感測器pinMode(Sensorzx,INPUT_PULLUP); //定義右感測器pinMode(Sensorxz,INPUT_PULLUP); //定義右感測器pinMode(Sensor11,INPUT_PULLUP); //定義左感測器pinMode(Sensor12,INPUT_PULLUP); //定義右感測器pinMode(Sensor13,INPUT_PULLUP); //定義左感測器pinMode(Sensor14,INPUT_PULLUP); //定義左感測器pinMode(Sensor15,INPUT_PULLUP); //定義右感測器pinMode(Sensor16,INPUT_PULLUP); //定義右感測器pinMode(Sensor17,INPUT_PULLUP); //定義左感測器pinMode(Sensor18,INPUT_PULLUP); //定義右感測器pinMode(Sensor19,INPUT_PULLUP); //定義右感測器pinMode(Sensor1A,INPUT_PULLUP); //定義左感測器pinMode(Sensor1B,INPUT_PULLUP); //定義右感測器pinMode(Sensor1C,INPUT_PULLUP); //定義右感測器pinMode(Sensor21,INPUT_PULLUP); //定義左感測器pinMode(Sensor22,INPUT_PULLUP); //定義右感測器pinMode(Sensor23,INPUT_PULLUP); //定義左感測器pinMode(Sensor24,INPUT_PULLUP); //定義右感測器pinMode(Sensor25,INPUT_PULLUP); //定義右感測器pinMode(Sensor26,INPUT_PULLUP); //定義左感測器pinMode(Sensor27,INPUT_PULLUP); //定義右感測器pinMode(Sensor28,INPUT_PULLUP); //定義右感測器pinMode(Sensor29,INPUT_PULLUP); //定義右感測器pinMode(Sensor2A,INPUT_PULLUP); //定義右感測器pinMode(Sensor2B,INPUT_PULLUP); //定義右感測器pinMode(Sensor2C,INPUT_PULLUP); //定義右感測器pinMode(Sensorbjd,OUTPUT); //定義右感測器digitalWrite(Sensorbjd,HIGH);}void xunxian1() // 快速前进寻迹{digitalWrite(MotorLeft_DR,HIGH);digitalWrite(MotorRight_DR,LOW);if(S11==LOW&&S12==LOW&&S13==LOW&&S14==LOW&&S15==LOW&&S16==LOW&& S17==LOW&&S18==LOW&&S19==LOW&&S1A==LOW&&S1B==LOW&&S1C==LOW)// 左黑右白, 快速左轉{digitalWrite(Sensorbjd,LOW);analogWrite(MotorLPWM,0);analogWrite(MotorRPWM,0);}else if (S11==HIGH&&S12==HIGH&&S13==HIGH&&S14==HIGH&&S15==HIGH&&S16==HIGH &&S17==HIGH&&S18==HIGH&&S19==HIGH&&S1A==HIGH&&S1B==HIGH&&S1C==HI GH&&xz==HIGH){analogWrite(MotorLPWM,80);analogWrite(MotorRPWM,80);delay(2000);}else if (S11==HIGH&&S12==HIGH&&S13==HIGH&&S14==HIGH&&S15==HIGH&&S16==HIGH &&S17==HIGH&&S18==HIGH&&S19==HIGH&&S1A==HIGH&&S1B==HIGH&&S1C==HI GH){analogWrite(MotorLPWM,100);analogWrite(MotorRPWM,100);delay(100);analogWrite(MotorLPWM,90);analogWrite(MotorRPWM,90);delay(100);analogWrite(MotorLPWM,80);analogWrite(MotorRPWM,80);delay(100);analogWrite(MotorLPWM,70);analogWrite(MotorRPWM,70);delay(100);analogWrite(MotorLPWM,60);analogWrite(MotorRPWM,60);delay(100);analogWrite(MotorLPWM,50);analogWrite(MotorRPWM,50);delay(100);analogWrite(MotorLPWM,40);analogWrite(MotorRPWM,40);delay(100);analogWrite(MotorLPWM,30);analogWrite(MotorRPWM,30);delay(100);analogWrite(MotorLPWM,20);analogWrite(MotorRPWM,20);delay(100);analogWrite(MotorLPWM,10);analogWrite(MotorRPWM,10);}else if ((S16==HIGH)&&(S17==HIGH)) // 直行{ digitalWrite(Sensorbjd,HIGH);analogWrite(MotorLPWM,130);analogWrite(MotorRPWM,130); }else if ((S16==HIGH)) // 左黑右白, 快速左轉{analogWrite(MotorLPWM,125);analogWrite(MotorRPWM,130);}else if ((S15==HIGH)&&(S16==HIGH)) // 左黑右白, 快速左轉{analogWrite(MotorLPWM,115);analogWrite(MotorRPWM,130);}else if ((S15==HIGH)) // 左黑右白, 快速左轉{analogWrite(MotorLPWM,80);analogWrite(MotorRPWM,130);}else if ((S14==HIGH)&&(S15==HIGH)) // 左黑右白, 快速左轉{analogWrite(MotorLPWM,70);analogWrite(MotorRPWM,130);delay(40);}else if ((S14==HIGH)) // 左黑右白, 快速左轉{analogWrite(MotorLPWM,60);analogWrite(MotorRPWM,130);delay(40);}else if ((S13==HIGH)&&(S14==HIGH)) // 左黑右白, 快速左轉{analogWrite(MotorLPWM,50);analogWrite(MotorRPWM,130);delay(40);}else if ((S13==HIGH)) // 左黑右白, 快速左轉{analogWrite(MotorLPWM,40);analogWrite(MotorRPWM,130);delay(40);}else if ((S12==HIGH)&&(S13==HIGH)) // 左黑右白, 快速左轉{analogWrite(MotorLPWM,30);analogWrite(MotorRPWM,120);delay(40);}else if ((S12==HIGH)) // 左黑右白, 快速左轉{analogWrite(MotorLPWM,20);analogWrite(MotorRPWM,120);delay(40);}else if ((S11==HIGH)&&(S12==HIGH)) // 左黑右白, 快速左轉{analogWrite(MotorLPWM,20);analogWrite(MotorRPWM,120);delay(40);}else if ((S11==HIGH)) // 左黑右白, 快速左轉{analogWrite(MotorLPWM,10);analogWrite(MotorRPWM,120);}//=========================================================== ==========================================左边结束1else if ((S17==HIGH)){ analogWrite(MotorLPWM,130);analogWrite(MotorRPWM,125);}else if ((S17==HIGH)&&(S18==HIGH)){ analogWrite(MotorLPWM,130);analogWrite(MotorRPWM,115);}else if ((S18==HIGH)){ analogWrite(MotorLPWM,130);analogWrite(MotorRPWM,90);}else if ((S18==HIGH)&&(S19==HIGH)){ analogWrite(MotorLPWM,130);analogWrite(MotorRPWM,70);delay(40);}else if ((S19==HIGH)){ analogWrite(MotorLPWM,130);analogWrite(MotorRPWM,60);delay(40);}else if ((S19==HIGH)&&(S1A==HIGH)){ analogWrite(MotorLPWM,130);analogWrite(MotorRPWM,50);delay(40);}else if ((S1A==HIGH)){ analogWrite(MotorLPWM,130);analogWrite(MotorRPWM,40);delay(40);}else if ((S1A==HIGH)&&(S1B==HIGH)){ analogWrite(MotorLPWM,120);analogWrite(MotorRPWM,30);delay(40);}else if ((S1B==HIGH)){ analogWrite(MotorLPWM,120);analogWrite(MotorRPWM,20);delay(40);}else if ((S1B==HIGH)&&(S1C==HIGH)){ analogWrite(MotorLPWM,120);analogWrite(MotorRPWM,20);delay(40);}else if ((S1C==HIGH)){ analogWrite(MotorLPWM,120);analogWrite(MotorRPWM,10);}else // 都是白色, 停止{analogWrite(MotorRPWM,80);analogWrite(MotorLPWM,80);}}void xunxian2() // 快速后退寻迹{digitalWrite(MotorLeft_DR,LOW);digitalWrite(MotorRight_DR,HIGH);if(S21==LOW&&S22==LOW&&S23==LOW&&S24==LOW&&S25==LOW&&S26==LOW&& S27==LOW&&S28==LOW&&S29==LOW&&S2A==LOW&&S2B==LOW&&S2C==LOW)// 左黑右白, 快速左轉{digitalWrite(Sensorbjd,LOW);analogWrite(MotorLPWM,0);analogWrite(MotorRPWM,0);}else if (S21==HIGH&&S22==HIGH&&S23==HIGH&&S24==HIGH&&S25==HIGH&&S26==HIGH &&S27==HIGH&&S28==HIGH&&S29==HIGH&&S2A==HIGH&&S2B==HIGH&&S2C==HI GH&&xz==HIGH) //{analogWrite(MotorLPWM,80);analogWrite(MotorRPWM,80);delay(2000);}else if (S21==HIGH&&S22==HIGH&&S23==HIGH&&S24==HIGH&&S25==HIGH&&S26==HIGH &&S27==HIGH&&S28==HIGH&&S29==HIGH&&S2A==HIGH&&S2B==HIGH&&S2C==HI GH) //{analogWrite(MotorLPWM,100);analogWrite(MotorRPWM,100);delay(100);analogWrite(MotorLPWM,90);analogWrite(MotorRPWM,90);delay(100);analogWrite(MotorLPWM,80);analogWrite(MotorRPWM,80);delay(100);analogWrite(MotorLPWM,70);analogWrite(MotorRPWM,70);delay(100);analogWrite(MotorLPWM,60);analogWrite(MotorRPWM,60);delay(100);analogWrite(MotorLPWM,50);analogWrite(MotorRPWM,50);delay(100);analogWrite(MotorLPWM,40);analogWrite(MotorRPWM,40);delay(100);analogWrite(MotorLPWM,30);analogWrite(MotorRPWM,30);delay(100);analogWrite(MotorLPWM,20);analogWrite(MotorRPWM,20);delay(100);analogWrite(MotorLPWM,10);analogWrite(MotorRPWM,10);}else if((S26==HIGH)&&(S27==HIGH)) // 直行{digitalWrite(Sensorbjd,HIGH);analogWrite(MotorLPWM,130);analogWrite(MotorRPWM,130); }else if ((S26==HIGH)) // 左黑右白, 快速左轉{analogWrite(MotorLPWM,130);analogWrite(MotorRPWM,125);}else if ((S25==HIGH)&&(S26==HIGH)) // 左黑右白, 快速左轉{analogWrite(MotorLPWM,130);analogWrite(MotorRPWM,115);}else if ((S25==HIGH)) // 左黑右白, 快速左轉{analogWrite(MotorLPWM,130);analogWrite(MotorRPWM,90);}else if ((S24==HIGH)&&(S25==HIGH)) // 左黑右白, 快速左轉{analogWrite(MotorLPWM,130);analogWrite(MotorRPWM,80);}else if ((S24==HIGH)) // 左黑右白, 快速左轉{analogWrite(MotorLPWM,130);analogWrite(MotorRPWM,70);}else if ((S23==HIGH)&&(S24==HIGH)) // 左黑右白, 快速左轉{analogWrite(MotorLPWM,130);analogWrite(MotorRPWM,60);}else if ((S23==HIGH)) // 左黑右白, 快速左轉{analogWrite(MotorLPWM,130);analogWrite(MotorRPWM,50);}else if ((S22==HIGH)&&(S23==HIGH)) // 左黑右白, 快速左轉{analogWrite(MotorLPWM,120);analogWrite(MotorRPWM,40);}else if ((S22==HIGH)) // 左黑右白, 快速左轉{analogWrite(MotorLPWM,120);analogWrite(MotorRPWM,30);}else if ((S21==HIGH)&&(S22==HIGH)) // 左黑右白, 快速左轉{analogWrite(MotorLPWM,120);analogWrite(MotorRPWM,20);}else if ((S21==HIGH)) // 左黑右白, 快速左轉{analogWrite(MotorLPWM,120);analogWrite(MotorRPWM,10);}//=========================================================== ==========================================左边结束1else if ((S27==HIGH)){ analogWrite(MotorLPWM,125);analogWrite(MotorRPWM,130);}else if ((S27==HIGH)&&(S28==HIGH)){ analogWrite(MotorLPWM,115);analogWrite(MotorRPWM,130);}else if ((S28==HIGH)){ analogWrite(MotorLPWM,90);analogWrite(MotorRPWM,130);}else if ((S28==HIGH)&&(S29==HIGH)){ analogWrite(MotorLPWM,80);analogWrite(MotorRPWM,130);}else if ((S29==HIGH)){ analogWrite(MotorLPWM,70);analogWrite(MotorRPWM,130);}else if ((S29==HIGH)&&(S2A==HIGH)){ analogWrite(MotorLPWM,60);analogWrite(MotorRPWM,130);}else if ((S2A==HIGH)){ analogWrite(MotorLPWM,50);analogWrite(MotorRPWM,130);}else if ((S2A==HIGH)&&(S2B==HIGH)){ analogWrite(MotorLPWM,40);analogWrite(MotorRPWM,120);}else if ((S2B==HIGH)){ analogWrite(MotorLPWM,30);analogWrite(MotorRPWM,120);}else if ((S2B==HIGH)&&(S2C==HIGH)){ analogWrite(MotorLPWM,20);analogWrite(MotorRPWM,120);}else if ((S2C==HIGH)){ analogWrite(MotorLPWM,10);analogWrite(MotorRPWM,120);}else // 都是白色, 停止{analogWrite(MotorRPWM,80);analogWrite(MotorLPWM,80);}}void loop(){VAL1 = analogRead(Sensorzt);VAL2 = analogRead(Sensorzt);VAL3 = analogRead(Sensorzt);if (((VAL1 + VAL2 + VAL3) / 3) > 500){zt=LOW;}else{zt=HIGH;}zx = digitalRead(Sensorzx);xz = digitalRead(Sensorxz);S11 = digitalRead(Sensor11);S12 = digitalRead(Sensor12);S13 = digitalRead(Sensor13);S14 = digitalRead(Sensor14);S15 = digitalRead(Sensor15);S16 = digitalRead(Sensor16);S17 = digitalRead(Sensor17);S18 = digitalRead(Sensor18);S19 = digitalRead(Sensor19);S1A = digitalRead(Sensor1A);S1B = digitalRead(Sensor1B);S1C = digitalRead(Sensor1C);S21 = digitalRead(Sensor21);S22 = digitalRead(Sensor22);S23 = digitalRead(Sensor23);S24 = digitalRead(Sensor24);S25 = digitalRead(Sensor25);S26 = digitalRead(Sensor26);S27 = digitalRead(Sensor27);S28 = digitalRead(Sensor28);S29 = digitalRead(Sensor29);S2A = digitalRead(Sensor2A);S2B = digitalRead(Sensor2B);S2C = digitalRead(Sensor2C);if ((zt==LOW)) //{digitalWrite(Sensorbjd,LOW);analogWrite(MotorLPWM,0);analogWrite(MotorRPWM,0);}else{if ((zx==HIGH)) // 左黑右白, 快速左轉{xunxian1();}else{xunxian2(); }}}实现简单的巡线AGV制作。

Arduino小车巡线程序的灰度阈值优化方案

Arduino小车巡线程序的灰度阈值优化方案

Arduino小车巡线程序的灰度阈值优化方案Arduino小车巡线程序是一种常见的机器人控制程序,它通过使用红外传感器来感知地面上的黑线,从而实现自动巡线。

而灰度阈值的优化是影响小车巡线性能的重要因素之一。

本文将为大家介绍关于Arduino小车巡线程序灰度阈值优化的方案,希望能帮助大家提高小车巡线的稳定性和精度。

一、灰度阈值的意义在小车巡线程序中,灰度阈值的作用是将传感器感知到的地面颜色转化为数字信号,从而进行判断和控制小车的行驶方向。

传感器感知到的地面颜色会随着光线、环境等因素而发生变化,因此需要对这些颜色进行数字化处理,以便进行后续的控制操作。

而灰度阈值就是用来将传感器感知到的地面颜色转化为数字信号的关键参数。

二、灰度阈值的优化方法1. 确定地面颜色范围在进行灰度阈值的优化之前,首先需要确定地面颜色的范围。

可以利用示波器或者串口调试助手等工具,将传感器感知到的地面颜色进行实时监测和采集,以确定地面颜色的范围。

通过对采集到的数据进行分析,可以得到地面颜色的特征范围,从而确定合适的灰度阈值范围。

2. 调试灰度阈值参数在确定了地面颜色的范围之后,就可以进行灰度阈值参数的调试工作了。

首先需要设置一个默认的灰度阈值参数,然后将小车放置在巡线轨道上进行实验。

观察小车的行驶情况,如果小车出现频繁的偏离轨道,就需要对灰度阈值参数进行调试。

可以通过逐步增加或减小灰度阈值参数的数值来观察小车的行驶情况,直到找到最佳的灰度阈值参数为止。

3. 考虑环境因素在进行灰度阈值优化的过程中,还需要考虑环境因素对地面颜色的影响。

光线的强弱、地面的清洁程度、地面的颜色均匀度等因素都会对地面颜色的感知产生影响。

在确定灰度阈值范围和调试灰度阈值参数时,需要考虑这些环境因素的影响,并对巡线程序进行动态调整和优化。

三、实例分析为了更好地演示灰度阈值的优化过程,这里给出一个实例分析。

假设小车巡线程序中使用的地面颜色范围为30-100之间,初始灰度阈值参数设置为60。

三路红外循迹小车 arduino程序

三路红外循迹小车 arduino程序

digitalWrite(pinI2,HIGH);
}
void left()//左转
{
analogWrite(speedpin,60);//输入模拟值进行设定速度
analogWrite(speedpin1,60);
digitalWrite(pinI4,LOW);//使直流电机(右)逆时针转
pinMode(pinI3,OUTPUT);
pinMode(pinI4,OUTPUT);
pinMode(speedpin1,OUTPUT);
pinMode(IRR,INPUT);
pinMode(IRM,INPUT);
pinMode(IRL,INPUT);
m=digitalRead(IRM);
l=digitalRead(IRL);
if(l==LOW &&m==HIGH && r==LOW)
advance();
else if(l==LOW &&m==HIGH && r==HIGH)
advance();
int IRR=3;//定义右侧寻线传感器接口
int IRM=4;//定义中间寻线传感器接口
int IRL=5;//定义左侧寻线传感器接口
void setup()
{
pinMode(pinI1,OUTPUT);
pinMode(pinI2,OUTPUT);
pinMode(speedpin,OUTPUT);
digitalWrite(pinI3,HIGH);
digitalWrite(pinI1,HIGH);//使直流电机(左)逆时针转

arduino循迹小车源程序

arduino循迹小车源程序

int led1=0,led2=0,led3=0,led4=0,led5=0,led6=0,led7=0; //电压7.8V ;led1~7 分别用来接收七个探头检测回来的值int in1=9,in2=3,in3=10,in4=11; //数字IO口9,3,10,11用来控制电机int sum=0;void setup(){pinMode(0,INPUT);pinMode(7,INPUT);pinMode(1,INPUT);pinMode(8,INPUT);pinMode(2,INPUT);pinMode(3,OUTPUT);pinMode(6,INPUT);pinMode(9,OUTPUT);pinMode(4,INPUT);pinMode(10,OUTPUT);pinMode(13,INPUT);pinMode(11,OUTPUT);pinMode(12,INPUT);pinMode(5,INPUT);digitalWrite(in2,LOW);digitalWrite(in4,LOW);}void motor(char pwmpin,char pin,int val) //给电机两个输入口赋PWM值{pinMode(pin, OUTPUT);analogWrite(pwmpin,val);digitalWrite(pin,LOW);}void turn_led1_0() //in1给20,in2给低电平{ //in3给250,in4给低电平motor(in1,in2,20); //PWM满值255,差值决定转角度,大小决定速度motor(in3,in4,250);}void turn_led1_1(){motor(in1,in2,20);motor(in3,in4,250);}void turn_led2_0(){motor(in1,in2,70);motor(in3,in4,250);}void turn_led2_1(){motor(in1,in2,130);motor(in3,in4,250);}void turn_led3_0(){motor(in1,in2,180); motor(in3,in4,250); }void turn_led3_1(){motor(in1,in2,250); motor(in3,in4,250); }void turn_led4_0(){motor(in1,in2,250); motor(in3,in4,250); }void turn_led4_1(){motor(in1,in2,250); motor(in3,in4,250); }void turn_led5_0(){motor(in1,in2,250); motor(in3,in4,180); }void turn_led5_1(){motor(in1,in2,250); motor(in3,in4,130); }void turn_led6_0(){motor(in1,in2,250); motor(in3,in4,70); }void turn_led6_1(){motor(in1,in2,250); motor(in3,in4,20); }void turn_led7_0(){motor(in1,in2,250);motor(in3,in4,20); }void turn_stop(){motor(in1,in2,0);motor(in1,in2,0);}void test() //检测光电管探头。

(完整版)arduino循迹小车毕业设计

(完整版)arduino循迹小车毕业设计

目 录摘要 (2)引 言 ......................................................... 2 1 Arduino 智能小车设计方案与参数 (3)1.1 Arduino 智能小车设计方案简介 (3)1.1.1 功能要求 (3)1.1.2 基本原理 (3)1.2 循迹小车参数 (4)2 Arduino 与51单片机的区别 (5)2.1 Arduino 单片机 (5)2.1.1 Arduino 单片机的介绍 .................................. 5 2.1.2 Arduino 单片机的特色 .................................. 5 2.1.3 Arduino 单片机的功能 .................................. 5 2.2 51单片机 .. (6)2.2.1 51单片机的介绍 ....................................... 6 2.2.2 51单片机的功能 ....................................... 6 2.3 Arduino 比51更好的地方 (7)3 循迹小车设计 ...........................3.1 硬件设计 .........................3.1.1 单片机最小系统 .................3.1.2 灰度传感器模块 .................3.1.3 电机驱动电路 ...................3.2 软件设计 .........................3.2.1 系统主程序 .....................3.2.2 本系统编译器 ...................3.3 实物展示 .........................3.4 部分程序展示 .....................结 论 ...................................致 谢 ...................................参考文献 ................................. Arduino 循迹小车设计与实现摘要:循迹小车是Arduino 单片机的一种典型应用。

Arduino小车巡线程序的灰度阈值优化方案

Arduino小车巡线程序的灰度阈值优化方案

Arduino小车巡线程序的灰度阈值优化方案Arduino小车巡线程序是一种常见的机器人控制程序,通过传感器获取地面的黑白线条信息,从而实现小车沿着线条行驶的功能。

而灰度阈值是影响小车巡线性能的关键因素之一。

本文将提出一份关于Arduino小车巡线程序灰度阈值优化方案的详细内容。

一、灰度传感器介绍在Arduino小车巡线程序中,通常会使用灰度传感器来检测地面黑白线条的信息。

灰度传感器可以检测光线的强弱,从而判断地面的颜色。

对于黑白线条,可以通过灰度传感器得到反射光线的强度,从而区分黑色和白色。

一般来说,灰度传感器的输出值范围在0-1023之间,0代表最暗,1023代表最亮。

二、灰度阈值的意义灰度阈值是指在小车巡线程序中,用来区分黑线和白线的一个数值。

通过调整灰度阈值,可以使小车更准确地识别黑白线条,从而更稳定地行驶。

灰度阈值的选择对小车的巡线性能具有至关重要的影响。

三、灰度阈值的优化方案1.手动调试最直接的方法是通过手动调试的方式,将小车放置在不同地面的黑白线条上,观察灰度传感器的输出数值。

然后根据实际情况,调整灰度阈值,使小车能够准确地识别黑白线条。

这种方法比较耗时,但可以得到比较准确的结果。

2.自动优化除了手动调试之外,也可以利用算法来实现灰度阈值的自动优化。

可以通过编写程序,让小车在巡线时自动记录下黑白线条的灰度数值,并根据这些数据来动态调整灰度阈值。

这样可以实现灰度阈值的自适应优化,提高小车的巡线稳定性。

3.环境适应性在灰度阈值的优化过程中,还需要考虑到环境的适应性。

因为在不同光照条件下,地面的反射光线强度会发生变化,这会影响灰度传感器的输出。

需要在不同环境下对灰度阈值进行优化,并制定相应的灰度阈值调整策略,以保证小车在不同环境下都能稳定巡线。

四、实际案例为了验证以上灰度阈值优化方案的有效性,可以通过实际案例来进行测试。

在实际操作中,可以使用Arduino开发板、灰度传感器和小车底盘等硬件设备,通过编写相应的程序来实现灰度阈值的优化。

基于Arduino控制的四驱智能循迹小车设计

基于Arduino控制的四驱智能循迹小车设计

• 124•利用电磁信号传感模块获取路径信息,并传送给开源硬件Arduino作为反馈信号,用于驱动左右双路直流电机以不同转速旋转,以转速差控制小车运动姿态并实现循迹行驶。

本设计使用Arduino 集成开发环境简化了程序代码,采用四轮全驱差速转向的形式简化了机械结构,运用模块化连接简化了电路,能够激发使用者学习编程语言的兴趣,并培养良好的实践动手能力。

编程控制技术使用场景非常丰富,但学习过程往往比较枯燥。

为了激发编程语言学习兴趣,拟设计一款竞速小车作为学习载体来进行Arduino 编程控制技术相关知识的学习。

1.整体设计Arduino UNO 控制板控制电机驱动模块,带动电机转动,使小车开始行驶。

而电磁循迹模块将感应路面上的电磁信号,传输到Arduino UNO 控制板来控制小车循迹,同时红外避障模块感应到前方有障碍物时,会传输信号给Arduino 控制小车停下,小车电机将停止转动。

降压模块则是给电池降压保护Arduino UNO 控制板。

系统结构框图如图1所示。

图1 系统结构框图2.硬件设计2.1 结构设计小车主要由Arduino UNO 控制板,微型直流减速电机,铝合金板,轮胎,直流电机驱动模块,E18-D80NK 红外避障模块,降压模块,10mH 工字电磁传感器,12.6V 电池,开关以及杜邦线等部件组成,其结构设计如图2所示。

图2 循迹小车结构设计图使用Arduino UNO 板为整个智能车控制系统的核心,通过杜邦线与各传感器连接,主要负责接收电磁传感器和红外避障模块传输来的信号,根据各传感器传送回来信号进行处理分析。

安装在小车左侧。

使用200*150*3mm 的铝合金板作为底盘支架,并将四个轮子和电机安装在两侧。

每个车轮由单独一个直流减速电机驱动,每个驱动电机外径25mm ,额定功率约7w ,减速比1:20,转速约980rpm 。

通过单独控制左右两侧电机的转速实现直行或转向。

驱动电机安装在铝板下方,通过连轴器与轮胎相连。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//循迹小车Arduino 程序:
// R是右(right),L是左(left) 小车对着自己看时分的左右int MotorRight1=14; //A0 IN1
int MotorRight2=15; //A1 IN2
int MotorLeft1=16; //A2 IN3
int MotorLeft2=17; //A3 IN4
int MotorRPWM=5; //PWM 5
int MotorLPWM=3; //PWM 3
const int SensorLeft = 2; //左感測器輸入腳
const int SensorRight = 6; //右感測器輸入腳
int SL; //左感測器狀態
int SR; //右感測器狀態
void setup()
{
Serial.begin(9600);
pinMode(MotorRight1, OUTPUT); // 腳位 14 (PWM)
pinMode(MotorRight2, OUTPUT); // 腳位 15 (PWM)
pinMode(MotorLeft1, OUTPUT); // 腳位 16 (PWM)
pinMode(MotorLeft2, OUTPUT); // 腳位 17 (PWM)
pinMode(MotorLPWM, OUTPUT); // 腳位 3 (PWM)
pinMode(MotorRPWM, OUTPUT); // 腳位 5 (PWM)
pinMode(SensorLeft, INPUT); //定義左感測器
pinMode(SensorRight, INPUT); //定義右感測器
}
void loop()
{
SL = digitalRead(SensorLeft);
SR = digitalRead(SensorRight);
if (SL == LOW&&SR==LOW)// 前進
{
digitalWrite(MotorRight1,LOW);//IN1 右电机高电平反转
digitalWrite(MotorRight2,HIGH);//IN2 右电机高电平正转 analogWrite(MotorRPWM,130); //0---100--250
digitalWrite(MotorLeft1,LOW);//IN3 左电机高电平正转
digitalWrite(MotorLeft2,HIGH);//IN4 左电机高电平反转
analogWrite(MotorLPWM,130);
}
else // R是右(right),L是左(left) 小车对着自己看时分的左右 {
if (SL == HIGH & SR == LOW)// 左白右黑, 快速左轉
{
delay(1);
digitalWrite(MotorRight1,HIGH);//IN1 右电机高电平反转 digitalWrite(MotorRight2,LOW);//IN2 右电机高电平正转 analogWrite(MotorRPWM,130);
digitalWrite(MotorLeft1,LOW);//IN3 左电机高电平正转 digitalWrite(MotorLeft2,HIGH);//IN4 左电机高电平反转 analogWrite(MotorLPWM,130);
}
else if (SR == HIGH & SL == LOW) // 右白左黑, 快速右轉
{
delay(1);
digitalWrite(MotorRight1,LOW);//IN1 右电机高电平反转 digitalWrite(MotorRight2,HIGH);//IN2 右电机高电平正转 analogWrite(MotorRPWM,130);
digitalWrite(MotorLeft1,HIGH);//IN3 左电机高电平正转 digitalWrite(MotorLeft2,LOW);//IN4 左电机高电平反转 analogWrite(MotorLPWM,130);
}
else // 都是白色, 停止
{
digitalWrite(MotorRight1,LOW);
digitalWrite(MotorRight2,LOW);
analogWrite(MotorRPWM,0);
digitalWrite(MotorLeft1,LOW);
digitalWrite(MotorLeft2,LOW);; analogWrite(MotorLPWM,0);
}}}。

相关文档
最新文档