Помогите запрограммировать Arduino Nano 3.0 with ATMEGA328 под резестивные кнопки на руле под планшет

gooffich
Offline
Зарегистрирован: 03.10.2014

Имеется штатные кнопки на руле на китайском авто. Хочу установить планшет и связать его с кнопками на руле через Arduino Nano 3.0 with ATMEGA328. считываю сопротивления каждой кнопки, забиваю в скетч и прошиваю. Ничего не происходит. Планшет его не видит,а  ноут видит как обычный не прошитый ком порт. Лазал по разным форумам находил похожее, но ничего не помогло. прошу вас помоч мне с этой проблемой. буду очень благодарен..

art100
Offline
Зарегистрирован: 09.03.2014

gooffich пишет:

Имеется штатные кнопки на руле на китайском авто. Хочу установить планшет и связать его с кнопками на руле через Arduino Nano 3.0 with ATMEGA328. считываю сопротивления каждой кнопки, забиваю в скетч и прошиваю. Ничего не происходит. Планшет его не видит,а  ноут видит как обычный не прошитый ком порт. Лазал по разным форумам находил похожее, но ничего не помогло. прошу вас помоч мне с этой проблемой. буду очень благодарен..

изучаем слова

USB-OTG

HID-keyboard

выкидываем

планшет

arduino nano

благодарность $$$ вон в ту коробочку

эх кто-бы мне помог

 

gooffich
Offline
Зарегистрирован: 03.10.2014

Я вас не понимаю. Я написал что то лишнее?

art100
Offline
Зарегистрирован: 09.03.2014

gooffich пишет:

Я вас не понимаю. Я написал что то лишнее?

вы ничего не написали

не вижу ни схемы ни ссылок

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

http://arduino.ru/forum/proekty/arduino-hid-vedroidkomplektkotik44-shutk...

но вижу что вы основы не знаете

изучаем слова

USB-OTG

HID-keyboard

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

arduino micro или леонардо тебе нужна))

art100
Offline
Зарегистрирован: 09.03.2014

jeka_tm пишет:

arduino micro или леонардо тебе нужна))

а может его ведрод просто не USB-OTG

просто тупо не распаяна микруха внутри

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

да кстати. планшет usb флешки видит?

gooffich
Offline
Зарегистрирован: 03.10.2014

меня интересует последовательность програмирования. что такое USB-OTG я вкурсе и HID-keyboard тоже.  схема тоже у меня есть, только я не понимаю как её сюда выложить.

roman2712@mail.ru
Offline
Зарегистрирован: 16.01.2014

Посмотрите вот на эту штучку: http://devicter.ru/goods/Iteaduino-Tiny (не реклама)

под винду она может быть запрограмирована как HID клавиатура или мышь,  (как делать - есть в стандартных примерах). Работает вроде как без дополнительных драйверов, используется "стандартное HID устройство ввода", так что на планшете должно работать (если планшет USB клавиатуру поддерживает)

+ у нее есть аналоговый вход для чтения резистивных кнопок...

gooffich
Offline
Зарегистрирован: 03.10.2014

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

roman2712@mail.ru
Offline
Зарегистрирован: 16.01.2014

Посмотрите вот на эту штучку: http://devicter.ru/goods/Iteaduino-Tiny (не реклама)

под винду она может быть запрограмирована как HID клавиатура или мышь,  (как делать - есть в стандартных примерах). Работает вроде как без дополнительных драйверов, используется "стандартное HID устройство ввода", так что на планшете должно работать (если планшет USB клавиатуру поддерживает)

+ у нее есть аналоговый вход для чтения резистивных кнопок...

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

arduino micro имеет хардварный usb и тоже это все может, даже больше

gooffich
Offline
Зарегистрирован: 03.10.2014

gooffich
Offline
Зарегистрирован: 03.10.2014

подключал по такой схеме . скетч закидывал такой 

// Для рулевых кнопок
// Задержки между нажатиями конкретных кнопок, миллисекунды
#define KEY_CH_MINUS_DELAY    (200)
#define KEY_CH_PLUS_DELAY     (200)
#define KEY_VOL_MINUS_DELAY   (150)
#define KEY_VOL_PLUS_DELAY    (150)
#define KEY_MODE_DELAY        (300)

// Значения кнопок
#define KEY_CH_MINUS    (445)
#define KEY_CH_PLUS     (640)
#define KEY_VOL_MINUS   (90)
#define KEY_VOL_PLUS    (270)
#define KEY_MODE        (805)

// Погрешность при чтении кнопок
#define KEY_DELTA       (30)

// Коды кнопок, что отсылаем в порт внешней проге
#define CH_MINUS    (1)
#define CH_PLUS     (2)
#define VOL_MINUS   (3)
#define VOL_PLUS    (4)
#define MODE        (5)
#define NONE        (0)


