Interactuar con la videocámara MD80 y un microcontrolador

Electrónica, Proyectos 39 Comentarios

Hace poco escribí una reseña sobre el clon de la videocámara MINIDV MD80. Al ser una videocámara de tamaño reducido se puede usar en los proyectos de electrónica que queramos, sin embargo su autonomía viene marcada por la batería que contiene, además de que el proceso de encendido/apagado y grabación/parada es manual. Mi intención ha sido sustituir la batería por otra fuente de alimentación (una batería más grande, un transformador de la corriente eléctrica, etc) y que tanto el encendido como la grabación se hagan a través de un microcontrolador. En este artículo voy a explicar los pasos que he seguido para conseguir mi objetivo.

En principio he desmontado la carcasa de la videocámara y he extraido la electrónica y la batería:

He desoldado la batería y en su lugar he puesto dos cables para unirlos a una protoboard (aunque podrían soldarse a una placa de topos o a una pcb). Después he soldado dos cables de wrapping a los terminales traseros del botón de encendido y otro cable de wrapping al terminal trasero izquierdo del botón de grabación:

A partir de aquí ya se puede usar la cámara con un microcontrolador. Para este artículo me he decantado por un pic 12f683. La idea es usar dos transistores NPN para que hagan la simulación de pulsar tanto el botón de encendido como el de la grabación, para este artículo he usado 2 BC547. El microcontrolador activará la base del transistor a través de una resistencia de 390K. y comunicará el colector con el emisor como si de una pulsación manual del botón se tratase. Sólo hay que tener en cuenta que para el botón de encendido, el cable de wrapping de la derecha tiene que ir al colector y el cable de la izquierda al emisor, y en el botón de grabación el único cable va al colector y el emisor va a masa (GND).

La batería que trae la videocámara es una LiPo de una sola celda y tiene una capacidad de 230 mAh. Esto nos da la pista de que a la cámara debemos alimentarla con una tensión de 3,7 v. Para ello he usado un regulador Step-Down basado en el chip AX3022 de sure electronics. Este regulador ofrece hasta 1,5 A., más que suficiente para alimentar la videocámara y el microcontrolador (que puede funcionar a 3,7 v.).

Finalmente así queda el conjunto en una protoboard:

El ejemplo que he programado en el microcontrolador es muy sencillo: Espera 5 segundos, activa el transistor del botón de encendido durante medio segundo, esto hace que la videocámara se encienda, espera otros 5 segundos, activa el transistor del botón de grabación durante medio segundo, esto hace que la videocámara empiece a grabar, espera 10 segundos, activa el transistor del botón de grabación durante medio segundo, esto hace que la grabación pare, espera 5 segundos y finalmente activa el transistor del botón de encendido durante medio segundo, que provoca que la videocámara se apague:

El código fuente del programa del pic:

#include "main.h"
 
void power()
{
   output_high(PIN_A0);
   delay_ms(500);
   output_low(PIN_A0);
}
 
void record()
{
   output_high(PIN_A1);
   delay_ms(500);
   output_low(PIN_A1);
}
 
void main()
{
 
   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC);
   setup_vref(FALSE);
   setup_oscillator(OSC_8MHZ);
 
   // TODO: USER CODE!!
   set_tris_a(0);
   output_a(0);
   delay_ms(5000);
   power();
   delay_ms(5000);
   record();
   delay_ms(10000);
   record();
   delay_ms(5000);
   power();
 
   for(;;);
}

Cuando vayamos a conectar la videocámara a un puerto USB para ver las grabaciones, no debemos olvidarnos de desenchufar los cables de alimentación que hemos soldado, ya que la fuente de alimentación ya no es la batería original que contenía.

Listar los grupos de un usuario de Active Directory en C#

Proyectos Sin comentarios

Queremos hacer una aplicación para windows (o para la Web) en .NET donde debemos comprobar si un usuario pertenece o no a unos grupos determinados del dominio.  Esto nos sirve para saber si el usuario puede entrar en la aplicación y qué permisos tiene. Lo normal es que un grupo contenga a un usuario directamente, pero, ¿que sucede si un usuario no pertenece directamente a un grupo A, sino que pertenece a un grupo B que a su vez pertenece al grupo A?.

Para que funcione en todos los casos se debe buscar el aributo tokenGroups de la cuenta del usuario en el Directorio Activo. Este atributo contiene todos los SIDs de los grupos a los que pertenece el usuario directa o indirectamente.

Aquí pongo un ejemplo comentando de cómo se puede hacer:

// Creamos un objeto DirectoryEntry para conectarnos al directorio activo
DirectoryEntry adsRoot = new DirectoryEntry("LDAP://" + Environment.GetEnvironmentVariable("USERDOMAIN"));
// Creamos un objeto DirectorySearcher para hacer una búsqueda en el directorio activo
DirectorySearcher adsSearch = new DirectorySearcher(adsRoot);
 
try
{
    // Ponemos como filtro que busque el usuario actual
    adsSearch.Filter = "samAccountName=" + Environment.GetEnvironmentVariable("USERNAME");
 
    // Extraemos la primera coincidencia
    SearchResult oResult;
    oResult = adsSearch.FindOne();
 
    // Obtenemos el objeto de ese usuario
    DirectoryEntry usuario = oResult.GetDirectoryEntry();
 
    // Obtenemos la lista de SID de los grupos a los que pertenece
    usuario.RefreshCache(new string[] { "tokenGroups" });
 
    // Creamos una variable StringBuilder donde ir añadiendo los SID para crear un filtro de búsqueda
    StringBuilder sids = new StringBuilder();
    sids.Append("(|");
    foreach (byte[] sid in usuario.Properties["tokenGroups"])
    {
        sids.Append("(objectSid=");
        for (int indice = 0; indice < sid.Length; indice++)
        {
            sids.AppendFormat("\\{0}", sid[indice].ToString("X2"));
        }
        sids.AppendFormat(")");
    }
    sids.Append(")");
 
    // Creamos un objeto DirectorySearcher con el filtro antes generado y buscamos todas la coincidencias
    DirectorySearcher ds = new DirectorySearcher(adsRoot, sids.ToString());
    SearchResultCollection src = ds.FindAll();
 
    // Recorremos toda la lista de grupos devueltos
    foreach (SearchResult sr in src)
    {
        String sGrupo = (String) sr.Properties["samAccountName"][0];
        // A partir de aquí hacer lo que corresponda con cada grupo
        ...
    }
}
catch(Exception ex)
{
    Console.WriteLine(ex.Message);
}