USB медиаконтроллер для windows и Android устройств


На разработку этой поделки меня подвигла статья USB регулятор громкости для ПК и не только.
Но просто «volume + mute» меня не устраивала, хотелось бы иметь функциональные кнопки для управления плеером. Так как ранее с AVR дела не имел от слова совсем — решил заказать одну штучку Digispark85 (с microUSB портом). Пока ехала посылка — курил мануалы, рылся в уголке некроманта и прикидывал дизайн корпуса.
В обзоре не будет распаковки, ТТХ, описания Attiny85 — сразу к делу.



Вводная часть

Контроллер использует постоянное соединение с хост устройством по USB, задействуя два порта (P3/ADC3, Р4/ADC2). Еще два порта задействуются для энкодера (о них ниже), один используется при (пере-)программировании контроллера (Р5/ADC0/Reset). Таким образом, для блока функциональных кнопок остается один порт. Проще всего его подключить по классической схеме с резистивным делителем напряжения, а для распознавания нажатий использовать встроенный в контроллер АЦП. Исходя из ограничений (см выше) остается единственный вариант такого подключения – в порт Р2/ADC1.
Энкодер будем подключать на порты Р0 и Р1 (вместо Р0 и Р2 как в базовом варианте), а встроенную в энкодер кнопку «mute» вынесем на блок кнопок (сорри за тавтологию).

Принципиальная схема контроллера

Обратите внимание: из схемы исключен светодиод подключенный к порту PB1.


Немного математики

Количество дополнительных кнопок зависит от вашей фантазии, но ограничено объемом программного кода, точностью АЦП и выбранной разрядностью. Для моих нужд достаточно 5 кнопок и 8-битного режима АЦП. В качестве опорного напряжения лучше всего использовать Vcc (при питании от USB это примерно +5в +-допуски), при этом результаты отсчетов АЦП не будут зависеть от колебаний этого напряжения. Для четкого распознавания нажатий я подобрал номиналы резисторов таким образом, чтобы разница между отсчетами АЦП для соседних кнопок была не менее 40.
Для упрощения расчетов сделал таблицу (прилагаю) по которой можно подобрать оптимальные параметры делителя и рассчитать пороги для определения нажатой кнопки. Три правые колонки с серым заголовком содержат реальные измерения и расчеты для АЦП после сборки блока, в программном коде используются именно они.



Скорость преобразования АЦП зависит текущей тактовой частоты микроконтроллера и выбранного делителя, т.н. prescaler'а. Устройство работает на 16.5МГц, поэтому для функционирования АЦП необходимо будет установить максимальное значение prescaler =128. Это обеспечит тактирование с частотой примерно 128КГц, время на одно преобразование составит 1/10000 сек.

Программная часть

Представляет модифицированный код из TrinketVolumeKnobPlus, из которого убрано лишнее и добавлено нужное.
При нажатии и удержании любой кнопки подается только одна команда (блокировка от keystroke repeat), но при желании можно модифицировать код таким образом, чтобы при нажатии << / >> контроллер повторял соответствующие команды.
После компиляции прошивка занимает примерно 60% от отведенных 8КБ flash памяти (часть занимает специальный загрузчик).

Листинг под спойлером

#include "TrinketHidCombo.h"

#define PIN_ENCODER_A 0
#define PIN_ENCODER_B 1 //changeв from P2 port
#define TRINKET_PINx PINB

static uint8_t enc_prev_pos = 0;
static uint8_t enc_flags = 0;
static char sw_was_pressed = 0; //keystroke flag
static uint8_t adc_val = 255; //ADC value


void setup()
{
  pinMode(PIN_ENCODER_A, INPUT);
  pinMode(PIN_ENCODER_B, INPUT);
  digitalWrite(PIN_ENCODER_A, HIGH);
  digitalWrite(PIN_ENCODER_B, HIGH);

  // init ADC1 at 8bit 16MHz 128 prescaler
  ADMUX =
      (1 << ADLAR) |     // left shift result
      (0 << REFS1) |     // Sets ref. voltage to VCC, bit 1
      (0 << REFS0) |     // Sets ref. voltage to VCC, bit 0
      (0 << MUX3)  |     // use ADC1 for input (PB2), MUX bit 3
      (0 << MUX2)  |     // use ADC1 for input (PB2), MUX bit 2
      (0 << MUX1)  |     // use ADC1 for input (PB2), MUX bit 1
      (1 << MUX0);       // use ADC1 for input (PB2), MUX bit 0
  ADCSRA = 
      (1 << ADEN)  |     // Enable ADC 
      (1 << ADPS2) |     // set prescaler to 128, bit 2
      (1 << ADPS1) |     // set prescaler to 128, bit 1
      (1 << ADPS0);     // set prescaler to 128, bit 0

      
  TrinketHidCombo.begin();
  if (digitalRead(PIN_ENCODER_A) == LOW) {
    enc_prev_pos |= (1 << 0);
  }
  if (digitalRead(PIN_ENCODER_B) == LOW) {
    enc_prev_pos |= (1 << 1);
  }
}

void loop()
{
  int8_t enc_action = 0;
  uint8_t enc_cur_pos = 0;
  if (bit_is_clear(TRINKET_PINx, PIN_ENCODER_A)) {
    enc_cur_pos |= (1 << 0);
  }
  if (bit_is_clear(TRINKET_PINx, PIN_ENCODER_B)) {
    enc_cur_pos |= (1 << 1);
  }

  if (enc_cur_pos != enc_prev_pos) {
    if (enc_prev_pos == 0x00) {
      if (enc_cur_pos == 0x01) {
        enc_flags |= (1 << 0);
      }
      else if (enc_cur_pos == 0x02) {
        enc_flags |= (1 << 1);
      }
    }

    if (enc_cur_pos == 0x03) {
      enc_flags |= (1 << 4);
    }
    else if (enc_cur_pos == 0x00) {
      if (enc_prev_pos == 0x02) {
        enc_flags |= (1 << 2);
      }
      else if (enc_prev_pos == 0x01) {
        enc_flags |= (1 << 3);
      }

      if (bit_is_set(enc_flags, 0) && (bit_is_set(enc_flags, 2) || bit_is_set(enc_flags, 4))) {
        enc_action = 1;
      }
      else if (bit_is_set(enc_flags, 2) && (bit_is_set(enc_flags, 0) || bit_is_set(enc_flags, 4))) {
        enc_action = 1;
      }
      else if (bit_is_set(enc_flags, 1) && (bit_is_set(enc_flags, 3) || bit_is_set(enc_flags, 4))) {
        enc_action = -1;
      }
      else if (bit_is_set(enc_flags, 3) && (bit_is_set(enc_flags, 1) || bit_is_set(enc_flags, 4))) {
        enc_action = -1;
      }

      enc_flags = 0; // reset for next time
    }
  }

  enc_prev_pos = enc_cur_pos;

  if (enc_action > 0) {
    TrinketHidCombo.pressMultimediaKey(MMKEY_VOL_UP);
  }
  else if (enc_action < 0) {
    TrinketHidCombo.pressMultimediaKey(MMKEY_VOL_DOWN);
  }

// Buttons decoder block
ADCSRA |= (1 << ADSC);         // start ADC measurement
while (ADCSRA & (1 << ADSC)); // waiting for completion
adc_val = ADCH; // read ADC register
if (adc_val < 210) { //some button pressed
  if (sw_was_pressed == 0) { // check for hold down button
    if (adc_val < 150) {
      if (adc_val < 95) {
        if (adc_val < 55) {
          if (adc_val < 35) { //sw1 is pressed
            TrinketHidCombo.pressMultimediaKey(MMKEY_MUTE);
            }
          else
          { //sw2 is pressed
          TrinketHidCombo.pressMultimediaKey(MMKEY_SCAN_PREV_TRACK);
          }
        }
        else
        { //sw3 is pressed
        TrinketHidCombo.pressMultimediaKey(MMKEY_STOP);
        }
      }
      else
      { //sw4 is pressed
      TrinketHidCombo.pressMultimediaKey(MMKEY_PLAYPAUSE);
      }
    }
    else
    { //sw5 is pressed
    TrinketHidCombo.pressMultimediaKey(MMKEY_SCAN_NEXT_TRACK);
    }
  delay(5);
  sw_was_pressed = 1; // set keystroke flag
  }
 }
 else
 {
 sw_was_pressed = 0; // clear keystroke flag
 }
TrinketHidCombo.poll();
}



