Электронная гитара для токарного станка обязана иметь датчик вращения шпинделя. Многие мастерят энкодеры на станок самостоятельно, взяв за основу энкодер от цветного принтера, я же решил что для повторяемости конструкции более желательно взять уже готовый.

В моей конструкции я использовал продающийся на Алиэкспресс энкодер на 600 импульсов, с питанием от 5В. Программно можно повысить число импульсов в четыре раза! Плюс использование зубчатых шкивов 60 на шпинделе и 40 на валу энкодера дает еще 1,5 коэффициент. В сумме все должно дать 3600 импульсов на оборот, что более чем достаточно для реализации электронной гитары.



Шкив на энкодере стандартный - 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
}