PCCar.ru - Ваш автомобильный компьютер

Вернуться   PCCar.ru - Ваш автомобильный компьютер > MP3Car ТехИнфа > Разработка программ > Программы управления > iCarDS

Ответ
 
Опции темы Поиск в этой теме
Старый 05.11.2013, 23:23   #581
Glouck
Старший Пользователь
 
Регистрация: 03.10.2006
Возраст: 51
Город: Moscow
Регион: 77, 97, 99, 177
Машина: Nissan Elgrand
Сообщений: 246
Glouck will become famous soon enough
По умолчанию

Собрал сей девайс для управления резистивными кнопками. Заработало с первого раза, огромное спасибо Андрею за прошивку и плагин. После пары дней использования возникло пожелание - сейчас реализован автоповтор любой нажатой кнопки, но он нужен, IMHO, только для кнопок громкости, а для остальных кнопок логичней использовать долгое нажатие как другую команду. Особенно актуально, если физических кнопок не много (у меня их всего 5 шт на руле). Возможно ли такое реализовать?

И еще, у меня одна из штатных кнопок вообще без резистора - т.е. замыкает накоротко, и прошивка ее игнорирует. Я, конечно, поправил прошивку себе, но вдруг еще у кого-то такая проблема возникнет...
Glouck вне форума   Ответить с цитированием
Старый 05.11.2013, 23:27   #582
Dj Aleks
Старший Пользователь
 
Аватар для Dj Aleks
 
Регистрация: 13.05.2010
Возраст: 40
Город: Воронеж
Регион: 36
Машина: Jetta 6
Сообщений: 899
Dj Aleks is infamous around these parts
По умолчанию

Цитата:
Сообщение от Glouck Посмотреть сообщение
Собрал сей девайс для управления резистивными кнопками. Заработало с первого раза, огромное спасибо Андрею за прошивку и плагин. После пары дней использования возникло пожелание - сейчас реализован автоповтор любой нажатой кнопки, но он нужен, IMHO, только для кнопок громкости, а для остальных кнопок логичней использовать долгое нажатие как другую команду. Особенно актуально, если физических кнопок не много (у меня их всего 5 шт на руле). Возможно ли такое реализовать?

И еще, у меня одна из штатных кнопок вообще без резистора - т.е. замыкает накоротко, и прошивка ее игнорирует. Я, конечно, поправил прошивку себе, но вдруг еще у кого-то такая проблема возникнет...
если я правильно понял то есть функция shift
__________________
Мой проект http://pccar.ru/showthread.php?t=18618

Поспешишь, AIRBAG распушишь...

Dj Aleks вне форума   Ответить с цитированием
Старый 07.11.2013, 06:17   #583
Glouck
Старший Пользователь
 
Регистрация: 03.10.2006
Возраст: 51
Город: Moscow
Регион: 77, 97, 99, 177
Машина: Nissan Elgrand
Сообщений: 246
Glouck will become famous soon enough
По умолчанию

Цитата:
Сообщение от Glouck Посмотреть сообщение
сейчас реализован автоповтор любой нажатой кнопки, но он нужен, IMHO, только для кнопок громкости, а для остальных кнопок логичней использовать долгое нажатие как другую команду.
В общем, переделал прошивку на долгие нажатия вместо автоповтора. Если надо кому - пишите...
Glouck вне форума   Ответить с цитированием
Старый 07.11.2013, 11:55   #584
OsDima
Старший Пользователь
 
Регистрация: 25.06.2011
Возраст: 54
Город: Красноярск
Регион: 24
Машина: Nissan Wingroad WFY-11 2003
Сообщений: 166
OsDima will become famous soon enough
По умолчанию