Печатная плата и корпус

Печатная плата — это сам Digispark. Подключение к внешним устройствам — через штатный microUSB порт.
Для блока кнопок я использовал платку управления от старого сгоревшего монитора LG, поменяв в соответствии с таблицей SMD резисторы. Саму платку и поддерживающую рамку с толкателями немного укоротил, подклеил для жесткости бортики убрал гнездо для шлейфа. Соединение с Digispark85 — пайкой.



А вот корпус пока существует в предварительном чертеже и дубовом полене :)


Планирую купить +21 Добавить в избранное +19 +49
+
avatar
  • SBVF
  • 06 декабря 2018, 16:06
+13
Восхищаюсь умением делать такие вещи, но, мне кажется, что наличие клавиатуры с функциональными клавишами решает поставленные задачи и ещё освобождает юсб-порт. :)
+
avatar
  • Harwest
  • 06 декабря 2018, 16:51
+1
наличие клавиатуры с функциональными клавишами решает поставленные задачи
А представьте — у меня есть Logitech media player на базе Orange pi zero, у которого нет клавиатуры :)
И есть инет-радио из старенького телефона, на котором тоже можно задействовать этот девайс.
+
avatar
  • SBVF
  • 06 декабря 2018, 17:21
+2
Это устройство не для ПК? В тексте не нашёл куда оно предназначалось.
Решил, что должно установиться в отсек для 2.5 диска.
+
avatar
  • Harwest
  • 06 декабря 2018, 17:28
+2
Это устройство не для ПК? В тексте не нашёл куда оно предназначалось.
Решил, что должно установиться в отсек для 2.5 диска.
Устройство в том числе для ПК, у меня оно будет в собственном деревянном корпусе и подключаться шнуром USB-microUSB. Можно припаять шнурок к самой плате, сделав его несъемным. Можно вмонтировать кнопки в переднюю панель корпуса, все зависит от желания и умения работать руками.
Акцент в обзоре — на программную реализацию.
+
avatar
  • aef3iuga
  • 07 декабря 2018, 06:12
+1
ПК — персональный компьютер. Если кто-то скажет, что Orange Pi Zero — общественный компьютер или персональный чайник, например, то пусть кидает в меня камень
+
avatar
  • rexen
  • 07 декабря 2018, 22:03
+3
Да ладно, в реальной жизни под ПК подавляющее большинство подразумевает десктоп. Очевидно же.
+
avatar
  • aef3iuga
  • 08 декабря 2018, 01:32
0
Эти многие еще и системник называют процессором, а монитор компьютером
+
avatar
  • aef3iuga
  • 07 декабря 2018, 06:18
0
> media player на базе Orange pi zero

Звук как? C 13 Pins или внешняя звуковуха? У меня просто на базе OPiZero плеер с внешней USBшной звуковухой, софт MPD и ympd для управления.
+
avatar
  • Harwest
  • 07 декабря 2018, 13:32
+1
Звук с гребенки встроенный, на уровне так се, фоном слушать можно.
+
avatar
  • aef3iuga
  • 07 декабря 2018, 16:36
0
Понятно. Если так себе по качеству, то рекомендую следом за мной взять звуковуху на c-media за бакс, там звук на уровне встроенных звуковух материнок.
+
avatar
  • muraveiX
  • 07 декабря 2018, 13:27
0
И есть инет-радио из старенького телефона, на котором тоже можно задействовать этот девайс.
И смартфон на Андройде его увидит?
+
avatar
  • Harwest
  • 07 декабря 2018, 13:30
0
Если есть поддержка OTG — то увидит как внешнее устройство ввода.
+
avatar
  • Lvenok
  • 06 декабря 2018, 16:07
0
Еще бы о возможностях библиотеки, чтобы понимать, что там еще можно…
+
avatar
  • sir0ta
  • 06 декабря 2018, 16:21
0
Примитив? Нажать любую кнопку и любое сочетание кнопок на виртуальной клавиатуре. Это от простого.
+
avatar
  • Z2K
  • 07 декабря 2018, 02:44
0
Посоветуйте программку что б в андроиде навесить на F1 — Ctrl+C, а на F2 — Ctrl+V.
+
avatar
  • Harwest
  • 07 декабря 2018, 05:48
+2
Как я понял клавиатура внешняя?
Если аппарат рутован проще всего подправить файл /system/usr/keylayout/Generic.kl, его структура проста: код кнопки — функция.


key 1     ESCAPE
key 2     1
key 3     2
key 4     3
key 5     4
key 6     5
key 7     6
key 8     7
key 9     8
key 10    9
key 11    0
key 12    MINUS
key 13    EQUALS
key 14    DEL

.
.
.

key 16    Q
key 17    W
key 54    SHIFT_RIGHT
key 55    NUMPAD_MULTIPLY
key 56    ALT_LEFT
key 57    SPACE
key 58    CAPS_LOCK
key 59    F1
key 60    F2
key 61    F3


Либо считать с клавиатуры PID/VID и создать свой файл именно под эту клаву, назвать его Vendor_ХХХХ_Product_YYYY.kl и положить в указанную папку. Тогда при подключении именно этой клавиатуры кнопки будут работать как настроено.
+
avatar
  • Z2K
  • 07 декабря 2018, 06:50
0
Внешняя. Вав!!! Буду пробывать. СПАСИБО. :)
+
avatar
  • kalobyte
  • 06 декабря 2018, 17:57
+1
там хид мыш и клавиатура
в стандарте хид дескрипторов есть даже такие для управления медиаустройствами
я сейчас посмотрел малость эту библиотеку, но дескрипторы не смотрел, может там обычные функции мультимедиа кнопок, просто валкодер автор тут привязал к нажатию кнопок громкости
у меня была клавиатура и там был валкодер для громкости

гораздо интересней сделать кастомный хид для своего устройства и написать софт, но драйвер будет использоваться системный
я сейчас этим занимаюсь
+
avatar
  • Harwest
  • 06 декабря 2018, 18:47
+1
может там обычные функции мультимедиа кнопок, просто валкодер автор тут привязал к нажатию кнопок громкости
Я не автор, это проект TrinketVolumeKnob.
+
avatar
  • CuMr
  • 06 декабря 2018, 22:38
0
Калыч, это видел?
Вообще, лучше забей на кубохал хоть на первом этапе, в докубовых либах как то проще разобраться.
+
avatar
  • kalobyte
  • 07 декабря 2018, 10:08
0
вроде видел, потом гляну еще раз
если куб сделали, значит не просто так же
мне он нравится, особенно карта тактирования, да и включение периферии

а ковырять эти огромные простыни нет никакого желания
программирование должно быть легким, а оно с каждым днем все сложнее и сложнее
+
avatar
  • exeland
  • 06 декабря 2018, 16:08
+32
Как-то внезапно статья закончилась.)
+
avatar
  • vitgo
  • 06 декабря 2018, 16:15
+5
Согласен, ожидал увидеть готовое устройство :(
+
avatar
  • Youmuren
  • 06 декабря 2018, 16:16
+1
del
+
avatar
  • Harwest
  • 06 декабря 2018, 16:39
+1
ожидал увидеть готовое устройство :(
Выпилю на каникулах и дополню ;)
Статья про софтовое развитие проекта.
+
avatar
  • kvolk
  • 06 декабря 2018, 16:56
+21
+
avatar
  • Roms
  • 22 октября 2020, 22:30
0
Какие длинные у Вас каникулы.
+
avatar
  • sir0ta
  • 06 декабря 2018, 16:23
+6
Я сразу подумал что черновик. Но нет… оказывается автор смог скопипастить целую строку и выбрать из примера мультимедийные кнопки. И для этого целая статья.
Кста по идее на кнопку энкодера можно повесить еще 3 действия. 1 — долгий тап (плей-пауза), 2 — крутить влево с нажатым энкодером (мотать назад, если крутнули один раз и отпустили, то трек назад), 3 — крутить вправо с нажатым энкодером (мотать вперед, если крутнули один раз и отпустили, то трек вперед).
И не надо кнопок городить )
Напишу ка я статью ))) (шЮтка)
+
avatar
  • Harwest
  • 06 декабря 2018, 16:41
