Вопрос по ADKeyboard Module

Обсуждаем Arduino, Raspberry Pi и другие электронные компоненты и проекты DIY
Ответить
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1018
Зарегистрирован: 22 окт 2010, 23:57

Вопрос по ADKeyboard Module

Сообщение Mr.Kubikus »

Подскажите, пожалуйста, можно ли использовать данную клавиатуру не с Arduino, а микроконтроллером ATMega16? Если можно, то подскажите, пожалуйста, как? Использовать АЦП?
Эту клавиатуру можно использовать с любым микроконтроллером у которого есть АЦП, в том числе и с ATMega16.

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

Пример кода для Arduino:

Код: Выделить всё

//ADKeyboard Module
//Developed by DFRobot.com
//Last modified 30/11/2011
//Version 1.0
int adc_key_val[5] ={50, 200, 400, 600, 800 };
int NUM_KEYS = 5;
int adc_key_in;
int key=-1;
int oldkey=-1;
void setup()
{
  pinMode(13, OUTPUT);  //we'll use the debug LED to output a heartbeat
  Serial.begin(9600); // 9600 bps
}
void loop()
{
  adc_key_in = analogRead(0);    // read the value from the sensor 
  digitalWrite(13,LOW); 
  key = get_key(adc_key_in);  // convert into key press
 
  if (key != oldkey)   // if keypress is detected
   {
    delay(50);  // wait for debounce time
    adc_key_in = analogRead(0);    // read the value from the sensor 
    key = get_key(adc_key_in);    // convert into key press
    if (key != oldkey)    
    {   
      oldkey = key;
      if (key >=0){
        digitalWrite(13,HIGH);
        switch(key)
        {
           case 0:Serial.println("S1 OK");   
                  break;
           case 1:Serial.println("S2 OK");   
                  break;
           case 2:Serial.println("S3 OK");   
                  break;
           case 3:Serial.println("S4 OK");   
                  break;      
           case 4:Serial.println("S5 OK");   
                  break;  
        }                
      }
    }
  }
 delay(100);
}
// Convert ADC value to key number
int get_key(unsigned int input)
{
    int k;
    for (k = 0; k < NUM_KEYS; k++)
    {
      if (input < adc_key_val[k])
     {
            return k;
        }
   }
       if (k >= NUM_KEYS)k = -1;  // No valid key pressed
       return k;
}
Константы задаются в массиве adc_key_val[].
С уважением, Григорий
GitHub FB ВК
Perdimonocle
Сообщения: 5
Зарегистрирован: 08 фев 2012, 13:11

Re: Вопрос по ADKeyboard Module

Сообщение Perdimonocle »

А эта клавиатура подключается к ATMega16 напрямую? Нужны ли подтягивающие резисторы? Или нет?
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1018
Зарегистрирован: 22 окт 2010, 23:57

Re: Вопрос по ADKeyboard Module

Сообщение Mr.Kubikus »

На следующей картинке показано как подключать эту клавиатуру:
ADKeyboardModule.jpg
ADKeyboardModule.jpg (25.37 КБ) 15649 просмотров
Дополнительные подтягивающие резисторы не нужны.
С уважением, Григорий
GitHub FB ВК
Perdimonocle
Сообщения: 5
Зарегистрирован: 08 фев 2012, 13:11

Re: Вопрос по ADKeyboard Module

Сообщение Perdimonocle »

Большое спасибо!
Perdimonocle
Сообщения: 5
Зарегистрирован: 08 фев 2012, 13:11

Re: Вопрос по ADKeyboard Module

Сообщение Perdimonocle »

Григорий Зайцев писал(а):Эту клавиатуру можно использовать с любым микроконтроллером у которого есть АЦП, в том числе и с ATMega16.
Я в программировании микроконтроллеров новичок.
Подскажите, пожалуйста, можно ли "переписать" вышеуказанный код из Ардуино в WinAvr только средствами языка Си?

Не знаю чем заменить на Си (WinAvr) такие операторы как:
Serial.begin()
analogRead()
digitalWrite(,)
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1018
Зарегистрирован: 22 окт 2010, 23:57

Re: Вопрос по ADKeyboard Module

Сообщение Mr.Kubikus »

Переписать скорее всего можно. Придется работать с регистрами на низком уровне или использовать какую-либо библиотеку для C, упрощающую работу с периферией.
С уважением, Григорий
GitHub FB ВК
Ответить