Відповідь на Электронная гитара для Paulimot 190-V (Arduino)

Gnevko
Автор: Gnevko,
Панове! Первым из поднебесной приехал энкодер в виде маховика. Теперь, покрутив его в руках, можно и поподробнее о нем рассказать.     1) Физические свойства. Крутится условно легко, присутствует фиксация на каждом делении. А вот сила этой фиксации достаточно высока. Если пытаться провернуть энкодер на одно деление, держась только за маленькую рукоятку, то у вас скорее всего ничего не получится - по инерции вы его провернете на 4-5 делений. Если же поворачивать энкодер за большое колесо, то никаких проблем с позиционированием не наблюдается. На счет того, механика внутри или оптика - то мне это так и не удалось выяснить. Если кто знает, как такую штуку разобрать (а потом еще и собрать обратно), то поделитесь информацией.    2) Шкала. Обратите внимание в какую сторону идет увеличение разметки на шкале. Если крутить энкодер против часовой стрелки, то значения будут уменьшаться, в то время как на маховике суппорта они возрастают. Это весьма не приятно и прийдется немного привыкнуть. Так что если вы будете покупать такую штуку - обратите на это особое внимание! В остальном шкала очень хорошо читается и нареканий не вызывает.   3) Подключение к Ардуино. Как и у всех энкодеров "кругового" типа, у этого имеются следующие контакты: Vcc, 0V, А и B. Если с Vcc, 0V более или менее понятно: Vcc - +5V, Vcc - Gnd, то о выводах A и B можно почитать, например, вот тут - http://mypractic.ru/urok-55-rabota-s-inkrementalnym-enkoderom-v-arduino-biblioteka-encod_er-h.html. Для считывания абсолютного положения энкодера на просторах инета была найдена весьма не плохая библиотека:    https://github.com/PaulStoffregen/Encoder   Работает на прерываниях, проста и понятна в использовании и в общем то разрабатывалась для использования на платформе Teensy, но слава богу и на Меге работает так же без проблем. Так или иначе я так и не смог добиться от нее хотя бы одного пропуска счетчика, с какой бы скоростью я энкодер не вращал (при испытаниях была использована только рука  ). Пример использования:   #define ENCODER_OPTIMIZE_INTERRUPTS #include <Encoder.h> #define Z_HANDWHEEL_A 19 #define Z_HANDWHEEL_B 18 Encoder zHandwheel(Z_HANDWHEEL_B, Z_HANDWHEEL_A); void setup() { } void loop() { long zHandWheelCounter = zHandwheel.read(); if (zHandWheelOldCounter != zHandWheelCounter) { // делаем что то полезное zHandWheelOldCounter = zHandWheelCounter; } } Здесь стоит упомянуть, что при повороте энкодера на одну позицию, библиотека увеличивает (или уменьшает, в зависимости от направления вращения) счетчик на 4 пункта, причем делает это "плавно": есть если повернуть энкодер на пол позиции, то вы получите 2 пункта и так далее.   4) Управление шаговым двигателем. Итак, предположим, что одна позиция энкодера соответствует изменению позиции суппорта на 0.1 мм, а полный оборот, соответственно, на 1 см. В этом случае на 0,1 мм подвижки суппорта получим увеличение счетчика энкодера на 4 пункта, или 0.025 мм на 1 пункт.  При разрешении шагового двигателя в 3200 микрошага на один оборот и шага резьбы винта подачи суппорта в 2 мм, получаем, что один микрошаг шагового двигателя соответствует 2мм / 3200 = 0.000625 мм. Таким образом, на один пункт энкодера нужно сделать 0.025 / 0.000625 = 40 микрошагов или 160 микрошагов на одно целое деление энкодера.   zHandWheelCounter = zHandwheel.read(); if (zHandWheelOldCounter != zHandWheelCounter) { float distance = zHandWheelCounter * 0.25; // так как на одно деление энкодера приходится увеличение позиции на 4 float realDistance = distance * zHandwheelFactor; //где zHandwheelFactor == 0.1 long fStepsToGo = realDistance / mmPerZStep; // где mmPerZStep == 0.000625 gZStepper.moveTo(fStepsToGo); // смело шагаем } zHandWheelOldCounter = zHandWheelCounter;   И  вот тут начинается самое интересное: с какой скоростью делать эти 160 шагов? и как эту скорость вычислять?   Если делать медленно, скажем 200 микросекунды между шагами - то при быстром вращении энкодера прийдется ждать окончания вращения двигателя - он будет не успевать за вами и кол-во шагов, которые нужно делать, будет постоянно возрастать. Если сделать 40 микросекунд - то проявляется обратный эффект - шаговый двигатель, вследствие механических пауз при медленном вращении энкодера, так же начинает делать паузы, так как успевает сделать 160 шагов быстрее, чем вы рукой преодолеете сопротивление "трещетки" для поворота на еще одно деление.    Так же встает вопрос об ускорении и торможении.   ЗЫ: библиотеку AccelStepper пришлось отправить в топку, но это уже другая история...