Re: Управление при помощи поворотного энкодера (Rotary Encoder)
например мы садим энкодеры на каналы 2,3 и 4,5
поправьте плз
PHP код:
void loop()
{
if(digitalRead(2)==HIGH){
bytes[0]=25;
Serial.write( bytes,2);
bytes[0]=0;
}else{
bytes[0]=5;
Serial.write( bytes,2);
bytes[0]=0;
}
if(digitalRead(3)==HIGH){
bytes[0]=5;
Serial.write( bytes,2);
bytes[0]=0;
}else{
bytes[0]=25;
Serial.write( bytes,2);
bytes[0]=0;
}
if(digitalRead(4)==HIGH){
bytes[0]=35;
Serial.write( bytes,2);
bytes[0]=0;
}else{
bytes[0]=15;
Serial.write( bytes,2);
bytes[0]=0;
}
if(digitalRead5)==HIGH){
bytes[0]=15;
Serial.write( bytes,2);
bytes[0]=0;
}else{
bytes[0]=35;
Serial.write( bytes,2);
bytes[0]=0;
}
Re: Управление при помощи поворотного энкодера (Rotary Encoder)
Все гораздо сложнее, изучайте Код Грея
энкодера под рукой нет , так что код проверить не могу.
PHP код:
#define encoder0PinA 2
#define encoder0PinB 3
#define encoder1PinA 4
#define encoder1PinB 5
byte bytes[2]={0,7} ;
void setup()
{
pinMode(encoder0PinA, INPUT);
digitalWrite(encoder0PinA, HIGH); // подключить подтягивающий резистор
pinMode(encoder0PinB, INPUT);
digitalWrite(encoder0PinB, HIGH); // подключить подтягивающий резистор
pinMode(encoder1PinA, INPUT);
digitalWrite(encoder1PinA, HIGH); // подключить подтягивающий резистор
pinMode(encoder1PinB, INPUT);
digitalWrite(encoder1PinB, HIGH); // подключить подтягивающий резистор
attachInterrupt(0, doEncoderA, FALLING); // настроить прерывание interrupt 0 на pin 2
attachInterrupt(1, doEncoderB, FALLING); // настроить прерывание interrupt 0 на pin 3
Serial.begin (115200);
}
unsigned graydecode(unsigned gray)
{
unsigned bin;
for (bin = 0; gray; gray >>= 1)
bin ^= gray;
return bin;
}
void loop()
{
static uint8_t tmp_code = 0;
uint8_t gray_code = digitalRead(encoder1PinA) | (digitalRead(encoder1PinB) << 1),
code = graydecode(gray_code);
if (code == 0)
{
if (tmp_code == 3)
{
bytes[0]=8;
bytes[1]=7;
Serial.write( bytes,2);
bytes[0]=0;
} else if (tmp_code == 1)
{
bytes[0]=9;
bytes[1]=7;
Serial.write( bytes,2);
bytes[0]=0;
}
}
tmp_code = code;
delay(2);
}
// обработка прерывания
void doEncoderA()
{
if(digitalRead(encoder0PinB)==HIGH){bytes[0]=25;}else{bytes[0]=5;}
Serial.write( bytes,2);
bytes[0]=0;
}
// обработка прерывания
void doEncoderB()
{
if(digitalRead(encoder0PinA)==HIGH){bytes[0]=5;}else{bytes[0]=25;}
Serial.write( bytes,2);
bytes[0]=0;
}
Re: Управление при помощи поворотного энкодера (Rotary Encoder)
Re: Управление при помощи поворотного энкодера (Rotary Encoder)
довольно большой дребезг.. кондеры по 9 нФ
Re: Управление при помощи поворотного энкодера (Rotary Encoder)
Дребезг на каких входах? Кондеры можно до 0,1мкф увеличить или подобрать компромиссный вариант, с 0,1 мкф могут быть пропуски при резком вращении
Re: Управление при помощи поворотного энкодера (Rotary Encoder)
на 2 и 3 субъективно сильнее.. и бывает что за 1 щелчек по 2 посылки. правда грешу на энкодер...один работает менее стабильно. перегрел я его походу
Re: Управление при помощи поворотного энкодера (Rotary Encoder)
Пробуй кондерами пофиксить, можно конечно и программно, но это сложнее будет для тебя
Re: Управление при помощи поворотного энкодера (Rotary Encoder)
Re: Управление при помощи поворотного энкодера (Rotary Encoder)
У менявот такой энкодер:
http://i008.radikal.ru/1111/dd/a01f32c1adf6t.jpg http://s017.radikal.ru/i420/1111/fb/eacd2bd9b3f5t.jpg
GND и D4 - к этим контактам подключается кнопка?
Они замыкаются при нажатии.
А вот оставшиеся 3 контакта почему-то прозваниваются между собой, сопротивления никакого нет, это нормально?
Re: Управление при помощи поворотного энкодера (Rotary Encoder)
Цитата:
Сообщение от
WhyMax
А вот оставшиеся 3 контакта почему-то прозваниваются между собой, сопротивления никакого нет, это нормально?
да нормально