Clock with binary display / Orologio con display in binario

Binary Clock, built with Microchip PIC16F676 (or PIC16F630).
The hours are displayed with 4 LEDs which are (from left to right) 8,4,2,1; so hours are shown from 1 to 12 (no am and pm).
The minutes are displayed with 5 LEDs that are (from left to right) 40,20,10,5,0; in practice, they show in 5 to 5 way and the exact hour (minute 00) turns ON led 0, because I don’t like to have the minutes row completely OFF.
For viewing the time, press shortly the button. Hours and minutes are shown for 3 seconds, then the LEDs are off.
To adjust the time, press and hold down the button until the top row only turns ON and leds begin a binary counting from 1 to 12.
When you reach the desired time, release the button. After a time of 5 seconds, the display automatically shows the minutes and pressing the button, they advance with the binary counting (5 min steps). When you reach the desired minutes, release the button.
Again, after a time of 5 seconds both the led rows turns ON to show hours and minutes (the seconds are cleared automatically), and everything is shut down. The time has been set. The file binwatch.zip contains the wiring diagram in PDF format and the object file (Hex) to program the micro.

The C source was compiled with CC5X Version 3.2I, Copyright (c) B Knudsen Data,Norway 1992-2005 (free edition). If you want to take a look at C source code, click this link.

The prototype: back and front views

This is the PCB diagram (just small image, but a link to PDF 1:1 scale is provided)

For a full size 1:1 PDF, click this link

Note that the circuit uses conductive vias.

Orologio con display binario, realizzato con Microchip PIC16F676 (oppure PIC16F630).
Le ore vengono visualizzate con 4 led che valgono (da sinistra a destra) 8,4,2,1; vengono mostrate quindi le ore da 1 a 12 (niente am e pm). I minuti sono visualizzati con 5 led che valgono (da sinistra a destra) 40,20,10,5,0 . In pratica i minuti vengono mostrati di 5 in 5 e lo scoccare dell’ora (minuti 00) fa accendere il solo led 0, questo perché mi sembra brutto lasciare del tutto spenta la riga dei minuti. Per ottenere la visualizzazione dell’orario, si preme brevemente il pulsantino. Le cifre vengono mostrate per 3 secondi, quindi i led vengono spenti. Per regolare l’ora si tiene premuto a lungo il pulsante fino a quando si accende solo la riga superiore (ore) e i led cominciano un conteggio binario da 1 a 12. Quando si raggiunge l’ora desiderata, si lascia il pulsante.
Trascorso un tempo di 5 secondi, il display mostra automaticamente i minuti e premendo nuovamente il pulsante, questi avanzano con il conteggio binario (si regola, quindi di 5 min in 5 min). Quando si raggiunge il minuto desiderato, lasciare il pulsante. Dopo un tempo di 5 secondi i led si accendono a mostrare ore e minuti (i secondi vengono azzerati automaticamente) e infine tutto si spegne. L’orario è stato regolato.
Il file binwatch.zip contiene lo schema elettrico ed il file oggetto .hex per programmare il micro.

Il codice sorgente in C è stato compilato con CC5X Version 3.2I, Copyright (c) B Knudsen Data,Norway 1992-2005 (free edition). Se desiderate dare un’occhiata al codice sorgente in C dell’applicazione, cliccate questo link.

binwatch_sch

schematic diagram ; click the image to enlarge. A PDF version is included in the downloadable ZIP file

 

Roman numerals clock : orologio LCD con numeri romani

Questo circuito che vi propongo, basato su micro ATtiny2313, realizza un orologio LCD con numeri romani.

Il prototipo del circuito, realizzato su una scheda millefori.

Il prototipo del circuito, realizzato su una scheda millefori (segna le 17:20)

Alla prima accensione mostra una schermata lampeggiante con la scritta “Tempera tempus” per ricordare che si deve effettuare la regolazione.

Le fasi della regolazione dell'ora

Il display in fase di richiesta regolazione (prima riga) e nelle fasi di visualizzazione (ultime due righe). La scritta “et” lampeggia con cadenza 1 secondo.

La regolazione si effettua mediante questa procedura :

1) Premere e tenere premuto il pulsante per circa 3 secondi ; sullo schermo appaiono le ore ; rilasciare il pulsante.
2) Premere nuovamente il pulsante e tenerlo premuto ; le ore avanzano da “I” a “XXIV” ; rilasciare il pulsante sull’ora giusta.
3) Attendere circa 3 secondi ; sullo schermo appaiono i minuti.
4) Premere nuovamente il pulsante e tenerlo premuto ; i minuti avanzeranno da “nulla” a “LIX” ; rilasciare il pulsante sui minuti giusti.

