Mostrando entradas con la etiqueta microcontroller. Mostrar todas las entradas
Mostrando entradas con la etiqueta microcontroller. Mostrar todas las entradas

domingo, 19 de junio de 2011

Entrada Analógica (Analog Input)

Hoy nos dedicaremos a interactuar con una entrada analógica, la cual a diferencia de una entrada digital (entrega anterior) permite leer un rango de valores. Estos valores representan voltaje, pero dentro del microcontrolador pueden ser representados por un rango de valores enteros, los cuales pueden ir de 0 a 255 o de 0 a 1024, etc., esto depende del tipo de procesador que estemos utilizando... por eso es muy útil obtener las especificaciones del micro y las funciones asociadas (en el lenguaje que escogiéramos) a la lectura de un puerto analógico.

La idea de un puerto analógico es leer de un puerto diferentes valores, lo cual permite tomar decisiones más amplias o interactuar con rangos que permiten realizar tareas diferentes.

En lo personal, cuando pienso en una entrada digital pienso en un switch on/off, y cuando pienso en una entrada analógica pienso en un potenciómetro, o cualquier dispositivo cuya salida oscile entre 0V y 5V.

Estos dispositivos (ejemplo un lm35 - termómetro digital) alimentándolos con 5V, pueden entregar al puerto en donde se conecten un rango de valores de acuerdo a las características con las cuales el dispositivo está diseñado.

Por ejemplo, un potenciómetro permite entregar al micro un rango de voltaje que depende del voltaje con el cual esté alimentado. Un termómetro digital, entregará un voltaje de acuerdo a la alimentación del mismo y a las condiciones de temperatura a la cual esté expuesto. En cualquier caso, siempre se obtiene un voltaje asociado a la lectura del dispositivo, y a través de este voltaje podemos tomar decisiones y ejecutar tareas.

El siguiente circuito conecta 8 leds a la plataforma de prototipado pinguino en los pines 0-7, que son puertos digitales. Un potenciómetro es conectado a los puertos GND,VCC del micro y su salida la enviamos al puerto 13, el cual es analógico.


El código que utilizaremos permite utilizar los 8 leds como una barra de indicación. Cuando el potenciómetro está en el tope izquierdo, este entrega al puerto 13 cero voltios. Cuando el potenciómetro está en el tope derecho le entrega al puerto 5V.

El micro traduce este voltaje en un número entero que oscilará entre 0 y 1024, dependiendo del voltaje, el cual estará en un rango de oV a 5V.

Nuestra intención es que a medida que vamos rotando el potenciómetro a la derecha (0->5)V la barra de 8 leds debe ir iluminándose a la derecha hasta llegar a encender los 8 leds, justamente cuando el potenciómetro esté en el tope derecho. En la rotación contraria (5->0)V, los leds deben irse apagando uno a uno de derecha a izquierda hasta quedar todos apagados.

A continuación el codigo

// Ejemplo de utilización de lectura de potenciometro y encendido de leds
#include "ADlib/__map.c"

const int potPin=13;

void setup()
{
byte i;
for (i=0; i < 8; i++)
pinMode(i,OUTPUT);
pinMode(potPin,INPUT);
}

void apagarLeds()
{
byte i;
for (i=0; i<8; i++)
digitalWrite(i,LOW);
}

void encenderLeds(int count)
{
byte i;
for (i=0; i<count; i++)
digitalWrite(i,HIGH);
}

void loop()
{
apagarLeds();
encenderLeds(map(analogRead(potPin),0,1024,0,8));
delay(50);
}

Veamos como funciona esto. En primer lugar tenemos la declaración de una constante (potPin) que nos indica cual es el puerto que utilizaremos para leer el voltaje que nos entrega el potenciómetro.

Luego tenemos la función setup() para definir la modalidad de los puertos. Los puertos de entrada(0,7) los definimos como salidas en el ciclo for. Asimismo, el puerto 13 lo definimos como entrada con la función pinMode.

Hemos creado 2 funciones. apagarLeds() nos permite apagar todos los leds al tiempo utilizando un ciclo for con el siguiente rango (0<=i<8). Luego definimos una función que nos permite encender hasta el led definido por el parámetro count.

En el ciclo Loop(), vemos como apagamos los leds para luego encender hasta el led que nos devuelve la función map.

La función map es una función que nos permite convertir un rangoA en un rangoB. Esta función es estándar en arduino, pero no en pinguino, por lo que está programada y agregada al directorio de librerías de pinguino, y es por esta razón que la segunda línea existe.

#include "ADlib/__map.c"

En nuestro caso, la función mapea el rango (0,1024) al rango (0,8) utilizando como entrada lo que devuelve analogRead(potPin). Esta conversión es muy conveniente ya que directamente le pasamos un valor entre 0 y 8 a la función encenderLeds(). Este ciclo se repite infinitamente cada 50 milisegundos debido la función delay(50) que hemos colocado al final del loop.

