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)

Bersenev 28.01.2012 21:44

iCarDS + Arduino = iCarDuino
 
Вложений: 5
Начинаем работы по поддержке Arduino в iCar DS.

Текущая версия плагина поддерживает устройства JoyStick и PultIK http://carmonitor.ru/ru/-c-83_60.html на базе arduino http://www.compcar.ru/forum/showthread.php?t=4959

Для установки

- копируем содержимое архива в папку ..\iCar DS\Extentions\iCarDuino
- Регистрируем плагин запустив RunMe1st.cmd
- В iCarDSConfig закладка Global Vars добавляем duino_com=номер порта и duino_com_baudRate=скорость порта, допустим duino_com=20 и duino_com_baudRate=115200, если для связи с arduino используется COM20 и в скетче для ардуино задана скорость 115200
- Запускаем iCarDS со скином Хамелеон, на четвёртом экране настроек включаем загрузку плагина iCarDuino и перезапускаем iCarDS
- Заходим на четвёртый экран настроек -Настройка кнопок CarDuino
- Нажимаем рулевую кнопку, кнопку на ИК пульте или поворачиваем энкодер, в результате к списку добавиться код данной кнопки.
- Нажимаем на кнопку ЭКРАН или ДИНАМИЧЕСКИЕ КНОПКИ, и выбираем действие для текущей кнопки CarDuino.

http://content.foto.mail.ru/mail/ber...leon/i-505.jpg

- Повторяем действия для всех кнопок
- После выхода из экрана настроек, можно управлять икаром с рулевых кнопок, ИК пульта и энкодера без сторонних программ

Требуется FrameWork 2.0, iCarDS 1.7.0.8 и скин Хамелеон от 28/08/2012


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


http://content.foto.mail.ru/mail/ber...leon/i-504.jpg

http://content.foto.mail.ru/mail/ber...leon/i-506.jpg

Блок реле можно приобрести у меня.
В качестве конструктора 750р за блок, в собранном виде 1000р.
Обращаемся в личку

http://content.foto.mail.ru/mail/ber...leon/i-600.jpg

http://content.foto.mail.ru/mail/ber...leon/i-507.jpg

Для этого соберите устройство по схеме
http://pccar.ru/attachment.php?attac...1&d=1350766943

Загружаете код для adruino , требуются библиотеки IRremote, OneWire

PHP код:

//
#include <IRremote.h> 
#include <OneWire.h>
#include <SPI.h>
#include <EEPROM.h>
  
#define RES_KEY_FLAG_ 0x76  // Флаг первого запуска скетча

byte bytes[4];

//-----------------------------------------
//- входы(пины) ардуино                   -
//-----------------------------------------
int WIRE_PIN 4;       // цифровой вход(пин) 1WIRE-шины ( температурные датчики )
int RECV_PIN 7;       // цифровой вход(пин) ИК приемника 
int REG_SELECT ;    // цифровой вход(пин), управляющий защёлкой (SS в терминах SPI)

int xpin=0;             // аналоговый вход(пин) для оси X акселерометра
int ypin=1;             // аналоговый вход(пин) для оси Y акселерометра
int zpin=2;             // аналоговый вход(пин) для оси Z акселерометра
int ENCODER1_PIN ;  // аналоговый вход(пин) для первого энкодера
int ENCODER2_PIN ;  // аналоговый вход(пин) для второго энкодера 
int RES_PIN ;       // аналоговый вход(пин) для резестивных(рулевых) кнопок 

//-----------------------------------------
//- переменные включения функций скетча   -
//-----------------------------------------
boolean is_ir_key false;
boolean is_temperature_sensors false;
boolean is_accelerometer false;
boolean is_encoder_1 false;
boolean is_encoder_2 false;
boolean is_res_keys false;
boolean is_relay_state false;

//-----------------------------------------
//- Переменные для температурных датчиков -
//-----------------------------------------
OneWire  ds(WIRE_PIN);
byte addr[8];            
byte data[12];
unsigned long temperature_sensors_milles;
unsigned long temperature_sensors_wait_milles 500// Интервал передачи данных от температурных датчиков

//-----------------------------------------
//- Переменные для ИК датчика             -
//-----------------------------------------
IRrecv irrecv(RECV_PIN); 
decode_results results
unsigned long ir_dt;
unsigned long ir_dt_old 0;
unsigned long ir_dt_millis;
unsigned long ir_wait_millis;
unsigned long ir_wait_first 250;  // время ожидания после первого нажатия кнопки
unsigned long ir_wait_next 200;    // время ожидания при удержании

//-----------------------------------------
//- Переменные для акселерометра          -
//-----------------------------------------
int xyz;
int xyz[4];
int n=0
int x_cal=0;
int y_cal=0//калибровка датчика
int z_cal=0;
unsigned long accelerometer_milles;
unsigned long accelerometer_wait_milles 80// Интервал передачи данных от акселерометра

//-----------------------------------------
//- Переменные для первого энкодера       -
//-----------------------------------------
unsigned long encoder1_dt;
unsigned long encoder1_key=0;
unsigned long encoder1_key_old=0;
int encoder1_key1 0;
int encoder1_key2 0;
int encoder1_key3 0;
unsigned long encoder1_millis;
unsigned long encoder1_wait_millis=1;
unsigned long encoder1_key_wait 500;  // время ожидания до следующего нажатия кнопки энкодера
unsigned long encoder1_key_wait_millis;
unsigned long encoder1_key_millis;
unsigned long encoder1_dt_sum 0;  
int encoder1_dt_n 0;

