Índice:

DIP Tune Selector usando 1 pino: 4 etapas
DIP Tune Selector usando 1 pino: 4 etapas

Vídeo: DIP Tune Selector usando 1 pino: 4 etapas

Vídeo: DIP Tune Selector usando 1 pino: 4 etapas
Vídeo: Полный курс Redux Toolkit + RTK Query для начинающих | Редакс за 2 часа! 2024, Julho
Anonim
DIP Tune Selector usando 1 pino
DIP Tune Selector usando 1 pino

Um tempo atrás, trabalhei em um projeto de "caixa de música" que precisava escolher entre até 10 trechos de melodia diferentes. Uma escolha natural para escolher uma melodia específica era uma chave DIP de 4 pinos, uma vez que 4 chaves fornecem 24= 16 configurações diferentes. No entanto, a implementação de força bruta para esta abordagem requer 4 pinos de dispositivo, um para cada switch. Como eu estava planejando usar o ATtiny85 para desenvolvimento, a perda de 4 pinos foi um pouco demais. Felizmente, encontrei um artigo que descreve um método engenhoso para usar 1 pino analógico para lidar com várias entradas de switch.

A técnica multi-switch; 1-input usa um circuito divisor de tensão para fornecer um valor inteiro exclusivo para cada uma das 16 combinações de configuração de switch possíveis. Este conjunto de 16 identificadores inteiros é então usado no programa de aplicativo para associar uma ação a uma configuração.

Este instrutível emprega o método multi-switch para implementar a seleção de melodia para o aplicativo de caixa de música. A melodia selecionada é então reproduzida por meio de uma campainha piezoelétrica usando a função de tom do Arduino.

Etapa 1: Hardware necessário

Hardware Requerido
Hardware Requerido

O uso do UNO como plataforma de implementação minimiza o número de componentes de hardware necessários. A implementação do método de entrada multi-switch requer apenas um dip switch de 4 pinos, os 5 resistores usados para o divisor de tensão e fio de conexão para as conexões. Uma campainha piezoelétrica é adicionada à configuração para implementação do seletor de melodia da caixa de música. Opcionalmente, dependendo do tipo de switch dip usado, é útil usar um soquete 2x4 de 8 pinos para conectar o switch dip à placa de ensaio, uma vez que os pinos do switch dip padrão parecem feitos para soldar a uma perfboard que não se conecta diretamente a uma breadboard. O soquete estabiliza as conexões da chave DIP e evita que a chave seja levantada facilmente ao ajustar as chaves de alternância.

Nome Possível Fonte Como é usado
Interruptor dip de 4 pinos Seleção de melodia
Soquete de pino 2x4 (opcional) Amazonas As postagens na maioria dos interruptores dip não seguram muito bem o interruptor em uma placa de ensaio. Um soquete ajuda a tornar a conexão mais sólida. Uma alternativa é encontrar um interruptor dip que seja realmente feito para uso em placa de ensaio com pinos de IC regulares.

resistores:

  • 10K x 2
  • 20K
  • 40K
  • 80K
Implementar divisor de tensão
campainha piezo passiva Amazonas Toque a melodia de acordo com o aplicativo por meio da função de tom do Arduino

Etapa 2: Explicação do Método Multi-switch

Explicação do método multi-switch
Explicação do método multi-switch

Esta seção discute os conceitos subjacentes para o método multi-switch e desenvolve as equações necessárias para o cálculo autônomo de identificadores exclusivos para cada uma das 16 configurações de configuração de switch dip possíveis. Esses identificadores podem então ser usados em um programa aplicativo para associar uma configuração de switch a uma ação. Por exemplo, você pode querer a configuração - ligar 1, desligar 2, desligar 3, desligar 4 (1, 0, 0, 0) - para jogar Amazing Grace e (0, 1, 0, 0) para jogar Leão dorme esta noite. Por questões de brevidade e concisão, os identificadores de configuração são referidos como comparadores no restante do documento.

Imagem
Imagem

O conceito básico para o método multi-switch é o circuito divisor de tensão, que consiste em 2 resistores em série conectados a uma tensão de entrada. O cabo de tensão de saída é conectado entre os resistores, R1 e R2, como mostrado acima. A tensão de saída do divisor é calculada como a tensão de entrada multiplicada pela relação do resistor R2 à soma de R1 e R2 (equação 1). Esta relação é sempre menor que 1, então a tensão de saída é sempre menor que a tensão de entrada.

Conforme indicado no diagrama de projeto acima, o multi-switch é configurado como um divisor de tensão com R2 fixo e R1 igual à resistência composta / equivalente para os 4 resistores de chave dip. O valor de R1 depende de quais chaves dip estão ligadas e, portanto, contribuindo para a resistência do composto. Uma vez que os resistores dip switch estão em paralelo, a equação de cálculo da resistência equivalente é declarada em termos dos recíprocos dos resistores componentes. Para a nossa configuração e no caso de todos os interruptores estarem ligados, a equação torna-se

