martes, 4 de septiembre de 2012

Problemas al instalar ADT Plugin para Eclipse

Si os habéis decidido a programar para android en Windows, probablemente habréis optado por utilizar Eclipse para tal fin. También habréis tenido que instalar Android SDK y finalmente el plugin ADT para eclipse. Lo que voy a tratar de resolver a continuación, son los problemas a la hora de instalar éste último plugin...




En mi caso, hace unos meses he instalado el paquete entero que os acabo de mencionar sin problema alguno. Pero ayer, volviendo a instalar todo por segunda vez y de la misma manera, eclipse me dice algo parecido a ésto:

Cannot complete the install because one or more required items could
not be found.
Software currently installed: Shared profile 1.0.0.1316138460759
(SharedProfile_epp.package.java 1.0.0.1316138460759)
Missing requirement: Shared profile 1.0.0.1316138460759
(SharedProfile_epp.package.java 1.0.0.1316138460759) requires
'org.maven.ide.eclipse [1.0.100.20110804-1717]' but it could not be
found

Tras probar varias soluciones disponibles en la red, me quedo con dos.

  • En primer lugar, cerrad eclipse y ejecutadlo de nuevo como administrador (botón dcho > ejecutar como administrador). En mi caso, he alojado el directorio de eclipse en "C:\Program Files". Éste directorio, además de ser famoso por alojar prácticamente todos los programas que instalamos en nuestro PC, lo es también por requerir privilegios elevados para casi todas las operaciones. Una vez ejecutado de ésta manera, no debería poneros ninguna traba a la hora de leer, escribir o ejecutar algo dentro de eclipse.
  • Si aún así seguís obteniendo el mismo error, probad a mover las carpetas "eclipse" y "android" de "C\:Program Files" a "C:\".
 Os aseguro que en mi caso, fue suficiente con el procedimiento descrito en el primer punto, pero el segundo por lo visto, tiene gran aceptación en la comunidad. Supongo que a alguien le funcionaría...

Un saludo, Marcos R.


miércoles, 30 de mayo de 2012

Ayuda! Mi arduino se reinicia solo...


En éste caso, y ya que la temática actual lo venía exigiendo, vamos a solucionar un pequeño problema con nuestro Arduino, que nos trae de cabeza desde hace unos días. Si observas que tu arduino hace cosas raras como reiniciarse sin previa orden, o parpadeos del led integrado en el pin 13 inesperados, etc, sigue leyendo, porque puede ser que termines tirándote de los pelos...

En primer lugar, para descartar otros errores, guarda el sketch en el que estés trabajando en lugar seguro dentro del PC. Y a continuación crea uno nuevo con el siguiente código y grábalo en tu arduino. Éste código está pensado para ser lo más simple posible, y está comprobado que falla en las circunstancias adecuadas. ;)

const int led = 13;

void setup(){
   pinMode(led, OUTPUT);
   digitalWrite(led, HIGH);
}

void loop(){

}

Parece obvio, ¿verdad? Según éste código ponemos el pin 13 (led de la placa) como salida, y a continuación enviamos un nivel alto. Lo que supone que el led se encienda. Observa la placa con atención y si el led parpadea de vez en cuando, comprueba lo siguiente:

  • Si tu PC es de escritorio, probablemente dejará alimentados los USB tras apagarlo. Prueba a apagar el PC y dejar tu Arduino conectado. Asegúrate de si ahora el funcionamiento es correcto. Así descartaremos un problema de interferencia entre SW.
Si una vez apagado, Arduino funciona bien, estamos ante un caso de interferencia con otro software. Check this:
  • Arranca de nuevo tu PC.
  • En primer lugar, si tienes un smartphone, que utilice un programa de sincronización en el equipo, prueba a cerrarlo. En mi caso era el PC-Companion de los XPERIA, pero puede ser cualquier otro.
  • Reinicia la placa Arduino con el botón de reset y vuelve a observar.
  • Si sigue fallando, abre el administrador de tareas y trata de buscar algún proceso que esté enviando mensajes al USB a modo de "polling". Si encuentras algo sospechoso, ciérralo también y de nuevo el paso anterior.