//-----------------------------------------
//- Переменные для второго энкодера       -
//-----------------------------------------
unsigned long encoder2_dt;
unsigned long encoder2_key=0;
unsigned long encoder2_key_old=0;
int encoder2_key1 0;
int encoder2_key2 0;
int encoder2_key3 0;
unsigned long encoder2_millis;
unsigned long encoder2_wait_millis=1;
unsigned long encoder2_key_wait 500;  // время ожидания до следующего нажатия кнопки энкодера
unsigned long encoder2_key_wait_millis;
unsigned long encoder2_key_millis;


//-----------------------------------------
//- Переменные для резестивных кнопок     -
//-----------------------------------------
unsigned long  res_dt 0
unsigned long  res_dt_sum=0
#define RES_DT_COUNT 500 // Количество считываемых данных
#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_first 500;  // время ожидания после первого нажатия кнопки
unsigned long res_key_wait_next 250;  // время ожидания до следующего нажатия кнопки
unsigned long res_key_wait_millis 0;
unsigned long res_key_millis;
unsigned long res_key_array[51][2];
unsigned int res_key_count 0;
unsigned int res_key_delta 3;

//-----------------------------------------
//- Переменные для управления блоком реле -
//-----------------------------------------
unsigned long relays_milles ;
unsigned long  relays_wait_milles 1000;
static 
uint8_t relays_state1 0x0000;
static 
uint8_t relays_state2 0x0000;
static 
uint8_t relays_state3 0x0000;
static 
uint8_t relays_state4 0x0000;

  
void setup() 

  
Serial.begin(115200); 
  
irrecv.enableIRIn(); // включить приемник 
    
xyz[0]=0;
    
xyz[1]=0// прочитать значение осей
    
xyz[2]=0;
    
ir_wait_millis ir_wait_first;
    
accelerometer_milles millis();
    
temperature_sensors_milles millis();
    
encoder1_key_millis millis();
    
encoder2_key_millis millis();
    
encoder1_millis millis();
    
encoder2_millis millis();
    
res_key_millis millis();
    
relays_milles millis();
    
    
encoder1_key_wait_millis=encoder1_key_wait;
    
encoder2_key_wait_millis=encoder2_key_wait;
    
    
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=0i<res_key_count;i++) 
      { 
        
res_key_array[i][0] = (EEPROM.read(i+2) * 256) + EEPROM.read(i+2+50) - res_key_deltares_key_array[i][1] = res_key_array[i][0] + res_key_delta res_key_delta
      }
    }
    for(
int i=res_key_counti<51;i++) 
    { 
      
res_key_array[i][0] = 0xFFFFFFFFres_key_array[i][1] = 0xFFFFFFFF
    }
    
    
// Инициализируем шину SPI. Если используется программная реализация,
    // то вы должны сами настроить пины, по которым будет работать SPI.
    
SPI.begin();
    
pinMode(REG_SELECTOUTPUT);
    
digitalWrite(REG_SELECTLOW); // выбор ведомого - нашего регистра
    
SPI.transfer(relays_state4); // очищаем содержимое регистра
    
SPI.transfer(relays_state3);
    
SPI.transfer(relays_state2);
    
SPI.transfer(relays_state1);
    
// Завершаем передачу данных. После этого регистр установит
    // на выводах Q0-Q7 уровни, соответствующие записанным битам.
    
digitalWrite(REG_SELECTHIGH);
}
 
void loop() 
{
  if (
Serial.available() >= 1// Проверяем наличие команд от компьютера
  
{
     switch (
Serial.read())
    {
     case 
0x01// включить передачу данных от ик-пульта
       
is_ir_key true;
     break;

     case 
0x02// включить передачу данных от датчиков температуры
       
is_temperature_sensors true;
     break;

     case 
0x03// включить передачу данных от акселерометра
       
is_accelerometer true;
     break;

     case 
0x04// включить передачу данных от первого энкодера
       
is_encoder_1 true;
     break;

     case 
0x05// включить передачу данных от второго экнодера
       
is_encoder_2 true;
     break;

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

     case 
0x07// включить передачу данных о состоянии реле
       
is_relay_state true;
     break;

     case 
0x17// восстановить состояние реле
     
{
       
relays_state1 EEPROM.read(211);
       
relays_state2 EEPROM.read(212);
       
relays_state3 EEPROM.read(213);
       
relays_state4 EEPROM.read(214);

       
digitalWrite(REG_SELECTLOW);
       
SPI.transfer(relays_state4);
       
SPI.transfer(relays_state3);
       
SPI.transfer(relays_state2);
       
SPI.transfer(relays_state1);
       
digitalWrite(REG_SELECTHIGH);

       
bytes[0] = 0xBF;          // преобразовать в 4-байта  
       
bytes[1] = 0xFF;  
       
bytes[2] = 0xFF
       
bytes[3] = 0xFF
       
Serial.writebytes,4); // отправить прочитаное значение компьютеру
       
bytes[0] = relays_state4;          // преобразовать в 4-байта  
       
bytes[1] = relays_state3;  
       
bytes[2] = relays_state2
       
bytes[3] = relays_state1
       
Serial.writebytes,4); // отправить прочитаное значение компьютеру
     
}
     break;

     case 
0x81// выключить передачу данных от ик-пульта
       
is_ir_key false;
     break;

     case 
0x82// выключить передачу данных от датчиков температуры
       
is_temperature_sensors false;
     break;

     case 
0x83// выключить передачу данных от акселерометра
       
is_accelerometer false;
     break;

     case 
0x84// выключить передачу данных от первого энкодера
       
is_encoder_1 false;
     break;

     case 
0x85// выключить передачу данных от второго энкодера
       
is_encoder_2 false;
     break;

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

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

     case 
0x27// сохранить текущее состояние реле и отключить их
     
{
       
EEPROM.write(211,relays_state1);
       
EEPROM.write(212,relays_state2);
       
EEPROM.write(213,relays_state3);
       
EEPROM.write(214,relays_state4);

       
relays_state1 0;
       
relays_state2 0;
       
relays_state3 0;
       
relays_state4 0;

       
digitalWrite(REG_SELECTLOW);
       
SPI.transfer(relays_state4);
       
SPI.transfer(relays_state3);
       
SPI.transfer(relays_state2);
       
SPI.transfer(relays_state1);
       
digitalWrite(REG_SELECTHIGH);

       
bytes[0] = 0xBF;          // преобразовать в 4-байта  
       
bytes[1] = 0xFF;  
       
bytes[2] = 0xFF
       
bytes[3] = 0xFF
       
Serial.writebytes,4); // отправить прочитаное значение компьютеру
       
bytes[0] = relays_state4;          // преобразовать в 4-байта  
       
bytes[1] = relays_state3;  
       
bytes[2] = relays_state2
       
bytes[3] = relays_state1
       
Serial.writebytes,4); // отправить прочитаное значение компьютеру
     
}
     break;

     case 
0xAA// выключить передачу данных от резестивных кнопок
     
{
       while (
Serial.available() < 5) {}
       
int i Serial.read();
       
bytes[0] = Serial.read();          // преобразовать в 4-байта  
       
bytes[1] = Serial.read();  
       
bytes[2] = Serial.read(); 
       
bytes[3] = Serial.read(); 
       
unsigned long key_res_min 0key_res_min bytes[0]; key_res_min key_res_min 256 bytes[1];  
       
unsigned long key_res_max 0key_res_max bytes[2]; key_res_max key_res_max 256 bytes[3];  
       
res_key_array[i-1][0] = key_res_min
       
res_key_array[i-1][1] = key_res_max;
     }
     break;

     case 
0xAB// сбросить настройки резестивных кнопок в EEPROM
     
{
       
EEPROM.write(0,0); // сбросить флаг первого запуска
       
res_key_count 0// сбросить количество резистивных кнопок 
       
EEPROM.write(1,0); //
       
for(int i=0i<51;i++) 
       { 
        
res_key_array[i][0] = 0xFFFFFFFFres_key_array[i][1] = 0xFFFFFFFF
       }
     } 
     break;

     case 
0xBB// Команда управление реле
     
{
       while (
Serial.available() < 2) {}
       
byte relay_number Serial.read();
       
byte relay_command Serial.read();
       if( 
relay_number == && relay_command == 0xFF )
       {
          
bytes[0] = 0xBF;          // преобразовать в 4-байта  
          
bytes[1] = 0xFF;  
          
bytes[2] = 0xFF
          
bytes[3] = 0xFF
          
Serial.writebytes,4); // отправить прочитаное значение компьютеру
          
bytes[0] = relays_state4;          // преобразовать в 4-байта  
          
bytes[1] = relays_state3;  
          
bytes[2] = relays_state2
          
bytes[3] = relays_state1
          
Serial.writebytes,4); // отправить прочитаное значение компьютеру
       
}
       else
       {
         
uint8_t one ;
         switch (
relay_command)
         {
           case 
0x00// выключить реле № relay_number
           
if(relay_number <=8)
           {
             
relays_state1 relays_state1 & ~( one << (relay_number 1) );
           }
           else
           {
             if(
relay_number <=16)
             {
               
relays_state2 relays_state2 & ~( one << (relay_number 9) );
             }
             else
             {
               if(
relay_number <=24)
               {
                 
relays_state3 relays_state3 & ~( one << (relay_number 17) );
               }
               else
               {
                 if(
relay_number <=32)
                 {
                   
relays_state4 relays_state4 & ~( one << (relay_number 25) );
                 }
               }
             }
           }
           
digitalWrite(REG_SELECTLOW);
           
SPI.transfer(relays_state4);
           
SPI.transfer(relays_state3);
           
SPI.transfer(relays_state2);
           
SPI.transfer(relays_state1);
           
digitalWrite(REG_SELECTHIGH);

            
bytes[0] = 0xBF;          // преобразовать в 4-байта  
            
bytes[1] = 0xFF;  
            
bytes[2] = 0xFF
            
bytes[3] = 0xFF
            
Serial.writebytes,4); // отправить прочитаное значение компьютеру
            
bytes[0] = relays_state4;          // преобразовать в 4-байта  
            
bytes[1] = relays_state3;  
            
bytes[2] = relays_state2
            
bytes[3] = relays_state1
            
Serial.writebytes,4); // отправить прочитаное значение компьютеру
           
break;

           case 
0x01// включить реле № relay_number
           
if(relay_number <=8)
           {
             
relays_state1 relays_state1 | ( one << (relay_number 1) );
           }
           else
           {
             if(
relay_number <=16)
             {
               
relays_state2 relays_state2 | ( one << (relay_number 9) );
             }
             else
             {
               if(
relay_number <=24)
               {
                 
relays_state3 relays_state3 | ( one << (relay_number 17) );
               }
               else
               {
                 if(
relay_number <=32)
                 {
                   
relays_state4 relays_state4 | ( one << (relay_number 25) );
                 }
               }
             }
           }
           
digitalWrite(REG_SELECTLOW);
           
SPI.transfer(relays_state4);
           
SPI.transfer(relays_state3);
           
SPI.transfer(relays_state2);
           
SPI.transfer(relays_state1);
           
