Raspbian discador de pulsos – player

Este artigo descreve o desenvolvimento de um leitor de impulsos telefónicos e tocador de samples audio (poemas – cada digito um poema). Um desafio que me foi lançado por Carlos Moura-Carvalho, autor da ideia, para instalação artística em 3 estabelecimentos comerciais de conceito cultural em Lisboa.

A sinalização decádica era utilizada para o envio de informações – dados numéricos, ou mais simplesmente código binário – do telefone para as centrais telefónicas automáticas.
Originalmente esta sinalização é gerada por um “disco” que abre e fecha o circuito periodicamente, gerando uma série de impulsos conforme o número selecionado no disco telefónico.

Esta era a tecnologia telefónica na minha juventude, o que aumentou o entusiasmo de abraçar o projeto.

ESTUDO INICIAL:

Para além de conhecer bem o sistema destes telefones desde jovem, a ideia de um leitor-intérprete de impulsos não me pareceu difícil de conseguir através dum microprocessador como o Arduíno ou Raspberry Pi, programando rotinas de contagem de alteração de estado nas portas de entrada. Por outro lado, ao estudar melhor a questão, relembrei que estes aparelhos eram alimentados por corrente eléctrica através da linha, entre 2.5V e 5.5V, valores muito próximos dos utilizados pelos controladores Arduíno e Raspberry, no entanto para geral impulsos de toque tem condensadores que geram picos de 250V para arranque das campainhas. Para simplificar, não correr riscos e como não tinha propósito de fazer tocar as campainhas do telefone optei por fazer uso das ligações diretas internas para obter os pulsos analógicos simples de interrupção/continuidade de forma passiva. Desta forma descartei a possibilidade de usar o circuito interno e usar somente a mecânica do disco de impulsos.


Depois de perceber o circuito, e de fazer medições de valores de resistência, revelou-se que alterando as ligações nas portas de saída teria o que necessitava: O envio dos impulsos para o Pi e o retorno do som para o auscultador através de um único cabo. Precisei portanto de 4 condutores pelo que escolhi cabo de rede cat6 (6 condutores), o comprimento necessário é curto pelo que o isolamento de interferência é dispensável.

PLANO DE HARDWARE:

  • Porta para leitor de impulsos
  • Porta para auscultador (pretendia ligações internas, sem cabos exteriores, pelo que soldei contactos nos condutores da caixa TRS de 3.5mm do audio analógico)
  • Alimentação para ventilador
  • Porta para LED de estado
  • Porta para interruptor shutdown (para encerrar diariamente o sistema sem problemas de memória flash)
Esquema

Adicionei uma pequena resistência de 10KΩ na porta do leitor de impulsos para garantir que o valor em estado aberto seja praticamente infinito.
O facto de não existirem ligações internas ao audio analógico fez-me sugerir à comunidade Raspberry que se inclua numa próxima atualização essa particularidade. Seria muito bem vinda por parte dos utilizadores e será muito simples de incorporar, quase sem custos adicionais.
O ventilador de refrigeração vinha com a caixa SNESPI o que garante tranquilidade para operar durante o verão. O aumento de consumo de corrente é muito pequeno (100mA). Como tal optei por ligação direta, sem configurar nenhum controlador de velocidade/temperatura.

O desligar do sistema poderia, esse sim, criar problemas, pois o Raspberry não tem interruptor, o projeto não incluí ecrã, nem interfaces de acesso e o corte de corrente poderia acontecer quando algum fluxo ao cartão SD decorre levando à perda de informação. Já me aconteceu numa instalação vídeo-art, felizmente estava perto e pude substituir rapidamente o SD de sistema pelo de salvaguarda. Então com base neste projeto adicionei um botão de Shutdown que acciona uma rotina de fecho do sistema e desliga todo o software.
Somos avisados por um LED, que se apaga quando encerra, e sabemos quando podemos desligar a corrente. foi baseado neste outro projeto com umas pequenas alterações.

 

_________________

A segunda fase dirigiu-se para a criação do software para comunicação com as portas do Raspberry (3B), para isso teria que resolver as seguintes questões:

SOFTWARE:

  • Programa leitor de impulsos e sample player.
  • Inicio do leitor de pulsos com um auto-run logo após iniciar o sistema operativo.
  • Permitir a utilização de uma pen USB para posterior alteração dos samples audio.
  • Rotina do botão de shutdown e do LED de aviso.

O Sistema operativo que usei foi o Raspbian (2019-04-08-raspbian-stretch), disponho mais pormenores de configuração do Raspbian neste artigo: Raspberry Pi Tips.
Poderia ter utilizado a versão Raspbian sem interface visual, mais leve mas de qualquer forma apenas configurei gráficos na fase inicial para ter feedback à medida que depurava o código. A partir daqui eliminei todo o processo gráfico dentro do sketch..
O programa contador de impulsos foi feito em Processing porque estou mais confortável com a linguagem (Java / C / C++) e teve de ser construído praticamente de raíz. Encontrei poucos exemplos de rotinas que resolvessem a questão dos ciclos de contagem. Precisava de vários passos de confirmação dos gestos feitos pelo utilizador apenas com leitura nos impulsos, ou seja:

1. Espera 1 (modo OFF);
2. Levantar o auscultador;
3. Emitir sinal de presença;
4. Espera 2 (modo ON);
5. Marcar uma série de impulsos;
6. Verificar que a série terminou;
7. Usar o último valor da série para disparar o respetivo sample;
8. Recomeçar a espera 2. ou
9. Encerrar – iniciar a espera 1.

Mais baixo deixo o programa, que é auto-explanatório, no entanto abordo a questão de como resolvi a contagem através de ciclos de espera:

A primeira rotina verifica se o auscultador está no descanso (GPIO.HIGH).
Se confirmar aumenta a variável off_time e reinicia a variável on_time.
Segunda rotina verifica se off_time é superior a 20 (valor que calculei acima do intervalo dos impulsos do discador):
– se sim assume que desligaram o telefone, pausa o som de presença e reinicia as variáveis flag, count e off_time;
– se não for superior a 20 e a flag for igual a 0, aumenta o contador count flag passa a 1 (verdadeiro) .

if (GPIO.digitalRead(4) == GPIO.HIGH) {
off_time++;
on_time = 0;

if (off_time >= 20) { // more than 20: DOWN

  if (playertone.isPlaying()) {
    playertone.pause();
  }
  flag = 0;
  count = 0;
  off_time = 20; // stop adding numbers
}

if (off_time < 20) { // less then 20: COUNT
  if (flag == 0) {
    count ++;
    flag = 1;
  }
}
}

Se o auscultador estiver levantado (GPIO.LOW), então passa a falso a variável off_time e flag. Verifica se o tempo entre on e off foi maior que 20 e passa o valor do contador count para a variável que escolherá o sample audio a tocar switchPoema.

if (GPIO.digitalRead(4) == GPIO.LOW) {
      off_time = 0;
      flag = 0;
      } 
 if (on_time > 20) {
      on_time = 0;
      }
    on_time++;

    if (on_time > 10) {
      switchPoema = count;
      count = 0;
    }

 

O restante código pode ser visto no próprio ficheiro e tem comentários nas rotinas. Deixo aqui o resumo e anexos:

Materiais:

Código:

Sketch Processing: Pulse-dialing-player.pde

Aspeto final da caixa, com a ficha de 4 contactos, LED e o interruptor.