Si tu aún no se ha solucionado, prueba lo siguiente:
  • Desinstala el controlador de la placa Arduino y vuelve a instalarlo siguiendo los pasos de la página oficial.
  • Comprobaremos que el usb del PC funciona correctamente, y si es así, probaremos otro cable.
  • Si finalmente el problema persiste (y conste que se me están acabando las ideas) hay quien ha tenido problemas con algo llamado "AutoResetOnSerialConnection", pásate por aquí.
Seguidos éstos pasos, el 99% de los problemas deberían solucionarse. Sin embargo, en ocasiones la informática es caprichosa. También puedes plantearte probar otro Arduino en tu máquina, y así sabremos si se trata de un defecto en la placa.

Espero que os haya servido de ayuda.

Un saludo,

MarcosRgz.

domingo, 20 de mayo de 2012

Vistazo al proyecto Arduino

Fotografía extraída de la página oficial de arduino

Después de éste largo tiempo fuera del cable, volvemos para hablar de un aparato que lo está petando en el mundillo de la electrónica. Ni mas ni menos que Arduino. Open hardware con denominación italiana. El objetivo de éste maravilloso componente es facilitar en cierto modo el desarollo de aplicaciones electrónicas y digitales. Pero, ¿Como es eso posible? Lean y tomen nota...

Para hacernos una idea un poco pijamera de lo que tenemos entre manos, se trata de una placa con un microcontrolador similar a un PIC (concretamente uno de la casa Amtel Systems Co.), 28 pines hembra cada uno de ellos con su respectiva función impresa en dicha placa, un micropulsador de reset, unos cuantos condensadores, diodos, resistencias y leds (todo SMC), un conector de alimentación, pines para programación en circuito (ICSP), y un conector USB estándar hembra de tipo B. Un buen batido de componentes.

En cuanto a software, en la sección de descargas de la página oficial del proyecto arduino podemos encontrar un paquete que contiene, desde los drivers del aparato, hasta un IDE propio de la casa, bastante minimalista, pero que cumple su función. Todo ello, claro está, pasando por gran cantidad de ejemplos funcionales para diferentes aplicaciones y las librerías necesarias para llevar a cabo vuestros proyectos.

Bueno, todo esto no termina de sonar bien del todo. Seguro que muchos conoceréis más o menos el mundo de los PICs y lo complicado que es realizar un proyecto completo. Arduino nos facilita la vida enormemente, poniendo a nuestra disposición numerosas librerías de alto nivel. Para que os termine de quedar claro, pasaros por aquí y echadle un vistazo al ejemplo de la página oficial. Veréis como transcurridos 5 minutos desde que sacásteis vuestro arduino de su envoltorio tenéis una aplicación funcionando, y lo mejor de todo: ¡Entendéis hasta el último detalle de la misma!

Finalmente debemos comentar un par de cosas derivadas de la experiencia. En primer lugar arduino es uno de los pocos hardwares libres que existen. Es realmente económico, pero podéis compraros una copia china más barata en eBay. No obstante, la diferencia de precio va a ser menospreciable, y en el primer caso estaréis contribuyendo a uno de los proyectos  socio-tecnológicos más interesantes para la comunidad de la que formamos parte.

En segundo lugar, y en una tónica menos profunda, vuestro arduino vendrá sin cable, probablemente un sábado cuando justamente las tiendas estén cerrando por una festividad extraña que aún no se ha inventado. Asique buscad por casa uno de éstos cables o id a vuestra tienda preferida a por uno. És el tipo de USB cuadrado que suelen utilizar las impresoras modernas.

Y ésto es todo por el momento.

Próximamente, megatutorial de conexión arduino-PC mediante USB, e interfacing con mi amado C#. No te lo puedes perder!

Un saludo, MarcosR.


domingo, 12 de febrero de 2012

Reparar el menú contextual de WinRAR

Buenas.

Hoy he solucionado un problema que tenía en la lista de pendientes, y que por lo visto, no me afecta únicamente a mi. Desde siempre he utilizado la herramienta WinRAR en mi equipo para comprimir y descomprimir ficheros cuando encontraba la necesidad. A menudo suelo utilizar los menús contextuales "unzip here" y "add to zip" por comodidad. Cuando utilizas mucho éstas acciones, resulta una verdadera pérdida de tiempo tener que abrir el programa.

