4. CarBot サンプルプログラム

4.1. Blockluduino

4.1.1. さいしょにじっこう setup

「さいしょにじっこう」は、プログラムの実行がはじまったときに一回だけ動く部分です。 センサーやモーターとつないだ線のピンの番号を設定したりします。

モータースピードの最大値は255、最小値は0です。

_images/carbot_sample_1.png

4.1.2. くりかえしじっこう loop

「くりかえしじっこう」は、プログラムが動いている間、何度もくりかえして実行される部分です。 ここで、センサーの値を読みとったり、モーターを回す処理を書いていきます。

_images/carbot_sample_2.png

このなかで、COLLISION、CRUISE、SAFETY はかんすうです。

4.1.3. かんすう

CarBot で使うかんすうの説明です。

  1. COMMAND

    CarBot を動かすための指令を出すときに使うかんすうです。

    指令は5種類あります。
    • FORWARD
    • BACKWARD
    • RIGHT
    • LEFT
    • STOP
    • 最初から準備されているので自分で作る必要はありません。

    <使用例>

    • FORWARD

    高速(SPEED_H)でCarBotを前進させます。MEIREI に “FORWARD “をセットし、SPEED にスピードをセットして COMMAND を呼びます。

    _images/carbot_sample_4.png
    • BACKWARD

    CarBot をバックさせます。MEIREI に “BACKWARD”をセットし、SPEED にスピードをセットして COMMAND を呼びます。

    _images/carbot_sample_5.png
    • RIGHT

    CarBot に右折を指示します。MEIREI に “RIGHT”をセットし、SPEED にスピードをセットして COMMAND を呼びます。

    CarBotを低速(SPEED_L)で0.3秒間右折させます。時間が長いとグルグル回ってしまいます。

    _images/carbot_sample_6.png
    • LEFT

    CarBot に左折を指示します。呼びかたは RIGHT と同じです。

    • STOP

    CarBot を停止させるかんすうです。下の例では、1秒間停止したあと、高速で前進します。

    _images/carbot_sample_10.png
  2. SAFETY

    CarBot がこのまま進むと何かにぶつかるかもしれない時に呼びます。

    • このかんすうは準備されていないので自分で作る必要があります。

    <作成例>

    _images/carbot_sample_11.png
  • CRUISE

    CarBot を高速で前進させたい時に呼びます。

    • このかんすうは準備されていないので自分で作る必要があります。
    _images/carbot_sample_12.png
  • COLLISION

    CarBot が何かにぶつかりそうになった時に呼びます。

    _images/carbot_sample_7.png
    • このかんすうは準備されていないので自分で作る必要があります。
    _images/carbot_sample_8.png

4.2. Arduino IDE のプログラム例

BlockluDuino で作成したプログラムの例です。

int distance;
int pre_direction;
String MEIREI;

int SPEED_H;
int SPEED;
int SPEED_M;
int SPEED_L;
int L_EN;
int R_EN;
int L_FW;
int L_RV;
int R_FW;
int R_RV;
int Sonic_Time_out = 3000;

long Sonic_Timing() {
        digitalWrite(3, LOW);
        delayMicroseconds(2);
        digitalWrite(3, HIGH);
        delayMicroseconds(10);
        digitalWrite(3, LOW);
        long duration = pulseIn(4,HIGH,Sonic_Time_out);
        if ( duration == 0 ){
          duration = Sonic_Time_out;
          digitalWrite(0, HIGH);
          delay(25);
          digitalWrite(0 ,LOW);
          delay(225);
        }
        return duration;
}

void CRUISE() {
  MEIREI = "FORWARD";
  SPEED = SPEED_H;
  COMMAND();
}

void SAFETY() {
  MEIREI = "FORWARD";
  SPEED = SPEED_L;
  COMMAND();
}

void COMMAND() {
if (MEIREI == "FORWARD") {
    analogWrite(6, SPEED);
    analogWrite(5, 0);
    analogWrite(10, SPEED);
    analogWrite(11, 0);
    digitalWrite(L_EN, HIGH);
    digitalWrite(R_EN, HIGH);
  } else if (MEIREI == "BACKWARD") {
    analogWrite(6, 0);
    analogWrite(5, SPEED);
    analogWrite(10, 0);
    analogWrite(11, SPEED);
    digitalWrite(L_EN, HIGH);
    digitalWrite(R_EN, HIGH);
  } else if (MEIREI == "LEFT") {
    analogWrite(6, SPEED);
    analogWrite(5, 0);
    analogWrite(10, 0);
    analogWrite(11, 0);
    digitalWrite(L_EN, HIGH);
    digitalWrite(R_EN, LOW);
  } else if (MEIREI == "RIGHT") {
    analogWrite(6, 0);
    analogWrite(5, 0);
    analogWrite(10, SPEED);
    analogWrite(11, 0);
    digitalWrite(L_EN, LOW);
    digitalWrite(R_EN, HIGH);
  } else if (MEIREI == "STOP") {
    digitalWrite(L_EN, LOW);
    digitalWrite(R_EN, LOW);
  }
}

// 前にしょうがい物があるときの処理
void COLLISION() {
  MEIREI = "STOP";
  COMMAND();
  delay(300);
  SPEED = SPEED_M;
  MEIREI = "BACKWARD";
  COMMAND();
  delay(1000);

  MEIREI = "STOP";
  COMMAND();
  delay(300);

  if (pre_direction == 0) {
    SPEED = SPEED_M;
     MEIREI = "RIGHT";
    pre_direction = 1;
  } else {
    SPEED = SPEED_M;
     MEIREI = "LEFT";
    pre_direction = 0;
  }
  COMMAND();
  delay(300);
}

void setup()
{
  pinMode(3, OUTPUT);
  pinMode(4, INPUT);
  pinMode(0, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(12, OUTPUT);
  SPEED_H = 150;
  SPEED_M = 100;
  SPEED_L = 64;
  L_EN = 7;
  L_FW = 6;
  L_RV = 5;
  R_EN = 12;
  R_FW = 10;
  R_RV = 11;
  analogWrite(5, 0);
  analogWrite(6, 0);
  analogWrite(10, 0);
  analogWrite(11, 0);
  digitalWrite(7, LOW);
  digitalWrite(12, LOW);
  pre_direction = 0;
}


void loop()
{

  distance = Sonic_Timing()/29/2;
  if (distance < 5) {
    COLLISION();

  } else if (distance >= 15) {
    CRUISE();
  } else {
    SAFETY();

  }

  delay(300);

}