Non essendoci una batteria, l’orologio non mantiene l’ora se va via la corrente. Ogni volta che si stacca l’alimentazione, alla riaccensione verrà visualizzato il messaggio che ricorda di effettuare la regolazione. Nella figura sottostante potete vedere lo schema elettrico. Per una visione più dettagliata, scaricate il PDF dal link indicato nella didascalia.

il file PDF può essere scaricato da questo link

Cliccare l’immagine per ingrandirla ; il file PDF può essere scaricato da questo link

Il display LCD che ho utilizzato, purtroppo, necessita di una tensione negativa su Vo per ottenere il massimo contrasto. Ho usato un pin del micro per generare un’onda quadra e il circuito in basso a sinistra nello schema (transistor, condensatori e diodi) per ottenere tale tensione. In caso di display LCD “normali”, cioè in grado di funzionare bene anche con sole tensioni positive, tale circuito diventa inutile e può essere eliminato.

Nel file ef162.zip scaricabile a questo link sono contenuti :
– schematic.pdf , lo schema elettrico del circuito
– roman.hex , il file HEX per la programmazione del micro
– fuses.txt , il file di testo con la configurazione dei fusibili del micro per questa applicazione.

Se desiderate dare un’occhiata al codice sorgente in C dell’applicazione, cliccate questo link.

RxMet1 – ricevitore per sensore esterno Hygro-Thermo a 433 MHz

Questo circuito permette di ricevere i dati trasmessi da un sensore Oregon Scientific modello THGR228NF (visibile nella figura sottostante) in radiofrequenza a 433 MHz.

sensor-THGR228NFIl circuito è stato pubblicato (a mio nome) sulla rivista CQ Elettronica nel numero di Settembre 2007 (consultare la rivista per maggiori dettagli).

Il microcontrollore utilizzato è un Atmel ATtiny2313 ; lo schema è visibile qui sotto:

Per una visione nitida, scaricare il PDF da questo link

Cliccare l’immagine per ingrandirla ; il file PDF può essere scaricato da questo link

Nella prossima immagine si può vedere il prototipo del circuito con i componenti montati :

rxmeteoIl circuito stampato è visibile nell’immagine qui sotto ; ovviamente, per realizzare un circuito mediante fotoincisione, bisogna stampare l’immagine in scala 1:1 e pertanto è opportuno scaricare il file PDF raggiungibile tramite il link nella didascalia dell’immagine.

stampato

Il file PDF in scala 1:1 può essere scaricato da questo link

Infine, nella prossima immagine si può vedere la disposizione dei componenti sul circuito.

montaggio

Il file contenente l’elenco dei materiali, il codice HEX da scrivere sul micro ed i batch files per settare il clock esterno e per effettuare la programmazione dell’ATtiny2313 (tramite il programma freeware SP12), può essere scaricato da questo link. Se desiderate dare un’occhiata al codice sorgente in C dell’applicazione, cliccate questo link.

I dati in uscita dal circuito sono “grezzi”, cioè rappresentano in Ascii l’insieme di bits ricevuti dal sensore, raggruppati in notazione esadecimale. Nella figura sottostante, i dati ricevuti dal sensore sono mostrati nel riquadro a sfondo verde (quello in alto, per i daltonici..) mentre la “traduzione” in temperatura e umidità sono nel riquadro a sfondo blu (quello in basso).

Screenshot del programma su PC per la visualizzazione dei dati

Screenshot del programma su PC per la visualizzazione dei dati

Ho realizzato il programma in VB6 ; chi fosse interessato può scaricare il file d’installazione da questo link. Ricordo che il programma è offerto gratuitamente a scopo di test e non ha alcuna clausola di garanzia e nessuna assunzione di responsabilità da parte mia per eventuali danni o malfunzionamenti.

Il “cuore” di questo programma è una DLL (libreria) scritta da me per decodificare il protocollo di trasmissione del sensore. Chi volesse scrivere un proprio programma per visualizzare i dati forniti dal sensore, potrà usare liberamente tale DLL scaricandola da questo link e inserendola nel proprio programma. Di seguito, un esempio di come utilizzare la DLL in un programma VB6 per decodificare la stringa di dati “grezzi” ricevuti dal sensore in valori leggibili di temperatura e umidità:

