1. 功能说明
在机器人车体上安装2个 灰度传感器 ,实现机器人按照下图所指定的路线进行导航运动,来模拟仓库物流机器人按指定路线行进的工作过程。

2. 使用样机
本实验使用的样机为R023e样机。

3. 功能实现
3.1 电子硬件
在这个示例中,我们采用了以下硬件,请大家参考:
| 主控板 | Basra(兼容Arduino Uno) | 
| 扩展板 |   SH-01外围电路扩展板(与Bigfish扩展板相似)  | 
| 传感器 | 灰度传感器 | 
| 电池 | 7.4V锂电池 | 
电路连接说明:
① 电机连在D6,D10及D5,D9接口上;
② 2个灰度传感器分别接在扩展板的传感器接口A0、A4上。


3.2 编写程序
传感器触发情况、小车行驶状态、对应行为策略表:
| 传感器1 | 传感器2 | 小车状态 | 动作 | 
| 0 | 1 | 小车左偏 | 向右调整 | 
| 1 | 0 | 小车右偏 | 向左调整 | 
| 1 | 1 | 到达终点 | 停止 | 
| 0 | 0 | 正常 | 前进 | 
① 根据实验内容,利用多分支结构设计出程序流程图。
  ② 根据设计好的程序流程图进行编程,编写并烧录以下程序(blackline_4if.ino),该程序将实现演示视频中的动作。
编程环境:Arduino 1.8.19
/*------------------------------------------------------------------------------------
  版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.
           Distributed under MIT license.See file LICENSE for detail or copy at
           https://opensource.org/licenses/MIT
           by 机器谱 2023-02-09 https://www.robotway.com/                                   
------------------------------------------------------------------------------------*/
void turnleft_slow();
void forward();
void carstop();
void turnright_slow();
void setup()
{
  pinMode( 18, INPUT);
  pinMode( 14, INPUT);
  pinMode( 10, OUTPUT);
  pinMode( 6, OUTPUT);
  pinMode( 5, OUTPUT);
  pinMode( 9, OUTPUT);
}
void loop()
{
  if (( digitalRead(14) && digitalRead(18) ))
  {
    forward();
  }
  if (( !( digitalRead(14) ) && digitalRead(18) ))
  {
    turnleft_slow();
  }
  if (( digitalRead(14) && !( digitalRead(18) ) ))
  {
    turnright_slow();
  }
  if (( !( digitalRead(14) ) && !( digitalRead(18) ) ))
  {
    carstop();
    delay( 5000 );
  }
}
void turnright_slow()
{
  analogWrite(6 , 80);
  analogWrite(10 , 0);
  analogWrite(5 , 0);
  analogWrite(9 , 0);
}
void carstop()
{
  analogWrite(6 , 0);
  analogWrite(10 , 0);
  analogWrite(5 , 0);
  analogWrite(9 , 0);
}
void turnleft_slow()
{
  analogWrite(6 , 0);
  analogWrite(10 , 0);
  analogWrite(5 , 80);
  analogWrite(9 , 0);
}
void forward()
{
  analogWrite(6 , 80);
  analogWrite(10 , 0);
  analogWrite(5 , 80);
  analogWrite(9 , 0);
} 
也可以使用if…else嵌套写法(blackline_ifelse.ino)。
void stop();
void left();
void right();
void forwards();
void setup()
{
  pinMode( 18, INPUT);
  pinMode( 14, INPUT);
  pinMode( 10, OUTPUT);
  pinMode( 6, OUTPUT);
  pinMode( 5, OUTPUT);
  pinMode( 9, OUTPUT);
}
void loop()
{
  if (( !( digitalRead(14) ) && digitalRead(18) ))
  {
    right();
  }
  else
  {
    if (( digitalRead(14) && !( digitalRead(18) ) ))
    {
      left();
    }
    else
    {
      if (( !( digitalRead(14) ) && !( digitalRead(18) ) ))
      {
        stop();
      }
      else
      {
        forwards();
      }
    }
  }
}
void stop()
{
  analogWrite(5 , 0);
  analogWrite(9 , 0);
  analogWrite(6 , 0);
  analogWrite(10 , 0);
}
void right()
{
  analogWrite(5 , 150);
  analogWrite(9 , 0);
  analogWrite(6 , 0);
  analogWrite(10 , 150);
}
void forwards()
{
  analogWrite(5 , 150);
  analogWrite(9 , 0);
  analogWrite(6 , 150);
  analogWrite(10 , 0);
}
void left()
{
  analogWrite(5 , 0);
  analogWrite(9 , 150);
  analogWrite(6 , 150);
  analogWrite(10 , 0);
} 
资料内容详见 小型双轮差速底盘-双灰度循迹
![[Linux入门篇]一篇博客解决C/C++/Linux System Call文件操作接口的使用](https://img-blog.csdnimg.cn/img_convert/bad446c4802dc09d0660be5bb815c0a6.png)


















