机器谱

S105】一款基于Arduino控制的全地形越野小车

图文展示3264(1)

图文展示3264(1)

副标题

作品说明

作者:庾小辉  郑健仪 吴艺色

单位:广州航海学院

指导老师:吕有界 谭文才

1. 市场调研及市场前景

1.1 国内外现状及发展现状

      全地形车(ATV)是一种针对复杂道路状况和环境而设计的车辆。随着人类文明的快速发展。汽车这一工业产品变得越来越普及,汽车运输是当今社会不 可或缺的。成为人类社会进步与发展的重要推动力量。越来越多的汽车需要越来越多的道路但在所有的天气整个地形的运作普通车辆不可能做到。这是人类发明的一种非道路、全天候、全地形条件的车辆--全地形车。

      全地形车最早出现于瑞典苏联等少数几个位于北半球的国家。并且多用于军事运输方面民用的基本没有。这些国家地形条件较为特殊。如瑞典和苏联境内湖泊沼泽众多大面积的领土处于北极边缘地带的积雪区因此这些国家高度重视车辆的越野性能特别是在雪地通行的能力。国内外对全地形车辆的研究车型主要包括履带式全地形车、轮式全地形车、轮履合一轻型全地形车三种。在国外特别是日本和美国全地形车系统性能与应用方面已经有多年的研究,而且有较成熟的车型。

      国外生产全地形车的产家主要有美国北极猫、加拿大庞巴迪、日本本田、川崎、铃木、雅马哈等国内生产全地形车的产家有台湾光阳等。本田公司于1970年研制出了第一款商业化的全地形车,但是并没有进行发售。之后日本雅马哈、川崎、铃木等公司也相继开发研制全地形车。到了1982年本田公司的多功能用途的“大红”三轮全地形车开始销售,并且出现了越野型的全地形车。但是在四轮全地形车的研制开发方面起到领导作用的却是日本铃木公司日本铃木公司在1983年研制并且发售第一台四轮全程地形车。之后美国北极星公司才在北美开始全地形车业务。 此后各厂家不断推出具有新功能的四轮全地形车。

      由于四轮全地形车稳定性及安全性更好在欧美销量很好且呈逐年上升趋势此后全地形车发展迅猛。我国的全地形车行业起步于2005年由摩托车产业发展而来经过十年多的发展取得了不错的成绩行业的前景较好。根据年中国汽车工业协会调查在我国共有122家在册的全地形车总装厂家。目前在我国的全地形车企业大多数是私营企业而国有全地形车企业少数还有部分中外合资全地形车企业, 主要集中分部在浙江和重庆地区。约有100多家全地形车企业生产商主要有春风、奥德斯、巴山、环松等。全地形车产量约占世界全地形车产量的40%其中90%的全地形车都是出口国外的市场。

      现阶段我国全地形车系列产品虽然已经大量出口,取得了初步成功。但是与国外同行相比,国内企业的技术差距还是十分明显。目前国内除了建设集团因有国防科工委的资金支持所在做研发以外其余企业基本还处在探索阶段全地形车产品的研究与开发还处在仿制阶段。另外随着全地形车的迅速崛起许多摩托车行业也开始凭借着自身的技术和专业背景开始研发自己的全地形车。这样也导致了全地形车行业的研发设计水平不够完善只能单纯的对国外一些产品的仿制仿制出的产品往往都存在各种各样的问题比如车辆的设计不合理、操控性差等缺陷。因为这些仿制品的品质不高也导致了行业内的竞争力不足。