// declare the convert function
Private Declare Function RawConvert Lib "meteo.dll" (ByVal text As String) As String

// use the function
//  rxraw contains the full ascii string received from RxMet1
//  rxd contains the decoded Temperature and Hygro
dim rxd as string
dim rxraw as string

    rxd = RawConvert(rxraw)

Nota: questo materiale fu già pubblicato su un mio vecchio sito (ora cancellato) e venne citato da “Hack-a-day” nel settembre del 2007.

Oscillogio – orologio su oscilloscopio

Questo progettino consiste in un orologio digitale che ha la particolarità  di avere come display un oscilloscopio ! Viene utilizzata SOLO la modulazione sull’asse Y, quindi si può utilizzare qualsiasi tipo di oscilloscopio, anche uno vecchio (e stanco). Questo progetto è stato pubblicato (a mio nome, naturalmente !) sul numero di Giugno 2007 della rivista CQ Elettronica (Edizioni CD). Il circuito è basato sul micro Atmel ATtiny2313 oppure AT90S2313 (vecchia versione). Se si usa la nuova versione, bisogna avere l’accortezza di programmare i “fuses” interni affinché venga utilizzato l’oscillatore quarzato esterno e non quello libero interno.

Ecco il circuito con l’alimentazione a 3V ricavata da due normali batterie AA.

Nel documento zip scaricabile da questo link troverete i files “batch” per programmare memoria flash e “fuses” del micro usando il programma freeware SP12.

Il file giugno07.zip contiene:
– schema.pdf – lo schema elettrico in PDF
– stampato.pdf – il circuito stampato in scala 1:1 formato PDF
– lista_materiali.txt – la lista dei materiali
– montaggio.jpg – lo schema di posizionamento dei componenti
– ckscope.hex – il file HEX per programmare il micro
– tinySetClock.bat – il file “batch” per programmare i “fuses”
– wrProg.bat – il file “batch” per programmare la flash

Aggiornamento 20 Ago 2017: nel vecchio articolo pubblicato a questo link: http://ficara.altervista.org/pages/ef_avroscillo/avroscillo.htm troverete anche il codice del programma sorgente in C.


Digital clock that uses a single channel oscilloscope as display. Only the ‘Y’ axis modulation is used, so every old (and tired) oscilloscope can be used. This project was published (by me, of course !) on the 2007 June issue of italian magazine “CQ Elettronica”. The circuit is based on popular ATtiny2313 or AT90S2313 microcontroller. If you plan to use the new one (the ATtiny2313) please remember to program the fuses for external xtal oscillator. In the downloadable zip document at this link you can find the batch files to program the memory and the fuses of the microcontroller using the SP12 free tool.

File giugno07.zip contents:
– schema.pdf – the electric schematic in PDF format
– stampato.pdf – the PCB layout in 1:1 scale
– lista_materiali.txt – the bill of materials
– montaggio.jpg – the components mounting map
– ckscope.hex – the HEX file to burn the micro
– tinySetClock.bat – the batch file for micro’s fuses programming
– wrProg.bat – the batch file for micro’s memory programming

Update Aug, 20, 2017: in the old article published at this link: http://ficara.altervista.org/pages/ef_avroscillo/avroscillo.htm you can find the souce code of the program in C.


RFID reader for 125 KHz tags, RS232 output (also works as electronic lock)

This circuit, based on Atmel micro ATtiny2313, reads RFID tags at 125 KHz. The code of the first tag read after micro burning is stored in the internal earom and then causes a pulse of about one second on relay contacts every time that tag is placed near the reader. This makes it possible to realize a simple and touchless electronic lock. The stored tag, and every other tag that’s placed near to the reader, also cause the serial output of the inside code, in ASCII format, allowing to implement a generic reader for access control. This circuit was published by me on the magazine CQ Elettronica in the May 2009 issue and entitled “RFID reader 125KHz”; consult the magazine for more details on the circuit and implementation.

Want to take a look at C source file ? Click here

To burn the micro, the freeware SP12 has been used, in the versions for WinXP or Win2K. The batch files included in downloadable ZIP require the use of this software for programming the micro (you can easily find it with a Google search). If you have another tool for micro burning, the configuration for fuses in the application described is the following :