unsigned long LastTimeKeyPressed = millis();
int LastKeyPressed = NONE;

void setup()      
{     
Serial.begin(57600);
}      

void loop()      
{   
  ReadSteering();
  delay(50);
} 

// Читает рулевые кнопки и пишет в порт код нажатой кнопки
void ReadSteering()      
{   
  unsigned long TimeKeyPressed;
  int KeyPressed = NONE;
  int dt1 = analogRead(3);
  delay(50); 
  int dt2 = analogRead(3);
  if (abs(dt1-dt2)<=5 and dt1<900 ) //если нет дребезга и что-то есть
  { 
    // Регистрируем время нажатия кнопки
    TimeKeyPressed = millis();

    //CH_MINUS    
    if ( (dt1-KEY_DELTA <= KEY_CH_MINUS) and (dt1+KEY_DELTA >= KEY_CH_MINUS) )
    {
      if ( (LastKeyPressed != CH_MINUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_MINUS_DELAY) )
      {
        LastKeyPressed = CH_MINUS;
        KeyPressed = CH_MINUS;
        LastTimeKeyPressed = TimeKeyPressed;
      }  
    }
    //CH_PLUS
    else if ( (dt1-KEY_DELTA <= KEY_CH_PLUS) and (dt1+KEY_DELTA >=KEY_CH_PLUS) )
    {
      if ( (LastKeyPressed != CH_PLUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_PLUS_DELAY) )
      {
        LastKeyPressed = CH_PLUS;
        KeyPressed = CH_PLUS;
        LastTimeKeyPressed = TimeKeyPressed;
      }  
    }
    //VOL_MINUS
    else if ( (dt1-KEY_DELTA <= KEY_VOL_MINUS) and (dt1+KEY_DELTA >=KEY_VOL_MINUS) )
    {
      if ( (LastKeyPressed != VOL_MINUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_VOL_MINUS_DELAY) )
      {
        LastKeyPressed = VOL_MINUS;
        KeyPressed = VOL_MINUS;
        LastTimeKeyPressed = TimeKeyPressed;
      }  
    }
    //VOL_PLUS
    else if ( (dt1-KEY_DELTA <= KEY_VOL_PLUS) and (dt1+KEY_DELTA >=KEY_VOL_PLUS) )
    {
      if ( (LastKeyPressed != VOL_PLUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_VOL_PLUS_DELAY) )
      {
        LastKeyPressed = VOL_PLUS;
        KeyPressed = VOL_PLUS;
        LastTimeKeyPressed = TimeKeyPressed;
      }
    }
    //MODE
    else if ( (dt1-KEY_DELTA <= KEY_MODE) and (dt1+KEY_DELTA >=KEY_MODE) )
    {
      if ( (LastKeyPressed != MODE) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_MODE_DELAY) )
      {
        LastKeyPressed = MODE;
        KeyPressed = MODE;
        LastTimeKeyPressed = TimeKeyPressed;
      }  
    }
    
    if (KeyPressed != NONE)
    {
      Serial.print(char(255));
      Serial.print(KeyPressed,DEC);
    }  

    //Serial.print(dt1,DEC);
    //Serial.print("   ");
    //Serial.println(dt2,DEC);
  }   
}  

после прошивки тоже самое. вытаскиваю, вставляю в пк ардуино. всё тоже самое. ЧТО НЕ ТАК ДЕЛАЮ?

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

http://www.pccar.ru/showthread.php?s=bec0ba5838b7b08b6d42eb30536bbf99&t=...
Копайте в эту сторону. Вам просто надо распознать резистивные кнопки и эмулировать usb клаву которая будет выдавать коды соответств ующие вашим кнопкам.
Посмотрите soft USB.
Удачи.

neospromiy
Offline
Зарегистрирован: 15.07.2013

Во первых вам нужна Aduino micro на чипе ATmega32u4, на atmega328 вы этого не сможете сделать там нет апаратной потдержки HID.

В вторых нужно заменить файлы как сдесь http://pccar.ru/showpost.php?p=277286&postcount=182

эта версия arduino может пркидываться HID устройством (т.е. устройством ввода как клава) когда обьявляешь  Keyboard.begin(); в void setup() 

вот сдесь видео как это работает на моем устройстве http://www.youtube.com/watch?v=KhQyYie-BcA&list=UUx7dvowsncOHIufjVfnKfHg

Вот мой скетч.

#include <EEPROM.h>
long previousMillis = 0; 
int nexus = 12; //на экранчкик пионер
int pioneer = 10; //на экранчкик нексус
int bluettoch = 11; //на экранчкик блютус

int nexpioner = 6; //пионер слежующая
int predpioner = 7; //пионер предидущая
int mytetepioner = 5; //пионер приглушение звука
int voluppioner = 8; //пионер звук +
int voldownpioner = 9; //пионер звук -

int nexbluetooch = 2; //блютус следующий
int predbluetooch = 3; //блютус предедиудущий
int mutebluetooch = 4; //блютус муте


int val=0; 
int analogPin=0;
int rulevieknopki;
int regim = 1;
int muteTap=0;
long previousMillisTap=0;
long startMillisTap=0;
int muteType=0;
long ledTime=100;
long ledStart=0;
boolean ledON=false;
unsigned long flag = 0;
unsigned long eventTime = 0;
unsigned long pauseMillis = 0;

void setup()    
{ 
   Keyboard.begin();
  Serial.begin(9600);
    pinMode(12, OUTPUT); 
    pinMode(11, OUTPUT);
    pinMode(10, OUTPUT); 
    pinMode(9, OUTPUT); 
    pinMode(8, OUTPUT); 
    pinMode(2, OUTPUT);
    pinMode(3, OUTPUT);
    pinMode(4, OUTPUT); 
    pinMode(5, OUTPUT);
    pinMode(6, OUTPUT);
    pinMode(7, OUTPUT);
    pinMode(14, INPUT);  // резестивная копка кнопка
    
} 