digitalWrite(REG_SELECTHIGH);

            
bytes[0] = 0xBF;          // преобразовать в 4-байта  
            
bytes[1] = 0xFF;  
            
bytes[2] = 0xFF
            
bytes[3] = 0xFF
            
Serial.writebytes,4); // отправить прочитаное значение компьютеру
            
bytes[0] = relays_state4;          // преобразовать в 4-байта  
            
bytes[1] = relays_state3;  
            
bytes[2] = relays_state2
            
bytes[3] = relays_state1
            
Serial.writebytes,4); // отправить прочитаное значение компьютеру
           
break;
         }

       }
     }
     break;
    }
  } 
  if( 
is_ir_key ir_key();                            //  ИК приёмник
  
if( is_temperature_sensors temperature_sensors();  //  температурные датчики
  
if( is_accelerometer accelerometer();              //  акселерометр
  
if( is_encoder_1 encoder_1();                      //  первый энкодер
  
if( is_encoder_2 encoder_2();                      //  второй энкодер
  
if( is_res_keys res_keys();                        //  резестивные кнопки
  
if( is_relay_state relay_state();
}
//----------------------------------------------------------------------------------
// Функция работы с реле
//----------------------------------------------------------------------------------
void relay_state()
{
  if( 
relays_milles relays_wait_milles millis() )
  {
    
bytes[0] = 0xBF;          // преобразовать в 4-байта  
    
bytes[1] = 0xFF;  
    
bytes[2] = 0xFF
    
bytes[3] = 0xFF
    
Serial.writebytes,4); // отправить прочитаное значение компьютеру
    
bytes[0] = relays_state4;       // преобразовать в 4-байта  
    
bytes[1] = relays_state3;  
    
bytes[2] = relays_state2
    
bytes[3] = relays_state1
    
Serial.writebytes,4); // отправить прочитаное значение компьютеру

    
relays_milles millis();
  }
}

//----------------------------------------------------------------------------------
// Функция работы с резестивными кнопками
//----------------------------------------------------------------------------------
void res_keys()
{  
  {
    
res_dt analogRead(RES_PIN); // прочитать данные АЦП 
    
if( res_dt >= 0x05 && res_dt <= 0x3F0 )
    { 
      
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 0res_dt_n 0;
        }
       }
    }
    else
    {
      
res_dt_sum 0res_dt_n 0res_key 0;
      
res_key_wait_millis 0;
    }
  }
  if( 
res_key_millis res_key_wait_millis*<= millis() ) { res_key_old 0; }
  if( 
res_key_millis res_key_wait_millis <= millis() )
  {
    if( 
res_key != )
    {
      if( ((
res_key_old res_key_delta) <=  res_key) && (res_key <= (res_key_old res_key_delta)) )
      {
        
res_key_millis millis(); res_key_wait_millis res_key_wait_next;
      }
      else
      {
        
res_key_millis millis(); res_key_wait_millis res_key_wait_first;
      }

        
int i 0int exit = 0;
        while( 
res_key_array[i][0] != 0xFFFFFFFF && exit == )
        {
          if( (
res_key_array[i][0] <= res_key) && (res_key <= res_key_array[i][1]) ) exit = 1; else i++;
        }
        if( exit == 

        { 
          
bytes[0] = 0xAA;          // преобразовать в 4-байта  
          
bytes[1] = 0;  
          
bytes[2] = RES_PIN
          
bytes[3] = i+1
          
Serial.writebytes,4); // отправить прочитаное значение компьютеру
        
}
        else
        {
          if( 
res_key_count 50 )
          {
            
res_key_array[res_key_count][0] = res_key res_key_deltares_key_array[res_key_count][1] = res_key res_key_delta;
            
res_key_count++;
            
            
EEPROM.write(1res_key_count); // Запоминаем количество кнопок
            
byte one_byte res_key 256;
            
EEPROM.write(res_key_count+1one_byte ); // Запоминаем старший байт значения кнопки
            
one_byte res_key one_byte 256;
            
EEPROM.write(res_key_count+1+50one_byte ); // Запоминаем младший байт значения кнопки
            
EEPROM.write(0RES_KEY_FLAG_);
          
            
bytes[0] = 0xAA;          // преобразовать в 4-байта  
            
bytes[1] = 0;  
            
bytes[2] = RES_PIN
            
bytes[3] = res_key_count
            
Serial.writebytes,4); // отправить прочитаное значение компьютеру
          
}
          else
          {
            
bytes[0] = 0xAA;          // преобразовать в 4-байта  
            
bytes[1] = 0xAA;  
            
bytes[2] = (res_key 0xFF00) >> 8
            
bytes[3] = res_key 0xFF
            
Serial.writebytes,4); // отправить прочитаное значение компьютеру
          
}
        }
    }
    
res_key_old res_key;
  }
}