// CONFIGURATION Fuses: Ext = 0xFF High = 0xC9 Low = 0xDF
// Note: SP12 High Fuses used in only 6.1 bits, so 0xC9 (11001001) becomes 0x24 (100 100)

The downloadable file EF150.zip contains:
–  schematic.pdf – electric schematic in PDF format
– top.pdf – Printed circuit board layout (single sided) in PDF 1:1 scale
– topprint.pdf – layout of components on the circuit
– rfid.hex – compiled HEX file ready to be burned into the micro
– wrFuses.bat – batch file to program the micro fuses
– wrProg.bat – batch file to start the firmware programming
– wrEarom.bat – batch file to overwrite the earom (stored tag)
– ef150pic.jpg – photos of the circuit mounted
– interfaces.gif – a couple of circuits to interface the card to a PC or a micro
– earom.txt – text file containing the 5 bytes to erase key tag in earom

Added Ago 30 2009
Coil has 105 turns of 0.2mm wire wound on 30mm diameter support; in the prototype I used the neck of a plastic bottle, visible in the figure.

Added Feb 28 2010
Note: The driver SN75176 is used ONLY as power driver, but the circuit works even if you remove the chip and simply put a jumper between pins 4 and 6 of the 8 pin socket. Obviously, the driver makes more “relaxed” the microcontroller’s output pin PB2.
Added Mar 1 2010
Note: You can browse the SP12 AVR programmer project at this site/url:
http://www.xs4all.nl/~sbolt/e-spider_prog.html.
Added Mar 2 2010
Oops, someone noticed that the circuit’s picture shows an ATTiny2313V-10PU cpu; well, the right chip is the one that’s in the circuit’s schematic diagram: the ATTiny2313-20PU. The last one, in fact, can run with the 16 MHz crystal needed by the application, while the first one is guaranteed only up to 10 MHz. The reason for the 10 MHz version mounted on board is (simply) that I didn’t own the fast version and tried (successfully) with the slow one. Ok, DON’T LOOK at the picture, look at the schematic diagram !!!

Added Sep 10 2010
The active range is about 3 cm with the coil shown in figure. Better results can be obtained modifying the coil diameter (and the number of turns, obviously).

Recently, I have done a personal version of RS232 (or USB-RS232 converter) programmer for ATtiny2313 micro using only 74HC00 as active part; if you like to use my own Atmel AVR programmer for ATtiny2313 burning, this is the map for fuses :

P.O.V. – Auguri rotanti

Questo circuito genera la scritta “AUGURI” a matrice di punti, ma utilizzando solo una striscia di 7 (oppure 8) LED. Grazie alla P.O.V. (Persistence Of Vision), cioè l’effetto ottico di persistenza delle immagini sulla retina, basta far roteare la scheda (fissata, come si vede, su un bastoncino di legno con un perno in forndo), per vedere “apparire” la scritta. E’ possibile personalizzare il messaggio modificando in modo opportuno i valori scritti nella memoria dati. Pubblicato a mio nome sulla rivista CQ Elettronica Aprile 2007 con il titolo “Auguri rotanti”; consultare la rivista per maggiori dettagli.

Il microcontrollore utilizzato è un ATtiny2313 in SMD; lo schema in formato PDF è disponibile nel file scaricabile a questo link , insieme al resto della documentazione.

Il file Aprile07.zip contiene :
– sch.pdf – lo schema in formato PDF
– cs.pdf – il disegno del master in PDF stampabile in scala 1:1
– striscia.hex – il file compilato pronto per essere trasferito sul micro
– earom.txt – il file che contiene i dati per accendere la scritta AUGURI
– wrDati.bat – il file batch per avviare la programmazione dei soli dati (scritta)
– wrProg.bat – il file batch per avviare la programmazione del firmware e dei dati

Programmer for Atmel ATtiny2313 (and others)

Simple programmer for Atmel AVR micro ATtiny2313. The only integrated circuit used is the 74HC00 (or 74HC132), then no pre-programmed element is needed to operate. The programmer can be connected to RS232 serial port or USB to RS232 converter. The control program for Windows is freely available for download, while the VB6 full sources, easily modifiable / expandable to meet other types of micros, can be obtained on request. My circuit has been published (in italian language, of course) on “CQ Elettronica” magazine in May 2010 issue. Look at the magazine for more details about the circuit and software operations.

The freely downloadable zip available at this link contains:
– Schema.pdf ; the electric diagram
– Top.pdf ; the PCB board design in 1:1 scale
– Foto.jpg ; the picture of the circuit mounted
– Atprog-install.zip ; the setup for Windows application

