Documentos de Académico
Documentos de Profesional
Documentos de Cultura
4.Communication
These examples include code that allows the Arduino to talk to Processing sketches running on the
computer. For more information or to download Processing, see processing.org. There are also
Max/MSP patches that can communicate with each Arduino sketch as well. For more on Max/MSP
see Cycling 74. For Pd patches that can communicate with these sketches, see Scott Fitzgerald's
examples.
ReadASCIIString: Parse a comma-separated string of ints to fade an LED.
ASCII Table: Demonstrates Arduino's advanced serial output functions.
Dimmer: Move the mouse to change the brightness of an LED.
Graph: Send data to the computer and graph it in Processing.
Physical Pixel: Turn a LED on and off by sending data to your Arduino from Processing or
Max/MSP.
Virtual Color Mixer: Send multiple variables from Arduino to your computer and read them in
Processing or Max/MSP.
Serial Call Response: Send multiple variables using a call-and-response (handshaking)
method.
Serial Call Response ASCII : Send multiple variables using a call-and-response (handshaking)
method, and ASCII-encode the values before sending.
SerialEvent: Demonstrates the use of SerialEvent().
Serial input (Switch (case) Statement) : How to take different actions based on characters
received by the serial port.
MIDI: Send MIDI note messages serially.
MultiSerialMega: Use two of the serial ports available on the Arduino Mega.
Este bosquejo utiliza la función Serial.parseInt() para localizar valores separados por un carácter no
alfanumérico. A menudo, las personas utilizan una coma para indicar diferentes piezas de
información (este formato se conoce comúnmente como valores separados por comas), pero otros
caracteres como un espacio o un guion también se usan. Los valores se analizan en enteros y se
utilizan para determinar el color de un LED RGB. Vamos a usar el monitor serial para enviar cadenas
como "5,220,70" al Arduino para cambiar la luz del LED.
Hardware Required
Arduino Board
Breadboard
Hookup wire
Common anode RGB LED
Three 220-ohm resistors
Circuit
Tendremos cinco cables para hacer el circuito anterior. Conectemos un cable rojo a una de las filas
largas verticales del protoborad y conectemos el otro extremo al pin de 5V de la placa Arduino.
Los LEDs RGB con un ánodo común comparten un pin de alimentación común. En lugar de convertir
un pin a un nivel alto para iluminar el LED, se necesita convertir un nivel BAJO al pin, para crear una
diferencia de voltaje a través del diodo. Así que, si envíanos 255 a través analogWrite() apagará el
LED, mientras que un valor de 0 lo encenderá al máximo de su brillo. En el siguiente código, vamos a
usar un poco de matemáticas del lado Arduino, para que podamos enviar valores que se
correspondan con el brillo esperado. Esencialmente, en lugar de utilizar analogWrite(pin, brillo), se le
llamará analogWrite(pin, 255-brillo).
En el setup(), comenzaremos la comunicación serial a 9600 bits de datos por segundo entre Arduino
y el ordenador con la línea:
Serial.begin(9600);
A continuación, declararemos algunas variables locales para almacenar la información del monitor
serial. Esto será el brillo de los LEDs. Utilizando Serial.parseInt() para separar los datos por comas, y
de esta manera leer la información de nuestras variables:
int red = Serial.parseInt();
int green = Serial.parseInt();
int blue = Serial.parseInt();
Nombre Serial.parseInt()
Descripción Serial.parseInt() lee la información del monitor serial y devuelve el primer número
entero (de tipo long) válido a partir de la posición actual. Los caracteres iniciales que
no son enteros (o el signo menos) son ignorados. Serial.parseInt() termina cuando se
encuentra el primer carácter que no es un dígito.
Sintaxis Serial.parseInt()
Una vez que hemos leídos los datos de las variables, comprobamos que el carácter es un salto de
línea, para continuar:
if (Serial.read() == '\n') { // if (Serial.read() == -1) {
Con el uso constrain(), puede mantenerse los valores en un rango aceptable para el control PWM. De
esta manera, si el valor esta fuera del rango PWM (0-255), se limita a un valor válido. Restando a 255
este valor, obtendremos un valor apropiado para ser usado con un LED de ánodo común. Como se
explicó anteriormente, estos LEDs se iluminan cuando hay una diferencia de voltaje entre el ánodo y
el pin conectado al Arduino:
red = 255 - constrain(red, 0, 255);
green = 255 - constrain(green, 0, 255);
blue = 255 - constrain(blue, 0, 255);
Enviamos el valor de cada LED de nuevo al monitor serial en una cadena de valores HEX:
Serial.print(red, HEX);
Serial.print(green, HEX);
Serial.println(blue, HEX);
Por último, cerramos la llave de las sentencias if, while, y el bucle principal:
}
}
}
Una vez que hayamos programado el Arduino, abrimos nuestro monitor serial. Asegurándonos de
que hemos elegido enviar una nueva línea de caracteres al enviar un mensaje. Introducimos valores
entre 0-255 para que alumbren en el siguiente formato: Rojo, Verde, Azul. Una vez que hayamos
enviado los valores al Arduino, el LED conectado encenderá el color especificado, y nosotros
recibiremos los valores HEX en el monitor serial.
void setup() {
Serial.begin(9600); // comenzamos la comunicación serial
void loop() {
while (Serial.available() > 0) { // mientras haya algo en el serial disponible, lo leemos
if (Serial.read() == '\n') { // buscamos una nueva línea. Sí es así, eso indicara
// el final de nuestra sentencia
if (Serial.read() == '\n') {
Este bosquejo demuestra las funciones avanzadas de impresión del puerto serial, mediante la
generación de una tabla de caracteres y sus valores ASCII en decimal, hexadecimal, octal y binario.
Hardware Required
Arduino Board
Circuit
TABLA ASCII
void setup() {
Serial.begin(9600); //comenzamos la comunicación serial y
// esperamos por la apertura del puerto serial:
while (!Serial) {
; // espera por el puerto serial para conectar
}
Serial.println("ASCII Table ~ Character Map"); // imprimimos el titulo con un salto de línea al final
}
int thisByte = 33; // el primer carácter visible ASCII '!' es el número 33:
void loop() {
// escribimos el valor inalterado, es decir, la versión binaria pura del Byte en el monitor serial
// El monitor serie interpreta todos los bytes como ASCII, por lo que el 33, se mostrará como '!'
Serial.write(thisByte);
if(thisByte == 126) { // sí imprime el último carácter visible '~' o 126 se detiene
while(true) { // este bucle, ya que se recorre por siempre, y no hace nada
continue;
} // podríamos haber utilizado también (thisByte == '~') {
}
cuando utilizo la palabra continue dentro de un bucle lo que viene a continuación se ignora
while(true) → se va cumplir siempre
while(false) →no se va a cumplir nunca
Este ejemplo muestra cómo enviar datos desde un ordenador personal a una placa Arduino para
controlar el brillo de un LED. Los datos se envían en bytes individuales, cada uno de los cuales se
extiende entre un valor de 0 a 255. Arduino lee estos bytes y los utiliza para ajustar el brillo del LED.
Podemos enviar bytes al Arduino desde cualquier software que pueda acceder al puerto serie del
ordenador. Por ejemplos Processing y Max/MSP version 5 los cuales se muestran a continuación.
Hardware Required
Arduino Board
LED
220 ohm resistor
Software Required
Processing or
Max/MSP version 5
Circuit
Conectemos un LED al pin 9. Para ello usemos una resistencia de 220 o 330 Ohm en serie con el LED.
Schematic
Code
void setup() {
Serial.begin(9600); // comenzamos la comunicación serial:
pinMode(ledPin, OUTPUT); // configuramos el ledPin como una salida:
}
void loop() {
byte brightness; // declaramos la variable brightness como un tipo de dato byte
Nombre byte
Ejemplo byte a; // Declara la variable "a" de tipo byte
a = 23; // Asigna a "a" el valor 23
byte b = 128; // Declara la variable "b" y le asigna el valor 128
byte c = a + b; // Declara la variable "c" y le asigna la suma de "a" y "b”
Descripción Tipo de datos para bytes, 8 bits de información que almacena valores numéricos de
0 a 255. Bytes son un tipo de dato conveniente para enviar información hacia y
desde el puerto serial y para representar letras en un formato más simple que el tipo
de dato char
Sintaxis byte Var
byte Var = Valor
Parámetros Var Nombre de la variable representando el valor
Valor Un número entre 0 y 255
Mediante el programa processing hacemos un rectángulo de 256 x 150, con un degrade entre blanco
y negro en dirección del eje X. Entonces al mover el mause sobre éste rectángulo enviamos bytes a la
placa Arduino para cambiar el brillo del LED. El código en prosessing es el siguiente:
// El parámetro Serial.list () [0] utiliza el primer puerto disponible a partir de 0
// Cambiemos esto al puerto correspondiente de la placa Arduino si lo conocemos,
// en nuestro caso "COM3" (sino puede utilizar otro por ej. el COM1).
// El parámetro 9600 es la velocidad de comunicación,
// esta tiene que corresponder con el valor usado en Serial.begin()
// anteriormente en nuestro boceto Arduino.
// port = new Serial(this, Serial.list()[0], 9600);
// como nosotros conocemos el puerto y la velocidad de comunicación, la línea anterior cambia a:
port = new Serial(this, "COM3", 9600); // abrimos el puerto Serial
}
void draw() {
for (int i = 0; i < 256; i++) { // dibujamos un degradado de negro a blanco
stroke(i); // configura el color para dibujar líneas y bordes alrededor de una figura
line(i, 0, i, 150); // dibuja una línea entre dos puntos en la pantalla (x1, y1, x2, y2)
}
port.write(mouseX); // escribimos la posición X actual del ratón, en puerto serie, como un solo byte
}
Processing librerías
PDF Export
Create PDF files. These vector graphics files can be scaled to any size and printed at high resolutions
Serial
Send data between Processing and external hardware through serial communication (RS-232)
Video
Read images from a camera, play movie files, and create movies
Network
Send and receive data over the Internet through simple clients and servers
DXF Export
Create DXF files to save geometry for loading into other programs. It works with triangle-based
graphics including polygons, boxes, and spheres
Sound
Playback audio files, audio input, synthesize sound, and effects
1 byte = 8 bits = 00010100 = 256 combinaciones posibles = -128 a 127 (sale de dividir 256/2 y
considera el cero
Tipo de dato: byte tamaño = 8 bits
Tipo de dato: short tamaño = 16 bits
Tipo de dato: int tamaño = 32 bits
Tipo de dato: long tamaño = 64 bits
Este ejemplo muestra cómo enviar un byte de datos desde el Arduino a un ordenador personal y
representar gráficamente el resultado. A esto se lo llama comunicación serie, porque la conexión
entre el Arduino y el ordenador se realiza por el puerto serie, a pesar de que en realidad se utiliza un
cable USB.
Se puede utilizar el monitor serial Arduino para ver los datos enviados, o puede ser leído por
Processing (ver el código de abajo), Flash, PD, Max / MSP, etc.
Hardware Required
Arduino Board
Analog Sensor (potentiometer, photocell, FSR, etc.)
Software Required
Processing or
Max/MSP version 5
Circuit
Conectamos un potenciómetro u otro sensor analógico a la entrada analógica 0.
Schematic
Code
void setup() {
Serial.begin(9600); // comenzamos la comunicación serial:
}
void loop() {
import processing.serial.*;
Serial port;
stroke(89,151,126);
En este ejemplo se utiliza la placa Arduino para recibir datos desde el ordenador. La placa Arduino se
encenderá el LED cuando recibe el carácter 'H', y se apagará el LED cuando recibe el carácter 'L'.
Los datos pueden ser enviados desde el monitor Arduino serie, u otro programa como Processing
(ver código de abajo), Flash (a través de un proxy de serie-net), PD, o Max
Hardware Required
Arduino Board
Analog Sensor (potentiometer, photocell, FSR, etc.)
Software Required
Processing or
Max/MSP version 5
Circuit
Conectar un LED al pin 13. La pata más larga, o ánodo, va al pin 13. La pata más corta, o cátodo, va a
tierra. También se puede utilizar el built-in LED en la mayoría de las placas Arduino.
void setup() {
// comenzamos la comunicación serial:
Serial.begin(9600);
void loop() {
// vemos si hay datos entrando en el puerto serial:
if (Serial.available() > 0) {
Código en processing
Cuando se pasa el ratón sobre el cuadrado central, el LED en el pin 13 debe encenderse y apagarse
import processing.serial.*;
float boxX;
float boxY;
int boxSize = 20;
boolean mouseOverBox = false;
Serial port;
void setup() {
size(200, 200); // tamaño de la pantalla
boxX = width/2.0;
boxY = height/2.0;
rectMode(RADIUS); //configura el rectMode en Radio, es decir que el tamaño de la caja será el doble
void draw()
{
background(0);
// dibujamos la caja
rect(boxX, boxY, boxSize, boxSize);
// enviar una 'H' para indicar que el mause esta sobre le cuadrado:
port.write('H');
}
else { // de otro modo, o sea al no estar el cursor sobre la caja
// devolver la caja a su estado inactivo:
stroke(153);
fill(153);
Este ejemplo muestra cómo enviar múltiples valores de la placa Arduino al ordenador. Las lecturas de
los tres potenciómetros se utilizan para establecer los componentes rojo, verde y azul del color de
fondo de un boceto en Processing o Max/MSP
Hardware Required
Arduino Board
(3) Analog Sensors (potentiometer, photocell, FSR, etc.)
(3) 10K ohm resistors
breadboard
hook-up wire
Software Required
Processing or
Max/MSP version 5
Circuit
Conectamos los sensores analógicos a los pines analógicos de entrada 0, 1 y 2.
Este circuito utiliza tres subcircuitos divisores de tensión para generar tensiones analógicas a partir
de los sensores de fuerza resistivos. Un divisor de tensión tiene dos resistencias en serie, dividiendo
la tensión de forma proporcional a sus valores.
void setup()
{
Serial.begin(9600);
}
void loop()
{
Serial.print(analogRead(redPin));
Serial.print(",");
Serial.print(analogRead(greenPin));
Serial.print(",");
Serial.println(analogRead(bluePin));
}
import processing.serial.*;
Serial myPort;
void setup() {
size(200, 200);
myPort.bufferUntil('\n');
}
void draw() {
// configuramos el color del fondo con los valores:
background(redValue, greenValue, blueValue);
}
if (inString != null) {
// recortamos cualquier espacio en blanco:
inString = trim(inString);
// si el array tiene por lo menos tres elementos, sabemos que está completo
// y podemos poner los números en la variables de color
if (colors.length >=3) {
Este ejemplo demuestra la comunicación multi-byte de la placa Arduino con el ordenador mediante
el método de llamada y respuesta (apretón de manos).
Este bosquejo envía un ASCII A (byte de valor 65) en el inicio y repite esto hasta que recibe una
respuesta del puerto serie de la computadora. Luego se envía tres valores de los sensores como
bytes individuales, y se espera otra respuesta de la computadora.
Podemos utilizar el monitor serial Arduino para ver los datos enviados, o puede ser leído por
Processing (ver código de abajo), Flash, PD, Max / MSP (ver siguiente ejemplo), etc.
Hardware Required
Arduino Board
(2) analog sensors (potentiometer, photocell, FSR, etc.)
(1) momentary switch/button
(3) 10K ohm resistors
breadboard
hook-up wire
Software Required
Processing or
Max/MSP version 5
Circuit
Conectamos los sensores analógicos a los pines de entrada analógico 0 y 1, con resistencias de 10K
ohmios, que se utilizan como divisores de tensión. Conectemos un pulsador o interruptor al pin
digital de E/S 2, con una resistencia 10 Kohm como referencia a tierra.
void setup()
{
// comenzamos comunicación a través del puerto serial a 9600 bps:
Serial.begin(9600);
while (!Serial) {
; // esperar a que el puerto serial esté conectado
}
void loop()
{
// leer la primera entrada analógica, dividir por 4 para hacer un rango 0-255:
firstSensor = analogRead(A0)/4;
// leer la segunda entrada analógica, dividir por 4 para hacer un rango 0-255:
secondSensor = analogRead(A1)/4;
void establishContact() {
while (Serial.available() <= 0) {
Serial.print('A'); // enviar la A mayúscula
delay(300);
}
}
import processing.serial.*;
void setup() {
size(256, 256); // tamaño del escenario
noStroke(); // no dibujar el borde en el próximo dibujo
void draw() {
background(bgcolor);
fill(fgcolor);
// dibujamos la figura, una elipse
ellipse(xpos, ypos, 20, 20);
}
// Si tenemos 3 bytes:
if (serialCount > 2 ) {
xpos = serialInArray[0];
ypos = serialInArray[1];
fgcolor = serialInArray[2];
Apretando el pulsador
Con uno potenciómetro muevo la pelota en el eje X, con el otro potenciómetro lo muevo en el eje Y;
y con el pulsador veo la pelota.
Este ejemplo demuestra la comunicación basada en cadena (String), entre la placa Arduino y el
ordenador utilizando el método de respuesta y llamada (apretón de manos).
El boceto envía una cadena ASCII en el comienzo y lo reitera hasta que se obtenga una respuesta en
el puerto serie de la computadora. Luego se envía tres valores de los sensores como números ASCII-
codificado, separados por comas y terminadas por un salto de línea y retorno de carro, y se espera
otra respuesta del equipo.
Podemos utilizar el monitor serial del Arduino para ver los datos enviados, o puede ser leído por
Procesamiento (ver código de abajo), Flash, PD, Max / MSP (ver siguiente ejemplo), etc. El ejemplo a
continuación separa el String en las comas y convertir la cadena en un número otra vez.
Comparemos este ejemplo con el ejemplo Serial Call Response. Son similares, en tanto que utilizan
un método de establecimiento de comunicación, pero éste codifica las lecturas del sensor como
cadenas, mientras que el otro los envía como valores binarios. Al enviar como cadenas ASCII
codificados toma más bytes, significa que podemos enviar fácilmente valores mayores que 255 de la
lectura de cada sensor. También es más fácil de leer en un programa de terminal serie.
Hardware Required
Arduino Board
(2) analog sensors (potentiometer, photocell, FSR, etc.)
(1) momentary switch/button
(3) 10K ohm resistors
breadboard
hook-up wire
Software Required
Processing or
Max/MSP version 5
void setup()
{
// comenzamos comunicación a través del puerto serial a 9600 bps:
Serial.begin(9600);
while (!Serial) {
; // esperar a que el puerto serial esté conectado
}
void loop()
{
void establishContact() {
while (Serial.available() <= 0) {
Serial.println("0,0,0"); // enviar un string inicial
delay(300);
}
}
Un string lo debo escribir entre comillas doble ("0,0,0"). eso significa que es un tipo de dato cadena
seria un conjunto de caracteres que conformar una palabra
Los char lo debo escribir entre comilla simple ('A')
Nombre String
Ejemplo // declara s1 con un string inicial
String s1 = String("string numero uno");
byte bytes[20]; // arreglo de bytes
char array[20]; // arreglo de caracteres
void setup() {
Serial.begin(9600);
// Enciende el LED de la tarjeta Wiring
pinMode(WLED, OUTPUT);
digitalWrite(WLED, HIGH);
// s2 contiene "10000"
String s2 = String(10000);
Serial.println("s2 contiene: " + s2);
// s3 contiene "567000"
String s3 = String(567000, DEC);
Serial.println("s3 contiene: " + s3);
void loop() {
}
Descripción Un string es una cadena de caracteres. La clase String incluye métodos para examinar
caracteres individuales, comparar strings, buscar strings, extraer partes de un string, y
Note que la clase de Wiring String tiene diferencias con la clase String de processing o
Java. La principal diferencia es que algunos métodos modifican el string actual en vez
de devolver una copia modificada de él.
Métodos charAt() Devuelve el carácter en un índice especificado
compareTo() Compara dos strings lexicográficamente
concat() Concatena el argumento String especificado
endsWith() Devuelve true si el string actual termina con el string de entrada
equals() Compara un string con un string especificado
equalsIgnoreCase( Compara un string con un string especificado, ignorando
) mayúsculas y minúsculas
indexOf() Devuelve el valor del índice de la primera aparición de un
carácter o un string en un string de entrada
lastIndexOf() Devuelve el valor del índice de la última aparición de un carácter
o un string en un string de entrada
length() Devuelve el número de caracteres en un string
setCharAt() Cambia un carácter especificado en el índice especificado
startsWith() Devuelve true si el string actual empieza con el string de entrada
Substring() Devuelve un nuevo string que es parte del string de entrada
toLowerCase() Convierte todos los caracteres a minúsculas
toUpperCase() Convierte todos los caracteres a mayúsculas
toInt() Devuelve la representación numérica de un string
trim() Devuelve una copia de un string, destacando y rastreando
espacios en blanco omitidos
getBytes() Devuelve un arreglo de bytes conteniendo los caracteres de un
String como bytes
toCharArray() Devuelve el contenido de un String especificado como un
arreglo de caracteres
replace() Remplaza todas las apariciones de un caracter en un string con
el caracter espeficado
Sintaxis String(data)
String(data, base)
Parámetros Data byte[], char[]: Arreglo de bytes para ser decodificado en
caracteres o arreglo de caracteres para ser convinados en un
string, int, long: conversión de string de un valor especificado,
String: string para ser copiado en un string creado
Base DEC, HEX, OCT o BIN (exclusivo para datos int o long)
Nombre char
Ejemplo char m; // Declara la variable "m" de tipo char
m = 'A'; // Asigna a "m" el valor "A"
int n = '&'; // Declara la variable "n" y le asigna el valor "&"
Descripción Tipo de datos para caracteres, símbolos tipográficos como A, d, y $.
import processing.serial.*;
void setup() {
size(640, 480); // tamaño del escenario
// leemos los bytes en un búfer hasta que obtenemos un avance de línea (ASCII 10):
myPort.bufferUntil('\n');
void draw() {
background(bgcolor);
fill(fgcolor);
// y añadimos un salto de línea después de que se imprimen todos los valores de los sensores:
println();
if (sensors.length > 1) {
xpos = map(sensors[0], 0,1023,0,width);
ypos = map(sensors[1], 0,1023,0,height);
fgcolor = sensors[2];
}
// enviamos un byte para pedir más datos:
myPort.write("A");
}
SerialEvent () se lo llama/ejecuta después de un loop (), cuando una nueva serie de datos llega desde
el buffer del puerto serial, este método lo añade a una cadena(string).
Circuit
Code
String inputString = ""; // hacemos una String (cadena) para contener los datos de entrada
boolean stringComplete = false; // creamos un variable booleana stringComplete
void setup() {
// inicializamos el puerto serial:
Serial.begin(9600);
// reservamos 200 bytes para el inputString:
inputString.reserve(200);
}
void loop() {
// imprimimos el String cando llega una nueva línea:
if (stringComplete) { // stringComplete puede ser true o false, si es true ejecutara la orden
Serial.println(inputString);
// borramos el string:
inputString = "";
stringComplete = false;
}
}
/*
El SerialEvent se produce cada vez que un nuevo dato viene a través de la conexión serial RX del
hardware. Esta rutina se ejecuta entre cada bucle, por lo que el uso de un delay en el interior del
bucle, puede retrasar la respuesta */
void serialEvent() {
while (Serial.available()) {
// obtenemos el nuevo byte inChar desde el serial:
char inChar = (char)Serial.read();
// lo agregamos en el inputString:
inputString += inChar;
// si el carácter de entrada es una nueva line, establecemos un indicador
// entonces el bucle principal puede hacer algo ya que el if(stringComplete) será true:
if (inChar == '\n') {
stringComplete = true;
}
}
}
31. Serial input (Switch (case) Statement): Cómo tomar diferentes acciones basadas en caracteres
recibidos por el puerto serie.
Una sentencia if nos permite elegir entre dos opciones discretas, verdadero o falso. Cuando hay más
de dos opciones, se pueden utilizar múltiples sentencias if, o se puede utilizar la sentencia switch.
Switch nos permite elegir entre varias opciones discretas.
Este tutorial muestra cómo utilizar el comando Switch para encender uno de varios LEDs basados en
un byte de datos recibidos por el puerto serie. El sketch atiende la entrada del puerto serie, y se
enciende un LED diferente para cada caracter a, b, c, d, e.
Hardware Required
Arduino Board
(5) LEDs
(5) 220 ohm resistors
breadboard
hook-up wire
Circuit
Cinco LEDs están asociadas a los pines digitales 2, 3, 4, 5, y 6 en serie a través de una resistencia de
220 ohmios.
Para hacer este trabajo, nuestro Arduino debe estar conectado al ordenador. Abrimos el Monitor
serial, y enviar los caracteres a, b, c, d.
Schematic
Code
void setup() {
// inicializamos la comunicación serial:
Serial.begin(9600);
// inicializamos los pines del LED como salidas:
for (int thisPin = 2; thisPin < 7; thisPin++) {
pinMode(thisPin, OUTPUT);
}
}
void loop() {
// leemos los datos del serial, y lo cargamos en la variable inByte:
if (Serial.available() > 0) {
int inByte = Serial.read();
switch (inByte) {
case 'a':
digitalWrite(2, HIGH);
break;
case 'b':
digitalWrite(3, HIGH);
break;
case 'c':
digitalWrite(4, HIGH);
break;
case 'd':
digitalWrite(5, HIGH);
break;
case 'e':
digitalWrite(6, HIGH);
break;
default:
// apagar todos los LEDs:
for (int thisPin = 2; thisPin < 7; thisPin++) {
digitalWrite(thisPin, LOW);
}
}
}
}
Nombre case
switch (letter) {
case 'A':
Serial.println("Alpha"); // No se ejecuta
break;
case 'B':
Serial.println("Bravo"); // Imprime Bravo
break;
default:
Serial.println("Zulu"); // No se ejecuta
break;
}
Descripción Denota las etiquetas principales a ser evaluadas con el parámetro en la
estructura switch()
Sintaxis case etiqueta: declaración
Parámetros Etiqueta byte, char, o int
Declaración una o más instrucciones válidas
Nombre break
Ejemplo char letter = 'B';
switch (letter) {
case 'A':
Serial.println("Alpha"); // No se ejecuta
break;
case 'B':
Serial.println("Bravo"); // Imprime Bravo
break;
default:
Serial.println("Zulu"); // No se ejecuta
break;
}
Descripción Finaliza la ejecución de estructuras como switch(), for(), o while() y continua a la
siguiente instrucción
Sintaxis break
Nombre switch()
Ejemplo int num = 1;
switch (num) {
case 0:
Serial.println("Zero"); // No se ejecuta
break;
case 1:
Serial.println("One"); // Imprime "One"
break;
switch (letter) {
case 'A':
Serial.println("Alpha"); // No se ejecuta
break;
case 'B':
Serial.println("Bravo"); // No se ejecuta
break;
default: // Ejecución por defecto si la etiqueta case
Serial.println("None"); // no coincide con los parámetros de switch
break;
}
----------------------------------------------------------------------------------------------------
switch (letter) {
case 'a':
case 'A':
Serial.println("Alpha"); // No se ejecuta
break;
case 'b':
case 'B':
Serial.println("Bravo"); // Imprime "Bravo"
break;
}
Descripción Trabaja como una estructura if else, pero switch es más conveniente cuando
necesitamos seleccionar entre tres o más alternativas. Los controles del programa
saltan al caso con el mismo valor como expresión. Todas las declaraciones en el
switch son ejecutadas hasta que son redireccionadas por un break. Solo datos
primitivos que puedan ser convertidos en enteros (byte, char y int) pueden ser
usados como parámetro expresión. El default es opcional.
Sintaxis switch (expresión)
{
case etiqueta:
declaraciones
case etiqueta: // Opcional
declaraciones // Opcional
default: // Opcional
declaraciones // Opcional
Nombre default
Ejemplo char letter = 'F';
switch (letter) {
case 'A':
Serial.println("Alpha"); // No se ejecuta
break;
case 'B':
Serial.println("Bravo"); // No se ejecuta
break;
default:
Serial.println("Zulu"); // Imprime Zulu
break;
}
Descripción Palabra reservada para definir la condición por defecto de un switch(). Si ninguna de
las etiquetas de los casos corresponde con el parámetro del switch(), se ejecutan las
instrucciones después del default. La estructura Switch no requiere un defaul.
Sintaxis default: declaración
Parámetros Declaración una o más instrucciones válidas a ser ejecutada
32. MIDI: Envíar mensajes de notas MIDI a través del puerto serial.
MIDI, the Musical Instrument Digital Interface, es un protocolo útil para sintetizadores, secuenciadores
de control y otros dispositivos musicales. Los dispositivos MIDI son generalmente agrupados en dos
grandes clases: los controladores (es decir, dispositivos que generan señales MIDI basado en las
acciones humanas) y sintetizadores (incluyendo samplers, secuenciadores, y otros). Estos últimos toman
datos en MIDI y crean el sonido, la luz, o algún otro efecto.
MIDI es un protocolo serie que opera a 31.250 bits por segundo. El puerto serie incorporado en el
Arduino puede enviar datos a esta velocidad.
Los MIDI Bytes se dividen en dos tipos: bytes de comando y bytes de datos. Bytes de comando son
siempre 128 o mayor, o 0x80 a 0xFF en hexadecimal. Bytes de datos son siempre menor que 127, o
0x00 a 0x7F en hexadecimal. Los bytes de comandos incluyen cosas sobre la nota, que no toque la nota,
etc. Los Bytes de datos incluyen cosas como el tono de la nota que debe tocar, la velocidad, o el
volumen de la nota, etc. Para más detalles, consultemos las especificaciones de MIDI, de uno de las
muchas guías de protocolo MIDI en la Web.
Los datos MIDI se suele anotar en hexadecimal porque los bancos e instrumentos MIDI se agrupan en
grupos de 16.
Hardware Required
Arduino UNO
(1) MIDI jack
(1) 220 ohm resistor
hook-up wire
MIDI enabled device (optional, for testing)
Todos los conectores MIDI son hembra, por definición de la especificación MIDI. Aquí se ve como
conectar el conector al Arduino
Circuit
Arduino digital pin 1 connected to MIDI jack pin 5
MIDI jack pin 2 connected to ground
MIDI jack pin 4 connected to +5V through 220-ohm resistor
Schematic
Code
void setup() {
// Configuramos la velocidad de transmisión MIDI:
Serial.begin(31250);
}
void loop() {
// tocar notas desde F#-0 (0x1E) a F#-5 (0x5A):
for (int note = 0x1E; note < 0x5A; note ++) {
//Nota en el canal 1 (0x90), algún valor de (note), velocidad media (0x45):
noteOn(0x90, note, 0x45);
delay(100);
// reproducir una nota MIDI note. No comprobar que cmd (byte de comandos) es mayor que 127, o
que los valores de los datos son menores a 127:
void noteOn(int cmd, int pitch, int velocity) {
Serial.write(cmd);
Serial.write(pitch);
Serial.write(velocity);
}
note: El valor de tono (picth) determina la frecuencia de la nota que se desea reproducir. este valor va
de 0 a 127, con la nota media C está representada por el valor de 60.
velocidad 0x45: En sintetizadores básicos, el valor de velocidad sólo se utiliza para determinar la fuerza
con la que se reproduce la nota, el único efecto de ser una nota que es más fuerte o más suave en el
volumen. este valor va de 0 a 127
F#-0 (0x1E)
33. MultiSerialMega: Uso de los dos puertos seriales disponibles en Arduino Mega.
A veces, un puerto serial no es suficiente! Al tratar de comunicarse con múltiples dispositivos seriales
activos, es posible que al mismo tiempo que envío información quiera recibir de nuevo información en
la ventana serial, tener algunos puertos adicionales RX / TX pueden ser algo muy útil. En este ejemplo se
hace uso de uno de los 3 puertos seriales auxiliares de Arduino Mega, se realiza el enrutamiento de los
datos entrantes leídos en esta conexión directa a través de la línea principal TX, y, a su vez, a la ventana
principal del monitor serial para que puedamos visualizado.
Hardware Required
(1) Arduino Mega Board
(1) serial enabled device (a Xbee Radio, Bluetooth module, or RFID reader, or another Arduino,
for instance).
Circuit
Después de comprobar la hoja de datos de cualquier dispositivo serie activo, que elijamos utilizar para
este ejemplo, asegurémonos de que esta correctamente conectado y alimentado. Posteriormente
conectemos el pin RX y los pines TX de nuestro dispositivo a los pines TX y RX del Arduino Mega, como
se muestra en el esquema de abajo.
Asegurémonos de que nuestro Mega está conectado al ordenador, a través de USB, para permitir la
comunicación en serial.
Schematic
Code
void setup() {
// inicializamos ambos puertos seriales:
Serial.begin(9600);
Serial1.begin(9600);
}
void loop() {
// leemos desde el puerto 1 y lo enviamos al puerto 0:
if (Serial1.available()) {
int inByte = Serial1.read();
Serial.write(inByte);
}