El caso es que desde hace unos meses, éstas opciones aparecen en el menú contextual ("click derecho"), pero aparentemente no hacen nada. Cabría pensar en primer lugar que se tratase de un mal funcionamiento por parte del programa. Y lo más rápido y lógico a éste respecto, es optar por la ya clásica solución "desinstalar y volver a instalar". Desgraciadamente, ésto no va a funcionar.

También se ha dado el caso de usuarios a los que no les aparecían las opciones en el menú contextual. A mi no me ha pasado, pero en las opciones del programa, hay un checkbox para que aparezcan. Es posible que también tengáis que aplicar la siguiente solución.

Si cometéis el error de buscar en google la solución, iréis a parar irremediablemente a la misma página de siempre, en la cual, un montón de gente que no tiene ni la menor idea de lo que habla, propone para todo las mismas soluciones, que solo retrasarán lo que tengáis entre manos. Internet es un lugar al que acudir en busca de cultura, conocimientos y pornografía. Desde aquí hago un llamamiento para que toda aquella gente que no sabe dónde se esta metiendo, utilice la siguiente norma: "SI NO SABE, NO CONTESTE!!".

Bueno, dicho ésto, a lo que nos enfrentamos no es más que el típico problema de permisos de Windows. La solución es ir a "C:\Program Files\WinRar\" si esa es vuestra ruta, e ir a los permisos de "WinRar.exe" desde botón derecho > propiedades. La solución es como matar mosquitos a cañonazos, pero que yo sepa es la única de momento.

Una vez en las propiedades, vamos a la pestaña seguridad. Donde nos aparecerá la siguiente ventana:


Seleccionamos en la lista superior, el usuario que nos interese. A continuación, pinchamos el botón editar.

Volvemos a seleccionar el usuario en la lista superior, y le marcamos el permiso control total. Aplicamos y aceptamos todas las ventanas.

Me imagino que los desarrolladores de windows habrán encontrado alguna grieta de seguridad relativa a ésta forma de ejecutar programas. Para evitarlo, habrán sacado un parche tan grande que cubre a todos los programas de ésta índole, como siempre, sin preocuparse de los daños singulares que nos puedan causar a tí o a mi. Lo mejor sería evitar ésta clase de problemas, y para ello hay que desarrollar software robusto. Ésto en UNIX no pasa. Lo que quiere decir, que es posible hacerlo bien. Pero como dice siempre mi abuela, que de informática no sabrá nada pero ya tiene muchos inviernos, "el que mucho abarca, poco aprieta".

Lo habitual es que cuando tu usuario se queda corto de permisos para realizar una acción, te salga la típica ventanita para proporcionar privilegios de administrador. Éste normalmente tiene "control total", aunque en la práctica hay cosas que se le prohíben hasta para administrador del sistema. (Es otra cosa que nunca entenderé). En éste caso, el usuario carece de los privilegios necesarios, pero el sistema no pide los privilegios de administrador. Simplemente pasa de tí. En cambio,  el programa WinRar.exe sí que tiene marcada la opción de "ejecutar como administrador", y es por eso que desde dentro del programa, podemos descomprimir y comprimir normalmente, aceptando ejecutar como admin. al principio. Cuando utilizamos botón derecho, no proporcionamos los permisos necesarios, porque algún desarrollador (de Microsoft o de WinRar) metió la pata en algún punto.

Solo me queda añadir, que si bien hay muchos problemas que se pueden solucionar de ésta manera, es una medida extrema que no se debe tomar como costumbre. Aplicar control total a un usuario sobre WinRar en tu PC personal, no debería tener efectos adversos. Hacerlo sobre Norton Comander en un PC al que normalmente acceden varios usuarios, por poner un ejemplo, ya es otro cantar.

Espero que os haya servido de ayuda!

Un saludo, Marcos R.


jueves, 2 de febrero de 2012

Comenzando con C


Hoy vamos a meternos un poco con el lenguaje C. Ésta entrada tratará de explicar brevemente como funciona éste lenguaje, y nos dará las claves necesarias para empezar a hacer nuestros programillas.
Si te interesan los artículos de PICs colgados anteriormente en Wirelearn, pero el C no acaba de entrarte por los ojos, presta atención a ésta explicación pues te será de gran ayuda.

Comencemos.