1.2 国内全地形车发展趋向

      全地形车应用面广泛涉及工业、娱乐、农业、探险、公安消防、抢险救灾及代步等方面,甚至在军事上的应用也越来越多。由于全地形车与地面的摩擦阻力大其行驶路况包括沙地、山地、沼泽等复杂路面。

      中国一直都是个农业大国农业是我国的基本产业它支持着我国的各种产业。我国在十一五期间提出发展农农业自动化、机械化。为了提高农业的产业效率我国也大力发展了农用性全地形车。从1982年到1986年的五年时间里中共中央一号文件都以“三农”(农业、农村、农民)为主题具体部署了农村改革和农业发展。且从2004年开始2014年连续十一年以“三农”为主题。其中2014年中央一号文件明确确定坚持农业基础地位不动摇加快推进农业现代化其中农业现代化包括运输现代化。由于中国大部分农村具有道路较窄、路况较差、路面凹凸不平、运输距离较短等特点,因此研究适应于此类运输的全地形农用车辆十分必要。

2. 全地形小车的功能介绍及先进性

2.1 功能介绍

      全地形小车是以Basra板作为全地形小车的控制核心,用直流电机作动力来驱动小车和改变方向,采用灰度传感器作为小车循迹的视角,根据不同的地形采用触碰传感器触碰按钮来选择适当的行走路线模式的一种越野性小车;

      路线一:全地形小车将依次通过小型阶梯——防滑带——U型隧道——大型阶梯——石块地形,每一个过障碍的程序都是一个独立的子函数,通过编写子函数的形式来使程序更加地直观,也方便了小车的调试,当小车需要修改参数或者检验某部分程序时,可以立刻找到程序的问题所在。

      路线二:全地形小车将依次通过栅格——上窄桥——上、下高台——下窄桥——方形隧道——草地——减速带,从而完成全部障碍的跨越。编程思路与路线1的类似,比较特别的地方在于对高台程序的把握和编写。程序的结构与路线1相比会稍稍复杂

2.2 先进性

2.2.1 机械履带结构

      履带是一种环形链带。坦克要求对各种路面的适应性均较高,其履带不仅需提供良好的纵向附着力,还需提供防止车辆侧滑的横向力。因此,履带着地筋在保证足够的纵向附着力的情况下,设计成45°“八字”筋结构可同时解决有效控制重量、提供足够的横向纵向刚强度和横向力的问题;履带模块虽然行动较慢,运转阻力大,但是其转动灵活,摩擦力和附着能力好,地形适应能力强。采用履带行走,就像给坦克铺了一道无限延长的轨道一样,使它能够平稳、迅速、安全地通过各种复杂路况。由于接地面积大,所以增大了坦克在松软、泥泞路面上的通过能力,降低了下陷量。由于履带板上有花纹并能安装履刺,所以能牢牢地抓住地面,不会滑转。

2.2.2 软件设计容错率高

      由于传感器识别到直角弯道,全地形小车需立马做出直角转弯的动作,来达到转角效果。然而单纯的转角却不可能每次都转到90度的精准位置,而导致小车在第二个转角转不准而失败。因为直流电机本身有惯性存在,导致电机电机转的角度并不稳定,除此之外,电池容量也是影响电机转角的一个因素。因此我们团队设计精准转角的方法是:在传感器遇到第一个直角时,转的角度小于90度,再减速向前走,当走到第二个直角时,传感器先识别黑线后识别白色,转角依然小于90度,此时小车后退,车尾碰到障碍物来调直车头再向前走,已达到进入隧道的目的。

3. 全地形小车的制作过程

3.1 思路来源

      如果说坦克是陆战之王,那么履带就是陆战之王的双脚。采用履带行走,就象给坦克铺了一道无限延长的轨道一样,使它能够平稳、迅速、安全地通过各种复杂路况.由于接地面积大,所以增大了坦克在松软、泥泞路面上的通过能力,降低了下陷量。由于履带板上有花纹并能安装履刺,所以在雨、雪、冰或上坡等路面上能牢牢地抓住地面,不会滑转。坦克重量大,用履带的话可以减小单位面积压力,对路面的要求可以小点。且防御性能和越野性能比轮式要好,轮式结构比履带简单,一般都用于轻装甲车辆,公路速度比履带车辆好。从技术的角度来看,履带的作用是借助与其啮合的主动轮传递驱动力矩或制动力矩,依靠与地面的相互作用产生牵引力或制动力。负重轮支撑的战斗总质量紧紧压在下支履带上,能增大下支履带与地面的接触面积,而履带上的花纹能增加其附着性能。

