23 подписчика

Переделываем моторчик от HDD в энкодер Ардуино

Продолжение статьи https://dzen.ru/a/ZcYgIifcYBZnCEyd  в которой рассматривался моторчик с 3 выходами.

Продолжение статьи https://dzen.ru/a/ZcYgIifcYBZnCEyd в которой рассматривался моторчик с 3 выходами. Теперь рассмотрим моторчик с другой топологией с 4 выходами

Продолжение статьи https://dzen.ru/a/ZcYgIifcYBZnCEyd  в которой рассматривался моторчик с 3 выходами.-2

В большинстве случаев обмотки соединяются «звездой», как показано на схеме. Три выхода и четвертый центральный общий (по середине). Чтобы найти этот общий выход, нужно проверить сопротивление между каждым выходом. У того выхода, у которого будет одинаковое сопротивление с остальными тремя и будет общим

Схема

Из такого моторчика сделаем энкодер. Крутим мотор в одну сторону изменяется значение в положительную сторону, в обратную – в отрицательную. Считывать показания будем с помощью Arduino Nano. Собираем схему на двух операционных усилителях LM358

Продолжение статьи https://dzen.ru/a/ZcYgIifcYBZnCEyd  в которой рассматривался моторчик с 3 выходами.-3

Красным выделен общий выход на моторчике. Слева выходы Ардуино. На макетной плате выглядит так

Продолжение статьи https://dzen.ru/a/ZcYgIifcYBZnCEyd  в которой рассматривался моторчик с 3 выходами.-4

Скетч на Ардуино

//задаем пины подключения
#define L1 3
#define L2 4
#define L3 5

//когда срабатывает прерывание
bool L1Puls = 0;

void setup() {
Serial.begin(9600);
//пин для обработки прерывания
pinMode(L1,INPUT_PULLUP);
//пины для обработки сигналов с оставшихся выходов
pinMode(L2,INPUT);
pinMode(L3,INPUT);
//создание обработчика прерывания
attachInterrupt(digitalPinToInterrupt(L1), isr1, RISING);
}
//код прерывания на пине L1
volatile uint32_t n;
void isr1(){
//если не обрабатывается прошлое прерывание и прошло 100 мсек то выполняется код
if((L1Puls == 0)&&(millis() - n >100)){
n = millis();
L1Puls = 1;
}
}

void loop() {
//если сработало прерывание на L1
if(L1Puls == 1){
//и есть сигнал от пина L2 то +
if(digitalRead(L2) == HIGH){
Serial.println('+');
}
//и есть сигнал от пина L3 то -
if(digitalRead(L3) == HIGH){
Serial.println('-');
}
L1Puls = 0;
}
}

Принцип работы. Чтобы постоянно не считывался сигнал, обрабатывается только прерывание с пина L1 (на рис А). Если прерывание произошло, то проверяются пины L2 (B) и L3 (C). И в зависимости от их состояние принимается решение, куда поворачивается моторчик, налево или направо.

Тест

Для теста спаиваем схему. Вид с разных сторон

Продолжение статьи https://dzen.ru/a/ZcYgIifcYBZnCEyd  в которой рассматривался моторчик с 3 выходами.-5

Подключим энкодер к ноубуку. Пример подключения возьмем из статьи https://dzen.ru/a/Zd69BvyXemTLXzLU Собираем

Продолжение статьи https://dzen.ru/a/ZcYgIifcYBZnCEyd  в которой рассматривался моторчик с 3 выходами.-6

Тест

Продолжение статьи https://dzen.ru/a/ZcYgIifcYBZnCEyd  в которой рассматривался моторчик с 3 выходами.-7

Ссылки

Исходники - https://disk.yandex.ru/d/keGpmaMJlKVTUA