Подключение оптического энкодера

В наше время оптические энкодеры широко используются во многих областях электроники и робототехники. Они применяются в устройствах для определения положения вала двигателя, системах управления скоростью, принтерах, станках с ЧПУ и т.д.
В этой статье мы научим контроллер работать с оптическим датчиком положения вала двигателя, что может позволить реализовать больше интересных и практичных электронных и робототехнических устройств.
Для начала соберем схему и посмотрим, как же работает этот датчик.

Подключим датчик с помощью кабеля к гнезду шилда №11, а модуль со светодиодом к гнезду №6. Таким образом, аналоговый порт А0 на датчике соединится с аналоговым портом А2 на плате, именно на А2 мы будем принимать информацию, в свою очередь цифровой порт датчика D0 соединится с цифровым пином контроллера D3. Светодиод управляется по каналу CH2, следовательно, на контроллере это будет пин 10.

#define DIG 3
#define ANALOG A2
int dig = 0;

void setup() {
  pinMode(DIG, INPUT);
  pinMode(ANALOG, INPUT);
  Serial.begin(9600);
}

void loop() {
  dig = digitalRead(DIG);
  Serial.print("A:");
  Serial.print(analogRead(ANALOG));
  Serial.print(",  D:");
  Serial.println(dig);
  delay(100);
}

Теперь будем вращать черно-белый диск и посмотрим как меняются значения в окне «Монитор порта».
Мы видим, что на черном поле аналоговый сигнал стремится к цифре 1023, при этом цифровой сигнал - к нулю. На белом поле аналоговый сигнал стремится к нулю, а цифровой - к единице.
По сути этот датчик работает как датчик линии TCRT5000. Но благодаря узкой направленности длины волны датчика, он способен засекать черно-белые границы на больших скоростях, что позволит сделать устройство наиболее точным и практичным.
Разобравшись в принципе работы оптического энкодера, мы обучим светодиодный модуль загораться на белом поле и затухать на черном.

 

#define ENCODER_PIN 3
#define LED_PIN 10
int state = 0; // переменная для чтения состояния энкодера

void setup() {
pinMode(ENCODER_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
}

void loop() {
state=digitalRead(ENCODER_PIN);
if (state == HIGH) { //Если выход энкодера в высоком логическом состоянии
digitalWrite(LED_PIN, HIGH); //включаем светодиод
}
else {
digitalWrite(LED_PIN, LOW);
}
}

Тут мы можем увидеть, как пульсирует светодиод в зависимости от скорости вращения черно-белого диска.

Задание на самостоятельное выполнение.

Установить пару оптических энкодеров на своего колесного робота и научить его выполнять повороты на углы 30, 90, 150 и 270 градусов.
Подсказка.
Есть два основных способа считывать сигнал с цифрового входа микроконтроллера: по опросу и по прерыванию. В первом случае система считывает сигнал каждый раз внутри основного цикла программы (как в данном примере). Основным недостатком этого метода является то, что трудно вести обработку других сигналов во время опроса. Но с использованием прерываний основной цикл освобождается от части кода с опросом, и система может спокойно заниматься другими делами, пока на вход не придет сигнал. При поступлении сигнала основные работы будут приостановлены, система войдет в прерывание для считывания импульса, затем выйдет, восстановив предыдущую работу. Если не хватает быстродействия системы, то лучше воспользоваться прерываниями.