Чтение сигналов энкодера
- Войдите на сайт для отправки комментариев
Здравствуйте уважаемые формумчане!
Прощу помощи в решении следующей задачи. Нужно считать сигналы с энкодерного диска
На диске нанесено 4800 делений. Фотодатчик (как и сам диск энкодера) был взят из принтера. К плате Arduino Nano было подключено +5V, GND, D4, D7.
От датчика приходят два сигнала с помощью которых можно определить как сам факт вращения так и его направление. Как это сделать легко понять из рисунка
Диск вращается с небольшой скоростью (до 1 оборота в секунду). По моим расчетам за один оборот при максимальной скорости нужно считать минимум 4800*4=19200 сигналов, т.е. частота входящих импульсов до 20кГц.
Обработку сигналов делаю следующим кодом:
#include "CyberLib.h" int a=0; int b=0; int l=0; int n=0; void setup() { Serial.begin(57600); Serial.println("Hello"); } void loop() { while(1){ a=D4_Read; b=D7_Read; if(a==0 && b==0)n=1; if(a==1 && b==0)n=2; if(a==1 && b==1)n=3; if(a==0 && b==1)n=4; if(l!=n)Serial.println(n); l=n; } }
При медленном вращении все отлично читается и на экране "бежит" 1234-1234... или 4321-4321... при вращинии в одну или другую сторону. Но при увеличении скорости вращения видимо пропускаются импульсы и последовательность сигналов может быть любой, например 123234-1234-124....
Возможно ли с помщью Arduino решить эту задачу и что сделать что бы при увеличении скорости импульсы не пропускались?
https://www.google.ru/?gws_rd=ssl#newwindow=1&q=%D1%8D%D0%BD%D0%BA%D0%BE%D0%B4%D0%B5%D1%80+AttachInterrupt+site:arduino.ru
http://arduino.ru/forum/apparatnye-voprosy/ispolzuem-enkoder
trembo, огромное спасибо!
Помогла библиотека:
http://www.pjrc.com/teensy/td_libs_Encoder.html
sssyura скажите что у вас получилось в итоше сделать с энкодером от принтера, у меня у такой же есть, пока на стадии подключения, сейчас ищу какойто готовый код для тестов.
trembo, огромное спасибо!
Помогла библиотека:
http://www.pjrc.com/teensy/td_libs_Encoder.html
пробовал такую библиотеку почемуто счетчик повторяет значения,
/* А вот сам скетч:
9600 маловато будет
115200 попробуйте.
И код вставьте по-нормальному
Поменял. Теперь Serial.begin(115200). Все равно не понял, сколько сигналов подал энкодер.
Что за Left, Right ? Если у вас энкодер один так и подключайте один, а то у вас как бы два, но на одинаковых ногах. Насколько я вижу оно у вас более менее работает, просто вы не успеваете выводить в Serial каждый шаг - это нормально и для рабочей программы нафиг не нужно.
>Все равно не понял, сколько сигналов подал энкодер.
Оно (имея в виду схему вместе с программой и библиотекой) не подает сигналы, а считает угол поворота в условных попугаях. Покрутите в обратную сторону чтобы убедиться, что считает и в - и в +. Если вам нужна мгновенная реакция на каждый сигнал энкодера (изменение состояния) - скорее всего обработку придется делать самому, а не библиотеку использовать (и скорее всего эта идея вообще плохая).
На энкодере два датчика: А и В, они подключены к пин 2 и 3. В зависимости от того, какой датчик сработает раньше, будет определено направление вращения.
Я так и не понял, к посчитать количество импульсов.
Serial.begin(115200)
Right = -260
Serial.begin(2000000)
Right = -16
Количество оборотов в обоих случаях одинаковое.
На энкодере два датчика: А и В, они подключены к пин 2 и 3. В зависимости от того, какой датчик сработает раньше, будет определено направление вращения.
Вы использовали пример где энкодера 2. Ваш Left - это по задумке автора примера второй полноценный энкодер, вы его вешаете на те же ноги, что и второй (Right) поэтому в вашем случае работает только последний.
Библиотека сама считает, вы только ей не мешайте постоянным выводом в порт (можно попробовать воткнуть delay). У вас энкодер как в первом посте с дохрена импульсов на обоорт ? Вы его моторчиком легко можете крутить быстрее, чем ардуина сможет переварить (до 100к импульсов в секунду) и я бы сигнал с оптопар проверил - не факт, что любая оптопара так быстро может работать.