Reconhecer e lidar com salto de contato sobre o pi framboesa

Video: 44 - O círculo e o número Pi - Matemática - Ens. Fund. - Telecurso

Você pode precisar lidar com salto de contato para o seu próximo projeto Raspberry Pi. Lendo um interruptor é bastante simples. Ele retorna um 0 ou um 1, dependendo se o interruptor for pressionado. Interruptores deve ser sempre ligado entre o / saída (GPIO) pino de entrada de entrada de uso geral e no solo e seja permitir que a resistência interna de pull-up ou corrigir uma resistência externa a eles. Quando um interruptor é fechado, ele faz um caminho para a terra. Você lê uma lógica baixa ou zero quando este caminho é feito.

Você pode ver outras modalidades onde um switch é conectado entre o pino de entrada GPIO e 3V3, mas isso não é recomendado porque os interruptores são normalmente em fios longos. Roteamento longos fios conectados à terra é menos arriscado do que se conectar a uma tensão de alimentação. Isto é como você ligar um interruptor.

Embora a mudança para terra com um resistor pull-up para uma alta tensão pode ler apenas 1 ou 0, a maioria dos switches são um pouco mais complexa. Por exemplo, levar uma bolsa de 1 libra de açúcar e soltá-lo a partir de cerca de 6 polegadas sobre uma superfície dura tal como uma mesa. Ela atinge a superfície com um baque e paradas. Agora tente a mesma coisa com uma bola de pingue-pongue, e você&rsquo-verá que ele salta. O primeiro salto do isn bola de pingue-pongue&rsquo-t tão alto quanto a altura que você deixou cair a partir, mas&rsquo-s bastante elevado. Em seguida, a bola cai e salta novamente, apenas um pouco menor. Este continua com menores e menores alturas de salto até que a bola vem para descansar. Note-se que quanto menor o salto, mais curto o tempo entre bounces- os saltos acelerar até que a bola vem para descansar.

Interruptor contatos são assim - eles&rsquo-re superfícies rígidas unindo rapidamente, e eles saltam. Tanto é assim que, se você examinar os níveis lógicos o interruptor dá para fora, você&rsquo-verá não é uma simples transição de uma alta para uma baixa, mas uma sucessão de transições cada vez mais perto juntos até um nível estável é atingido. Isso é conhecido como uma borda suja ou contacto de rejeição.

Esta rápida mudança de 0 para 1 pode ser um problema se o computador estiver olhando para o interruptor muito rapidamente. Na verdade, isso acontece muito mais rapidamente do que um usuário pode pressionar um botão, mas às vezes as circunstâncias ou código vai deixar isso acontecer. Para ilustrar o problema, veja o seguinte código, ligar um interruptor de entre GPIO 2 (pino 3) e de terra (pino 6). Este pino tem um resistor pull-up montada na placa.

# Bounce Problema mostra contacto salto # Autor: Mike Cookimport wiringpi2 timeimport como ioio.wiringPiSetupGpio () io.pinMode (2,0) # para inputlastPress = io.digitalRead (2) count = 0pressTime = time.time () print"botão de teste"while True: press = io.digitalRead (2) se pressionar == 0 e lastPress = imprensa: count + = 1pressTime = time.time () se a contagem gt; = 5: impressão"cinco prensas"count = 0lastPress = imprensa

A técnica usada aqui é contar cinco prensas interruptor e, em seguida, imprimir quando o computador tem contado todos eles. Se você tentar fazer isso, você pode achar que ele imprime que detectou cinco prensas após quatro ou até três prensas, bem como todos os cinco. Em suma, não é confiável, porque salto de contato está causando contagens erradas.



Para investigar esta mais profundo, você precisa medir o intervalo entre as prensas. Isso é feito com o seguinte código.

