Intercettare tastiera IR di Telecom

Questo circuito converte i segnali ricevuti da una tastierina ad infrarossi della Telecom in dati ASCII inviati su una porta seriale RS232 ; l’uscita può essere collegata, per esempio ad una porta seriale di un PC, usando così la tastierina remota come terminale d’ingresso seriale. Il progetto è stato pubblicato a mio nome sulla rivista CQ Elettronica nell’Ottobre 2006 con il titolo “Intercettare la tastierina a infrarossi per SMS di Telecom”. Nella foto sottostante, il circuito montato :

La tastierina Telecom, per l’invio degli SMS da un telefono fisso predisposto all’uso ; è alimentata da tre pile ministilo da 1.5V ed ha una portata utile di diversi metri :

Il file Ottobre06.zip , disponibile per il download, contiene :

– lo schema elettrico
– il master per il circuito stampato in scala 1:1
– il piano di montaggio
– il file HEX per programmare il microcontrollore Z86E04

Per ulteriori particolari, consultare la rivista o la mia pagina delle pubblicazioni.

Allego il sorgente di un file in C, che può essere usato sotto DOS per reindirizzare i caratteri provenienti dalla porta seriale COM2 sul buffer per la tastiera di sistema. Con questo trucco, i caratteri provenienti dal circuito verranno considerati dal PC come se fossero stati premuti sulla vera tastiera di sistema, quella connessa alla porta PS/2 o DIN. Il programma, ovviamente, funziona SOLO sotto DOS, vero DOS, non una finestra DOS di Windows 🙂

#include <dos.h>
#include <conio.h>

const int dbr = 0x2f8;
const int dll = 0x2f8;
const int dlm = 0x2f9;
const int lcr = 0x2fb;
const int mcr = 0x2fc;
const int lsr = 0x2fd;
const int msr = 0x2fe;
const int ien = 0x2f9;

void interrupt (*savold)(void);

void interrupt Sercom2(void)
{
unsigned int far *kbd_buf;
unsigned int k;

    kbd_buf = MK_FP(0x0000, 0x0400);
    k = inportb(lsr);
    k = kbd_buf[0x1c/2];
    kbd_buf[k/2] = inport(dbr);
    k += 2;
    if(k == 0x3e)
        k = 0x1e;
    kbd_buf[0x1c/2] = k;
    outportb(0x20,0x20);
}

void Cominit (unsigned int speed, unsigned int dabit,
              unsigned int stobit, unsigned int parity)
{
int quot;

    disable();
    outportb(0x21, inportb(0x21) & 0xf7);
    quot = (short)(115200 / speed);
    outportb(lcr, 0x80);
    outportb(dll, quot % 256);
    outportb(dlm, quot / 256);
    if(parity > 1)
        parity = 3;
    outportb(lcr, (parity << 3) + ((stobit -1) << 2) + (dabit -5));
    inportb(dbr);
    outportb(mcr, 0x0f); /* set DTR and RTS */
    inportb(mcr);
    outportb(ien, 1);
    savold = getvect(11);
    setvect(11, Sercom2);
    enable();
}

extern unsigned _heaplen = 1024;
extern unsigned _stklen  = 512;

int main(void)
{
    clrscr();
    printf("ROBOTOP 2004\n");
    printf("Serial input COM2 redirect to keyboard buffer.\n");
    Cominit(2400,8,1,0);
    keep(0, (_SS + (_SP/16) - _psp));
    return 0;
}