// map function
// Alejandro-Dirgan 2011

#ifndef __MAP__
#define __MAP__

#define MAP 1

float map(int value, int fLow, int fHigh, int tLow, int tHigh)
{
return ((float )tHigh*(float )(value-fLow)+(float )tLow*(fHigh-value))/(float )(fHigh-fLow);
}

#endif

Veamos como funciona en la práctica.


Con las entradas analógicas se pueden hacer infinidad de cosas, solo la imaginación y los requerimientos lo dirán.

En la próxima entrega veremos las salidas analógicas.


Read More......

lunes, 6 de junio de 2011

Playing with LEDS

En la entrega anterior vimos como utilizar las salidas digitales. En este artículo solo quiero mostrar que lo que se puede hacer con las salidas digitales es directamente proporcional a lo que podemos hacer programando.

La inteligencia de estos dispositivos electrónicos es solo cuestión de imaginación y capacidad de programación.

En esta entrega quiero mostrarles como hacer un divertimento de iluminación de leds.

EL ESQUEMA

7 LEDs conectados a las salidas 0-6 del pinguino 2550.



EL CODIGO

Un simple programa que permite iluminar 7 leds. El código está definido con 6 procedimientos:

- ledOff(): Pone las salidas 0-6 en LOW
- secuencia1(): hace una secuencia del pin 0 al 6 con 10 ms de retardo
- secuencia2(): hace una secuencia del pin 6 al 0 con 10 ms de retardo
- secuencia3(): enciende los leds impares y hace flash en los pares
- secuencia4(): enciende los leds pares y hace flash en los impares
- secuencia5(): hace flash alternativo entre los leds pares e impares

//Playing with leds
byte const pines[]={0,1,2,3,4,5,6};
byte pausa1, pausa2;

void ledOff()
{
byte i;
for (i=1;i<7;i++)
digitalWrite(pines[i-1],LOW);

}

void setup()
{
byte i;
for (i=0;i<7;i++)
pinMode(pines[i],OUTPUT);
pausa1=10;
pausa2=50;
ledOff();
}

void secuencia1()
{
byte i;
ledOff();
for (i=1;i<7;i++)
{
digitalWrite(pines[i-1],HIGH);
delay(pausa1);
digitalWrite(pines[i-1],LOW);
delay(pausa1);
}
}

void secuencia2()
{
byte i;
ledOff();
for (i=7;i>=1;i--)
{
digitalWrite(pines[i-1],HIGH);
delay(pausa1);
digitalWrite(pines[i-1],LOW);
delay(pausa1);
}
}

void secuencia5()
{
byte i;
ledOff();
for (i=0;i<7;i++)
{
digitalWrite(pines[0],HIGH);
digitalWrite(pines[2],HIGH);
digitalWrite(pines[4],HIGH);
digitalWrite(pines[6],HIGH);
delay(pausa2);
digitalWrite(pines[0],LOW);
digitalWrite(pines[2],LOW);
digitalWrite(pines[4],LOW);
digitalWrite(pines[6],LOW);
delay(pausa2);
digitalWrite(pines[1],HIGH);
digitalWrite(pines[3],HIGH);
digitalWrite(pines[5],HIGH);
delay(pausa2);
digitalWrite(pines[1],LOW);
digitalWrite(pines[3],LOW);
digitalWrite(pines[5],LOW);
delay(pausa2);
}
}

void secuencia3()
{
byte i;
ledOff();
digitalWrite(pines[0],HIGH);
digitalWrite(pines[2],HIGH);
digitalWrite(pines[4],HIGH);
digitalWrite(pines[6],HIGH);
for (i=0;i<7;i++)
{
digitalWrite(pines[1],HIGH);
digitalWrite(pines[3],HIGH);
digitalWrite(pines[5],HIGH);
delay(pausa2);
digitalWrite(pines[1],LOW);
digitalWrite(pines[3],LOW);
digitalWrite(pines[5],LOW);
delay(pausa2);
}
digitalWrite(pines[0],LOW);
digitalWrite(pines[2],LOW);
digitalWrite(pines[4],LOW);
digitalWrite(pines[6],LOW);
}

void secuencia4()
{
byte i;
ledOff();
digitalWrite(pines[1],HIGH);
digitalWrite(pines[3],HIGH);
digitalWrite(pines[5],HIGH);
for (i=0;i<7;i++)
{
digitalWrite(pines[0],HIGH);
digitalWrite(pines[2],HIGH);
digitalWrite(pines[4],HIGH);
digitalWrite(pines[6],HIGH);
delay(pausa2);
digitalWrite(pines[0],LOW);
digitalWrite(pines[2],LOW);
digitalWrite(pines[4],LOW);
digitalWrite(pines[6],LOW);
delay(pausa2);
}
digitalWrite(pines[1],LOW);
digitalWrite(pines[3],LOW);
digitalWrite(pines[5],LOW);
}