0
на кнопку энкодера можно повесить еще 3 действия. 1 — долгий тап (плей-пауза), 2 — крутить влево с нажатым энкодером (мотать назад, если крутнули один раз и отпустили, то трек назад), 3 — крутить вправо с нажатым энкодером (мотать вперед, если крутнули один раз и отпустили, то трек вперед).
Про эти фичи я писал в комментах начальной темы.
Реализуй и напиши :)
+
avatar
  • sir0ta
  • 06 декабря 2018, 17:51
0
Да чего уже 2 простые строчки кода и писать ) Я сразу эту штуку придумал. но проблема в том что я не пользуюсь медиа плеерами. от силы ютубчик.
+
avatar
  • Harwest
  • 06 декабря 2018, 18:02
-2
Будь честен — писать прилично там, не один десяток строк на все эти фичи.
+
avatar
  • sir0ta
  • 06 декабря 2018, 18:20
+3
2,3) В крутилку текущую добавляем условие if digitalread(button)==true {маслаем посыл кнопки перемотки} else {громкость}.
1) у кнопки состояния — нажали, отпустили. Считаем время между нажали и отпустили и если оно больше заданного, то плейпауза, иначе муть.
Сразу видно что как программист вы нуб.
+
avatar
  • Harwest
  • 06 декабря 2018, 18:32
0
как программист вы нуб.
Давай-ка без оскорблений.
Еще раз повторю — это мой первый проект.

А про код — на словах ты Лев Толстой, а конкретный пример?
+
avatar
  • sir0ta
  • 06 декабря 2018, 18:50
+6
Давай-ка без оскорблений.
А я и не оскорблял.
А про код — на словах ты Лев Толстой, а конкретный пример?
if (enc_action > 0) {
    if (bit_is_set(TRINKET_PINx, PIN_ENCODER_SWITCH))
{
TrinketHidCombo.pressMultimediaKey(КАК ТАК НАЗЫВАЕТСЯ ОПРЕДЕЛЕНИЕ ДЛЯ ПЕРЕМОТКИ НАЗАД);
}
else
{
TrinketHidCombo.pressMultimediaKey(MMKEY_VOL_DOWN);
}
  }
  else if (enc_action < 0) {
тут повторяем тоже самое    
TrinketHidCombo.pressMultimediaKey(MMKEY_VOL_UP);
  }

К длительному нажатию надо просто завести 2 переменных (long integer) и первой присваивать при нажатии текущий тик, второй при отпускании. И надо переписать немного код (просто передвинуть выполнение мути из «кнопка сейчас нажата» в «кнопка сейчас отпущена»).
Инет очень плох и через RDP с шифрованием через VPN… короче строгать код одно мучение. курсор не успевает за ходом мысли. А дома по определению сейчас ни чего не держу.
+
avatar
  • Harwest
  • 06 декабря 2018, 19:32
0
Чисто теоретически — понятно, но уже не пара строк.

Антидребезг будем добавлять, или так сойдёт?
Да, чуть не забыл — в стандартной HID клавиатуре нет перемотки там только переключение треков в плейлисте вперёд и назад. И как поведет себя энкодер в режиме переключения треков когда ламели будут на границах секторов — хз.
+
avatar
  • sir0ta
  • 06 декабря 2018, 20:05
+2
1. У вас уже есть весь код. ЕГо надо просто скопипастить. ПРи чем не откуда-то, а прям из этого исходника.
2. Грубо говоря именно что пара строк, что пара десятков. В программировании не сложно написать эти строки. Главное понять что написать и как. Это называется алгоритм. И он самое сложное. А строки… 2 или 10… это уже особенности языка.
Хочешь пример? А чего спрашиваю )))
if(A>B)
{A=1;}
else
{A=2;}
Огромный текст? Смотри как можно:
(A>B?A=1:A=2)
И уже одна строка )
3. Но мы же можем передавать не одну кнопку, а комбинацию. Це хоткеи )
И как нет?
pccar.ru/showthread.php?t=27389
Там у чувака
Мультимедийные кнопки — PLAYPAUSE, STOP, NEXT, PREVIOUS, FASTFORWARD, REWIND (мультимедиа HID)
Так что все есть. Просто тут не до конца реализовано. Выдрать коды и вставить их.
circuitpython.readthedocs.io/projects/hid/en/latest/api.html
circuitpython.readthedocs.io/projects/hid/en/latest/api.html#adafruit_hid.consumer_control_code.ConsumerControlCode.FAST_FORWARD
Так что ни каких проблем. Читайте маны. Я же говорю, в программировании ты слишком слаб. К примеру вот была задача… 6 дней сидел корпел, ни как не мог осилить, а потом в пятницу подбухнул и за 3 полторашки пива и 2 часа наваял почти 1000 строк. Клиентсерверное приложение, мне надо было описать поведение клиентской части.
4. А что ему будет? Лично у себя проверял, все нормально. Громкость регулируется все так же нормально без сбоев.
+
avatar
  • Harwest
  • 06 декабря 2018, 20:46
-3
1. Буду пробовать.
2. Комбинаторика.
3. Ресурсы посмотрю.
Если честно мне плевать что ты думаешь о моем уровне программирования. Главное что у меня есть желание изучать и пробовать, и учиться (даже в моем возрасте).
И печально что люди завышенным ЧСВ на непрофессиональном форуме начинают гнобить новичков.
Разбираешься — укажи на ошибки, знаешь как сделать лучше — напиши.
+
avatar
  • sir0ta
  • 06 декабря 2018, 21:16
+6
Если честно мне плевать что ты думаешь о моем уровне программирования.
Ты не принимай это как хнытик. Я без злого умысла. Называю своими именами. Я тоже думаешь гуру? Да я тот еще валенок. Меня тут так недавно высмеял парень… он мою эпическую функцию вывалил в одну строку… потому что оказывается в математике по этому поводу давно сформирована теория и она доказана и выведена формула… а я велосипед изобретал. Относись к критике не в штыки. Нельзя все знать и везде, и лучше всех.
Главное что у меня есть желание изучать и пробовать, и учиться (даже в моем возрасте).
Это только плюс.
И печально что люди завышенным ЧСВ на непрофессиональном форуме начинают гнобить новичков.
Все просто. Ты сам еще не в зуб ногой, а уже учишь остальных. Хотя сам и половина кода не понимаешь. И о каком завышенном ЧСВ? Я больше чем уверен что ты в чем-то другом реально сильнее волокешь чем я. Я это прекрасно понимаю.
И я не гнобил тебя еще раз. Я искренне рад что тебе понравилась ардуинотыканье. Пусть оно заводит сильно не в ту сторону юные умы юных программистов, но это уже ого-го.
Разбираешься — укажи на ошибки, знаешь как сделать лучше — напиши.
Именно в этом и есть практика (хотя многие программеры сейчас полезут с вилами, но все же рискну), когда ты вместо того чтобы что-то выдумывать самому — берешь готовый код. Это мир ООП (объектно ориентированное программирование). Там сам язык построен на этом.
Конкретно в твоем случае я и не смотрел код, ибо… там и не должно быть ошибок, это же пример из библиотеки )
Если будут вопросы, пиши, поможем чем сможем )
+
avatar
  • dkuznets
  • 07 декабря 2018, 18:26
0
Велосипед — это ж круто. Особенно, если рама — карбон, амортизаторы… А еще велокомпьютер…
А я вот тут вообще самокат изобрел… Гордился… Пока меня математики не опустили… По самое не могу… О как…
+
avatar
  • sir0ta
  • 07 декабря 2018, 19:00
