Проект 18. Счётчик оборотов

В этом проекте мы разработаем небольшой датчик, который позволит нам подсчитать, сколько оборотов выполнил мотор, и при необходимости вращать мотором определённое количество оборотов.

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

LineArray

DC мотор

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

Устройство и программирование датчика оборотов

Практика

Прикрепите на мотор круг, с нанесёнными на него черными и белыми сегментами. Над кругом прикрепите 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);
}