3.2 方案选择过程

3.2.1 直流电机的安放

      根据能量转换方式,我们可以知道,机器人的运动系统可由液压驱动、气动驱动、电动驱动等构成,而我们在选择这些驱动器时,需要考虑的因素是多方面全方位的,要使履带小车有效且合理地运行,采用直流电机拖动主从轮的运动,从而带动附着在轮子上的履带运动。

直流电动机是将直流电能转换为机械能的电动机。因其良好的调速性能而在电力拖动中得到广泛应用。本设计采取了四个直流电机组成越野小车的基本运动系统。运用对电机的开环控制系统,如下图所示,开环控制系统的特点是系统的结构和控制过程都比较简单,由于越野机器人可以近似于一个恒转矩负载的系统,所以系统不需要有抗负载扰动。相对于闭环系统,此系统大大简化了系统设计并且能完成期望。

作品说明

开环控制系统图

      从直流电动机的电枢回路看,电源电压U与电动机的反电动势Eа和电枢电流Zа在电枢回路电阻Rа上的电压降必须平衡。即U=Ed+IdRd。

3.2.2 Basra控制板

      Basra是一款基于Arduino开源方案设计的一款开发板,板子上的微控制器可以在Arduino、Eclipse、Visual Studio等IDE中通过C/C++语言来编写程序,编译成二进制文件,烧录进微控制器。Basra的处理核心是ATmega328,同时具有14路数字输入/输出口(其中6路可作为PWM输出),6路模拟输入,一个16MHz晶体振荡器,一个USB口,一个电源插座,一个ICSPheader和一个复位键。Basra可作为机器人的控制核心,用于控制舵机、直流电机、传感器、输出模块及通信模块等[1]。

      CPU采用AVR ATMEGA328型控制芯片,支持C语言编程方式;该系统的硬件电路包括:电源电路、串口通信电路、MCU基本电路、烧写接口、显示模块、AD/DA转换模块、输入模块、IIC存储模块等其他电路模块电路。控制板尺寸不超过60*60mm,便于安装。CPU硬件软件全部开放,除能完成对小车控制外,还能使用本实验板完成单片机所有基础实验。供电范围宽泛,支持5v~9v的电压,干电池或锂电池都适用。编程器集成在控制板上,通过USB大小口的方式与电脑连接。下载程序。开放全部底层源代码。控制板含3A6V的稳压芯片,可为舵机提供6v额定电压。板载8*8led模块采用MAX7219驱动芯片。板载一片直流电机驱动芯片FAN8100MTC,可同时驱动两个直流电机。板载USB驱动芯片及自动复位电路,烧录程序时无需手动复位。2个2*5的杜邦座扩展坞,方便无线模块、OLED、蓝牙等扩展模块直插连接,无需额外接线。在本设计中,全履带越障小车采用了一块Basra主控板,有效地将各硬件控制器连接起来,从而实现软件的控制。

3.2.3 传感器的使用

      传感器技术已成为当前机器人研究中最重要的课题之一,一方面传感器的使用和发展提高了机器人的感知水平,促进了机器人智能技术的深化,另一方面却因为传感器技术发展水平的相对滞后影响了机器人的应用和发展。今后的智能化机器人能发展到何种程度,传感器技术与人工智能技术的发展水平将是最关键的两个影响因素,而且传感器技术还直接决定了人工智能的模型结构[2]。

      传感器是一种把物理量或化学量转变成便于利用的电信号的器件,其实质是一种功能模块,其作用是将来自外界的各种信号转换为电信号。传感器的组成包括敏感元件和转换器件两部分。敏感元件是能直接感受或响应被测信息的元件,转换器件则是将敏感元件感受的信息转换为可用信号的元件。传感器的通用结构如下图所示

传感器通用结构图

      传感器位于机器人控制系统的最前端,是决定机器人性能的重要部件,其指标如灵敏度、分辨率、稳定性等,都直接影响测量结果的好坏以及控制过程的准确性。在机器人控制系统设计中要获得最好的性价比,需要根据具体要求,合理选择使用传感器,因此对传感器的特性要有所了解。传感器的静态特性的主要指标有线性度、迟滞、重复性、灵敏度、稳定性、漂移、分辨力和阈值等。线性度是用来描述传感器输出值的相对误差的。传感器在正、反行程期间输入、输出曲线不重合的现象称为迟滞。灵敏度用来反映输入变量引起的输出变化量,是在稳定条件下输出微小增量与输入微小增量的比值。分辨力是指传感器能够检测到的最小输入增量,阈值是指输入小到某个程度、输出不再变化的值。漂移则反映了传感器输出量的稳定程度[2]。在全履带越野小车中,主要采用了两种传感器,触碰传感器和灰度传感器,触碰传感器主要用于检测运行的路线,灰度传感器则是用于检测黑线以便循迹。

3.3 程序流程图

程序流程图

3.4 示例程序源代码

#include <LedControl.h>

LedControl lc=LedControl(12,11,13,1);

#define sensorl A0

#define sensorr A4

#define sensoro A2

#define motorl 9

#define motorll 10

#define motorr 5

#define motorrr 6

#define sensor_button A3

#define huidu 300         //灰度传感器检测到黑色线的模拟值

#define l_speed 254       //左轮速度

#define r_speed 252       //右轮速度

/*转角延时时间*/

#define U_first_angle 870   //U形隧道

#define U_second_angle 900

#define U_third_angle 925

#define U_fourth_angle 850

#define F_first_angle 860   //方形隧道

#define F_second_angle 900

#define F_third_angle 1180

#define F_fourth_angle 1200

#define F_fiveth_angle 900

#define F_sixth_angle 880

/*高台转角延时时间*/

#define gaotai_angle_shang 1150//上高台转角延时时间

/*过U型隧道延时*/

#define U_delay 7250   //延时时间

int val=0;//触碰传感器值,用来存储触碰次数,根据不同的值跳转到相应的函数,以实现相应的功能

void setup()

{

  Serial.begin(9600);   //串口传输速率

/*传感器、直流电机初始化*/

  pinMode(sensorl,INPUT);

  pinMode(sensorr,INPUT);

  pinMode(sensoro,INPUT);

pinMode(motorl,OUTPUT);

pinMode(motorr,OUTPUT);

pinMode(motorll,OUTPUT);

pinMode(motorrr,OUTPUT);

/*LED矩阵初始化*/

lc.shutdown(0,false);

lc.setIntensity(0,8);

lc.clearDisplay(0);

}

void loop()

{

int i=analogRead(sensorl),j=analogRead(sensorr),o=analogRead(sensoro);

int button=digitalRead(sensor_button);  

if(button==0) // 当按下触碰传感器时,触碰值加一

{

delay(300);

if(button==0)

val++;

back(0,0);

}

led_dis();

if(val==1)//线路一:小型阶梯-木块-U型隧道-大型阶梯-石块

{  

run();

turn1();

}

if(val==2) //线路二:栅格-上窄桥-上高台、下高台-下窄桥-方型隧道-草地-减速带

{

  run();  

  turn2_gaotai();

}

}

void run()        //快速寻迹

{

int i,j,o;

i=analogRead(sensorl);

j=analogRead(sensorr);

o=analogRead(sensoro);

  if(i<huidu&&j<huidu)

  {

    forward();

    delay(80);

  }

  else if(i>huidu)

  {

    if (j>huidu)

    {

       forward();

       delay(80);

    }  

    else

    {

      delay(20);

      if(analogRead(sensorr)<huidu)

      {

        right(250,220);

        delay(80);

      }

    }

  }

  else if(j>huidu)

  {

    if(i>huidu)

    {

      forward();

      delay(80);

    }

    else

    {

      delay(20);

      if(analogRead(sensorl)<huidu)

      {

        left(180,250);

        delay(80);

      }

    }

  }

}

