думаю все таки правильно будет в этом разделе задать вопрос, можно ли с энкодером(3 пина) от мышки отслеживать угол поворота,(пусть не все 360 градусов, а каждые 15 к примеру) и не будет ли он сбиваться со временим ? (скорость допустим маленькая) а вращаться он будет при этом переменно, в одну и в другую сторону, а возник у меня этот вопрос исходя из способа отслеживания через 2 пина… я что то не уверен…
и если он все таки будет сбиваться, то почему ? код думаю не нужен…
В мышке же это работает. Энкодеру все равно, кто его сигналы читает - контроллер мыши или ваш самодельный. Тут как раз вопрос интереснее про код. Аппаратная часть проверена сотнями тысяч копий и часов наработки.
спс, как оказалось надо поправку делать на 1 градус при обратном вращении, + несмотря на то что провода сидят плотно, при вращении иногда отходили…
p.s. вдохновение черпаю иногда из заказов из сети, увидел объявление, написал, сказал 30к, а они нет спасибо)))
жаба душит код выложить, что бы не достался им)))
если что могу скинуть в личку, сделал подсчет оборотов полных, их сторону вращения, указание положение в градусах, и подсчет скорости, вроде работает
Чем? Там такой же механический энкодер, как и в EC11.
а насколько из мышки будет точнее ?)))
void encoderISR() {
static uint8_t lastState = 0;
uint8_t clk = digitalRead(CLK_PIN);
uint8_t data = digitalRead(DATA_PIN);
uint8_t currentState = (clk << 1) | data;
switch (lastState) {
case 0: if (currentState == 2) position--; else if (currentState == 1) position++; break;
case 1: if (currentState == 0) position--; else if (currentState == 3) position++; break;
case 2: if (currentState == 3) position--; else if (currentState == 0) position++; break;
case 3: if (currentState == 1) position--; else if (currentState == 2) position++; break;
}
lastState = currentState;
}
uint8_t currentState = (clk << 1) | data;
// Создает 4 возможных состояния:
// 0: CLK=0, DATA=0
// 1: CLK=0, DATA=1
// 2: CLK=1, DATA=0
// 3: CLK=1, DATA=1
Физические импульсы: 48 на оборот
Изменений состояния: 48 × 4 = 192 на оборот
Фактическая точность: 360° / 192 = 1.875° на шаг
но это все же не точно, потому что у меня изменение по 8 градусов показывается)))(а если быть точнее то иногда 7, иногда 15 градусов из 360 показывает, но я еще долго не сидел с кодом что бы максимальную точность получить) при значении 48 импульсов на оборот)))
помнится я даже тему читал, того кто собирал на EC11 но нечего не помню…
p.s. мышка самая дешевая за 100 руб. примерно
мне теперь стало интересно на этом энкодере я больше не могу точность получить ?)))
и правильно я подсчитываю количество импульсов ?
// Энкодер - тест точности угла на полный оборот
const int CLK_PIN = 2;
const int DATA_PIN = 3;
volatile long position = 0;
long lastPosition = 0;
const int PULSES_PER_REVOLUTION = 48;
// Переменные для теста
long startPosition = 0;
int revolutionCount = 0;
bool testStarted = false;
float totalAngle = 0;
void setup() {
Serial.begin(9600);
pinMode(CLK_PIN, INPUT_PULLUP);
pinMode(DATA_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(CLK_PIN), encoderISR, CHANGE);
attachInterrupt(digitalPinToInterrupt(DATA_PIN), encoderISR, CHANGE);
Serial.println("ТЕСТ ТОЧНОСТИ УГЛА НА ПОЛНЫЙ ОБОРОТ");
Serial.println("===================================");
Serial.println("Покрутите энкодер на 1 полный оборот");
Serial.println("Тест начнется автоматически при движении");
Serial.println();
}
void encoderISR() {
static uint8_t lastState = 0;
uint8_t clk = digitalRead(CLK_PIN);
uint8_t data = digitalRead(DATA_PIN);
uint8_t currentState = (clk << 1) | data;
switch (lastState) {
case 0: if (currentState == 2) position--; else if (currentState == 1) position++; break;
case 1: if (currentState == 0) position--; else if (currentState == 3) position++; break;
case 2: if (currentState == 3) position--; else if (currentState == 0) position++; break;
case 3: if (currentState == 1) position--; else if (currentState == 2) position++; break;
}
lastState = currentState;
}
void loop() {
// Автоматический старт теста при движении
if (!testStarted && position != 0) {
testStarted = true;
startPosition = position;
Serial.println("ТЕСТ НАЧАТ!");
Serial.println("Покрутите энкодер на 1 полный оборот (360°)");
Serial.println("===========================================");
}
if (testStarted) {
// Расчет текущего угла
int pulsesFromZero = position % PULSES_PER_REVOLUTION;
if (pulsesFromZero < 0) {
pulsesFromZero += PULSES_PER_REVOLUTION;
}
float currentAngle = (pulsesFromZero * 360.0) / PULSES_PER_REVOLUTION;
// Расчет пройденного угла с начала теста
long positionDelta = position - startPosition;
float actualAngle = (positionDelta * 360.0) / PULSES_PER_REVOLUTION;
// Подсчет полных оборотов
int currentRevolutions = positionDelta / PULSES_PER_REVOLUTION;
// Вывод информации
Serial.print("Позиция: ");
Serial.print(position);
Serial.print(" | Текущий угол: ");
Serial.print(currentAngle, 1);
Serial.print("° | Пройдено угла: ");
Serial.print(actualAngle, 1);
Serial.print("° | Обороты: ");
Serial.print(currentRevolutions);
// Проверка завершения полного оборота
if (abs(currentRevolutions) >= 1 && revolutionCount == 0) {
revolutionCount = currentRevolutions;
Serial.println();
Serial.println("===========================================");
Serial.println("ПОЛНЫЙ ОБОРОТ ЗАВЕРШЕН!");
Serial.print("Теоретический угол: 360.0°");
Serial.print(" | Реальный угол: ");
Serial.print(actualAngle, 1);
Serial.println("°");
Serial.print("Погрешность: ");
Serial.print(abs(360.0 - abs(actualAngle)), 1);
Serial.println("°");
Serial.print("Импульсов за оборот: ");
Serial.println(abs(positionDelta));
Serial.println("===========================================");
}
// Сброс теста после 2 оборотов
if (abs(currentRevolutions) >= 2) {
Serial.println();
Serial.println("ТЕСТ ЗАВЕРШЕН! Перезагрузите для повторного теста.");
while(1) { delay(1000); } // Бесконечный цикл
}
}
lastPosition = position;
delay(100);
}
Вопрос какой то некорректный.
Как то же выцеливали пиксели играя на шариковых мышах.
Значит с точностью там все в порядке.
Другое дело, если речь идёт про колесо прокрутки.
А вообще есть разница ?
Посмотрел на свою картинку вдумчиво.
В общем: редуктор и поправка на люфт, спасут отца русской демократии.
Вот прямо в ТЗ был энкодер от этой мышки?
В геймерских или предназначеных для конструкторов может быть энкодер точнее?
А если задачу перевести в академический интерес, то можно добиться высокой точности поставив на вал энкодера пару своих датчиков типа
Точность задается колесом с маской (количество зубъев), т.е. его радиусом.