Note: For installation on Win98SE, you may need to download from the Microsoft website the latest Visual Basic Runtime 6 (VBRun60sp6.exe).

Questions and answers:
2010, Oct 25
Question:
I have built your Simple Attiny2313 Atmel AVR Programmer. When I run it it comes back with a communication Error. Check the Clock or Power Supply. I am using a 5 volt DC Power supply. Also I couldn’t get a 74HC132 chip, and am using a 74LS132 chip, could this be the problem. Also I made up A serial Cable. Could you please let me have your DB9 Wiring for this Cable to fit your unit. DB9 to DB9.
Thanks
Neil

Answer:
Hello Neil. First of all, use HC series IC ; if you can’t find the 74HC132, please use a 74HC00 but NOT an LS series IC. This can’t work ‘cause the different input impedence makes the delay circuit timings out of specifications.
As second, make sure that the programmer circuit and the microcontroller under programming are both powered with the same supply (5V or 3V). The microcontroller MUST be powered to work !
Third: be sure that the microcontroller has its own oscillator connected to xt pins if you programmed the internal fuses for external clock !
The serial port connections are standard, you can attach a flat cable male / female connector to your PC. Look at the circuit schematic for details.
Hope this helps… bye
Emilio

Nokkiero – telecomando via SMS con un vecchio cellulare Nokia 5110

Telecomando via SMS.
Utilizza un telefonino Nokia 5110 come ricevitore e può controllare fino a 7 relè. La ricezione può essere abilitata con chiamata proveniente da qualsiasi telefonino o solo da uno specifico numero. I comandi inviabili sono 3: ON, OFF e PULSE. Pubblicato a mio nome sulla rivista “Fare Elettronica” (Edizioni Inware) Febbraio 2004 con il titolo “Nokkiero, telecomando via SMS”.
Il file scaricabile gratuitamente nokkiero.zip contiene:
inthebox.jpg – una foto del dispositivo inserito in una scatola
main.s19 – il codice in formato S19 Motorola per programmare il micro
prognote.txt – avvertenza per chi programma un micro OTP
schematic.pdf – lo schema elettrico del circuito in formato PDF
Per i particolari, consultare la rivista.

Remote control via SMS.
Using an old Nokia 5110 GSM phone as receiver and 68HC05 micro, you can control up to 7 relays. The activation can be selected as free (from any calling number) or limited to a specific phone number stored in memory. The commands available are 3: ON, OFF and PULSE. Each command can be directed to relays 1 to 7. It was published by me on the italian magazine “Fare Elettronica” in the Feb 2004 issue.
The freely downloadable file nokkiero.zip contains:
inthebox.jpg – a picture of the circuit placed in a box
main.s19 – the Motorola S19 code needed to burn the micro
prognote.txt – special not for programming an OTP chip
schematic.pdf – the electronic diagram in PDF format
For additional informations, look at the magazine.

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;
}

Midi Expander con scheda audio ISA

139cirpic

Basato su micro PIC18F4320, questo circuito permette di realizzare un piccolo expander MIDI con una scheda audio per bus ISA. Testato su 2 diversi circuiti, dovrebbe funzionare per qualunque scheda compatibile ADLIB (l’indirizzo di I/O DEVE essere 0x388). Il software (in questa prima release) risponde a comandi MIDI sul canale 1. I suoni sono generati per mezzo del sintetizzatore FM presente sul chip della scheda audio. Nelle prossime versioni i preset degli strumenti saranno caricati nella earom del micro, invece che nella memoria programma, in modo da consentire esperimenti per la creazione di timbri personalizzati.
I preset possono essere cambiati tramite MIDI dal numero 1 al 16.
Il file scaricabile ef139.zip contiene lo schema del circuito in formato PDF, il file oggetto .hex per programmare il micro e un programma di prova che permette di verificare su un PC se una scheda audio è compatibile con il circuito. Nota: quest’ultimo programma funziona SOLO in modalità DOS reale, non in una finestra DOS di Windows.

139alimpic

L’alimentazione viene ricavata da due trasformatori a uscita variabile di basso costo, regolati sui 9 Volt (in effetti l’uscita è prossima ai 12V).

Look at this short demo video to see the circuit working. Note that it’s in my personal version of english language 🙂 Sorry for that…

pic-isa-midiexp di robotop

