Commutazione dei segnali video

Benvenuti a un nuovo appuntamento con la Rubrica Firmware Reload nella quale potrete leggere gli articoli della storica rivista Firmware. In applicazioni di citofonia o video-sorveglianza, può essere necessario convogliare i segnali provenienti da più telecamere, verso un unico monitor lasciando all’utente la possibilità di selezionare la sorgente di segnale. Vediamo in questo articolo come realizzare un dispositivo del genere.

Introduzione

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 video-sorveglianza anche complessi. L’impiego di telecamere IP, di apparati di rete, di registratori NVR (Network Video Recorder) permette di realizzare il monitoraggio video di siti mediante un semplice PC connesso alla stessa rete. Ciò 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 ed un monitor su cui visualizzare, in diretta, le immagini riprese.

IL MULTIPLEXER VIDEO-COMPOSITO

Oltre alle telecamere ed al monitor (analogici) è opportuno disporre, in questo caso, di un Video-Multiplexer cioè un dispositivo in grado di ricevere in ingresso il segnale video di n distinte telecamere e di inviarne a monitor, istante per istante, uno solo di questi (Figura 1). Attraverso appositi tasti o 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, è anche dotato 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).

Figura 1- Schema generale di un impianto Video-Composito Multiplexer

Figura 1. Schema generale di un impianto Video-Composito Multiplexer

REALIZZAZIONE PRATICA: 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: ogni volta che si preme il pulsante si passa 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 di 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 stato0 che rappresenta il buio e 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.
Figura 2- Schema elettrico del Multiplexer Video-composito. La funzione di multiplexer è ottenuta attraverso l’integrato video HA5024 pilotato dal controllore

Figura 2. Schema elettrico del Multiplexer Video-Composito. La funzione di multiplexer è ottenuta attraverso l’integrato video HA5024 pilotato dal controllore

Figura 3-Il progetto firmware nell’interfaccia IDE MPLAB e la scheda di sviluppo EasyPic3 per il test hardware e firmware del progetto

Figura 3. Il progetto firmware nell’interfaccia IDE MPLAB e la scheda di sviluppo EasyPic3 per il test hardware e firmware del progetto

REALIZZAZIONE PRATICA: IL FIRMWARE

Il firmware (Listato) è 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 linea 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 funzioni suddette.
//________________________________________________
// MULTIPLEXER VIDEO-Autore: A. Giannico - FW N.45
// Microcontroller: Microchip PIC16F877
// Target-board: EasyPIC3 Development Board
// 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 ed il firmware sono stati testati mediante la Development Board EasyPIC3. 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) ed un led di segnalazione della modalità Rotate (Led Rotate=Pin B2).

SUGGERIMENTI

L’integrato HA5024 necessita di alimentazione duale ±5VDC. Se si dispone di un alimentatore con Vout= 8-10VDC è possibile impiegare un regolatore 7805 per ottenere i 5VDC ed in cascata un ICL7660 per ottenere i -5VDC. Se realizzate il PCB rendete più brevi possibili i percorsi delle piste video in modo da ridurre la probabilità di accoppiamenti capacitivi tra segnali video differenti (piani di schermature potrebbero risultare utili in proposito ma si entra in discorsi più complessi). Per brevità di trattazione, lasciamo al lettore l’analisi diretta e dettagliata del listato, del firmware e dello schema circuitale, consigliando nel contempo la lettura del datasheet dell’integrato HA5024.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend