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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.01.2019, 21:22   #841
fishdimka
Новый Пользователь
 
Регистрация: 18.12.2018
Возраст: 43
Регион: 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
Возраст: 50
Город: Лобня
Регион: 50, 90, 150
Машина: BMW 530D Touring
Сообщений: 96
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
Возраст: 43
Регион: 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
Возраст: 50
Город: Лобня
Регион: 50, 90, 150
Машина: BMW 530D Touring
Сообщений: 96
Alex15BV is a jewel in the roughAlex15BV is a jewel in the roughAlex15BV is a jewel in the rough
По умолчанию

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

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

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

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

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

unsigned long EventStart 0;         // момент нажатия
unsigned long TimePress 0;          // длительность нажатия

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

volatile bool RightMove false;      // направления вращения энкодера
volatile bool LeftMove false;    
volatile bool EncPress false;       // нажатия кнопки энкодера
volatile bool AppPress false;       // кнопки APPs
volatile bool 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){
    
digitalWrite(LedPinHIGH);
  }
  else {
    
digitalWrite(LedPinLOW);
  }
}

void setup() {
  
pinMode(KeyModePinINPUT_PULLUP);                                          // кнопка "Mode" - управляем интерфейсом / медиа-функциями
  
attachInterrupt(digitalPinToInterrupt(KeyModePin), KeyModePressFALLING);
  
pinMode(KeyAppPinINPUT_PULLUP);                                           // кнопка "APP" - при нажатии список запущеных приложений (ALT/TAB)
  
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 кОм

  
Keyboard.begin();                   // инициализация USB-HID интерфейсов
  
Mouse.begin();
  
wdt_enable(WDTO_4S);                // Активируем сторожевой таймер с интервалом 4 секунд
}

