Клавиатура с подключением к аналоговому входу.

leks
Offline
Зарегистрирован: 22.10.2017

Хочу к УНО подключить кнопки по такой схеме. Диоды германиевые. Чем ограничивается число кнопок? Сколько их по максимуму можно присоединить?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

По такой схеме лучше вообще не подключать.

leks
Offline
Зарегистрирован: 22.10.2017

А по какой лучше?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, посмотрите в теме про работу с кнопками или вот эту тему. Последняя приятна тем, что распознаём любые комбинации совместно нажатых кнопок, а во второй серии (про грабли) разобраны грабли и приведено работающее решение. Работает уже полгода на морозе и отлично себя чувствует.

Даже если использовать Вашу схему (если Вы готовы забыть об одновременно нажатых кнопках), ну, не с такими же номиналами! Просто посчитайте по закону Ома какой диапазон из 0-5V Вы при такой схеме будете использовать! 

leks
Offline
Зарегистрирован: 22.10.2017

Посмотрел, не всё с ходу ясно. Мне наоборот желательно что бы при одновременном нажатии кнопок это определялось как "ошибка" или почти не влияло на величину напряжения на А0. Поэтому подумалось о развязывающих диодах. Номинал резисторов одинаков может быть и больше - 3к, например. Шаг изменения напряжения одинаковый.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

leks пишет:

Шаг изменения напряжения одинаковый.

Точно? А зкон Ома что говорит? Нет, я, конечно, понимаю, что закон Ома на данном форуме запрещён, но не до такой же степени. Вот, что получается по Вашей схеме

Vcc (вольт) 5                  
Номер кнопки 1 2 3 4 5 6 7 8 9 10
R_верх (К) 0 1 2 3 4 5 6 7 8 9
Резисторов слева 10 9 8 7 6 5 4 3 2 1
R_низ (К) 9,565 8,646 7,719 6,784 5,841 4,889 3,929 2,960 1,982 0,995
Напряжение  5,000 4,482 3,971 3,467 2,968 2,472 1,978 1,486 0,993 0,498
Шаг   0,518 0,511 0,504 0,499 0,496 0,493 0,493 0,493 0,495

Если же Вам важно считать одновременное нажатие ошибкой, то Вам тем более его нужно уметь распознавать. А в данной схеме, Вы многие одновременные нажатия воспримите как одиночные, но на другую кнопку.

leks
Offline
Зарегистрирован: 22.10.2017

Пардон, шаг изменения напряжения, почти одинаковый. 

Что касается распознаваемости по нажатию более одной кнопки - снимал напряжение с десятого резистора на ещё один вход А1. При закорачивании другого резистора или группы напряжение на десятом резко возрастало, что отслеживал вход А1 и запрещал дальнейшую работу клавиатуры. Диодов там не было. Теперь с диодами хочется попробовать без дополнительного А1.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, успехов!

leks
Offline
Зарегистрирован: 22.10.2017

ЕвгенийП пишет:

Ну, успехов!

 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Arduino UNO
//
////////////////////////
//
//программа  ЭМИ вариант 3 с запретом нажатия более 1 кнопки и выводом данных на монитор порта //
unsigned int  n=0;//номер кнопки
unsigned int  x=0;

long y1 = 0;
long y2 = 0;

int tabl [16] ={0,261,293,329,349,392,
          440,494,523,587,659,698,784,880,932,988};  // зашифрованные данные нот – их частоты


void setup()    
   {
          pinMode(13, OUTPUT);
          digitalWrite(13, LOW);
          pinMode(A0, INPUT);
         
          Serial.begin(9600);
   }
        void loop()
      {
       
         y2=millis();
         if (y2-y1>=1000)
         {y1=y2; Serial.println("x,n");Serial.println(x);
         Serial.println(n);}

       
       
        x=analogRead(A0); n=map(x, -30, 1018, 0, 16);//определение номера кнопки
        if ( n>0) {tone (13, tabl[n],50);} // исполнение вызванной ноты
        else { noTone(13);}
         
 
       }
    
//
// Конец /
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

      На 15 кнопках работает нотная пиликалка нормально, думаю 20 это разумный предел.Приоритет из всех нажатых одновременно - у самой правой.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

leks, в Вашем случае обычно используют не диоды, а генератор тока, например, такой:

или такой: 

Хотя, на 5 Вольтах это не очень хорошее решение.

Но с диодами все равно хуже.

 

Ну и наводящий вопрос:

Вы в курсе, что у Вас аппаратная клавиатура (как я ее увидел) не соответствует массиву частот нот?

На клавиатуре: до, до#, ре, ре#, ми, фа, фа#, соль, соль#, ля, ля#, си, до, ре, ми.