# Bounce Measure # medidas tempo de contato intervalo # Autor: Mike Cookimport wiringpi2 timeimport como ioio.wiringPiSetupGpio () io.pinMode (2,0) # para inputlastPress = io.digitalRead (2) intervalo count = 0startTime = time.time () = [0.0,0.0,0.0,0.0,0.0] print"botão de teste"while True: press = io.digitalRead (2) se pressionar == 0 e lastPress = imprensa: intervalo [contador] = time.time () - startTimecount + = 1startTime = time.time () se a contagem gt; = 5: impressão"cinco prensas ", Intervalcount = 0startTime = time.time () lastPress = prima

O intervalo entre cada imprensa chave é gravado em uma lista. Esta é derivado do relógio do sistema e conta o número de segundos desde que o sistema inicializado. Subtraindo a hora do sistema a partir do momento da imprensa atual, você obter o tempo desde a última imprensa. O resultado da execução deste programa é mostrada aqui:

cinco prensas [1.2872810363769531, 0.25738978385925293,6.198883056640625e-05, ,27149009704589844, 6.699562072753906e-05] cinco prensas [2.247836112976074, 0.31453490257263184,0.32202887535095215, 0.2885620594024658, 0,33057308197021484] cinco prensas [1.048125982284546, 3.504753112792969e-05,0.5636959075927734, 0,43523192405700684, ,4095041751861572] cinco prensas [14,676625967025757, 0.24735713005065918,0.24397802352905273, ,33951711654663086, ,34607601165771484]

Observe que o código não faz nenhuma tentativa para reduzir o número de bits significativos nas leituras, mas ter um olhar mais atento sobre alguns deles, e você&rsquo-verá que alguns final com um e-05. Essa é a maneira padrão de dizer 10 elevado à potência de -5 isso é conhecido como o formato de expoente e é a maneira padrão de números de ponto flutuante são mostrados na maioria da computação. Então, esquecendo o número ridículo de lugares após o ponto decimal, este número, 6.12e-05, é interpretado como 0.0000612 ou 61,2 microssegundos (EUA), que é muito mais rápido do que qualquer ser humano pode pressionar qualquer coisa. Este é um exemplo de salto de contato. você não&rsquo-t ver cada salto porque o computador apenas amostras o nível lógico da linha em intervalos discretos.

A maneira de evitar que isso aconteça é a introdução de um tempo morto - isto é, ignorar o interruptor por um tempo específico após uma imprensa ocorreu. Em muitas ocasiões, isso vai acontecer naturalmente, porque você pode ter uma declaração de impressão ou algum outro código que leva um pouco de tempo antes de o interruptor é olhado de novo. Se não, uma solução simples seria adicionar um atraso de apenas após o interruptor foi detectado para que nada seja feito durante o potencial tempo de ressalto.

No entanto, para o debounce final, você precisa fazer uma nota do tempo uma transição chave é detectado. Então, quando uma outra transição é detectado, apenas a tratá-lo como real, se um tempo específico tenha decorrido entre o último transição real e o tempo presente. Um exemplo disto é mostrado na seguinte código.

Video: 2(Pi)rad

# Bounce Solução # Como lidar com a rejeição # Autor: Mike Cookimport wiringpi2 timeimport como ioio.wiringPiSetupGpio () io.pinMode (2,0) # para inputlastPress = io.digitalRead (2) count = 0pressTime = time.time () print"botão de teste"while True: press = io.digitalRead (2) se pressionar == 0 e lastPress = imprensa e (time.time () - pressTime) gt; 0,025: count + = 1pressTime = time.time () se a contagem gt; = 5: impressão"cinco prensas"count = 0lastPress = imprensa

Aqui o segredo é o teste extra no E se declaração que verifica que pelo menos 25 milissegundos (ms) ter decorrido antes de uma transição é tida como real.

Diferentes tipos de interruptores mecânicos saltar a um grau diferente. Dependendo exatamente o que seu código é e quão rápido ele é executado, este pode ou não ser um problema. Se você fizer experiência &ldquo-fantasma&rdquo- transições na leitura de um interruptor mecânico,&rsquo-s provável que seja salto de contato. Se assim for, você pode usar uma das técnicas descritas aqui para eliminar o efeito.


Publicações relacionadas