• Reviviendo al Arduino Nano de un Cortocircuito

    Tarde o temprano a todos nos pasa…. un cortocircuito por un descuido (en este caso, un potenciómetro mal conectado en el protoboard), y lastimosamente, despues del click del cortocircuito, el Arduino Nano con el que estaba trabajando dejó de funcionar.

    Estando conectado al puerto USB, lo que esperaba es que haya muerto mi hub usb,pero en lugar de eso, el Arduino simplemente dejó de recibir +5V desde el cable USB, lo que nos daba una esperanza.

    Efectivamente, conectandolo con una alimentación externa, funcionaba correctamente, así que había que buscar una solución a este problema. Resulta que entre la entrada de +Vusb y Vcc, existe un diodo, que se había abierto.

    arduino1

    La solución, sencilla, hacer puente en el diodo, para alimentar al AVR directamente desde el puerto. Eliminamos la protección, pero lo que necesitamos es que funcione. A la final, este arduino irá alimentado únicamente desde la entrada externa de poder.

    Como vemos en la siguiente imágen, hemos hecho un puente en el diodo, y con esto nuestro Arduino volvió a la vida!

    arduino2

  • Micro Cámaras de Video? Pruebas de la keychain camera 808

    Al fin! llegó la micro cámara de video y como era de esperarse, había que probarla sobre los carros de control remoto, y sobre el avión. Ahi les dejo un par de videos de las pruebas.

    [HTML1]

    [HTML2]

    Entre las características de esta cámara, tenemos

    • Pequeño tamaño (es del tamaño del mando de la alarma del carro)
    • Liviana
    • Graba video en formato AVI, 30fps, 720p
    • Permite tomar fotografías de 5Mpx (la calidad de las fotos es bastante baja)
    • Soporte para memoria micro SD (la probé con una memoria genérica de 8GB)
    • Carga de batería, y descarga de videos mediante puerto USB
    • Barata (se la consigue en menos de $20, incluido el envío en ebay)

    Claro que no todo es bueno. La calidad del video, llega a ser aceptable, siempre y cuando no exista demasiada vibración. los 720p más bien parece 480p extrapolado. La calidad del color deja bastante que desear, y es bastante sensible a la luz. Pero como les decía, para el bajo precio, yo me quedo con una!

    El mayor inconveniente que yo le veo, es el poco ángulo de visión. Quizás la versión que viene con un lente de 120° de apertura (que según los comentarios, graba mucho mejor que esta) sería una buena alternativa para la GoPro.

     

  • Stellaris Launchpad y Energia: Programando un Cortex-M3 fácilmente

    Luego de tenerlo algún tiempo empolvándose, decidí darle una prueba al Stellaris Launchpad que compré  (en $5.00) cuando lo lanzaron hace más de 6 meses, y la verdad que el precio de $12.00 actual, sigue siendo una ganga, para toda la potencia de este microcontrolador.

    StellarisLaunchPad_estore

    Entre los periféricos importantes de este micro, podemos comentar:

    • Reloj principal de 80Mhz y 32khz para modo de bajo consumo
    • 256kb de memoria flash
    • 32kb de memoria ram
    • 2kb de memoria EEPROM
    • Controlador uDMA de 32 bits
    • 2 ADC de 12 bits – 1MSPS
    • Comparadores Analógicos
    • 8 puertos UART
    • 4 puertos SPI
    • Puerto USB Host/Device/OTG
    • 12 Timers
    • 16 Salidas PWM
    • Puertos GPIO
    • Debugger integrado en la tarjeta
    • 2 pulsantes, y 1 led RGB para pruebas

    stellaris_perifericos

     

    Como vemos, este micro, tiene mucha potencia en ese pequeño paquete, pero tanta potencia tiene un precio. Desarrollar para este micro puede convertirse en un dolor de cabeza, ya que es necesario utilizar Code Composer Studio de TI. Este IDE basado en Eclipse, nos permite programar y depurar al stellaris, pero su gran tamaño (la descarga es de 1GB aproximadamente) y lo lento de Eclipse, puede hacernos despechar de cualquier proyecto pequeño que tengamos.

    Afortunadamente, existe el Proyecto Energia, que nos permite programar al Stellaris Launchpad con una interfaz de programación similar a la de nuestro conocido Arduino, y nos brinda facilidad de programación, usando toda la potencia del Stellaris.

    Al descargar y abrir Energia, vamos a tener una interfaz idéntica a la del IDE de Arduino, salvo por el color rojo de la misma (Rojo Stellaris XD), y podemos compilar algunos de los ejemplos, como el típico Blink.ino incluido dentro del IDE

    stellarisblink

    Ahora, vamos a hacer algo más útil. Aprovechando los ADC de alta velocidad, vamos a intentar capturar datos con el ADC a la máxima velocidad posible (tomando en cuenta que lso ADC son de 1MSPS).

    Por ventaja para nosotros, Energía trae precompiladas todas las librerías Stellarisware,  que nos brindan rutinas de configuración y acceso a todos los periféricos de nuestro micro. Con estas librerías, programamos un sketch que va a hacer 3 cosas:

    • Habilitar el puerto serial para envío y recepción de datos
    • Capturar datos con el ADC, usando interrupciones, iniciando las interrupciones del ADC al recibir un dato desde el puerto serial. Se capturará 2048 datos en ráfaga, sin usar DMA.
    • Generar un timer de 1hz para referencia

    Nuestro sketch para realizar esto es el siguiente:

    #include "Energia.h"
    #include "inc/hw_memmap.h"
    #include "inc/hw_types.h"
    #include "inc/hw_ints.h"
    #include "driverlib/debug.h"
    #include "driverlib/interrupt.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/adc.h"
    #include "driverlib/timer.h"
    
    int i=0;
    int j=1;
    int dato0=0;
    int adc[1024];
    unsigned char dataReady=0;
    unsigned long ulADC0Value[1];
    unsigned long time1;
    unsigned long time2;
    unsigned long ttotal;
    
    void setup() {
      Serial.begin(115200);
      pinMode(RED_LED, OUTPUT);
      pinMode(BLUE_LED, OUTPUT);
      pinMode(GREEN_LED, OUTPUT);
    
      initADC();  
      initTimer(2);
    
      Serial.println("Inicio OK. ");
      Serial.print(SysCtlClockGet());
      Serial.println(" hz");
    
    }
    
    void loop() {
      unsigned char serialIn;
      int i;
       digitalWrite(GREEN_LED,1); 
    
       if (Serial.available() > 0) {
         serialIn=Serial.read();
         ADCIntEnable(ADC0_BASE, 3);
       } 
    
       if (dataReady!=0) {
         Serial.println("Datos ADC");
         for (i=0;i<=1023;i++) {
             Serial.println(adc[i]);
         }
    
         dataReady=0;
       }
    }
    
     void Timer0IntHandler()
    {
    
      // Clear the timer interrupt
      TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
      //leeADC();
      digitalWrite(RED_LED, j&0x01);  
      j++;
    
    }
    
    void ADC0IntHandler() {
       ADCIntClear(ADC0_BASE,3);
       ADCSequenceDataGet(ADC0_BASE, 3, ulADC0Value);
       adc[i]=(int)ulADC0Value[0];  
       i++;
       if (i&0b10000000000) { i=0; ADCIntDisable(ADC0_BASE, 3); dataReady=1;}
       //ADCProcessorTrigger(ADC0_BASE, 3);
       //digitalWrite(RED_LED, i&0x01);
    }
    
    void initTimer(unsigned Hz)
    {
      SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
      //TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_PER);
      TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC);
      unsigned long ulPeriod = (SysCtlClockGet() / Hz) / 2;
      TimerLoadSet(TIMER0_BASE, TIMER_A, ulPeriod -1);
      IntEnable(INT_TIMER0A);
      TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
      TimerIntRegister(TIMER0_BASE, TIMER_A, Timer0IntHandler);
      TimerEnable(TIMER0_BASE, TIMER_A);
    
    }
    
    void initADC(void) {
    	SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
    	SysCtlADCSpeedSet(SYSCTL_ADCSPEED_1MSPS);
            //SysCtlADCSpeedSet(SYSCTL_ADCSPEED_500KSPS);
    	ADCSequenceDisable(ADC0_BASE, 3);
    	//ADCSequenceConfigure(ADC0_BASE, 3, ADC_TRIGGER_PROCESSOR, 0);
            ADCSequenceConfigure(ADC0_BASE, 3, ADC_TRIGGER_ALWAYS, 0);
    	ADCSequenceStepConfigure(ADC0_BASE, 3, 0, ADC_CTL_CH0 | ADC_CTL_IE | ADC_CTL_END); //Sequencer 3 Step 0: Samples Channel PE3
    	//ADCSequenceStepConfigure(ADC0_BASE, 3, 0, ADC_CTL_TS | ADC_CTL_IE | ADC_CTL_END); //Sequencer 3 Step 0: Samples TS
            ADCIntRegister(ADC0_BASE, 3, ADC0IntHandler);
    	ADCSequenceEnable(ADC0_BASE, 3);
            ADCIntEnable(ADC0_BASE, 3);
            //ADCProcessorTrigger(ADC0_BASE, 3);
    }

    Como vemos en el código, tenemos 2 rutinas de inicialización de periféricos, 2 rutinas de interrupción, y las cásicas setup() y loop() del programa principal. Facil no?

    Ahora, debemos tener una consideración adicional. El compilador para este procesador Cortex, necesita un archivo llamado startup.gcc (que se encuentra dentro del IDE Energia) que define las subrutinas de interrupción de cada uno de los periféricos. Es por esto, que debemos modificar el nuestro, para que quede algo así:

    /*
     * create some overridable default signal handlers
     */
    __attribute__((weak)) void UARTIntHandler(void) {}
    __attribute__((weak)) void ToneIntHandler(void) {}
    __attribute__((weak)) void I2CIntHandler(void) {}
    __attribute__((weak)) extern void Timer0IntHandler(void) {}
    __attribute__((weak)) extern void ADC0IntHandler(void) {}

    y un poco mas abajo

    __attribute__ ((section(".isr_vector")))
    void (* const g_pfnVectors[])(void) =
    {
       (void *)&_estack,                        // The initial stack pointer, 0x20008000 32K
        ResetISR,                               // The reset handler
        NmiSR,                                  // The NMI handler
        FaultISR,                               // The hard fault handler
        IntDefaultHandler,                      // The MPU fault handler
        IntDefaultHandler,                      // The bus fault handler
        IntDefaultHandler,                      // The usage fault handler
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        IntDefaultHandler,                      // SVCall handler
        IntDefaultHandler,                      // Debug monitor handler
        0,                                      // Reserved
        IntDefaultHandler,                      // The PendSV handler
        IntDefaultHandler,                      // The SysTick handler
        GPIOAIntHandler,                        // GPIO Port A
        GPIOBIntHandler,                        // GPIO Port B
        GPIOCIntHandler,                        // GPIO Port C
        GPIODIntHandler,                        // GPIO Port D
        GPIOEIntHandler,                        // GPIO Port E
        UARTIntHandler,                         // UART0 Rx and Tx
        UARTIntHandler,                         // UART1 Rx and Tx
        IntDefaultHandler,                      // SSI0 Rx and Tx
        I2CIntHandler,                          // I2C0 Master and Slave
        IntDefaultHandler,                      // PWM Fault
        IntDefaultHandler,                      // PWM Generator 0
        IntDefaultHandler,                      // PWM Generator 1
        IntDefaultHandler,                      // PWM Generator 2
        IntDefaultHandler,                      // Quadrature Encoder 0
        IntDefaultHandler,                      // ADC Sequence 0
        IntDefaultHandler,                      // ADC Sequence 1
        IntDefaultHandler,                      // ADC Sequence 2
        ADC0IntHandler,                      // ADC Sequence 3
        IntDefaultHandler,                      // Watchdog timer
        Timer0IntHandler,                      // Timer 0 subtimer A

    podemos ver que el ADC sequece 3, y el Timer 0 tienen aquí definidas sus subrutinas en este archivo. Si quieren descargar el archivo completo, pueden usar este link.

    Y que tal funciona? pues midiendo una señal de referencia de 8khz, vemos que muestrea eficientemente a 950Ksps, que es mucho más alto de los 10Khz que se obtiene con el Arduino… hay mejora cierto?

  • Transmisor de 2.4Ghz con Arduino

    Como vieron hace un par de semanas, estuve diseñando un transmisor de radio control de 4 canales, de 2.4Ghz de frecuencia, para actualizar mi transmisor básico (un Hobbyking de 6 canales).

    La idea es que el Arduino se encargue de todo lo que concierne a la lectura de los potenciómetros, inversión de la dirección de los servos (en los casos que se requiera), ajuste de máximos y mínimos, y la generación de la señal PPM, que se enviará al módulo de RF original del transmisor donante.

    Actualmente, el programa simple que hice, mantiene memoria para 5 modelos (almacenados en la eeprom del microcontrolador), controla la dirección de los servos, y dual rates para cada canal.

    El circuito del transmisor es el siguiente:

    tx

     

    Como podemos observar, el circuito es bastante simple. El arduino va conectado a un shield de LCD+teclado para la visualización y comando de los menus; los 4 potenciómetros son los que van en las palancas de mando, los 2 interruptores son los de Throtle Cut (apaga los motores directamente) y para el Dual Rate, y la señal PPM es generada en el pin 9 del Arduino, desde donde se la conecta al módulo de 2.4Ghz.

    El transmisor funciona a la perfección. Hoy hice un pequeño vuelo de prueba, y no hubo interferencias ni pérdidas de señal.

    El código fuente, y la librería RC, necesaria para el cálculo y generación de los pulsos PPM, los pueden descargar de los siguientes enlaces:

    El código puede ser mejorado, pero para desoxidarme un poco en la programada de microcontroladores, funciona bién.

    Les dejo un video de las últimas pruebas, antes del vuelo.

    [HTML1]

     

  • Cliente de Bittorrent para el Raspberry Pi

    Y bueno, mi Raspberry Pi pasa todo el día conectado monitoreando la casa, y como durante el día no hay nadie, la conexión de internet pasa completamente desocupada….. algo realmente malo.

    Para aprovechar un poco más nuestra conexión perezosa, instalé Transmission, que es un cliente de Bittorrent que corre como un demonio en Linux; dado que el Raspberry Pi consume prácticamente nada de energía al estar conectado, resulta bastante práctico para tenerlo descargando cosas durante el día.

    Para instalar Transmission, debemos ejecutar los siguientes comandos desde el terminal de nuestro Pi:

    sudo apt-get install transmission-daemon
    sudo apt-get install transmission-common
    sudo apt-get install transmission-cli

    Si no hay ningún problema en la descarga se instalarán los paquetes necesarios, y arrancará el demonio de transmission. Antes de empezar a usarlo, debemos editar un par de detalles en su archivo de configuración. Para esto, detenemos el servicio con el siguiente comando:

    sudo service transmission-daemon stop

    A continuación editamos el archivo /etc/transmission-daemos/settings.json (sudo nano /etc/transmission-daemos/settings.json) y modificamos las siguientes líneas, con los datos que vayamos a usar según nuestro caso (para las rutas de archivo y las IPS, son las que tengo creadas en mi PI):

    "download-dir": "/home/pi/transmission", 
    "incomplete-dir": "/home/pi/transmission/incompleto",
    "rpc-whitelist": "127.0.0.1,192.168.1.100",
    "rpc-whitelist-enabled": false,

    Además, para dar acceso via navegador, es necesario que modifiquemos las líneas del nombre de usuario y contraseña del mismo archivo:

    "rpc-password": "su_contrasena",
    "rpc-username": "su_usuario",

    La contraseña acá la colocamos sin encriptar. El momento de reiniciar el demonio se encriptará automáticamente. Para reiniciar el servicio, basta con el comando:

    sudo service transmission-daemon start

    y Voilá! tenemos nuestro cliente de bittorrent conectado 24/7, que lo podemos monitorear desde nuestro navegador, con la IP de nuestro Raspberry, y el puerto 9091

    torrent

    Felices descargas 🙂

    pd. Si desean acceso externo (por ejm. para colocar descargas desde la oficina) basta con abrir el puerto 9091 en su router, y en lo posible, darle un dominio virtual, como lo indiqué en el post de cómo configurar no-ip para el raspberry.

  • Transmisor RC con Arduino – Actualización

    Este fin de semana que tuve un poco de tiempo libre, pude depurar un poco el código del arduino, y conectarlo al módulo de radiofrecuencia del transmisor que tengo para actualizar.

    Estos son los resultados

    [HTML1]

    El transmisor funciona correctamente, así como las memorias de los modelos (por ahora, en RAM), el dual rate, y la reversa de servos. Voy a programar la grabación en memoria flash de los valores, y una función exponencial básica, y estaremos listos.

  • Acceso a dispositivos de almacenamiento USB desde el Raspberry Pi

    De pronto le haya sucedido a alguien, les dejo este tip.

    Al conectar una memoria usb o un hdd portable a su raspberry pi, puede darse el caso de que cuando quieran grabar un archivo sobre el mismo, les devuelva un error de escritura por falta de permisos. Para solucionar esto hay que instalar la librería ntfs-3g, con el siguiente comando:

     

    sudo apt-get install ntfs-3g
    

    Con esto, basta con reiciar el Pi, y tendrán acceso de lectura y escritura en sus dispositivos USB…… se ahorrarán un dolor de cabeza 🙂

  • Error 404 al usar el paginador de entradas de wordpress

    En uno de mis proyectos actuales, se me presentó un inconveniente que me estaba poniendo los pelos de punta! En un sitio web un poco complejo en su estructura, simplemente los paginadores de los posts publicados en determinadas categorías no funcionaban, llevando a un error 404, e impidiendo que los visitantes puedan revisar entradas anteriores.

    Aparte de eso (y es algo que no me había dado cuenta hasta ahora) es que si en el administrador de wordpress, seleccionamos las entradas de determinada categóría, no se visualizaba ninguna. Inicialmente pensé en un bug de wordpress, pero al investigar un poco (más bien bastante), encontré que el problema se daba por la creación de «Custom Types» dentro de las entradas. Este es nuestro caso, ya que tengo varios tipos distintos de entradas, ya que así fué requerido en la estructura del sitio.

    La solución resultó bastante sencilla. Hay que agregar este código al final del archivo functions.php

     

    function category_set_post_types( $query ){
        if( $query->is_category ):
            $query->set( 'post_type', 'any' );
        endif;
        return $query;
    }
    add_action( 'pre_get_posts', 'category_set_post_types' );

    Que hará que las entradas normales se mapeen correctamente dentro de las categorías, y así eliminaremos los problemas que teníamos con los paginadores.

    Espero les sea de utilidad.

  • Arduino + Radiocontrol = Diversión !!

    Bueno, como todos saben, soy un «poquitín» fan del Radio Control (fan si, pero exageradamente fan no…. este es un hobby que puede quebrar bancos si no se lo lleva con mesura).

    En lo que respecta a aviones de control remoto, soy bastante «cheap» (con los carros, es otra historia jeje). Hace un par de años, compré un radio de 6 canales en hobbyking, un manojo de servos, motores y baterías, todo por $100 incluido el envío. Con eso me ha bastado para, a través del tiempo y de las pruebas, armar un par de avioncitos decentes de espumaflex (si, la misma de los platos desechables) que han resistido el abuso y el aprendizaje del vuelo por radio control.

    Pero este post no es sobre aviones o carros, sino sobre arduinos y transmisores. Yo uso este transmisor de hobbyking.

    HK-T6XV2-M1(2)

    que la verdad, para el precio, dudo que se pueda conseguir algo mejor. 6 canales, 2.4Ghz, 1 receptor super liviano; para iniciarse, los $50 mejor invertidos jejeje. El único pero de este radio es su relativa falta de programación. Digo relativa, porque usando la aplicación para PC y el cable de conexión USB, podemos programarlo como queramos (incluso tiene un modo para helicóptero CCPM), pero cuando tienes 2 aviones, con configuraciones de servo diferentes, se vuelve algo «engorroso» llevar la laptop a todo lado para programar el radio.

    Es aquí donde entra el Arduino, y más específicamente un clon de Arduino, el Freaduino Uno, que puede ser comprado en internet por unos cuantos dolares (22,80 para ser exactos). La idea es que el arduino, reemplace todo el CPU del radio transmisor, y nos permita programarlo a nuestra manera.

    Actualmente, el arduino tendrá las siguientes tareas:

    1. Leer la posicion de las palancas usando sus ADC
    2. Tomar dichos valores y procesarlos según los parámetros seleccionados (direccion de servos, ajustes de punto máximo, exponenciales, etc)
    3. Generar una señal PPM en función de los valores procesados
    4. Hacer todo esto, mientras se comandan los parámetros de control desde un LCD con un teclado

    Realmente, luego de haber programado por muchos años en el micro 8051, y muchas variedades de Pics de Microchip, me doy cuenta el por qué el arduino ha pegado tanto en los hobbistas de electrónica. Al no necesitar programador adicional, se vuelve una herramienta plug-and-play para cualquier proyecto electrónico; su interfaz de programación es fácil de usar, y existen librerias prediseñadas casi para todo…… el sueño de todo estudiante de electrónica. Volviendo al tema, el uso del arduino en este proyecto, resultó una grán ventaja, ya que primero, las librerías para manejo de los ADC, LCD y teclado están ya listas, solo de incluirlas y usar.

    Luego de unas pocas líneas de código, pude generar un menú de opciones, para seleccionar los valores de la dirección del servo, y los dual rates para cada canal. esto lo podemos ver en las siguientes imágenes.

    2013-01-26_10-13-53_126

     

    2013-01-26_10-14-13_468

     

    Realmente, uno se ahorra tiempo y plata, tomando en cuenta que acá un PIC 18F4550 bordea los $10 sin los componentes adicionales para hacerlo funcionar, creo que facil el arduino que he comprado resulta más barato que la placa de comando de servos que diseñé hace algun tiempo, basada en Pic.

    Hasta ahora todo va bien, tenemos el ADC y algunas opciones básicas funcionando en el nuevo CPU de nuestro radio, pero viene la parte fuerte, tomar los valores procesados y convertirlos en una señal PPM, la cual será alimentada al módulo de 2.4Ghz del radio, para transmitirla al aire.

    Luego de algunas pruebas, he logrado generar dicha señal, y va bastante bién. El siguiente paso es montar todo en la caja del radio y probar si realmente funciona. Les dejo una imágen de mi pantalla (estoy usando un osciloscopio de tarjeta de sonido para verificar las señales) para que observen la señal generada a la salida del nuevo CPU.

    Apenas existan más avances, se los haré saber 😉

    2013-03-09_23-02-09_575

     

     

  • Configura tu Raspberry Pi para acceder remotamente usando No-IP

    Bueno, poco a poco el Raspberry Pi va teniendo más funciones a su cargo. Luego de convertirse en cámara IP, y servidor de Airplay, y luego de instalar apache y mysql (algo tan trivial como poner sudo apt-get install apache2 y sudo apt-get install mysql), llegó la hora de darle acceso al PI al mundo exterior.

    Primero, debemos tomar en cuenta, que la mayoría de nosotros, tenemos una conexión casera de internet, que no tiene una dirección IP estática. Por esta razón, necesitamos alguna manera de conocer la dirección IP de nuestro modem de banda ancha, para tener una dirección de acceso a nuestra red.

    Existe el servicio de www.no-ip.com, que nos permite crear un dominio virtual (o si tenemos un nombre de dominio libre, lo pueden configurar también ahí), y este dominio virtual, asignarlo a una dirección IP donde esté conectado nuestro servidor (el PI en este caso). Entonces, el primer paso obligado, es ingresar en www.no-ip.com y crear una cuenta nueva, para escoger un subdominio de los varios que se tienen disponibles en dicho servicio.

    Una vez que hemos creado y configurado la cuenta, vamos a trabajar en nuestro Raspberry Pi. La idea es que periódicamente, el PI detecte la dirección IP pública a la que está conectado el modem, y la envíe al servicio no-ip para actualizar el dominio virtual. Para esto, debemos instalar el paquete no-ip en nuestro Raspberry, usando los siguientes comandos:

    mkdir no-ip
    cd no-ip
    wget http://www.no-ip.com/client/linux/noip-duc-linux.tar.gz
    tar -zxvf noip-duc-linux.tar.gz
    cd noip-2.1.9-1/
    make
    sudo make install

    Al empezar la instalación, nos solicitará nuestros datos de la cuenta de no-ip, verificará el dominio virtual creado y nos preguntará el tiempo de actualización de la dirección ip externa. Podemos dejar todos los valores por defecto tal cual, y continuar hasta finalizar la instalación.

    Podemos iniciar el servicio ejecutando «sudo /usr/local/bin/noip2» pero lo ideal sería que inicie automáticamente en el arranque del PI. Para esto debemos crear el archivo /etc/init.d/noip2 con el comando

    sudo nano /etc/init.d/noip2

    y colocamos esto dentro del contenido del mismo

    #! /bin/bash
    ### BEGIN INIT INFO
    # Provides: Servicio No-IP
    # Required-Start: $syslog
    # Required-Stop: $syslog
    # Default-Start: 2 3 4 5
    # Default-Stop: 0 1 6
    # Short-Description: arranque automatico para no-ip
    # Description:
    #
    ### END INIT INFO
    sudo /usr/local/bin/noip2

    Guardamos el archivo, y finalmente damos permisos de ejecución, y lo colocamos en la cola de arranque

    sudo chmod +x /etc/init.d/noip2
    sudo update-rc.d noip2 defaults

    Así garantizamos que el dominio virtual creado en no-ip tenga siempre asignada nuestra dirección IP externa de nuestro modem. Ahora si podemos configurar nuestros servidores virtuales en nuestro router y listo! acceso externo a nuestro PI.

    En mi caso, tengo un modem Huawei, y configurar los servidores virtuales no es ninguna ciencia. Se crea el nombre del servicio, se asignan los rangos de puertos y la IP interna a la que se redireccionará el servicio y listo.

    rpi_ports

    Con esto, tengo acceso VNC, SSH y HTTP a mi Raspberry Pi. Cero seguridad (no se recomienda nunca abrir un SSH, pero bueno, esto se hizo para probar) pero cualquier cosa que pase con mi Pi la puedo revisar desde la oficina o desde mi teléfono celular