0
Хз ты о чем. Но то что изобрел уже говорит о том что серое вещество не просто болтается в черепной коробке.
+
avatar
+3
для этих целей у меня есть велосипед — Маленькая и быстрая библиотека для энкодера

правда она на прерываниях и не понятно как AVR USB драйвер к этому отнесется
+
avatar
  • Harwest
  • 06 декабря 2018, 20:33
0
Спасибо, буду изучать.
+
avatar
  • sir0ta
  • 07 декабря 2018, 19:02
0
Прерывания и круто и дико мешает. Более или менее видел как отдельный блок управления с шиной данных к основному цп. И кнопки ловятся шикарно и основной алгоритм не останавливается. Но цена и сложность проекта растут.
+
avatar
  • sir0ta
  • 06 декабря 2018, 17:53
0
Кста есть еще проект в котором реализовано отображение уровня громкости. Но там как я помню не тинька уже, а мега. И смысл в том что девайс один раз при включении выставляет урповнь в ноль и потом менять громкость только им. НО мне такое за не надобностью.
+
avatar
  • Harwest
  • 06 декабря 2018, 18:00
0
смысл в том что девайс один раз при включении выставляет урповнь в ноль и потом менять громкость только им.
Странное решение.
+
avatar
  • sir0ta
  • 06 декабря 2018, 18:13
0
А как иначе знать какой уровень громкости? Надо тогджа писать свой драйвер и клиентсерверное приложение
+
avatar
  • Harwest
  • 06 декабря 2018, 18:24
0
Я вижу актуальный уровень на дисплее LMS сервера и на сотике в Squeezer. И менять громкость мне надо из разных мест: контроллером, ик-пультом, с телефона.
Каждый раз при старте уволить в ноль вообще не вариант.

На ноутах у меня штатная софтина реализует OSD.
+
avatar
  • sir0ta
  • 06 декабря 2018, 18:53
0
У него свой драйвер значит. Либо это клиент серверное приложение. В HID уровень громкости системой не отдается. По сему узнать какой уровень громкости ни как нельзя.
На ноутах у меня штатная софтина реализует OSD.
Софтина ключевое слово.
Тут же не надо писать драйвер. Объясняю. в win 8 уже нельзя не включив режим тестирования запустить драйвер не подписанный. Подписать драйвер у майкрософта стоит просто страшных денег. От сюда и подобный костыль. Клиент серверное приложение тоже не есть хорошо. От этого уходят.
+
avatar
  • Harwest
  • 06 декабря 2018, 20:16
0
Либо это клиент серверное приложение
LMS клиент — серверная, а как иначе? И уходить никуда от нее не надо. Есть три компонента: сервер, плеер (-ы) и контроллер (-ы). Можно комбинировать их как угодно.

В HID уровень громкости системой не отдается.
Зачем это?
HID устройство командами изменения громкости меняет ее уровень (в 7ке и убунте в системном микшере бегает ползунок).
LMS (крутится на armbian) как-то сам видит изменения громкости и перемещает слайдер (он выводится справа на панели управления плеером).
+
avatar
  • sir0ta
  • 06 декабря 2018, 20:46
+1
Зачем это?
Ты уже потерял мысль о чем был разговор. Напомню:
Кста есть еще проект в котором реализовано отображение уровня громкости.
А как иначе знать какой уровень громкости?
Там тоже устройство HID, но кроме изменения, оно еще и наглядно показывает уровень громкости.
как-то сам видит изменения громкости
Вот видишь. Ты не знаешь как, а все туда же. Видит он клиентской (или серверной, хз как там верно будет) частью которая ставится на твою бубнту или семерку.
Еще раз — HID устройство, а дигиспарк в данном примере им и становится обратно уровень громкости не получает!
+
avatar
  • Harwest
  • 06 декабря 2018, 20:57
0
Да нафига мне вообще этот проект с отображением уровня?
Ну есть он у кого-то, отлично. А мне не надо.

Контроллеры (аппаратный HID, программный из аппы и тд) меняют уровень master volume в системном микшере сервера, все изменения отображаются на дисплее реальном времени. Точно так же отображается текущая позиция в треке. И мне (и 99.999% людей) пофиг какая технология при этом используется.
+
avatar
  • sir0ta
  • 06 декабря 2018, 21:32
+2
Да нафига мне вообще этот проект с отображением уровня?
Я просто привел пример, так сказать для расширения кругозора.
пофиг
Я и заметил. Либо хнык, либо пофиг…
+
avatar
  • Harwest
  • 07 декабря 2018, 04:23
0
Либо нафиг не надо.
+
avatar
+2
Какая то легкая недосказанность присутствует :)
+
avatar
  • r0c
  • 06 декабря 2018, 16:22
0
Библиотека эмулирует нажатие отдельных кнопок и их комбинаций стандартной клавиатуры. Все есть в описании. Библиотека Ардуиновская
+
avatar
  • smirnoff
  • 06 декабря 2018, 16:23
+4
Ничего не понял, но было интересно)))
+
avatar
+5
+
avatar
  • amronsan
  • 06 декабря 2018, 16:25
+3
Есть надежда, что черновик случайно опубликовали, а то действительно как-то резко закончилось.
+
avatar
  • sir0ta
  • 06 декабря 2018, 16:26
0
Да нет.
А вот корпус пока существует в предварительном чертеже и дубовом полене :)
+
avatar
0
По-моему диод D3 неправильно подключен
+
avatar
  • sir0ta
  • 06 декабря 2018, 16:26
0
Вроде так и есть.
+
avatar
  • Last_One
  • 06 декабря 2018, 16:26
+2
А как же дребезг? Его обработки не нужно?
+
avatar
0
Вот-вот. Без обработки дребезга — хлам а не скетч. Такоооого понажимает.
Тут с обработкой бывают фантомы (до бесконечности ждать «успокоения» кнопки нельзя, поэтому при неудачном варианте ни один обработчик не спасёт), а без — это очень, очень плохая идея
+
avatar
  • Harwest
  • 06 декабря 2018, 17:06
0
Во первых — см мой ответ Last_one.
Во вторых — читаем даташит: ADC считывает напряжение на входе в течение первых двух тактов ADC_clock после команды на чтение, в данном случае это 0,00000775 сек. После чего все происходящее на входе игнорируется и ещё 11 тактов идёт собственно конвертация а далее — декодирование. Это временные задержки образуют ещё один 'антидребезговый фильтр'.
+
avatar
+2
ну расскажете через годик-два как оно, когда окислятся мембранны кнопок и будете ловить «средние состояния» и дребезги по 100 миллисекунд.
+
avatar
  • Harwest
  • 06 декабря 2018, 17:23
0
Про возраст кнопок уже ответил.
+
avatar
  • kalobyte
  • 06 декабря 2018, 18:02
+3
ты путаешся
тут кнопки аналоговые и у них такая штука как дребезг отсутствует
а вот уход сопротивления это как раз есть, поэтому там резисторы сотни ом надо ставить, да и неплохо бы в коде диапазон значений ацп под каждую кнопку сделать
тогда уход можно избежать
+
avatar
  • Harwest
  • 06 декабря 2018, 18:39
0
неплохо бы в коде диапазон значений ацп под каждую кнопку сделать
И такой вариант есть — расчитана 'эксповилка' для каждой кнопки. При этом нет такой вложенности if-else, но из-за двойного сравнения объем кода больше.
И при увеличении количества кнопок точность упадёт и объем кода ещё увеличится.
+
avatar
  • AndyBig
  • 06 декабря 2018, 19:46
+1
тут кнопки аналоговые и у них такая штука как дребезг отсутствует
А что, бывают еще и цифровые кнопки?
Дребезг может быть на любых сухих контактах, неважно в каком они виде выполнены.
+
avatar
0
А, как же?
Например кнопка срабатывающая на звук, или вот — на свет, или на радиосигнал…

И, вот же ещё они —

+
avatar
  • kvolk
  • 06 декабря 2018, 19:52