//----------------------------------------------------------------------------------
// Функция работы с первым энкодером
//----------------------------------------------------------------------------------
void encoder_1()
{
  if( 
encoder1_key_millis encoder1_key_wait_millis*millis() ) { encoder1_key_old 0; }
  if( 
encoder1_millis encoder1_wait_millis millis() )
  {
    
encoder1_millis millis();
    
encoder1_dt analogRead(ENCODER1_PIN); // прочитать данные АЦП
    
    
if( encoder1_dt >= 0x246 && encoder1_dt <= 0x286 )
    { 
// Здесь обрабатываем удержание кнопки
      
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.writebytes,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 >= 0x3E0 && encoder1_dt <= 0x410 && encoder1_key3 != )
      {
        if( (
encoder1_key2 == 2) && (encoder1_key3 == 3))
        { 
          
bytes[0] = 0xEE;          // преобразовать в 2-байта 
          
bytes[1] = 0
          
bytes[2] = ENCODER1_PIN;
          
bytes[3] = 1;
          
Serial.writebytes,4); // отправить прочитаное значение компьютеру     
        
}
        else
        {
          if( (
encoder1_key2 == 3) && (encoder1_key3 == 2) )
          {
            
bytes[0] = 0xEE;          // преобразовать в 2-байта 
            
bytes[1] = 0
            
bytes[2] = ENCODER1_PIN;
            
bytes[3] = 2;
            
Serial.writebytes,4); // отправить прочитаное значение компьютеру     
          
}
        }
        
encoder1_key1=encoder1_key2encoder1_key2=encoder1_key3encoder1_key3=1;
      }
      else
      {
        if( 
encoder1_dt >= 0xA0 && encoder1_dt <= 0xF0 && encoder1_key3 != )
        {
          
encoder1_key1=encoder1_key2encoder1_key2=encoder1_key3encoder1_key3=2;
        }
        else
        {
          if( 
encoder1_dt >= 0x1A0 && encoder1_dt <= 0x200 && encoder1_key3 != )
          {
            
encoder1_key1=encoder1_key2encoder1_key2=encoder1_key3encoder1_key3=3;
          }
        }
      }
    }
  }
}

//----------------------------------------------------------------------------------
// Функция работы со вторым энкодером
//----------------------------------------------------------------------------------
void encoder_2()
{  
  if( 
encoder2_key_millis encoder2_key_wait_millis*millis() ) { encoder2_key_old 0; }
  if( 
encoder2_millis encoder2_wait_millis millis() )
  {
    
encoder2_millis millis();
    
encoder2_dt analogRead(ENCODER2_PIN); // прочитать данные АЦП
    
if( encoder2_dt >= 0x246 && encoder2_dt <= 0x286 )
    { 
// Здесь обрабатываем удержание кнопки
      
encoder2_key ENCODER2_PIN;
      
encoder2_key = (encoder2_key << 16) | 0x030000EE;
      if ( 
encoder2_key == encoder2_key_old )
      { 
// Здесь обрабатываем удержание кнопки
        
if( encoder2_key_millis encoder2_key_wait_millis millis() )
        { 
          
bytes[0] = encoder2_key 0xFF;          // преобразовать в 4-байта  
          
bytes[1] = (encoder2_key 0xFF00) >> 8;  
          
bytes[2] = (encoder2_key 0xFF0000) >> 16
          
bytes[3] = (encoder2_key 0xFF000000) >> 24
          
Serial.writebytes,4); // отправить прочитаное значение компьютеру
          
encoder2_key_millis millis(); encoder2_key_wait_millis encoder2_key_wait//ir_wait_next;
        
}
      }
      else 
      { 
// Здесь обрабатываем первое нажатие кнопки
        
encoder2_key_millis millis(); encoder2_key_wait_millis 50//ir_wait_first;
      

      
encoder2_key_old encoder2_key;
    } 
    else
    {
      if( 
encoder2_dt >= 0x3E0 && encoder2_dt <= 0x410 && encoder2_key3 != )
      {
        if( (
encoder2_key2 == 2) && (encoder2_key3 == 3))
        { 
          
bytes[0] = 0xEE;          // преобразовать в 2-байта 
          
bytes[1] = 0
          
bytes[2] = ENCODER2_PIN;
          
bytes[3] = 1;
          
Serial.writebytes,4); // отправить прочитаное значение компьютеру     
        
}
        else
        {
          if( (
encoder2_key2 == 3) && (encoder2_key3 == 2) )
          {
            
bytes[0] = 0xEE;          // преобразовать в 2-байта 
            
bytes[1] = 0
            
bytes[2] = ENCODER2_PIN;
            
bytes[3] = 2;
            
Serial.writebytes,4); // отправить прочитаное значение компьютеру     
          
}
        }
        
encoder2_key1=encoder2_key2encoder2_key2=encoder2_key3encoder2_key3=1;
      }
      else
      {
        if( 
encoder2_dt >= 0xA0 && encoder2_dt <= 0xF0 && encoder2_key3 != )
        {
          
encoder2_key1=encoder2_key2encoder2_key2=encoder2_key3encoder2_key3=2;
        }
        else
        {
          if( 
encoder2_dt >= 0x1A0 && encoder2_dt <= 0x200 && encoder2_key3 != )
          {
            
encoder2_key1=encoder2_key2encoder2_key2=encoder2_key3encoder2_key3=3;
          }
        }
      }
    }
  }
}

//----------------------------------------------------------------------------------
// Функция работы с ИК приёмником
//----------------------------------------------------------------------------------
void ir_key()
{
  if( 
ir_dt_millis ir_wait_millis*millis() ) { ir_dt_old 0; }
  if (
irrecv.decode(&results))  
  {
   if (
results.value && results.value 0xFFFFFFFF
   {
    
ir_dt results.value;
    if ( 
ir_dt == ir_dt_old )
    { 
// Здесь обрабатываем удержание кнопки
      
if( ir_dt_millis ir_wait_millis millis() )
      { 
        
bytes[0] = ir_dt 0xFF;          // преобразовать в 4-байта  
        
bytes[1] = (ir_dt 0xFF00) >> 8;  
        
bytes[2] = (ir_dt 0xFF0000) >> 16
        
bytes[3] = (ir_dt 0xFF000000) >> 24
        
Serial.writebytes,4); // отправить прочитаное значение компьютеру
        
ir_dt_millis millis(); ir_wait_millis ir_wait_next;
      }
    }
    else 
    { 
// Здесь обрабатываем первое нажатие кнопки
      
bytes[0] = ir_dt 0xFF;          // преобразовать в 4-байта  
      
bytes[1] = (ir_dt 0xFF00) >> 8;  
      
bytes[2] = (ir_dt 0xFF0000) >> 16
      
bytes[3] = (ir_dt 0xFF000000) >> 24
      
Serial.writebytes,4); // отправить прочитаное значение компьютеру
      
ir_dt_millis millis(); ir_wait_millis ir_wait_first;
    } 
    
ir_dt_old ir_dt;
   }
   else
   {
      
ir_dt_millis millis(); ir_wait_millis ir_wait_first;
   }
   
irrecv.resume();
  }
}

