Проект 17. Мотор с сенсорным управлением

Используя линейку датчиков освещённости в качестве сенсора, мы сделаем мотор с сенсорным управлением: проводя рукой в определённую сторону, мы можем задавать скорость вращения.

Оборудование:

(new) LineArray

DC мотор

Программирование:

Последовательный сбор данных

Работа с датчиками

Практика

Напишите программу, которая распознаёт жесты. Если провести рукой по датчикам слева направо - скорость мотора увеличивается на 15. Если справа налево - скорость мотора уменьшается 20.

Дополнительное задание

Дополните программу: при проведении двумя пальцами от краев к центру мотор должен остановиться. При проведении от центра к краям мотор должен включаться на максимальную скорость.

Решение

Мы рекомендуем сначала освоить материал и попробовать сделать программу самостоятельно! А потом проверить себя, посмотрев наш вариант решения:

#include <Eryoma.h>
Eryoma eryoma;

#define max_level 60

int sensor[8] = {0, 0, 0, 0, 0, 0, 0, 0};
int count = 1;
int speed_motor = 0;
boolean flag = false;
void setup() {
  eryoma.setupConnector(ePort6, LineArray);
  Serial.begin(9600);
}

void loop() {
  for (int i = 0; i < 8; i++) {
    if (eryoma.read(ePort6, i) < max_level && !sensor[i]) {
      sensor[i] = count;
      count++;
      Serial.print("Sensor ");
      Serial.println(i);
    }
  }
  if (count == 9) {
    if ((sensor[0] > sensor[1]) && (sensor[1] > sensor[2]) && (sensor[2] > sensor[3]) && (sensor[3] > sensor[4]) && (sensor[4] > sensor[5]) && (sensor[5] > sensor[6]) && (sensor[6] > sensor[7])) {
      speed_motor -= 15;
      Serial.println("right");
    } else {
      if ((sensor[0] < sensor[1]) && (sensor[1] < sensor[2]) && (sensor[2] < sensor[3]) && (sensor[3] < sensor[4]) && (sensor[4] < sensor[5]) && (sensor[5] < sensor[6]) && (sensor[6] < sensor[7])) {
        speed_motor += 15;
        Serial.println("left");
      }
    }
    for (int i = 0; i < 8; i++) {
      Serial.print(sensor[i]);
      Serial.print(" || ");
    }
    Serial.println();
    for (int i = 0; i < 8; i++) {
      sensor[i] = 0;
      count = 1;
    }
    Serial.println("Clear ");
    while (eryoma.read(ePort6, 0) < 100 || eryoma.read(ePort6, 1) < 100 || eryoma.read(ePort6, 2) < 100 || eryoma.read(ePort6, 3) < 100 || eryoma.read(ePort6, 4) < 100 || eryoma.read(ePort6, 5) < 100 || eryoma.read(ePort6, 6) < 100 || eryoma.read(ePort6, 7) < 100) {}
  }
  eryoma.setMotorSpeed(A, speed_motor);
}

#include <Eryoma.h>
Eryoma eryoma;

#define max_level 60

int sensor[8] = {0, 0, 0, 0, 0, 0, 0, 0};
int count = 1;
int speed_motor = 0;
boolean flag = false;
void setup() {
  eryoma.setupConnector(ePort6, LineArray);
  Serial.begin(9600);
}

void loop() {
  for (int i = 0; i < 8; i++) {
    if (eryoma.read(ePort6, i) < max_level && !sensor[i]) {
      sensor[i] = count;
      count++;
      Serial.print("Sensor ");
      Serial.println(i);
    }
  }
  if (count == 9) {
    if ((sensor[0] > sensor[1]) && (sensor[1] > sensor[2]) && (sensor[2] > sensor[3]) && (sensor[3] > sensor[4]) && (sensor[4] > sensor[5]) && (sensor[5] > sensor[6]) && (sensor[6] > sensor[7])) {
      speed_motor -= 15;
      Serial.println("right");
    } else {
      if ((sensor[0] < sensor[1]) && (sensor[1] < sensor[2]) && (sensor[2] < sensor[3]) && (sensor[3] < sensor[4]) && (sensor[4] < sensor[5]) && (sensor[5] < sensor[6]) && (sensor[6] < sensor[7])) {
        speed_motor += 15;
        Serial.println("left");
      } else {
        if ((sensor[0] < sensor[1]) && (sensor[1] < sensor[2]) && (sensor[2] < sensor[3]) && (sensor[4] > sensor[5]) && (sensor[5] > sensor[6]) && (sensor[6] > sensor[7])) {
          speed_motor = 0;
          Serial.println("center");
        }
      }
    }
    for (int i = 0; i < 8; i++) {
      Serial.print(sensor[i]);
      Serial.print(" || ");
    }
    Serial.println();
    for (int i = 0; i < 8; i++) {
      sensor[i] = 0;
      count = 1;
    }
    Serial.println("Clear ");
    while (eryoma.read(ePort6, 0) < 100 || eryoma.read(ePort6, 1) < 100 || eryoma.read(ePort6, 2) < 100 || eryoma.read(ePort6, 3) < 100 || eryoma.read(ePort6, 4) < 100 || eryoma.read(ePort6, 5) < 100 || eryoma.read(ePort6, 6) < 100 || eryoma.read(ePort6, 7) < 100) {}
  }
  eryoma.setMotorSpeed(A, speed_motor);
}