Не работает скетч digispark

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

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

Скетч качал от сюда https://github.com/adafruit/Adafruit-Trinket-USB

// see tutorial at http://learn.adafruit.com/trinket-usb-volume-knob

#include "TrinketHidCombo.h"

#define PIN_ENCODER_A 0
#define PIN_ENCODER_B 2
#define TRINKET_PINx  PINB
#define PIN_ENCODER_SWITCH 1

static uint8_t enc_prev_pos   = 0;
static uint8_t enc_flags      = 0;
static char    sw_was_pressed = 0;

void setup()
{
  // set pins as input with internal pull-up resistors enabled
  pinMode(PIN_ENCODER_A, INPUT);
  pinMode(PIN_ENCODER_B, INPUT);
  digitalWrite(PIN_ENCODER_A, HIGH);
  digitalWrite(PIN_ENCODER_B, HIGH);

  pinMode(PIN_ENCODER_SWITCH, INPUT);
  // the switch is active-high, not active-low
  // since it shares the pin with Trinket's built-in LED
  // the LED acts as a pull-down resistor
  digitalWrite(PIN_ENCODER_SWITCH, LOW);

  TrinketHidCombo.begin(); // start the USB device engine and enumerate

  // get an initial reading on the encoder pins
  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; // 1 or -1 if moved, sign is direction

  // note: for better performance, the code will now use
  // direct port access techniques
  // http://www.arduino.cc/en/Reference/PortManipulation
  uint8_t enc_cur_pos = 0;
  // read in the encoder state first
  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 any rotation at all
  if (enc_cur_pos != enc_prev_pos)
  {
    if (enc_prev_pos == 0x00)
    {
      // this is the first edge
      if (enc_cur_pos == 0x01) {
        enc_flags |= (1 << 0);
      }
      else if (enc_cur_pos == 0x02) {
        enc_flags |= (1 << 1);
      }
    }

    if (enc_cur_pos == 0x03)
    {
      // this is when the encoder is in the middle of a "step"
      enc_flags |= (1 << 4);
    }
    else if (enc_cur_pos == 0x00)
    {
      // this is the final edge
      if (enc_prev_pos == 0x02) {
        enc_flags |= (1 << 2);
      }
      else if (enc_prev_pos == 0x01) {
        enc_flags |= (1 << 3);
      }

      // check the first and last edge
      // or maybe one edge is missing, if missing then require the middle state
      // this will reject bounces and false movements
      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);
  }

  // remember that the switch is active-high
  if (bit_is_set(TRINKET_PINx, PIN_ENCODER_SWITCH)) 
  {
    if (sw_was_pressed == 0) // only on initial press, so the keystroke is not repeated while the button is held down
    {
      TrinketHidCombo.pressMultimediaKey(MMKEY_MUTE);
      delay(5); // debounce delay
    }
    sw_was_pressed = 1;
  }
  else
  {
    if (sw_was_pressed != 0) {
      delay(5); // debounce delay
    }
    sw_was_pressed = 0;
  }

  TrinketHidCombo.poll(); // check if USB needs anything done
}

 

VladimirTsibrov
Offline
Зарегистрирован: 05.03.2019

Для начала проверьте работает ли функция TrinketHidCombo.pressMultimediaKey(MMKEY_MUTE): установите в setup громкость, затем после небольшой задержки вызовите эту функцию. Работает?

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

VladimirTsibrov пишет:
Для начала проверьте работает ли функция TrinketHidCombo.pressMultimediaKey(MMKEY_MUTE): установите в setup громкость, затем после небольшой задержки вызовите эту функцию. Работает?

Пробовал на другой пин подключить кнопку, работает, но не так как хотелось. А как громкость устанавливать?

VladimirTsibrov
Offline
Зарегистрирован: 05.03.2019

Цитата:
А как громкость устанавливать?

Судя по скетчу, громкость прибавляется вызовом TrinketHidCombo.pressMultimediaKey(MMKEY_VOL_UP).

Но я так понял, mute все-таки работает. Осталось понять что значит "работает, но не так как хотелось". Срабатывает через раз или что?

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

