Está en la página 1de 8

Arduino playground - Appendix4

http://arduino.cc/playground/ArduinoNotebookTraduccion/Appendix4

Main Site Blog Playground Forum Labs Store Help | Sign in or Register

The playground is a publiclyeditable wiki about Arduino. Manuals and Curriculum Installing Arduino on Linux Board Setup and Configuration Development Tools Interfacing With Hardware Output Input User Interface Storage Communication Power supplies General Interfacing with Software User Code Library Snippets and Sketches Libraries Tutorials Suggestions & Bugs Electronics Technique Sources for Electronic Parts Related Hardware and Initiatives Arduino People/Groups & Sites Exhibition Project Ideas Languages Una vez abierto el puerto lo ms seguro es que luego queramos enviar al PARTICIPATE computador los datos que vamos a estar leyendo de uno o varios sensores. Ya que solo necesitamos correr esta orden una vez, normalmente ira en el bloque void setup(). El nmero que va entre parntesis es la velocidad de transmisin y en comunicacin serial este valor es muy importante ya que todos los dispositivos que van a comunicarse deben tener la misma velocidad para poder entenderse. 9600 es un valor estndar y es el que tienen por defecto Arduino al iniciar. Hoy en da la manera ms comn de comunicacin entre dispositivos electrnicos es la comunicacin serial y Arduino no es la excepcin. A travs de este tipo de comunicacin podremos enviar datos a y desde nuestro Arduino a otros microcontroladores o a un computador corriendo alguna plataforma de medios (Processing, PD, Flash, Director, VVVV, etc.). En otras palabras conectar el comportamiento del sonido o el video o un programa monitor a sensores o actuadores. Explicar aqu brevemente los elementos bsicos de esta tcnica:

Comunicando Arduino con otros sistemas

Funciones bsicas
El mismo cable con el que programamos el Arduino desde un computador es un cable de comunicacin serial. Para que su funcin se extienda a la comunicacin durante el tiempo de ejecucin, lo primero es abrir ese puerto serial en el programa que descargamos a Arduino. Para ello utilizamos la funcin
Serial.begin(9600);

1 de 8

25/04/2012 11:49 p.m.

Arduino playground - Appendix4

http://arduino.cc/playground/ArduinoNotebookTraduccion/Appendix4

Suggestions Formatting guidelines All recent changes PmWiki WikiSandBox training Basic Editing Cookbook (addons) Documentation index Italian Tutorial

La funcin que enva un dato es


Serial.print(data);

Una mirada en la referencia de Arduino permitir constatar que las funciones print y println (lo mismo que la anterior pero con salto de rengln) tienen opcionalmente un modificador que puede ser de varios tipos:
Serial.print(data, DEC); // decimal en ASCII // hexadecimal en ASCII // octal en ASCII // binario en ASCII // un Byte

edit SideBar

Serial.print(data, HEX); Serial.print(data, OCT); Serial.print(data, BIN); Serial.print(data, BYTE);

Como puede verse, prcticamente todos los modificadores, menos uno, envan mensajes en ASCII. Explicar brevemente:

Series de pulsos
En el modo ms sencillo y comn de comunicacin serial (asincrnica, 8 bits, ms un bit de parada) siempre se est enviando un byte, es decir un tren de 8 pulsos de voltaje legible por la mquina como una serie de 8 bit (1 0):

O sea que no importa cual modificador usemos siempre se estn enviando bytes. La diferencia esta en lo que esos bytes van a representar y slo hay dos opciones en el caso del Arduino: una serie de caracteres ASCII o un nmero. Si Arduino lee en un sensor analgico un valor de 65, equivalente a la serie binaria 01000001 esta ser enviada, segn el modificador, como:
dato 65 65 65 65 Modificador ---DEC------HEX------OCT------BIN---Envo (pulsos) (6 y 5 ASCIIs 5455) 000110110000110111 (4 Y 1 ASCIIs 5249) 000110100000110001 (0,1,0,0,0,0,0y1

(1, 0 y 1 ASCIIs 494849) 00011000100011000000

ASCIIs 494849494

2 de 8

25/04/2012 11:49 p.m.

Arduino playground - Appendix4

http://arduino.cc/playground/ArduinoNotebookTraduccion/Appendix4

65

---BYTE---

01000001

No explicaremos conversiones entre los diferentes sistemas de representacin numrica, ni la tabla ASCII, pero es evidente como el modificador BYTE permite el envo de informacin ms econmica (menos pulsos para la misma cantidad de informacin) lo que implica mayor velocidad en la comunicacin. Y ya que esto es importante cuando se piensa en interaccin en tiempo real es el modo que usaremos.

Un ejemplo sencillo
Enviar un slo dato es realmente fcil. En el tpico caso de un potencimetro conectado al pin 2 de Arduino:
int potPin = 2; int ledPin = 13; int val = 0; void setup() { Serial.begin(9600); pinMode(ledPin, OUTPUT); digitalWrite(ledPin, HIGH); //activamos el pin para saber cuando arranco } void loop() { val = analogRead(potPin); Serial.println(val); } // lee el valor del Pot

Si no utilizamos ningn modificador para el Serial.println es lo mismo que si utilizramos el modificador DEC. As que no estamos utilizando el modo ms eficiente pero si el ms fcil de leer en el mismo Arduino. Al ejecutar este programa podremos inmediatamente abrir el monitor serial del software Arduino (ltimo botn a la derecha) y aparecer el dato ledo en el potencimetro tal como si usramos el println en Processing.

Envo a Processing (versin ultra simple)


Para enviar este mismo dato a Processing si nos interesa utilizar el modo BYTE as que el programa en Arduino quedara as:
int potPin = 2; int ledPin = 13; int val = 0; void setup() {

3 de 8

25/04/2012 11:49 p.m.

Arduino playground - Appendix4

http://arduino.cc/playground/ArduinoNotebookTraduccion/Appendix4

Serial.begin(9600); pinMode(ledPin, OUTPUT); digitalWrite(ledPin, HIGH); // activamos el pin para saber cuando arranco } void loop() { // lee el Pot y lo divide entre 4 para quedar entre 0-255 val = analogRead(potPin)/4; Serial.print(val, BYTE); }

En Processing tenemos que crear un cdigo que lea este dato y haga algo con l:
import processing.serial.*; Serial puerto; // Variable para el puerto serial byte pot; // valor entrante int PosX; void setup() { size(400, 256); println(Serial.list()); // lista los puertos seriales disponibles //abre el primero de esa lista con velocidad 9600 port = new Serial(this, Serial.list()[0], 9600); fill(255,255,0); PosX = 0; pot = 0; } void draw() { if(puerto.available() > 0) { // si hay algn dato disponible en el puerto pot = puerto.read(); // lo obtiene println(pot); } ellipse(PosX, pot, 3, 3); // y lo usa if (PosX < width) { PosX++; } else { fill(int(random(255)),int(random(255)),int(random(255))); PosX = 0; } }

Si ya se anim a intentar usar ms de un sensor notar que no es tan fcil como duplicar algunas lneas.

4 de 8

25/04/2012 11:49 p.m.

Arduino playground - Appendix4

http://arduino.cc/playground/ArduinoNotebookTraduccion/Appendix4

Comunicacin va puerto Serie:


La tarjeta Arduino puede establecer comunicacin serie (recibir y enviar valores codificados en ASCII) con un dispositivo externo, a travs de una conexin por un cable/puerto USB o cable/puerto serie RS-232. Igual que para la descarga de los programas, slo ser necesario indicar el nmero de puerto de comunicaciones que estamos utilizando y la velocidad de transferencia en baudios.Tambin hay que tener en cuenta las limitaciones de la transmisin en la comunicacin serie, que slo se realiza a travs de valores con una longitud de 8-bits (1 Byte)(ver Serial.write() o Serial.read(c) ), mientras que como ya se hemos indicado, el A/D (Convertidor) de Arduino tiene una resolucin de 10-bits.(enlace) Dentro del interfaz Arduino, disponemos de la opcin "Monitorizacin de Puerto Serie", que posibilita la visualizacin de datos procedentes de la tarjeta.

Para definir la velocidad de transferencia de datos, hay que ir al men "Herramientas" (Tools) y seleccionar la etiqueta "Velocidad de monitor Serie"(Tools). La velocidad seleccionada, debe coincidir con el valor que hemos determinado o definido en nuestro programa y a travs del comando Serial.begin().Dicha velocidad es independiente de la velocidad

5 de 8

25/04/2012 11:49 p.m.

Arduino playground - Appendix4

http://arduino.cc/playground/ArduinoNotebookTraduccion/Appendix4

definida para la descarga de los programas. La opcin de "Monitorizacin de puerto serie" dentro del entorno Arduino, slo admite datos procedentes de la tarjeta. Si queremos enviar datos a la tarjeta, tendremos que utilizar otros programas de monitorizacin de datos de puerto serie como HyperTerminal (para Windows) -Enlace o ZTerm (para Mac)-XXXX- Linux-Enlace, etc. Tambin se pueden utilizar otros programas para enviar y recibir valores ASCII o establecer una comunicacin con Arduino: Processing (enlace), Pure Data (enlace), Director(enlace), la combinacin o paquete serial proxy + Flash (enlace), MaxMSP (enlace), etc. Nota: Hay que dejar tiempos de espera entre los envos de datos para ambos sentidos, ya que se puede saturar o colapsar la transmisin.

Envo de datos desde Arduino(Arduino->PC) al PC por puerto de comunicacin serie:


Ejercicio de volcado de medidas o valores obtenidos de un sensor analgico Cdigo
/* Lectura de una entrada analgica en el PC El programa lee una entrada analgica, la divide por 4 A0/PC5: potencimetro conectado al pin analgico 1 y puerto de PC-5 Created by Tom Igoe 6 Oct. 2005 Updated */ int val; // variable para capturar el valor del sensor analgico void setup() { // define la velocidad de transferencia a 9600 bps (baudios) beginSerial(9600); } void loop() { val = analogRead(0)/4; // texto de cabecera para separar cada lectura: printString("Valor Analogico ="); // obtenemos un valor codificado en ASCII (1 Byte) en formato decimal :

para convertirla en un rango entre 0 y 255, y enva el valor al PC en diferen

// captura la entrada analgica, la divide por 4 para hacer el rango de 0-

6 de 8

25/04/2012 11:49 p.m.

Arduino playground - Appendix4

http://arduino.cc/playground/ArduinoNotebookTraduccion/Appendix4

printInteger(val); printString("\t"); //Carcter espacio // obtenemos un valor codificado en ASCII (1 Byte) en formato hexadecimal printHex(val); printString("\t"); // obtenemos un valor codificado en ASCII (1 Byte) en formato binario printBinary(val); printString("\t"); // obtenemos un valor codificado en ASCII (1 Byte)en formato octal: printOctal(val); printString("\n\r"); //caracter salto de linea y retorno de carro // espera 10ms para la prxima lectura delay(10); }

Otra solucin puede ser la de transformar los valores capturados en un rango entre 0 y 9 y en modo de codificacin ASCII o en caracteres ASCII. De forma que dispongamos de un formato ms sencillo o legible, sobre la informacin capturada. El siguiente cdigo incluye una funcin llamada treatValue() que realiza dicha transformacin.
int val; // variable para capturar el valor del sensor analgico void setup() { // define la velocidad de transferencia a 9600 bps (baudios) beginSerial(9600); } int treatValue(int data) { return (data * 9 / 1024) + 48; //frmula de transformacin } void loop() { val= analogRead(0); //captura del valor de sensor analgico (0-1023) serialWrite(treatValue(val)); //volcado al puerto serie de 8-bits serialWrite(10); //caracter de retorno de carro serialWrite(13); //caracter de salto de lnea delay(10); }

// Serial Output // by BARRAGAN <http://people.interaction-ivrea.it/h.barragan>

7 de 8

25/04/2012 11:49 p.m.

Arduino playground - Appendix4

http://arduino.cc/playground/ArduinoNotebookTraduccion/Appendix4

int switchpin = 0; // interruptor conectado al pin 0 void setup() { pinMode(switchpin, INPUT); // pin 0 como ENTRADA Serial.begin(9600); } void loop() { if(digitalRead(switchpin) == HIGH) //si el interruptor esta en ON { Serial.print(1); } else { Serial.print(0); } delay(100); } // espera 100ms // en caso contrario enva 0 a Processing // enva 1 a Processing // inicia el puerto serie a 600bps

Share |

8 de 8

25/04/2012 11:49 p.m.