void loop()
{
byte j;
for (j=0;j<7;j++)
secuencia1();
for (j=0;j<7;j++)
secuencia2();
secuencia3();
secuencia4();
secuencia5();
}

EL RESULTADO

El siguiente video muestra el resultado de cargar este programa en el pinguino y ejecutarlo conectado al breadboard con los 7 leds.



Read More......

domingo, 15 de mayo de 2011

Arduino o No Arduino

En artículos anteriores hemos avanzado en el tema teórico de los microcontroladores, lo cual es "Nice" cuando queremos introducirnos a un terreno donde nunca hemos estado. Habiéndolo recorrido con suficiente extensión desde una perspectiva de hobby, creo ya conveniente que vayamos directo a la experimentación.

Pero no iremos directamente a experimentar sin antes escoger que tecnología debemos usar para, desde mi punto de vista, cumplir con tres objetivos:

1) Ser sencillo

Esto es muy importante. Yo soy un fiel creyente que se pueden hacer cosas muy interesantes y útiles sin la necesidad de ser un ingeniero... solo hay que tener conocimientos básicos, ser ávido lector, y tener suficiente curiosidad como para escudriñar temas y llegar a su núcleo para entenderlos lo suficiente como para empezar a crear.

2) Ser Amplio

Tener capacidad de ser utilizado en múltiples aplicaciones.

3) Estar al Alcance

Ser una tecnología accesible a cualquier en muchas partes del mudo, y sobre todo en nuestros países latinoamericanos.

Cuando inicié a investigar acerca de los micros, lo primero que conseguí fue información del microcontrolador más popular de todos los tiempos... el PIC. De este se consiguen todos los modelos y tamaños (pines, memoria, etc), y aunque es relativamente sencillo aprender a programarlos, no cumple fielmente con mi primer objetivo... ser sencillo.

Recuerdo que después de algunas semanas leyendo acerca de ellos y trabajando en simuladores pensé... debe haber otras tecnologías que permitan hacer lo mismo de manera más rápida y sencilla. Con esta idea en mente empecé a buscar como hacer algo basado en PIC que me permitiera no tener que adquirir un programador especializado y además que fuese sencillo... y dando vueltas en la red conseguí a Arduino.

"Arduino is an open-source electronics prototyping platform based on flexible, easy-to-use hardware and software. It's intended for artists, designers, hobbyists, and anyone interested in creating interactive objects or environments."

Y en el pequeño concepto obtenido de su página web vemos algo clave: prototyping. Esta es una herramienta de prototipado rápido, lo que permite llevar un concepto de la idea a la práctica de forma muy rápida, además de ser sencillo y flexible, y es suficientemente multipropósito como para cubrir al menos los objetivos 1 y 2.

Inmediatamente después de conseguir a Arduino me dediqué a la tarea de averiguar si lo podía conseguir en algún lugar cercano a mi residencia, lo cual efectivamente conseguí, por lo que el tercer objetivo fue cumplido.

Ahora bien, luego de tener mi primer encuentro con Arduino decidí que este era el microcontrolador para mi, y empecé a estudiarlo y recorrer la red para ver que había. Es asombroso ver como una plataforma abierta puede ser tan masiva y tan apetecible por expertos y principiantes.

Siendo una plataforma abierta se presta para que mucha gente desarrolle y cree cosas nuevas, además de plataformas afines (no clones) que pueden ser alternativas válidas de desarrollo.

Lo interesante de arduino es que ha creado todo un ambiente de desarrollo basado en un lenguaje de programación muy intuitivo y una forma de interactuar con el dispositivo realmente sencillo, por lo que los desarrollos alternativos han buscado aprovechar este esquema y reproducirlo, lo cual permite que alguien que ha estudiado arduino pueda con muy poco esfuerzo intelectual hacer las mismas cosas que con arduino.

Navegando en la red me topé entonces con Teensy. Esta es una plataforma alternativa a arduino mucho más económica y con prestancias similares, a lo cual respondí comprando un Teensy 2.0+.

Luego, buscando cosas acerca de esta plataforma conseguí algo que me pareció más interesante aún... conseguí a Pinguino.

Esta plataforma es un clone de arduino pero basado en el microcontrolador PIC, además de ser muy simple de implementar desde el punto de vista de hardware. Cuando hablo de un clone es que el look-and-feel de su lenguaje de programación, así como la interacción con el micro es muy parecida (para no decir igual) a arduino, lo que permite tener una plataforma de prototipado rápido adicional, amén que es muy barato construir los dos modelos propuestos en hackinglabs.

Pero entonces cual escoger?. Arduino o No Arduino?... esa es la cuestión.

Como mi intención es aprender y escribir acerca de mis experiencias, y pensando en los primeros tres objetivos, creo que el tema no es escoger a arduino como plataforma sino como filosofía. Esto hace que uno pueda comprar un arduino original o adquirir o construir cualquiera de las plataformas alternativas que existen basados en la filosofía de arduino.

En el próximo artículo iniciaremos a arduino y su filosofía y empezaremos a experimentar.