void loop() {
  
  static 
bool FindKey;                // признак найденной кнопки
  
static int DataKey;                 // значение ADC-кнопки
  
  
if (RightMove) {                    // обработка вращения энкодера: если вращаем вправо - увеличить громкость/стрелка вверх
    
if (MediaMode) {
      
Tablet.vol_up();
      
Tablet.clear();
    }
    else {
      
Keyboard.press(KEY_UP_ARROW);
      
Keyboard.release(KEY_UP_ARROW);
    }
    
RightMove false;
  }

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

  if (
AppPress) {                     // кнопка "APPs"
    
Keyboard.press(KEY_LEFT_ALT);
    while (
digitalRead(KeyAppPin) == LOW) {
      
Keyboard.press(KEY_TAB);
      
Keyboard.release(KEY_TAB);
      
delay(1000);
      
wdt_reset();
    }
    
Keyboard.release(KEY_LEFT_ALT);
    
AppPress false;
  }  
    
  if (
analogRead(MousePin) > 800 && analogRead(KeysPin) > 800 && !EncPress) {   // пока кнопки не нажаты взводим на всякий случай таймер обработки нажатия
    
EventStart millis();
  }
 
  if (
EncPress) {                               // обнаружили факт нажатия кнопки энкодера - определяем длительность нажатия
    
delay(20);
    while (
digitalRead(KeyEncPin) == LOW) {     // пока не отпустим -
      
TimePress millis() - EventStart;        // считаем время нажатия
      
delay(10);
      
wdt_reset();
    }
    if (
TimePress <= 200) {                     // действуем по длительности нажатия, если короткое:
      
if (MediaMode) {                          // в медиа-режиме - play/pause
        
Tablet.play_pause();
        
Tablet.clear();
      }
      else {
        
Keyboard.press(KEY_RETURN);        // в режиме интерфейса - enter
        
Keyboard.release(KEY_RETURN);        
      }
    }
    else {                                 
// если длинное:
      
if (MediaMode) {                     // в медиа-режиме - mute
        
Tablet.mute();
        
Tablet.clear();
      }
      else {                               
// в режиме интерфейса - escape
        
Keyboard.press(KEY_ESC);
        
Keyboard.release(KEY_ESC);        
      }
    }
    
EncPress false;                      // сбрасываем флаг нажатия
  
}

  if (
analogRead(MousePin) < 800) {        // обнаружили факт нажатия кнопки джойстика
    
delay(20);
    
FindKey false;
    
DataKey analogRead(MousePin);
    if (
DataKey 100 && !FindKey) {       // кнопка "UP" - резистор 1 кОм
      
if (MediaMode) {
        
Tablet.forward();
        
Tablet.clear();
        
delay(100);
      }
      else {
        
Mouse.move(0, -100);
      }
    
FindKey true;
    }
    if (
DataKey 350 && !FindKey) {       // кнопка "LEFT" - резистор 2 кОм
      
if (MediaMode) {
        
Tablet.previous();
        
Tablet.clear();
        
delay(100);
      }
      else {
        
Mouse.move(-1000);
      }
    
FindKey true;
    }
    if (
DataKey 600 && !FindKey) {       // кнопка "RIGHT" - резистор 3,9 кОм
      
if (MediaMode) {
        
Tablet.next();
        
Tablet.clear();
        
delay(100);
      }
      else {
        
Mouse.move(1000);
      }
    
FindKey true;
    }
    if (
DataKey 800 && !FindKey) {       // кнопка "DOWN" - резистор 10 кОм
      
if (MediaMode) {
        
Tablet.rewind();
        
Tablet.clear();
        
delay(100);
      }
      else {
        
Mouse.move(0100);
      }
    }
  }
  
  if (
analogRead(KeysPin) < 800) {         // обнаружили факт нажатия кнопки управления
    
delay(20);
    
FindKey false;
    
DataKey analogRead(KeysPin);
    while (
analogRead(KeysPin) < 800) {
      
TimePress millis() - EventStart;
      
delay(10);
      
wdt_reset();
    }
    if (
DataKey 100) {                   // кнопка "Home/Menu" - на землю
      
if (TimePress <= 200) {                     
        
Tablet.home();
        
Tablet.clear();
      }
      else {
        
Keyboard.press(KEY_LEFT_CTRL);
        
Keyboard.press(KEY_ESC);
        
Keyboard.releaseAll();      
      }
    
FindKey true;  
    }
    if (
DataKey 350 && !FindKey) {      // кнопка "Enter/Esc" - резистор 1 кОм
      
if (TimePress <= 200) {                     
        
Mouse.click(MOUSE_LEFT);
      }
      else {
        
Mouse.click(MOUSE_RIGHT);
      }
    }                      
  }
  
wdt_reset();                            // производим периодический сброс таймера

За код не пинайте сильно - это ПЕРВАЯ моя программа для Ардуино в жизни. Скетч немножко не соответствует прототипу, а соответствует заказанным в Китае платам, уже скоро доедут

Исходники все здесь: информация по пульту управления

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

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

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

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

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



Alex15BV вне форума   Ответить с цитированием
Старый 23.01.2019, 06:16   #849
urikz
Новый Пользователь
 
Регистрация: 25.10.2013
Город: Karaganda
Регион: 09
Машина: TLC Prado 120 3.0D
Сообщений: 25
urikz is on a distinguished road
По умолчанию

Жду!!!
urikz вне форума   Ответить с цитированием
Старый 23.01.2019, 18:31   #850
mazay66
Старший Пользователь
 
Регистрация: 17.10.2015
Город: Санкт-Петербург
Регион: 78, 98
Машина: Рено Колеос
Сообщений: 647
mazay66 is a name known to allmazay66 is a name known to allmazay66 is a name known to allmazay66 is a name known to allmazay66 is a name known to allmazay66 is a name known to all
По умолчанию

Поддержу. Интересное изделие получается. Размеры какие? Думаю, не плохо было бы разместить его в корпусе цилиндрической формы (что бы помещался в место для подстаканника, имеющееся во многих авто).
mazay66 вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 3 (пользователей: 0 , гостей: 3)
 

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

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



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


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