В скетче: ?, до, ре, ми, фа, соль, ля, си, до, ре, ми, фа, соль, ля, ля#, си.

leks
Offline
Зарегистрирован: 22.10.2017

Да, я в курсе, просто запутали родственники-выпускники муз.школы. Нада не менее 2 октав и к нотам ещё "полуноты" всего 24 кнопки. Не потянут диоды столько на 5 Вольтах. Надо дальше думать.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

25. Без верхней "до" будет явно неудобно.

Ну, генератор тока как раз обеспечивает требуемую точность. Притом, обеспечивает даже в более сложном случае - когда напряжение используется без округления до целых полутонов. В аналоговых синтезаторах именно так и делали.

leks
Offline
Зарегистрирован: 22.10.2017

25 кнопок для клавиатуры на один вход аналоговый, даже если отказаться от диодов и вернуться к первому варианту с использованием второго входа, отслеживающего корочение резисторов в цепочке - будет многовато, мне кажется. Как использовать "генератор тока во благо Ардуины" пока не пойму.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Ну, не знаю.

В аналоговых синтезаторах управляющее напряжение задавалось именно на цепочке резисторов через генератор тока.

Масштаб - 1 В на октаву. Максимальная допустимая погрешность 0.2%. Т.е. 2 мВ. Ардуина, конечно, обладает гораздо более низкой чувствительностью, но сам факт - что цепочка резисторов с генератором тока способна обеспечить такую точность - налицо.

Правда, там питание 12-15 В.

А по поводу "как использовать" - нужно подключать цепочку резисторов туда, где на первой схеме написано "нагрузка", а на второй - разрыв цепи со стрелками.

Номиналы, естественно, пересчитать. Для первой схемы и указанных в исходном сообщении темы номиналов резисторов цепочки это будет R1 - 20-100к и R2 - 3.9-6.2к. Но лучше бы уменьшить номиналы резисторов цепочки хотя бы раз в 10.

leks
Offline
Зарегистрирован: 22.10.2017

andriano пишет:

Ну, не знаю.

В аналоговых синтезаторах управляющее напряжение задавалось именно на цепочке резисторов через генератор тока.

Масштаб - 1 В на октаву. Максимальная допустимая погрешность 0.2%. Т.е. 2 мВ. Ардуина, конечно, обладает гораздо более низкой чувствительностью, но сам факт - что цепочка резисторов с генератором тока способна обеспечить такую точность - налицо.

Правда, там питание 12-15 В.

А по поводу "как использовать" - нужно подключать цепочку резисторов туда, где на первой схеме написано "нагрузка", а на второй - разрыв цепи со стрелками.

Номиналы, естественно, пересчитать. Для первой схемы и указанных в исходном сообщении темы номиналов резисторов цепочки это будет R1 - 20-100к и R2 - 3.9-6.2к. Но лучше бы уменьшить номиналы резисторов цепочки хотя бы раз в 10.

Стабильный шаг изменения напряжения - было бы здорово. Но в генераторе тока будет оно теряться на резисторе-датчике и на переходе транзистора, останется, наверное, меньше 4 Вольт. Надо пробовать, как отслеживать нажатие 2 и более кнопок пока тоже не ясно.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

leks пишет:
как отслеживать нажатие 2 и более кнопок пока тоже не ясно.
В этой схеме - никак, но ТС сказал, что это и не нужно.

leks
Offline
Зарегистрирован: 22.10.2017

ЕвгенийП пишет:

leks пишет:
как отслеживать нажатие 2 и более кнопок пока тоже не ясно.
В этой схеме - никак, но ТС сказал, что это и не нужно.

Ну, неграмотно сказал, - игнорирование программой нажатия двух и более кнопок, либо реакция как на одну определённую.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

В мелодических музыкальных интрументах принято, что звучит нота, соответствующая верхней (правой) из нажатых клавиш.

Соответственно, подключатбся нужно самая правая клавиша - к самому нижнему резистору. Остальное обеспечит генератор тока.

leks
Offline
Зарегистрирован: 22.10.2017

andriano пишет:

В мелодических музыкальных интрументах принято, что звучит нота, соответствующая верхней (правой) из нажатых клавиш.

Соответственно, подключатбся нужно самая правая клавиша - к самому нижнему резистору. Остальное обеспечит генератор тока.

Медленно дошёл смысл написанного, захотелось проверить. Не нашёл ни одной схемы такой клавиатуры приминительно к Ардуино или к синтезаторам (не те слова, видимо набираю в поисковике).

Попробую германиевые транзисторы , на ток стабилизации, наверно 1-5 мА.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Эти схемы публиковались в журнале Радио в конце 70-х - начале 80-х. Т.е. в "доинтернетную" эпоху.

Хотя...

Вот прямо сейчас поиском наткнулся на первую попавшуюся схему: http://www.modularsynth.ru/wp-content/uploads/2013/06/ritm_2_schematics_hires.png

Здесь на DA11 собран генератор тока через резисторы клавиатуры R58-R195. С резисторов снимается напряжение и через регулятор портаменто R114-C22 направляется на повторитель DA15. Это - управляюще напряжение для генератора тона.

leks
Offline
Зарегистрирован: 22.10.2017

Такой вариант вырисовывается, номинал 25 резистора будет, наверное, побольше. Главенство у кнопки с меньшим номером. Ток около 1 мА. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Скорее, наоборот, - для германиевых транзисторов R25 должен быть поменьше раза в полтора-два. Очень давно с ними не работал.

Мне кажется, оптимальнее была бы сборка из двух кремниевых pnp транзисторов. Но можно и так попробовать.

И емкость я бы либо сделал поменьше, либо - вообще убрал.

leks
Offline
Зарегистрирован: 22.10.2017

andriano пишет:

Скорее, наоборот, - для германиевых транзисторов R25 должен быть поменьше раза в полтора-два. Очень давно с ними не работал.

Мне кажется, оптимальнее была бы сборка из двух кремниевых pnp транзисторов. Но можно и так попробовать.

И емкость я бы либо сделал поменьше, либо - вообще убрал.

Да, с номиналом резистора явно я тупанул. Конденсатор уберу, но в предидущих вариантах наборов кнопок иногда "проскакивали помехи", при номинале в 0,1 мкф кнопки тормозили на реакцию смены ноты.

Роюсь в сканах журналов, начал с 1976 г. И правда, повальное увлечение ЭМИ. "Но до клавиатур пока не нашёл".

leks
Offline
Зарегистрирован: 22.10.2017

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Arduino UNO
//
////////////////////////
//
//программа  ЭМИ вариант 3 с запретом нажатия более 1 кнопки и выводом данных на монитор порта //
unsigned int  n=0;//номер кнопки
unsigned int  x=0;
unsigned int  x1=0;unsigned int  k=10;
long y1 = 0;
long y2 = 0;

int tabl [26] ={1046,988,932,880,830,784,740,698,659,622,587,554,523,494,466,440,415,392,370,349,329,311,293,277,261,0};  // зашифрованные данные нот – их частоты


void setup()    
   {
          pinMode(13, OUTPUT);
          digitalWrite(13, LOW);
          pinMode(A0, INPUT);delay(1000);
          x1=analogRead(A0);if(x1>948){k=15;}if(x1>960){k=30;}
          Serial.begin(9600);
   }
        void loop()
      {
       
         y2=millis();
         if (y2-y1>=250)
         {y1=y2; Serial.println("x1,x,n");Serial.println(x1);Serial.println(x);
         Serial.println(n);}

       
       
        x=analogRead(A0); n=map(x, -5, x1+k, 0, 26);//определение номера кнопки
        if ( n<25) {tone (13, tabl[n],250);} // исполнение вызванной ноты
        else { noTone(13);}
         
 
       }
    
//
// Конец /
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////

Чуть редактировал схему, резистор R26 всего 160 ом и падает на нём 0,16 В.Собрал клавиатуру, погонял по скетчу, пришлось шаманить с x1, k. Видимо транзисторы реагируют на температуру, при не нажатых кнопках и включениях в разное время на А0 попадает от 946 до 966.

 

 

leks
Offline
Зарегистрирован: 22.10.2017
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Arduino UNO
//
////////////////////////
//
//программа  ЭМИ с выводом данных в монитор порта //
unsigned int  n=0;//номер кнопки
unsigned int  x=0;
unsigned int  x1=0;unsigned int  k=10;
long y1 = 0;
long y2 = 0;

int tabl [26] ={1046,988,932,880,830,784,740,698,659,622,587,554,523,494,466,440,415,392,370,349,329,311,293,277,261,0};  // зашифрованные данные нот – их частоты


void setup()    
   {
          pinMode(13, OUTPUT);
          digitalWrite(13, LOW);
          pinMode(A0, INPUT);delay(1000);
          x1=analogRead(A0);
          Serial.begin(9600);
   }
        void loop()
      {
       
         y2=millis();
         if (y2-y1>=250)
         {y1=y2; Serial.println("x1,x,n");Serial.println(x1);Serial.println(x);
         Serial.println(n);}

       
       
        x=analogRead(A0);if(x>x1){x1=x;}if(x1<=948){k=10;}if(x1>948){k=15;}if(x1>960){k=30;} 
        n=map(x, -5, x1+k, 0, 26);//определение номера нажатой кнопки
        if ( n<25) {tone (13, tabl[n],25);} // исполнение вызванной ноты
        else { noTone(13);}
         
 
       }
    
//
// Конец /
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

 

Окончательный вариант скетча. Родственники набаловались, подбирая мелодии на слух. Возник у них вопрос, почему нельзя несколько нот одновременно?.. 

...Как избавиться от Tone примерно ясно мне, с клавиатурой - пока вопрос.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

leks, пальцы то не жалко в такие кнопки тыкать? Не понятен смысл проекта -если потренироваться писать простые скетчи -то ладно. А поиграть-побаловаться удобнее на компьютере и компьютерной клавиатуре, с нормальным миди-трекером. Там и звуки любые настроить можно, и несколько кнопок -без проблем.

leks
Offline
Зарегистрирован: 22.10.2017

Конечно потренироваться. Вот задали они вопрос - почему Ардуина у меня две, три ноты не играет сразу и возник интерес - а как сделать?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

leks, думаю для начинающего это неподъёмная задача. Если очень хочется что-то поделать поищите другие направления.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

leks пишет:

Конечно потренироваться. Вот задали они вопрос - почему Ардуина у меня две, три ноты не играет сразу и возник интерес - а как сделать?

Ну, например, так: http://arduino.ru/forum/proekty/floppy-hdd-music

Хотя, на мой взгляд, для более или менее вменяемого многоголосия следут применять аппаратную поддержку. Хотя бы такую: https://ru.aliexpress.com/item/VS1053-vs1053b-MP3/32842502963.html

leks
Offline
Зарегистрирован: 22.10.2017

Пока видится решение в "научиться" пищать две разные ноты одновременно в два пьезоизлучателя.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Ну, можно и так.

Можно просуммировать сигналы с разных пинов на ОУ, а затем на УНЧ.

leks
Offline
Зарегистрирован: 22.10.2017
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Arduino UNO
//
////////////////////////
//
//программа  ЭМИ с выводом данных в монитор порта //
unsigned int  n=0;//номер кнопки
unsigned int  x=0;
unsigned int  x1=0;unsigned int  k=10;
long y1 = 0;
long y2 = 0;
long y3 = 0;
long y4 = 0;
long i = 0;long n1 = 0;
int c=0;
///int tabl [26] ={1046,988,932,880,830,784,740,698,659,622,587,554,523,494,466,440,415,392,370,349,329,311,293,277,261,0};  // зашифрованные данные нот – их частоты
int tabl1 [26]={478,506,536,568,602,637,676,716,759,804,852,902,956,1012,1073,1136,1205,1275,1351,1433,1519,1607,1706,1805,1915,0};

void setup()    
   {
          pinMode(13, OUTPUT);
          digitalWrite(13, LOW);
          pinMode(A0, INPUT);delay(1000);
          x1=analogRead(A0);
          Serial.begin(9600);
   }
        void loop()
      {
       
         y2=millis();
        if (y2-y1>=250)
        {y1=y2; Serial.println("x1,x,n");Serial.println(x1);Serial.println(x);
         Serial.println(n);}

       
       
        c=0; x=analogRead(A0);if(x>x1){x1=x;}if(x1<=948){k=10;}if(x1>948){k=15;}if(x1>960){k=30;} 
        n=map(x, -5, x1+k, 0, 26);//определение номера нажатой кнопки
        //////////////////////////////////////////////////////////////////////////////////
        if ( n<25) {while(c<20){ i= micros(); //присваиваем переменной текущее время
                 if ((i - n1) >=tabl1[n])  // если разница предыдущего значения и текущего… 
                {
                  n1=i;   // заменяем предыдущее значение текущим
                 digitalWrite(13,! digitalRead (13));    //инвертируем состояние вывода  
                  
               c++; }}} ////////////////////////////////////////// исполнение вызванной ноты
      //// else {digitalWrite(13, LOW); }


                

         
 
       }
    
//
// Конец /
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////

Не очень то Ардуино играет без "тоне", ноты переодически могут в звучании исказиться. И это пока один канал... 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

На фото это что, реальные МП42 транзисторы?
Ну вы даёте!

leks
Offline
Зарегистрирован: 22.10.2017

Да, 70 и 72 года выпуска, июня и июля.

sadman41
Offline
Зарегистрирован: 19.10.2016

leks пишет:

Да, 70 и 72 года выпуска, июня и июля.

Blast from the past? ))

leks
Offline
Зарегистрирован: 22.10.2017

Да, чуть старше меня. Просто много их, много лет лежат как память. А в лом мне "влом", пусть другие...