void man_run()      //慢速寻迹

{

int i,j;

i=analogRead(sensorl);

j=analogRead(sensorr);

if(i<huidu&&j<huidu)

{

    manzou();

    delay(80);

  }

  else if(i>huidu)

  {

    delay(5);

    if (j>huidu)  

       manzou();   

    else

    {

      right(180,140);

      delay(80);

    }

  }

  else if(j>huidu)

  {

    delay(5);

   

    if(i>huidu)

      manzou();

    else

    {

      left(130,180);

      delay(80);

    }

  }

}

void manzou()   //慢速直走

{

    analogWrite(motorl,140);

    analogWrite(motorll,0);

    analogWrite(motorr,165);

    analogWrite(motorrr,0);

}

}

void forward()   //快速直走

{

    analogWrite(motorl,l_speed);

    analogWrite(motorll,0);

    analogWrite(motorr,r_speed);

    analogWrite(motorrr,0);

}

void left(int num1,int num2)   //偏左修正

{

        analogWrite(motorl,num1);

        analogWrite(motorll,0);

        analogWrite(motorr,num2);

        analogWrite(motorrr,0);

}

void right(int num1,int num2)   //偏右修正

{

        analogWrite(motorl,num1);

        analogWrite(motorll,0);

        analogWrite(motorr,num2);

        analogWrite(motorrr,0);

}

void back(int num1,int num2)   //后退

{

      analogWrite(motorl,0);

      analogWrite(motorll,num1);

      analogWrite(motorr,0);

      analogWrite(motorrr,num2);

}

void led_dis()   //LED矩阵显示

{

  if(val==0)

  {

    lc.setRow(0,0,0xff);

    lc.setRow(0,1,B10000001);

    lc.setRow(0,2,B10100101);

    lc.setRow(0,3,B10000001);

    lc.setRow(0,4,B11000011);

    lc.setRow(0,5,B10100101);

    lc.setRow(0,6,B10011001);

    lc.setRow(0,7,0xff);

  }

  if(val==1)

  {

    lc.setRow(0,0,B00001000);

    lc.setRow(0,1,B00011000);

    lc.setRow(0,2,B00101000);

    lc.setRow(0,3,B00001000);

    lc.setRow(0,4,B00001000);

    lc.setRow(0,5,B00001000);

    lc.setRow(0,6,B00001000);

    lc.setRow(0,7,B00111110);

  }

  if(val==2)

  {

    lc.setRow(0,0,B01111110);

    lc.setRow(0,1,B01000100);

    lc.setRow(0,2,B00001000);

    lc.setRow(0,3,B00010000);

    lc.setRow(0,4,B00010000);

    lc.setRow(0,5,B00010000);

    lc.setRow(0,6,B00010000);

    lc.setRow(0,7,B00111110);

  }

}

void turn1()   //第一条线路,首先过小型阶梯,接着过U型隧道,最后过大型阶梯

