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

PCCar.ru - Ваш автомобильный компьютер (http://pccar.ru/index.php)
-   iCarDS (http://pccar.ru/forumdisplay.php?f=121)
-   -   iCarDS + Arduino = iCarDuino (http://pccar.ru/showthread.php?t=16718)

folv 27.12.2012 12:15

Вложений: 3
Цитата:

Сообщение от Bersenev (Сообщение 241508)
По предыдущему скриншоту увидел.



Так и должно быть. Теперь сделай следующее. Запусти терминал, нажимай на энкодер секунд 5, делай скриншот. Потом перезапускай или сбрасывай терминал и вращай энкодер в одну сторону секунд 5, делай скриншот, а потом тоже самое в другую сторону. И выкладывай скриншоты

понажимал по 5 сек., вот что получилось

admin 27.12.2012 14:25

580, 320, 510 тоже самое что и было

Bersenev 27.12.2012 15:48

Цитата:

Сообщение от folv (Сообщение 241520)
понажимал по 5 сек., вот что получилось

Теперь вроде видно порядок смены значений, вечерком повнимательнее проанализирую и и скажу какие значения и где изменить

Цитата:

Сообщение от admin (Сообщение 241531)
580, 320, 510 тоже самое что и было

Так никто не сомневался, но кроме самих значений важен ещё и порядок их смены.

Bersenev 27.12.2012 21:31

2 folv

Попробуй такую процедуру для энкодера

Код:

void encoder_1()
{
  if(
encoder1_key_millis + encoder1_key_wait_millis*2 < millis() ) { encoder1_key_old = 0; }
  if(
encoder1_millis + encoder1_wait_millis < millis() )
  {
   
encoder1_millis = millis();
   
encoder1_dt = analogRead(ENCODER1_PIN); // прочитать данные АЦП
   
   
if( encoder1_dt >= 0x224 && encoder1_dt <= 0x264 )
    {
// Здесь обрабатываем удержание кнопки
     
encoder1_key = ENCODER1_PIN;
     
encoder1_key = (encoder1_key << 16) | 0x030000EE;
      if (
encoder1_key == encoder1_key_old )
      {
// Здесь обрабатываем удержание кнопки
       
if( encoder1_key_millis + encoder1_key_wait_millis < millis() )
        {
         
bytes[0] = encoder1_key & 0xFF;          // преобразовать в 4-байта 
         
bytes[1] = (encoder1_key & 0xFF00) >> 8
         
bytes[2] = (encoder1_key & 0xFF0000) >> 16;
         
bytes[3] = (encoder1_key & 0xFF000000) >> 24;
         
Serial.write( bytes,4); // отправить прочитаное значение компьютеру
         
encoder1_key_millis = millis(); encoder1_key_wait_millis = encoder1_key_wait; //ir_wait_next;
       
}
      }
      else
      {
// Здесь обрабатываем первое нажатие кнопки
       
encoder1_key_millis = millis(); encoder1_key_wait_millis = 50; //ir_wait_first;
     
}
     
encoder1_key_old = encoder1_key;
    }
    else
    {
      if(
encoder1_dt >= 0x3C0 && encoder1_dt <= 0x3FF && encoder1_key3 != 1 )
      {
        if( (
encoder1_key2 == 2) && (encoder1_key3 == 3))
        {
         
bytes[0] = 0xEE;          // преобразовать в 2-байта
         
bytes[1] = 0;
         
bytes[2] = ENCODER1_PIN;
         
bytes[3] = 1;
         
Serial.write( bytes,4); // отправить прочитаное значение компьютеру   
       
}
        else
        {
          if( (
encoder1_key2 == 3) && (encoder1_key3 == 2) )
          {
           
bytes[0] = 0xEE;          // преобразовать в 2-байта
           
bytes[1] = 0;
           
bytes[2] = ENCODER1_PIN;
           
bytes[3] = 2;
           
Serial.write( bytes,4); // отправить прочитаное значение компьютеру   
         
}
        }
       
encoder1_key1=encoder1_key2; encoder1_key2=encoder1_key3; encoder1_key3=1;
      }
      else
      {
        if(
encoder1_dt >= 0xC3 && encoder1_dt <= 0x113 && encoder1_key3 != 2 )
        {
         
encoder1_key1=encoder1_key2; encoder1_key2=encoder1_key3; encoder1_key3=2;
        }
        else
        {
          if(
encoder1_dt >= 0x120 && encoder1_dt <= 0x160 && encoder1_key3 != 3 )
          {
           
encoder1_key1=encoder1_key2; encoder1_key2=encoder1_key3; encoder1_key3=3;
          }
        }
      }
    }
  }
}

Если заработает, то сделай то же самое для второго энкодера

И ещё в адуино V.7 лучше вешать на аналоговый пин №7 резестивные кнопки. А энкодеры на 5 и 6-й пин.

folv 28.12.2012 06:45

Цитата:

Сообщение от Bersenev (Сообщение 241557)
2 folv

Попробуй такую процедуру для энкодера

Если заработает, то сделай то же самое для второго энкодера

И ещё в адуино V.7 лучше вешать на аналоговый пин №7 резестивные кнопки. А энкодеры на 5 и 6-й пин.

Все заработало, большое спасибо!:notworthy:
в адуино V.7 сразу переписал
PHP код:

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


folv 28.12.2012 13:14

1. Можно вопросик ели это не секрет:blush:

if( encoder1_dt >= 0x224 && encoder1_dt <= 0x264 ) - это для кнопки я понял как вычислить

А для вращения в влево и право - не допонял эти значения
if( encoder1_dt >= 0x3C0 && encoder1_dt <= 0x3FF && encoder1_key3 != 1 )
if( encoder1_dt >= 0xC3 && encoder1_dt <= 0x113 && encoder1_key3 != 2 )
if( encoder1_dt >= 0x120 && encoder1_dt <= 0x160 && encoder1_key3 != 3 )


2. Длина проводов до енкодора кретична или нет?

Bersenev 28.12.2012 13:48

Цитата:

Сообщение от folv (Сообщение 241581)
А для вращения в влево и право - не допонял эти значения


if( encoder1_dt >= 0x3C0 && encoder1_dt <= 0x3FF && encoder1_key3 != 1 )
- 3FF выдаётся когда в энкодер находится в нулевом положении, когда не нажата ни одна кнопка. Но в связи с тем что и в этом положении бывает дребезг (видно из скриншотов), то задаём некоторый диапозон задав минимальное значение 3C0
if( encoder1_dt >= 0xC3 && encoder1_dt <= 0x113 && encoder1_key3 != 2 )
if( encoder1_dt >= 0x120 && encoder1_dt <= 0x160 && encoder1_key3 != 3 )


При повороте в одну сторону у тебя происходит выдача таких значений 3FF -- F3 -- 140 -- 3FF, а в другую 3FF -- 140 --F3 -- 3FF. Отсюда и диапазон для F3 (C3 - 113), а для 140 (120 - 160). Разумеется всё в шестнадцатеричной системе

Цитата:

Сообщение от folv (Сообщение 241581)
2. Длина проводов до енкодора кретична или нет?

При тестах были метровые провода, всё работало без сбоев

folv 28.12.2012 19:15

Вложений: 1
Данный скетч из шапки на ардуино Nano V.4 не помещается - большой размер

folv 28.12.2012 19:37

А в этом плагине реализовано - двойное нажатие и поворот с нажатием?

Bersenev 28.12.2012 21:29

Цитата:

Сообщение от folv (Сообщение 241607)
Данный скетч из шапки на ардуино Nano V.4 не помещается - большой размер

Можно выкинуть из скетча код не используемых функций


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

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