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

PCCar.ru - Ваш автомобильный компьютер (http://pccar.ru/index.php)
-   Дополнительные устройства (http://pccar.ru/forumdisplay.php?f=177)
-   -   Резистивные кнопки под андроид (http://pccar.ru/showthread.php?t=18478)

svoboda120 20.12.2018 20:16

Цитата:

Сообщение от Alex15BV (Сообщение 407291)
Что может быть? Может в системные папки нужно что-то добавить, в buildprop что-то прописать?

У вас что то не так с режимом ОТГ. Посмотрите эту статью. В ней автор описывает прошивку для вашего девайса и одним из преимуществ этой прошивки считает "— разъем microUSB type-C активирован в режим OTG, теперь можно в него подключать устройства". Возможно подтолкнет вас на какие то мысли.

Alex15BV 22.12.2018 16:59

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

Пример:
зачем сначала "vol_up = 111", потом к этому "button_range = 5"
и потом к этому ещё "data >= vol_up - button_range && data <= vol_up + button_range"

когда можно "vol_up_porog = 120" и затем "data < vol_up_porog"
и к тому же эту переменную можно потом использовать в loop для однозначной идентификации нажатой кнопки (в качестве флага)...

fishdimka 12.01.2019 14:35

задача:
-при повороте энкодера по часовой стрелке срабатывала кнопка "стрелка вправо" KEY_RIGHT_ARROW
-при повороте против часовой "стрелка влево" KEY_LEFT_ARROW
-при нажатии энкодера Enter "KEY_RETURN"
собрал скетч,
работает только нажатие энкодера Enter "KEY_RETURN"
если не чего не трогаешь просто перелистываются приложения, как будто нажата клавиша "стрелка вправо" KEY_RIGHT_ARROW

подключил так:
pin 16 кнопка энкодера SW
pin 2 нога энкодера CLK
pin 3 нога энкодера DT
GDN средняя нога энкодера и с кнопки GDN

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

скетч
#include
#include
#include
#include
#define BTN_pin 16 // pin 16 кнопка энкодера SW
const int pin_A = 2; // pin 2 нога энкодера CLK
const int pin_B = 3; // pin 3 нога энкодера DT
unsigned char encoder_A; //переменная
unsigned char encoder_B; //переменная
unsigned char encoder_A_prev=0; //переменная


uint32_t vibor = 0; //Здесь будем хранть время
int perek = 0; //переменная переключатель

void setup() {
digitalWrite(BTN_pin, 1); //подтяжка кнопки энкодера
pinMode(pin_A, INPUT); //пины энкодера объявляем входами
pinMode(pin_B, INPUT); //пины энкодера объявляем входами
Serial.begin(9600);
Keyboard.begin(); //подключим как клава
}
void loop()
{
//////////////ЭНКОДЕР///////////
{ encoder_A = digitalRead(pin_A); // считываем состояние выхода А энкодера
encoder_B = digitalRead(pin_B); // считываем состояние выхода B энкодера
if((!encoder_A) && (encoder_A_prev)){ // если состояние изменилось с положительного к нулю
if(encoder_B)
{
Keyboard.press(KEY_RIGHT_ARROW);
delay(200);
Keyboard.releaseAll();
}
else {
Keyboard.press(KEY_LEFT_ARROW);
delay(200);
Keyboard.releaseAll();
}
}
encoder_A_prev = encoder_A; // сохраняем значение А для следующего цикла
}

if(digitalRead(BTN_pin)==LOW) //Если кнопка нажата то делаем то что ниже.
{
Keyboard.press(KEY_RETURN); //При нажатии на кнопку команда Enter
delay(200); //Делаем небольшую задержку чтоб не засыпало командами.
Keyboard.releaseAll();
}
}

Alex15BV 12.01.2019 15:34

После комментария "//////////////ЭНКОДЕР///////////" открывающая скобка не лишняя, случайно? (перед encoder_A = digitalRead(pin_A);)

... И инклюды лишние: если используются только функции клавиатуры - то зачем подключать ещё и Tablet, и Encoder?

Alex15BV 12.01.2019 16:01

Цитата:

Сообщение от fishdimka (Сообщение 407857)
задача:
-при повороте энкодера по часовой стрелке срабатывала кнопка "стрелка вправо" KEY_RIGHT_ARROW
-при повороте против часовой "стрелка влево" KEY_LEFT_ARROW
-при нажатии энкодера Enter "KEY_RETURN"

Я в Ардуино чайник, но сделал себе - и работает, как часики: и переключение режимов работы, и длительбность нажатия) :blush:
Сделал на прерываниях (здесь кусок, касающийся только энкодера):
PHP код:

#include <Mouse.h>
#include <Keyboard.h>
#include <Tablet.h>

#define KeyEncPin 2     // кнопка энкодера
#define EncAcPin 3      // энкодер - канал А
#define EncBcPin 5      // энкодер - канал В

volatile boolean RightMove false;   // направления вращения энкодера
volatile boolean LeftMove false;    
volatile boolean EncPress false;    // нажатия кнопки энкодера

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

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

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

void setup() {
  
pinMode(KeyEncPinINPUT_PULLUP);                                           // кнопка энкодера - при нажатии PLAY/PAUSE либо ENTER/ESCAPE
  
attachInterrupt(digitalPinToInterrupt(KeyEncPin), KeyEncPressFALLING);
  
pinMode(EncAcPinINPUT_PULLUP);                                            // канал-А энкодера - для отслеживания вращения
  
attachInterrupt(digitalPinToInterrupt(EncAcPin), EncoderMoveFALLING);
  
pinMode(EncBcPinINPUT_PULLUP);                                            // канал-В энкодера - для определения направления вращения
  
pinMode(LedPinOUTPUT);

  
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 (
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;
    }
  }
...



fishdimka 12.01.2019 20:49

скетч не компилируется, ругается на эту строку
attachInterrupt(digitalPinToInterrupt(KeyEncPin), KeyEncPress, FALLING);

Alex15BV 12.01.2019 20:58

Arduino ProMicro - забыл указать... Не знаю, на чем ты делаешь

fishdimka 12.01.2019 21:00

на Arduino ProMicro делаю

Alex15BV 12.01.2019 21:07

Нет проблем никаких :blush:

fishdimka 12.01.2019 21:19

можешь прислать весь скетч целяком
https://cloud.mail.ru/public/Hdfc/U5ENixwV5


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

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