{

int n;   while(analogRead(sensorl)<120&&analogRead(sensoro)<100&&analogRead(sensorr)<120)// jiance xiao xing jie ti

{

   run();

   while(1)

   {

if(analogRead(sensorl)>500&&analogRead(sensoro)>600&&analogRead(sensorr)>500)   //第一个转角

    {     

      delay(50);      if(analogRead(sensorl)>500&&analogRead(sensoro)>600&&analogRead(sensorr)>500)  

    {

      delay(50);       if(analogRead(sensorl)>500&&analogRead(sensoro)>600&&analogRead(sensorr)>500)

     {

          back(230,230);

          delay(230);

          analogWrite(motorl,255);

          analogWrite(motorll,0);

          analogWrite(motorr,0);

          analogWrite(motorrr,255);

          delay(U_first_angle);         

          manzou();   //右转后,慢速直走

          delay(500);

         while(analogRead(sensorl)>huidu) //当检测到黑线,跳出循环

         man_run();

while(analogRead(sensorl)<500||analogRead(sensorr)<500||analogRead(sensoro)<600) //第二个转角

         man_run();

         back(230,230);

         delay(180);

         analogWrite(motorl,0);

         analogWrite(motorll,255);

         analogWrite(motorr,255);

         analogWrite(motorrr,0);

         delay(U_second_angle);           

         back(230,230);

         delay(800);

         manzou();

         delay(1500);

         U_speed(); //进入U型隧道的速度

         delay(U_delay);               

         back(0,0);

         delay(100);

         while(analogRead(sensorl)>huidu) //当检测到黑线,跳出循环

         man_run(); while(analogRead(sensorl)<500||analogRead(sensorr)<500||analogRead(sensoro)<600)//第三个转角

          man_run();

          left(210,210);

          delay(300);

          back(230,230);

          delay(350);

          analogWrite(motorl,0);

          analogWrite(motorll,255);

          analogWrite(motorr,255);

          analogWrite(motorrr,0);

          delay(U_third_angle);                   

          manzou();

          delay(500);

while(analogRead(sensorr)>huidu) //当检测到黑线,跳出循环

          man_run();       while(analogRead(sensorl)<500||analogRead(sensorr)<500||analogRead(sensoro)<600)//第四个转角

         man_run();  

         back(230,230);

         delay(120);

         analogWrite(motorl,255);

         analogWrite(motorll,0);

         analogWrite(motorr,0);

         analogWrite(motorrr,255);  

         delay( U_fourth_angle);

         analogWrite(motorl,0);

         analogWrite(motorll,255);

         analogWrite(motorr,255);

         analogWrite(motorrr,0);

         delay(30);

         back(0,0);

         delay(50);

         manzou();

         delay(500);

         while(1)     

        {           //大型阶梯延时重复检测

   if(analogRead(sensorl)<80&&analogRead(sensorr)<80&&analogRead(sensoro))

          {

            delay(50);

            if(analogRead(sensorl)<80&&analogRead(sensorr)<80&&analogRead(sensoro))

            {

              delay(50);

              if(analogRead(sensorl)<80&&analogRead(sensorr)<80&&analogRead(sensoro))

              {

                 forward();

                 delay(3500);

                 for(n=0;n<30;n++)

                 man_run();

                 back(0,0);

                 delay(100);

                 while(1)

                 run();

              }

            }

          }

        else

        man_run();

        }

       }

      }

    }

    else

    run();

  }

}

}

void turn2_gaotai()   //第二条线路,经栅格到窄桥,接着上高台、下高台,然后过方型隧道、草地、减速带