void loop() 
     
 { 
   rulevieknopki=analogRead(analogPin);
   
    
   //Serial.println(EEPROM.read(2));
   //Serial.println(EEPROM.read(1));
   //Serial.println(rulevieknopki);
   
    if(rulevieknopki>350&&rulevieknopki<400)//если кнопка нажата ... 
     { 
       if (millis() - previousMillis >1200)    
     { 
        previousMillis = millis();     
        val++; 
     } 
     } 
     else 
     { 
       val=0; 
     } 
        
     if(val>=5) 
     { val=0; 
       regim++; 
       
       if(regim>3)
       regim=1;
           
      
        
        if(regim==1) //пионер 
        {
       EEPROM.write(2,0);
       EEPROM.write(1,0);
       EEPROM.write(0,1);
              
       }
       if(regim==2) //нексу
       {
       EEPROM.write(2,0);
       EEPROM.write(1,1);
       EEPROM.write(0,0);
       
        }
       if(regim==3) //блютус
       {
       EEPROM.write(2,1); 
       EEPROM.write(1,0);
       EEPROM.write(0,0);  
            
       }
       
     } 
             
     else if (EEPROM.read(1)==1) analogWrite(pioneer,1000);
     
     else
     {
     analogWrite(pioneer,0);
     }
     
     if (EEPROM.read(0)==1) analogWrite(nexus,1000);
     
     else
     analogWrite(nexus,0);
     
      if (EEPROM.read(2)==1) analogWrite(bluettoch,1000);
     
     else
     analogWrite(bluettoch,0);
     
     
     
     
      if (rulevieknopki>330&&rulevieknopki<450)
      {
        if (muteTap==0)
        startMillisTap=millis();
        muteTap=1; 
        if (EEPROM.read(0)==1) muteType=1;
        if (EEPROM.read(1)==1) muteType=2;
        if (EEPROM.read(2)==1) muteType=3;
        
       if ((millis() - previousMillisTap>1200) )
        {
          previousMillisTap = millis();     
          muteTap++; 
        }
          
      }
     else 
     { 
       
        
       if (((muteTap>0)&&((millis()-startMillisTap)<5000))||(ledON))
       {
         switch (muteType)
          {
            case 1:
            if (ledStart==0) 
            {
            digitalWrite(mytetepioner, HIGH);
            ledON=true;
            ledStart=millis();
            }
            else if (millis()-ledStart>ledTime)
            {
              ledStart=0;
              digitalWrite(mytetepioner, LOW);
               ledON=false;
              muteTap=0;
            }
            break;
            case 2:  
            if (ledStart==0) 
            {
            Remote.play_pause();
              ledON=true;
            ledStart=millis();
            }
            else if (millis()-ledStart>ledTime)
            {
              ledStart=0;
               Remote.clear();
                 ledON=false;
              muteTap=0;
            }
            break;
            
            /*
            case 3:  
             if (ledStart==0) 
            {
            digitalWrite(mutebluetooch, HIGH);
              ledON=true;
            ledStart=millis();
            }
            else if (millis()-ledStart>ledTime)
            {
              ledStart=0;
              digitalWrite(mutebluetooch, LOW);
                 ledON=false;
              muteTap=0;
            }
            break;*/
          }
      
      
       }
       muteTap=0;
     } 
        
     //////////////////////////////////////////////////////////////////////////////////////////////////////////
     ///////////////////////////////////////////////УПРАВЛЕНЕ ПИОНЕР///////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////////////////////////
     
       if ((rulevieknopki>100&&rulevieknopki<200)&&(EEPROM.read(0)==1)) 
      digitalWrite(nexpioner, HIGH);
     else digitalWrite (nexpioner, LOW);
     
       if ((rulevieknopki>480&&rulevieknopki<580)&&(EEPROM.read(0)==1)) 
      digitalWrite(predpioner, HIGH);
     else digitalWrite (predpioner, LOW);
     
     if (rulevieknopki>700&&rulevieknopki<850)digitalWrite(voluppioner, HIGH);
       else digitalWrite(voluppioner, LOW);
          
       if (rulevieknopki>900)digitalWrite(voldownpioner, HIGH);
     else digitalWrite (voldownpioner, LOW);
     
     
      
     /////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////УПРАВЛЕНИЕ NEXUS///////////////////////////////////////////////
     /////////////////////////////////////////////////////////////////////////////////////////////////////////////
     if(rulevieknopki<=50 && flag == 0) // все кнопки отпущены
     
     {
    eventTime=millis();
     }
     
      if(millis()-eventTime>10 && millis()-eventTime<499 && rulevieknopki>100&&rulevieknopki<200&&(EEPROM.read(1)==1))
     // короткое нажатие кнопки от 10 до 499 миллисекунд (изменяется здесь millis()-eventTime>10 && millis()-eventTime<499)
     { 
    flag = 2;
     }
     if(rulevieknopki<=50 && flag == 2) // действие после короткого нажатия кнопки, следующая песня
   {
    Remote.next();
    flag = 0;
    delay(10);
    Remote.clear();
   }
     if(millis()-eventTime>500 && rulevieknopki>100&&rulevieknopki<200 && flag == 2 || rulevieknopki>100&&rulevieknopki<200 && flag == 3&&(EEPROM.read(1)==1))
    // удержание кнопки от 500 до ? миллисекунд (изменяется здесь millis()-eventTime>500)
     { 
    Remote.increase(); // действие после удержание кнопки, увеличение громкости
    flag = 3;
    Remote.clear();
    delay(100);
   }
    
           if(millis()-eventTime>10 && millis()-eventTime<499 && rulevieknopki>480&&rulevieknopki<580&&(EEPROM.read(1)==1))
     // короткое нажатие кнопки от 10 до 499 миллисекунд (изменяется здесь millis()-eventTime>10 && millis()-eventTime<499)
     { 
    flag = 2;
     }
     if(rulevieknopki<=50 && flag == 2) // действие после короткого нажатия кнопки, предидущая песня
   {
    Remote.previous();
    flag = 0;
    delay(10);
    Remote.clear();
   }
     if(millis()-eventTime>500 && rulevieknopki>480&&rulevieknopki<580 && flag == 2 || rulevieknopki>480&&rulevieknopki<580 && flag == 3&&(EEPROM.read(1)==1))
    // удержание кнопки от 500 до ? миллисекунд (изменяется здесь millis()-eventTime>500)
     { 
    Remote.decrease(); // действие после удержание кнопки, уменьшение громкости
    flag = 3;
    Remote.clear();
    delay(100);
   }
     
     
      if(rulevieknopki<=50 && flag == 3 || rulevieknopki<=50 && flag == 5 || rulevieknopki<=50 && flag == 6) // действие после отпускания кнопки
   {
    flag = 0;
   }   
     
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     ///////////////////////////////////////////////////////УПРАВЛЕНИЕ БЛЮТУС///////////////////////////////////////////////////////////
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     
      if ((rulevieknopki>330&&rulevieknopki<450)&&(EEPROM.read(2)==1))
      digitalWrite(mutebluetooch, HIGH);
     else digitalWrite (mutebluetooch, LOW);
     
     if ((rulevieknopki>100&&rulevieknopki<200)&&(EEPROM.read(2)==1))
      digitalWrite(nexbluetooch, HIGH);
     else digitalWrite (nexbluetooch, LOW);
     
     if ((rulevieknopki>480&&rulevieknopki<580)&&(EEPROM.read(2)==1))
      digitalWrite(predbluetooch, HIGH);
     else digitalWrite (predbluetooch, LOW);
    
     
          

} 

 

gooffich
Offline
Зарегистрирован: 03.10.2014

Спасибо! А через чего управление включение планшета активировал?

gooffich
Offline
Зарегистрирован: 03.10.2014

Приобрёл новую плату Leonardo. измерил показание кнопок:

Громкость + 393

громкость  - 296

трек        + 121

трек        - 166

плей.пауза 32

моде          86

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