A lo largo de mis ya 4 años de estudios de informática, y otros 5 más al menos por mi cuenta, he visto muchas y diferentes maneras de tratar de enseñar un lenguaje. A mi entender, todas son buenas respecto a la intención, pero la mayoría fallan en cuanto a resultados.

Lo primero que debemos preguntarnos es ¿qué necesitamos? Hay quien opina que los Entornos de Desarrollo Integrado (EDI o en inglés IDE) son para tontos y gente que no sabe utilizar un PC. Nada más lejos de la realidad. Podría enseñaros a compilar en consola mediante la orden gcc (linux) por ejemplo, pero perdería el tiempo. Señores, dinosaurios del cretácico y seres del caldo primigenio, estamos en el siglo XXI. La consola es extremadamente útil, pero no para programar, y mucho menos para comenzar a hacerlo.

Visto ésto os recomiendo utilizar el entorno DEV C++. Libre e intuitivo.
Descárgatelo desde aquí, o busca el que más te guste por la red.

Dejemos claros unos cuantos conceptos antes de ponernos a programar como si no hubiese mañana:

    • C es un lenguaje COMPILADO: El procesador no entiende el lenguaje C. Solo entiende
      bloques de unos/ceros. Por lo que para probar nuestro programa, deberemos compilarlo antes. Ésto es, traducirlo a lenguaje máquina (entre otras cosas), y de ésto se encargará el compilador, que instalaremos con el IDE que os comenté hace unas líneas.

    • Acerca de ser un lenguaje compilado, hay un matiz muy importante. Cuando compilamos un programa, lo traducimos al lenguaje de nuestro procesador. Desgraciadamente, no hay un estándar global en cuanto a lenguaje de procesadores, y muy probablemente, si quereis portar vuestro programa a otra máquina, tengais que compilar los fuentes en ella o buscar otras alternativas. Éste es el principal motivo que hizo tan famoso a Java (compilado e interpretado) y que dió lugar a los demás lenguajes interpretados. Pero ahí entraremos en otro momento.

    • Es un lenguaje CASE SENSITIVE: Distingue mayúsculas y minúsculas, por lo que no
      es lo mismo miVariable que mivariable ni NombreUsuario que nombreUsuario.

    • Éste punto es de mi cosecha. Las llaves que vais a ver más adelante“{}”, no se ponen por casualidad. C a mi entender es un lenguaje muy duro en cuanto a la sintaxis. Hay que acostumbrarse a normas como que todas las instrucciones terminan en punto y coma, hay que respetar correctamente las llaves, etc.

    • Es un lenguaje, en definitiva, de alto rendimiento, porque los programas ya están en lenguaje máquina a la hora de ser ejecutados, pero da lugar a programas de baja portabilidad como resultado de ser compilado.

Ahora voy a hacer un pequeño comentario acerca de los tipos de ficheros con los que vais a tratar a la hora de progamar en C. Principalmente cabe destacar dos:

    • Ficheros de código ó ficheros .c: Aquí estará el codigo principal de vuestros programas. Código que será exclusivo para ellos y que no pretendéis reutilizar.

    • Ficheros de cabecera o ficheros .h: Contienen funciones y procedimientos construidos y listos para ser utilizados, tales como leer pulsaciones de teclado, imprimir por pantalla, o comparar dos cadenas. Si en algún caso observáis que aparece con frecuencia una misma función en vuestros programas, podríais plantearos crear una librería y meter dentro vuestra función, de manera que no tendríais que volver a escribirla. Bastaría con introducir al principio de vuestros .c una directiva #include “Ruta/nombreLibrería.h” y estaría lista para ser utilizada.

Una vez expuesto lo más básico acerca del lenguaje C, os recomiendo encarecidamente que le echéis un vistazo a éste pdf, que no es obra mía como podréis observar en la cabeza de cada página. Explica conceptos necesarios como tipos de dato, declaración de variables, y habla un poco de las librerías estándar que más adelante utilizaréis en casi todos vuestros programas. También podéis echar un vistazo a la página c.conclase.net, donde explican a fondo todos los conceptos que veremos aquí, pero con una perspectiva bastante más técnica.

En posteriores entradas veremos cómo crear un programa con DEV C++ e intriduciremos conceptos como función, parámetro, valor, referencia, etc.

No te lo pierdas!