Note: I recently added a zip file called midisrc.zip with all the C files used in this project. The C syntax is not very clean, ‘cause I translated the program from the original one I wrote many years ago in Assembly language for a different microcontroller ; for such reason you can read some “goto” instruction… it’s not elegant for a C program, but was useful for quickly translation from asm. 😉

Based on micro PIC18F4320, this circuit makes possible to realize a small MIDI expander using an old ISA-BUS soundcard. Tested on 2 different cards, it should work for any card ADLIB OPL3 compatible (the I/O address MUST be 0x388). The software (in this first release) responds to MIDI commands on Channel 1. The sounds are generated by the FM synthesizer built in the soundcard. The power is derived from two low-cost wall transformers (see picture) with variable output, set to 9V (the output is close to 12V). In future versions presets instruments will be loaded in the micro earom, rather than in the program memory, to allow experiments to create personalized sounds. The presets can be changed via MIDI ranging from 1 to 16.
The file ef139.zip contains the circuit diagram in PDF format, the object file .HEX to program the micro and a test program to verify on the PC if a soundcard is compatible with my circuit. This program runs ONLY in true DOS mode, not in a Windows DOS session.

Recentemente ho ricevuto alcune email con un argomento interessante: lo sviluppo di un piccolo sintetizzatore sempre partendo dalla base di una scheda audio ISA. Riporto (con alcuni omissis) il carteggio in questione :

Domanda:
Ciao Emilio
grazie per avermi risposto, ho visto il tuo progetto e volevo capire se poteva fare al caso mio, se ho ben capito ci posso collegare una tastiera midi e farla suonare tramite gli sf2 built-in della scheda audio (almeno credo), quindi penso che il pic serva per controllare i suoni nativi della scheda audio, confermami se ho capito bene , in alternativa mi interessava capire cosa ci potrei tirare fuori dal “giocattolino”, inoltre secondo te e’ possibile pensare di usarlo per costruirci attorno un mini synth ??

Risposta:
Ciao Mirco. Il PIC controlla direttamente i generatori FM OPL-3 e non usa altro. In pratica, i timbri vengono “costruiti” modificando i registri del chip audio direttamente. Ovviamente, data la mancanza di ram e di DMA, non è possibile usare la risorsa PCM. Tantissimi anni fa ( TRENTA ! ) progettavo strumenti musicali elettronici e così ho trasportato una parte del lavoro che feci allora con gli integrati Yamaha OPL-2, sui chip (assolutamente compatibili) delle varie schede audio ISA. Anche se gli OPL-3 hanno un operatore in più, io ho usato il subset corrispondente ai vecchi modelli. I timbri, quindi, sono tutti di mia programmazione e corrispondono ai suoni principali (chitarra, violino, tromba, clarino, organo eccetera), ma basta modificare alcune tabelle di look-up per ottenere nuovi timbri. Francamente, però, non credo di avere più la documentazione originale dei chip Yamaha, però penso che una ricerca con Google ti permetterà di trovare qualcosa in giro.
Per il funzionamento, sì; se colleghi una tastiera MIDI muta al mio expander, puoi suonare e cambiare i preset. La polifonia, se ricordo bene, l’ho fatta a sette note. Se ne premi di più (contemporaneamente) la più “vecchia” viene eliminata e sostituita dalla più recente.
In pratica, per costruire un sinth, dovresti aggiungere qualcosa per manipolare i dati nei registri, in modo da creare nuovi timbri con pulsanti o potenziometri. Lo spazio sul micro è abbondante, secondo me la cosa è realizzabile.

Domanda:
Ciao Emilio
Moooolto interessante cio’ che mi scrivi, anche se francamente sono a digiuno da troppo tempo sull’elettronica e in particolare sui PIC, pero’ quello che mi hai descritto mi ha chiarito le idee e mi ha messo altri dubbi, nel senso che mi scrivi che hai programmato il pic per ottenere dei timbri (chitarra, violino ecc), ma come fai a cambiare il timbro nel progestto originale ?? inoltre per creare dei nuovi timbri dovre dovrei agire nel codice ?? e per ultimo per il synth come procederesti ? immagino che si dovrebbe costruire qualcosa di analogico che venga letto dal pic per poi ricodificare i chip della scheda audio. Per la polifonia a 7 note per le mie esigenze basta e avanza 🙂
Ti chiedo tutte queste cose per 2 motivi:
1) costruirmi un expander analogico per una delle mie tastiere (e’ vero che con un pc e un po’ di sw si fa prima, pero’ il fascino di un aggeggino hw home made non ha prezzo)
2) potrebbe essere la base per la tesina dell’ esame di maturita’ per mio figlio (si diploma in informatica e farebbe il connubio elettronica informatica e musica)