Antes de finalizar quisiera mostrar algo de verdad interesante... es tan masivo el tema de Arduino que hace poco Google lanzó una plataforma de desarrollo para Android basado en arduino.



English Section

In previous articles we have advanced in the theoretical subject of the microcontrollers, which is " Nice" when we want to introduce ourselves to a land where we never have been. Having studied this subject with sufficient extension from a hobby perspective, I think it is the time to go directly to the experimentation arena.

But we can't go to experimentation if we haven't choose which technology is the ideal technology to work on. From my point of view we have to fulfill three objectives first:

1) Simple

This is very important. I am a believing faithful that we can make very useful and interesting things without a Master Degree… The only prerequisites needed is basic knowledge, to be an eager reader, and to have sufficient curiosity to dig in subjects and to arrive at his core to understand them.
.
2) Ample

Have the capacity to be used in multiple applications.

3) everybody's reachable

Need to be an accessible technology to everybody in many parts of the world, and mainly in our Latin American countries.

When I started to investigate about microcontrollers, the first micro that came up was the PIC micro. You can find PIC in all models and sizes (pins, memory, etc), and although this technology is relatively simple to learn and program, does not fulfill my immediate goal faithfully… to be simple.

I remember that after some weeks reading about them and working over simulators I thought… there must have other technologies that allow me to do the same, faster and simpler. With this idea in mind I began to look for something based on PIC that allowed me to program them without a specialized burner and in addition, it had to be simple… and digging out on internet I got Arduino..

"Arduino is an open-source electronics prototyping platform based on, easy-to-uses hardware and software. Its' for intended artists, designers, hobbyists, and anyone interested in creating interactivates objects or environments."

At the small reading above obtained from its Web page we can see something that for me is the key: prototyping. This is a prototyping tool, which allows us to convert a concept from an idea to a final result in a very fast way. Additionally it is simple, flexible, and it is multipurpose.

Immediately after knowing Arduino I dedicated myself to the task of finding out if it could be obtained anywhere near to my place, which indeed I found, reason why the third objective was fulfilled.

After to have my first encounter with Arduino I decided that this was the microcontroller for my projects, and began to study it and looked out on internet to see what is in there about this technology. It is amazing to see how an open platform can be so massive and so tempting for experts or beginners.

As an open platform, a lot of people are developing and creating new things, additionally to create compatible platforms that can be a valid alternative for development.

The most interesting thing of arduino is that the development environment is based on a very intuitive programming language and the way of interacting with the microcontroller is really simple, reason why alternative developments are adopting this technology more and more.

Navigating internet, few days after, I found Teensy. This is an alternative platform but far less expensive than arduino and with similar features, to which I responded buying a Teensy 2.0+.

Then, looking for things related to this platform I obtained something even more interesting to me… Pinguino. This platform is a clone of arduino but based on PIC microcontroller, and it is very simple to implement from the hardware stand point. Understanding by clone that the look-and-feel of its programming language is practically the same as arduino environmet, as well as the interaction with the microcontroller, which allows us to have a fast prototyping platform and it is cheaper than teensy.

But then what to choose?. Arduino or Not Arduino? … that is the question. As my intention is to learn and to write about my experiences, and thinking about the first three objectives, I believe that the goal is not to choose arduino as a platform, but a philosophy. This gives us the ability to have a wide number of platforms related to arduino, learning only one technology.

In the next blog we are going to start introducing arduino and make some hello world examples and experimentation.

... Arduino is so massive that Google launched a developing environment to Android based on Arduino... very nice.



Read More......

viernes, 1 de abril de 2011

Microcontroladores - parte V - E/S

En esta entrega estaremos ahondando un poco en los puertos de entrada y salida de los microcontroladores, con ejemplos básicos de como interactuar con ellos dependiendo de tu tipo, y por consiguiente de su utilidad.

Pero antes una nota especial a este artículo que conseguí en internet que habla de Limor Fried, una chica cuyo objetivo ha sido impulsar el hardware de electrónica de línea abierta. Muy interesante el artículo, pero aún más interesante es luego ver la página de la empresa para la cual trabaja!... vean los siguientes links.













PUERTOS DE ENTRADA Y SALIDA

Los puertos de los microcontroladores son su sinapsis con el mundo exterior. Los mismos permiten llevar datos a los micros u obtener datos de ellos.

La final
idad de un microcontrolador al final es realizar tareas repetitivas (como cualquier computador) ejecutando programas y respondiendo a estímulos externos.

En un computador, un software de diseño gráfico permite crear imágenes a partir de múltiples fuentes:

1) Imágenes ya creadas por otros. En este caso la imagen es un archivo que se encuentra en un periférico llamado disco (almacenamiento) y el mismo está conectado al computador a través de un puerto (internos o externos).

2) Inspiración del ejecutante. A través del teclado y el mouse o cualquier otro dispositivo de adquisición de información, el programa de diseño responde al input de los mismos. El teclado está conectado a un puerto (interno o externo) y el mouse seguramente estará conectado a un puerto USB.

3) El usuario del programa de diseño obtiene feedback del mismo a través de la pantalla, la misma es un dispositivo de salida conectada a un puerto del computador.

4) El producto final de la ejecución del programa de diseño seguramente será un archivo que finalmente se guardará en un periférico de almacenamiento que está conectado a un puerto de E/S del computador.

Como podemos observar de los puntos anteriores, un micro no se aleja de un computador en mucho.

Los puertos de E/S de un micro son entradas digitales o analógicas que nos permiten hacer diferentes actividades:

1) Obtener datos de periféricos como switches, potenciómetros, celdas fotoeléctricas, sensores de temperatura, sensores de humedad, sensores de proximidad, Memorias EEPROM, dispositivos de conexión Wifi, dispositivos de conexión alámbrica a internet, tarjetas para lectura/escritura de memorias SD, Keypads, Lectores RFID, etc.

2) Sacar datos del micro hacia diferentes periféricos tales como: leds, reles, memorias EEPROM, displays LCD, altavoces, dispositivos con interfaces serial, USB, I2C, 1Wire, etc.

Los datos de entrada/salida pueden venir en formatos: digitales o analógicos.

Entradas Digitales

Un pin se define como entrada digital cuando este permite leer solo dos estados. Valor lógico LOW o (0) cuando el pin está conectado a tierra. Valor lógico HIGH o (1) cuando el pin está conectado a 5+ V.

Salidas Digitales

Un pin se define como salida digital cuando este permite sacar solo dos estados. Valor lógico LOW o (0) cuando el pin entrega 0V. Valor lógico HIGH o (1) cuando el pin entrega 5+ V.

Entradas Analógicas

Un pin se define como entrada análoga cuando este permite leer un rango de voltaje entre 0V y +5V. Estos valores son mapeados hacia el microcontrolador en un rango de valores numéricos entre 0 y 1023 o 0 y 255.

Para saber que voltaje se está leyendo en un pin analógico solo requerimos hacer una simple regla de 3. Por ejemplo:

0V equivale al valor 0 leído desde el micro
1V equivale al valor 204 leído desde el micro
2.5V equivale al valor 511 leído desde el micro
3.5V equivale al valor 716 leído desde el micro
5V equivale al valor 1023 leído desde el micro

Salidas Analógicas

Un pin se define como salida análoga cuando este permite variar el voltaje del pin en un rango de voltaje entre 0V y +5V. Estos valores son mapeados desde el microcontrolador en un rango de valores numéricos entre 0 y 1023 o 0 y 255.

De forma análoga a la entrada analógica, si queremos colocar un pin analógico en un voltaje de 3.5V, solo tenemos que hacer el cálculo correspondiente, que en nuestro ejemplo es el valor numérico 716 si utilizamos el rango (0,1023).

Las salidas analógicas se trabajan con una técnica llamada PWM o Pulse Width Modulation, el cual es una técnica para obtener valores análogos a través de medios digitales.

El control digital es utilizado para crear una onda cuadrada, la cual cambia periódicamente entre un estado ON y un estado OFF. Este patrón ON-OFF puede simular un voltaje entre 5V y 0V cambiando la porción del tiempo que la señal se mantiene en ON versus el tiempo que la misma se mantiene en OFF.

La duración que la señal esta ON se denomina ancho del pulso. Para obtener valores de voltaje diferentes hay que modular o cambiar el ancho del pulso (también llamado ciclo de trabajo). Si esta modulación se hace lo suficientemente rápido el efecto final es un voltaje que permite por ejemplo hacer que un LED ilumine con diferentes intensidades de luminiscencia, o controlar un motor de pulso o un servo.

La siguiente gráfica muestra algunos ejemplos de modulación del ancho de pulso con pic.


PWM pulse width modulation signal

En general, los pines de los microcontroladores vienen con diferentes capacidades, en diferentes proporciones. No todos los pines son digitales o analógicos. Cada micro viene con la documentación para determinar que pines usar de acuerdo a las tareas a realizar.

Si requerimos encender o apagar un LED, hay que escoger un pin que sea digital, el cual solo permite aplicar dos estados (ON,OFF) o (HIGH, LOW).

Si requerimos controlar un servo debemos escoger un pin con salida analógica.

Si requerimos leer un sensor de temperatura que entrega un rango de voltaje entre 0V y 5V de acuerdo a la temperatura ambiente, debemos escoger como entrada un pin análogo.

Esto aplica para muchos micros del mercado, como por ejemplo PIC o AtMega, así como generaciones posteriores que utilizan estos micros para construir sobre ellos, microcontroladores ampliados que permiten hacer lo mismo que los anteriormente mencionados pero de forma más amigable y con lenguajes de alto nivel. Tal es el caso de Arduino el cual se basa en AtMega, o Pinguino cuya plataforma es PIC.