+1
Например кнопка срабатывающая на звук, или вот — на свет, или на радиосигнал…
Наверное это уже будет не кнопка…
+
avatar
  • AndyBig
  • 06 декабря 2018, 19:52
0
Кнопка не срабатывает на звук, свет или радиосигнал, она срабатывает только на нажатие :)
ЗЫ: кроме того, устройства, срабатывающие на все вышеперечисленное — как раз аналоговые :)
+
avatar
0
Не, не, не…
Смотрите фото выше.
Они — ЦИФРОВЫЕ!
+
avatar
  • kvolk
  • 06 декабря 2018, 19:56
+1
Они — ЦИФРОВЫЕ!
Ну да, с цифрами. Не поспоришь! :)
+
avatar
  • AndyBig
  • 06 декабря 2018, 20:13
0
Они — ЦИФРОВЫЕ!
А вот и нифига, они БРАЙЛЕВЫЕ :)))
+
avatar
+2
А вот и нифига — они железные :-)
И вообще — фиг его знает, что там за рамкой: микрик, КД, геркон, оптопара — или вообще изврат из штока с зубчатой передачей на «оптопарный энкодер» :-)
+
avatar
  • Z2K
  • 07 декабря 2018, 02:10
+1
Или вообще ничего. Просто отверстие куда утапливается изделие.
+
avatar
  • kalobyte
  • 07 декабря 2018, 09:59
0
А что, бывают еще и цифровые кнопки?
ну да, конторые к цифровым портам подключены
Дребезг может быть на любых сухих контактах, неважно в каком они виде выполнены.
скорость ацп может быть меньше времени фиксации + конденсатор по питанию
поэтому на аналоговых кнопках дребезг не надо обрабатывать

я по крайней мере не видел ничего такого по этой теме
+
avatar
  • kalobyte
  • 06 декабря 2018, 17:59
0
дребезг поди про валкодер был?
+
avatar
  • sir0ta
  • 06 декабря 2018, 17:54
0
Что за бред? Правильно разводите схему чтобы не было наводок и пользуйтесь аппаратным антидребезгом. Хотя и второе не так уж и обязательно на более или менее норм кнопках.
+
avatar
  • Harwest
  • 06 декабря 2018, 18:12
0
+
avatar
  • AndyBig
  • 06 декабря 2018, 19:47
0
пользуйтесь аппаратным антидребезгом
У AVR разве есть аппаратные фильтры на входах?
+
avatar
  • Harwest
  • 06 декабря 2018, 20:04
0
Нет их.
+
avatar
  • sir0ta
  • 06 декабря 2018, 21:22
+1
У AVR разве есть аппаратные фильтры на входах?
А что мешает их добавить?
+
avatar
  • AndyBig
  • 07 декабря 2018, 01:02
0
Можно даже без резистора :)
+
avatar
  • Harwest
  • 07 декабря 2018, 04:39
0
В случае с АЦП входом неприменимо, мешает временная характеристика полученной RC цепочки.
Если АЦП защелкнет вход в начале переходного процесса, особенно при нажатии 'дальней' кнопки, там где суммарное сопротивление уже велико, то измеренное напряжение будет больше установившегося.
+
avatar
  • sir0ta
  • 07 декабря 2018, 19:06
0
Для ацп достаточно ввести какой-то порог начальной этой емкости (без рц фильтра) цепи при дребезге. И все. Т. Е. К примеру значения с ацп ниже 100 не считать ни как. Второе — ацп это долгая операция. В отличии от цифровых каналов там дребезга можно сказать нет.
+
avatar
  • Harwest
  • 07 декабря 2018, 19:29
0
Слушай, на земле миллиарды людей смотрят в экраны TV и мониторов, тыкая в кнопки power, яркости и ещё бг знает каких.
И все они подключены по 1-2х проводной схеме с АЦП. И mcu обрабатывает все это без всяких там фильтров усреднения и тп. Потому что все и так работает.
Даже если кому-то вздумается нажать одновременно 1-2-5 кнопок — mcu отработает по меньшему сопротивлению и ничего ужасного не случится.
+
avatar
  • sir0ta
  • 07 декабря 2018, 20:03
0
Именно что там есть фильтра и усреднения. Еще раз тебе повторюсь — ты в программировании и электронике не силен. и по сему… а уж
Даже если кому-то вздумается нажать одновременно 1-2-5 кнопок — mcu отработает по меньшему сопротивлению и ничего ужасного не случится.
За это я и слова не сказал. Это вроде бы как закон физики, он незыблем.
+
avatar
  • Harwest
  • 06 декабря 2018, 16:44
0
А как же дребезг? Его обработки не нужно?
Внимательно смотрим код: delay(5) это и есть debunce delay. Просто в моем случае достаточно вызывать один раз после нажатия любой кнопки.
+
avatar
+1
прокатит пока новое.
Практика показала что даже триггерного обработчика с подциклом while не всегда хватает, а delay 5 лучше как минимум удвоить.
+
avatar
  • Harwest
  • 06 декабря 2018, 17:08
0
На макетке специально тыкал по выводам кнопок снаружи старым пинцетом — все ок.
Сами кнопки как я написал — от старой 15«ки которой черт знает сколько лет. Окислы наверняка есть (не вскрывал).
+
avatar
+2
попробую еще раз донести…
дребезг кнопки это не только нестабильный контакт на протяжении несколькольких микросекунд в момент включения, это еще и окисленные контактв (мембранна кнопки), которая провоцирует нестабильный контакт в течении значимого интервала времени, в особо «удачных» случаях во время длительности всего нажатия.
В таком случае ты поймайшь «нажатие» кнопки в своей программе раз 100 в секунду (5 милисекунд делай компенсирует + столько же отведем время на цикл скетча, с большим запасом) ибо осциллограмма нажатой кнопки будет весьма красивым «ёжиком», и почти в каждом цикле программа увидит «очередное» нажатие
+
avatar
  • Harwest
  • 06 декабря 2018, 17:56
0
Не надо мне доносить — наука о контактах изучена на радиотехническом факультете.

Самое забавное что никто не возбудился насчёт дребезга на гитхабе или готовом изделии у Vitgo.
Наверняка десятки тысяч людей уже повторяли этот проект, а там дребезг, ой-ой!

А если серьёзно — схема допускает изменения кода в любой момент, можно вставить фильтр, изменить функции кнопок и тд и тп.
+
avatar
  • vitgo
  • 08 декабря 2018, 15:16
0
Вообще то, у меня используется стандартный пример скетча TrinketVolumeKnobPlus.ino из библиотеки Adafruit-Trinket-USB, в котором также есть задержка против дребезга — delay(5)
+
avatar
  • Harwest
  • 08 декабря 2018, 15:26
0
Видишь как тебе повезло!
Все ахали и охали над корпусом, а мне за код и дребезг — ведро наплевали :))))
+
avatar
  • vitgo
  • 08 декабря 2018, 15:38
0
Как правило, народ критикует код всегда, какой бы он не был
+
avatar
  • Harwest
  • 08 декабря 2018, 16:02
0
Да не говори. На синем форуме народ заметно более деловой и отзывчивый.
+
avatar
0
Можно нагородить много надежных алгоритмов работы с грязными контактами, но зачем они в копеечном бытовом устройстве, время жизни которого от силы пару лет?
Если работает- пусть работает, в зоопарке зайцу не нужны быстрые ноги.
+
avatar
+9
Действительно…
вся суть современного кодинга и вообще подхода в целом

И всё-таки я выбираю иной путь.
Дискуссию, правда, не вижу смысла продолжать. Мой подход явно в меньшинстве.
+
avatar
  • Harwest
  • 06 декабря 2018, 18:42