1 / R1 = 1/80000 + 1/40000 + 1/20000 + 1/10000

dando R1 = 5333,33 volts. Para contabilizar o fato de que a maioria das configurações tem pelo menos um dos interruptores desligados, o estado do interruptor é usado como um multiplicador:

1 / R1 = s1* 1/80000 + s2* 1/40000 + s3* 1/20000 + s4*1/10000 (2)

onde o multiplicador de estado, seu, é igual a 1 se a chave estiver ligada e igual a 0 se a chave estiver desligada. R1 agora pode ser usado para calcular a relação de resistência necessária na equação 1. Usando o caso em que todos os interruptores estão ligados como exemplo novamente

RATIO = R2/ (R1+ R2) = 10000/(5333.33+10000) =.6522

A última etapa no cálculo do valor de comparador previsto é a multiplicação de RATIO por 1023 para emular o efeito da função analogRead. O identificador para o caso em que todos os interruptores estão ligados é então

comparador15 = 1023*.6522 = 667

Todas as equações estão agora implementadas para cálculo de identificadores para as 16 configurações de chave possíveis. Para resumir:

  1. R1 é calculado usando a equação 2
  2. R1 e R2 são usados para calcular a relação de resistência associada
  3. a RATIO é multiplicada por 1023 para obter o valor do comparador
  4. opcionalmente, a tensão de saída prevista também pode ser calculada como RATIO * Vin

O conjunto de comparadores depende apenas dos valores do resistor usados para o divisor de tensão e são uma assinatura exclusiva para a configuração. Como as tensões de saída do divisor irão flutuar de operação para operação (e de leitura para leitura), único neste contexto significa que, embora dois conjuntos de identificadores possam não ser exatamente os mesmos, eles estão próximos o suficiente para que as diferenças do comparador de componentes caiam dentro de um pequeno pré- intervalo especificado. O parâmetro de tamanho do intervalo deve ser escolhido grande o suficiente para levar em conta as flutuações esperadas, mas pequeno o suficiente para que as configurações de chave diferentes não se sobreponham. Normalmente 7 funciona bem para o intervalo de meia largura.

Um conjunto de comparadores para uma configuração particular pode ser obtido por vários métodos - execute o programa de demonstração e registre os valores para cada configuração; use a planilha na próxima seção para calcular; copie um conjunto existente. Como observado acima, todos os conjuntos provavelmente serão um pouco diferentes, mas devem funcionar. Eu sugiro usar o conjunto de identificadores do autor do método para a configuração do multi-switch e a planilha da próxima seção se algum dos resistores for alterado significativamente ou mais resistores adicionados.

O programa de demonstração a seguir ilustra o uso dos comparadores para identificar a configuração atual do interruptor DIP. Em cada ciclo do programa, um analogRead é executado para obter um identificador para a configuração atual. Esse identificador é então comparado na lista de comparadores até que uma correspondência seja encontrada ou a lista se esgote. Se uma correspondência for encontrada, uma mensagem de saída será emitida para verificação; se não for encontrado, um aviso é emitido. Um retardo de 3 segundos é inserido no loop para que a janela de saída serial não seja sobrecarregada com mensagens e para dar algum tempo para redefinir a configuração do interruptor dip.

//-------------------------------------------------------------------------------------

// Programa de demonstração para ler a saída do divisor de tensão e usá-lo para identificar a // configuração da chave dip atual, observando o valor de saída em uma matriz de // valores de comparação para cada configuração possível. Os valores na matriz de pesquisa podem // ser obtidos de uma execução anterior da configuração ou por meio de cálculos // com base nas equações subjacentes. // ------------------------------------------------ -------------------------------------- comparador interno [16] = {0, 111, 203, 276, 339, 393, 434, 478, 510, 542, 567, 590, 614, 632, 651, 667}; // Definir variáveis de processamento int dipPin = A0; // pino analógico para divisor de tensão input int dipIn = 0; // mantém a saída de tensão do divisor traduzida por analogRead int count = 0; // contador de loop int epsilon = 7; // intervalo de comparação meia largura bool dipFound = false; // verdadeiro se a saída do divisor de tensão atual for encontrada na tabela de pesquisa void setup () {pinMode (dipPin, INPUT); // configura o pino divisor de tensão como INPUT Serial.begin (9600); // habilita a comunicação serial} void loop () {delay (3000); // evita que a saída role muito rápido // Inicialize os parâmetros de pesquisa count = 0; dipFound = falso; // Lê e documenta a tensão de saída atual dipIn = analogRead (dipPin); Serial.print ("saída do divisor"); Serial.print (dipIn); // Pesquisar lista de comparação para o valor atual while ((count <16) && (! DipFound)) {if (abs (dipIn - comparator [count]) <= epsilon) {// encontrou dipFound = true; Serial.print ("encontrado na entrada"); Serial.print (contagem); Serial.println ("valor" + String (comparador [contagem])); pausa; } count ++; } if (! dipFound) {// valor não está na tabela; não deve acontecer Serial.println ("OOPS! Não encontrado; melhor chamar Ghost Busters"); }}

