Проект 15. Рассерженный моторчик

В этом проекте мы научимся работать с обычными моторами: управлять их скоростью и направлением движения. А ещё мы сделаем управление мотором с помощью хлопков в ладоши: определённое количество хлопков будут задавать направление вращения или выключать мотор.

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

(new) DC мотор

(new) Датчик звука

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

Арифметические операции

Функция map()

Практика

Поэкспериментируйте со скоростью вращения мотора. Выполните вычисление среднего значения громкости так, как было на прошлом уроке. Сделайте программу, которая чем громче звук в помещении, тем быстрее крутит мотор.

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

Сделайте управляемый хлопками мотор. Один хлопок в ладоши - включить мотор. Два хлопка - выключить. Три хлопка - изменить направление вращения и включить мотор.

Решение

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

#include <Eryoma.h>
Eryoma eryoma;

long volume = 0;
void setup() {
  eryoma.setupConnector(ePort6, Microphone);
  for (int i = 0; i < 100; i++) {
    volume += eryoma.read(ePort6);
    delay(10);
  }
  volume /= 100;
}

void loop() {
  int volume_now =  eryoma.read(ePort6);
  volume_now = abs(volume - volume_now);
  int speed_motor = map(volume_now, 0, 1024 - volume_now, 0, 255);
  eryoma.setMotorSpeed(A, speed_motor);
  delay(1);
}

#include <Eryoma.h>
Eryoma eryoma;

long volume = 0;
int clap = 0;
unsigned long last_time;
boolean flag = false;
boolean motor_direction = false;
void setup() {
  eryoma.setupConnector(ePort6, Microphone);
  Serial.begin(9600);
  for (int i = 0; i < 100; i++) {
    volume += eryoma.read(ePort6);
    delay(10);
  }
  volume /= 100;
}

void loop() {
  int volume_now = eryoma.read(ePort6);
  volume_now = abs(volume - volume_now);
  if (volume_now > 70) {
    clap = 0;
    Serial.println("clap1");
    clap++;
    delay(200);
    last_time = millis();
    while ((millis() - last_time) < 500) {
      volume_now = eryoma.read(ePort6);
      volume_now = abs(volume - volume_now);
      if (volume_now > 70) {
        clap++;
        Serial.println("clap2");
        delay(200);
        last_time = millis();
        while ((millis() - last_time) < 500) {
          volume_now =  eryoma.read(ePort6);
          volume_now = abs(volume_now - volume);
          if (volume_now > 70) {
            clap++;
            Serial.println("clap3");
            break;
          }
        }
        break;
      }
    }
    delay(200);
    flag = true;
  }
  if (flag) {
    if (clap == 1) {
      eryoma.setMotorSpeed(A, 255);
    } else {
      if (clap == 2) {
        eryoma.setMotorSpeed(A, 0);
      } else {
        if (clap == 3) {
          motor_direction = !motor_direction;
          if (motor_direction) {
            eryoma.setMotorSpeed(A, 255);
          } else {
            eryoma.setMotorSpeed(A, -255);
          }
        }
      }
    }
    flag = false;
  }
  Serial.println(clap);
}