В моей конструкции я использовал продающийся на Алиэкспресс энкодер на 600 импульсов, с питанием от 5В. Программно можно повысить число импульсов в четыре раза! Плюс использование зубчатых шкивов 60 на шпинделе и 40 на валу энкодера дает еще 1,5 коэффициент. В сумме все должно дать 3600 импульсов на оборот, что более чем достаточно для реализации электронной гитары.
Шкив на энкодере стандартный - 40 зубов. Шкив на шпиндель пришлось дорабатывать, стандартный 60-ти зубный шкив по диаметру как раз подошел, пришлось только проточить внутренний диаметр для посадки на шпиндель, да уменьшить размер проставки, я не стал портить родную проставку, а из куска трубы выточил новую. Ремень 280мм.
Шкив на энкодере стандартный - 40 зубов. Шкив на шпиндель пришлось дорабатывать, стандартный 60-ти зубный шкив по диаметру как раз подошел, пришлось только проточить внутренний диаметр для посадки на шпиндель, да уменьшить размер проставки, я не стал портить родную проставку, а из куска трубы выточил новую. Ремень 280мм.
Схема соединений тестовой версии железа. Подтягивающие резисторы на выводы не используем, подтягиваем программно!
Энкодер показан схематично, цвета проводов правильные. В качестве индикатора работы выбран 4-х цифровой 7-ми сегментный индикатор на базе микросхемы TM1637.
Код показан ниже.
/*
тестовая программа для определения числа прерываний от энкодера на оборот шпинделя
в моем случае энкодер на 600 импульсов, шестерни на шпинделе 60, энкодер 40,
коэфициент передачи - 1,5
программа учетверяет число импульсов, в результате получаем 600 * 1,5 * 4 = 3600 вызовов обработчика прерывания
*/
#define CLK 19
#define DIO 18
#include "TM1637.h"
TM1637 disp(CLK, DIO);
int num1 = 100;
int encoderPin1 = 2;
int encoderPin2 = 3;
volatile int lastEncoded = 0;
volatile long encoderValue = 0;
long lastencoderValue = 0;
int lastMSB = 0;
int lastLSB = 0;
void setup() {
disp.clear();
disp.brightness(2); // яркость минимум =0, стандарт=2, максимум=7)
// Serial.begin (9600);
pinMode(encoderPin1, INPUT_PULLUP);
pinMode(encoderPin2, INPUT_PULLUP);
digitalWrite(encoderPin1, HIGH); //turn pullup resistor on
digitalWrite(encoderPin2, HIGH); //turn pullup resistor on
//call updateEncoder() when any high/low changed seen
//on interrupt 0 (pin 2), or interrupt 1 (pin 3)
attachInterrupt(0, updateEncoder, CHANGE);
attachInterrupt(1, updateEncoder, CHANGE);
}
void loop(){
//Do stuff here
disp.displayInt(encoderValue);
//Serial.println(encoderValue);
delay(200); //just here to slow down the output, and show it will work even during a delay
}
void updateEncoder(){
int MSB = digitalRead(encoderPin1); //MSB = most significant bit
int LSB = digitalRead(encoderPin2); //LSB = least significant bit
int encoded = (MSB << 1) |LSB; //converting the 2 pin value to single number
int sum = (lastEncoded << 2) | encoded; //adding it to the previous encoded value
if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue ++;
if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue --;
lastEncoded = encoded; //store this value for next time
}
2 Комментарии
Добрый день! Очень понравилась идея. А нет случайно адресов с алика для заказа шкивов, ремня и энкодера?
ОтветитьУдалитьКак правило пока товар доходит у продавца он уже кончается :(
УдалитьНу еще и у меня оно некоторое время лежит, ждет вдохновения :)
Отправить комментарий