Etapa 3: planilha comparadora

Imagem
Imagem

Os cálculos para os 16 valores do comparador são dados na planilha mostrada acima. O arquivo Excel que acompanha está disponível para download na parte inferior desta seção.

As colunas A-D da planilha registram os valores do resistor da chave dip e as 16 configurações de chave possíveis. Observe que a chave DIP de hardware mostrada no diagrama de design fritzing é numerada da esquerda para a direita em vez da numeração da direita para a esquerda mostrada na planilha. Achei um pouco confuso, mas a alternativa não coloca a configuração "1" (0, 0, 0, 1) no primeiro da lista. A coluna E usa a fórmula 2 da seção anterior para calcular a resistência R equivalente do divisor de tensão1 para a configuração. A coluna F usa esse resultado para calcular a RATIO de resistência associada e, finalmente, a coluna G multiplica a RATIO pelo valor analogRead max (1023) para obter o valor de comparador previsto. As 2 colunas finais contêm os valores reais de uma execução do programa de demonstração junto com as diferenças entre os valores previstos e reais.

A seção anterior mencionou três métodos para obter um conjunto de valores de comparação, incluindo a extensão desta planilha se os valores do resistor forem significativamente alterados ou mais interruptores forem adicionados. Parece que pequenas diferenças nos valores do resistor não afetam significativamente os resultados finais (o que é bom, pois as especificações do resistor fornecem uma tolerância, digamos 5%, e o resistor raramente é igual ao seu valor declarado real).

Etapa 4: toque uma melodia

Toque uma melodia
Toque uma melodia

Para ilustrar como a técnica de comutação múltipla pode ser usada em um aplicativo, o programa de demonstração de comparação da seção "Explicação do método" foi modificado para implementar o processamento de seleção de melodia para o programa de caixa de música. A configuração atualizada do aplicativo é mostrada acima. A única adição ao hardware é uma campainha piezo passiva para tocar a melodia selecionada. A mudança básica no software é a adição de uma rotina para tocar uma melodia, uma vez identificada, usando a campainha e a rotina de tons do Arduino.

Os fragmentos de melodia disponíveis estão contidos em um arquivo de cabeçalho, Tunes.h, junto com a definição das estruturas de suporte necessárias. Cada melodia é definida como uma série de estruturas relacionadas às notas, contendo a frequência e a duração das notas. As frequências das notas estão contidas em um arquivo de cabeçalho separado, Pitches.h. O programa e os arquivos de cabeçalho estão disponíveis para download no final desta seção. Todos os três arquivos devem ser colocados no mesmo diretório.

A seleção e identificação procede da seguinte forma:

  1. O "usuário" define as chaves dip na configuração associada à melodia desejada
  2. a cada ciclo de loop de programa, o identificador para a configuração atual do dip switch é obtido via analogRead
  3. O identificador de configuração da etapa 2 é comparado com cada um dos comparadores na lista de sintonia disponível
  4. Se uma correspondência for encontrada, a rotina playTune é chamada com as informações necessárias para acessar a lista de notas da música

    Usando a função de tom do Arduino, cada nota é tocada pela campainha

  5. Se nenhuma correspondência for encontrada, nenhuma ação será realizada
  6. repetir 1-5

As configurações da chave DIP para as músicas disponíveis são mostradas na tabela abaixo, onde 1 significa que a chave está ligada, 0, desligada. Lembre-se de que a orientação da chave dip coloca a chave 1 na posição mais à esquerda (aquela associada ao resistor de 80K).

NOME Switch 1 Switch 2 Switch 3 Switch 4
Danny Boy 1 0 0 0
Ursinho 0 1 0 0
Leão dorme esta noite 1 1 0 0
Ninguém sabe o problema 0 0 1 0
Graça maravilhosa 0 0 0 1
Espaço em branco 1 0 0 1
MockingBird Hill 1 0 1 1

A qualidade do som de uma campainha piezo certamente não é ótima, mas pelo menos é reconhecível. Na verdade, se os tons são medidos, eles estão muito próximos da freqüência exata das notas. Uma técnica interessante usada no programa é armazenar os dados de ajuste na seção de memória flash / programa em vez da seção de memória de dados padrão usando a diretiva PROGMEM. A seção de dados contém as variáveis de processamento do programa e é muito menor, cerca de 512 bytes para alguns dos microcontroladores ATtiny.

Recomendado: