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)
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:
- Telefone analógico de impulsos
- Micro processador Raspberry Pi 3B + alimentação
- LED até 5V
- Resistência 10kΩ
- Resistência 100Ω
- Botão de pressão (normalmente aberto)
- Caixa SNESPI para Raspberry
- Cabo rede CAT6 (1.5m)
- Cabo multifilar 0.5mm
- Fichas 4 pinos (M e F)
- 7 fichas NSR femea
- 7 terminais NSR
- Solda, etc…
Código:
Sketch Processing: Pulse-dialing-player.pde





