Archivos en la categoría 'Programación'

GPS Toy / On board computer

Martes, Junio 5th, 2012
Update: This hardware was made from parts at adafruit, sparkfun and dealextreme. See the new, custom design with more power efficiency, better GPS and temperature sensor here.

This is something I’ve been working about a month now. It’s a little handheld GPS / on board computer that shows altitude, current course, synced satellites, speed, time and date, distance between saved point and current point (and its course and corrdinates) and total trip distance.

Cube GPS Toy

Cube GPS Toy

At first I wanted a speed-o-meter for my bike but you know, coding it’s free and could stop adding functions.

I managed to get some cheap serial GPS receptor, a tiny OLED display and an Arduino Mini Pro and started to code. First I knew I would need some big font and so I made my own using paint, each character 24×32 (96bytes). This is the complete parts list:

  • Ebay I2C SSD1306 based OLED display, 128×64, 0.96″ and 5V.
  • Ebay Arduino Mini Pro (ATMEGA328p), 5V 16Mhz
  • Sparkfun DC-DC step-up voltage converter (5V).
  • Adafruit MPC73833 LiPo battery charger.
  • Savaged iPod Nano 1st gen battery.
  • Dealextreme EM-411 GPS 5V receiver.
  • Savaged momentary buttons, resistors and wires.

I had to code some method to print own big fonts in the display and the moment I managed to control all the display functions as I wanted I started to code the methods to print GPS gathered data in the display. This is an earlier slowed display test that didn’t worked well:

The first prototype had just speed mode, was assembled with double tape and had no battery charger. It’s purpose was to see how speed meter worked testing it in my car.

First handheld GPS prototype

First handheld GPS prototype

Then I dismantled firts prototype and assembled second prototype, this time no double tape, just boards soldered togheter. This is the schematic:

Tiny GPS schematic

Tiny GPS schematic

And so I began building:

OLED Display up, GPS Conector (glued to DC-DC) down.

OLED Display up, GPS Conector (glued to DC-DC) down.

Second prototype assembling. Arduino Up, DC-DC down.

Second prototype assembling. Arduino Up, DC-DC down.

The actual prototype looks like a tiny packed devices cube with front display and momentary switches (best view on 720p). Here is a video with functions explanation:

I’m not a coder so code is pretty much ugly. Sketch it’s downloable from here. It uses TinyGPS library from Mikal Hart, custom new software serial to disable interrupts in pin ports and PinChangeInt, an Arduino library to handle buttons interrupts.

If you would like to contribute with functions or code fixes please feel free to contact me either in the comments or in my email address (at the bottom of the page).

Arduino Avago LedDisplay Bug, Fixed

Miércoles, Octubre 7th, 2009

Comentaba en un post anterior mis desventuras con una pantallita de leds en la que tenía que usar un hack para poder visualizar lo que queria.

La librería LedDisplay tiene un contador de posición del ‘cursor’ en la pantalla que al crear el objeto se fija a cero. Una pantalla de 8 caracteres tendría posiciones de la cero a la siete mientras que una de 4 caracteres tendría posiciones de la cero a la tres; al crear el objeto de pantalla se fija el cursor en la posición cero y según vamos escribiendo en la pantalla el cursor va incrementando. Usando el método objeto.home() volvemos a la posición cero, pero a mi no me funcionaba, me mostraba la pantalla en blanco, por lo que tras unas cuantas pruebas descubrí que tenía que usar como cero la posición 4 con objeto.setCursor(4); en otras palabras, no conseguía visualizar nada si no empezaba a escribir desde la posicion 4 hasta la 7 definiendo el display de longitud 8.

El trabajo interno de la librería consiste en traducir los carácteres en cinco columnas de información de un byte cada una (recordemos que cada posicion de la pantalla es una matriz de leds de cinco columnas por siete filas) de forma que si tenemos una pantalla de ocho caracteres tendríamos que enviar cinco por ocho bytes, es decir, cuarenta.

Basandose en este razonamiento el desarrollador de la librería la programó con un array de longitud cuarenta en donde la posición del cursor se calcula multiplicandola por cinco, así si queremos escribir un carácter en la posición 4 de la pantalla, la multiplicamos por 5 y obtenemos como índice del array 20, posición a partir de la que empezamos a escribir.

Tras pensarlo detenidamente y estudiar el uso de registros de desplazamiento para crear conversores serie-paralelo se me ocurrió que la pantalla actuaba tal cual como un registro de desplazamiento y que al enviarle 40 bytes (para pantalla de 8) en lugar de 20 bytes realizaba un desbordamiento que en teoría saldría por la patilla  ’data out’ de la pantalla (empleada para el montaje en cascada de varias pantallas).

La solución vino con limitar la cantidad de bytes enviados a través del bus de datos en función de la longitud de la pantalla. El parche para la librería es este:

--- LedDisplay_orig/LedDisplay.cpp	2009-04-17 22:12:49.000000000 +0200
+++ LedDisplay/LedDisplay.cpp	2009-10-06 18:05:14.000000000 +0200
@@ -250,12 +250,14 @@

 // this method sends 320 bits to the dot register:
 void LedDisplay::loadDotRegister() {
+  // define max data to send, patch for 4 length displays by KaR]V[aN
+  int maxData = displayLength * 5;
   // select the dot register:
   digitalWrite(registerSelect, LOW);
   // enable writing to the display:
   digitalWrite(chipEnable, LOW);
   // shift the data out:
-  for (int i = 0; i < 40; i++) {
+  for (int i = 0; i < maxData; i++) {
     shiftOut(dataPin, clockPin, MSBFIRST, dotRegister[i]);
   }

Happy Hacking

HCMS-290x con Arduino

Jueves, Octubre 1st, 2009

Ayer estaba un poco aburrido y me acordé que de uno de mis desguaces (una placa de router modular Nortel) extraje una pequeña pantalla, y me propuse  hacerla funcionar. Está compuesta por 4 carácteres y cada uno de ellos es una matriz de leds de 7 de alto por 5 de ancho, lo que hacen 35 leds por carácter y 245 leds en total. Coste de la pantalla, casi 24€, o $28, dependiendo del sitio en donde se mire.

La pantalla está controlada por un pequeño micro controlador por lo que no hay que estrujarse mucho los sesos a la hora de manejar la pantallita; basta con mandarle por un pequeño bus serie los datos que queremos que represente.

Existe ya una librería para Arduino llamada LedDisplay que controla este tipo de pantallas, pero desgraciadamente no funciona bien con el modelo de pantalla de 4 dígitos (al menos el mio, hay pantallas de 4, de 8 y de 8×2), por lo que he tenido que hacer un poco de trampas a la hora de programarla evitando funciones ya implementadas que no funcionaban.

Por lo visto si configuro la libreria LedDisplay para una pantalla de longitud 4 como la mía el texto no se mostraba. Haciendo pruebas (no se si es cosa de la pantalla o de la librería) descubrí que solo muestra caracteres desde la posición 4 a la 7, configurandola con una longitud de 8 carácteres.

De ahí el hack que se puede apreciar en el código fuente. Para cada impresión de pantalla hay que reiniciar la posición y mover el cursor a la posición 4. Esto desgraciadamente hace inservibles funciones de la librería como scroll(). Otra curiosidad, clear() tampoco funciona.

HCMS-290x driven by Arduino

HCMS-290x driven by Arduino

En este video se puede ver el funcionamiento de la pantalla con un texto sencillo:



El código fuente se puede descargar desde aqui.

Gestor de descargas Megaupload y Rapidshare

Domingo, Marzo 29th, 2009

La verdad es que me da mucha rabia querer bajarme cualquier cosa de megaupload que esté dividida en tropecientos enlaces y tener que estar pendiente de las descargas para poner a bajar el siguiente cuando acabe el actual, así que aprovechando que tengo una maquina linux 24 horas en marcha, me he hecho un bash script que toma como argumento un archivo de texto plano que contenga un enlace por linea, ya sea de rapidshare o megaupload, se autentica contra la página en cuestión guardando la cookie y luego la utiliza para iniciar la descarga progresiva de los enlaces del archivo que los contiene. Tan sencillo como:

user@machine:~# ./gestor.sh enlaces.txt

Disponible en descarga desde aqui. No hay que olvidar editar la cabecera para cambiar el usuario y contraseña por el que queramos.

P.D: Este script solamente sirve para cuentas premium.Requiere tener wget instalado.

BotNets!

Lunes, Junio 9th, 2008

Anoche un amigo y yo nos aburriamos y ya que ambos tenemos nuestras páginas en un server propio en casita decidimos echarle un ojo a nuestros registros de apache:

# grep txt access.log | grep -v robots

Al resultado de ejecutar esta busqueda aparecieron numerosas peticiones GET con el contenido ‘txt’ en su interior que llamaban a archivos que no estaban en mi directorio web, si no que eran intentos en su gran mayoría de convertir a un host en un zombie para alguna BotNet mediante algun bug RFI.

Las BotNets (o Red de bots o robots) son comunmente servidores bien privados bien públicos de IRC (Internet Relay Chat) que se emplean como HUBs de Zombies que normalmente se encuentran bajo las órdenes del script kiddie mas inútil que puedas encontrarte.

Un Zombie es una máquina que ha sido comprometida y que ejecuta código malicioso a la espera de instrucciones de su dueño (el “hacker”). Los Zombies que suelen conectar y formar BotNets corren un programa script (mayormente perl) que simula ser una persona que se conecta a un IRC específico y que cumple instrucciones de una determinada persona, normalmente identificada por el nick (pseudónimo) o por el host (Dirección IP).

Estos programas reciben el nombre de Shellbot, ya que son Bots que ejecutan instrucciones en la shell de la maquina víctima.A continuación pongo y enlazo mirrors de algunos bots y RFIs para infectar máquinas que he encontrado en la búsqueda anteriormente descrita:

Algunos jaquers infectan directamente con un shellbot, otros ejecutan un php para que luego este último ejecute el shellbot o un deface y los que menos saben programar simplemente suben un único script php como este que les deja ejecutar cuanto quieran siempre que PHP esté mal configurado y que se ve así:

Capura r57

A diario estos ataques se automatizan y se suceden ya que muchos de estos ShellBots actuan como gusanos, se copian en el public_html o www de un servidor al que hayan infectado y acto seguido escanean el mundo en busca de mas víctimas a las que infectar, y lo peor es que la gran mayoría de las botnets existentes se emplean para realizar ataques de denegación de servicio distribuidos (DDoS) por lo que hay que tener cuidado y cuidarse las espaldas si eres administrador de alguna página y/o servidor.