Un saludo, Marcos R.


miércoles, 18 de enero de 2012

HolaMundo en Hitech-C || Parpadeo de un led



El primer programa que se suele afrontar a la hora de entrar en el mundo de los PIC es hacer parpadear un led. En primer lugar debemos ser conscientes del funcionamiento del Led. En éste caso, partimos de un led que funciona a un voltaje de 1,7V y una intensidad de 10mA.

Habitualmente, la salida del PIC es de unos 5V. Eso es casi 3 veces mas de lo que soporta nuestro LED, y de conectarlo directamente, se quemaría enseguida. Para evitar esta catástrofe, haremos uso de la ley de Ohm para calcular la resistencia que debemos utilizar. De ésta manera, nuestra resistencia sera el cociente de V / I, donde V es la tensión óptima en el ánodo del LED, e I la intensidad de la rama en cuestión.

Dejándonos de tecnicismos, 3,3V / 10 mA = 330Ω, que pasado a código de colores estándar de las resistencias es Naranja – Naranja – Marrón – tolerancia.


Recordad que los LED (Light Emmiting Diode) como su propio nombre indica, son diodos, lo cual denota polaridad. Para que conduzcan, el ánodo ha de ser más positivo que el cátodo.

ATENCIÓN: Tanto para éste tutorial como para los demás, se parte de un PIC modelo 16F887 salvo que se especifique lo contrario. Los programas y las conexiones pueden variar entre modelos, por lo que, en caso de utilizar un dispositivo diferente al mencionado, deberéis comprobar que todo esté correcto antes de alimentar el circuito. 

Conectaremos a la pata 2 (RA0) de nuestro PIC el LED en serie con la resistencia de 330Ω y finalmente a GND.

Ya tenemos los conocimientos necesarios sobre el circuito. Ahora vamos con el programa:
#include <htc.h>
#define _XTAL_FREQ 8000000

void main(){

    ANSELH = 0;
    ANSEL = 0;
    TRISA = 0;
    PORTA = 0;

    while(1){
        RA0 = 1;
        __delay_ms(500);
        RA0 = 0;
        __delay_ms(500);
    }
}


Breve explicación del código:


  • Si no se establecen los valores de ANSELH y ANSEL, el programa no funciona, ya que si un PIN está seleccionado como analógico, automáticamente pasa a estar configurado como entrada. Por tanto, una modificación por software sobre PORTA en este caso, no tendría ningún efecto. Ésto pasa en éste modelo de PIC, al menos. He trabajado con su antecesor, el 16F877 y carece de éstos dos registros. No obstante, éstas configuraciones pueden comprobarse en el Datasheet, en el apartado de "I/O Ports".
  • Acerca de la librería <htc.h>, es la que define los nombres de registros, los nombres de los pines y algunas de las funciones estándar de hitech-c que se utilizan comúnmente como __delay_ms(). Por eso es necesario incluirla SIEMPRE.
  • La directiva #define _XTAL_FREQ hertzs es necesaria para la utilización de los delays, ya que lo que éstos hacen es generar instrucciones en función de la frecuencia a la que funciona el PIC. Tendréis que convivir con ella.
  • La función __delay_ms() lleva dos barras bajas al principio. Aún no me he molestado en indagar por que utilizan nombres tan feos para algunas cosas. Simplemente realiza una espera activa de los milisegundos pasados por parámetro.

Y dicho todo esto, ahora podemos simular nuestro proyecto con MPLAB SIM observando el valor del registro PORTA con un punto de debug en las instrucciones RA0 = 1 y RA0 = 0. Si todo está correcto, el bit menos significativo del puerto A debería alternar entre 0 y 1.

Probablemente algunos habréis pensado en simular con animación. Cuando utilicéis en vuestros programas la función __delay_ms o __delay_us, descartad inmediatamente ésta opción. La explicación es sencilla:

Cada paso del simulador es una instrucción. Cada instrucción dura medio microsegundo real (recordad: 8Mhz y 4 ciclos por instrucción). Si echamos cuentas, un delay de 500 milisegundos equivaldría a ¡un millón de instrucciones! Si ahora suponemos que vuestro simulador avanza una instrucción cada medio segundo, tendríamos que esperar la bonita cifra de 5,78 días para ver que nuestro LED cambia de apagado a encendido, y otro tanto para volver a apagarse.

