Programando un ATtiny85 con Arduino



Hacía tiempo que quería hacer algún proyecto con un Arduino, y finalmente encontré algo útil que hacer: ¿Por qué no hacer que una luz que tengo en el garage se encienda cuando detecte movimiento?
Ciertamente es un proyecto super sencillo que quería usar para poder enseñar a otras personas los fundamentos básicos de un Arduino y de paso los de programación en C.
Una vez finalizado el mini proyecto, la idea era haberlo montado sobre un Arduino nano pero al llegar a la tienda a comprarlos descubrí el ATtiny 85. Con este microcontrolador podemos ejecutar lo mismo que en un Arduino aunque con ciertas restricciones, la página de especificaciones está aquí.
El precio ronda los 2 euros, por lo que para proyectos pequeños es mucho más barato que un Arduino nano y encima era un nuevo reto, por lo que me pareció interesante probarlo.
El modelo que yo he utilizado es exactamente igual al que aparece en la imagen: ATTINY85-20PU, con un rango de voltage de 2.7 a 5.5 voltios.
Llegados a este punto tenemos 2 partes claramente diferenciadas:
  1. Hacer el programa para Arduino.
  2. Programar el ATiny85 usando el Arduino.


Programa para el Arduino.


En este apartado no voy a detallar como empezar a programar un Arduino, para ello hay magníficos manuales por internet. EL código del programa sería el siguiente:

#include <Arduino.h>

#define pinLight 13
#define pinSensor 12
#define delayTime 500

int steps = 0;

void setup()
{
  pinMode(pinSensor, INPUT);

   pinMode(pinLight, OUTPUT);

   //Only to show some lights activity at the beginning of the program

   //is not necessary and can be removed.
  digitalWrite(pinLight, HIGH);
   delay(2000);
   digitalWrite(pinLight, LOW);
}

void loop()
{
    delay(delayTime);
     
    if(digitalRead(pinSensor) == HIGH){
      steps = 0;
      digitalWrite(pinLight, HIGH);
    }
    else if(steps > 10){
        digitalWrite(pinLight, LOW);      
        steps = 0;
    }
    steps++;
}




Como se puede comprobar el programa es muy simple.
Conectando el sensor y un led siguiendo este esquema podemos ver que todo funciona correctamente, en este caso el led es opcional ya que el led que hay en el Arduino se maneja con el pin 13.
Cuando vayamos a programar el ATtiny hay que cambiar los pines que se van a utilizar en mi caso he utilizado el 0 y 1.

Programar el ATiny85 usando el Arduino.

Para poder utilizar el Arduino como ISP (In-System programmer)  para el ATtiny tendremos que seguir los siguientes pasos:
  1. En el entorno de desarrollo de Arduino (Preferiblemente la última versión) https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json


Configurar programa Arduino 1.6.7



Configurar arduino como isp

Turning the Arduino board into a programmer

We’re going to use the Arduino board to program the ATtiny. First, we’ll need to turn the Arduino board into an “in-system programmer” (ISP). To this:
  • Run the Arduino development environment.
  • Open the ArduinoISP sketch from the examples menu.
  • Note for Arduino 1.0: you need to make a small change to the ArduinoISP sketch before uploading it. Find the line in the heartbeat() function that says “delay(40);” and change it to “delay(20);”.
  • Select the board and serial port that correspond to your Arduino board.
  • Upload the ArduinoISP sketch.

subir el sketch y hecho !!! :)

.


Referencias:
https://www.arduino.cc/en/Main/Software
http://www.atmel.com/devices/ATTINY85.aspx
http://highlowtech.org/?p=1695

Limpiar un objecto javascript sin perder la referencia al mismo

Aquí dejo un simple ejemplo de como limpiar un objecto javascript sin perder la referencia al mismo, esto es especialmente necesario en frameworks tipo angularjs en el cual si realizamos una asignación del tipo myObject = {} para limpiar el objecto estamos creando un objeto nuevo, por lo que el bindeo deja de funcionar ya que está referenciado a otro objecto, como solución simple se puede hacer algo así:

    clearObject = function(obj){
        var keys = Object.keys(obj);
        for (var i = 0; i < keys.length; i++) {
            delete obj[keys[i]];
        }
    }

Simple y rápido.

Configuración rápida de Xdebug

Para configurar rápidamente Xdebug hay que seguir estos pasos:
Entrar en http://xdebug.org/wizard.php y poner el html generado por la función phpinfo().
Bajarnos la dll que nos dice y ponerla en el directorio indicado.
Modificar el php.ini donde pone [XDebug] poner lo siguiente:

[XDebug]
zend_extension = C:\xampp\php\ext\php_xdebug-2.2.0-5.3-vc9.dll
xdebug.remote_enable=1
xdebug.remote_host="localhost"
xdebug.remote_port=9000
xdebug.remote_handler="dbgp"


Reiniciar el servidor Apache.


'Invalid Character exception' problemas al deserializar XML

La serialización, deserialización de objetos utilizando un archivo xml para almacenarlos o transferirlos es una herramienta muy útil. El problema es que en los archivos xml no están permitidos todos los caracteres. Si somos cuidadosos serializando nos podremos evitar este tipo de problemas. El verdadero problema se presenta cuando estos xml no los generamos nosotros, sino que nos los proporciona una organización externa a nuestra empresa, y no existe la posibilidad o la voluntad, de cambiarlos. En este caso el peor problema es que el xml nos venga con caracteres inválidos, dándonos una excepción de "Invalid Character".

ListView delayed, controlando la sobrecarga de eventos en un VistView

Tenemos el siguiente escenario: Una aplicación con dos ListViews, al dispararse el evento OnSelectedIndexChanged de uno de ellos, el otro se actualiza. Esto provoca que cuando el usuario recorre las distintas entradas, hace una multiselección o en general interactúa con la aplicación, los ListView implicados, van a parpadear de manera bastante molesta, e indicando una sobrecarga de trabajo producida por nuestra aplicación, que, en el peor de los casos, podría llegar a bloquearla, dependiendo de que tipo de actualización se lleve a cabo en el ListView que está enlazado. Si este realizara un acceso a base de datos, podríamos llegar a bloquear al resto de usuarios que estén ejecutando esta aplicación en otras máquinas. Esto se puede evitar de múltiples maneras, y hoy voy a describir una bastante sencilla que he desarrollado.

Desarrollo de plugins para wordpress (II)

En la entrada anterior vimos como dar los primeros pasos en la creación de un plugin para Wordpress. Entre otras cosas, hablamos de cómo podían interactuar los plugins con la plataforma Wordpress.
Haciendo un poco de memoria recordaremos que vimos  los métodos add_filter y add_action, por lo que nos quedarían por ver los template tags y los shortcodes.
¿Cual es la diferencia entre los template tags y los shortcodes? La mayor diferencia es que un shortcode es una marca que ponemos en un post o una página, mientras que un template code es una función que ha de colocarse en el template que estemos utilizando.
¿Cuales debo utilizar?, depende exclusivamente de desde donde tenemos pensado utilizarlos, si los queremos para modificar el template utilizaremos template tags, si lo que queremos es poder utilizarlo desde cualquier sitio y cuando nos venga en gana --Lo cual dicho así parece el mejor método-- utilizaremos shortcodes, que es exactamente lo que vamos  a ver a continuación.


Cacheando con PHP

Precisamente hoy terminaba una aplicación web que conecta a un servicio web pidiéndole una serie de datos sobre apuestas deportivas, sobre esos datos se realiza un tratamiento, que sin ser demasiado pesado, ralentiza algo más de la cuenta la página, si ademas tenemos en cuenta que en caso de que el tráfico sea alto podemos sobrecargar excesivamente el servidor, al final he optado por un modelo de cache bastante sencillo.

Cuando se utiliza PHP como un módulo de Apache se pueden cambiar ciertos ajustes de configuración usando directivas en los ficheros de configuración de Apache, como por ejemplo los ficheros .htaccess
En este caso las directivas que nos interesan son auto_prepend_file y auto_append_file, cito textualmente:

Conocer el origen de las visitas a nuestra página

A la hora de conocer el impacto que está teniendo una web determinada es necesario recurrir a los informes de google analytics. Estos informes son una poderosa herramienta que nos informa de manera exhaustiva de casi todos los parámetros que pueden resultar de cierto interés para el responsable del sitio. A continuación pongo el ejemplo de informe personalizado que utilizo para medir los orígenes del tráfico.