Como ejemplo podemos ver el siguiente código el cual enciende y apaga un LED cada 300 milisegundos. Este ejemplo solo permite mostrar como utilizar un pin como una salida. En próximas entregas estaremos empezando con el "Hola Mundo" con dos de mis favoritos... Arduino y Pinguino, y empezaremos formalmente a interactuar con ellos.

Código para Pinguino

LEDBlink.pde

void setup()
{
// Definimos el pin 0 como salida
pinMode(0,OUTPUT);
}

void loop()
{
//Colocamos el pin 0 en 5V (encendemos el LED)
digitalWrite(0,HIGH);
//Establecemos una pausa de 300ms
delay(300);
//Colocamos el pin 0 en 0V (apagamos el LED)
digitalWrite(0,LOW);
//Establecemos una pausa de 300ms
delay(300);
}

Links de interés:



Algunos conceptos (Wikipedia y otros)

1) I²C es un bus de comunicaciones en serie. Su nombre viene de Inter-Integrated Circuit (Circuitos Inter-Integrados)


2) 1-Wire es un protocolo de comunicaciones en serie diseñado por Dallas Semiconductor. Está basado en un bus, un maestro y varios esclavos de una sola línea de datos en la que se alimentan. Por supuesto, necesita una referencia a tierra común a todos los dispositivos.


Read More......

jueves, 31 de marzo de 2011

Microcontroladores - Parte IV

Después de mucho tiempo vuelvo a escribir algo... honestamente el trabajo no me deja mucho tiempo con fuerzas para experimentar y escribir.

Hoy hablaremos de que debemos hacer para que los microcontroladres se comporten o ejecuten las actividades que uno requiere para cierta aplicación.

Pero antes... como es mi costumbre veamos algo interesante hecho con micros para entusiasmarnos con lo que se puede hacer.

Esta vez es interesante pero algo soso, aunque habrá gente que le parezca impresionante.

Icono Like it de Facebook

Pues esto es interesante solo como ilustración de lo que se puede hacer con un micro. En este caso es el icono de facebook que se pulsa cuando a alguien le gusta lo que uno cuelga en esta página. Lo interesante es que es como una lámpara hecha con legos, que se enciende cuando alguien presiona like it en algún post nuestro.

Veamos que hay detrás... Pues un arduino como microcontrolador para conectarse al computador y a través del API gráfico de Facebook y una librería diseñada para arduino, podemos hacer pooling de nuestros like it y encender la lámpara cuando esto sucede.

Algo que yo no sabía es que nosotros podemos diseñar nuestros legos y pedirlos a fábrica con un software que se baja de la página web de la LEGO. ESTO SI QUE ES INTERESANTE, sobre todo para robótica.


Bueno.. ahora a la materia.

Un microprocesador tiene la posibilidad de cambiar su comportamiento mediante la programación del mismo. En los viejos tiempos, el único lenguaje que se utilizaba para tal fin era el Assembler.

Este era el único lenguaje disponible por ese tiempo debido a la poca memoria con la que contaban los micros, por lo que el assembler era el lenguaje por excelencia, ya que el mismo no tiene los desperdicios que lenguajes de alto nivel introducen.

Lo que es cierto, es que esto ha evolucionado y ya los temas de memoria no son tan neurágilcos. Por un lado, porque la memoria ha bajado de precio en los últimos años. A su vez los micros han evolucionado en capacidades y memoria, por lo que los lenguajes de alto nivel se han metido en este terreno... y debo ser honesto, a Dios gracias.

Trabajar en lenguaje de alto nivel es realmente una bendición, ya que podemos con nuestros conocimientos de la universidad, hacer trabajar a estos controladores. Desde que los lenguajes de alto nivel aparecieron en este terreno, han proliferado desde pascal, pasando por C y hasta Basic.

En lo particular programo en C desde que tengo memoria y por tanto me ciento cómodo trabajando con el mismo. Pero entiendo que C no es del gusto popular, así que no problem, existen lenguajes como Pascal y Basic para los gustos restantes.

Algunos de los fabricantes con más éxito en este terreno se han especializado no solo en los compiladores sino en los ambientes de desarrollo. Tal es el caso de la gente de MikroElectronika.

MikroElektronika

Esta gente tiene muy buenos compiladores y además, desde mi perspectiva, presentan la curva de aprendizaje más sencilla, al ocultar muchas particularidades y configuraciones que deben hacerse de acuerdo al micro que utilicemos.

mikroC PRO for PIC

mikroBasic PRO for PIC

mikroPascal PRO for PIC

El compilador de estos lenguajes, toma nuestra fuente... este ejemplo enciende y apaga un led conectado al puerto RB0 en intervalos de 50 milisegundos:

...
#define led0 0b00000001

void main() {

TRISB=0; //puerto B Salida
PORTB = 0; //todas las salidas en 0 lógico

do {
PORTB = led0;
Delay_ms(50);
PORTB = led0;
Delay_ms(50);
} while(1);
}

