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

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

Ответ
 
Опции темы
Старый 12.01.2019, 21:22   #841
fishdimka
Новый Пользователь
 
Регистрация: 18.12.2018
Возраст: 37
Регион: 26
Сообщений: 7
fishdimka is on a distinguished road
По умолчанию

у меня пишет так
https://cloud.mail.ru/public/Hdfc/U5ENixwV5

Последний раз редактировалось fishdimka; 12.01.2019 в 21:23. Причина: добавил текст
fishdimka вне форума   Ответить с цитированием
Старый 12.01.2019, 21:31   #842
Alex15BV
Пользователь
 
Регистрация: 01.11.2017
Возраст: 44
Город: Лобня
Регион: 50, 90, 150
Машина: BMW 530D Touring
Сообщений: 50
Alex15BV is a jewel in the roughAlex15BV is a jewel in the roughAlex15BV is a jewel in the rough
По умолчанию

ну так понятно... я же говорю: "кусок про энкодер"! У меня ж там и отслеживание длительности нажатия, и кнопки... Бери, что тебе нужно, а остальное выкидывай: переменная ShortKey не объявлена же?

скетч в личке смотри
Alex15BV вне форума   Ответить с цитированием
Старый 12.01.2019, 21:41   #843
fishdimka
Новый Пользователь
 
Регистрация: 18.12.2018
Возраст: 37
Регион: 26
Сообщений: 7
fishdimka is on a distinguished road
По умолчанию

благодарю
fishdimka вне форума   Ответить с цитированием
Старый 17.01.2019, 01:01   #844
Vogel
Новый Пользователь
 
Регистрация: 04.01.2018
Регион: 77, 97, 99, 177
Сообщений: 4
Vogel is on a distinguished road
По умолчанию

Цитата:
Сообщение от Alex15BV Посмотреть сообщение
скетч в личке смотри
А можно мне тоже, пожалуйста ?
Vogel на форуме   Ответить с цитированием
Старый 17.01.2019, 11:13   #845
Alex15BV
Пользователь
 
Регистрация: 01.11.2017
Возраст: 44
Город: Лобня
Регион: 50, 90, 150
Машина: BMW 530D Touring
Сообщений: 50
Alex15BV is a jewel in the roughAlex15BV is a jewel in the roughAlex15BV is a jewel in the rough
По умолчанию

Доброго времени суток Всем.
Поскольку в этой теме энкодер уже обсуждался, а резистивные кнопки - это основа конструкции: выложу пока здесь... Доведу до конечного вида - положу в "манипуляторы"
... короче джойстик i-Drive из говна и палок:
- Ардуино ПроМикро
- жменька радиодеталек
- энкодер за 50 рублей
- крутилка

Функционал и принцип - на картинках. Имеет два режима работы, распознает длительность нажатия, в итоговом варианте имеет подсветку кнопок и индикацию режима работы. На фото прототип, созданный для проверки догадочек и отладки кода. Сам скетч:
PHP код:
#include <Mouse.h>
#include <Keyboard.h>
#include <Tablet.h>

// ----- пины Ардуино -----------------

#define KeyModePin 0    // кнопка Mode
#define KeyAppPin 1     // кнопка APPs
#define KeyEncPin 2     // кнопка энкодера
#define EncAcPin 3      // энкодер - канал А
#define EncBcPin 5      // энкодер - канал В
#define LedPin 6        // светодиод индикации режима работы
#define KeysPin A0      // кнопки управления
#define MousePin A1     // кнопки джойстика

// ----- рабочие переменные -----------

int DataKey;                          // значение ADC-кнопки
byte KeyNumber;                       // номер нажатой кнопки
unsigned long EventStart 0;         // момент нажатия
unsigned long TimePress 0;          // длительность нажатия

// ----- различные флаги --------------

byte ShortKey 1;                    // признак короткого/длинного нажатия
byte NeedWork 0;                    // необходимость обработки нажатой кнопки
volatile boolean RightMove false;   // направления вращения энкодера
volatile boolean LeftMove false;    
volatile boolean EncPress false;    // нажатия кнопки энкодера
volatile boolean AppPress false;    // кнопки APPs
volatile boolean MediaMode false;   // кнопки MODE

// ----- обработчики прерываний -------

void EncoderMove() {                     // вращение энкодера
  
if (digitalRead(EncBcPin) == HIGH) {
    
RightMove true;
  }
  else {
    
LeftMove true;
  }
}

void KeyEncPress() {        // кнопка энкодера
  
EncPress true;
}

void KeyAppPress() {        // кнопка APPs
  
AppPress true;
}


void KeyModePress() {       // кнопка MODE
  
MediaMode = !MediaMode;
  if (
MediaMode == true){
    
digitalWrite(LedPinHIGH);
  }
  else {
    
digitalWrite(LedPinLOW);
  }
}

void setup() {
  
pinMode(KeyModePinINPUT_PULLUP);                                          // кнопка "Mode" - при нажатии управляем интерфейсом
  
attachInterrupt(digitalPinToInterrupt(KeyModePin), KeyModePressFALLING);
  
pinMode(KeyAppPinINPUT_PULLUP);                                           // кнопка "APP" - при нажатии список запущеных приложений
  
attachInterrupt(digitalPinToInterrupt(KeyAppPin), KeyAppPressFALLING);
  
pinMode(KeyEncPinINPUT_PULLUP);                                           // кнопка энкодера - при нажатии PLAY/PAUSE либо ENTER/ESCAPE
  
attachInterrupt(digitalPinToInterrupt(KeyEncPin), KeyEncPressFALLING);
  
pinMode(EncAcPinINPUT_PULLUP);                                            // канал-А энкодера - для отслеживания вращения
  
attachInterrupt(digitalPinToInterrupt(EncAcPin), EncoderMoveFALLING);
  
pinMode(EncBcPinINPUT_PULLUP);                                            // канал-В энкодера - для определения направления вращения
  
pinMode(LedPinOUTPUT);
  
digitalWrite(LedPinLOW);

  
analogReference(DEFAULT);           // Aref = 5V, подтягивающий резистор на линии кнопок - 4,7 кОм

  
Serial.begin(9600);                 // инициализация интерфейсов
  
Keyboard.begin();
  
Mouse.begin();
  
delay(500);
}

void loop() {
  if (
RightMove == true) {             // обработка вращения энкодера: если вращаем вправо - увеличить громкость/стрелка вверх
    
if (MediaMode == true) {
      
Tablet.vol_up();
      
Tablet.clear();
    }
    else {
      
Keyboard.press(KEY_UP_ARROW);
      
delay(10);
      
Keyboard.release(KEY_UP_ARROW);
    }
    
RightMove false;
  }

  if (
LeftMove == true) {               // если вращаем влево - уменьшаем громкость/стрелка вниз
    
if (MediaMode == true) {
      
Tablet.vol_down();
      
Tablet.clear();
    }
    else {
      
Keyboard.press(KEY_DOWN_ARROW);
      
delay(10);
      
Keyboard.release(KEY_DOWN_ARROW);
    }
    
LeftMove false;
  }

  if (
AppPress == true) {               // кнопка "APPs"
    
Keyboard.press(KEY_LEFT_ALT);
    while (
digitalRead(KeyAppPin) == LOW) {
      
Keyboard.press(KEY_TAB);
      
delay(10);
      
Keyboard.release(KEY_TAB);
      
delay(1000);
    }
    
Keyboard.release(KEY_LEFT_ALT);
    
AppPress false;
    
delay(10);
  }  
    
  if (
analogRead(MousePin) > 800 && analogRead(KeysPin) > 800 && EncPress == false) {   // пока кнопки не нажаты взводим на всякий случай таймер обработки нажатия
    
EventStart millis();
  }
 
  if (
EncPress == true) {                       // обнаружили факт нажатия кнопки энкодера - определяем длительность нажатия и запоминаем кнопку
    
delay(20);
    while (
digitalRead(KeyEncPin) == LOW) {     // пока не отпустим -
      
TimePress millis() - EventStart;        // считаем время нажатия
      
delay(10);
    }
    
KeyNumber 1;                              // сохраняем номер нажатой кнопки для обработчика
    
EncPress false;                           // сбрасываем флаг нажатия
    
NeedWork 1;                               // взводим флаг необходимости обработки нажатия
    
if (TimePress <= 400) {                     // сохраняем длительность нажатия
      
ShortKey 1;
    }
    else {
      
ShortKey 0;
    }
  }

  if (
analogRead(MousePin) < 800) {             // обнаружили факт нажатия кнопки джойстика
    
delay(20);
    
DataKey analogRead(MousePin);
    if (
DataKey 240 && KeyNumber == 0) {      // кнопка "UP" - резистор 1 кОм
      
KeyNumber 2;
    }
    if (
DataKey 380 && KeyNumber == 0) {      // кнопка "LEFT" - резистор 2 кОм
      
KeyNumber 3;
    }
    if (
DataKey 550 && KeyNumber == 0) {      // кнопка "RIGHT" - резистор 3,9 кОм
      
KeyNumber 4;
    }
    if (
DataKey 800 && KeyNumber == 0) {      // кнопка "DOWN" - резистор 10 кОм
      
KeyNumber 5;
    }
    
NeedWork 1;
  }
  
  if (
analogRead(KeysPin) < 800) {              // обнаружили факт нажатия кнопки управления
    
delay(20);
    
DataKey analogRead(KeysPin);
    while (
analogRead(KeysPin) < 800) {
      
TimePress millis() - EventStart;
      
delay(10);
    }
    if (
DataKey 100) {                        // кнопка "Home/Menu" - на землю
      
KeyNumber 6;
    }
    if (
DataKey 380 && KeyNumber == 0) {      // кнопка "Enter/Esc" - резистор 1 кОм
      
KeyNumber 7;
    }
    
NeedWork 1;
    if (
TimePress <= 400) {                     
      
ShortKey 1;
    }
    else {
      
ShortKey 0;
    }
  }                      

// ----- обработчик нажатия кнопки с учетом длительности удержания -----
  
if (NeedWork == 1) {
    switch (
KeyNumber) {
      case 
1:
        if (
MediaMode == 1) {
          if (
ShortKey == 1) {
            
Tablet.play_pause();
            
Tablet.clear();
          }
          else {
            
Tablet.mute();
            
Tablet.clear();
          }
        }
        else {
          if (
ShortKey == 1) {
            
Keyboard.press(KEY_RETURN);
            
delay(10);
            
Keyboard.release(KEY_RETURN);
          }
          else {
            
Keyboard.press(KEY_ESC);
            
delay(10);
            
Keyboard.release(KEY_ESC);
          }
        }
        
delay(100);
        break;
      case 
2:
        if (
MediaMode == 1) {
          
Tablet.forward();
          
Tablet.clear();
          
delay(100);
        }
        else {
          
Mouse.move(0, -100);
        }
        break;
      case 
3:
        if (
MediaMode == 1) {
          
Tablet.previous();
          
Tablet.clear();
          
delay(100);
        }
        else {
          
Mouse.move(-1000);
        }
        break;
      case 
4:
        if (
MediaMode == 1) {
          
Tablet.next();
          
Tablet.clear();
          
delay(100);
        }
        else {
          
Mouse.move(1000);
        }
        break;
      case 
5:
        if (
MediaMode == 1) {
          
Tablet.rewind();
          
Tablet.clear();
          
delay(100);
        }
        else {
          
Mouse.move(0100);
        }
        break;
      case 
6:
        if(
ShortKey == 1) {
          
Tablet.home();
          
Tablet.clear();
        }
        else {
          
Keyboard.press(KEY_LEFT_CTRL);
          
Keyboard.press(KEY_ESC);
          
delay(10);
          
Keyboard.releaseAll();
        }
        
delay(100);
        break;
      case 
7:
        if (
ShortKey == 1) {
          
Keyboard.press(KEY_RETURN);
          
delay(10);
          
Keyboard.release(KEY_RETURN);
        }
        else {
          
Keyboard.press(KEY_ESC);
          
delay(10);
          
Keyboard.release(KEY_ESC);
        }
        
delay(100);
        break;   
      }
        
KeyNumber 0;
        
NeedWork 0;
   }

За код не пинайте сильно - это ПЕРВАЯ моя программа для Ардуино в жизни. Скетч немножко не соответствует прототипу, а соответствует заказанным в Китае платам, уже скоро доедут (если и содержит какие-то мелкие косяки - то это не страшно, по приезду плат допилим...)
Миниатюры
Нажмите на изображение для увеличения
Название: rYAAAgA_7OA-1920.jpg
Просмотров: 7
Размер:	48.5 Кб
ID:	50723   Нажмите на изображение для увеличения
Название: RKAAAgAe7OA-1920.jpg
Просмотров: 11
Размер:	88.9 Кб
ID:	50724   Нажмите на изображение для увеличения
Название: vCAAAgAe7OA-1920.jpg
Просмотров: 12
Размер:	145.0 Кб
ID:	50725   Нажмите на изображение для увеличения
Название: Снимок1.JPG
Просмотров: 11
Размер:	98.2 Кб
ID:	50726   Нажмите на изображение для увеличения
Название: Снимок2.JPG
Просмотров: 12
Размер:	93.5 Кб
ID:	50727  

Нажмите на изображение для увеличения
Название: Снимок.jpg
Просмотров: 14
Размер:	43.8 Кб
ID:	50728  
Alex15BV вне форума   Ответить с цитированием
Старый 17.01.2019, 13:29   #846
urikz
Новый Пользователь
 
Регистрация: 25.10.2013
Город: Karaganda
Регион: 09
Машина: TLC Prado 120 3.0D
Сообщений: 9
urikz is on a distinguished road
По умолчанию

Здравствуйте Alex15BV! Слежу за развитием вашего проекта на Драйве2 и вы все никак мне не даете платы сделать!!! )) Постоянные улучшения! Архив новых плат и дизайн крепежа плавающего под прорези можно или еще будут варианты ? )) Вообще красавчик я скажу-снимаю шляпу! Спасибо!
urikz вне форума   Ответить с цитированием
Старый 17.01.2019, 21:36   #847
Alex15BV
Пользователь
 
Регистрация: 01.11.2017
Возраст: 44
Город: Лобня
Регион: 50, 90, 150
Машина: BMW 530D Touring
Сообщений: 50
Alex15BV is a jewel in the roughAlex15BV is a jewel in the roughAlex15BV is a jewel in the rough
По умолчанию

Если честно, я выкладываю свои поделки скорее как "идеи", нежели как "проекты"... Как их использовать (копировать полностью, или брать только нужное, а или игнорировать вовсе) - это уж каждый сам решает.
Китайцы сильно избаловали: когда комплект плат стоит как один раз пива попить - на каждый новый шаг заказываю новые платы, чтоб всё было красиво (не люблю всякие сопли/перемычки)

Последний раз редактировалось Alex15BV; Сегодня в 01:27.
Alex15BV вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы

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

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



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


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