Что именно не выходит?
Вид для печати
Что именно не выходит?
АП: кнопочка тоже заработала, но при повороте энкодера в любую сторону кнопка все равно программно жмется.
Значение кнопки: 2048.
Только я понимаю что работает у меня немного кривовато?
Например при быстром и медленном вращении значения разные.
А что показывает монитор вобще все отличается (скетч для монитора я кстати не заливал, использовал из первого поста).
Короче объясню по другому, проблема такая:
Крутилки работают, по ним вопросов нет, я даже могу назначить разные действия на быстрое и на медленное вращение (4 разных комбинации клавиш).
Теперь что касаемо кнопки:
Назначил действие на кнопку.
Нажимаю - все работает (например плей/пауза в винампе).
Затем начинаю крутить энкодер в любую сторону, у меня увеличивается/уменьшается громкость, а так же при вращении нажимается кнопка плей/пауза!
Вот такая проблема.
Ошибка монтажа, скорее всего на энкодере при прозванивании что то напутал
При прозванивании почему-то все было как надо:
http://www.compcar.ru/forum/showpost...&postcount=120
Я победил свой энкодер, все дело было в 2-х резисторах, которые соединяли 2 контакта на плате, их надо выпаять или перерезать дорожки, идущие к ним:
http://s017.radikal.ru/i421/1111/2a/25608dc3c6d3t.jpg
Все отлично работает!!
Теперь есть целых 5 кнопок:
поворот влево
поворот вправо
нажатие
поворот влево + нажатие
поворот вправо + нажатие
Надо еще заставить работать второй энкодер.
Про второй энкодер поищи на форуме , я выкладывал пример
В данной теме я нашел только это:
http://www.compcar.ru/forum/showpost...&postcount=383
И еще:
http://www.compcar.ru/forum/showpost...&postcount=102
Оно?
Вторая ссылка
Пытаюсь по аналогии заставить работать вторую крутилку.
Код получился такой:
У второго энкодера заработала только кнопка, но эта кнопка дублирует кнопку первого энкодера.PHP код:
#define encoder0PinA 2
#define encoder0PinB 3
#define encoder0PinC 4
#define encoder1PinA 5
#define encoder1PinB 6
#define encoder1PinC 7
byte bytes[2]={0,7} ;
void setup()
{
pinMode(encoder0PinA, INPUT);
digitalWrite(encoder0PinA, HIGH); // подключить подтягивающий резистор
pinMode(encoder0PinB, INPUT);
digitalWrite(encoder0PinB, HIGH); // подключить подтягивающий резистор
pinMode(encoder0PinC, INPUT);
digitalWrite(encoder0PinC, HIGH); // подключить подтягивающий резистор
pinMode(encoder1PinA, INPUT);
digitalWrite(encoder1PinA, HIGH); // подключить подтягивающий резистор
pinMode(encoder1PinB, INPUT);
digitalWrite(encoder1PinB, HIGH); // подключить подтягивающий резистор
pinMode(encoder1PinC, INPUT);
digitalWrite(encoder1PinC, HIGH); // подключить подтягивающий резистор
attachInterrupt(0, doEncoderA, FALLING); // настроить прерывание interrupt 0 на pin 2
attachInterrupt(1, doEncoderB, FALLING); // настроить прерывание interrupt 0 на pin 3
attachInterrupt(0, doEncoder1A, FALLING); // настроить прерывание interrupt 0 на pin 2
attachInterrupt(1, doEncoder1B, FALLING); // настроить прерывание interrupt 0 на pin 3
Serial.begin (115200);
}
void loop()
{
if(digitalRead(encoder0PinC)==LOW)
{
bytes[1]=8;
Serial.write( bytes,2);
while(digitalRead(encoder0PinC)==LOW){delay(50);}
bytes[1]=7;
}
if(digitalRead(encoder1PinC)==LOW)
{
bytes[1]=8;
Serial.write( bytes,2);
while(digitalRead(encoder1PinC)==LOW){delay(50);}
bytes[1]=7;
}
}
// обработка прерывания
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;
}
// обработка прерывания
void doEncoder1A()
{
if(digitalRead(encoder1PinB)==HIGH){bytes[0]=25;}else{bytes[0]=5;}
Serial.write( bytes,2);
bytes[0]=0;
}
// обработка прерывания
void doEncoder1B()
{
if(digitalRead(encoder1PinA)==HIGH){bytes[0]=5;}else{bytes[0]=25;}
Serial.write( bytes,2);
bytes[0]=0;
}
5, 6 ноги - крутилка, 7 - кнопка.
очень странно, решил попробовать проверить второй энкодер, код такой:
Работает только кнопка :(PHP код:
#define encoder0PinA 5
#define encoder0PinB 6
#define encoder0PinC 7
byte bytes[2]={0,7} ;
void setup()
{
pinMode(encoder0PinA, INPUT);
digitalWrite(encoder0PinA, HIGH); // подключить подтягивающий резистор
pinMode(encoder0PinB, INPUT);
digitalWrite(encoder0PinB, HIGH); // подключить подтягивающий резистор
pinMode(encoder0PinC, INPUT);
digitalWrite(encoder0PinC, HIGH); // подключить подтягивающий резистор
attachInterrupt(0, doEncoderA, FALLING); // настроить прерывание interrupt 0 на pin 2
attachInterrupt(1, doEncoderB, FALLING); // настроить прерывание interrupt 0 на pin 3
Serial.begin (115200);
}
void loop()
{
if(digitalRead(encoder0PinC)==LOW)
{
bytes[1]=8;
Serial.write( bytes,2);
while(digitalRead(encoder0PinC)==LOW){delay(50);}
bytes[1]=7;
}
}
// обработка прерывания
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;
}
Методом проб остановился на таком скетче.
Первый энкодер работает как надо, у второго отсутствует вращение+нажатие.
PHP код:
#define encoder0PinA 2
#define encoder0PinB 3
#define encoder0PinC 4
#define encoder1PinA 5
#define encoder1PinB 6
#define encoder1PinC 7
byte bytes[2]={0,7} ;
void setup()
{
pinMode(encoder0PinA, INPUT);
digitalWrite(encoder0PinA, HIGH); // подключить подтягивающий резистор
pinMode(encoder0PinB, INPUT);
digitalWrite(encoder0PinB, HIGH); // подключить подтягивающий резистор
pinMode(encoder0PinC, INPUT);
digitalWrite(encoder0PinC, HIGH); // подключить подтягивающий резистор
pinMode(encoder1PinA, INPUT);
digitalWrite(encoder1PinA, HIGH); // подключить подтягивающий резистор
pinMode(encoder1PinB, INPUT);
digitalWrite(encoder1PinB, HIGH); // подключить подтягивающий резистор
pinMode(encoder1PinC, INPUT);
digitalWrite(encoder1PinC, 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]=9;
bytes[1]=6;
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);
if(digitalRead(encoder0PinC)==LOW)
{
bytes[1]=8;
Serial.write( bytes,2);
while(digitalRead(encoder0PinC)==LOW){delay(50);}
bytes[1]=7;
}
if(digitalRead(encoder1PinC)==LOW)
{
bytes[1]=6;
Serial.write( bytes,2);
while(digitalRead(encoder1PinC)==LOW){delay(50);}
bytes[1]=7;
}
}
// обработка прерывания
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;
}
chip подскажи что может влиять губительно на считывание энкодера?
Когда энкодер впаиваю в плату - периодическинаглухо отказывается читать его, или шлет мусор как будто контакт где-то плохой. Хотя подпаян прям к ножкам без дорожек, общая тока масса разведена.(на платке еще кнопки резистивные есть. с ними масса общая)
если же энкодер напрямую цеплять на провода, изолируя от платы, то считывается отлично. К плате с ардуиной плата энкодера подключена шлейфом от hdd
вопрос к чипу. в начале темы написано примерно так "выпаял колесо от мыши и припаял к адруино"
а нельзя мышь целиком было использовать что бы не тратить плату ардуино?
Я это делал для того что бы попробовать, проверить и выложить для других, под рукой энкодера не было вот и выпаял из неисправной старой мышки.
С таким подходом можно было бы написать здесь "Для чего этот форум, есть же еще форумы? "
зачем всё в штыки принимать. просто было не ясно вот и спросил. ведь по идее можно использовать мышь целиком не расходуя плат правильно? Вопрос в следующем, можно ли использовать две мышки - два енкодера? что бы виндовс определял их разными? одну на громкость другую на радио поставить? я в послеке живу. мышь маленькую купить рублей за 200-300 проблем не возникнет, в отличии от андруино. енкодеры у меня есть. вот кстати прочтите пожалуйста тему
http://www.compcar.ru/forum/showthre...0768#post90768
вопрос про радио тебе адресовал, т.к. у тебя есть тема про радио из магнитол
вопрос к знающим людям. запустил енкодер, все работает. но иногда либо зависает на одном месте положение звука (смотрю по микшеру) и пока паузу не выждешь так и будет на одном месте дергатся. либо значение в хоткей прыгает с нужных 1817 1797 до 6 тысяч и до 1243. поставил конденсаторы с маркировкой 104 и 103. может в них дело? какие в идеале нужно поставить подскажите пожалуйста, токо не в микрофаратах а для чайника - в таких же цифрах на кондерах. Еще вопрос, плата с которой снял енкодер, от два дин магнитолы, в принципе енкодер там идет через конденсаторы так же как и у чипа в схеме, но они smd и совсем не подписные, маленькие желтенькие. подключил вчера к ногам енкодера не снимая с платы (думал что эти конденсаторы пойдут) запустил монитор, в нем постоянно бегут цифры, значения сейчас не помню, может ли это происходить из за того что енкодер подключен в плате к микросхемам? и подойдут ли smd конденсаторы которые стоят на плате? если необходима фотография я ее сделаю.
Сегодня просто озадачился вчерашним фиаско - подумал что возможно надо было просто перерезать дороги идущие от енкодера к микросхеме.
конденсаторы нужно 104
перерезал дорожки. заработал енкодер с теми маленькими что там стоят :)
Тема старая, но сейчас стала актуальна. Подключил 1 энкодер, всё работает, спасибо! Но вот с подключением второго пока не очень. Можно попросить кого-нибудь выложить схему подключения двух энкодеров? Заранее благодарю! :)
Посмотри тему All in One
Chip, тема отличная, спасибо! Но там нет примера подключения одновременно двух энкодеров. Если не затруднит, был бы очень признатален. :)
Умер энкодер от магнитолы, контакты A и com замкнуты, при вращении не размыкаются :-(
Купил на замену подходящий по размерам: PEC12-4125F-S0012 энкодер инкр.+выкл.
Все контакты расположены так же. Припаял, проверил тестером - ведет себя как другой соседний рабочий энкодер.
Но как только включил монитор ардуины - то при вращении нового энкодера ничего не происходит, видно только нажатие.
Еще не заметил закономерности - но когда я вращал его в одну, другую сторону, жал на кнопку - то вдруг в мониторе выскакивает около 10-15 значений (вправо-влево, .....) и ардуина зависает.
Этот энкодер поддерживается? В чем может быть причина?
Лог:
Код:7 9 6 9 6 9 6 9 6 9 7 9 7 9 7 9
7 9 7 9 7 9 6 0 6 0 6 9 6 9 6 9
7 9 7 0 8 0 8 0 8 5 7 5 7 5 7 5
7 5 7 5 7 5 7 25 7 25 7 5 7 5 7 5
7 5 7 7 0 8 0 8 0 8 0 6 9 6 9 6
9 6 9 7 9 7 9 7 9 7 9 6 0 6 0 8
0 8 0 8 0 8 0 8 0 8 0 8 0 8 0 8
0 8 0 8 0 8 0 8 0 8 0 8 0 8 0 8
0 8 9 7 9 7 9 7 9 7 9 6 9 6 9 6
9 6 9 6 9 7 9 7 9 7 9 7 9 6 9 6
9 6 9 6 9 6 9 6 9 6 9 7 9 7 9 7
9 7 9 6 9 6 9 6 9 6 9 6 9 6 9 6
0 6 0 6 0 6 25 7 5 7 5 7 5 7 25 7
25 7 5 7 25 7 25 7 25 7 5 7 25 7 25 7
25 7 5 7 25 7 5 7 25 7 25 7 5 7 7 0
8 0 8 0 8 0 8 0 8 0 8 0 8 0 8 0
8 0 8 9 6 9 6 9 7 9 7 9 7 9 7 9
6 9 6 9 6 9 6 9 6 9 7 0 6 0 6 0
8 0 8 0 8 9 7 9 7 9 6 9 6 9 6 9
6 9 6 9 6 9 6 9 6 9 7 9 7 9 7 9
7 9 7 9 6 9 7 9 7 9 7 9 7 9 6 9
6 9 6 9 6 9 6 0 6
25 7/5 7 - поворот вправо/влево первого (который не работает корректно) энкодера
0 8 - нажатие на первый энкодер
9 6/9 7 - поворот вправо/влево второго энкодера (рабочего)
0 6 - нажатие на второй энкодер
Конденсаторы на рабочем и на нерабочем энкодере с маркировкой 103.
Попробую 104, но мне кажется не в них дело?
А конденсаторы стоят на входах?
Перепаял на 104, теперь вращение влево:
Вправо:Код:5 7 5 7 25 7 5 7 25 7 5 7 25 7 5 7
5 7 25 7 25 7 5 7 25 7 5 7 5 7 5 7
5 7 25 7 5 7 25 7 5 7 5 7 5 7 25 7
5 7 25 7 5 7 25 7 5 7 25 7 5 7 25 7
5 7 25 7 5 7 5 7 5 7 5 7 25 7 5 7
5 7 25 7 5 7 5 7 25 7 5 7 5 7 25 7
5 7 5 7 25 7 5 7 25 7 5 7 5 7 25 7
Работает, но в какую сторону его вращаю не понимает :(Код:25 7 5 7 25 7 5 7 25 7 5 7 25 7 25 7
25 7 25 7 5 7 25 7 5 7 25 7 5 7 25 7
25 7 5 7 5 7 25 7 25 7 5 7 25 7 25 7
5 7 25 7 5 7 25 7 5 7 25 7 5 7 25 7
25 7 5 7 25 7 5 7 25 7 5 7 25 7 25 7
25 7 5 7 5 7 5 7 25 7 5 7 25 7 5 7
25 7 5 7 25 7 5 7 25 7 5 7 25 7 5 7
25 7 5 7 25 7 25 7 5 7 25 7 25 7 5 7
25 7 5 7 25 7 5 7
Большой дребезг контактов
с 0,1 мкф должно все работать
Перепаял обратно на 0,01 мкФ, но в добавок подцепил массу к другому контакту (не смотря на то, что она и так общая) - дребезг пропал, энкодер заработал без глюков и лагов.
У меня энкодер припаян к плате - я просто подпаял дополнительный проводок к массе (общему контакту).
Спасибо за попытки помощи)))
Выяснилась еще одна причина плохой работы одного из энкодеров - включенный монитор от китайского дешевого блока питания (220-12), а авто еще не проверял, но подозреваю что может быть точно так же.
Ребят, помогите пожалуйста ниписать программу для Arduino(микроконтроллер Atmega328).
техническое задание: На LCD-индикатор WH-1602 выводится бегущая строка. Управление направлением и скоростью ведется с помощью датчика угла поворота (энкодера).
очень нужно, сам не разбираюсь в этом...
сегодня поигрался с разными энкодерами. выяснилось, что логика их работы может различаться!
сейчас передо мной лежат две штуки:
1. из старой магнитолы (поворот на одно деление - 0, поворот еще на одно деление - 1)
2. купленый в carmonitor (в фиксированном положении -0, между делениями - 1)
получается, что во втором случае, прерывание происходит дважды на одно деление - из 0 в 1, а потом из 1 снова в 0
скетч из шапки формирует в первом случае по две посылки через деление (одно деление - ничего не пересылается, второе - сразу две посылки) , а во втором - сразу две посылки за деление
помощь не нужна... это я так, для сведения написал ;)
П.С. ух, давненько я здесь регистрировался )))
вот нашел статейку
энкодер можно вешать на ЛЮБЫЕ цифровые пины ))) сегодня пробовал на Nano v4 - работает даже без конденсаторов и подтягивающих резисторов!
если по статье непонятно, завтра выложу тестовый скетч
Резисторы обязательны, если провод от енкодера до платы довольно длинный. Встроенные резы подтяжки в МК довольно большого номинала. Кондеры тоже нужны. Они подавляют дребезг контактов. Проще говоря пока енкодер "свежий" будет работать норм, а потом как попало.
Поднимаю старую тему, но для меня этот вопрос актуален
Хочу сделать энкодер на громкость и кнопки на руль всё от одной ардуины
вопрос: что мешает прописать ардуину как клавиатуру с доп.кнопками, т.е. в системе ардуина будет определятся как клава и при повороте энкодера система сама будут думать что на клаве нажимаются кнопки vol+ и vol-
тогда появляется возможность использовать аналоговые входы как кнопки, след.трек, пред.трек, плей пауза
но у меня тоже появился вопрос по теме - что-то передается в ардуино при соединении с программой, например, HotKey.exe?
другими словами: как ардуине анализируя буфер ком-порта понять, что установлено соединение?
Т.е. задача такая: при соединении с ХотКеем зажигать диод.
А в дальнейшем поиграться с другими действиями.
Ардуина не анализирует подключение, проверяет подключение программа hotkey
По идее для норм реализации проще hid отдельный для енкодера найти. Правда дороговато выходит.
Есть отдельные платы универсальные там можно мног чего и любой код присвоить и длинное короткое нажатие тоже выполняется, есть енкодер с платой, правда как в этом случае присвоить енкодеру что выдавать в шину.