Es por eso, que  vale mas prevenir, y poner un STOP en esas dos líneas, y darle al play normal.

En caso de duda, comentad.

Saludos – MarcosR. @IAmRutiger

viernes, 6 de enero de 2012

La función printf en PIC


Aquí va un corto pero interesante artículo acerca de cómo utilizar la función printf de C para escribir en un LCD utilizando el compilador HITECH-C Lite. No tengo intención ahora mismo de explicar el procedimiento para escribir en un LCD dado que necesitaría una entrada enorme. Por éso ésta entrada está orientada a todos aquellos programadores de PICs que al igual que yo se han topado con los problemas de escribir, por ejemplo, un numero decimal en un display LCD, 8 segmentos, puerto serie, etc.

En el C "de toda la vida", para imprimir algo en la salida estándar, la manera más común es echar mano de la librería stdio.h. Entre otras muchas funciones que define ésta librería se encuentra la función printf.

Un pequeño ejemplo:

#include <stdio.h>

void main(){

int miEdad = 22;

printf("Mi edad es %d", miEdad);

getchar(); // Paramos la ejecución hasta que se pulse una tecla
}


Lo que nos interesa de éste pequeño código es la línea 4. Es decir, la línea en la que aparece el printf de marras. El resultado de éste programa mostraría por pantalla el texto "Mi edad es 22".
Para refrescar la memoria de aquellos que no se acuerden del uso exacto de ésta función, como primer parámetro se envía la cadena con los tokens %, y los demás parámetros son los valores o variables que deseamos que aparezcan en lugar de cada token respectivamente. Así %d es substituido por el valor de la variable miEdad en nuestro programilla.

Una vez entendido ésto, si lo pasamos a PIC C (a partir de ahora haremos referencia de ésta manera al lenguaje utilizado para el compilador HITECH C) nos encontramos con que al compilar se muestra un error que nos viene a explicar que falta la función "putch".

Por lo que he podido deducir de mis escasas experiencias, la función printf() se encarga de construir la cadena, realizando los cálculos necesarios en los valores pasados como parámetro, y posteriormente los sustituye. Digamos que crea una cadena con el formato que queremos. A continuación, llama a la función putch() una vez por cada carácter de la cadena en cuestión. Y simplemente, la función putch() envía el carácter recibido a la salida estándar.

Aquí viene el meollo de la cuestión. En C normal, la salida estándar viene predefinida como la consola de dos, bash...etc. Generalmente es lo más común a la hora de probar los programas. Digamos que ya viene así montado, y si quieres que esa información se envíe a otro sitio tienes que modificar la salida.

En cambio, en PIC C, la función putch() viene definida como vacía. No tiene código. De ésta manera somos nosotros quienes al crear nuestro programa, decidimos a dónde van a parar nuestros datos.

Se deduce entonces de la información anterior, que para escribir (por ejemplo) en el puerto B, solo hay que hacer 3 cosas:


  1. Incluir la libreria stdio.h.
  2. Definir la función void putch(char c)
  3. Llamar a printf() de la forma normal.


Para terminar de aclarar todo ésto, un ejemplo:
/* LA IDEA ES IMPRIMIR LA CADENA "Mi edad es 22" MEDIANTE LA FUNCIÓN PRINTF EN UN LCD, Y UTILIZANDO EL FORMATO DE CADENAS TÍPICO DE C (%d) /*

#include <htc.h>
#include <stdio.h>

#define _XTAL_FREQ 8000000
#include "C:\users\Marcos\Electronica\lib\lcd.h"

void putch(char c){ // DEFINIMOS LA FUNCIÓN PUTCH
lcd_putc(c); // ENVIAMOS EL CHAR AL LCD
}

void main(void){

int miEdad = 22; // DECLARAMOS UNA VARIABLE

printf("Mi edad es %d", miEdad); // IMPRIMIMOS

while(1); // NO HACER NADA
}
Cuando utilicéis la función printf tened en cuenta que el uso de memoria se va a disparar. Sobre todo cuando
utilicéis impresión de datos en coma flotante (%f). Si teneis alguna pregunta no dudéis en guardar silencio comentar aquí abajo.

Un saludo!!

Marcos R. - @IAmRutiguer