Hulp bij volume control windows van attiny 85

Ik zit nu al een paar je met het idee om een externe audio bediening te maken voor de computer. Een half jaar geleden ben ik er mee bezig gegaan en kan al het volume regelen en mute knop gebruiken, maar verder kwam ik toen niet en nu probeer ik het project af te maken.

Wat ik wil is:
-Volume via een draaiknop kunnen regelen.
- Play/pause via een drukknop
- Vorig nummer via een drukknop
- Volgende nummer via een drukknop
- Eventueel mute via een drukknop

Ik maak gebruik van de attiny85

Ik gebruik de informatie van de volgende site:
https://learn.adafruit.com/trinket-usb-volume-knob/add-a-mute-button

Al ik de drukknop even indruk dan gaat de gaat de mute snel aan/uit. Soms blijft de mute stand geactiveerd maar ook gedeactiveerd.

Is er iemand die bij kan helpen om dit probleem op te lossen en de andere knoppen toe tevoegen aan de softwaren? De software lezen gaat mij best wel redelijk af. Ook een beetje aanpassen lukt mij wel, maar voor de rest is het toch voor mij te lastig.

Dit is de software code:

code:

    #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
    }

Er is ooit iemand geweest die een USB implementatie voor niet-USB atmel CPUs heeft gemaakt. Leuk, maar niet echt handig: Als het echt moet, dan werkt het wel, maar d'r zitten ook een hoop nadelen aan.

Gebruik nou gewoon een CPU die wel bedoeld is om USB te kunnen.

Ook de attiny85 is een leuk ding, maar Als je dan een paar pins meer nodig hebt dan zit je meteen omhoog.

Maar goed. Zo worden dus veel projecten met minimale hardware op het internet gezet en dan zitten alle nabouwers zoals jij direct in de problemen als eea uitgebreid moet worden.

Anyway. Ik ben het niet eens met een aantal beslissingen die in dit project zitten. Maar de code is simpel genoeg. Negeer het gedeelte voor de encoder, en daaronder staat dus dat als een toets ingedrukt is er een actie genomen moet worden. Lijkt me makkelijk uit te breiden.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/