//----------------------------------------------------------------------------------
// Функция работы с акселерометром
//----------------------------------------------------------------------------------
void accelerometer()
{
  if( 
accelerometer_milles accelerometer_wait_milles millis() )
  {
    
xyz[0]=analogRead(xpin);
    
xyz[1]=analogRead(ypin); // прочитать значение осей
    
xyz[2]=analogRead(zpin);
    
xyz[3]=0;

    
bytes[0] = 0xEFbytes[1] = 0xFFbytes[2] = 0xFFbytes[3] = 0xFF
    
Serial.writebytes,4); // отправить 0xEFFFFFFF - код данных от акселерометра
    
Serial.write( (byte*)&xyz,8); // отправить значения осей 
    
accelerometer_milles millis();
  }
}

//----------------------------------------------------------------------------------
// Функция определение температуры датчиков DS18B20
//----------------------------------------------------------------------------------
void temperature_sensors()
{
  if( 
temperature_sensors_milles temperature_sensors_wait_milles millis() )
  {
    
temperature_sensors_milles millis();
  
    
byte i;

    if (!
ds.search(addr)) 
    {                       
// поиск нового датчика
      
ds.reset_search();    // если не нашли, сбрасываем поиск в начало
      
return;               // и выходим 
    
}
  
    
// Часть кода, которая ниже, выполняется только если
    // найден новый датчик, с которым ещё не работали в
    // главном цикле до сброса поиска

    
if (OneWire::crc8addr7) != addr[7]) // Проверка CRC 
    

      return; 
// Если не пройдена, то в начало главного цикла и продолжаем поиск других датчиков
    
}
  
    if (
addr[0] != 0x28// Проверка того, что найденное устройство - температурный датчик DS18B20 
    
{        
      return; 
// Если не он, то опять в начало главного цикла на продолжение поиска
    
}
  
    
ds.reset();
    
ds.select(addr);
    
ds.write(0x44,1);
    
ds.reset();
    
ds.select(addr);
    
ds.write(0xBE);

    
bytes[0] = 0xFFbytes[1] = 0xFFbytes[2] = 0xFFbytes[3] = 0xFF
    
Serial.writebytes,4); // отправить 0xFFFFFFFF - код температурного датчика
    
Serial.writeaddr,8); // отправить 8 байтовый номер температурного датчика 
  
    
for ( 09i++) // получаем данные с датчика
    
{         
      
data[i] = ds.read();
    }
    
bytes[0] = 0;          // отправляем байты содержащие температуру  
    
bytes[1] = 0;  
    
bytes[2] = data[0]; 
    
bytes[3] = data[1]; 
    
Serial.writebytes,4); // значение температурного датчика 
  
}


Устанавливаете плагин iCarDuino 1.0.0.5

В duino.ini добавляем такие строки, если их там нет


duino_shift_state=0
calibrate_x=418
calibrate_y=400
calibrate_z=568
calibrate_n=15
calibrate_a=48
plugin_iCarDuino_is=1

и эти переменные, которые включают или выключают использование ик пульта, энкодеров или резестивных кнопок, если что то вами не используется. 0 - выключено, 1 - включено.

duino_is_ir_key=1
duino_is_encoder_1=1
duino_is_encoder_2=1
duino_is_res_keys=1



Запускаете икар, при первом запуске в папке используемого скина ..\Chameleon\DuinoKey будет создан файл duino_temp_sensors.ini с таким содержимым, у вас будут свои номера датчиков

temp_sensor_28FFC919030000D6=28FFC919030000D6
temp_sensor_2812EA1903000003=2812EA1903000003

Меняем название датчиков, допустим

temp_sensor_28FFC919030000D6=Салон
temp_sensor_2812EA1903000003=Улица

Теперь для того чтобы можно было вывести датчики в скин, в файл ..\Chameleon\Labels\label_list.txt добавляем такие строки

temp_sensor_28FFC919030000D6
temp_sensor_2812EA1903000003

а в ..\Chameleon\Labels\label_ru.ini (имя файла зависит от используемого языка) такие

l_label_temp_sensor_28FFC919030000D6=t салон,С
l_label_temp_sensor_2812EA1903000003=t улица,С

Теперь можно использовать температурные показатели в скине

Alex-NN 28.01.2012 22:37

Потестил дома.
Все работает!!!!:smile2::smile2::smile2:
Огромное спасибо Авторам!!!!:yes4::yes4::yes4:
Конечно, гораздо удобнее все настройки кнопок Ардуино делать в Икаре.
И раньше пробовал Ардуино+ИК-пульт в Икаре, работало, но сейчас гораэдо удобнее!!!

Я так понимаю Икар пока единственная оболочка с такими возможностями.

Надо поразбираться, как градусники прицепить.

Bersenev 28.01.2012 22:46

Цитата:

Сообщение от Alex-NN (Сообщение 209149)
Надо поразбираться, как градусники прицепить.

