arduino寻线小车教材
巡线机器人小车的设计教案

巡线机器人小车的设计教案一、教学目标1.了解巡线机器人小车的原理和结构;2.掌握巡线机器人小车的基本设计方法和制作步骤;3.培养学生动手实践和团队合作的能力。
二、教学内容1.巡线机器人小车的原理和结构介绍;2.巡线机器人小车的设计和制作步骤;3.巡线机器人小车的实验和测试。
三、教学步骤1.引入(10分钟)通过问问题或展示相关视频等方式,引导学生了解巡线机器人小车的应用领域和原理,并激发学生的学习兴趣。
2.原理和结构介绍(20分钟)介绍巡线机器人小车的原理和结构,包括传感器、电机、控制器等重要组件的功能和相互关系。
3.设计和制作步骤(40分钟)3.1设计阶段:-理清需求和目标:明确巡线机器人小车的功能和性能要求;-选材和选购:了解各种零配件的特点和使用场景,选择适合的材料和组件;-绘制草图:根据设计要求,设计巡线机器人小车的外形结构;-确定电路设计:设计巡线传感器和驱动电机的电路连接方式。
3.2制作阶段:-零件加工:根据草图,使用相应的工具制作机器人小车的零件;-组装调试:将制作好的零件按照设计要求进行组装,并进行初步的调试操作;-完善细节:修饰和装饰巡线机器人小车的外观,使其更加美观和实用。
4.实验和测试(30分钟)将制作好的巡线机器人小车放置在特定的地面上,通过调试巡线传感器和电机控制器的参数,测试小车的行驶性能并观察巡线能力。
四、实施方案1.教学准备准备相关巡线机器人小车的资料和组件,准备实验平台和工具;2.教学方式通过讲解、演示、实践等多种教学方式相结合进行教学;3.教学评估通过实验和测试的结果来评估学生的学习成果,可以结合实际情况进行个别评估。
五、教学反思1.关注学生的学习兴趣,加强实践操作环节,提高学生的动手能力;2.增加小组合作的学习任务,培养学生的团队合作和沟通能力;3.及时收集学生的反馈意见,改进和调整教学策略,提高教学效果。
最新第6课 巡线小车二

第6课巡线小车二第6课巡线小车二一、教材与学生情况分析本节课是《Arduino创意机器人》第三章《智能小车》的第六节课。
在上一节课的学习中,学生已经学会了对简单路线进行分析,使小车沿着黑线前进。
但是对于有路口的复杂路线还不会处理。
这节课尝试分析丁字路口,同时测试小车,使其成功沿黑线走丁字路口。
二、教学目标1.学会分析小车过丁字路口时巡线传感器的状态。
2.掌握小车沿黑线走丁字路口的一般方法。
3.在分析其他路口的过程中,体会小车走路口的关键。
三、教学重难点教学重点:使用巡线传感器走丁字路口教学难点:小车走基本丁字路口的分析四、教学流程1.抛出疑问,引入新课教师:还记得上节课遗留的小车沿黑线走“8”字的问题吗?仔细思考一下,小车在哪里出现了问题?这节课我们以丁字路口为例,研究小车走路口的问题。
感兴趣的同学可以在课后尝试使用巡线传感器走“8”字。
出示课题《巡线小车二》。
2.教学新课(1)丁字路口分析在丁字路口问题上,我们可以先人为设定小车遇到该路口的运动情况。
在下面的路口中,我们设定,小车遇到路口,向右转弯。
观察下面的丁字路口,回答问题:1)小车在走丁字路口时,经历了什么运动过程?2)小车走到丁字路口之前是在走直线,你还记得小车沿黑线直走的程序吗?3)小车走到丁字路口时,左右两个巡线传感器检测值是什么?4)小车开始右拐时,左右两个巡线传感器检测值是什么?(2)基础任务:小车巡线走丁字路口1)任务描述使用左右两个巡线传感器,让小车在遇到丁字路口时顺利右拐。
2)搭建硬件将巡线传感器一左一右安装在小车上,注意将传感器感应区朝向下。
这里,我们分别接在了数字针脚2、3。
3)编写程序人为定义如果小车遇到上述丁字路口,就右拐。
具体分析如下:代码中前面两个选择结构跟小车沿黑线直走时一样的,这是为了确保小车可以在ab上直走。
当小车到达丁字路口,让小车向右原地转圈90度,转圈的角度是由延迟时间决定,而延迟时间是由小车左右电机数值、丁字路口大小等多种因素决定的,我们需要通过不断的测试得到这个时间值。
ARDUINO教程第四讲

2、红外寻线传感器组件
由三个寻线传感器组成。背面L、C、R分别 为左中右的信号输出。
int L=7; //左边传感器接第7脚 int C=8; //中间传感器接第8脚 int R=9; //右边传感器接第9脚 void setup() {pinMode(L,INPUT); //均设置为输入 pinMode(C,INPUT); pinMode(R,INPUT); Serial.begin(9600); //串口波特率为9600 } void loop() { if(digitalRead(L)==HIGH) Serial.print(“Left is White |”); //若测到高电平则输出白色 else Serial.print(“Left is Black |”); //否则输出黑色 if(digitalRead(C)==HIGH) Serial.print("Center is White |"); else Serial.print("Center is Black |"); if(digitalRead(R)==HIGH) Serial.println("Right is White"); else Serial.println("Right is Black"); delay(200); //延时200MS方便观察效果 }
detch(pin); 该函数用于释放舵机引脚,可以作为其 他用途。
read(pin); 该函数用于返回当前舵机的角度,范围 0~180度
readMicrosends(pin); 该函数用于返回当前舵机的脉冲值,单 位us,范围在最大脉冲宽度和最小脉冲 宽度之间。
简单易懂的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巡线小车原理及算法详解

模拟巡线: 使用传感器返回的模拟信号来巡线。需要使 用返回的数据计算出黑线的位置。 返回的模拟信号为0~255的一个整型数值,由 此可衡量黑线偏离传感器的距离远近。 比如,可将返回255定为“距离最近”,返回 0定为“距离最远”。当然,此值和距离并不成线 性关系,但是是单调的。
×
巡线
双路逻辑巡线: 使用并排的两个传感器返回的逻辑值来巡线。 缺点在于:对于较大转角反应不及时
巡线
四路逻辑巡线: 使用并排的四个传感器返回的逻辑值来巡线。 需要使用返回的数据计算出黑线的位置。
巡线
巡线
巡线
巡线
巡线
巡线
四路逻辑巡线: 确定了黑线的位置后,便按照以下逻辑调整:
线偏左往左转,线偏右往右转, 偏得越多转得越快
巡线
巡线
巡线
巡线
模拟巡线: 确定了黑线的位置后,便按照以下逻辑调整:
线偏左往左转,线偏右往右转, 偏得越多转得越快
具体代码可为: leftMotor(V0+k*X); rightMotor(V0-k*X);
THANKS
巡线
理论部分
巡线
简介: AnyCar上有四个光感头用于巡线,而采集传 感器地数据有经过比较板返回逻辑值和不经过比 较板返回模拟值两种,于此对应的即是多种巡线 策略。 此次讲解单路逻辑巡线、双路逻辑巡线、四 路逻辑巡线和多路模拟巡线。
巡线
单路逻辑巡线: 只用一个传感器返回的逻辑值来巡线。 缺点在于:不能分辨自己在黑线哪一侧
第六课 画线巡线小车课件(1)

S C R AT C H
② 程序解读
② 程序解读
S C R AT C H 1.
完成本节课程序-画线巡线小车
同学们,上节课我们学习了几个新的脚本指令,下面跟着老师一起来复 习吧!
② 程序解读 1.
复习上节课学习的脚本指令:
S C R AT C H
② 程序解读 1.
本节课重点学习的脚本指令:
S C R AT C H
② 程序解读 1.
1.同学们,刚刚的知识点你们记住了吗?
2.什么是小车巡线呢? 答:小车沿着画好的路线走。
3.本节课的小车是怎么做的呢? 答:利用画笔模块自己绘制的。
4.跟着老师一起来做程序吧!
S C R AT C H
第六课 画线巡线小车
目录
contents
① 学习目标 ② 程序解读 ① 学习目标 ③ 逻 辑 编 程 ④ 课堂巩固 ⑤ 课后一题
S C R AT C H
① 学习目标
① 学习目标
S C R AT C H
①学习使用画笔模块、取色器;
②学习新的脚本指令:全部擦除、将画笔的颜色设为_、将画笔的 粗细设为_、落笔、抬笔等;
③ 逻辑编程 4 . 编 写 角 色 1 程1 .序 , 解 读 各 脚 本 指 令 含 义
S C R AT C H
①小车调整合适的大小。 ②如何选取车头颜色呢?依次点击1→2→3,如此车头一侧的颜色就选取好了。碰到的颜色, 我们设置为黑色,点击→移动白色滑杆按钮把颜色、饱和度、亮度三个值都有调至0。车头另 一侧重复做一遍即可。
② 程序解读 1.
S C R AT C H
本节课所需背景:白色背景,打开软件即可,不需要制作。
(完整版)arduino循迹小车毕业设计
目录 3 循迹小车设计 . ..........................摘要........................................................... 2 3.1 硬件设计 . ........................引言 (2)3.1.1 单片机最小系统 . ................1 Arduino 智能小车设计方案与参3.1.2 灰度传感器模块 . ................数 .............................................................33.1.3 电机驱动电路 . ..................1.1 Arduino 智能小车设计方3.2 软件设计 . ........................案简介....................................................... 3 3.2.1 系统主程序 . ....................1.1.13.2.2 本系统编译器 . .................. 功能要求 (3)1.1.23.3 实物展示 . ........................ 基本原理 (3)1.23.4 部分程序展示 . .................... 循迹小车参数 . (4)2 Arduino 与 51结论 . .................................. 单片机的区别 . (5)2.1 Arduino致谢 . .................................. 单片机 . .. (5)2.1.1 Arduino参考文献 . ................................ 单片机的介绍 . (5)2.1.2 Arduino单片机的特色. (5)2.1.3 Arduino单片机的功能.Arduino 循迹小车 (5)2.2 51 单片机 (6)设计与实现2.2.1 51 单片机的介绍 . (6)摘要:循迹小车是 Arduino 单2.2.2 51 单片机的功能 . (6)片机的一种典型应用。
第5课巡线小车一
第5课巡线小车一一、教材与学生情况分析本节课是《Arduino创意机器人》第三章《智能小车》的第五节课。
在前面的学习中,学生通过给小车装上触角,掌握了小车避障与防跌落的知识。
这一节课,尝试给小车装上眼睛,使得小车可以沿着简单的线路前进。
本节课主要用到巡线传感器,重点在于巡线过程的分析。
二、教学目标1.掌握巡线传感器的使用方法。
2.利用两个巡线传感器,制作简单巡线的小车。
3.在巡线小车的测试中,找到学习Arduino机器人的乐趣。
三、教学重难点教学重点:使用两个巡线传感器进行简单巡线教学难点:小车巡线过程的分析四、教学流程1.抛出疑问,引入新课教师:还记得小车走直线“走不直”的问题吗?如果你阅读了视野拓展,一定知道小车需要一双眼睛来看路。
看到教室地面上的那条直线了吗?你可以想办法让小车一直走在这条黑色的直线上吗?前面使用的避障和防跌落可以完成这个功能吗?出示课题《巡线小车一》。
分析:地板是白色,线是黑色的。
小车要看到这条直线,需要装上能分辨黑白的“眼睛”——巡线传感器。
2.教学新课(1)介绍新知识:巡线传感器巡线传感器以稳定的TTL输出信号帮助机器人进行白线或者黑线的跟踪(可以检测白背景中的黑线,也可以检测黑背景的白线),黑色低电平,白色高电平。
(2)小车沿黑线直走分析提问:拿出工具盒里面的巡线传感器,思考,该传感器应该安装在哪里才可以看到地面上的黑线,如果小车要跨着黑线走的话,两个传感器之间的距离怎么确定?总结:巡线传感器一左一右安装在小车底盘上,因为小车是跨线走,所以两个传感器之间的距离大于黑线宽度。
观察下图,提问:1)小车沿黑线直走,此时左右两个巡线传感器检测到黑线吗?2)小车向右偏时,左右两个巡线传感器输出电平分别是什么?小车应该怎么运动以继续走直线?3)小车向左偏时,左右两个巡线传感器输出电平分别是什么?小车应该怎么运动以继续走直线?(3)基础任务:小车沿黑线直走1)任务描述使用两个巡线传感器,让小车沿着黑线直走。
小学创客教育Arduino创意机器人17 巡线小车
小车沿黑线直走,此时左右两个巡线传感器检 测到黑线吗? 小车向右偏时,左右两个巡线传感器输出电平 分别是什么?小车应该怎么运动以继续走直线? 小车向左偏时,左右两个巡线传感器输出电平 分别是什么?小车应该怎么运动以继续走直线?
小车能沿着黑线直走。 如果左传感器检测到黑线,小车 偏右,就要左转。 如果右传感器检测到黑线,小车 偏左,就要右转。
MiniQ小车
锂电池
巡线传感器
左右巡线传感 器分别接8号9 号数字管脚
逻辑运算中的 “且”语句,可 以实现两个条件 同时满足的情况。 此时,小车左传感 器检测到黑线,小 车偏右,要左拐。
此时,小车右传感 左右传 感器都检测不到黑 线时,小车直走。
拿出你的小车与其他同学的小车 赛跑吧,看谁既能成功沿黑线前 进,又能先到达终点。
左电机数值 右电机数值 走直线时间 是否一直沿着黑线运动 A组 B组 C组 D组 ……
让小车巡“S”型路线前进。
《编程小车-巡线小车》教学设计
《编程小车-巡线小车》教学设计【课题】编程小车-巡线小车【课时安排】1课时【教材分析】《巡线小车》一课,是在学生已掌握源码编辑器软件界面以及绘制新角色的基础上展开教学,通过现代科技“巡线小车”的引入,使学生产生强烈的好奇心,从而产生就知欲望。
本课在让学生了解巡线小车的工作原理的基础上,学会设计算法,并将算法融入到自己的程序中。
【教学目标】1.掌握绘制角色以及利用“三角符号”启动程序的方法,了解程序中循环的控制以及巡线小车的工作原理。
2.通过观察思考和创作实践的过程,培养和锻炼创新能力和实践能力,从而形成学以致用的方法。
3.体验源码编辑器编程的乐趣,培养自主学习的习惯、积极向上的心态以及善于解决问题的能力,激发学生程序设计的兴趣。
【教学重点】1.循环结构和判断结构在源码编辑器中的使用;2.了解巡线小车的工作原理。
【教学难点】设计“巡线”算法,并给巡线小车写入程序。
【教学资源及环境】多媒体电脑和源码编辑器软件。
【教学方法】讲授法,任务驱动法,项目式教学法。
【教学过程】一、创设情境,激趣导入师:同学们,你们喜欢小车吗?(学生回答)我们可以在马路上看到各式各样的小车。
目前,我国部分城市已推出无人驾驶公交车,不用司机,车就能自动前进。
今天,老师也和大家分享一个关于小车的视频,大家看看视频中是什么车,这辆车在干什么?(视频展示后学生回答)师:这就是巡线小车,顾名思义,巡线小车就是能根据我们预设好的路线自动行驶的无人车。
作为当前国际研究热点,巡线小车具有维护简单、效费比高等特点。
师:本课,我们将使用源码编辑器软件模拟制作一个巡线小车,并让这个巡线小车根据我们画出的路线前进。
(板书课题)[设计意图:创设轻松愉快的情境,将新知识的学习过程与学生的已有知识和生活实际相结合,既让学生对新技术产生好奇心,又引出新知识的学习,激发学生学习新知识的兴趣。
]二、自主探究,获取新知师:首先,我们来看看巡线小车的结构,它由哪些部分组成的呢?(学生回答)师:它由车身、车轮、左探头、右探头组成,左、右探头可以探测路线,在了解了巡线小车的结构之后,我们就可以在源码编辑器软件中绘制属于自己的巡线小车了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
寻线小车教材———基于Arduino开发平台V1.0目录一、机器人的组装 (1)1.1. 组装工具 (1)1.2. 机器人零件表 (1)Arduino寻线小车1.3. 装配步骤 (5)二、系统概述 (9)2.1.arduino介绍 (9)2.2.Arduino驱动安装 (13)2.3.Arduino IDE菜单介绍 (22)2.4.电机驱动扩展板L293D介绍 (29)三、实验操作 (30)3.1.红外寻线传感器 (30)3.1.1红外寻线传感器介绍 (30)3.1.2 红外寻线传感器实验操作 (31)3.2.声音传感器 (36)3.2.1声音传感器介绍 (36)3.2.2声音传感器实验操作 (37)3.3.直流电机实验操作 (39)四、使用说明 (40)4.1.接线端口介绍 (40)4.2.操作说明 (41)注意事项请认真阅读该手册并注意产品功能和用途说明。
本手册在CD光盘上以PDF格式提供,如有需要可以进行复制或打印。
该手册内容可能因产品升级或其他原因而改变,本公司不另行通知客户。
安全防备根据严重程度,安全防备分两种:警告和注意。
在动手安装之前请先通篇阅读警告和注意事项。
安装和操作注意本段包含防止机械损伤方面的内容。
危险!当操作机器人的时候要注意安全。
如果没有正确组装,机器人将不能正常工作甚至会损坏。
组装方法详见第一章机器人组装说明。
在一个足够大的地方进行调试工作警告!远离小孩。
尽管该产品看起来像个玩具,在无人照看的情况下,它可能会对小孩造成伤害。
故障发生时,请立即关闭电源。
如果电池被弄破,暴露在液体,火或其他热源面前,可能会导致电击。
不要拆开或修改充电器和其电缆。
当不充电时,请把充电器从电源上拔下。
不要拆卸或修改电机里面的电路板。
不要在热,潮湿或寒冷的环境下使用,因为该产品包含精密的元件。
如果处在一个极端的条件下,错误可能发生。
充电时请确认充电器插座是牢固的。
请仔细阅读本手册,在调试时注意机器人各关节的方向,尽量避免关节相撞。
注意!机器人的电机需要定期维护以获得和维持恰当的性能。
在一个较大,平整的地方操作时机器人的表现效果会更好。
如果工作空间很小又不平的话,机器人可能会摔倒甚至损坏。
在启动了机器人或操作的时候请不要把住机器人。
在程序的下载过程中不要关闭机器人电源,否则程序会丢失或损坏。
电池!套件里面包含锂离子(Li-Ion)电池做电源。
该锂离子(Li-Ion)电池是高能量可充电的电池,必须妥善保管,充电和使用。
把充电器接入交流电源并把他连到电池的充电接口上。
当充电器接到交流电源后,它上面的电源灯会亮起来并呈红色。
状态指示灯会呈绿色,当电池充电完成,绿色指示灯熄灭。
警告!电池管理:该锂电池在使用时不要把电能全部用光才充电,要保留一点点电量。
如果电池充足电后放置很长一段时间,电池性能会降低。
当不使用时,必须把电池与电路板或充电器断开,把电池存储在阴凉,干燥的环境中。
充电时间。
给电池充分充电需要大约40分钟。
这个时间与充电前电池里原有电量有关。
充电时要注意照看,当电池异常的发烫时应立即停止充电。
过度充电可导致电池损坏。
注意!电池处理:不要拆开或修改电池的连接或更改导线。
不要让物体进入电池的连接头,也不要让导体裸露在外。
不要在高温和极端的环境下使用。
把电池存储在阴凉,干燥的环境中。
在运输或存储时,让电池远离其他导体。
当电池的导线变破旧或磨损时,请更换这个电池。
紧急处理:如果电池造破坏导致电解材料溅到皮肤上,立即用大量水冲洗皮肤。
如果电解材料溅到眼睛里面,请尽快就医。
电池里的电解材料是有毒物质,能对人和家庭环境、家具等造成污染和危害。
如果电池不能再被充电,请按照垃圾的处理方法或本国家的规则妥善处理。
不要通过焚烧来处理报废的电池。
一、 机器人的组装1.1. 组装工具工具:尖嘴钳、十字螺丝刀等。
1.2. 机器人零件表1.底盘2.电机3连接件4.轮毂6.上板5.轮胎7.舵轮8.轴9.舵机10.侧板11.万向轮12.M3螺钉13.M3螺母14.M3X20螺钉15.尼龙垫片16.圆柱型螺母17.花舵盘18.M3X25mm六棱铜柱19.M3X35mm六棱铜柱20.M3X11mm六棱铜柱1.3. 装配步骤在上一步了解完扫地机器人所需要的零件之后,这一步就要开始进行装配了,在组装扫地机器人的过程中由于零件较多机构环节较多,为了能够安全、准备、方便的装配,我们先进行预装,就是说把各个环节先组装起来,然后再进行总装。
具体装配步骤如下。
1)根据扫地机器人的机构因素和装配的排列顺序,首先我们要从下往上装配。
这里我们第一步是要组装扫地机器人的底盘,在这一步我们先准备好所需要的零件、底盘、侧板。
2)安装底盘和侧板。
3)安装万向轮。
需要零件:M3X10螺钉2个、M3螺母2个、万向轮一个。
局部放大图4)安装电机。
需要零件:M3X20螺钉4个。
M3螺母4个。
电机2个。
5)安装车轮。
需要零件:轮毂2个、轮胎2个。
6)安装上板。
所需零件:上板一个。
到这里我们所有组装工作已经完成。
二、系统概述2.1.arduino介绍要了解arduino就先要了解什么是单片机,arduino平台的基础就是A VR指令集的单片机。
1、什么是单片机?它与个人计算机有什么不同?一台能够工作的计算机要有这样几个部份构成:中央处理单元CPU(进行运算、控制)、随机存储器RAM(数据存储)、存储器ROM(程序存储)、输入/输出设备I/O(串行口、并行输出口等)。
在个人计算机(PC)上这些部份被分成若干块芯片,安装在一个被称之为主板的印刷线路板上。
而在单片机中,这些部份全部被做到一块集成电路芯片中了,所以就称为单片(单芯片)机,而且有一些单片机中除了上述部份外,还集成了其它部份如模拟量/数字量转换(A/D)和数字量/模拟量转换(D/A)等。
2、单片机有什么用?实际工作中并不是任何需要计算机的场合都要求计算机有很高的性能,一个控制电冰箱温度的计算机难道要用酷睿处理器吗?应用的关键是看是否够用,是否有很好的性能价格比。
如果一台冰箱都需要用酷睿处理起来进行温度控制,那价格就是天价了。
单片机通常用于工业生产的控制、生活中与程序和控制有关(如:电子琴、冰箱、智能空调等)的场合。
下图就是一个Atmega328P-PU单片机,基于A VR指令集的8位处理器,频率20MHz,存储器空间32KB。
3、什么是Arduino?Arduino是一个能够用来感应和控制现实物理世界的一套工具。
它由一个基于单片机并且开放源码的硬件平台,和一套为Arduino板编写程序的开发环境组成。
Arduino可以用来开发交互产品,比如它可以读取大量的开关和传感器信号,并且可以控制各式各样的电灯、电机和其他物理设备。
Arduino项目可以是单独的,也可以在运行时和你电脑中运行的程序(例如:Flash,Processing,MaxMSP)进行通讯。
Arduino板你可以选择自己去手动组装或是购买已经组装好的;Arduino开源的IDE可以免费下载得到。
Arduino的编程语言就像似在对一个类似于物理的计算平台进行相应的连线,它基于处理多媒体的编程环境。
4、为什么要使用Arduino?有很多的单片机和单片机平台都适合用做交互式系统的设计。
例如:Parallax Basic Stamp,Netmedia’s BX-24,Phidgets,MIT’s Handyboard 和其它等等提供类似功能的。
所有这些工具,你都不需要去关心单片机编程繁琐的细节,提供给你的是一套容易使用的工具包。
Arduino同样也简化了同单片机工作的流程,但同其它系统相比Arduino在很多地方更具有优越性,特别适合老师,学生和一些业余爱好者们使用:∙便宜-和其它平台相比,Arduino板算是相当便宜了。
最便宜的Arduino 版本可以自己动手制作,即使是组装好的成品,其价格也不会超过200元。
∙跨平台-Arduino IDE可以运行在Windows,Macintosh OSX,和Linux 操作系统。
大部分其它的单片机编译软件都只能运行在Windows上。
∙简易的编程环境-初学者很容易就能学会使用Arduino编程环境,同时它又能为高级用户提供足够多的高级应用。
对于老师们来说,一般都能很方便的使用Processing 编程环境,所以如果学生学习过使用Processing 编程环境的话,那他们在使用Arduino开发环境的时候就会觉得很相似很熟悉。
∙软件开源并可扩展-Arduino软件是开源的,对于有经验的程序员可以对其进行扩展。
Arduino编程语言可以通过C++库进行扩展,如果有人想去了解技术上的细节,可以跳过Arduino语言而直接使用A VR C 编程语言(因为Arduino语言实际上是基于A VR C的)。
类似的,如果你需要的话,你也可以直接往你的Arduino程序中添加A VR-C 代码。
∙硬件开源并可扩展-Arduino板基于Atmel 的ATMEGA8 和ATMEGA168/328 单片机。
Arduino基于Creative Commons 许可协议,所以有经验的电路设计师能够根据需求设计自己的模块,可以对其扩展或改进。
甚至是对于一些相对没有什么经验的用户,也可以通过制作试验板来理解Arduino是怎么工作的,省钱又省事。
TX、RX指示灯USB插孔Arduino 基于A VR 平台,对A VR 库进行了二次编译封装,把端口都打包好了,寄存器啦、地址指针之类的基本不用管。
大大降低了软件开发难度,适宜非专业爱好者使用。
优点和缺点并存,因为是二次编译封装,代码不如直接使用A VR 代码编写精练,代码执行效率与代码体积都弱于A VR 直接编译。
性能:Digital I/O 数字输入/输出端口0—13。
Analog I/O 模拟输入/输出端口0-5。
支持ICSP 下载,支持TX/RX 。
输入电压:USB 接口供电或者5V-12V 外部电源供电。
输出电压:支持3.3V 级5V DC 输出。
处理器:使用Atmel Atmega168 328处理器,因其支持者众多,已有公司开发出来32位的MCU 平台支持arduino 。
arduino 板子上基本端口如描述,对几个比较特殊的端口下面详细说明下:VIN 端口:VIN 是input voltage 的缩写,表示有外部电源时的输入端口。
如果不使用USB 供电时,外接电源可以通过此引脚提供电压。
(如电池供电,电池正极接VIN 端口,负极接GND 端口)AREF:Reference voltage for the analog inputs(模拟输入的基准电压)。
使用analogReference()命令调用。
稳 压芯片外部电源供电插孔模拟端口0~5 ICSPICSP:也有称为ISP(In System Programmer),就是一种线上即时烧录,目前比较新的芯片都支持这种烧录模式,包括大家常听说的8051系列的芯片,也都慢慢采用这种简便的烧录方式。