В этом проекте мы научимся работать с обычными моторами: управлять их скоростью и направлением движения. А ещё мы сделаем управление мотором с помощью хлопков в ладоши: определённое количество хлопков будут задавать направление вращения или выключать мотор.
Поэкспериментируйте со скоростью вращения мотора.
Выполните вычисление среднего значения громкости так, как было на прошлом уроке. Сделайте программу, которая чем громче звук в помещении, тем быстрее крутит мотор.
Сделайте управляемый хлопками мотор. Один хлопок в ладоши - включить мотор. Два хлопка - выключить. Три хлопка - изменить направление вращения и включить мотор.
Мы рекомендуем сначала освоить материал и попробовать сделать программу самостоятельно! А потом проверить себя, посмотрев наш вариант решения:
#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);
}