Не работает скетч digispark
- Войдите на сайт для отправки комментариев
Вс, 26/05/2019 - 19:01
Громкость регулируется, а при нажатии на энкодер не звук мутится
Скетч качал от сюда 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 }
Для начала проверьте работает ли функция TrinketHidCombo.pressMultimediaKey(MMKEY_MUTE): установите в setup громкость, затем после небольшой задержки вызовите эту функцию. Работает?
Пробовал на другой пин подключить кнопку, работает, но не так как хотелось. А как громкость устанавливать?
Судя по скетчу, громкость прибавляется вызовом TrinketHidCombo.pressMultimediaKey(MMKEY_VOL_UP).
Но я так понял, mute все-таки работает. Осталось понять что значит "работает, но не так как хотелось". Срабатывает через раз или что?
Судя по скетчу, громкость прибавляется вызовом TrinketHidCombo.pressMultimediaKey(MMKEY_VOL_UP).
Но я так понял, mute все-таки работает. Осталось понять что значит "работает, но не так как хотелось". Срабатывает через раз или что?
Вопервых кнопка почему то нормально работает только на одном пине, но этот пин занят энкодером. во вторых мут работает бесконечно(включается и выключается), а при нажатии на кнопку перестает так делать. Пробовал и так и сяк
Добавьте резистор 10кОм между землей и выводом к которому подключена кнопка.
Если уж взялись за это дело, то разберитесь с опросом кнопок и энкодера в ардуино. И почитайте про подтягивающие резисторы.
А как же кнопка оказалась на занятом энкодером пине?
В примере енкодер на пинах 0 и 2, а кнопка на пине 1
Добавьте резистор 10кОм между землей и выводом к которому подключена кнопка.
Если уж взялись за это дело, то разберитесь с опросом кнопок и энкодера в ардуино. И почитайте про подтягивающие резисторы.
Про подтягивающие резисторы вкурсе, они есть на модуле энкодера. Под опросом кнопок я так понял вы имели ввиду digitalread?
Пробовал менять пины, кнопка заработала только на p1
Ну так пробовали добавить резистор или нет?
Там 3 резистора, написал же, но хорошо, попробую
Поставил, все так же
Что за модуль энкодера, название? И покажите фото как подключили его
GREATZT 360 градусов Поворотный модуль кодировщика для Arduino кирпичный сенсор переключатель макетная плата KY-040 с контактами
https://s.click.aliexpress.com/e/cAX46T3S
Подключение:
P0 - DT
P1 - SW
P2 – CLK
5V - "+"
GND – GND
Т.е. кнопка у вас все-таки подтянута. К питанию (говорю же разберитесь с энкодером/кнопками, потом уже двигайтесь дальше). А скетч рассчитан на значение LOW когда кнопка не нажата.
Исправляйте скетч.
Делал и так и так. В одном случае все работало бесконечно, в другом вообще не работало(не помню где какой сигнал был)Так же пробовал ставить задержку, если вдруг вы об этом напишете
Ну если делали и так, и так, то я не знаю. Ради интереса поставил эту библиотеку, залил скетч с поправкой на pull-up (10к) - все работает
Хмм,все равно спасибо, буду разбираться
Если я отсоединяю землю от энкодера кнопка работает, но сам энкодер нет. странная херня
Все решил просто перекинув 5 вольт на гнд и гнд на 5 вольт
Почему когда я повесил кнопку с подтяжкой 10кОм на пин p3, дигиспарк перезагружается?