-6
+
avatar
+3
Зря Вы так, человек пытается донести до Вас то, что у программирования есть свои правила, как и в любом языке. И правила написания когда по принципу и так сойдет, аналогично общению матом.
+
avatar
-2
что у программирования есть свои правила
И какие, позвольте спросить? Только давайте без MISRA и других промышленных или военных стандартов программирования, вот чисто «свои правила» программирования для устройств бытового уровня со стационарным питанием, где написано, что обязательно нужно делать антидребезг, даже в том случае, если и без него устройство на все 100% работает именно так, как от него требуется. В батарейном- да, нужно, чтоб не тратилась энергия на передачу посылок после ложных срабатываний, но зачем это нужно со стационарным питанием?
Лично я вижу только одну причину переделать опрос кнопок- оупенсорсность проекта, это может оказаться полезным если этот проект попадется на глаза потенциального работодателя с высокими требованиями к коду.
+
avatar
+2
Я написал зачем, описав конкретный сценарий ложного, многократного срабатывания кнопки из-за дребезга.
Могу на пальцах.
Играетесь вы в думчик, ночью, тихо… но вот пару процентов бы добавить к громкости. Улац на кнопку, а оно вместо 1 срабатывания — пачку из 50 «словило» за пол секунды. В итоге и вы, и ваши соседи рискуют поймать коричневую ноту часа в 3 ночи.
Это только первый пришедший на ум пример.
+
avatar
-1
На вещи надо смотреть трезво и без фантазий.
Прежде всего необходимо оценить время, которое потребуется на написание и отладку правильного алгоритма, и сравнить это со временем, которое теоретически может понадобиться на чистку или замену кнопок, которые так окислятся, что для игнорирования ложного срабатывания уже недостаточно будет простой задержки, которая уже реализована и отлажена.
И в итоге выйдет что на дребезг он угрохает дня три, а заменить окисленные кнопки работы на пол часа, раз в пол года. Вот и считай через сколько десятилетий его труд перестанет быть напрасным, при условии что он не откажется от эксплуатации этого устройства.
+
avatar
+2
По окислениям — бред, написал ниже.
По времени на код — тем более бред.
Школьник-ардуинщик напишет это быстрее, чем вы писали свой камент.
Опытный программер напишет это в 1 строчку, еще быстрее школьника и в 10 раз красивее.
+
avatar
0
Во-первых опытный программист за этот проект не возьмется.
Во-вторых автор черным по белому написал
Еще раз повторю — это мой первый проект.
и на нормальный алгоритм селективной обработки нажатия кнопок через АЦП он потратит много времени, по этому не мешай ему работать, его цель как можно быстрее сделать рабочее устройство, увидеть результат своего труда.
+
avatar
  • Z2K
  • 07 декабря 2018, 02:20
0
«аналогично общению матом.» — матан короче.
+
avatar
  • Z2K
  • 07 декабря 2018, 02:18
0
Если достаточно часто пользаться кнопками окислов на контактах не будет — они механически удаляются от трения — єто сигнальные мембранные кнопки — они такие.
+
avatar
-1
Если редко пользоваться то там тем более не будет окислов, мембраны анодированы.
Окисел в этих кнопках бывает только после попадания в них жидкостей либо паров, а это уже нарушение условий эксплуатации.
+
avatar
  • Z2K
  • 07 декабря 2018, 03:10
0
«мембраны анодированы.» — ну если так, то на них мощныий слой окислов. Непонятно как они контактируют и пропускают ток. Прочитайте про аннодированный алюминий или медь.
+
avatar
0
да не важно как называется процесс, суть то понятна- мембрана покрыта металлом, который сам по себе не окисляется.
+
avatar
0
ну-ну.
только я этих мембранных кнопок десятками меняю в тачпадах ноутов.
кроме того периодически приходится менять в своих приборах — блоках питания, паяльнйо станции итп, по разу на круг уж точно поменял. А юзаю — ежедневно по нескольку раз. Кстати чаще дохнут те, которые чаще юзаешь.
+
avatar
0
Пользуюсь нотбуком Леново с 2014 года, минимум 8 часов в сутки 5 дней в неделю, внешней мышкой никогда не пользовался, только тачпадом.
От рук уже рассыпалось резиновое покрытие вокруг тачпада, кнопку еще не менял, даже намека на проблемы нет.
Что я делаю не так? Может я не заливаю тачпад кофем?
+
avatar
  • Z2K
  • 07 декабря 2018, 04:03
0
По разному. Ноут НР. Тачпадом не пользовался. Через несколько лет кнопки под ним мертвы. С трудом расклацал правую. Хорошо что левая — удар по тачу.
+
avatar
  • Z2K
  • 07 декабря 2018, 03:57
0
«мембрана покрыта металлом, который сам по себе не окисляется.» — да, понятно — гальваническим покрытием коррозиционностойким металлом.
+
avatar
  • Harwest
  • 07 декабря 2018, 04:47
0
Всегда думал что на качественных — серебрение.
На старых кнопках аж темное все от патины.
+
avatar
  • _sil_
  • 06 декабря 2018, 17:06
-1
На скока я помню, для АЦП можно указать количество обработок для получения итогового значения напряжения. Либо снять показания АЦП скажем 10-20 раз и усреднить их. То есть показания напряжения усредняем за некоторое кол-во времени. Тем самым дребезг и размазывается в пределах этого времени. А если просто делать делай() — это вообще ниочем.
Хотя, главное — чтобы с твоими кнопками в реале всё работало четко и стабильно. Все остальное — побоку. Ты ведь делаешь разработку для себя и под себя, а не универсальное легко повторяемое устройство для любого типа кнопок…
+
avatar
  • Harwest
  • 06 декабря 2018, 17:19
0
На скока я помню, для АЦП можно указать количество обработок для получения итогового значения напряжения
К сожалению нет.

Фильтр 'среднего окна' был в одном из вариантов скетча, оказалось он не нужен.

Ты ведь делаешь разработку для себя и под себя, а не универсальное легко повторяемое устройство для любого типа кнопок
Естественно! Если бы проект был коммерческим — я бы развел печатку, собрал все из рассыпухи, нарисовал лейбл на корпусе и… фиг бы сюда все это выложил. Логично?

Как правило здесь на муське хорошо пилят, строгают, сверлят и печатают.
Мало кто кодит и понятно объясняет что как и почему он делает.
У меня к сожалению нет 3D принтера и фрезера с ЧПУ, я не могу за день изготовить чистовое устройство.
+
avatar
  • sir0ta
  • 06 декабря 2018, 18:29
+4
У меня к сожалению нет 3D принтера и фрезера с ЧПУ, я не могу за день изготовить чистовое устройство.
Как самодельщику очень советую 3д принтер. Ту же аню 8. На распродаже 150 баксов. И петг от абсмейкеров взять. Милейшее дело. Я столько корпусов уже отмоделил и отпечатал. И это я молчу про заказ. Даже для себя любимого. К примеру я бы раньше мудрил бы с какой нибудь распаячной коробкой, или… а крутилку вообще не знаю. а тут:

И моделить не пришлось, кто-то уже за меня все придумал. А уж для своих девайсов… Я помню как раньше пользовался корпуса от CD приводов… задняя стенка боль… передняя немного проще, но все же… склеил, вырезал отверстия нужные, потом заливаешь цианакрилатом и засыпаешь содой, потом шрукинг, грунтинг и красинг. А сейчас 5-10-15 минут в каде, и в печать. через час ни чего не деланья очень красивая морда, собирай и пользуйся.
+
avatar
  • Harwest
  • 06 декабря 2018, 18:35
0
Убедил, куплю.
Но никакой пластик не заменит хорошего дерева.

Зы я не настоящий сварщик самодельщик.
+
avatar
  • sir0ta
  • 06 декабря 2018, 18:43
0
У нас с деревом очень и очень туго. По сему… когда встает вопрос в строительстве… металл у нас дешевле леса.
+
avatar
  • Harwest
  • 06 декабря 2018, 18:50
0
А где-то дерева завались, и даже есть куски шкафа из мореного дуба, который вывезли в конце 2й мировой из Германии.
+
avatar
+3


Эта пробка, лучше...:)
+
avatar
  • sir0ta
  • 06 декабря 2018, 19:43
0
Маленькая. Из под 5-ки или подобной куда лучше. Но надо заливать чем-то. Они гибкие.
Да и зачем мне это? 500 рублей килограмм пластика. Печать для меня давно бесплатная )
+
avatar
+2
Эта пробка хороша как «память».
+
avatar
  • sir0ta
  • 06 декабря 2018, 21:17
