Attiny85, leyendo valores analógicos desde PIN3, ¿los informes 654 están inactivos?

0

Al principio, no soy un profesional de hardware (iniciador), así que sé amable.

Intento reutilizar una placa de operación DENON de un reproductor de DVD con 9 botones con un clon Attiny85 Digispark conectado a PIN3 (vea también la imagen a continuación)

EDITAR: Acerca de la imagen: "Sparkfun" debe ser "Digispark".

Sinembargo,puedoleerlosvaloresdelosbotones,losvaloresparecenestarmuycerca,porloqueesdifícildetectarquébotónsepresiona.

Peroesenoeselproblema/preguntaprincipal,elproblemaeselvalorinactivodelafunciónanalogReadquenoentiendo.ElmanualdeidiomaArduino(IDE)'dice'queesunvalorentre0y1023.Enestecaso,informade654enmodoinactivoysuperiorcuandosepresionaunbotón.TambiénprobéelPIN1ylosinformes1023,peronodetectaningunaentrada(elvalornocambia).

Preguntas:

  1. ¿PorquélafunciónanalogReadinforma654(tambiéncuandolaplacadesconectado)
  2. ¿Puedoaumentarlaresolucióndeestosvaloresparadetectarbotonesmás?¿Preciso/exacto?

Algúncódigo(hiceunasolucióndesoftwarededepuraciónUSBparadepurarvaloresatravésdeltecladoporquenohayUART):

#include"types.h"              // Custom types
#include "TrinketHidCombo.h"    // Trinket USB lib


#define PIN_BUTTON_IN 3

void setDelay( uint16_t ms ) // usbsafe delay
{
  if( ms < 10 )
   { delay(ms); }
  else {
         uint16_t iSteps = ms / 4;

         while( iSteps-- )
         {
           usbIdle(); // We need to do this to keep the Windows USB driver 'sadisfied'
           delay(4);
         }  
       }
  usbIdle();
}  

void usbIdle()
{
  // do nothing, check if USB needs anything done
  TrinketHidCombo.poll();  
}

void usbStart()
{ 
  TrinketHidCombo.begin(); 
}

bool usbSendDebugHandshake()
{
  TrinketHidCombo.pressKey( 0, KEYCODE_F24 ); // press
  TrinketHidCombo.pressKey( 0, 0 ); // release
  setDelay(20);
  TKeyboardLEDState recLedState = usbGetKeyboardLedState();
  return ( recLedState.caps && recLedState.num && recLedState.scroll );
}

void usbDebug(const char* s, bool bLineFeed )
{
 static bool bUsbDebugHandshake = false;
 static bool bUsbDebugEnabled = false;

 if( !bUsbDebugEnabled && !bUsbDebugHandshake )
  { 
    //bUsbDebugHandshake = true;
    bUsbDebugEnabled = bUsbDebugHandshake = usbSendDebugHandshake(); 
  }  


 if(  bUsbDebugEnabled ) 
  { 
    (bLineFeed)?TrinketHidCombo.println( s ):TrinketHidCombo.print( s ); 
    usbIdle();
  }  
}  

void usbDebug(const char* s )
{ usbDebug( s, true ); }

void usbDebug( int i, bool bLineFeed )
{
  char buff[10]; //the ASCII of the integer will be stored in this char array
  memset(buff, 0, sizeof(buff));
  //itoa(i,buff,10); //(integer, yourBuffer, base)
  usbDebug( itoa(i,buff,10), bLineFeed );   
}  


void usbDebug( int i )
{ usbDebug( i, true ); }


TKeyboardLEDState usbGetKeyboardLedState()
{
  uint8_t iState = TrinketHidCombo.getLEDstate();
  TKeyboardLEDState tResult;
  tResult.caps = (iState & KB_LED_CAPS);
  tResult.num = (iState & KB_LED_NUM);
  tResult.scroll = (iState & KB_LED_SCROLL);

  return tResult;
}  

// Setup and main routine 
void setup()
{
  usbStart(); // First priority, start the USB device engine and enumerate

  pinMode(PIN_BUTTON_IN   , INPUT );
}

void loop() // Main program - main()
{
  // Button pressed?
  int iButton = analogRead(PIN_BUTTON_IN);
  usbDebug( "PRESSED: ", false );
  usbDebug( iButton );
  setDelay(1000);
}
    
pregunta Codebeat

2 respuestas

2

Supongo que te refieres a un tablero DigiSpark , no a un "ATtiny85 Sparkfun". Si observa los esquemas , verá que P3 (siendo usado para USB), tiene resistencias conectado a él, por lo que incluso cuando el USB no está en uso, no es adecuado para entrada analógica. El único pin limpio para la entrada analógica parece ser P2.

Además, cuando se usa una entrada analógica para distinguir un número de botones, nunca debe probar los valores exactos. En su lugar, intente espaciar los voltajes producidos por los botones con márgenes cómodos y verifique los rangos en su lugar.

    
respondido por el microtherion
3

Como dijo @microtherion, hay componentes en PB3. Principalmente, un pull-up a 5V, un diodo Zener de 3.6V pull-down y una resistencia de serie limitadora de corriente. Esto es para la línea D USB. PB4 tiene solo el Zener y una resistencia en serie, para la línea USB D +. Estos componentes son para mantener las líneas USB dentro de las especificaciones de voltaje para las líneas de datos (que no son 5V, eso es solo alimentación USB), y para indicar a cualquier host al que se conecta que haya un dispositivo USB insertado.

Teniendo en cuenta que el ADC está configurado en un rango de voltaje completo de 5V, con 0V correspondiente a un resultado de 0, y 5V un resultado de 1023, un resultado de 654 es aproximadamente 3.2V detectado en la entrada analógica.

Como la línea está conectada a un Zener de 3.6V (o quizás a 3.3V en su placa específica), esto explica su resultado. Especialmente si está utilizando la función USB al mismo tiempo. Conflicto.

Una vez que te moviste a un pin gratuito, solo necesitas conectarlo correctamente.

Los pines 2 o 4 del esquema actualizado de la placa deben estar conectados a tierra. Y luego habilite la resistencia de pull-up de entrada , o agregue la suya, desde el Pin 1 o el Pin 3. El pull-up interno es típicamente 47k en la mayoría de las MCU.

simular este circuito : esquema creado usando CircuitLab

Su pull-up forma la parte superior de un divisor de voltaje. Cuando no se presiona ningún botón, el ADC leerá 1023 (5V). Cuando se presiona SW1, la línea se tirará a tierra y el ADC leerá 0 (0V). Cuando se presiona SW2, el divisor de voltaje será 47k sobre 2.3k, y dará como resultado un voltaje de 0.23V. A 5 V / 1023 = 0,0048 V por paso de ADC, eso es aproximadamente un resultado de 47. Cuando se presiona SW3, el divisor de voltaje será 47k sobre 2.3k + 4.3k, voltaje de 0.62V y un resultado de ADC de 127.

Como también señaló @microtherion, usa rangos. Un resultado analógico de 0 a 30 es SW1, 31 a 100 es SW2, 101 a 150 es SW3, etc. Puede usar una resistencia de pull-up de valor más pequeño para tener algunos rangos de voltaje más amplios. 24kΩ o 10kΩ funcionaría, simplemente vuelva a calcular todos los rangos de voltaje (o simplemente conéctelo y presione los botones para leerlos. También puede presionar varios botones al mismo tiempo para diferentes valores, excepto Still / Pause, que corta el resto de los botones.

    
respondido por el Passerby

Lea otras preguntas en las etiquetas