VladimirTsibrov пишет:
Цитата:
А как громкость устанавливать?

Судя по скетчу, громкость прибавляется вызовом TrinketHidCombo.pressMultimediaKey(MMKEY_VOL_UP).

Но я так понял, mute все-таки работает. Осталось понять что значит "работает, но не так как хотелось". Срабатывает через раз или что?


Вопервых кнопка почему то нормально работает только на одном пине, но этот пин занят энкодером. во вторых мут работает бесконечно(включается и выключается), а при нажатии на кнопку перестает так делать. Пробовал и так и сяк

VladimirTsibrov
Offline
Зарегистрирован: 05.03.2019

Добавьте резистор 10кОм между землей и выводом к которому подключена кнопка.

Если уж взялись за это дело, то разберитесь с опросом кнопок и энкодера в ардуино. И почитайте про подтягивающие резисторы.

Алексей.
Алексей. аватар
Offline
Зарегистрирован: 02.02.2018

А как же кнопка оказалась на занятом энкодером пине?
В примере енкодер на пинах 0 и 2, а кнопка на пине 1

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

VladimirTsibrov пишет:

Добавьте резистор 10кОм между землей и выводом к которому подключена кнопка.

Если уж взялись за это дело, то разберитесь с опросом кнопок и энкодера в ардуино. И почитайте про подтягивающие резисторы.


Про подтягивающие резисторы вкурсе, они есть на модуле энкодера. Под опросом кнопок я так понял вы имели ввиду digitalread?

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

Пробовал менять пины, кнопка заработала только на p1

VladimirTsibrov
Offline
Зарегистрирован: 05.03.2019

Цитата:
Про подтягивающие резисторы вкурсе, они есть на модуле энкодера.
Подозреваю, что на модуле резисторы только для выводов A и B, а на кнопке нет.

Цитата:
Под опросом кнопок я так понял вы имели ввиду digitalread?
- И digitalRead, и подтяжка к земле/питанию, и что будет если не подтягивать.

Цитата:
мут работает бесконечно(включается и выключается), а при нажатии на кнопку перестает так делать
- очень похоже на то, что пин болтается в воздухе когда кнопка разомкнута и стабилизируется при нажатии.

Ну так пробовали добавить резистор или нет?

 

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

Там 3 резистора, написал же, но хорошо, попробую

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

Поставил, все так же

VladimirTsibrov
Offline
Зарегистрирован: 05.03.2019

Что за модуль энкодера, название? И покажите фото как подключили его

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

GREATZT 360 градусов Поворотный модуль кодировщика для Arduino кирпичный сенсор переключатель макетная плата KY-040 с контактами
https://s.click.aliexpress.com/e/cAX46T3S

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

Подключение:
P0 - DT
P1 - SW
P2 – CLK
5V - "+"
GND – GND

VladimirTsibrov
Offline
Зарегистрирован: 05.03.2019

Т.е. кнопка у вас все-таки подтянута. К питанию (говорю же разберитесь с энкодером/кнопками, потом уже двигайтесь дальше). А скетч рассчитан на значение LOW когда кнопка не нажата.
Исправляйте скетч.

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

Делал и так и так. В одном случае все работало бесконечно, в другом вообще не работало(не помню где какой сигнал был)Так же пробовал ставить задержку, если вдруг вы об этом напишете

VladimirTsibrov
Offline
Зарегистрирован: 05.03.2019

Ну если делали и так, и так, то я не знаю. Ради интереса поставил эту библиотеку, залил скетч с поправкой на pull-up (10к) - все работает

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

Хмм,все равно спасибо, буду разбираться

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

Если я отсоединяю землю от энкодера кнопка работает, но сам энкодер нет. странная херня

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

Все решил просто перекинув 5 вольт на гнд и гнд на 5 вольт

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

Почему когда я повесил кнопку с подтяжкой 10кОм на пин p3, дигиспарк перезагружается?

void setup() 
 { 

 pinMode(3, INPUT); 
pinMode(1, OUTPUT);
 } 

 void loop() 
 { 
 bool p = digitalRead(3);
 digitalWrite(1, p);
 }