Проект 18. Счётчик оборотов
В этом проекте мы разработаем небольшой датчик, который позволит нам подсчитать, сколько оборотов выполнил мотор, и при необходимости вращать мотором определённое количество оборотов.
Программирование:
Устройство и программирование датчика оборотов
Практика
Прикрепите на мотор круг, с нанесёнными на него черными и белыми сегментами. Над кругом прикрепите LineArray, так чтобы одной из оптопар массив мог считывать цвет сегмента.
Реализуйте подсчёт количества пройденных сегментов и вывод в COM-порт.
Добавьте кроме вывода количества пройденных сегментов вывод числа пройденных мотором полных оборотов.
Дополнительное задание
Реализуйте функцию, которая будет вращать мотор на заданное количество шагов, (остановить в заданной точке). Подумайте как останавливать мотор более точно, без лишнего прокручивания.
Решение
Мы рекомендуем сначала освоить материал и попробовать сделать программу самостоятельно! А потом проверить себя, посмотрев наш вариант решения:
Основная программа
#include <Eryoma.h>
Eryoma eryoma;
#define max_level 100
boolean sensor_value;
boolean last_value;
unsigned int step_motor = 0;
void setup() {
eryoma.setupConnector(ePort6, LineArray);
Serial.begin(9600);
if (eryoma.read(ePort6, 0) < max_level) {
last_value = true; //белый
} else {
last_value = false; //чёрный
}
eryoma.setMotorSpeed(A, 150);
}
void loop() {
if (eryoma.read(ePort6, 0) < max_level) {
sensor_value = true; //белый
} else {
sensor_value = false; //чёрный
}
if (sensor_value != last_value) {
step_motor++;
last_value = !last_value;
Serial.print("turns: ");
Serial.println(step_motor / 4);
Serial.print("steps: ");
Serial.println(step_motor);
}
}
Дополнительное задание
#include <Eryoma.h>
Eryoma eryoma;
#define max_level 100
boolean sensor_value;
boolean last_value;
void setup() {
eryoma.setupConnector(ePort6, LineArray);
Serial.begin(9600);
if (eryoma.read(ePort6, 0) < max_level) {
last_value = true; //белый
} else {
last_value = false; //чёрный
}
}
void loop() {
go_motor(50);
delay(5000);
}
void go_motor(unsigned int _step) {
unsigned int step_motor = 0;
eryoma.setMotorSpeed(A, 150);
while (step_motor < _step) {
if (eryoma.read(ePort6, 0) < max_level) {
sensor_value = true; //белый
} else {
sensor_value = false; //чёрный
}
if (sensor_value != last_value) {
step_motor++;
last_value = !last_value;
Serial.println(step_motor);
}
}
eryoma.setMotorSpeed(A, -255);
delay(50);
eryoma.setMotorSpeed(A, 0);
}