{

int n;

if(analogRead(sensorl)<100&&analogRead(sensoro)<100&&analogRead(sensorr)<100)

{

  delay(50);   if(analogRead(sensorl)<100&&analogRead(sensoro)<100&&analogRead(sensorr)<100)

   {

     delay(50);    if(analogRead(sensorl)<100&&analogRead(sensoro)<100&&analogRead(sensorr)<100)

     {

       forward();

       delay(2250);

       back(235,235);

       delay(150);

       analogWrite(motorl,255);

       analogWrite(motorll,0);

       analogWrite(motorr,0);

       analogWrite(motorrr,255);

       delay(gaotai_angle_shang);

       forward();

       delay(2250);

       back(0,0);

       delay(500);       while(analogRead(sensorl)>300||analogRead(sensoro)>300||analogRead(sensorr)>300)

       back(235,230);

       back(0,0);

       delay(100);

       back(250,232);

       delay(570);

       back(0,0);

       delay(200);   

       analogWrite(motorl,0);

       analogWrite(motorll,250);

       analogWrite(motorr,250);

       analogWrite(motorrr,0);

       delay(600);       

        back(0,0);

       delay(100);

       forward();

       delay(100);

       back(0,0);

       delay(100);

       analogWrite(motorl,0);

       analogWrite(motorll,250);

       analogWrite(motorr,250);

       analogWrite(motorrr,0);

       delay(350);

       back(0,0);

       delay(100);

       back(230,230);

       delay(200);       

       analogWrite(motorl,0);

       analogWrite(motorll,255);

       analogWrite(motorr,255 );

       analogWrite(motorrr,0);

       delay(500);  

       while(1)   {       

if(analogRead(sensorl)>500&&analogRead(sensoro)>600&&analogRead(sensorr)>500)   //第一个转角

         {     

           delay(50);   if(analogRead(sensorl)>500&&analogRead(sensoro)>600&&analogRead(sensorr)>500)   //第一个转角

           {

              back(230,230);

              delay(150);

              analogWrite(motorl,255);

              analogWrite(motorll,0);

              analogWrite(motorr,0);

              analogWrite(motorrr,255);  

              delay(F_first_angle);              analogWrite(motorl,0);

              analogWrite(motorll,255);

              analogWrite(motorr,255);

              analogWrite(motorrr,0);

              delay(30);  

              manzou();

              delay(500);   

         while(analogRead(sensorl)>huidu) //当检测到黑线,跳出循环

              man_run();

while(analogRead(sensorl)<500||analogRead(sensorr)<500||analogRead(sensoro)<600)//第二个转角

              man_run();

              back(230,230);

              delay(180);

              analogWrite(motorl,0);

              analogWrite(motorll,255);

              analogWrite(motorr,255);

              analogWrite(motorrr,0);

              delay(F_second_angle);

       

              back(230,230);

              delay(800);     

             forward();

             delay(2200);

             back(240,240);

             delay(250);


analogWrite(motorl,255);// 第三个转角

             analogWrite(motorll,0);

             analogWrite(motorr,0);

             analogWrite(motorrr,255);

             delay(F_third_angle);                 

             forward();

             delay(2200);   while(analogRead(sensorl)<350||analogRead(sensorr)<350||analogRead(sensoro)<400)   //第四个转角

             run();  

             back(240,240);

             delay(250);

             analogWrite(motorl,255);

             analogWrite(motorll,0);

             analogWrite(motorr,0);

             analogWrite(motorrr,255);

             delay(F_fourth_angle);                 

             forward();

             delay(1000);

       

             back(255,255);

             delay(1700);

             forward();

             delay(1400);

           while(analogRead(sensorl)>300) //当检测到黑线,跳出循环

             man_run();   while(analogRead(sensorl)<500||analogRead(sensorr)<500||analogRead(sensoro)<600) //第五个转角

             man_run();

            back(230,230);

            delay(250);

            analogWrite(motorl,0);

            analogWrite(motorll,255);

            analogWrite(motorr,255);

            analogWrite(motorrr,0);

            delay(F_fiveth_angle);

            forward();

            delay(300);

         while(analogRead(sensorr)>huidu) //当检测到黑线,跳出循环            man_run();

                    while(analogRead(sensorl)<600||analogRead(sensorr)<600||analogRead(sensoro)<700) //第六个转角

            man_run();

            delay(50);            while(analogRead(sensorl)<600||analogRead(sensorr)<600||analogRead(sensoro)<700)

            man_run();

            back(240,240);

            delay(250);   

            analogWrite(motorl,255);

            analogWrite(motorll,0);

            analogWrite(motorr,0);

            analogWrite(motorrr,255);

            delay(F_sixth_angle);

            for(n=0;n<27;n++)

            run();

            back(0,0);

            delay(100);

            left(250,245);

            delay(3200);

            while(1)

            run();

            }

          }

          else

          run();

         }

       }

     }

  }

}


3.5 制作过程照片

* 本项目未获得作者开源授权,无法提供资料下载

© 2022 机器时代(北京)科技有限公司  版权所有
机器谱——机器人共享方案网站
学习  开发  设计  应用