0
По подробнее? Конкретно 3 таких пробки недавно помогли мне решить задачу на которую я с дуру согласился. По сему… Требую разъяснений )))
+
avatar
  • Z2K
  • 07 декабря 2018, 02:27
0
И принтера не надо :))
+
avatar
  • iamjdoe
  • 06 декабря 2018, 21:12
0
А можно полные названия этих Ань и Петгов? А то тем, кто не в теме, вообще не понятно о чём речь. Но интересно.
+
avatar
  • sir0ta
  • 06 декабря 2018, 21:18
0
Anet A8. Pet-g — absmaker.ru
Надо немного вникнуть в 3д печать и все станет на свои места.
+
avatar
  • iamjdoe
  • 07 декабря 2018, 08:39
0
Вы же не хотите сказать, что эту жёлто-чёрную конструкцию на фото выше вы напечатали на А8? Тогда на чём?
+
avatar
  • sir0ta
  • 07 декабря 2018, 09:10
+1
Ну… Если грубо, то да.

В девичестве это был тарантул. НО за 2 года он претерпел кардинальные изменения. В скором времени уйдет в разбор скорее всего.
Аня вполне может после небольших доработак так печатать. Да даже не 60мм/с, но на 40мм/с сможет легко.
+
avatar
  • VlaoMao
  • 07 декабря 2018, 13:08
0
Ух блин. Напомнило мне как я со своей тарантулой баловался. Из плюсов — я набрался опыта ))
+
avatar
  • sir0ta
  • 07 декабря 2018, 14:11
0
Ну… я свою 2 года пилил. даже как-то печать была на 3 суток. почти кило пластика ушло ) За те деньги что он тогда продавался шикарнейшая вещь.
+
avatar
  • RBS
  • 06 декабря 2018, 17:04
+5
Слушайте, так если перепаять один контакт, то… расскажу в следующий раз.
+
avatar
  • Boing
  • 06 декабря 2018, 18:36
+4
тот редкий случай, когда обзор из радела DIY бесполезен чуть более, чем полностью.
Для меня.
+
avatar
0
Буквально вчера собрал такой же контроллер по приведенной ссылке. Windows7x32 его обнаруживает, но, к сожалению, на моей системе по какой-то причине регулировка громкости не работает, а mute срабатывает, однако не так, как хотелось бы. Если на ПК при этом работает ТВ-тюнер, то выключение звука происходит только в программе тюнера, остальные звуки не блокируются. Попробовал версию на mega32u4, та же история. Видимо, в системе что-то криво настроено. А вот на макбуке все работает норм.
Заказал себе еще такую шайбу
aliexpress.com/item/PC-USB-Wire-Controller-USB-Volume-Control-Knobs-Audio-Controller-for-Adjusting-Volume-of-Computer-Laptop/32649442146.html
+
avatar
  • Harwest
  • 06 декабря 2018, 20:26
0
Видимо, в системе что-то криво настроено
А если снести весь софт от тюнера?
+
avatar
  • userman
  • 06 декабря 2018, 18:52
+2
Автор знает как воду в ступе размешать. Пожалуй самая бессмысленеая поделка за последнее время на мустке
+
avatar
  • Harwest
  • 06 декабря 2018, 20:24
-5
+
avatar
0
На такой джостик сверху энкодер нацепить поинтереснее будет. Только корпус нужно будет моделировать с учетом того, чтоб при наклоне не сломать его
+
avatar
  • Harwest
  • 07 декабря 2018, 05:28
0
Штука ненадежная, в свое время пачками менял на сименсах и сонериках.
Декоративный диск будет сантиметров 4-5 в диаметре, при наклоне большой риск сломать шток. А выводить упоры под диск это гимор.
+
avatar
+3
Аффтор, ты б поумерил пыл в каментах, а то борзометр зашкаливает.
+
avatar
0
Ты свои комменты почитай для начала и сам пыл поумерь, прежде чем других учить, умник :D
+
avatar
+8
Вот я хренею с народа :)

Человек описал как сделать с его точки зрения интересную штуку, пусть даже и не до конца оконченную.
Но имеющий руки и желание, если понравится — сделает подобное, а не имеющий — ничего не сделает, даже если бы фотка готового устройства была или что-то еще.

Налетели «экс-перты», все раскритиковали и об#ли, и улетели :)
Особенно двое отличились — одному энтерпрайс надежность подавай, а второму микшерский пульт :D

Это устройство для дома, человек делал его для себя — и самое главное — сделал.
Оно не надежное как танк, но зато быстро и четко исполняет функции, автору нужные.

Вы чего все такие нетерпимые, а?

Чувствую, вряд-ли автор еще сюда писать будет, умники.

Лучше обзоры трусов почитать, ага? :D

Автору зачет. Плюй на всех этих придурков — они дальше болтовни ничего не сделают :)
Можно быть тысячу раз правым и про схемотехнику и про дизайн — но если до дела не дошло — грош цена всему этому.

А ты сделал с нуля — ты уже во сто крат круче них.

Есть такая китайская мудрость:
-На стволе поваленного дерева сидело три лягушки, одна из них решила спрыгнуть — сколько лягушек осталось на стволе?
-Три, потому-что решить спрыгнуть и спрыгнуть — две большие разницы…


P.S.
Дребезг кнопок на АЦП лечится тем, что указывается диапазон возможных значений для каждой кнопки + несколькими чтениями с задержкой. Вообще АЦП не очень для кнопок, т.к. если нажать их несколько то… будет работать не так как хочется :) Но здесь, действительно, особого выхода нет — разве что i2c экстендер ставить — но это +1 корпус, да и особо не нужно, если кнопки разом не давить.

Код для новичка вполне — не обращай внимание на эспертофф — вообще если стабильно работает — ну и нехай.

Апартно дребезг можно устранить RC цепочкой — если очень охота — про это куча информации в инете, но здесь абсолютно не нужно — програмного выше крыши.

Я бы еще сделал чтобы при длительном нажатии на энкодер громкость ставилась 50% — это очень удобно, делается очень просто.
+
avatar
+1
Дребезг кнопок на АЦП лечится тем, что указывается диапазон возможных значений для каждой кнопки + несколькими чтениями с задержкой
Держите наркомана.

Шутки шутками, но у вас все печально. Советую ознакомится с этим — www.allaboutcircuits.com/technical-articles/switch-bounce-how-to-deal-with-it/

И этим — protological.com/debounce-calaculator/
+
avatar
+1
protological.com/debounce-calaculator/
Тому, кто выставляет исходник в котором написано «char Bouncevalue = 500;» надо вбить в голову гвоздь, а тому кто ссылается на этот исходник надо вбить два.
+
avatar
0
Тут не ентерпрайз — поэтому все решается в разы проще, да, может дебаунс провалиться — все дело в вероятности — она малая и даже если случится — ничего страшного не будет.

И да, threshold на АЦП реально решает задачу дебаунса — но это не идеально, однако тут никто за исо9001 не гонится.

В статье тоже весьма не ах написано, кстати — крайне не советую этим пользоваться, в том числе — кодом оттуда, ибо это полный ппц а не код.
+
avatar
0
«В статье» — имелись ввиду статьи по вашим ссылкам, а не данный топик.
+
avatar
  • Z2K
  • 07 декабря 2018, 02:36
0
«это очень удобно, делается очень просто.» — Как оно узнает что громкость 50% — здесь только больше-меньше?
+
avatar
0
А подумать? :)

Кол-во шагов громкости фиксированно в винде.

Делается «меньше» * количество шагов, потом «больше» " количество шагов / 2
+
avatar
  • Z2K
  • 07 декабря 2018, 10:54
0
До упора вниз и пол шага вперед? :) Понятно, тогда любую можно выставлять.
+
avatar
0
Ага, можно еще перед этим mute врубить, а потом — вырубить. Чтобы не беспокоило :)
+
avatar
  • Harwest
  • 07 декабря 2018, 05:18