No nos asustemos aún. En el próximo artículo explicaremos para que son los puertos y los tipos de puertos que hay, etc. Por lo pronto hagamos un acto de FE y entendamos que este programita de pocas líneas solo hace titilar un led en intervalos de 50 milisegundos.

Al ser compilado lo que obtendremos es un archivo de extensión .hex, con la siguiente información.

:0A00000005280000000000000028A1
:10000A00831686018312860101308600A330CC0054
:10001A005530CD00CD0B0F28CC0B0F2801308600B0
:10002A00A330CC005530CD00CD0B1928CC0B1928A4
:04003A0009281E284B
:02400E00FA3F77
:00000001FF

Finalmente este es el archivo que vamos utilizar para programar nuestro micro. Este archivo contiene registros en hexadecimal que traduce lo que programamos en el lenguaje que escogimos. Esto sucede para cualquier lenguaje, incluyendo al assembler.

Con que programamos el micro?... no con el código de alto nivel sino con el producto compilado el cual es este archivo .hex. Existen programas especializados, que utilizan nuestro código compilado y permiten programar el micro, pero esto es harina de otro costal... o material de otro artículo, el cual prometo será pronto.

De hecho, y es para otro artículo también, hay simuladores que permiten probar nuestro código compilado y verificar que el mismo se comporta adecuadamente. Puedo comentarles que uno de los mejores que he visto y en el cul me he divertido más es ISIS de Proteus.

En este simulador no solo puedes armar el circuito virtual, sino cargar en el microprocesador escogido el código compilado y ejecutarlo. El simulador es tan bueno que permite crear los circuitos con los componentes virtuales y estos interactúan como si fuesen reales (ejemplo, leds, reles, servos, etc.)

OK, pero no nos distraigamos del objetivo de este artículo, terminemos con este capítulo de lenguajes de programación para micros.

Lo que hemos visto hasta el momento refiere a los lenguajes que nos permiten programar a los microprocesadores PIC, pero hay otros en el mercado. No me voy a extender mucho porque hay tanto que no tiene sentido.

Mi interés principal está en entender la tecnología y por lo que he revisado, he escogido dos tipos: PIC y ARDUINO-Like.

Ya veremos en otros artículos de que se trata y explicaremos cada uno en específico, por lo pronto entendamos que de la gran cantidad de tecnologías existentes en el mercado, he escogido 2 para seguir este viaje.

Lo que si puedo decir en este punto es que Arduino o sus clones (y tendremos oportunidad de extendernos aquí) son mucho más amigables que los PIC, pero cada uno tiene sus encantos.

ARDUINO es más amigable, más sencillo y con las mismas prestancias que los PIC, pero los PIC están muy difundidos en el mercado desde hace años, por lo que se consiguen muchísimos desarrollos para estos, lo cual los hace atractivos.

Ya seguiremos con los micros y cada vez más cercanos a proyectos prácticos que nos permitan verle el queso a la tostada.

Cheers!



Algunos conceptos (Wikipedia y otros)

1) Assembler

El término ensamblador (del inglés assembler) se refiere a un tipo de programa informático que se encarga de traducir un fichero fuente escrito en un lenguaje ensamblador, a un fichero objeto que contiene código máquina, ejecutable directamente por la máquina para la que se ha generado. El propósito para el que se crearon este tipo de aplicaciones es la de facilitar la escritura de programas, ya que escribir directamente en código binario, que es el único código entendible por la computadora, es en la práctica imposible. La evolución de los lenguajes de programación a partir del lenguaje ensamblador originó también la evolución de este programa ensamblador hacia lo que se conoce como programa compilador.


2) Hex files

Intel HEX es un formato de archivo para la programación de microcontroladores, EPROMs y otros circuitos integrados. Datando de los años 70[cita requerida], está entre los formatos más viejos con esta finalidad.

Consiste en un archivo de texto cuyas líneas contienen valores hexadecimales que codifican los datos, y su offset o dirección de memoria.

fuente: Wikipedia
Read More......

domingo, 23 de enero de 2011

Microcontroladores - parte III

Hoy seguiremos detallando los componentes de los microcontroladores, y el turno hoy es para la memoria y el subsistema de entrada/salida.

Pero antes, revisemos otro de los videos relacionados con el macro mundo de los micros.

NAO

Lo que podemos hacer con los micros es interminable... vean los features de comunicación que tiene este pequeño robot para interactuar con su entorno... Excelente.

Para llegar a hacer algo como NAO, no solo debemos conocer como diseñar aplicaciones para micros, sino como programarlos, como integrarlos la mundo real, como determinar su comportamiento, etcetera.

Debemos saber un poco de electrónica, de robótica, de mecánica, y mucha imaginación... y aunque este es un modelo comercial, la red está plagada de ejemplos de gente como nosotros que hace cosas interesantes, útiles e inútiles, que hacen de este mundo uno fascinante.