Risposta:
Ciao Mirco. La sintesi FM che si utilizza nei vari OPL-2 e OPL-3 di brevetto Yamaha, basati sul lavoro di Chowning sulla generazione di spettri di frequenze complessi, mediante modulazione di frequenza, consiste (da parte del programmatore) nello scrivere alcuni parametri nei registri degli oscillatori. Ovviamente il parametro principale è la frequenza di base, cioè l’altezza della nota. Poi ci sono tanti altri fattori, tipo l’ADSR (attack, decay, sustain, release) per ognuno degli oscillatori, la modulazione di un oscillatore con l’altro e via dicendo. Ovviamente, le combinazioni di questi dati producono una quantità ENORME di effetti sonori, ma poi, alla fine, quelli utilizzabili per suonare davvero, sono giusto una ventina. Ovviamente, se ti piacciono i rumori di astronavi aliene, ne puoi creare a centinaia, ma poi che ci fai ? Ci crei un richiamo per extraterrestri ?
Per quanto riguarda il PIC, è uno dei micro che mi piacciono di meno, però si trova anche dal salumiere (quasi) e costa poco. Io ne avevo presi 5 su ebay (di quelli a 40 pin) in un ozioso pomeriggio di domenica e una volta arrivati ho deciso di utilizzarli per questa idea che mi era venuta in mente qualche tempo prima. Il programma sorgente, però, è tutto scritto in C, quindi si può trasportare su qualsiasi altro micro (con adeguato numero di porte di I/O e di flash e ram) senza grosse difficoltà. I timbri sono scritti su tabelle in flash, quindi diciamo che fanno parte del codice sorgente in C, ma nulla vieta di spostare le tabelle in ram o sulla earom (non volatile) presente su tanti tipi di micro. Una volta messe le tabelle su queste memorie alterabili (la ram o la earom) è possibile variare tutti i parametri e quindi produrre timbri a volontà. Tieni presente che per definire uno “strumento” si usano una ventina di bytes in tutto (non ricordo con precisione, dovrei andare a rileggere il sorgente). Per realizzare un sinth, chiaramente, sarebbe opportuno aggiungere un display LCD e magari 6 pulsanti con le frecce su, giù, destra, sinistra e poi accetta e annulla. Con questa interfaccia utente si fa praticamente tutto…

Domanda:
Quindi se non ho ben capito gli opl-2 e opl-3 probabilmente sono usati anche nella mia yamaha dx7 (fantastico synth)
per i richiami alienti diciamo quasi !!!! l’idea sarebbe quella di costruire sei suoni usati dai rockets i gruppi simili, considera comunque che sarebbe un passatempo per me e un bel voto all’esame per mio figlio, sul fatto che si possono emulate decentemente una ventina di strumenti per me basta e avanza, se poi i suoini gernerati magari li distorci un’attimo tanto meglio, come avrai capito amo molto i suoni vintage e sopratutto le favolose sonorita’ degli organi anni 60/70 ….
un’ultima cosa, mi puoi inviare il sorgente in c del pic ??

Risposta: (qualche tempo dopo)
Bene, ho “riesumato” la cartella del progetto ed ho creato il file scaricabile midisrc.zip che contiene tutti i files in C usati per la creazione del file HEX già allegato in precedenza. Modificando questi files, è possibile ampliare o cambiare del tutto il funzionamento del circuito e quindi, con un po’ di pazienza, realizzare anche il sinth di cui si parlava all’inizio.
E’ da notare che alcuni di questi listati in C sono stati “tradotti” dai miei programmi originali in assembler e quindi presentano, a volte, una sintassi un po’ desueta, come nell’uso dei “goto”; questo, però, mi ha permesso la conversione dall’assembler al C in minor tempo.
Spero che questo lavoro sia utile e sarò lieto di continuare ad aggiungere a questa pagina gli eventuali sviluppi della situazione.

Documenti utili:
Manuale in PDF dei primi chip Yamaha YM2413 (li ho usati !) link
Manuale in PDF dei più recenti chip Yamaha YMF262 link
Manuale in PDF del chip OPTi 82C931 (controller audio ISA) link