+1
Вы чего все такие нетерпимые, а?

Чувствую, вряд-ли автор еще сюда писать будет, умники.

Лучше обзоры трусов почитать, ага? :D

Автору зачет. Плюй на всех этих придурков — они дальше болтовни ничего не сделают :)
Да почему не буду? Будет ещё выпиливание корпуса.
А таких умников-экспердоф в офисе половина этажа, и как везде главное им уцепиться за мелкий вопрос где есть знакомое слово — и начинается пустой срач…

Самое смешное — код не мой, моего там только расчёт делителей, порогов, ну и паяльник с напильником.

Громкость на 50% не требуется: контроллер может переключаться между несколькими устройствами: где-то внешний усилитель, где-то наушники могут подключаться, средний уровень не одинаков.
В законченном устройстве — да удобно.
+
avatar
+4
Мой тебе совет — никогда не слушай тех, кто размышляет о коде как о вещи в себе.
Красота кода, правильность выбора алгоритмов- все это живет только в связке с классом устройства, его назначением, условиям его эксплуатации.
Требуют стрелять из пушки по воробьям — стреляй, но только если тот, кто это требует, хорошо за это платит.
Ну и, напоследок, анекдотец
Сын-верблюд спрашивает папу-верблюда.
-Пап, а пап, а зачем нам такой большой горб?
-Ну, как-же, сынок. Мы же корабли пустыни, можем ходить по пустыне 2 месяца и
ничего ни есть, ни пить.
-Да, ну ладно. Папа, а зачем нам такая длинная шерсть?
-Ну, как-же, сынок. Мы же корабли пустыни, можем постоянно быть под солнцем,
а нам не жарко.
-Да, ну ладно. Папа, а зачем нам такие широкие копыта?
-Ну, как-же, сынок. Мы же корабли пустыни, можем ходить по барханам и не проваливаемся.
-Да. Папа, а зачем нам все эти навороты, если мы в зоопарке???
+
avatar
  • Harwest
  • 07 декабря 2018, 06:31
0
все это живет только в связке с классом устройства, его назначением, условиям его эксплуатации.
Верно, есть принцип целесообразности и есть ограничения.
Это устройство — не ядерная кнопка, не промышленный автомат, и даже диджеить им не будут — для всего этого есть свои инструменты.

Вцепились в дребезг, а вопрос с одновременным нажатием кнопок — побоку, давайте ещё там защиту напишем :)))
+
avatar
+1
Сделал недавно себе похожее устройство. Только мне надо было кроме регулировки громкости чтобы при нажатии включался/выключался микрофон на веб-камере. Использовал прогу MicMute 0.1.7.2 и сочетание клавиш ALT+M { TrinketHidCombo.pressKey(0x04, KEYCODE_M);delay(50); TrinketHidCombo.pressKey(0, 0);}
Корпус сделал и розетки


Только возникла одна проблемка… на некоторых компах не обознается устройство при загрузке пока не переподключишь или не сбросишm через Reset, затем и кнопочка сбоку.
Хотелось бы реализовать индикацию включения микрофона, но как задействовать пин P5 не знаю. Подскажите если кто в курсе.
+
avatar
0
Только возникла одна проблемка… на некоторых компах не обознается устройство при загрузке пока не переподключишь или не сбросишm через Reset, затем и кнопочка сбоку.
Это какой-то глюк VUSB — где то читал про это подробно.

Щас не помню как это там решаюсь, но можно без кнопочки — программно отключить нужное USB и снова включить.
+
avatar
  • Harwest
  • 07 декабря 2018, 12:39
0
Хотелось бы реализовать индикацию включения микрофона, но как задействовать пин P5 не знаю. Подскажите если кто в курсе.
Может вот это чем-то поможет
+
avatar
0
Спасибо за совет. Буду курить букварь :)
+
avatar
  • Kybb
  • 07 декабря 2018, 10:46
0
Автор, возможно Вам будет полезно.
Попробуйте поиграться в коде в части Play/Pause. возможно лучше будет поменять на «Пробел». Конкретно в моей реализации применительно к браузеру Хром в винде, при наличии нескольких вкладок с youtube или другими плеерами эмуляция нажатия Play/Pause применяется сразу ко всем вкладкам.
+
avatar
  • Harwest
  • 07 декабря 2018, 10:56
0
Интересный эффект. У меня при открытом Firefox и foobar2000 переключение треков происходит в плеере.
+
avatar
0
Автор спасибо за статью. Подскажите, я правильно понял что с помощью такого контроллера можно сделать. Чтобы на планшете андроид4, запускать/выключать приложение путем замыкания, размыкания контактов?
Или может подскажете как лучше сделать, в машину установил планшет SAmsung G Tab 3 8.0, все замечательно, лучше магнитолы и управлялки к КарПК не сыскать, но хочется камеру заднего вида. Думаю WiFI камеру установить, и чтоб при включении ЗХ активировалось приложение которое будет выводить картинку с камеры.
+
avatar
  • Harwest
  • 08 декабря 2018, 18:43
+1
Не все так просто. Контроллер это HID устройство, оно только передаёт через USB головному устройству код нажатой кнопки. Это код может быть любым, например «1», «2», «ESC», «F1» и так далее.
Если говорить об Android, то далее происходит распознавание принятого кода согласно содержимому файла /system/usr/keylayout/Generic.kl
В этом файле каждому коду кнопки сопоставляется своя команда: mute, play, brightness, home и так далее. Но там нет вызова приложений, кроме Camera, Calendar, Call и ещё нескольких.

Как я понимаю — ты хочешь отловить сигнал ЗХ с коробки передач и вызвать приложение которое покажет картинку задней камеры.
С камеры WiFi картинку как смотреть — в браузере?

Думаю это можно сделать с помощью tasker. Вроде бы оно может по шорткартам вызывать приложения, но с браузерным просмотром хз получится ли…

Но надо подумать как закрывать это приложение при переключении с ЗХ на нейтраль или передние передачи.
+
avatar
  • aef3iuga
  • 08 декабря 2018, 21:41
+1
> Вроде бы оно может по шорткартам вызывать приложения, но с браузерным просмотром хз получится ли…

Насколько я помню можно делать шорткат на конкретную закладку, так что должно выйти
+
avatar
  • Harwest
  • 08 декабря 2018, 23:28
+1
Или как вариант — использовать usb вебкамеру и вызвать софтину типа UsbWebCamera (я такой с эндоскопом пользуюсь). Она умеет делать зеркалирование, переворот, менять яркость и ещё много чего.
+
avatar
0
Понял, спасибо за развернутый ответ. А Вы не слышали/связывались с Google Button? Если не ошибаюсь это то что мне надо
+
avatar
  • Harwest
  • 09 декабря 2018, 12:19
0
Нет, про гуглбатоны не слышал, придётся гуглить :)
+
avatar
  • ybxtuj
  • 09 декабря 2018, 07:28
0
хз лучше уж промини за туже цену взять
притом недавно она стоила 64 рублика по акции

аттини слишком кастрирована по пинам
+
avatar
  • Harwest
  • 09 декабря 2018, 07:34
0
А смысл какой? Хватает же 85й
Вешать каждую кнопку на отдельный пин? Так они одновременно все равно не нажимаются.
+
avatar
  • ybxtuj
  • 09 декабря 2018, 07:55
0
я не имел ваше конкретное устройство
я про вообще и на будущее
в данный момент разница между ними 2 рубля но разница в возможностях колосальная
досих пор валяются даже не распакованные ибо применить их это надо что бы подвернулся какойнить проект маломальский это мне в одно время требовалось сделать ложную световую автосигнализацию
еслиб они стоили рублей 30 если не меньше согласно возможности на их для переферии я бы и слова не сказал
+
avatar
  • Harwest
  • 09 декабря 2018, 08:14
0
Понятно. Я то взял попробовать что это вообще такое, вчера смотрел борды на аттини187 — там добра этого (пинов) завались. Ребёнок синтезатор спалил китайский, думаю клаву к 187 подключить и сделать midi usb клавиатуру.