Realizzare un Multiplexer Video-Composito, essenziale ma non privo di utili funzionalità, è estremamente semplice se si impiegano opportuni amplificatori video integrati dotati di ingressi di abilitazione. Logiche multiplexer anche piuttosto complesse possono allora essere implementate in firmware e attuate mediante un controllore che interfacci e piloti l’integrato video
La diffusione delle reti LAN Ethernet ha reso estremamente agevole la realizzazione di impianti di videosorveglianza anche complessi. L’impiego di telecamere IP, di apparati di rete e di registratori NVR (Network Video Recorder) permette di realizzare il monitoraggio video di siti mediante un semplice PC connesso alla stessa rete. Nonostante ancora oggi, se si deve realizzare un piccolo impianto poco esteso costituito da poche telecamere e magari caratterizzato da un unico punto di supervisione, come nella portineria di un piccolo stabile o di una piccola attività lavorativa, tanta tecnologia può risultare sprecata. Può essere sufficiente allora realizzare un impianto puramente analogico impiegando semplici telecamere analogiche (ben più economiche delle telecamere IP), alcuni cavi coassiali per la trasmissione del segnale video-composito e un monitor su cui visualizzare, in diretta, le immagini riprese.
Il Multiplexer Video-Composito
Oltre alle telecamere e al monitor (analogici), è opportuno, in questo caso, disporre di un Video-Multiplexer, cioè un dispositivo in grado di ricevere in ingresso il segnale video di n distinte telecamere e di inviarne al monitor, istante per istante, uno solo di questi (figura 1). Attraverso appositi tasti o una pulsantiera è possibile selezionare quale degli n segnali video trasferire a monitor. Questa funzionalità può essere realizzata anche con un solo pulsante: ogni volta che si preme il pulsante, si abilita a monitor uno dei segnali video che giungono al multiplexer. Un video-multiplexer è generalmente dotato anche della funzione di oscuramento del monitor e di Video Rotate (per un tempo Dt è visualizzato il primo degli n flussi video, nel successivo intervallo Dt è visualizzato il secondo e così via fino all’intervallo n-esimo in cui è visualizzato l’n-esimo flusso, dopo il quale il ciclo ricomincia da capo).
L’hardware e la logica di controllo
Il circuito di figura 2 realizza un multiplexer Video-Composito a quattro ingressi attraverso l’integrato HA5024 (un quad-video Amplifier in cui ciascuno dei quattro video-amplifier è dotato di pin di abilitazione). Un integrato di questo tipo può essere impiegato come splitter video, come distributore oppure come multiplexer. Nel nostro caso si è implementato un multiplexer a quattro ingressi comandato da un controllore PIC di Microchip che ne detiene il controllo. L’interfaccia di comando utente è costituita da:
- un pulsante di controllo che ogni qual volta viene premuto consente di passare dalla visualizzazione del flusso video i a quello i+1 se 0<i<4; dal video i alla modalità rotate monitor se i=4; dalla modalità rotate-monitor (i=5) a monitor buio (i=0) se si è in modalità rotate monitor; da monitor buio (i=0) a visualizzazione Video 1 nel caso restante;
- un potenziometro attraverso il quale è possibile regolare la velocità di rotazione dei flussi se si è in modalità rotate monitor.
Premendo il pulsante si passa da uno stato al successivo. Il firmware implementa una macchina a stati finiti dove lo stato_i rappresenta l’abilitazione del flusso_i, eccetto che per lo stato0 che rappresenta il buio e lo stato5 che rappresenta lo stato di rotate video. Il flusso video da inviare al monitor è selezionato attraverso il pilotaggio da parte del controllore dei pin di abilitazione dell’integrato video HA5024.
Il firmware
Il firmware (vedi listato 1) è scritto in C impiegando il CCS C Compiler for PIC12/14/16/18 installato come Plug-in nell’IDE MPLAB. In esso si notano:
- le inizializzazioni;
- la gestione dell’interrupt sulla line B0 (risposta alla pressione del pulsante di controllo);
- la presenza di un timer per la gestione della velocità di rotate video;
- la funzione VideoRotate;
- la funzione VideoDisable per la disabilitazione di tutti i flussi video;
- la funzione RilevaSpeed che rileva (tramite ADC) il livello di un potenziometro che serve ad accelerare/rallentare la velocità di rotate (da Dt pari a circa 2 secondi a Dt pari a circa 40 secondi per ciascun flusso);
- la Main Function nel cui ciclo principale sono gestite le suddette funzioni.
//________________________________________________ // MULTIPLEXER VIDEO // Microcontroller: Microchip PIC16F877 // Compiler: CCS C Compiler for PIC12/14/16/18 //________________________________________________ #include <16F877.h> #fuses XT,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT #use delay(clock=8000000) //__________________funzioni________________________ void Inizializza(); void VideoDisable(); void VideoRotate(); void RilevaSpeed(); #define ImpulsoCmd PIN_B0 //pulsante di comando //ABILITAZIONE VIDEO DA INVIARE A MONITOR________ #define ENABLE_VIDEO_1 PIN_D1 // Enable video camera 1 #define ENABLE_VIDEO_2 PIN_D2 // Enable video camera 2 #define ENABLE_VIDEO_3 PIN_D3 // Enable video camera 3 #define ENABLE_VIDEO_4 PIN_D4 // Enable video camera 4 #define LED_ROTATE PIN_B2// segnala la modalità rotate #define ACTIVITY_LED PIN_B1 // led di attività // tempo di step ciclo (secondi)_________________________ #define TIME_OUT_STEP1 3 // 2 secondi #define TIME_OUT_STEP2 7 // 4 secondi #define TIME_OUT_STEP3 20 // 10 secondi #define TIME_OUT_STEP4 40 // 20 secondi #define TIME_OUT_STEP5 80 // 40 secondi // Stato Comando ___________________________________ #define STATO0 0 // comando Video Monitor OFF #define STATO1 1 // comando Video1 —> Monitor #define STATO2 2 // comando Video2 —> Monitor #define STATO3 3 // comando Video3 —> Monitor #define STATO4 4 // comando Video4 —> Monitor #define STATO5 5 // comando RotateON—>Monitor #define ON 1 #define OFF 0 long int count_ms; // contatore dei millisecondi long int secondi; // contatore dei secondi int speed, time_out_step; boolean StatoRichiesta; // new request da pulsante unsigned char StatoCmd; //_________________________________________________ #int_timer2 // Timer in overflow ogni 1ms void clock_isr() { count_ms++; if ((count_ms>=1000)){ secondi=secondi+1; output_toggle(ACTIVITY_LED); count_ms=0; } RilevaSpeed(); if ((secondi > time_out_step)){ secondi=0; count_ms=0; } } //_________________________________________________ #INT_EXT //Interrupt da pulsante di comando (Pin B0) void external_isr(){ while (ImpulsoCmd==1); //filtro anti-rimbalzo if (StatoCmd<STATO5) StatoCmd++; else (StatoCmd=STATO0); StatoRichiesta=ON; } void main(){ Inizializza(); while (1){ if (StatoRichiesta==ON){ switch (StatoCmd) { case STATO0:VideoDisable(); break; case STATO1:VideoDisable(); output_high(ENABLE_VIDEO_1); break; case STATO2:VideoDisable(); output_high(ENABLE_VIDEO_2); break; case STATO3:VideoDisable(); output_high(ENABLE_VIDEO_3); break; case STATO4:VideoDisable(); output_high(ENABLE_VIDEO_4); break; case STATO5:output_high(LED_ROTATE); VideoRotate(); output_low(LED_ROTATE); VideoDisable(); break; default: break; } StatoRichiesta=OFF; } } } //____________________________Funzione di Inizializzazione void Inizializza(){ set_tris_d(0b11100001); set_tris_b(0b11111001); set_tris_c(0b00000000); enable_interrupts(global); enable_interrupts(int_ext); enable_interrupts(INT_TIMER2); set_timer2(0); setup_timer_2(T2_DIV_BY_4, 99, 3); output_low(PIN_C5); setup_adc_ports( ALL_ANALOG ); setup_adc( ADC_CLOCK_INTERNAL ); StatoRichiesta=ON; StatoCmd=STATO5; } //_________________________________Oscuramento Monitor void VideoDisable(){ output_low(ENABLE_VIDEO_1); output_low(ENABLE_VIDEO_2); output_low(ENABLE_VIDEO_3); output_low(ENABLE_VIDEO_4); } //_________________________________Rotate Video Monitor void VideoRotate(){ unsigned char i_ciclo; i_ciclo=1; while(StatoCmd==STATO5){ if (secondi==0) { switch (i_ciclo) { case 1: VideoDisable(); output_high(ENABLE_VIDEO_1); break; case 2: VideoDisable(); output_high(ENABLE_VIDEO_2); break; case 3: VideoDisable(); output_high(ENABLE_VIDEO_3); break; case 4: VideoDisable(); output_high(ENABLE_VIDEO_4); break; default:break; } while (secondi==0); if (i_ciclo<4) i_ciclo++; else i_ciclo=1; } }} //__________________Rileva Speed Route da potenziometro void RilevaSpeed(){ set_adc_channel( 3 ); //Lettura pin A3 (potenziometro) speed = Read_ADC(); //conversione ADC==>speed Rotate if ((speed<50)&&(speed>=0)) { time_out_step = TIME_OUT_STEP1; output_c(0b00011111); //Segnalazione led Speed } if ((speed>=50)&&(speed<100)) { time_out_step = TIME_OUT_STEP2; output_c(0b00001111); } if ((speed>=100)&&(speed<150)) { time_out_step = TIME_OUT_STEP3; output_c(0b00000111); } if ((speed>=150)&&(speed<200)) { time_out_step = TIME_OUT_STEP4; output_c(0b00000011); } if ((speed>=200)&&(speed<=255)) { time_out_step = TIME_OUT_STEP5; output_c(0b00000001); } }
Listato 1 |
Test dello schema e del firmware
Il circuito elettrico e il firmware sono stati testati mediante la Development Board EasyPIC3 (figura 3), ma grazie alla portabilità del codice possono essere testati anche sulle versioni più recenti. I comandi di abilitazione dei pin dell’integrato video HA5024 sono, in questo caso, simulati attraverso dei semplici LED. Il progetto integra un diodo di attività (activity led=Pin B1) lampeggiante (f=1Hz) e un LED di segnalazione della modalità Rotate (Led Rotate=Pin B2).
La registrazione video sta assumendo un ruolo importante nei sistemi per la sicurezza, in quest’ambito nuovi SoC e FPGA avranno un ruolo importante per la gestione ed analisi dati in tempo reale.