Градусники это следующий шаг, уже занимаюсь. Но для градусников потребуется менять код в ардуино.

Alex-NN 28.01.2012 22:56

Цитата:

Сообщение от Bersenev (Сообщение 209150)
Градусники это следующий шаг, уже занимаюсь. Но для градусников потребуется менять код в ардуино.

Думаю, Chip сможет помочь.:blush: Наверное, он должен быть заинтересован.

Да, стирание кодов пульта?

Bersenev 28.01.2012 23:05

Подробнее, что именно происходит.

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

Alex-NN 28.01.2012 23:06

Цитата:

Сообщение от Bersenev (Сообщение 209155)
Подробнее, что именно происходит.

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

Пардон, перезагрузка Икара помогла. Все отображается.:yes4::blush:

Bersenev 28.01.2012 23:11

Цитата:

Сообщение от Alex-NN (Сообщение 209154)
Думаю, Chip сможет помочь.:blush: Наверное, он должен быть заинтересован.

Да особой необходимости нет, думаю справимся, тем более всё необходимое Chip уже сделал.

Цитата:

Сообщение от Alex-NN (Сообщение 209154)
Да, стирание кодов пульта?

А это нужно?

Alex-NN 28.01.2012 23:16

Цитата:

Сообщение от Bersenev (Сообщение 209157)
А это нужно?

Фиг знает... Не понял пока.:blush::smile2:

ewgen1 29.01.2012 11:11

Цитата:

Сообщение от Bersenev (Сообщение 209150)
Градусники это следующий шаг, уже занимаюсь. Но для градусников потребуется менять код в ардуино.

тоже очень интересует тема градусников

autohirurg 30.01.2012 17:27

Извините что не в тему но так уж вопрос поставили изначально.
Градусники, кнопочки, все клаассно!!!
У меня вопрос!
Андрей надо бы сообразить меню климатконтроля, всместе со всеми градусниками и управлением, т.к я уже давно жду управление климатом, дело в том что после замены двигателя и бльшей части электроники в машине, мой блок климата работает не правильно, он не может связаться с блоком управления двигателем и мне нужно сделать данные действия по другому - через кардуино и разъём OBD2. Т.К через ОБД2 и программу тестер ецу от Валентина8080 кондей включается и работает!

Программа климат контроля на кардуино уже давно сделана в большей степени и висит где то на compcar.ru/ если надо я найду и дам ссылочку. Там единственное надо поменять внешний вид и немного добавить функций управления и датчиков.
Каковы мнения будут.?

Bersenev 30.01.2012 17:47

Сначала будут кнопки,ик пульт и энкодер. Потом градусники(кстати уже работают). Далее акселерометр. А вот за ним я займусь климат контролем.
Но климат контроль вешь специфичная для каждой машины, поэтому сначала буду делать под себя. А мне нужно управление тремя регуляторами и кнопкой включения кондиционера.Такой вариант я на соседнем форуме видел.
А твой вариант специфичен в двойне, так как кнопку должен включать не ардуино, а комп, да еще и через встроенную программу, так что просто отрисовкой экранов здесь не обойдешься

folv 01.02.2012 13:28

еще бы релюшками управлять

autohirurg 01.02.2012 14:26

Цитата:

Сообщение от Bersenev (Сообщение 209366)
Сначала будут кнопки,ик пульт и энкодер. Потом градусники(кстати уже работают). Далее акселерометр. А вот за ним я займусь климат контролем.
Но климат контроль вешь специфичная для каждой машины, поэтому сначала буду делать под себя. А мне нужно управление тремя регуляторами и кнопкой включения кондиционера.Такой вариант я на соседнем форуме видел.
А твой вариант специфичен в двойне, так как кнопку должен включать не ардуино, а комп, да еще и через встроенную программу, так что просто отрисовкой экранов здесь не обойдешься

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

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

Я могу посодействовать от себя схемой работы системы кондиционера и объяснением сигналов с их параметрами ( например сопративления датчиков или еще что там нужно для правильной работы.

:drinks: Обязательно!!!:secret:

Bersenev 01.02.2012 15:00

Новая версия плагина 1.0.0.1

Теперь можно подключать нужное количество температурных датчиков DS18B20

Описание и схема подключения датчиков в шапке

http://content.foto.mail.ru/mail/ber...leon/i-489.jpg

Bersenev 03.02.2012 22:36

Вот и акселерометр прикрутил, смотрим видео

http://content.video.mail.ru/mail/be...video/i-11.jpg

ewgen1 04.02.2012 08:46

какой Arduino все таки купить?подскажите.и где?хочу термометры все таки сделать

Bersenev 04.02.2012 09:49

Цитата:

Сообщение от ewgen1 (Сообщение 209906)
какой Arduino все таки купить?подскажите.и где?хочу термометры все таки сделать

Лично у меня вот этот http://carmonitor.ru/ru/carduinonanoduo-p-120.html, датчики тоже от туда.

ewgen1 04.02.2012 14:42

а акселерометр какие показания дает?ускорение возможно??

Fedorych 04.02.2012 14:54

Цитата:

Сообщение от Bersenev (Сообщение 209641)
Новая версия плагина 1.0.0.1

Теперь можно подключать нужное количество температурных датчиков DS18B20

Описание и схема подключения датчиков в шапке

http://content.foto.mail.ru/mail/ber...leon/i-489.jpg

В шапку экрана можно же вывести показания датчиков температуры?

Bersenev 04.02.2012 15:25

Цитата:

Сообщение от ewgen1 (Сообщение 209916)
а акселерометр какие показания дает?ускорение возможно??

Вот здесь всё написано, что он измеряет http://ru.wikipedia.org/wiki/%D0%90%...B5%D1%82%D1%80

Bersenev 04.02.2012 15:27

Цитата:

Сообщение от Fedorych (Сообщение 209918)
В шапку экрана можно же вывести показания датчиков температуры?

Разумеется можно.

AlexeyK 04.02.2012 15:29

Цитата:

Сообщение от Bersenev (Сообщение 209888)
Вот и акселерометр прикрутил, смотрим видео

А в центре экрана что за точка?

Fedorych 04.02.2012 16:09

уровень горизонтальной плоскости

Anthonymus 06.02.2012 11:35

Есть пожелание. Мне кажется, что кнопки пульта неплохо бы обзывать, что бы проще было настраивать. ИМХО. Еще не пробовал. Осталось только управление релюшками добавить и моя будет счастлив :-) Спасибо огромное за работу.

