Доброго времени суток, форумчане!
Прошу помощи у вас, так как уже не знаю как решить свою проблему и уже просто руки опускаются...
Я новичок в программировании Ардуино, поэтому мои познания очень небольшие в этом плане.
Решил я построить свой собственный проект на Ардуино. Устройство представляет из себя простой принцип - приходит аналоговый сигнал в ардуино, обрабатывается по определенным алгоритмам и с помощью внешнего ЦАП выдает измененный сигнал. Основной смысл и сложность кроется в необходимости использования большого количества внешних регуляторов (порядка 13 энкодеров и с пятак простых кнопок). Так как я на примерах и уроках AlexGyver познал прелесть вариации режимов работ энкодера, подключенного напрямую к МК с помощью библиотеки EncButton, мне бы хотелось применить весь этот функционал ко всем 13 используемым энкодерам + кнопкам.
Насколько я знаю, все их можно подключить только с помощью входных сдвиговых регистров. Для этого в библиотеке EncButton есть режим виртуального энкодера.
Я пишу тут, потому что из интернета я понял одно: в этом вопросе все якобы очень просто, поэтому никто ничего толком не расписывает и не спрашивает... К сожалению я тут не догоняю(((
1) Первая проблема с которой я столкнулся - из примеров и описания библиотеки - я не понимаю как выглядит простая работа такого виртуального энкодера и как будет выглядеть такой скетч. Ибо в описании 2 библиотеки EncButton и EncButton2, для каждой свои значения и примеры опроса и как все это организовать - непонятно (лично мне). Например энкодер который подключен напрямую в МК у меня отлично работает так:
Может конечно что-то можно упростить, ибо часть переменных я не описывал, но главное, что я понимаю как и что тут работает. Как опрашивается энкодер, условия и последующие изменения....
Но как организовать скетч виртуального энкодера и что в какой последовательности будет стоять в скетче - я не понимаю. Первое что прошу помочь объяснить, а лучше показать, как будет выглядеть этот же самый скетч, но в виртуальном режиме. В библиотеке есть пример "Виртуал", но меня там в виртуальной кнопке смутила строчка:
pinMode(4, INPUT_PULLUP); // подтянем пин
насколько я понимаю это пин 4 МК, если да - то причем тут вообще режим виртуальный? непонятно....
Вообщем буду признателен в помощи решения этой проблемы!
2) Вторая проблема это сдвиговый регистр ввода 74HC165.
История аналогичная - в инете простейшие примеры с выводом инфы о битах в монитор порта. Все рассказывают, что потом эти пины можно использовать как хочешь... А как именно - непонятно.... Как я понимаю - нужно опрашивать каждый пин регистра, потом как-то применять значения пина (1/0) для последующей обработки, как-то это собрать в каскад один за другим. Механически собрать понятно как, но как это все дело опрашивать в программе для своих нужд - непонятно.
Более менее понятный скетч я нашел:
Схема работает, при нажатии подключенных кнопок - в порт выдается инфа о нажатых или отпущенных кнопках...
Но я не понимаю: как здесь обратиться к нужному пину? Как его использовать для своих нужд? каждому значению пина при опросе присваивать свою отдельную переменную чтобы потом на нее ссылаться при дальнейших манипуляциях?
На сайте АлекГайвер есть статья про опрос байта и бита, но как я это понял - опрос в пределах МК. Как опросить сдвиговый регистр? (может быть так же, но я что-то не понимаю?)
Вообщем буду признателен в помощи решения и этой проблемы тоже!
3) Ну и самый коронный и главный вопрос: Как заставить их работать вместе (энкодеры и сдвиговый регистр)?))))))
Я понимаю это так: куча механических энкодеров подключается физически к пинам сдвигового регистра, происходит периодический опрос регистра. Потом каким-то образом (надеюсь я пойму с вашей помощью) значения (1/0) пинов регистра передаются (или вернее будет сказать используются) в качестве виртуального состояния виртуальных энкодеров, для которых есть удобная библиотека EncButton. Я просто хочу разобраться в этом вопросе....
Вообщем, спасибо тем кто всё это дочитал, понимаю что много букв, но для меня ситуация патовая, потому что я не знаю уже как решить эту проблему и к кому обратиться(( Буду безумно благодарен каждому за посильную помощь в объяснении того, что я делаю не так(((
Прошу помощи у вас, так как уже не знаю как решить свою проблему и уже просто руки опускаются...
Я новичок в программировании Ардуино, поэтому мои познания очень небольшие в этом плане.
Решил я построить свой собственный проект на Ардуино. Устройство представляет из себя простой принцип - приходит аналоговый сигнал в ардуино, обрабатывается по определенным алгоритмам и с помощью внешнего ЦАП выдает измененный сигнал. Основной смысл и сложность кроется в необходимости использования большого количества внешних регуляторов (порядка 13 энкодеров и с пятак простых кнопок). Так как я на примерах и уроках AlexGyver познал прелесть вариации режимов работ энкодера, подключенного напрямую к МК с помощью библиотеки EncButton, мне бы хотелось применить весь этот функционал ко всем 13 используемым энкодерам + кнопкам.
Насколько я знаю, все их можно подключить только с помощью входных сдвиговых регистров. Для этого в библиотеке EncButton есть режим виртуального энкодера.
Я пишу тут, потому что из интернета я понял одно: в этом вопросе все якобы очень просто, поэтому никто ничего толком не расписывает и не спрашивает... К сожалению я тут не догоняю(((
1) Первая проблема с которой я столкнулся - из примеров и описания библиотеки - я не понимаю как выглядит простая работа такого виртуального энкодера и как будет выглядеть такой скетч. Ибо в описании 2 библиотеки EncButton и EncButton2, для каждой свои значения и примеры опроса и как все это организовать - непонятно (лично мне). Например энкодер который подключен напрямую в МК у меня отлично работает так:
Часть скетча...:
#include <EncButton.h> // <Библиотека общего энкодера с кнопкой <A, B, KEY>
EncButton<EB_TICK, 3, 4, 5> encx4;
int Dval, Rval, x4;
int E1, E2;
void setup() {
Serial.begin(9600); // порт для связи
}
void loop() {
if (encx4.tick() && Dval==1) {
if (encx4.isRight() && Rval!=0) {x4 += E1;}
if (encx4.isRightH() && Rval!=0) {x4 += E2;}
if (encx4.isLeft() && Rval!=0) {x4 -= E1;}
if (encx4.isLeftH() && Rval!=0) {x4 -= E2;}
encx4.resetState(); }
Но как организовать скетч виртуального энкодера и что в какой последовательности будет стоять в скетче - я не понимаю. Первое что прошу помочь объяснить, а лучше показать, как будет выглядеть этот же самый скетч, но в виртуальном режиме. В библиотеке есть пример "Виртуал", но меня там в виртуальной кнопке смутила строчка:
pinMode(4, INPUT_PULLUP); // подтянем пин
насколько я понимаю это пин 4 МК, если да - то причем тут вообще режим виртуальный? непонятно....
Вообщем буду признателен в помощи решения этой проблемы!
2) Вторая проблема это сдвиговый регистр ввода 74HC165.
История аналогичная - в инете простейшие примеры с выводом инфы о битах в монитор порта. Все рассказывают, что потом эти пины можно использовать как хочешь... А как именно - непонятно.... Как я понимаю - нужно опрашивать каждый пин регистра, потом как-то применять значения пина (1/0) для последующей обработки, как-то это собрать в каскад один за другим. Механически собрать понятно как, но как это все дело опрашивать в программе для своих нужд - непонятно.
Более менее понятный скетч я нашел:
Скетч обработки сдвигового регистра:
#define NUMBER_OF_SHIFT_CHIPS 1 // количество регистров
#define DATA_WIDTH NUMBER_OF_SHIFT_CHIPS * 8 // количество входов
#define PULSE_WIDTH_USEC 5 // задержка при считывании данных
// для хранения считаных байт
// если регистров больше двух, то int меняется на long
#define BYTES_VAL_T unsigned int
// пины для подключения регистра
int pL = 10; // pL - ploadPin
int cEP = 16; // cEP - clockEnablePin
int dP = 14; // dP - dataPin
int cP = 15; // cP - clockPin
BYTES_VAL_T pinValues; // текущее значение пинов
BYTES_VAL_T oldPinValues; // предыдущее значение пинов
// функция для считывания пинов
BYTES_VAL_T read_shift_regs() {
long bitVal;
BYTES_VAL_T bytesVal = 0;
// опрашиваем регистр о состоянии пинов
digitalWrite(cEP, HIGH);
digitalWrite(pL, LOW);
delayMicroseconds(PULSE_WIDTH_USEC);
digitalWrite(pL, HIGH);
digitalWrite(cEP, LOW);
// считываем полученные данные о пинах
for(int i = 0; i < DATA_WIDTH; i++){
bitVal = digitalRead(dP);
bytesVal |= (bitVal << ((DATA_WIDTH-1) - i));
digitalWrite(cP, HIGH);
delayMicroseconds(PULSE_WIDTH_USEC);
digitalWrite(cP, LOW);
}
// возвращяем результат опроса регистра
return(bytesVal);
}
// функция для вывода состояния пинов
void display_pin_values(){
// перебор всех пинов
for(int i = 0; i < DATA_WIDTH; i++){
Serial.print(" Button-");
Serial.print(i);
Serial.print(": ");
if((pinValues >> i) & 1){
Serial.print("ON");
}else{
Serial.print("OFF");
}
Serial.println();
}
Serial.println();
}
void setup(){
// для вывода данных в монитор порта
Serial.begin(9600);
// установка режима работа пинов
pinMode(pL, OUTPUT);
pinMode(cEP, OUTPUT);
pinMode(cP, OUTPUT);
pinMode(dP, INPUT);
digitalWrite(cP, LOW);
digitalWrite(pL, HIGH);
// считываем значения с пинов
pinValues = read_shift_regs();
// выводим результат
display_pin_values();
// сохраняем текущее значение
oldPinValues = pinValues;
}
void loop(){
// считываем значения с пинов
pinValues = read_shift_regs();
// если значения изменились, то выводим их
if(pinValues != oldPinValues){
// выводим результат в монитор порта
display_pin_values();
// сохраняем текущее значение
oldPinValues = pinValues;
}
delay(50);
}
Но я не понимаю: как здесь обратиться к нужному пину? Как его использовать для своих нужд? каждому значению пина при опросе присваивать свою отдельную переменную чтобы потом на нее ссылаться при дальнейших манипуляциях?
На сайте АлекГайвер есть статья про опрос байта и бита, но как я это понял - опрос в пределах МК. Как опросить сдвиговый регистр? (может быть так же, но я что-то не понимаю?)
Вообщем буду признателен в помощи решения и этой проблемы тоже!
3) Ну и самый коронный и главный вопрос: Как заставить их работать вместе (энкодеры и сдвиговый регистр)?))))))
Я понимаю это так: куча механических энкодеров подключается физически к пинам сдвигового регистра, происходит периодический опрос регистра. Потом каким-то образом (надеюсь я пойму с вашей помощью) значения (1/0) пинов регистра передаются (или вернее будет сказать используются) в качестве виртуального состояния виртуальных энкодеров, для которых есть удобная библиотека EncButton. Я просто хочу разобраться в этом вопросе....
Вообщем, спасибо тем кто всё это дочитал, понимаю что много букв, но для меня ситуация патовая, потому что я не знаю уже как решить эту проблему и к кому обратиться(( Буду безумно благодарен каждому за посильную помощь в объяснении того, что я делаю не так(((