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 15.12.2012 17:14

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

Сообщение от Bersenev (Сообщение 240512)
У меня есть два ардуино v.5 и v.7, оба работают без проблем. На других я не тестировал.

Но я не пойму, почему CyberBoard Mega не получает команду на включение процедуры резестивных кнопок от плагина. Сделай скриншот настроек порта ардуино в windows, сравню со своими, может там что не так.

У тебя ардуино v.5 и v.7 наверное на Atmega-328 - может в этом вся загвоздка?
Сделал скриншот настроек

YraY 16.12.2012 12:01

Цитата:

Сообщение от folv (Сообщение 240506)
При таком методе заработал только CyberBoard Mega, а от Carduino Nano V4 так и не активности.
получается нормально работать будет только с Carduino Nano Duo V.7?:dntknw:

у меня после вот этого
Цитата:

if( is_res_keys ) res_keys(); // резестивные кнопки
сделай так
res_keys(); // резестивные кнопки
старый Carduino Nano заработал, какой версии он не помню, но с резистивными кнопками и ИК, работает нормально без нареканий.
А вот с датчиками температуры и энкодерами что-то не получилось, но я с ними и не сильно старался но столе попробовал, не заработали и забил на них. Win7 x32.

holywillie 20.12.2012 23:35

Подскажите уличный градусник застыл на 85 салон работает где искать?

awtoap 20.12.2012 23:44

Возможно либо обрыв линии, либо КЗ через попадание влаги. Также возможен выход из строя самого датчика.

Alex-NN 20.12.2012 23:44

Цитата:

Сообщение от holywillie (Сообщение 241077)
Подскажите уличный градусник застыл на 85 салон работает где искать?

У меня периодически та же фигня. :yes2: Но не постоянно, а через какое-то время после начала работы системы.
Правда у меня ардуино не запитан от 5 В. Просто USB. Может быть в этом дело...:dntknw:

holywillie 20.12.2012 23:55

Цитата:

Сообщение от awtoap (Сообщение 241078)
Возможно либо обрыв линии, либо КЗ через попадание влаги. Также возможен выход из строя самого датчика.

спасибо видать последствия ледяного дождя

holywillie 22.12.2012 12:49

Датчик DS18B20 можно заменить на DS1820?

awtoap 22.12.2012 20:05

нет...они разные.

folv 26.12.2012 19:29

На ардуино V.7 все заработало:shok:, кроме энкодеров - сопротивления для "кнопки, А и В" можно поменять на другие? просто не нашел под рукой 1,8 и 3,2 кОм.

Bersenev 26.12.2012 19:35

Цитата:

Сообщение от folv (Сообщение 241488)
кроме энкодеров - сопротивления для "кнопки, А и В" можно поменять на другие? просто не нашел под рукой 1,8 и 3,2 кОм.

можно, но тогда придётся в процедурах обработки энкодеров подбирать новый значения

folv 26.12.2012 19:50

Цитата:

Сообщение от Bersenev (Сообщение 241489)
можно, но тогда придётся в процедурах обработки энкодеров подбирать новый значения

А как подобрать эти значения и в каких строках? Если не трудно:blush:

Bersenev 26.12.2012 20:26

Цитата:

Сообщение от folv (Сообщение 241490)
А как подобрать эти значения и в каких строках? Если не трудно:blush:

Менять надо в этих строках, то что выделено красным

if( encoder1_dt >= 0x226 && encoder1_dt <= 0x2a6 )


if( encoder1_dt >= 0x3E0 && encoder1_dt <= 0x410 && encoder1_key3 != 1 )

if( encoder1_dt >= 0xA0 && encoder1_dt <= 0xF0 && encoder1_key3 != 2 )

if( encoder1_dt >= 0x1A0 && encoder1_dt <= 0x200 && encoder1_key3 != 3 )

а вот что бы получить нужные значения наверно придётся написать скетч как для резестивных кнопок и через какую-нибудь программу-терминал общения с com-портом получить эти значения вращая энкодер.

folv 26.12.2012 20:47

Цитата:

Сообщение от Bersenev (Сообщение 241491)
Менять надо в этих строках, то что выделено красным

if( encoder1_dt >= 0x226 && encoder1_dt <= 0x2a6 )


if( encoder1_dt >= 0x3E0 && encoder1_dt <= 0x410 && encoder1_key3 != 1 )

if( encoder1_dt >= 0xA0 && encoder1_dt <= 0xF0 && encoder1_key3 != 2 )

if( encoder1_dt >= 0x1A0 && encoder1_dt <= 0x200 && encoder1_key3 != 3 )

а вот что бы получить нужные значения наверно придётся написать скетч как для резестивных кнопок и через какую-нибудь программу-терминал общения с com-портом получить эти значения вращая энкодер.

по отдельности для каждого вывода А (key3 != 1 ), В (key3 != 2 ) и кнопка (key3 != 3)
а это общее значение if( encoder1_dt >= 0x226 && encoder1_dt <= 0x2a6 )

Bersenev 26.12.2012 20:57

это кнопка(нажатие)

if( encoder1_dt >= 0x226 && encoder1_dt <= 0x2a6 )


А это вращение влево или в право.

if( encoder1_dt >= 0x3E0 && encoder1_dt <= 0x410 && encoder1_key3 != 1 )

if( encoder1_dt >= 0xA0 && encoder1_dt <= 0xF0 && encoder1_key3 != 2 )

if( encoder1_dt >= 0x1A0 && encoder1_dt <= 0x200 && encoder1_key3 != 3 )

Дело в том, что для выводов А и В есть три значения сопротивлений, а не два. И порядок смены этих сопротивлений и определяет в какую сторону вращается энкодер.

folv 26.12.2012 21:04

Цитата:

Сообщение от Bersenev (Сообщение 241495)
это кнопка(нажатие)

if( encoder1_dt >= 0x226 && encoder1_dt <= 0x2a6 )


А это вращение влево или в право.

if( encoder1_dt >= 0x3E0 && encoder1_dt <= 0x410 && encoder1_key3 != 1 )

if( encoder1_dt >= 0xA0 && encoder1_dt <= 0xF0 && encoder1_key3 != 2 )

if( encoder1_dt >= 0x1A0 && encoder1_dt <= 0x200 && encoder1_key3 != 3 )

Дело в том, что для выводов А и В есть три значения сопротивлений, а не два. И порядок смены этих сопротивлений и определяет в какую сторону вращается энкодер.

так это максимальное и минимальное значение в шестнадцатеричном отображении?

Bersenev 26.12.2012 21:07

Цитата:

Сообщение от folv (Сообщение 241496)
так это максимальное и минимальное значение в шестнадцатеричном отображении?

Да, но можешь и в десятичном виде их записать. Просто я получал значения сопротивлений в шестнадцатеричном виде, поэтому так и записал

folv 26.12.2012 21:26

Цитата:

Сообщение от Bersenev (Сообщение 241497)
Да, но можешь и в десятичном виде их записать. Просто я получал значения сопротивлений в шестнадцатеричном виде, поэтому так и записал

А можно скетч для получения значений и в какой программе-терминал получить :blush:, а в этом я не очень:no:

Bersenev 26.12.2012 21:37

Цитата:

Сообщение от folv (Сообщение 241498)
А можно скетч для получения значений и в какой программе-терминал получить :blush:, а в этом я не очень:no:

Здесь сложнее, я получаю эти данные через отладчик скина, модифицирую плагин и скетч, а для такого варианта придётся много чего установить.

Самый простой вариант это найти ближайшие по номиналу сопротивления и подкорректировать значения расширяя диапозоны.

Или бери скетч для резестивных кнопок от Chip-а, он фактически выдаёт значения сопротивлений

folv 26.12.2012 21:47

Цитата:

Сообщение от Bersenev (Сообщение 241499)
Здесь сложнее, я получаю эти данные через отладчик скина, модифицирую плагин и скетч, а для такого варианта придётся много чего установить.

Самый простой вариант это найти ближайшие по номиналу сопротивления и подкорректировать значения расширяя диапозоны.

Или бери скетч для резестивных кнопок от Chip-а, он фактически выдаёт значения сопротивлений

скетч для резестивных кнопок от Chip-а
получились значения Ноткей
А = 510
В = 320
и еще 243
кнопка 580

Вставлял их на 20 больше и меньше.

не работает

Bersenev 26.12.2012 21:58

Цитата:

Сообщение от folv (Сообщение 241500)
скетч для резестивных кнопок от Chip-а
получились значения Ноткей

Дай ссылку на скетч или сам скетч

folv 26.12.2012 22:01

Цитата:

Сообщение от Bersenev (Сообщение 241501)
Дай ссылку на скетч или сам скетч

PHP код:

//http://compcar.ru 
 #define PIN 5 //номер аналогового порта 
 #define LIMIT 10 //предел погрешности сопротивления 

 
byte bytes[2]; 
 
int res_dt1res_d

 
void setup() 
 { 
 
Serial.begin(115200); // настроить скорость com порта 
 


 
void loop() 
 { 
 
res_d analogRead(PIN); // прочитать данные АЦП 
 
delay(30); 
 
res_dt1 analogRead(PIN); // прочитать данные АЦП 


 
if( res_dt1 res_d-LIMIT && res_dt1 res_d+LIMIT //если нет дребезга то короткое нажатие 
 

 
bytes[0] = res_d 255// преобразовать в 2-байта 
 
bytes[1] = (res_d 768) >> 8
 
Serial.writebytes,2); // отправить прочитаное значение компьютеру 
 

 } 


Bersenev 26.12.2012 22:13

читаешь нормально, теперь вопрос чем смотришь значения?

folv 26.12.2012 22:19

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

Сообщение от Bersenev (Сообщение 241503)
читаешь нормально, теперь вопрос чем смотришь значения?

HotKey от Chipa

Bersenev 26.12.2012 22:25

Цитата:

Сообщение от folv (Сообщение 241504)
HotKey от Chipa

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

folv 26.12.2012 22:35

Вложений: 1
пробывал в терминале при этом скетче, одно значение FF 03 00 00 бежит постоянно и заблудился где цифиры для кнопок

admin 26.12.2012 22:40

Программа HotKey ничего не преобразует выводит в чистом виде

Bersenev 26.12.2012 23:01

Цитата:

Сообщение от admin (Сообщение 241507)
Программа HotKey ничего не преобразует выводит в чистом виде

По предыдущему скриншоту увидел.

Цитата:

Сообщение от folv (Сообщение 241506)
пробывал в терминале при этом скетче, одно значение FF 03 00 00 бежит постоянно и заблудился где цифиры для кнопок

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

Bersenev 26.12.2012 23:13

И ещё используй такой скетч

Код:

//http://compcar.ru 
 #define PIN 5 //номер аналогового порта 
 #define LIMIT 10 //предел погрешности сопротивления 

 
byte bytes[2]; 
 
int res_dt1, res_d

 
void setup() 
 { 
 
Serial.begin(115200); // настроить скорость com порта 
 


 
void loop() 
 { 
 
res_d = analogRead(PIN); // прочитать данные АЦП 
 
delay(40); 
 
res_dt1 = analogRead(PIN); // прочитать данные АЦП 



 
bytes[0] = res_d & 255; // преобразовать в 2-байта 
 
bytes[1] = (res_d & 768) >> 8
 
Serial.write( bytes,2); // отправить прочитаное значение компьютеру 
 

 } 

Кстати странно, тот скетч, который ты выложил отправляет два байта, а терминал получает 4

admin 27.12.2012 00:29

Наверно вот такой, ты имел ввиду
Но тогда будут ложные срабатывания от дребезга
PHP код:

//http://compcar.ru  
 #define PIN 5 //номер аналогового порта  

 
byte bytes[2];  
 
int res_d;  

 
void setup()  
 {  
 
Serial.begin(115200); // настроить скорость com порта  
 
}  

 
void loop()  
 {  
 
res_d analogRead(PIN); // прочитать данные АЦП  
 
 
bytes[0] = res_d 255// преобразовать в 2-байта  
 
bytes[1] = (res_d 768) >> 8;  
 
Serial.writebytes,2); // отправить прочитаное значение компьютеру  

 



Bersenev 27.12.2012 00:37

Цитата:

Сообщение от admin (Сообщение 241512)
Наверно вот такой, ты имел ввиду
Но тогда будут ложные срабатывания от дребезга

Это не важно, главное убрать проверку, что бы удивить картину происходящего. Это же код для отладки, а не для работы

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, время: 19:44.

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