Bersenev 06.02.2012 11:47

Цитата:

Сообщение от Anthonymus (Сообщение 210109)
Есть пожелание. Мне кажется, что кнопки пульта неплохо бы обзывать, что бы проще было настраивать. ИМХО. Еще не пробовал.

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

zhserg 09.02.2012 07:08

Андрей, а для CFStyle будет поддержка?

Bersenev 09.02.2012 10:00

Цитата:

Сообщение от zhserg (Сообщение 210484)
Андрей, а для CFStyle будет поддержка?

Нет, ставишь хамелеон, тема CFStyle и получаешь скин почти идентичный скину CFStyle с поддержкой ардуино.

Alex-NN 13.02.2012 01:35

Наконец-то появилась возможность испытать.
Все работает. И управление пультом и датчики температуры.:yes4:
Акселерометр не пробовал. Нет его у меня, да, вроде, и не надо пока.:smile2:

Спасибо разработчикам!:yes4::yes4::yes4:
Будем вкрячивать в авто.

Bersenev 13.02.2012 02:01

Цитата:

Сообщение от Alex-NN (Сообщение 210898)
Все работает. И управление пультом и датчики температуры.:yes4:
...
Будем вкрячивать в авто.

Не торопись, после сна данные будут сбиваться, придётся передёргивать ардуино. Это уже исправлено, плюс прикрутил энкодер. Завтра прикручу второй и выложу новый вариант плагина и кода для ардуино.

Alex-NN 13.02.2012 02:10

Да холодно у нас пока. Спешки с установкой в машину, наверное, не будет.
Отлично! Будет чем позаниматься вечерами.:yes4:
Видимо, скоро на Кармониторе появится аппаратно шилд к Ардуино для Икара.:smile2:

Bersenev 14.02.2012 20:59

Присоединил два энкодера.

В отличии от распространённой схемы подключения энкодера к цифровым выводам http://www.compcar.ru/forum/showpost...39&postcount=1, реализовал подключение к аналоговому входу, что бы использовать цифровые выводы для других целей.

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

Из кода для ардуино убраны все задержки (delay), что позволило убрать задержки получения данных от термометров и акселерометра при работе с ик пультом и энкодерами.

Схема, плагин и код для ардуино в шапке.

Alex-NN 15.02.2012 13:23

Пока нет возможности попробовать энкодеры.
Андрей, поделись планами по Ардуино, если они есть.

Bersenev 15.02.2012 14:35

Цитата:

Сообщение от Alex-NN (Сообщение 211216)
Андрей, поделись планами по Ардуино, если они есть.

1. Управление нагрузками
2. Фоторезистор, для автоматического изменения яркости экрана и переключения день-ночь
3. Переключение на камеру заднего хода, если для этого используется usb-камера, если камера сразу подключена к монитору, то попробую сделать задержку на переключение, а то уже достало пока паркуешься несколько раз включается выключается, а так включилась раз, а по таймеру выключилась.
4. Управление механическими регуляторами климата, для управления ими с монитора и организации климат контроля.

а дальше посмотрим, может ещё что интересное подвернётся.

admin 15.02.2012 19:57

Цитата:

Сообщение от Bersenev (Сообщение 211224)
Присоединил два энкодера.

В отличии от распространённой схемы подключения энкодера к цифровым выводам http://www.compcar.ru/forum/showpost...39&postcount=1, реализовал подключение к аналоговому входу, что бы использовать цифровые выводы для других целей.

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

Из кода для ардуино убраны все задержки (delay), что позволило убрать задержки получения данных от термометров и акселерометра при работе с ик пультом и энкодерами.

Схема, плагин и код для ардуино в шап

Аналоговые пины можно использовать как цифровые, кроме А6 и А7
Соответствие у них следующее:
А0-D14
.
.
.
A5-D19

autohirurg 16.02.2012 21:12

Вложений: 1
Андрей ! наткнулся вот на такую вот плату которая работает с ардуино там в описании на фото написано.
Думаю что она может помочь в реализации проэкта с климатконтролем :yes4: если надо могу прикупить.

admin 16.02.2012 21:51

Да Вы что этот шилд может всего 600мА на нагрузку выдать, а вентилятор печки потребляет от 1А до 5А в зависимости от автомобиля. Здесь скорее всего больше подходит вот такой девайс , еще свободные ключи можно использовать для управления нагрузками.

Bersenev 16.02.2012 22:15

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

Shram 18.02.2012 21:04

Все прочитал но так и не понял зачем два энкодера?

Bersenev 18.02.2012 21:16

Цитата:

Сообщение от Shram (Сообщение 211541)
Все прочитал но так и не понял зачем два энкодера?

Не надо, не пользуйся. Но со временем икаром можно будет управлять только имея два энкодера.

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

admin 18.02.2012 21:46

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


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

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