Цитата:
Сообщение от Glouck Посмотреть сообщение
В общем, переделал прошивку на долгие нажатия вместо автоповтора. Если надо кому - пишите...
Конечно надо. Режим "шифт" мне не очень нравится (надо помнить в каком он режиме "шифт или "не шифт".
OsDima вне форума   Ответить с цитированием
Старый 07.11.2013, 21:29   #585
Glouck
Старший Пользователь
 
Регистрация: 03.10.2006
Возраст: 51
Город: Moscow
Регион: 77, 97, 99, 177
Машина: Nissan Elgrand
Сообщений: 246
Glouck will become famous soon enough
По умолчанию

Цитата:
Сообщение от OsDima Посмотреть сообщение
Конечно надо.
Вот кусок прошивки отвечающий за кнопки. Сделано на основе прошивки Андрея. Писал левой ногой, сильно не пинайте...
Код:
#include <EEPROM.h>
#define RES_KEY_FLAG_ 0x16  // Флаг первого запуска скетча

byte bytes[4];

//-----------------------------------------
//- входы(пины) ардуино                   -
//-----------------------------------------

const int RES_PIN = 5 ;       // аналоговый вход(пин) для резестивных(рулевых) кнопок 

//-----------------------------------------
//- переменные включения функций скетча   -
//-----------------------------------------

boolean is_res_keys = false;

//-----------------------------------------
//- Новые переменные для кнопок

#define RES_BT_CNT 50  // макс кол-во кнопок
#define VOL_BT_CNT 2  // кол-во кнопок с автоповтором
#define RES_DT_MIN 5  // мин значение АЦП
#define  RES_DT_MAX 1020  // макс значение АЦП
unsigned long res_key_wait_long = 600;  // задержка длинного нажатия кнопки (ms)
unsigned int key_to_send = 0;
boolean res_key_hold = false;

//-----------------------------------------
//- Переменные для резистивных кнопок     -
//-----------------------------------------

unsigned long  res_dt = 0; 
unsigned long  res_dt_sum = 0; 
#define RES_DT_COUNT 400 // Количество считываемых данных
#define RES_DT_SKIP_COUNT 100 // Количество данных, которые надо пропустить при нажатии
#define RES_DT_POINT 6 // Точность
int res_dt_n = 0;
unsigned long res_key = 0;
unsigned long res_key_old = 0;
unsigned long res_key_wait_next = 200;  // задержка автоповтора (ms)
unsigned long res_key_wait_millis = 0;
unsigned long res_key_millis;
unsigned long res_key_array[RES_BT_CNT + 1][2];
unsigned int res_key_count = 0;
unsigned int res_key_delta = 3;

//-----------------------------------------
void setup() {                

  Serial.begin(115200); 
    res_key_millis = millis();
    
    unsigned int first_run_key = EEPROM.read(0);
    if ( first_run_key == RES_KEY_FLAG_ )
    {
      res_key_count = EEPROM.read(1);
      //EEPROM.write(addr, val);
      for(int i=0; i<res_key_count;i++) 
      { 
        res_key_array[i][0] = (EEPROM.read(i+2) * 256) + EEPROM.read(i+2+RES_BT_CNT) - res_key_delta; res_key_array[i][1] = res_key_array[i][0] + res_key_delta + res_key_delta; 
      }
    }
    for(int i=res_key_count; i<(RES_BT_CNT+1);i++) 
    { 
      res_key_array[i][0] = 0xFFFFFFFF; res_key_array[i][1] = 0xFFFFFFFF; 
    }

}

//-----------------------------------------
void loop() {

  if (Serial.available() >= 1) // Проверяем наличие команд от компьютера
  {
    switch (Serial.read())
    {
     case 0x06: // включить передачу данных от резестивных кнопок
       is_res_keys = true;
     break;

     case 0x86: // выключить передачу данных от резестивных кнопок
       is_res_keys = false;
     break;

    }
  }
  if( is_res_keys ) res_keys();                        //  резистивные кнопки
//  res_keys();
  
}

//----------------------------------------------------------------------------------
// Функция работы с резистивными кнопками
//----------------------------------------------------------------------------------
void res_keys()
{  
  {
    res_dt = analogRead(RES_PIN); // прочитать данные АЦП 
    if( res_dt >= RES_DT_MIN && res_dt <= RES_DT_MAX )
    { 
      res_dt_n++;
      if( res_dt_n > RES_DT_SKIP_COUNT )
      {
        res_dt_sum += (res_dt << RES_DT_POINT);
        if( res_dt_n == RES_DT_COUNT)
        { 
//          res_key = (res_dt_sum / (RES_DT_COUNT - RES_DT_SKIP_COUNT));
          res_key = (((((( res_dt_sum / (( RES_DT_COUNT - RES_DT_SKIP_COUNT ) + (2^(RES_DT_POINT-1)-1) ) >> (RES_DT_POINT-1)) + 1) >> 1) + 1)>> 1)); // + 1) >> 1;
          res_dt_sum = 0; res_dt_n = 0;
        }
       }
    }
    else
    {
      res_dt_sum = 0; res_dt_n = 0; res_key = 0;
      res_key_wait_millis = 0;
    }
  }

//  обработка нажатия
  int key_code = 0;

  if (res_key != 0)  // что-то нажато
  {
    key_code = keyCode(res_key);
    if (key_code <= VOL_BT_CNT)  // первые кнопки с автоповтором
    {
      if (res_key_old == res_key)  // удержание кнопки
      {
        if (millis() - res_key_wait_millis > res_key_wait_next)  // задержка автоповтора
        {
          sendKey(key_code);
          res_key_wait_millis = millis();
        }
      }
      else
      {
        sendKey(key_code);
        res_key_wait_millis = millis();
        res_key_old = res_key;
      }
    }
    else  // кнопки с долгим нажатием
    {
      if (res_key_old == res_key)  // удержание кнопки
      {
        if (millis() - res_key_wait_millis > res_key_wait_long)   // длинное нажатие
        {
          if (!res_key_hold)
          {
            sendKey(key_code+RES_BT_CNT);
            res_key_wait_millis = millis();
            res_key_hold = true;
          }
        }
      }
      else
      {
        key_to_send = key_code;
        res_key_wait_millis = millis();
        res_key_old = res_key;
      }
    }
  }
  else  // ничего не нажато
  {
    res_key_old = 0;
    if (key_to_send != 0 && !res_key_hold) sendKey(key_to_send);
    res_key_hold = false;
    key_to_send = 0;
  }
}

void sendKey(int key_code)
{
  bytes[0] = 0xAA;          // преобразовать в 4-байта  
  bytes[1] = 0;  
  bytes[2] = RES_PIN; 
  bytes[3] = key_code; 
  Serial.write( bytes,4); // отправить прочитаное значение компьютеру
/*
  Serial.write(bytes[3]+0x30); // отправить прочитаное значение компьютеру
  Serial.print(" ");
  Serial.print(res_key,DEC);
  Serial.println("");
*/
}

unsigned int keyCode(unsigned long key_res)
{
  int i = 0; boolean exit = false;
  while( res_key_array[i][0] != 0xFFFFFFFF && (!exit) )
  {  // проверяем новая ли кнопка
    if( (res_key_array[i][0] <= key_res) && (key_res <= res_key_array[i][1]) ) exit = true; else i++;
  }
  if ( exit )  // кнопкка уже известная
  {
    return (i+1);
  }
  else {  // кнопка новая
    if ( res_key_count < RES_BT_CNT )
    {
      res_key_array[res_key_count][0] = key_res - res_key_delta;
      res_key_array[res_key_count][1] = key_res + res_key_delta;
      res_key_count++;
            
      EEPROM.write(1, res_key_count); // Запоминаем количество кнопок
      byte one_byte = key_res / 256;
      EEPROM.write(res_key_count+1, one_byte ); // Запоминаем старший байт значения кнопки
      one_byte = key_res - one_byte * 256;
      EEPROM.write(res_key_count+1+RES_BT_CNT, one_byte ); // Запоминаем младший байт значения кнопки
      EEPROM.write(0, RES_KEY_FLAG_);
            
      return res_key_count;
    }
    else
    {  // переполнение - больше кнопок не запоминаем
      bytes[0] = 0xAA;          // преобразовать в 4-байта  
      bytes[1] = 0xAA;  
      bytes[2] = (key_res & 0xFF00) >> 8; 
      bytes[3] = key_res & 0xFF; 
      Serial.write( bytes,4); // отправить прочитаное значение компьютеру
    }
  }
}
После заливки этого кода при первом включении, первые две нажатые кнопки будут с автоповтором (для регулировки громкости), остальные - обычные. Короткое нажатие работает на отпускание, длинное - по задержке в 600 мс.
Если надо переопределить кнопки для автоповтора - поменяйте значение RES_KEY_FLAG_ на любое другое число, и перезалейте прошивку. Если нужно больше двух кнопок с автоповтором - поменяйте значение VOL_BT_CNT.
Glouck вне форума   Ответить с цитированием
Старый 13.11.2013, 12:07   #586
jos911
Пользователь
 
Регистрация: 09.06.2009
Возраст: 45
Регион: 77, 97, 99, 177
Сообщений: 46
jos911 is on a distinguished road
По умолчанию

Ребята подскажите пожалуйста, а можно ли повесить резистивные кнопки так, что-бы они дублировали экранные кнопки в блоке реле. Хочется, сделать так- допустим нажал на экранную кнопку в плагине блок реле, выполнилось какое то действие, например: включился свет в салоне, но если я стаю на стоянке и монитор выключен, то я жму резистивную кнопку и она выполняет тоже действие, только если я свет включил с экранной кнопки то резистивная его выключает или наоборот.
Комп стоит в грузовике, блок резистивных кнопок хочу установить в "спальник", и что-бы каждый раз на бегать и включать монитор Было бы не плохо реализовать так.
Спасибо.
jos911 вне форума   Ответить с цитированием
Старый 13.11.2013, 12:44   #587
Bersenev
Бывалый писикарщик
 
Аватар для Bersenev
 
Регистрация: 23.04.2009
Возраст: 53
Город: Ставрополь
Регион: 26
Машина: Opel Zafira 2007
Сообщений: 5,275
Bersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant future
По умолчанию

Если речь о выключении кнопок при работающем компьютере, то вешаешь на резистивную кнопку команду икара duino_rеlay_1_toggle , вместо единицы указываешь свой номер реле.

А вот если комп выключен, то надо писать другой скетч для ардуино
Bersenev вне форума   Ответить с цитированием
Старый 13.11.2013, 12:48   #588
jos911
Пользователь
 
Регистрация: 09.06.2009
Возраст: 45
Регион: 77, 97, 99, 177
Сообщений: 46
jos911 is on a distinguished road
По умолчанию

Не, комп работает всегда, я уже забыл когда выключался я только монитор монитор выключаю что-бы не светился, спать мешает. Надо просто если с экрана включил - то с резистивной выключил и наоборот.
jos911 вне форума   Ответить с цитированием
Старый 15.11.2013, 23:28   #589
Fernando
Пользователь
 
Регистрация: 15.06.2009
Город: Москва
Регион: 77, 97, 99, 177
Машина: 2012\UAZ\PATRIOT LIMITED TDI
Сообщений: 37
Fernando is on a distinguished road
По умолчанию

А как назначить горячую клавишу на кнопку управления реле, что-то долгим нажатием не получается. Точнее, задача такая: внешняя программа посылает комбинацию клавиш по событию, по этой комбинации реле нужно включить на заданный интервал времени (1000мс). Как это сделать?
Fernando вне форума   Ответить с цитированием
Старый 26.11.2013, 14:29   #590
Tygra
Старший Пользователь
 
Регистрация: 18.03.2013
Город: Жезказган
Регион: Казахстан
Машина: Mazda MPV
Сообщений: 195
Tygra is a jewel in the roughTygra is a jewel in the roughTygra is a jewel in the roughTygra is a jewel in the rough
По умолчанию

Получил с почты ардуину мега 2560 , отковырял энкодер с муз центра старого, отдельно энкодер проверил, работает. Пытался загрузить скетч но получил ошибку
Цитата:
IRremoteInt.h:113: error: 'uint8_t' does not name a type
т.к. ардуину первый раз вижу, то полез к гуглу, выяснилось что для версии проги ардуины выше 1 ( у меня 1,0,5) нужно править библиотеку IRremoteInt.h , нужно дописать
Цитата:
#include <Arduino.h>
. Возможно что я велосипед изобретаю, но поиском не нашел ответа на форуме, а беглый поиск по 59 страницам ничего не дал. Если это уже не однократно было , удалите сей пост. А так м\б кому поможет....
P\S Запустил только один энкодер без всей остальной обвязки, круть, заработало все почти с пол пинка. Единственно что второй энкодер которого нет, глючил. Т.е. с него шел сигнал, но его физически нет, порт его висел в воздухе, заземлил пин второго энкодера и стало все замечательно..... Остальное еще не проверял, думаю "запилить" будет не сильно сложно....... Вот бы еще климат-контроль замутить .... Помимо приобретения самого икара, я бы подумал доплатить за модуль климы.
По поводу сервоприводов в ардуине http://wiki.amperka.ru/%D1%80%D0%BE%...BE%D0%B4%D1%8B

Последний раз редактировалось Tygra; 27.11.2013 в 09:43.
Tygra вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 3 (пользователей: 0 , гостей: 3)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.



Часовой пояс GMT +4, время: 04:49.


Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot