12/17/2012

Herramientas y trucos para Arduino

Arduino tiene un editor de código, digamos que no muy pulido comparado con Sublime Text 2 o Notepad++, pero tenemos un truco para solventar eso.

Nos vamos a las preferencias del editor de Arduino y seleccionamos la opción "Usar editor externo" y guardamos los cambios, esto hace que el editor se bloquee y NO permita editar los ".ino" (los abre como "solo lectura"), ahora abrimos nuestro editor favorito y al guardar los cambios realizados en el sketch el editor de Arduino refrescará los cambios automáticamente pudiendo así subir las últimas modificaciones a nuestra placa.

Fritzing
Es una herramienta para crear y documentar diseños y prototipos de placas, la he ocupado para el proyecto "Topo", es intuitiva y de fácil uso, la recomiendo básicamente para la documentación de nuestros proyectos y así poder compartir de una manera mas "ordenada" los prototipos.



Y como bonus-track, le dejo un blog que nos ayudará a formatear nuestros códigos fuentes para su publicación web.

Fuentes

11/21/2012

Juego del topo en Arduino

Arduino Duemilanove
El juego es sencillo, se encienden unas luces de colores aleatoriamente que están vinculadas a unos botones, si presionamos el botón incorrecto se enciende la luz roja, de lo contrario se apaga la luz recién encendida.

Para construir este juego solo necesitamos una placa Arduino UNO, 3 LEDs, cables, 2 botones, 5 resistencias (3 de 1K ohms para los LEDs y otras 2 de 10k ohms para los botones) y una pequeña breadboard.

Un ejemplo básico entre un botón y un LED

En la página oficial de Arduino existen diversos tutoriales, donde explican detalladamente los distintos componentes de la placa, instalación y la forma de diseñar y programar. Si ya entiendes los conceptos básicos entonces estamos listos para revisar algo de código:

Mole.h
Este archivo corresponde a la cabecera de nuestro proyecto, contiene las declaraciones de los métodos y atributos.
 /*  
  Mole.h - Library for mole game.  
  Created by brionescl, July 23, 2012.  
  Released into the public domain.  
 */  
 #ifndef Mole_h  
 #define Mole_h  
 #include "Arduino.h"  
 #define MAXLEDS 2  
 #define MAXBUTTONS 2  
 class Mole {  
      public:  
           Mole();  
           void setLed(int pin);  
           void setLedError(int pin);  
           void setButton(int pin);  
           void switchLed(int ledId, bool state);  
           void switchLedError(bool state);  
           void calculateRandomLed();  
           void captureButtonPress();  
           int timeLapse;  
           int maxTimeLapse;  
           int buttonPress;  
           int randomLed;  
      private:  
           int _ledId;  
           int _buttonId;  
           int _leds[MAXLEDS];  
           int _buttons[MAXBUTTONS];  
           int _pinLedError;  
 };  
 #endif  

Mole.cpp
Aquí se encuentra el desarrollo (lógica) de los métodos y uso de los atributos de la clase "Mole".
 /*  
  Mole.cpp - Library for mole game.  
  Created by brionescl, July 23, 2012.  
  Released into the public domain.  
 */  
 #include "Arduino.h"  
 #include "Mole.h"  
 Mole::Mole() {  
      _ledId = 0;  
      _buttonId = 0;  
      randomLed = -1;  
      timeLapse = 0;  
      maxTimeLapse = 1000; // 1 second  
      buttonPress = -1;  
      randomSeed(analogRead(0));  
 }  
 void Mole::setLed(int pin) {  
      if (_ledId < MAXLEDS) {  
           _leds[_ledId++] = pin;  
           pinMode(pin, OUTPUT);  
      }  
 }  
 void Mole::setButton(int pin) {  
      if (_buttonId < MAXBUTTONS) {  
           _buttons[_buttonId++] = pin;  
           pinMode(pin, INPUT);  
      }  
 }  
 void Mole::setLedError(int pin) {  
      _pinLedError = pin;  
      pinMode(pin, OUTPUT);  
 }  
 void Mole::switchLed(int ledId, bool state) {  
      if (state == true) {  
           digitalWrite(_leds[ledId], HIGH);  
      } else if (state == false) {  
           digitalWrite(_leds[ledId], LOW);  
      }  
 }  
 void Mole::switchLedError(bool state) {  
      if (state == true) {  
           digitalWrite(_pinLedError, HIGH);  
      } else if (state == false) {  
           digitalWrite(_pinLedError, LOW);  
      }       
 }  
 void Mole::calculateRandomLed() {  
      randomLed = random(0, MAXLEDS);  
 }  
 void Mole::captureButtonPress() {  
      int button = 0;  
      for (int buttonId = 0; buttonId < MAXBUTTONS; buttonId++) {  
           button = digitalRead(_buttons[buttonId]);  
           if (button == HIGH) {  
                buttonPress = buttonId;  
                break;  
           } else {  
                buttonPress = -1;  
           }  
      }  
 }  

Mole.ino
La definición de nuestro sketch
 #include <Mole.h>  
 const bool ON = true;  
 const bool OFF = false;  
 Mole mole;  
 void setup() {  
      //Serial.begin(9600);  
      // pin LEDs  
      mole.setLed(12); // 1 kohms +/-5  
      mole.setLed(11); // 1 kohms +/-5  
      // LED error  
      mole.setLedError(10); // 1 kohms +/-5  
      // pin Button  
      // 3.3v  
      mole.setButton(3); // 10 kohms +/-5  
      mole.setButton(2); // 10 kohms +/-5  
      mole.calculateRandomLed();  
      mole.maxTimeLapse = 2000; // 2 seconds  
 }  
 void loop() {  
      mole.captureButtonPress();  
      if (mole.buttonPress != -1) {  
           //Serial.println(mole.buttonPress);  
           mole.switchLed(mole.randomLed, OFF);  
           if (mole.randomLed == mole.buttonPress) {  
                delay(1000);  
           } else {  
                mole.switchLedError(ON);  
                delay(2000);  
                mole.switchLedError(OFF);  
           }  
           mole.timeLapse = 0;  
           mole.calculateRandomLed();  
      } else {  
           //Serial.println("NO PRESS");  
      }  
      if (mole.timeLapse == mole.maxTimeLapse) {  
           mole.timeLapse = 0;  
           mole.switchLed(mole.randomLed, OFF);  
           mole.switchLedError(ON);  
           delay(500);  
           mole.switchLedError(OFF);  
           mole.calculateRandomLed();  
      } else {  
           mole.switchLed(mole.randomLed, ON);  
           delay(1);  
           mole.timeLapse++;  
      }  
 }  
Diseño y cableado del proyecto


Fuentes

11/08/2012

Actualizar ICS en Sony Xperia S

Creo que algunos ya vienen de fábrica, otros solo reciben un mensaje para actualizar (via OTA o por USB), pero hay quienes les gusta (me incluyo) instalar desde cero una ROM a nuestro celular.

Instalar Ice Cream Sandwich (ICS) desde cero es muy sencillo, solo hay que descargar un par de cosas, seguir unos pasos (en windows) y ya está.

En este tutorial explican detalladamente el como hacerlo, de todas maneras les resumo los pasos mas importantes:

  • Descargar FlashTool e instalar
  • Descargar la ROM oficial para tu modelo (en mi caso Xperia S) y copiar el archivo FTF en "C:/FlashTool/firmwares
  • Muy importante "Apagar el celular con al menos 80% de batería" y ejecutar el software FlashTool
  • Hacer click en el botón "Flash" en FlashTool y seleccionar la ROM descargada
  • Conecta el celular en "modo flash" (en mi caso fue enchufar el USB al celular manteniendo apretado el botón "bajar volumen", ojo el celular tiene que estar apagado)
  • Esperar a que se instalen las fuentes (15 minutos aproximadamente) y reiniciar el celular, el primer reinicio tomará un tiempo.

Fuente
http://androidmx.net/2012/06/actualiza-tus-xperia-a-ics-4-0-4-oficial-de-sony/

10/22/2012

Ready Player One


Todo geek amante de los video juegos tiene que leer este libro, en realidad es muy entretenido y en algunas partes llega a ser "épico" en su narración.

Ready Player One cuenta sobre un futuro cercano, a la mitad del Siglo XXI, donde una post-Internet llamada OASIS, híbrido entre MMORPG (Massively Multiplayer Online Role-Playing Games) y realidad virtual avanzada, conecta cada aspecto posible de la vida social y personal del planeta.

El héroe es un joven que narra para nosotros su epopeya geek: hacerse del primer lugar en el videojuego de videojuegos, el mayor de la historia, para ello tendrá que aprovechar las toneladas de datos coleccionados en su cabeza, con referencias cruzadas, claro, más sus habilidades extraordinarias como gamer.

Les dejo un review completo sobre el libro (ojo con algunos spoilers), en resumen, el libro en cuestión es ligero en su lectura (en 5 días con 30 minutos de lectura promedio lo acaban), con más fórmulas de best-seller que de ciencia ficción, cuya aventura (¿un derivado post-cyberpunk light?) está estructurada como un video juego. En líneas generales, no es más que una búsqueda del tesoro puesta por escrito, aunque puede resultar divertida e incluso absorbente para quienes hayan quemado una parte de su gloria adolescente jugando en las maquinitas de los ochenta.

Fuentes

10/10/2012

Scrollbars, Modal Dialog y jQuery en IE8

Uno de los problemas que se presenta a menudo son las barras de desplazamiento que aparecen en Internet Explorer 8 al desplegar un cuadro de diálogo (Modal Dialog) de jQuery, para corregir esto hay que asignar métodos a las opciones "open" y "close" al configurar el diálogo:
 var dialogOpts = {  
      title: 'Modal Dialog',  
      modal: true,  
      autoOpen: true,  
      height: 300,  
      width: 500,  
      /* Scrollbar fix */  
      open: function(event, ui) {  
           $('body').css('overflow', 'hidden');  
           $('.ui-widget-overlay').css('width', '100%');  
      },   
      close: function(event, ui) {  
           $('body').css('overflow', 'auto');  
      }  
 };  
Esto sobreescribe el CSS del <body> eliminando las barras vertical y horizontal, perdiendo la posibilidad de hacer scroll mientras se despliega el cuadro de diálogo.

Fuentes

10/04/2012

Ajustar ancho de jqGrid automaticamente

jqGrid es un plugin para jQuery muy útil, el cual te permite crear grillas muy completas con algunas pequeñas lineas de código, es  muy configurable, con una gran variedad de ejemplos y una wiki bastante extensa, pueden revisar un pequeño tutorial para mas información de como utilizar esta grilla.

Días atrás me topé con un problema al implementar la grilla en un proyecto, esta no modificaba su ancho al redimencionar la ventana del navegador, para solucionar esto debemos agregar las siguientes líneas en el <body>:
 $(window).bind('resize', function() {  
      var grid = null;  
      if (grid = $('.ui-jqgrid-btable:visible')) {  
           grid.each(function(index) {  
                var gridId = $(this).attr('id');  
                var gridParentWidth = $('#gbox_' + gridId).parent().width();  
                $('#' + gridId).setGridWidth(gridParentWidth);  
           });  
      }  
 }).trigger('resize');  
Fuente