Где вы такие мышки нашли? Их лет 20+ не выпускают…
я про колесико, а там точнее датчик ? и он односоставной или нет?)) надо будет загуглить…
нет ТЗ меня просто подтолкнуло на то что собрать, еще мышки есть, их надо просто курочить… а точность не известна будет лучше или нет, сильно дорогих мышек нет точно, как и желания тратить 5к на энкодер точный, отдельным модулем)))
надо мной просто ии издевается, я ему а точность позиции можно получить точнее ?
он мне конечно, там аж 192 позиции, я ему сделай, а он мне вы правы 48 импульсов у вас и точнее не сделать)))
спс может так заморочусь….
с шариком кстате погуглю, ps2, их везде много https://www.ozon.ru/product/mysh-mehanicheskaya-sharikovaya-ps-2-drayvera-na-diskete-2148833503
вроде та… более того эти те мышки которые у меня живут в 5 раз дольше
а отсутствие разъема не проблема https://www.ozon.ru/product/perehodnik-usb-2-0-ps2-shteker-gnezdo-mysh-i-klaviatura-1sht-1738351531
Точность энкодера определяется числом зубьев на колесе. Размер зуба - полем зрения датчика. Если энкодером мыши со штатным колесом получается определить, ну, 48 сдвигов на оборот, то сделав огромную шестерню зубьев на 360, получим точность в градус. Нужно больше - больше радиус (что для поворотной платформы сделать реально).
Я пример датчика привел - 30р. Для самодельного энкодера надо 2.
Но точнее - взять оптическую мышь, разобраться с ее сенсором и ловить перемещения от него. Сенсор направить на поворотное колесо. Точности зашибенные, особенно от профмышей.
А редукторы люфт дают, не то. Люфт будет больше точности.
честно говоря это долго, и заморочено… а мне больше с кодом хотелось посидеть…
но все равно спс за способ, как вариант наверное можно сделать…
модулей таких много, и тахометры собирали… https://robotclass.ru/tutorials/arduino-tacho-irq/
кстате а зачем вы сокращаете ссылки ?))) я сам не сокращаю специально, что бы показать что там нет скрытой гадости))) ну типа скрытого перехода который отслеживает ип…
есть еще вариант с mpu6050, а скорее с 9250 что бы не сбивался…(esp32 с батарейкой и датчиком прицепить на вращающуюся платформу) зато меньше механики!))) а точность сказать не могу, еще бы хотелось узнать точность EC11 там вроде аж 30 градусов будет…
и в целом с помощью кода как я понял все таки не получить точность больше…
Как-то на автомате жму на алике поделиться и он копирует в буфер уже сокращенную.
Я тут по случаю обзавелся для игр с лепестковым анемометром магнитным датчиком поворота, у него АЦП на 12 бит, это 360/4096 градусов точность по дискретизации. Как себя покажет в работе - не знаю.
А поделитесь, если не секрет, для какой задачи требуется такое определение угла поворота? Может родится идея по решению чуть другими средствами. Просто “определение угла поворота платформы“ - это не задача. Нужны габариты, тип привода, скорость и диапазон вращения, что установлено на платформе и для чего. И есть ли обратная связь по еще какому каналу (типа достижение лучшего сигнала или освещения). Возможно, что достаточно грубого определения позиции (или контрольных точек), а затем доворот шаговиком через червяк - а там офигенная точность, если убрать люфт.
На колесе понижающий редуктор стоит(колесо диаметром больше чем шестерня).
А вот на перемещении шариковой мыши, стоит повышающий редуктор.
Шарик с коэффициентом 1:1(мм прошли на мм по радиусу повернули шар), который повернул на тот же градус по радиусу ось тонкую, а шестерня, которая на много толще этой оси повернулась на тот же градус. сколько там прошо импульсов это уже надо смотреть по механике шестерни.
Условно, диаметр вала который вращается шариком 3мм. Длина окружности вала 9.42мм.
Т е. При перемещении мыши на 9.42мм имеем полный оборот шестерни.
по большей части от скуки, не могу просто сидеть за пк и нечего не делать, а сидеть надо))
ну и так же собрать иногда что то хочется…
а так же для себя инструмент, что бы если что быстро собрать… и делать все что нужно
для всего))) для какой то автоматизации при производстве, возможно кран какой то потребуется собрать, и что то разливать, или вовсе поворачивать механизм, для приема чего то с одной стороны, а потом с противоположной, возможно и на станке чпу что то придется подсчитывать… или вовсе настраивать кому то без поездки к ним, и вникание в габариты…
а так же как следствие уже видел давно заказ на фрилансе,(на хабре еще) там надо было отслеживать точное положение вентилей, + добавить автоматизацию, что бы понимать сколько раз сдвинули в ту или иную сторону, что бы понимать сколько оборотов надо сделать до открытия - закрытия… а так же делать автоматизацию, что бы не бегать если что в ручную не крутить… но сумма была не та))) и контакты не сохранял, но мало ли проект появится с хорошей оплатой…
разобрался как извлечь ссылку))) когда не знаешь что собрать, надо смотреть заказы в сети
https://vk.com/video-97877471_456247757
вот его текстовое описание к видео
Нужно написать несложный но грамотный скейч. Есть ардуинка оптический датчик дисплей видно на видео. Хочу чтоб
1строчка считала витки к примеру до 10000 потом автоматическое обнуление, также считала витки в плюс а в обратную сторону в минус, тоесть надо правильно насверлить отверстия я так понимаю типа принцип инкодора. Хотелось бы узнать вобще реально так сделать??? Если да то как??? Да шпиндель крутится до 3000 примерно
2строчка тахометр чтоб работал в обе стороны.
“3 корованы грабить“
Стиль указывает сразу на направление в сторону ведра.
А дядьке надо просто направление вращения и частоту просекать. Это энкодер на два зуба на круг. Поскольку ему недооборот не требуется. С его аппаратурой (один датчик) это не реализуется. Требуется доработка станка. Пусть доработает, потом уже программу писать.
На его станке можно только сделать частотомер и абсолютный подсчет оборотов (без учета направления). Но с него распиновка подключений, характеристики датчика. Ну да, денег стоит - много возни вокруг копеечной задачи.
Высоких точностей в описанных вами задачах не требуется. Многие случаи решаются калибровкой - крайнее положение и шаги привода. По сути энкодер вам тоже не дает абсолютного положения, а значит по перезапуску надо калиброваться точно так же как с шаговиком.
Сложности точного перемещения в случае привода не шаговым двигателем, с проскальзыванием, линейным приводом (гидравлика, к примеру).
Но везде “мышиной“ точности должно хватать. Если устройство прецизионное, то и цена на позиционер обоснована. А тут в ход идут другие датчики и приемы.
Я так делал для поворотной антенны: концевики на датчиках Холла и мех. энкодер копеечный 12 позиций на оборот. Всё ОК.. но! врубаю передачу в антенну, 50 Вт и у процессора антенного сносит крышу )) ну и импульсов на оборот маловато.