En el árticulo anterior hablamos de la CPU de los microcontroladores. Para que este pueda operar debe tener acceso a datos, los cuales son albergados en lo que se conoce como memoria.

MEMORIA

Existen 2 tipos básicos de memoria: Memoria de Programa y Memoria de Datos.

De Progama

En esta memoria se guardan las instrucciones de los programas que definen el comportamiento del micro. Esta puede ser de una sola escritura (ROM) o pueden ser volátiles, es decir, son reprogramables. Existen diferentes tipos de memoria volátil, las diferencias fundamentales están en los procedimientos de escritura y borrado de las mismas. Entre los tipos de memoria volátiles se encuentran la EPROM, EEPROM y la FLASH, esta última muy utilizada últimamente por sus prestancias, capacidad y confiabilidad, llegando a ofrecer hasta 1000 ciclos escritura-borrado.

De Datos

La memoria de datos permite mantener la información con la que los programas trabajan. Esta memoria puede ser volátil como la memoria RAM (SRAM). Este tiene el inconveniente que si existe una caída de voltage, los datos se perderán. Hay aplicaciones que permiten este tipo de comportamiento, pero en el caso de aplicaciones que no lo permitan por su criticidad existen memorias no volátiles, como EEPROM la cual la traen disponible muchos micros. Estas memorias mantienen sus datos inclusive sin alimentación eléctrica.

NOTA: La memoria tipo EEPROM y la tipo Flash pueden escribirse y borrarse eléctricamente, sin necesidad de sacar el circuito integrado del grabador.

ENTRADA y SALIDA

Un microcontrolador puede obtener input de su entorno, o sacar información al exterior a través de sus líneas de entrada y salida. Estas son las patas que se pueden ver en la siguiente imagen.


A excepción de dos patas destinadas a recibir la alimentación, otras dos para el cristal de cuarzo (no todos los modelos requieren cristales externos), que regula la frecuencia de trabajo, y una más para reiniciar el micro, las patas restantes sirven para la comunicación con los periféricos externos que pudiera controlar.

Las líneas de E/S que se adaptan con los periféricos manejan información en paralelo y se
agrupan en grupos de ocho, y reciben el nombre de Puertas (Gates). Hay modelos con líneas que soportan la comunicación en serie; otros disponen de conjuntos de líneas que implementan
puertas de comunicación para diversos protocolos, como el I2oC, el USB, etc.

Estas patas o pines pueden configurarse como líneas de entrada o líneas de salida, es decir, estas pueden ser adaptadas a las necesidades del proyecto.

E/S Analógicos y Digitales.

Existen diferentes tipos de puertos. Los que son analógicos pueden aceptar diferentes voltages (generalmente entre 0V y 5V) en escalas decimales. Desde adentro del micro estos valores de voltaje pueden ser leídos desde una pin de entrada como un valor numérico (i.e. 0-1023).

Por ejemplo, un sensor de temperatura genera, de acuerdo a la temperatura a la cual se somete (Ambiental), un voltaje que si está conectado a un pin análogo, este podrá leerse como un valor numérico. De acuerdo al fabricante este valor numérico se podrá convertir a grados celsius o farenheit, de acuerdo a la la escala que necesitemos.

Las líneas Digitales solo aceptan valores binarios. OV o cero lógico (FALSE) y 5V o 1 lógico (TRUE).

Ejemplo, una salida digital puede utilizarse para encender o apagar un led que esté conectado a un pin de salida digital.

Existe un tipo de salida especial llamado PWM (Pulse Width Modulation). Generalmente se usa para cambiar la resolución de la salida de un micro a valores más discretos en rangos grandes. Esto permite, por ejemplo, graduar la intensidad de un led como si usáramos un dimmer o para controlar un servo.

Otros RECURSOS

Existen otros recursos en los procesadores que pueden ser útiles para hacerlos comportarse de una u otra forma de forma más rápida. Estos recursos pueden ser:

a) Circuitos de reloj, encargados de generar los impulsos que sincronizan el funcionamiento de todo el sistema.

b) Temporizadores, orientados a controlar tiempos.

c) Perro Guardián («watchdog»), el cual permite generar una inicialización cuando el programa quede bloqueado eventualmente.

d) Conversores AD y DA, para poder recibir y enviar señales analógicas.

e) Comparadores analógicos, para verificar el valor de una señal analógica.

f) Sistemas de protección ante fallos de alimentación.

Entrar en estos conceptos puede ser interesante, pero lo haré de aquí en adelante cuando sea requerido implementarlo para algún ejemplo o proyecto.


Algunos conceptos (Wikipedia y otros)

1) PWM: La modulación por ancho de pulsos (también conocida como PWM, siglas en inglés de pulse-width modulation) de una señal o fuente de energía es una técnica en la que se modifica el ciclo de trabajo de una señal periódica (una senoidal o una cuadrada, por ejemplo), ya sea para transmitir información a través de un canal de comunicaciones o para controlar la cantidad de energía que se envía a una carga.


Read More......