You are on page 1of 108

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

CAPITULO I Estructura
setup() (inicializacin) loop() (bucle) if (comparador si-entonces) if...else (comparador si...sino) for (bucle con contador) switch case (comparador mltiple). while (bucle por comparacin booleana) do... while booleana) (bucle por comparacin Operadores Booleanos && (y) || (o)

Estructuras de control

! (negacin) Operadores de Composicin ++ (incrementa) -- (decrementa) +=(composicin suma) -= (composicin resta) *=(composicin multiplicacin) /= (composicin divisin)

break (salida de bloque de cdigo) continue (continuacin en bloque de cdigo) return (devuelve valor a programa) ; (punto y coma) {} (llaves) // (comentarios en una lnea) /* */ (comentarios en mltiples lneas) = (asignacin) + (suma)

Sint axis

Operadores Arit m ticos

-(resta) *(multiplicacin) / (divisin) % (resto) Referencia del Lenguaje C/C++ Los programas hechos con Arduino se dividen en tres partes principales: estructura, valores (variables y constantes), y funciones. El Lenguaje de programacin Arduino se basa en C/C++. == (igual a) != (distinto de) < (menor que) > (mayor que) <= (menor o igual que) >= (mayor o igual que) Operadores Comparativos

Pag 97

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

CAPITULO I. 1. Estructura
setup() La funcin setup() se establece cuando se inicia un programa -sketch. Se emplea para iniciar variables, establecer el estado de los pins, inicializar libreras, etc. Esta funcin se ejecutar una nica vez despus de que se conecte la placa Arduino a la fuente de alimentacin, o cuando se pulse el botn de reinicio de la placa. Ejemplo int buttonPin = 3; void setup() { Serial.begin(9600); pinMode(buttonPin, INPUT); } void loop() { // ... } loop() Luego de crear la funcin setup(), la cual inicializa y prepara los valores inciales, la funcin loop() hace justamente lo que su nombre sugiere, por lo tanto se ejecuta consecutivamente, permitindole al programa variar y responder. sala para controlar de forma activa la placa Arduino. Ejemplo int buttonPin = 3; // setup inicializa la comunicacin serial y el buttonPin void setup() { beginSerial(9600); pinMode(buttonPin, INPUT); } // loop obtiene el estado del pin del botn cada vez, // y de estar presionado, lo comunica por serial. void loop() { if (digitalRead(buttonPin) == HIGH)

Pag 98

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

serialWrite('H'); else serialWrite('L'); delay(1000); } 1.1 1.1.1 Es tr u ctur as de con tr ol if (condicional) y ==, !=, <, > (operadores de comparacin)

if, el cual puede ser usado en conjunto con uno o ms operadores de comparacin, comprueba si cierta condicin se cumple, por ejemplo, si un input posee un valor mayor a cierto nmero. El formato para una comprobacin if es el siguiente: if (algunaVariable > 50) { // hacer algo aqu. } Este programa comprueba si la variable algunaVariable es mayor a 50. Si lo es, el programa toma una accin particular. Dicho de otra forma, si la declaracin escrita dentro de los parntesis es verdadera (true), el cdigo dentro de las llaves se ejecutar. Sino, el programa ignora dicho cdigo. Las llaves pueden ser omitidas luego de una declaracin if. De hacer esto, la siguiente lnea (definida por el punto y coma) ser la nica afectada por la condicin. if (x > 120) digitalWrite(LEDpin, HIGH); if (x > 120) digitalWrite(LEDpin, HIGH); if (x > 120){ digitalWrite(LEDpin, HIGH); } if (x > 120){ digitalWrite(LEDpin1, HIGH); digitalWrite(LEDpin2, HIGH); } // todos los ejemplos son correctos. Las declaraciones a evaluar dentro de los parntesis, requieren el uso de uno o ms operadores: Operadores de Comparacin: x == y (x es igual a y) x != y (x no es igual a y)

Pag 99

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

x < y (x es menor a y) x > y (x es mayor a y) x <= y (x es menor o igual a y) x >= y (x es mayor o igual a y) Atencin: Ten cuidado de no usar un signo de igual solo (Ej. if (x = 10) ). Un signo de igual solo es el operador que indica la asignacin de un valor, y va a asignar 10 a x. En su lugar usa el signo de igual doble (Ej. if (x == 10) ), el cual es el operador de comparacin, y comprueba si x equivale a 10 o no. El ltimo ejemplo slo da true si x equivale a 10, pero el ejemplo anterior (con un slo smbolo =) dar siempre TRUE. Esto es porque C evala la declaracin if (x=10) de la siguiente manera: 10 es asignado a x (Recuerda que un signo = solo, es el operador de asignacin), por lo tanto x ahora contiene 10. Entonces el condicional if evala 10, el cual siempre resulta TRUE, debido a que cualquier valor numrico mayor a 0 es evaluado como TRUE. Consecuentemente, if (x = 10) siempre ser evaluado como TRUE, lo cual no es el resultado deseado cuando se usa una declaracin if. Adicionalmente, la variable x ser definida en 10, lo que tampoco es una accin deseada. if tambin puede ser parte de una estructura de control de ramificacin usando la construccin if...else. 1.1.2 if / else

if/else permite mayor control sobre el flujo del cdigo que la declaracin if bsica, por permitir agrupar mltiples comprobaciones. Por ejemplo, un input anlogo podra ser comprobado, y tomarse una accin si el valor del inputes menor a 500, y, otra accin se ser igual o mayor a 500. El cdigo se vera as: if (pinCincoInput < 500) { // accin A } else { // accin B } else puede proceder a una comprobacin if, de esta forma, se pueden realizar mltiples comprobaciones en una misma estructura de condiciones. Cada comprobacin proceder a la siguiente, slo cuando su propio resultado sea FALSE. Cuando el resultado sea TRUE, su bloque de cdigo contenido, ser ejecutado, y el programa esquivar las siguientes comprobaciones hasta el final de la estructura de comprobaciones. Si ninguna comprobacin devuelve valor TRUE, el else ser ejecutado, y de no haber ninguno declarado, simplemente no sucede nada.

Pag 100

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

Entonces un bloque else if puede ser usado con o sin else al final. La cantidad de declaraciones else if, y sus ramificaciones son ilimitadas. if (pinCincoInput < 500) { // ejecutar A } else if (pinCincoInput >= 1000) { // ejecutar B } else { // ejecutar C } Otra forma de expresar ramificaciones (branching en ingls), y realizar comprobaciones mutuamente exclusivas, es con la declaracin switch case, la cual resulta ms idnea en algunos casos. 1.1.3 Declaracin FOR Descripcin La declaracin for es usada para repetir un bloque encerrado entre llaves. Un incremento de un contador es usado, normalmente, para aumentar y terminar con el bucle. La estructura for es muy til para la mayora de las operaciones repetitivas, y habitualmente se usa para operaciones con vectores, para operar sobre conjuntos de datos/pines El bucle for tiene tres partes o argumentos en su inicializacin: for (initialization; condition; increment) { //funcin(es); }

Pag 101

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

La initialization, o inicializacin, se produce slo la primera vez. Cada vez que se va a repetir el bucle, se revisa la condition, o condicin: si es cierta, el bloque de funciones (y el incremento del contador) se ejecutan, y la condicin vuelve a ser comprobada de nuevo. Si la condicin es falsa, el bucle termina. Ejemplo // Variar la intensidad de un LED usando un salida PWM int PWMpin = 10; // En el pin 10 hay un LED en serie con una resistencia de 470 ohmios void setup() { // no es necesario nada aqu } void loop() { for (int i=0; i <= 255; i++){ analogWrite(PWMpin, i); delay(10); } } C ons ejos de pr ogr amacin El bucle for, en C, es mucho ms flexible que otros bucles for en otros lenguajes, incluyendo BASIC. Cualquiera (o todos) los parmetros pueden ser omitidos, sin embargo los puntos y coma (;) son obligatorios. Tambin las inicializacin, condicin e incremento pueden ser cualquier declaracin en C vlida, con variables independientes, y podemos usar cualquier tipo de variable, includos los float. Estos tipos de declaracin for poco usuales pueden proporcionar una solucin vlida a algunos problemas de programacin raros. Por ejemplo, usando la multiplicacin en el parmetro de incremento, podemos generar una progresin logartmica. for(int x = 2; x < 100; x = x * 1.5){ println(x); } Este cdigo generar: 2,3,4,6,9,13,19,28,42,63,94 Otro ejemplo es hacer apagarse/encenderse un LED poco a poco, Another example, fade an LED up and down with one for loop: void loop() { int x = 1;

Pag 102

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

for (int i = 0; i > -1; i = i + x){ analogWrite(PWMpin, i); if (i = 255) x = -1; delay(10); } } 1.1.4 Sentencia switch / case Como las sentencias if, switch...case controla el flujo de programas permitiendo a los programadores especificar diferentes cdigos que deberan ser ejecutados en funcin de varias condiciones. En particular, una sentencia switch compara el valor de una variable con el valor especificado en las sentencias case. Cuando se encuentra una sentencia case cuyo valor coincide con dicha variable, el cdigo de esa sentencia se ejecuta. La palabra clave break sale de la sentencia switch, y es usada tpicamente al final de cada case. Si una sentencia break, la sentencia switch continuara ejecutando las siguientes expresiones ("falling-through") hasta encontrar un break, o hasta llegar al final de la sentencia switch. Ejemplo switch (var) { case 1: //hacer algo cuando sea igual a 1 break; case 2: //hacer algo cuando sea igual a 2 break; default: // si nada coincide, ejecuta el "default" // el "default" es opcional } Sintaxis switch (var) { case etiqueta: // sentencias break; case etiqueta: // sentencias // cambia de signo para apagarlo

Pag 103

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

break; default: // sentencias } Parmetros var: la variable cuyo valor comparas con los varios "case" etiqueta: un valor para comparar con la variable Ver tambin: if...else 1.1.5 Bucles while Descripcin Los bucles while se ejecutan continuamente, hasta que la expresin de dentro del parntesis, (), pasa a ser falsa. Algo debe modificar la variable comprobada, el bucle while nunca terminar. Lo que modifique la variable puede estar en el cdigo, como una variable que se incrementa, o ser una condicin externa, como el valor que da un sensor. Sintax is while(expresion){ // sentencia(s) } Parmetros expresion - una sentencia C (booleana) que da como valor verdadero (true) o falso (false) Ejemplo var = 0; while(var < 200){ // haz algo repetitivo 200 veces var++; }

Pag 104

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

1.1.6

do - while

El bucle "'do'" trabaja de la misma manera que el bucle "'while'", con la excepcion de que la condicin se comprueba al final del bucle, por lo que este bucle se ejecuta "siempre" al menos una vez. do { // bloque de instrucciones } while (condicin); Ejemplo: do { delay(50); // espera a que los sensores se estabilicen x = readSensors(); // comprueba los sensores } while (x < 100); 1.1.7 break //si se cumple la condicin se repite el bucle

break es usado para salir de los bucles do, for, o while, pasando por alto la condicin normal del bucle. Es usado tambin para salir de una estructura de control switch. Ejemplo for (x = 0; x < 255; x ++) { digitalWrite(PWMpin, x); sens = analogRead(sensorPin); if (sens > threshold){ x = 0; break; } delay(50); } // sale del bucle for. // bail out on sensor detect

Pag 105

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

1.1.8

continue

La sentencia continue omite el resto de iteracciones de un bucle ( do, for, o while). Contina saltando a la condicin de bucle y procediendo con la siguiente iteraccin. Ejemplo for (x = 0; x < 255; x ++) { if (x > 40 && x < 120){ continue; } digitalWrite(PWMpin, x); delay(50); } 1.1.9 return Termina una funcin y devuelve un valor a la funcin que la llama. Puede no devolver nada. Sintax is return; return valor; // ambas formas son correctas Parmetros valor: cualquier variable o tipo constante Ejemplos Una funcin que compara la entrada de un sensor a un umbral int comprobarSensor(){ if (analogRead(0) > 400) { return 1; else{ return 0; } } La palabra clave return es til para depurar una seccin de cdigo sin tener que comentar una gran cantidad de lneas de cdigo posiblemente incorrecto. // crea un salto en estos valores

Pag 106

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

void loop(){ // cdigo magnfico a comprobar aqu return; // el resto del programa del que se desconfa // que nunca ser ejecutado por estar detrs de return } SINTAXIS ; punto y coma Utilizado para terminar una declaracin. Ejemplo int a = 13; 1.1.10 {} Llaves Las Llaves son un parte importante del lenguaje de programacin C. Se utilizan en diferentes construcciones (ver ejemplos al final), esto a veces puede ser confuso para los principiantes. Una llave de apertura "{" siempre debe ir seguida de una llave de cierre "}". Esta es una condicin a la que se suele referir como llaves emparejadas. El IDE (Entorno Integrado de Desarrollo) Arduino incluye una caracterstica para comprobar si las llaves estn emparejadas. Slo tienes que seleccionar una Llave o incluso hacer click en el punto de insercin que sigue inmediatamente a una llave, y su compaera lgica ser seleccionada. En la actualidad esta caracterstica tiene un pequeo fallo, el IDE encuentra a menudo (incorrectamente), llaves en el texto que pueden estar situadas dentro de comentarios. Los programadores principiantes y los programadores que llegan a C desde el lenguaje BASIC a menudo encuentran dificultades o grandes confusiones usando llaves. Despus de todo, las llaves reemplazan el RETURN en una subrutina (funcin), el ENDIF en un condicional y el NEXT en un loop FOR. Dado que el uso de las llaves es tan variado, es una buena prctica de programacin escribir la llave de cierre inmediatamente despus de escribir la llave de apertura, cuando se inserta una construccin que requiere llaves. Despus insertar algunos saltos de lnea (lneas en blanco) entre las llaves y comenzar a insertar sentencias. De esta forma tus llaves y su posicin, nunca llegarn a estar desemparejadas. Llaves desemparejadas a menudo pueden conducir a errores de compilacin misteriosos y difciles de comprender, que pueden ser complicados de rastrear en un programa largo. Debido a sus variados usos, las llaves tambin son increblemente importantes para la sintaxis de un programa, el movimiento de una llave una o dos lneas, a menudo afecta de manera dramtica el significado de un programa.

Pag 107

MICROCONTROLADOR ATMEL U s os pr in cipales de las L lav es Funciones void myfunction(tipodato argumento){ sentencia(s) } Loops while (expresin booleana) { sentencia(s) } do { sentencia(s) } while (expresin booleana); for (inicializacin; condicin final; expresin incremento) { sentencia(s) } Sentencias Condicionales if (expresin booleana) { sentencia(s) } else if (expresin booleana) { sentencia(s) } else { sentencia(s) }

Pag 108

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

1.1.11

Comentarios

Los comentarios son lneas en el programa para aclarar a t o a otros sobre el funcionamiento del programa. Estas lneas son ignoradas por el compilador y no se exportan al procesador. No ocupan por tanto espacio en el Chip Atmega El nico propsito de los comentarios es que entiendas o entiendan (o recuerdes) cual es el funcionamiento de tu programa. Existen dos maneras distintas de marcar una lnea como comentario: Ejemplo x = 5; // Esto es una lnea simple de comentario. Todo lo que va despus de la doble barra es un comentario // Hasta el final de la lnea /* Esto es un comentario multilnea - salo para comentar bloques enteros de cdigo if (gwb == 0){ // Una lne de comentario sencilla puede usarse dentro de un comentario multilnea x = 3; } // No olvides cerrar el comentario multilnea */ Consejo Cuando ests experimentando con cdigo, "comentar" partes del programa es una til de eliminar lneas que puedan contener errores. As dejamos las lneas en el cdigo, pero como comentario, as que sern ignoradas por el compilador. Es especialmente til cuando estamos intentando localizar el problema, o cuando el compilador rechaza el programa. 1.2 1.2.1 Operadores Ar itmticos = operador de asignacin (un solo smbolo de "igual") /* pero no otro comentario multilnea- esto no es vlido */

Guarda el valor en la derecha del smbolo "=" dentro de la variable a la izquierda del smbolo "=". El signo de igualdad "=" en el lenguaje de programacin C se llama el operador de asignacin. Tiene un significado diferente que en la clase de lgebra en el que se indica una ecuacin o igualdad. El operador de asignacin le dice al microcontrolador que evale cualquier valor o expresin en el lado derecho del signo igual, y lo almacene en la variable a la izquierda del signo igual.

Pag 109

MICROCONTROLADOR ATMEL Ejemplo int sensVal; // declara una variable int llamada sensVal senVal = analogRead(0); // guarda el valor (digitalizado) del voltaje de entrada del pin analgico 0 en SensVal Sugerencias de programacin La variable en el lado izquierdo del operador de asignacin (signo "=") tiene que ser capaz de mantener el valor almacenado en ella. Si no es suficientemente grande para contenerlo, el valor almacenado en la variable ser incorrecto. No confunda el operador de asignacin [=] (un solo signo igual) con el operador de comparacin [==] (un signo igual doble), que evala si dos expresiones son iguales. Ver tambin if (operadores de comparacin) char int long 1.2.2 Suma, Resta, Multiplicacin y Divisin

Descripcin Estos operadores devuelven la suma, diferencia, producto o cociente (respectivamente) de los dos operandos. La operacin se lleva a cabo utilizando el tipo de datos de los operandos, por lo que, por ejemplo, 9 / 4 resulta 2 desde 9 y 4 que son enteros int. Esto tambin significa que la operacin puede desbordarse si el resultado es mayor que el que se puede almacenar en el tipo de datos (por ejemplo, la suma de 1 a un int con el valor de 32.767 resulta -32.768). Si los operandos son de tipos diferentes, se utiliza el tipo del "ms grande" para el clculo. Si uno de los nmeros (operandos) es del tipo float o del tipo double, se usar coma flotante para el clculo. Ejemplos y = y + 3; x = x - 7; i = j * 6; r = r / 5; Sintax is result = value1 + value2; result = value1 - value2; result = value1 * value2;

Pag 110

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

result = value1 / value2; Parmetros: value1: cualquier variable o constante value2: cualquier variable o constante Sugerencias de programacin: Debes saber que las integer constants por defecto son int, as que algunos clculos con constantes pueden provocar desbordamiento (p.e. 60 * 1000 devolver un resultado negativo) Elige los tamaos de variable que sean suficientemente grandes como para alojar el resultado de tus calculos. Debes saber en que punto tu variable se desbordar en su mximo, y que esto tambin ocurre en su mnimo. p.e. (0 - 1) o tambin (0 - - 32768) Para clculos matemticos que requieren fracciones, usa variables float, pero ten en cuenta los inconvenientes: gran tamao, velocidades bajas de clculo Usa el operador de conversin (casting). Por ejemplo: (int)myFloat para convertir el tipo de una variable en el momento. 1.2.3 EL % (mdulo) Descricin Calcula el resto de la divisin entre dos enteros. Es til para mantener una variable dentro de un rango particular (por ejemplo el tamao de un array) Sintax is resultado = dividendo % divisor Parametros Dividendo: el nmero que se va a dividir Divisor: el nmero por el que se va a dividir Devuelve el resto de la divisin Ejemplo x = 7 % 5; x = 9 % 5; x = 5 % 5; x = 4 % 5; // x ahora contiene 2 // x ahora contiene 4 // x ahora contiene 0 // x ahora contiene 4

Cdigo de ejemplo /* actualiza un valor en el array cada vez que se pasa por el bucle */ int valores[10];

Pag 111

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

int i = 0; void setup() {} void loop() { valores[i] = analogRead(0); i = (i + 1) % 10; } Nota El operador modulo no funciona con datos en coma flotante (float) Vase tambin divisin 1.3 Oper ador es C o mpar at iv os 1.3.1 if (condicional) y ==, !=, <, > (operadores de comparacin) if, el cual puede ser usado en conjunto con uno o ms operadores de comparacin, comprueba si cierta condicin se cumple, por ejemplo, si un input posee un valor mayor a cierto nmero. El formato para una comprobacin if es el siguiente: if (algunaVariable > 50) { // hacer algo aqu. } Este programa comprueba si la variable algunaVariable es mayor a 50. Si lo es, el programa toma una accin particular. Dicho de otra forma, si la declaracin escrita dentro de los parntesis es verdadera (true), el cdigo dentro de las llaves se ejecutar. Sino, el programa ignora dicho cdigo. Las llaves pueden ser omitidas luego de una declaracin if. De hacer esto, la siguiente lnea (definida por el punto y coma) ser la nica afectada por la condicin. if (x > 120) digitalWrite(LEDpin, HIGH); if (x > 120) digitalWrite(LEDpin, HIGH); if (x > 120){ digitalWrite(LEDpin, HIGH); } if (x > 120){ digitalWrite(LEDpin1, HIGH); digitalWrite(LEDpin2, HIGH); } // el operador mdulo prevalece sobre la variable

Pag 112

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

// todos los ejemplos son correctos. Las declaraciones a evaluar dentro de los parntesis, requieren el uso de uno o ms operadores: Operadores de Comparacin: x == y (x es igual a y) x != y (x no es igual a y) x < y (x es menor a y) x > y (x es mayor a y) x <= y (x es menor o igual a y) x >= y (x es mayor o igual a y) Atencin: Ten cuidado de no usar un signo de igual solo (ej. if (x = 10) ). Un signo de igual solo es el operador que indica la asignacin de un valor, y va a asignar 10 a x. En su lugar usa el signo de igual doble (ej. if (x == 10) ), el cual es el operador de comparacin, y compryeba si x equivale a 10 o no. El ltimo ejemplo slo da true si x equivale a 10, pero el ejemplo anterior (con un slo smbolo =) dar siempre TRUE. Esto es porque C evala la declaracin if (x=10) de la siguiente manera: 10 es asignado a x (Recuerda que un signo = solo, es el operador de asignacin), por lo tanto x ahora contiene 10. Entonces el condicional if evala 10, el cual siempre resulta TRUE, debido a que cualquier valor numrico mayor a 0 es evaluado como TRUE. Consecuentemente, if (x = 10) siempre ser evaluado como TRUE, lo cual no es el resultado deseado cuando se usa una declaracin if. Adicionalmente, la variable x ser definida en 10, lo que tampoco es una accin deseada. if tambin puede ser parte de una estructura de control de ramificacin usando la construccin if...else. 1.4 O pe r ador e s B o ole an os 1.4.1 Operadores Booleanos. Se pueden usar dentro de operaciones condicionales o en una sentencia if. 1.4.1.1 && (AND lgico) Verdadero slo si ambos operadores son Verdadero, por ejemplo: if (digitalRead(2) == HIGH && digitalRead(3) == HIGH) { // lee dos pulsadores // ... } Es Verdadero slo si ambas entradas ests activadas, es decir, en estado HIGH. 1.4.1.2 || (OR lgico) Verdadero si alguno de los dos operadores es Verdadero, por ejemplo:

Pag 113

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

if (x > 0 || y > 0) { // ... } Es Verdadero si alguno de los valores x y es mayor que 0. 1.4.1.3 ! (NOT) if (!x) { // ... } Es Verdadero si el valor de x es Falso (p. e. si x es igual a 0). Atencin. Asegrate de no confundir el operador AND booleano && (doble signo &) con el operador AND para bits & (un solo signo &). De la misma manera no hay que confundir el operador OR booleano || (doble barra vertical) con el operador OR para bits | (una sola barra vertical). El operador NOT de bits ~ (tilde) tiene una apariencia muy diferente del operador NOT booleano! (exclamacin o "bang", como lo llaman algunos programadores), pero debes asegurarte de usar cada uno de ellos dentro del contexto adecuado. Ejemplos. if (a >= 10 && a <= 20){} 20 Ver tambin: & (operador de bits AND) | (operador de bits OR) ~ (operador de bits NOT) if 1.4.1.4 Operadores bit a bit: AND (&), OR (|) y XOR (^) // Verdadero slo si el valor de a est entre 10 y Verdadero si el operador es Falso, por ejempo:

Los operadores bit a bit realizan sus clculos a nivel de los bits de las variables. Ayudan a resolver muchos de los problemas ms comunes a nivel de programacin. La mayora del material que sigue est sacado de un excelente tutorial de matemtica lgica, que puede ser encontrado aqu. De s c r ipc in y s in t ax is A continuacin se muestras las descripciones y la sintaxis de estos operadores lgicos. Puedes encontrar ms informacin sobre ellos en el tutorial enlazado sobre estas lneas.

Pag 114

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

1.4.1.5

O p e r a d o r b i t a b i t A N D (& )

te operador, en C++, es un ampersand (&) simple, usado entre dos expresiones enteras. Opera en cada posicin de bit en ambas expresiones de forma independiente, de acuerdo a esta regla: si ambas posiciones de entrada son un 1, el resultado devuelto es un 1; en otro caso, ser un 0. Por ejemplo: 0 0 1 1 0 1 0 1 ---------0 0 0 1 (operando1 & operando2) - resultado devuelto operando1 operando2

En Arduino, el tipo entero (int) ocupa 16bits, pero usando & entre dos expresiones tipo int, causa 16 operaciones AND simultneas. En el siguiente cdigo: int a = 92; int b = 101; // en binario: 0000000001011100 // en binario: 0000000001100101 0000000001000100, 68 en decimal.

int c = a & b; // resultado:

Cada uno de los 16bits de las palabras a y b son procesados usando el operador bit a bit AND y se guarda el resultado en la palabra c. Uno de los usos ms comunes de este operador es seleccionar un determinado (o determinados) bits dentro de un valor entero, tambin llamado enmascaramiento (masking). Ms abajo se incluye un ejemplo. 1 . 4 . 1 . 6 O p e r a d o r b i t a b i t O R (| ) Este operador, en C++, se simboliza como una barra vertical, |. Como el operador AND, este operador trabaja de forma de forma independiente cada pareja de bits. Sin embargo, lo que hace (lgicamente) es diferente: el operador OR devuelve un 1, si alguno (o los dos bits) es un 1; mientras que slo devuelve un 0 si ambos bits lo son. En otras palabras: 0 0 1 1 0 1 0 1 ---------0 1 1 1 (operando1 | operando2) - valor devuelto operando1 operando2

A continuacin un ejemplo de uso de este operador: int a = 92; int b = 101; // en binario: 0000000001011100 // en binario: 0000000001100101 0000000001111101, 125 en decimal.

int c = a | b; // resultado:

Pag 115

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

Programa de ejemplo Un trabajo comn de los operadores vistos hasta ahora es leer-modificar-escribir en un puerto. En los microcontroladores, un puerto es un nmero de 8bits que representa la condicin (estado) de cada pin. Escribir en un puerto controla todos los pines de ese puerto a la vez. PORTD es una constante definida para referirse a los estados de salida de los pines digitales 0, 1, 2, 3, 4, 5, 6 y 7. Si hay un 1 en una determinada posicin, ese pin se encuentra a nivel alto (HIGH). (Los pines necesitan estar declarados como salida usando la instruccin pinMode). Entonces, si escribimos PORTD = B00010100;, pondremos los pines 2 y 4 a nivel alto. Un ligero problema es que, al asignarle un valor al puerto directamente, se puede modificar el valor de otro pin, por ejemplo, el valor del bit 0 y 1 del puerto D, usados por el Arduino en comunicaciones serie, por lo que podramos estar interfiriendo en esa comunicacin. Explicado esto, el algoritmo del programa de ejemplo es: Leer el valor actual del puerto y borrar slo los bits correspondientes con los pines que queremos controlar (operador AND). Combinar el valor modificado del puerto con el valor real del puerto, para que se reflejen los cambios en los bits que controlamos (operador OR). int i; int j; void setup(){ DDRD = DDRD | B11111100; // configura los bits (pines) a 1 como salida, sin
tocar el 0 y el 1

// variable de contador

// es lo mismo que hacer pinMode(pin, OUTPUT), pero de una sola vez. Serial.begin(9600); } void loop(){ for (i=0; i<64; i++){ PORTD = PORTD & B00000011; // borra todos los bits excepto los dos
primeros, 0 y 1.

j = (i << 2);
derecha,

// desplaza dos posiciones la variable, introduciendo 0 por la // para no interferir con el valor de esos pines

PORTD = PORTD | j;
pines del LED

// combina la informacin del puerto con la nueva para los

Serial.println(PORTD, BIN); // sirve para comprobar la mscara delay(100); }

Pag 116

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

} 1.4.1.7 O p e r a d o r b i t a b i t X O R (^ ) Este es un operador poco usado en C++, llamado o-exlcusiva (X-OR). Este operador es escrito usando el caracter ^. Es similar al operador or (|), pero slo devuelve un 1 cuando los bits son diferentes; devolviendo 0 en el resto de los casos. Por ejemplo: 0 0 1 1 0 1 0 1 ---------0 1 1 0 int x = 12; int y = 10; (operando1 ^ operando2) - valor devuelto // binario: 1100 // binario: 1010 A continuacin un pequeo cdigo de ejemplo: operando1 operando2

int z = x ^ y; // binario: 0110, 6 en decimal Este operador se suele usar para invertir (cambiar 0s a 1, o viceversa, tambin llamado toggle), algunos (o todos) bits de una expresin. Siempre que una posicin de la mscara est a 1, esa posicin ser invertida en la palabra de entrada. Si hay un 0 en la mscara, esa posicin no se ver afectada. A continuacin un ejemplo para hacer parpadear un LED en la salida digital 5. // Blink_Pin_5 // ejemplo de OR exclusiva void setup(){ DDRD = DDRD | B00100000; // pin 5 configurado como salida, pinMode(5, OUTPUT); Serial.begin(9600); } void loop(){ PORTD = PORTD ^ B00100000; // invierte el bit 5 (pin digital 5) y los no modifica el resto delay(100); } Ver tambin &&(AND booleana) ||(OR booleana)

Pag 117

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

1.4.1.8

Operador NOT (~) a nivel de bits

El operador bit a bit NOT, en C++, es el caracter ~. A diferencia de los operadores AND (&) y OR (|), el operador NOT es aplicado nicamente a un operando. Este operador lo que hace es cambiar cada bit de la palabra por su contrario: los 0 pasan a ser 1, y viceversa. Por ejemplo: 0 1 1 0 operando1 ~ operando1 // en binario: 0000000001100111 // en binario: 1111111110011000 = -104 ----------

int a = 103; int b = ~a;

Posiblemente te sorprendas de ver que el resultado da un valor negativo. Esto es debido a que el bit ms significativo (msb) es llamado, tambin, bit de signo. Si este bit es un 0, el valor del nmero ser interpretado como positivo, mientras que si es 1, se interpretar como un negativo. Esta codificacin para los nmeros positivos y negativos se denomina "'Complemento a 2'" (Ca2). Para ms informacin, lee el artculo correspondiente en la Wikipedia en complemento a dos. Como anotacin, es interesante saber que para cualquier entero X, ~X es lo mismo que X-1 A veces, el bit de signo en un entero con signo (signed int) puede causar algunos problemas imprevistos. 1.5 Operadores de Composicin 1.5.1 ++ (incremento) / -- (disminucin) Descripcin Incrementa o disminuye una variable Sintax is x++; // incrementa x en uno y regresa el valor anterior de x ++x; // incrementa x en uno y regresa el nuevo valor de x x-- ; --x ; // disminuye x en uno y y regresa el valor anterior de x // disminuye n uno y regresa el nuevo valor de x

Parmetros x: un entero o long (puede aceptar sin signo)

Pag 118

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

Devuelve El valor original o el resultante del incremento o disminucin de la variable. Ejemplos x = 2; y = ++x; y = x--; // x ahora guarda 3, y guarda 3 // x guarda 2 de nuevo, y sigue guardando 3

1.5.2 += , -= , *= , /= (Composicion Suma) Descripcin Realiza una operacin matemtica con una variable con respecto a otra variable o una constante. El operador += (y los dems operadores) son una forma simplificada de la sintaxis completa, tal y como se muestra ms abajo. Sintax is x += y; x -= y; x *= y; x /= y; // equivalente a la expresin x = x + y; // equivalente a la expresin x = x - y; // equivalente a la expresin x = x * y; // equivalente a la expresin x = x / y;

Parmetros x: cualquier tipo de variable y: cualquier tipo de variable o constante Ejemplos x = 2; x += 4; x -= 3; x *= 10; x /= 2; // x ahora es 6 // x ahora es 3 // x ahora es 30 // x ahora es 15

Pag 119

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

CAPITULO II Variables C ons t an t es HIGH | LOW INPUT | OUTPUT true | false Constantes Numricas Tipos de Datos boolean (booleano) char (carcter) byte int (entero) unsigned int (entero sin signo) long (entero 32b) unsigned long (entero 32b sin signo) float (en coma flotante) double (en coma flotante de 32b) string (cadena de caracteres) array (cadena) void (vaco) Conversin char() byte() int() long() float()

Pag 120

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

2.0

Variables 2.1 Constantes Las constantes variables que vienen predefinidas en el lenguaje de Arduino. Se usan para facilitar la lectura de los programas. Clasificamos las constantes en grupos. Las que definen niveles lgicos, verdadero (true) y falso (false) (Constantes Booleanas) Existen dos constantes para representar si algo es cierto o falso en Arduino: true, y false. 2.1.1 2.1.2 false true false es el ms sencillo de definir. false se define como 0 (cero). true se define la mayora de las veces como 1, lo cual es cierto, pero tiene una definicin ms amplia. Cualquier entero que es no-cero es TRUE, en un sentido Booleano. As, en un sentido Booleano, -1, 2 y -200 son todos true. Ten en cuenta que las constantes true y false se escriben en minsculas, al contrario que HIGH, LOW, INPUT, y OUTPUT. Las que definen el nivel de los pines, nivel alto (HIGH) y nivel bajo (LOW) Cuando leemos o escribimos en un pin digital, existen slo dos valores que podemos obtener o asignar: HIGH y LOW. 2.1.3 HIGH El significado de HIGH (en referencia a un pin) depende de si el pin est configurado como entrada (INPUT) o como salida (OUTPUT). Cuando un pin se configura como entrada (INPUT) usando pinMode, y se lee con digitalRead, el microcontrolador nos retornar HIGH si en el pin hay 3 voltios o ms. Un pin puede ser configurado como entrada (INPUT) usando pinMode, y despus establecerlo a HIGH con digitalWrite, esto conectar el pin a 5 Voltios a travs de una resistencia interna de 20K, resistencia pull-up , la cual establecer el pin al estado de lectura HIGH a menos que la conectemos a una seal LOW a travs de un circuito externo. Cuando un pin se configura como salida (OUTPUT) con pinMode, y se establece a HIGH con digitalWrite, el pin tiene 5V. Ene ste estado puede usarse como fuente de corriente, e.j. Luz y LED que se conectan a travs de resistencias en serie a masa (tierra), o a otro pin configurado como salida y establecido a LOW. 2.1.4 LOW El significado de LOW difiere tambin segn est configurado como entrada (INPUT) o como salida (OUTPUT). Cuando un pin est configurado como entrada (INPUT) con pinMode, y se lee con digitalRead, el microcontrolador retornar LOW si el voltaje presente en el pin es de 2V o menor.

Pag 121

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

Cuando un pin es configurado como salida (OUTPUT) con pinMode,y establecido LOW con digitalWrite, el pin tiene 0 voltios. En este estado puede meter corriente, e.j. Luz y LED que se conectan a travs de resistencias en serie a +5 voltios, o a otro pin configurado como salida, y establecido a HIGH. Las que definen los pines digitales, INPUT y OUTPUT Los pines digitales pueden se usados como entrada (INPUT) o como salida (OUTPUT). Cambiando un pin de INPUT a OUTPUT con pinMode() el comportamiento elctrico del pin cambia drsticamente. Pins configurados como entradas Los pins de Arduino (Atmega) configurados como INPUT con pinMode() se dice que se encuentran en un estado de alta impedancia. Una forma de explicar esto es que un pin configurado como entrada se le aplica una muy baja demanda, es decir una resistencia en serie de 100 Megohms. Esto lo hace muy til para leer un sensor, pero no para alimentar un LED. Pins configurados como salidas Los pins configurados como salida (OUTPUT) con pinMode() se dice que estan en estado de baja impedancia. Esto implica que pueden proporcionar una sustancial cantidad de corriente a otros circuitos. Los pins de Atmega pueden alimentar (proveer de corriente positiva) or meter (proveer de masa) hasta 40 mA (miliamperios) de corriente a otros dispositivos/circuitos. Esto o hace muy til para alimentar LED's pero inservible para leer sensores. Los pins configurados como salida pueden deteriorarse o romperse si ocurre un cortocircuito hacia los 5V o 0V. La cantidad de corriente que puede proveer un pin del Atmega no es suficiente para la mayora de los rels o motores, y es necesario aadir circuitera extra. Ver pinMode() Integer Constants boolean variables
NOTA: pinMode() Descripcin Configura el pin especificado para comportarse como una entrada o una salida. Mira la descripcin de See the description of pines digitales para ms informacin. Sint axis pinMode(pin, modo) Parametros pin: el numero del pin que se desea configurar modo: INPUT (Entrada) o OUTPUT (Salida) Devuelve Nada

Pag 122

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

Ejemplo int ledPin = 13; void setup() { pinMode(ledPin, OUTPUT); } void loop() { digitalWrite(ledPin, HIGH); delay(1000); delay(1000); } digitalWrite(ledPin, LOW); // Enciende el LED // Apaga el LED // espera un segundo // Espera un segundo //configura el pin del LED como salida // LED conectado al pin digital 13

Pag 123

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

2.1.5 Integer Constants Integer Constants son nmeros utilizados directamente en un sketch, como 123. Por defecto, stos nmeros son tratados como int, pero puedes cambiarlo con las letras U y L (ver abajo). Normalmente, las constantes integer son tratadas como enteros base 10 (decimales), pero se puede utilizar notacin especial (formateadores) para ingresar nmeros en otras bases.
Base 10 (decimal) 2 (binario) Ejemplo 123 B1111011 Formateador Ninguno. Antecede "B" Slo funciona con valores de 8 bits (0 to 255). Caracteres 0-1 vlidos. 8 (octal) 16 (hexadecimal) 0173 0x7B Antecede "0" Antecede "0x" Caracteres 0-7 vlidos. Caracteres 0-9, A-F, a-f vlidos. Comentario

Decimal es base 10. Esta es la matemtica de sentido comn con que se conocen. Para constantes sin otros prefijos, se asume el formato decimal. Ejemplo: 101 // igual a 101 decimal ((1 * 10^2) + (0 * 10^1) + 1)

Binary es base dos. Slo caracteres 0 y 1 son vlidos. Ejemplo: B101 // igual a 5 decimal ((1 * 2^2) + (0 * 2^1) + 1) El formateador binario slo funciona en bytes (8 bits) entre 0 (B0) y 255 (B11111111). Si resulta conveniente ingresar un entero ( int, 16 bits) de forma binaria, puedes hacer un procedimiento de dos pasos, como a continuacin: valorInt = (B11001100 * 256) + B10101010; // B11001100 es el ''byte'' alto. Octal es base ocho. Slo caracteres de 0 hasta 7 son vlidos. Los valores Octales son indicados por el prefijo "0" Ejemplo: 0101 Atencin Es posible generar un bug o error difcil de encontrar al inclur (de forma involuntaria) un cero antecediento una constante, logrando as que el compilador interprete tu constante como octal. Hexadecimal ( hex) es base diecisis. Los caracteres vlidos son del 0 al 9, y las letras desde la A hasta la F; A tiene el valor de 10, B es 11, C es 12, D es // igual a 65 decimal ((1 * 8^2) + (0 * 8^1) + 1)

Pag 124

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

13, E es 14, y la F, como ya habrs adivinado, es 15. Los valores hexadecimales se indican con el prefijo "0x". Nota que los valores de la A a la F, pueden ser escritos en mayscula o minscula. Ejemplo: 0x101 // igual a 257 decimal ((1 * 16^2) + (0 * 16^1) + 1)

Formateadors U & L Por defecto, una constante en enteros es tratada como int con las limitaciones concomitantes en los valores. Para especificar una constante en enteros con otro tipo de datos, continala con: una 'u' 'U' para forzar la constante a un formato de datos unsigned. Ejemplo: 33u una 'l' 'L' para forzar la constante a un formato de datos long. Ejemplo: 100000L un 'ul' 'UL' para forzar la constante a un formato de datos unsigned long. Ejemplo: 32767ul
Ver Tambin constants #define byte int unsigned int long unsigned long

Pag 125

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

2.2

Tipos de Datos 2.2.1 booleanos Un booleano slo puede tomar dos valores, Verdadero o Falso. Cada booleano ocupa un nico byte en la memoria. Ejemplo: int LEDpin = 5; int switchPin = 13;
Falso (false)

// LED en el pin 5 // pulsador en el pin 13, su otra patilla conectada en GND

boolean running = false; // crea la variable booleana running y le asisga el valor void setup() { pinMode(LEDpin, OUTPUT); pinMode(switchPin, INPUT); digitalWrite(switchPin, HIGH);
13

// conecta la resistencia pull-up interna del pin

} void loop() { if (digitalRead(switchPin) == LOW) { // si el pulsador es accionado la pull-up mantiene el pin en estado HIGH delay(100); pulsador running = !running; running digitalWrite(LEDpin, running) } } 2.2.2 char Descripcin Es un tipo de dato que ocupa un byte de memoria y almacena un valor de carcter. Los carcteres literales se escriben con comillas simples: 'A' (para varios carcteres -strings- utiliza dobles comillas "ABC"). De todas maneras los carcteres son almacenados como nmeros. Puedes ver su codificado en la tabla ASCII. Con esto podemos entender que es posible realizar clculos aritmticos con los carcteres, en este caso se utiliza el valor ASCII del carcter (por ejemplo 'A' + 1 tiene el valor de 66, ya que el valor // retardo para impedir un rebote en el // invierte el valor de la variable // enciende el LED

Pag 126

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

ASCII de la letra mayscula A es 65). Mira Serial.println para tener mas informacin de como son traducidos a nmeros los carcteres. El tipo de datos char tiene signo. esto significa que codifica nmeros desde 128 hasta 127. Para un dato de un byte (8bits), utiliza el tipo de dato "byte". Ejemplo char miChar = 'A'; char miChar = 65; 2.2.3 byte Descripcin Un byte almacena un nmero sin signo de 8-bit, desde 0 hasta 255. Ejemplo byte b = B10010; // "B" es el formateador binario (B10010 = 18 decimal) 2.2.4 word Descripcin Una variable tipo word almacena un valor de 16bits sin signo, desde 0 hasta 65535. Es lo mismo que una tipo unsigned int. Ejemplo word w = 10000; 2.2.5 unsigned int Descripcin Los enteros sin firma (unsigned int) son los mismos enteros de modo que almacenan un valor de dos bytes. En lugar de almacenar nmeros negativos, slo almacenan valores positivos, generando un rango til desde 0 a 65,535 (2^16 - 1). La diferencia entre los enteros sin firma y los enteros (firmados), reside en que el bit ms alto, a veces referenciado como el bit "firmado", es interpretado. En el tipo de dato int de Arduino (que es firmado), si el bit ms alto es "1", el nmero es interpretado como un nmero negativo, y los otros 15 bits son interpretados con complemento a 2. Ejemplo unsigned int ledPin = 13; Sintx is unsigned int var = val; var - el nombre de tu variable unsigned int val - el valor que asignas a a esa variable // los dos son equivalentes

Pag 127

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

Consejo de codificacin Cuando las variables sobrepasan su capacidad mxima dan la vuelta a su mnima capacidad. Ten en cuenta que esto sucede en ambas direcciones. unsigned int x x = 0; x = x - 1; x = x + 1; 2.2.6 Descripcin Las variables de tipo Long son variables de tamao extendido para almacenamiento de nmeros, y 32 bits (4 bytes), desde -2,147,483,648 hasta 2,147,483,647. Ejemplo long speedOfLight = 186000L; explicacin de la 'L' Sintax is long var = val; 2.2.7 unsigned long // ver Constantes Integer para la // x ahora contiene 65535 - da la vuelta en direccin negativa // x ahora contiene 0 - da la vuelta long

Descripcin Las variable long sin firmar (unsigned long) son variables extendidas para almacenar nmeros, y almacenar 32 bits (4 bytes). Por el contrario que las variables long estndar, las unsigned long no almacenan nmeros negativos, haciendo que su rango sea de 0 a 4,294,967,295 (2^32 - 1). Ejemplo unsigned long tiempo; void setup() { Serial.begin(9600); } void loop() { Serial.print("Tiempo: "); tiempo = millis(); //imprime el tiempo desde el inicio del programa Serial.println(tiempo);

Pag 128

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

// espera un segundo para no enviar cantidade masivas de datos delay(1000); } Sintx is unsigned long var = val; 2.2.8 float

Descripcion El tipo variable para los nmeros en coma flotante (nmero decimal). Estos nmeros son usados, habitualmente, para aproximar valores analgicos y continuos, debido a que ofrecen una mayor resolucin que los enteros. Las variables tipo float tienen el valor mximo 3.4028235E+38, y como mnimo pueden alcanzar el -3.4028235E+38. Ocupan 4bytes (32bits). Los floats tienen una precisin de 6 o 7 dgitos decimales. Esto significa el nmero total de dgitos, no el nmero a la derecha de la coma decimal. Al contrario que en otras plataformas, donde tu podras obtener mayor precisin usando una variable tipo double (por ejemplo, por encima de 15 dgitos), en Arduino los double tienen el mismo tamao que los float. Los nmeros en coma flotante no son exactos, y muchos proporcionan falsos resultados cuando son comparados. Por ejemplo, 6.0 / 3.0 puede no ser igual a 2.0. Debes comprobar que el valor absoluto de la diferencia entre los nmeros pertenezca a un rango pequeo. La matemtica en coma flotante es mucho ms lenta que la matemtica de enteros para realizar operaciones, por lo que deberas evitarla si, por ejemplo, un bucle tiene que ejecutarse a la mxima velocidad para funciones con temporizaciones precisas. Los programadores normalmente suelen asignar unas longitudes para convertir las operaciones de coma flotante en clculos con enteros, para aumentar la velocidad. Ejemplos float myfloat; float sensorCalbrate = 1.117; Sintax is float var = val; var - el nombre de la variable tipo float val - el valor que le asignas a esa variable Cdigo de ejemplo int x; int y; float z;

Pag 129

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

x = 1; y = x / 2; 2.2.9 double // y ahora contiene 0, la parte entera de la operacin z = (float)x / 2.0; // z ahora contiene 0.5 (se debe usar 2.0, en lugar de 2) Descripcion Nmero en coma flotante de doble precisin. Ocupa 4 bytes. La implementacin "double" en Arduino es exactamente lo mismo que la FLOAT, sin ganar nada de precisin. Consejo Los usuarios que porten cdigo de otras fuentes y que incluyan variable tipo double deberan examinar el cdigo para ver si la precisin necesaria es diferente a la que se puede lograr en Arduino. 2.2.10 string Descripcin Los strings se representan como arrays de caracteres (tipo char) que terminan con el caracter NULL. Ejemplos Todas las siguientes son declaraciones vlidas de strings. char Str1[15]; char Str2[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o'}; char Str3[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o', '\0'}; char Str4[ ] = "arduino"; char Str5[8] = "arduino"; char Str6[15] = "arduino"; Posibilidades de declaracin de strings Declarar un array de caracteres sin incializarlo como en Str1 Declarar un array de caracteres (con un caracter extra) y el compilador aadir el caracter NULL requerido, como en STR2 Explicitar el caracter NULL, Str3 Inicializar con un string constante entre comillas dobles; el compilador medir el tamao del array para ajustar el string constante y caracter NULL para finalizar, Str4 Inicializar el array con un tamao explcito y un string constante, Str5 Inicializar el array, dejando un espacio extra para un string ms largo, Str6

Pag 130

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

Terminacin NULL Generalmente, los strings se finalizan con un caracter NULL (cdigo ASCII 0). Esto permite a funciones (como Serial.print()) establecer dnde est el final del string. De otra forma, seguira leyendo los siguientes bytes de la memoria que no forman parte del string. Esto significa que tu string necesita tener espacio para un caracter ms del texto que quieres que contenga. Esto es por lo que Str2 y Str5 necesitan 8 caracteres, incluso aunque "arduino" tenga slo 7 - la ltima posicin es automticamante completada con un caracter NULL. Str4 ser automticamente dimensionada a 8 caracteres, uno para el NULL extra. En Str3, hemos incluido nosotros mismos el caracter NULL (escrito como '\0'). Ten en cuenta que es posible tener un string sin un caracter NULL al final (p.e. si t has especificado la longitud de Str2 como 7 en lugar de 8). Esto romper la mayora de funciones que usen strings, por lo que no deberas hacerlo intencionadamente. Por lo tanto, si detectas algn comportamiento extrao (operando con los caracteres, no con el string), este podra se el problema Comillas simples o dobles Los string siempre se definen entre comillas dobles ("Abc") y los caracteres siempre se definen dentro de comillas simples ('A'). Envolviendo string largos Puedes envolver strings largos de sta manera: char miString[] = "Esta es la primera linea" " esta es la segunda linea" " etcetera"; 2.2.11 Arrays de strings

A menudo es conveniente, al trabajar con grandes cantidades de texto, como proyectos con displays LCD, configurar un array de strings. Como los strings son en s mismo arrays, esto es un ejemplo real de un array bidimensional. En el cdigo de abajo, el asterisco despus del tipo de dato char "char*" indica que es un array de "punteros". Todos los nombres de arrays son punteros, por lo que esto es necesario para crear un array de aarys. Los punteros son una de las partes ms exotricas de C como para que los principieantes puedan llegar a entenderlas, pero no es necesario entender punteros en detalle para usarlos con efectividad. Ejemplo char* miStrings[]={"Este es el string 1", "Este es el string 2", "Este es el string 3", "Este es el string 4", "Este es el string 5","Este es el string 6"}; void setup(){ Serial.begin(9600);

Pag 131

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

} void loop(){ for (int i = 0; i < 6; i++){ Serial.println(miStrings[i]); delay(500); } } 2.2.12 Arrays Una matriz o "array" es una coleccin de variables que son accedidas mediante un nmero de ndice. Los "arrays" en el lenguaje de programacin C, en el cual est basado Arduino, pueden ser complicados, pero usar "arrays" simples es relativamente sencillo. C r e a n d o (D e c l a r a n d o ) u n a m a t r i z o A r r a y Todos los mtodos de abajo son formas vlidas de crear (declarar) una matriz. int myInts[6]; int myPins[] = {2, 4, 8, 3, 6}; int mySensVals[6] = {2, 4, -8, 3, 2}; char message[6] = "hola"; Puedes declarar una matriz sin inicializarla como en myInts. En myPins se declara una matriz sin establecer un tamao explcito. El compilador cuenta el nmero de elementos y crea la matriz con el tamao apropiado. Finalmente, puedes tanto declarar con un tamao la matriz e inicializarla al mismo tiempo, como en mySensVals Accediendo a una matriz o Array Los Arrays son zero indexed, esto significa que, al referirse a una matriz, el primer elemento de la matriz est en el indice 0. Por lo tanto: mySensVals[0] == 2, mySensVals[1] == 4, y sucesivos. Esto tambin significa que en una matriz con 10 elementos. el indice 9 es el ltimo elemento. Por lo tanto: int myArray[10]={9,3,2,4,3,2,7,8,9,11}; // myArray[9] contiene 11 // myArray[10] es invalido y contiene informacin aleatoria (de otra direccin de memoria) Por esta razn hay que tener cuidado en el acceso a las matrices. El acceso ms all del final de una matriz (usando un nmero de ndice mayor que el tamao declarado 1) resultar la lectura de la memoria que est en uso para otros fines. La lectura de estos lugares probablemente no va a hacer mucho mal, excepto la lectura de datos

Pag 132

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

no vlidos. Escribir en las localidades de memoria aleatoria es definitivamente una mala idea y, a menudo puede conducir a resultados inesperados como fallos o mal funcionamiento del programa. Esto tambin puede ser un error difcil encontrar. A diferencia de BASIC o JAVA, el compilador de C no realiza ninguna comprobacin para ver si el acceso a una matriz est dentro de los lmites del tamao de la matriz que ha declarado. Para as ignar un valor a una matriz: mySensVals[0] = 10; To retrieve a value from an array: x = mySensVals[4]; Matr ices y los bu cles F OR Las matrices se utilizan muchas veces en el interior de bucles for, donde el contador de bucle se utiliza como el ndice de cada elemento de la matriz. Por ejemplo, para imprimir los elementos de una matriz a travs del puerto serie, se podra hacer algo como esto: int i; for (i = 0; i < 5; i = i + 1) { Serial.println(myPins[i]); } Ejemplo Para ver un programa completo que demuestra el uso de los arrays o matrices, mira Knight Rider example desde Tutoriales. Ver tambien Declaracin de variables PROGMEM

Pag 133

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

NOTA: PROGMEM Guarda datos en la memoria flash (la de programa) en vez de en la SRAM. Hay una descripcin de los tipos de memoria disponible en una placa Arduino. La palabra PROGMEM es un modificador de variable. Debera usarse slo con los tipos de datos definidos en pgmspace.h. Le dice al compilador que ponga la informacin en la memoria flash en vez de en la SRAM, que es donde normalmente se guarda. PROGMEM es parte de la librera pgmspace.h, por ello hay que incluir la librera al principio del sketch, de esta forma: #include <avr/pgmspace.h> Sintaxis dataType variableName[] PROGMEM = {dataInt0, dataInt1, dataInt3...}; dataType: tipo de datos en la memoria de programa: cualquier tipo de datos de variables variableName - el nombre de la variable matriz. Hay que tener en cuenta que PROGMEM es un modificador de variable por lo que no hay reglas escritas sobre dnde debera ir, por lo que el compilador acepta cualquiera de las definiciones siguientes, que son sinnimas. Aun as, se han llevado a cabo experimentos que han concludo que en varias versiones de Arduino (relacionado con la versin de GCC), PROGMEM puede funcionar en una posicin y no en otra. La tabla siguiente ha sido probada con Arduino 13. En versiones anteriores del IDE es posible que funcione mejor si PROGMEM se incluye despus del nombre de la variable dataType variableName[] PROGMEM = {}; // usar esta dataType PROGMEM variableName[] = {}; // no esta PROGMEM dataType variableName[] = {}; // usar esta PROGMEM puede usarse en una sola variable pero slo merece la pena su uso en bloques ms largos de datos que necesiten ser guardados, generalmente en un array aunque puede ser otro tipo de estructura. PROGMEM se usa en dos pasos. Despus de guardar los datos en la memoria Flash, requiere mtodos especiales (funciones), definidos tambin en la librera pgmspace.h, para leer los datos de la memoria de programa y ponerla en SRAM, para poder usarla. Es importante usar los tipos de datos definidos en pgmspace.h. Pueden aparecer fallos crpticos si se usan tipos comunes para llamadas a la memoria de cdigo. sta es una lista de tipos disponibles. No estn soportados los nmeros en coma flotante. prog_char prog_uchar - carcter con signo (1 byte) -127 a 128 - carcter sin signo (1 byte) 0 a 255

prog_int16_t - entero con signo (2 bytes) -32.767 a 32.768 prog_uint16_t - entero sin signo (2 bytes) 0 a 65.535 prog_int32_t - entero largo con signo(4 bytes) -2.147.483,648 a * 2.147.483.647.

Pag 134

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

prog_uint32_t - entero largo sin signo (4 bytes) 0 a 4.294.967.295 Ejemplo En el siguiente cdigo se indica cmo leer y escribir caracteres sin signo (bytes) y enteros (2 bytes) en PROGMEM. #include <avr/pgmspace.h> // guardar enteros sin signo PROGMEM prog_uint16_t charSet[] = { 65000, 32796, 16843, 10, 11234}; // guardar caracteres prog_uchar signMessage[] PROGMEM = {"I AM PREDATOR, UNSEEN COMBATANT. CREATED BY THE UNITED STATES DEPART"}; unsigned int displayInt; int k; // variable contador char myChar; // leer entero de 2 bytes displayInt = pgm_read_word_near(charSet + k) // leer carcter myChar = pgm_read_byte_near(signMessage + k); Matrices de cadenas de caracteres (arrays de strings) Muchas veces es conveniente, al trabajar con cantidades grandes de texto como por ejemplo en un proyecto con un LCD, definir matrices de strings. Como los strings son matrices, en realidad son matrices bidimensionales. stas tienden a ser estructuras grandes por lo que ponerlas en memoeria de programa es algo a evitar. Este cdigo ilustra la idea: /* PROGMEM string demo Cmo guardar una tabla de strings en la memoria de programa (flash) y cargarla. Informacin resumida de: http://www.nongnu.org/avr-libc/user-manual/pgmspace.html (ingls) Primero, definir los strings. */ #include <avr/pgmspace.h> prog_char string_0[] PROGMEM = "String 0"; // "String 0" etc. son strings a guardar. prog_char string_1[] PROGMEM = "String 1"; prog_char string_2[] PROGMEM = "String 2"; prog_char string_3[] PROGMEM = "String 3"; prog_char string_4[] PROGMEM = "String 4";

Pag 135

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

prog_char string_5[] PROGMEM = "String 5"; // Definir una tabla para guardar los strings PROGMEM const char *string_table[] = { string_0, string_1, string_2, string_3, string_4, string_5 }; char buffer[30]; // debe ser tan grande como el string ms grande. void setup() { Serial.begin(9600); } void loop() { /* La funcin strcpy_P copia un string del espacio de programa a un string en RAM ("buffer"). Hay que asegurarse de que el string en RAM es suficientemente grande para recibir el dato. */ for (int i = 0; i < 6; i++) { strcpy_P(buffer, (char*)pgm_read_word(&(string_table[i]))); // Casts necesarios e inferencia Serial.println( buffer ); delay( 500 ); } } 2.2.13 void La palabra reservada void se usa slo en la declaracin de funciones. Indica que se espera que no devuleva informacin a la funcin donde fu llamada. Ejemplo: // varias acciones se llevan a cabo en las funciones "setup" y "loop" // pero no se reporta ninguna informacin al programa principal. void setup() {

Pag 136

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

// ... } void loop() { // ... }


Ver tambin

declaracin de funciones
NOTA: Funciones. Segmentar el cdigo en funciones permite al programador crear piezas modulares de cdigo que realizan una tarea definida y vuelven a la zona del programa en la que fueron llamadas. El caso tpico para crear un funcin es cuan do uno necesita realizar la misma accin mltiples veces dentro de un mismo programa. Para programadores acostumbrados a utilizar BASIC las funciones en Arduino permiten (y extienden) la utilidad de usar subrutinas (GOSUB en BASIC). La estandarizacin de fragmentos de cdigo en funciones tiene diversas ventajas: Las funciones ayudan al programador a ser organizado. Adems ayudan a conceptualizar el programa. Las funciones codifican una accin en un lugar, as que slo deben ser depuradas de errores una vez. Reducen las posibilidades de error en modificaciones, si el cdigo debe ser cambiado. Las funciones hacen el sketch mas pequeo y mas compacto por que las secciones de cdigo se reutilizan varias veces. Hacen mas fcil la reutilizacin de cdigo en otros programas por hacerlo mas modular y, como efecto paralelo, usando funciones se obtiene un cdigo mas legible. Hay dos funciones necesarias en un sketch de Arduino: setup() y loop(). El resto de funciones debe ser definido fuera de las llaves de estas dos funciones. Como ejemplo vamos a crear una funcin muy simple que multiplica dos nmeros. Ejemplo

Al "invocar" a nuestra pequea funcin le pasamos parametros del tipo de dato que ella espera.

Pag 137

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

void loop{ int i = 2; int j = 3; int k; k = myMultiplyFunction(i, j); // k ahora contiene 6 } Nuestra funcin necesita ser declarada fuera de cualquier otra funcin, por ello "myMultiplyFunction()" puede ir antes o despues de la funcin "loop()". El sketch completo podra ser algo como esto: void setup(){ Serial.begin(9600); } void loop{ int i = 2; int j = 3; int k; k = myMultiplyFunction(i, j); // k ahora contiene 6 Serial.println(k); delay(500); } int myMultiplyFunction(int x, int y){ int result; result = x * y; return result; } Otro ejemplo: Esta funcin leer un sensor cinco veces con analogRead() y calcular la media de las cinco lecturas. Escala los datos a 8 bits (0-255), los invierte y devuelve el resultado invertido. int ReadSens_and_Condition(){ int i; int sval; for (i = 0; i < 5; i++){ sval = sval + analogRead(0); // sensor en pin analgico 0 } sval = sval / 5; // media sval = sval / 4; // escala a 8 bits (0 - 255) sval = 255 - sval; // invierte el resultado return sval; // devuelve el resultado

Pag 138

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

} Para llamar a nuestra funcin solo tenemos que asignarla a una variable. int sens; sens = ReadSens_and_Condition();

Conversin char() Descripcin Convierte un valor a un tipo de dato char. Sintax is char(x) Parmetros x: un valor de cualquier tipo Devuelve char Mira tambin char byte() Descripcin Convierte una variable a un tipo de datos byte. Sintax is byte(x) Parmetros x: una variable de cualquier tipo. Devuelve byte int() Descripcin Convierte un valor al tipo de datos int. Sintax is int(x) Parmetros x: un valor de cualquier tipo. Retorna

Pag 139

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

int long() Descripcin Convierte un valor al tipo de datos long. Sintax is long(x) Parmetros x: un valor para cualquier tipo Devuelve long long() Descripcin Convierte un valor al tipo de datos long. Sintax is long(x) Parmetros x: un valor para cualquier tipo Devuelve long

Pag 140

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

CAPITULO III Funciones


E/S Digitales pinMode() digitalWrite() digitalRead() E/S Analgicas analogRead() analogWrite() - PWM (modulacin por ancho de pulso) E/S Avanzadas tone() noTone() shiftOut() pulseIn() Tiempo millis() micros() delay() delayMicroseconds() Matemticas min() (mnimo) max() (mximo) abs() (valor absoluto) constrain() (limita) map() (cambia valor de rango) pow() (eleva a un nmero) sq() (eleva al cuadrado) sqrt() (raz cuadrada) Trigonometra sin() (seno) cos() (coseno) tan() (tangente) Nmeros Aleatorios randomSeed() random() Communicacin Serial

Pag 141

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

3.0

E/S Digitales 3.1 pinMode()

Descripcin Configura el pin especificado para comportarse como una entrada o una salida. Mira la descripcin de See the description of pines digitales para ms informacin. Sintax is pinMode(pin, modo) Parametros pin: el numero del pin que se desea configurar modo: INPUT (Entrada) o OUTPUT (Salida) Devuelve Nada Ejemplo int ledPin = 13; void setup() { pinMode(ledPin, OUTPUT); } void loop() { digitalWrite(ledPin, HIGH); delay(1000); delay(1000); }
Nota

// LED conectado al pin digital 13

//configura el pin del LED como salida

// Enciende el LED // Apaga el LED

// espera un segundo // Espera un segundo

digitalWrite(ledPin, LOW);

Una entrada analgica puede ser usada como un pin digital, refirindose a ellos desde el nmero 14 (entrada analgica 0) a 19 (entrada analgica 5).

Pag 142

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

3.2

digitalWrite() Descripcin

Escribe un valor HIGH o LOW hacia un pin digital. Si el pin ha sido configurado como OUTPUT con pinMode(), su voltaje ser establecido al correspondiente valor: 5V ( o 3.3V en tarjetas de 3.3V) para HIGH, 0V (tierra) para LOW. Si el pin es configurado como INPUT, escribir un valor de HIGH con digitalWrite() habilitar una resistencia interna de 20K conectada en pullup (ver el tutorial de pines digitales). Escribir LOW invalidar la resistencia. La resistencia es sufuciente para hacer brillar un LED de forma opaca, si los LEDs aparentan funcionar, pero no muy iluminados, esta puede ser la causa. La solucin es establecer el pin como salida con la funcin pinMode(). NOTA: El pin digital nmero 13 es ms difcil de usar que los otros pines digitales por que tiene un LED y una resistencia adjuntos, los cuales se encuentran soldados a la tarjeta, y la mayora de las tarjetas se encuentran as. Si habilitas la resistencia interna en pullup, proporcionar 1.7V en vez de los 5V esperados, por que el LED soldado en la tarjeta y resistencias bajan el nivel de voltaje, significando que siempre regresar LOW. Si debes usar el pin nmero 13 como entrada digital, usa una resistencia externa conectada a pulldown. Sintax is digitalWrite(pin, valor) Parameters pin: el nmero de pin valor: HIGH o LOW Devuelve nada Ejemplo
int ledPin = 13; void setup() { pinMode(ledPin, OUTPUT); } void loop() { digitalWrite(ledPin, HIGH); delay(1000); delay(1000); } digitalWrite(ledPin, LOW); // enciende el LED // apaga el LED // espera por un segundo // espera por un segundo // establece el pin digital como salida // LED conectado al pin digital 13

Pag 143

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

Establece el pin nmero 13 a HIGH, hace un retraso con la duracin de un segundo, y regresa el pin a LOW. Nota Los pines analgicos pueden ser usados como pines digitales con los nmeros 14 (entrada analgica nmero 0) hasta 19 (entrada analgica nmero 5). 3.3 digitalRead() Descripcin Lee el valor de un pin digital especificado, HIGH o LOW. Sintaxis digitalRead(pin) Par metros pin: el nmero de pin digital que quieres leer ( int) Devuelve HIGH o LOW Ejemplo int ledPin = 13; // LED conecado al pin digital nmero 13 int inPin = 7; int val = 0; void setup() { pinMode(ledPin, OUTPUT); como salida pinMode(inPin, INPUT); entrada } void loop() { val = digitalRead(inPin); digitalWrite(ledPin, val); } Establece el pin nmero 13 al mismo valor que el pin nmero 7, que es una entrada. // leer el pin de entrada // establece el LED al valor del botn // establece el pin digital nmero 13 // establece el pin digital nmero 7 como // botn (pushbutton) conectado al pin digital nmero 7 // variable donde se almacena el valor ledo

Pag 144

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

Nota Si el pin no esta conectado a algo, digitalRead() puede regresar HIGH o LOW (y esto puede cambiar aleatoriamente). Los pines analgicos pueden ser usados como pines digitales con los nmeros 14 (entrada analgica nmero 0) hasta 19 (entrada analogica nmero 5). 4.0 E/S Analgicas 4.1 tone() Descripcin Genera una onda cuadrada de la frecuencia especificada (y un 50% de ciclo de trabajo) en un pin. La duracin puede ser especificada, en caso contrario la onda continua hasta que haya una llamada a noTone(). El pin puede conectarse a un zumbador piezoelctrico u otro altavoz que haga sonar los tonos. Slo puede generarse un tono cada vez. Si un tono est sonando en un pin diferente, la llamada a tone() no tendr efecto. Si el tono est sonando en el mismo pin, la llamada establecer la nueva frecuencia. El uso de la funcin tone() interferir con la salida PWM en los ins 3 y 11 (en otras placas distintas de la Mega). NOTA: si quieres hacer sonar diferentes tonos en mltiples pins necesitas llamar a noTone() en un pin antes de llamar a tone() en el siguiente pin. Sintx is tone(pin, frecuencia) tone(pin, frecuencia, duracion) Parmetros pin: el pin en el que generar el tono frecuencia: la frecuencia del tono en hercios. duracin: la duracin del tono en milisegundos (opcional) NOTA: las frecuencias audibles por el odo humano van de los 20Hz a los 20KHz por lo que el parmetro "frecuencia" debera estar comprendido entre estos dos valores. Retorno Ninguno 4.2 noTone() Descripcin Detiene la generacin de la seal cuadrada que se activa al hacer uso de la funcin tone(). No tiene efecto si no se est generando ningn tono. NOTA: si quieres generar tonos diferentes en mltiples pines , necesitas usar la funcin noTone() en el pin antes de llamar a la funcin tone() en el siguiente pin.

Pag 145

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

Sintax is noTone(pin) Parmetros pin: el pin en el cual se va a parar de generar el tono. Devuelve Nada Ejemplos > Digital I/O Reproduce un tono usando la funcin tone() Este ejemplo muestra como usar la funcin tone() para generar notas. Reproduce una pequea melodia que quizs hayas escuchado antes. Circuito

Esquemtico:

Pag 146

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

Cdigo El cdigo de abajo usa un archivo extra, pitches.h. Este archivo contiene todos los valores de las frecuencias de las notas tpica. Por ejemplo, NOTE_C4 es una C media. NOTE_FS4 es F aguda, y as sucesivamente. Esta tabla de notas fue originalmente escrita por Brett Hagman, en el que est basada la funcin tone(). La encontrars util cada vez que tengas que reproducir notas musicales. Para crear este archivo, haz click en el botn "new Tab" (nueva pestaa) en la esquina superior derecha de la ventana. Queda algo as: Ejemplos > E/S Digital Seguidor de tono usando la funcin tone() Este ejemplo muestra como usar la funcin tone() para generar un tono que sigue los valores de una entrada analgica. Circuito

Esquemtico:

Pag 147

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

Cdigo El cdigo de este ejemplo es muy simple. Simplemente lee una entrada analgica y lo convierte en un valor en un rango comprendido en el rango de frecuencia audible. Los humanos podemos or frecuencias entre 20 y 20.000 Hz, pero 100 - 1000 funciona bien para este programa. Necesitaras encontrar el rango de variacin de tu entrada analgica para poder hacer la conversin. En el circuito que se muestra el rango de la entrada analgica va desde 400 hasta aproximadamente 1000.Cambia los valores en la funcin map() para que se ajusten al rango de tu sensor. Teclado simple usando la funcin tone() Este ejemplo muestra como usar el comando tone() para generar diferentes tonos dependiendo que sensor se presiona. Circuito

. Para ms circuitos de ejemplos visita la pgina del proyecto Fritzing Esquemtico:

Pag 148

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

Cdigo El programa de abajo lee tres sensores analgicos. Si alguno de los sensores supera un valor umbral, la nota correspondiente ser reproducida. El cdigo de abajo usa un archivo extra, pitches.h. Este archivo contiene todos los valores de las frecuencias de las notas tpica. Por ejemplo, NOTE_C4 es una C media. NOTE_FS4 es F aguda, y as sucesivamente. Eta tabla de notas fue originalmente escrita por Brett Hagman, en el que est basada la funcin tone(). La encontrars util cada vez que tengas que reproducir notas musicales. Para crear este archivo, haz click en "new Tab" (Nueva pestaa) el cual se encuentra en la esquina superior derecha de la ventana. Es algo as: Ejemplos > E/S Digital Reproducir tonos en distintas salidas usando la funcin tono() Este ejemplo muestra como usar el comando tone() para reproducir diferentes notas en mltiples salidas. El comando tono () usando uno de los temporizadores internos del ATmega, configurndolo con la frecuencia que deseas, y usando el temporizador para enviar pulsos a travs del pin de salida. Como solo usa un temporizador, solo puedes reproducir una nota a la vez. Sin embargo, puedes producir tonos en mltiples pines secuencialmente. Para hacerlo, necesitas apagar el temporizador en un pin para moverlo al siguiente. Circuito

Pag 149

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

Esquematico:

Cdigo El programa de abajo reproduce un tono en cada uno de los altavoces en secuencia, apagando el primer altavoz primero. Ten en cuenta que el tiempo de duracin de cada tono vienen determinado por el retraso que hay justo despus de el. PWM El ejemplo "Fading" demuestra el uso de una salida analgica (PWM) para atenuar y aumentar la luminosidad de un LED. Lo tienes disponible en la opcin "File->Sketchbook->Examples->Analog" del men del software de Arduino. La Modulacin por Ancho de Pulso (PWM = Pulse Width Modulation) es una tecnica para simular una salida analgica con una salida digital. El control digital se usa para crear una onda cuadrada, una seal que conmuta constantemente entre encendido y apagado. Este patron de encendido-apagado puede simular voltajes entre 0 (siempre apagado) y 5 voltios (siempre encendido) simplemente variando la proporcin de tiempo entre encendido y apagado. A la duracin del tiempo de encendido (ON) se le llama Ancho de Pulso (pulse width). Para variar el valor analgico cambiamos, o modulamos, ese ancho de pulso. Si repetimos este patrn de encendido-apagado lo suficientemente rapido por ejemplo con un LED el resultado es como si la seal variara entre 0 y 5 voltios controlando el brillo del LED. En el grafico de abajo las lineas verdes representan un periodo regular. Esta duracin o periodo es la inversa de la frecuencia del PWM. En otras palabras, con la Arduino la frecuencia PWM es bastante proxima a 500Hz lo que equivale a periodos de 2 milisegundos cada uno. La llamada a la funcin analogWrite() debe ser en la escala desde 0 a 255, siendo 255 el 100% de ciclo (siempre encendido), el valor 127 ser el 50% del ciclo (la mitad del tiempo encendido), etc.

Pag 150

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

Una vez cargado y ejecutado el ejemplo mueve la arduino de un lado a otro, lo que ves es esencialmente un mapeado del tiempo a lo largo del espacio. A nuestros ojos el movimiento difumina cada parpadeo del LED en una linea. A medida que la luminosidad del LED se incrementa o atenua esas pequeas lineas crecen o se reducen. Ahora estas viendo el ancho de pulso (pulse width).

4.3

shiftOut()

Descripcin Desplaza un byte de datos bit a bit. Empieza desde el bit ms significante (el de ms a la izquierda) o el menos significante (el ms a la derecha). Cada bit se escribe siguiendo su turno en un pin de datos, despus de conmutar un pin de reloj (seal de reloj) para indicar que el bit est disponible. Esto es conocido como protocolo serie sncrono y es la forma comn que utilizan los microcontroladores para comunicarse con sensores y con otros microcontroladores. Ambos dispositivos permanecen sincronizados, y se comunican a velocidades cercanas a las mximas, hasta que ambos compartan la misma linea de reloj. En la documentacin del harware interno de los chips se hace referencia a menudo a esta caracterstica como Serial Peripheral Interface (SPI). Sintax is shiftOut(pinDatos, pinReloj, ordenBits, valor) Parametros pinDatos: el pin en el cual extraer cada bit ( int)

Pag 151

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

pinReloj: el pin que hay que conmutar cada vez que a un pinDatos le ha sido enviado el valor correcto (int) ordenBits: en qu orden desplazar los bits; si hacia el MSBFIRST (bit ms significante primero) o hacia el LSBFIRST (bit menos significante primero). valor: los datos que rotar. (byte) Retorno Ninguno Nota El pinDatos y pinReloj deben estar ya configurados como salida con una llamada previa a pinMode(). 4.4 shiftOut se encuentra actualmente configurada para extraer un byte (8 bits) por lo que necesita realizar una operacin de dos pasos para extraer valores ms grandes de 255.
// Haz esto para una comunicacin serie MSBFIRST (primero el bit ms significativo) int datos = 500; // rota el byte ms alto shiftOut(pinDatos, pinReloj, MSBFIRST, (datos >> 8)); // rota el byte ms bajo shiftOut(datos, pinReloj, MSBFIRST, datos); // O haz esto para una comunicacin serie LSBFIRST (primero el bit menos significativo) datos = 500; // rota el byte ms bajo shiftOut(pinDatos, pinReloj, LSBFIRST, datos); // rota el bit ms alto shiftOut(pinDatos, pinReloj, LSBFIRST, (datos >> 8));

Ejemplo Para ver el circuito asociado a este ejemplo, ver el tutorial para controlar un registro de desplazamiento 74HC595.
//***********************************************************// // Name // Date // Notes // : shiftOutCode, Hello World : 25 Oct, 2006 // // // // // // Author : Carlyn Maw,Tom Igoe // Version : 1.0 : 74HC595 para contar de 0 a 255

: Cdigo para utilizar un registro de desplazamiento//

//***********************************************************//

Pag 152

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

//Pin conectado al pin ST_CP del 74HC595 int latchPin = 8; //Pin connectado al pin SH_CP del 74HC595 int clockPin = 12; ////Pin conectado al pin DS del 74HC595 int dataPin = 11; void setup() { // Configura como salida los pines que se direccionan en el bucle principal (loop) pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); } void loop() { //rutina de conteo for (int j = 0; j < 256; j++) { //pone a nivel bajo el latchPin y lo mantienen a nivel bajo todo el tiempo que ests transmitindo digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, LSBFIRST, j); //vuelve a poner el latchPin a nivel alto para sealizar que //no sigue siendo necesario eschuchar ms informacin digitalWrite(latchPin, HIGH); delay(1000); } }

4.5

pulseIn()

Descripcin Lee un pulso (ya sea HIGH alto o LOW bajo) en un pin. Por ejemplo, si value es HIGH, pulseIn() espera a que el pin sea HIGH, empieza a cronometrar, espera a que el pin sea LOW y entonces detiene la medida de tiempo. Devuelve la anchura del pulso en microsegundos. Interrumpe la medida y devuelve 0 si el pulso no ha comenzado en un tiempo especificado. La medida del tiempo en esta funcin ha sido determinada de forma emprica y est sujeta a errores en pulsos largos. Funciona correctamente en pulsos con una anchura de 10 microsegundos a tres minutos. Sintax is pulseIn(pin, value) pulseIn(pin, value, timeout)

Pag 153

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

Parmetros pin: el nmero del pin en el que se realiza la medida del pulso. (int) value: tipo de pulso. Puede ser HIGH o LOW. (int) timeout (opcional): el tiempo en microsegundos mximo a esperar antes de que se inicie el pulso. (unsigned long) Devuelve el ancho del pulso (en microsegundos) 0 si el pulso no ha empezado antes del timeout (unsigned long) Ejemplo int pin = 7; unsigned long duracion; void setup() { pinMode(pin, INPUT); } void loop() { duracion = pulseIn(pin, HIGH); } 5.0 Tiempo 5.1 millis() Descripcin Devuelve el tiempo en milisegundos transcurridos desde que se arranco la placa Arduino con el programa actual. Este nmero de desbordar (volver a cero), despues de aproximadamente 50 das. Parmetros Ninguno Devuelve Tiempo en milisegundos desde que el programa se inici ( long sin signo (unsigned long)) Ejemplo unsigned long time; void setup(){ Serial.begin(9600); }

Pag 154

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

void loop(){ Serial.print("Tiempo: "); time = millis(); //Imprime el tiempo desde que se inici el programa Serial.println(time); // espera un segundo para no enviar demasiados datos delay(1000); } Consejo: Ten en cuenta que el parametro que devuelve millis() es un long sin signo por lo que pueden producirse errores si el programador intenta llevar a cabo operaciones matemticas con otros tipos de dato como enteros. Vase tambin micros() delay() delayMicroseconds() Tutorial: Blink sin retardo 5.2 micros()

Descripcin Devuelve el nmero de microsegundos desde que la placa Arduino comenz a correr el programa. Este nmero eventualmente volver a 0 ( overflow), luego de aproximadamente 70 minutos. A 16 MHz, en las placas Arduino (por ejemplo, Duemilanove Nano), stas funcin tiene una resolucin de cuatro milisegundos (por ejemplo, el valor devuelto es siempre mltiplo de 4). A 8 MHz, en placas Arduino (como LilyPad), tiene una resolucin de 8 microsegundos. Nota: En un milisegundo hay 1.000 microsegundos y 1,000,000 microsegundos en un segundo. Parmetros Ninguno. Devuelve El nmero de microsegundos desde el inicio del programa ( unsigned long) Ejemplo unsigned long time; void setup(){ Serial.begin(9600);

Pag 155

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

} void loop(){ Serial.print("Tiempo: "); time = micros(); //Imprime el tiempo desde el comienzo del programa Serial.println(time); // espera un segundo para no enviar datos una cantidad exagerada de datos. delay(1000); } 5.3 delay() Descripcin Pausa el programa por un tiempo determinado (en milisegundos) especificado por un parmetro. Hay 1000 milisegundos en un segundo. Sintax is delay(ms) Parmetros ms: el nmero de milisegundos que se desea pausar el programa ( unsigned long) Devuelve Nada Ejemplo int ledPin = 13; // LED conectado al pin digital 13. void setup() { pinMode(ledPin, OUTPUT); // declara que el pin digital se va a usar como salida } void loop() { digitalWrite(ledPin, HIGH); delay(1000); delay(1000); } digitalWrite(ledPin, LOW); // enciende el LED // apaga el LED // espera durante un segundo // espera durante un segundo

Pag 156

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

Advertencia Aunque es fcil crear un LED parpadeante con la funcin delay() y muchos sketches usan pausas cortas para estas tareas, el uso de delay() en un sketch tiene problemas importantes. Mientras se pausa el programa no se leen sensores, ni se hacen clculos, ni puede haber manipulacin de los pines. En definitiva, hace que (casi) toda la actividad se pare. Una alternativa para controlar el tiempo es el uso de la funcin millis() y el sketch mostrado abajo. Normalmente se evita el uso de delay() para tiempos mayores de decenas de milisegundos excepto en programas muy simples. Algunas cosas siguen funcionando mientras se ejecuta la funcin delay() porque no se deshabilitan las interrupciones. La comunicacin serie de los pines RX sigue funcionando, los valores de PWM (analogWrite) y los estados de los pines se mantienen y las interrupciones siguen funcionando correctamente. Ejemplos > E/S (I/O) Digital Parpadeo sin retardo (delay) En ocasiones puede ser necesario hacer parpadear un LED (o alguna otra cuestin visible) al mismo tiempo que se hacen otras cosas (como controlar la pulsacin de un boton). Esto implica no poder utilizar delay(), o todo se pararda mientras el LED parpadea. Aqui tienes un cdigo que muestra como hacer parpadear el LED sin usar delay(). Controla la ltima vez que se encendi o apaga el LED. Entonces, cada vez que pasa por el bucle() compara si ha transcurrido un intervalo suficiente de tiempo y si es asi, apaga el LED si estaba encendido o viceversa. Circuito

Esquema:

Pag 157

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

5.4

delayMicroseconds()

Descr ipcin Detiene brevemente el programa por la cantidad en tiempo (en microsegundos) especificada como parmetro. Existen mil microsegundos en un milisegundo, y un millon de microsegundos en un segundo. Actualmente, el valor ms grande producir un retraso exacto es 16383. Esto puede cambiar en una futura versin de Arduino. Para retrazos ms largos que algunos miles de microsegundos, deberas usar delay() . Sintax is delayMicroseconds(us) Parametros us: el nmero de microsegundos a detener ( unsigned int) Devuelve Nada Ejemplo int outPin = 8; void setup() { pinMode(outPin, OUTPUT); } void loop() { digitalWrite(outPin, HIGH); delayMicroseconds(50); digitalWrite(outPin, LOW); delayMicroseconds(50); } Configura el pin nmero 8 para trabajar como pin de salida. Enva una serie de pulsos con 100 microsegundos de perodo. Advertencias y problemas conocidos Esta funcin trabaja de manera exacta en el rango de 3 microsegundos y valores superiores. No podemos asegurar que la funcin dealyMicroseconds funcionar de forma precisa para valores menores de retraso. As of Arduino 0018, delayMicroseconds() no longer disables interrupts. A partir de Arduino 0018, delayMicroseconds() ya no invalida las interrupciones // establece en encedido el pin // espera por 50 microsegundos // establece en apagado el ping // espera por 50 microsegundos // establece el pin digital como salida // selecciona el pin 8

Pag 158

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

6.0

Matemticas 6.1 min(x, y) Descripcin Calcula el mnimo de dos nmeros. Parametros x: el primer nmero, cualquier tipo de dato y: el segundo nmero, cualquier tipo de dato Devuelve El ms pequeo entre los dos nmeros. Ejemplos sensVal = min(sensVal, 100); // asigna sensVal al menor entre sensVal y 100 // asegurando que nunca pasar de 100. Nota La funcin max() es usualmente usada para limitar el lmite inferior del rango de una variable, mientras que la funcin min() es usada para limitar el lmite superior del rango de una variable. Adver tencia Debido a la forma en la que se ha implementado la funcin min(), evite realizar operaciones en el argumentos de la funcin ya que podra producir errores. min(a++, 100); a++; min(a, 100); // use este mtodo en cambio - mantenga cualquier operacin fuera de los parntesis 6.2 max(x, y) // evite esto - puede producir errores

Descripcin Calcula el mximo de dos nmeros. Parmetros x: El primer nmero, cualquier tipo de dato. y: El segundo nmero, cualquier tipo de dato. Devuelve El mayor de ambos parmetros. Ejemplo sensVal = max(senVal, 20); // asigna a sensVal su propio valor o, de ser superior, 20. // (una forma efectiva de asegurarse que el valor mnimo de senVal sea 20)

Pag 159

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

Nota max() suele ser usado para restringir el valor ms bajo del rango de una variable, mientras que min() es utilizado para restringir el valor mximo del rango. Atencin Debido a la forma en que la funcin max() es implementada, debes evitar usar otras funciones al definir los parmetros, puede derivar en resultados incorrectos. max(a--, 0); a--; max(a, 0); 6.3 abs(x) // evitar esto - puede dar resultados incorrectos. // mantener cualquier operacin fuera de los parntesis. // en su lugar, hacerlo as -

Descripcin Calcula el valor absoluto de un nmero. Parmetros x: El numero cuyo valor absoluto deseamos calcular Devuelve x: si x is mayor o igual que 0. -x: si x es menor que 0. Precaucin Debido a la forma en la que se ha implementado la funcin abs(), evite usar otras funciones como parmetro debido a que puede ocasionar que se devuelva un resultado incorrecto. abs(a++); a++; abs(a); 6.4 // evite esto - produce errores en el resultado // hazlo de esta manera // mantenga cualquier otra operacin fuera de la funcin

constrain(x, a, b)

Descripcin Restringe un nmero a un rango definido. Parmetros x: el nmero a restringir, cualquier tipo de datos. a: El nmero menor del rango, cualquier tipo de datos. b: El nmero mayor del rango, cualquier tipo de datos. Retorna x: si x est entre a y b a: si x es menor que a

Pag 160

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

b: si x es mayor que b Ejemplo sensVal = constrain(sensVal, 10, 150); // limita el valor del sensor entre 10 y 150 6.5 map(value, fromLow, fromHigh, toLow, toHigh)

Descripcin Re-mapea un nmero desde un rango hacia otro. sto significa que, un valor (value) con respecto al rango fromLow-fromHight ser mapeado al rango toLow-toHigh. No se limitan los valores dentro del rango, ya que los valores fuera de rango son a veces objetivos y tiles. La funcin constrain() puede ser usada tanto antes como despus de sta funcin, si los lmites de los rangos son deseados. Ten en cuenta que los lmites "inferiores" de algn rango pueden ser mayores o menores que el lmite "superior" por lo que map() puede utilizarse para revertir una serie de nmeros, por ejemplo: y = map(x, 1, 50, 50, 1); La funcin maneja correctamente tambin los nmeros negativos, por ejemplo: y = map(x, 1, 50, 50, -100); tambin es vlido y funciona correctamente. La funcin map() usa matemtica de enteros por lo que no generar fracciones, aunque fuere el resultado correcto. Los resultados en fracciones se truncan, y no son redondeados o promediados. Parmetros value: el nmero (valor) a mapear. fromLow: el lmite inferior del rango actual del valor. fromHigh: el lmite superior del rango actual del valor. toLow: lmite inferior del rango deseado. toHigh: lmite superior del rango deseado. Devuelve El valor mapeado. Ejemplo /* Mapea un valor anlogo a 8 bits (0 a 255) */ void setup() {} void loop() { int val = analogRead(0);

Pag 161

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

val = map(val, 0, 1023, 0, 255); analogWrite(9, val); } Apndice Para los interesados en el funcionamiento de la funcin, aqu est su cdigo: long map(long x, long in_min, long in_max, long out_min, long out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; } 6.6 pow(base, exponente)

Descripcin Calcula el valor de un nmero elevado a otro nmero. Pow() puede ser usado para elevar un nmero a una fraccin. Esta funcin es til para generar datos exponenciales o curvas. Parmetros Base: base que queremos elevar (float) (Coma flotante) Exponente: la potencia a la que se quiere elevar la base ( float) (Coma flotante) Devuelve El resultado de la exponenciacin ( double)(Doble) Ejemplo Mira la funcin fscale en la librera del cdigo. 6.7 sq(x)

Descripcin Calcula el cuadrado de un nmero: el numero multiplicado por el mismo. Parmetros x: el numero, cualquier tipo de dato Devuelve El cuadrado del nmero

Pag 162

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

6.8

sqrt(x)

Descripcin Calcula la raz cuadrada de un numero. Parmetros x: el numero, cualquier tipo de dato Devuelve doble, la raz cuadrada del numero. 7.0 Trigonometra 7.1 sin(rad)

Descripcin Calcula el seno de un ngulo (en raianes). El resultado ser entre -1 y 1. Parametros rad: el ngulo en radianes (float) Retorno El seno del ngulo (double) Nota Serial.print() y Serial.println() no soportan la impresin de valores de tipo float. 7.2 cos(rad)

Descripcin Calcula el coseno de un ngulo (en radianes). El resultado estar entre -1 y 1. Parmetros rad: el ngulo en radianes (float) Retorna El coseno del ngulo ("double") Nota Serial.print() y Serial.println() no soportan actualmente la impresin de nmeros con decimales. 7.3 tan(rad) Descripcin Calcula la tangente de un ngulo (en radianes). El resultado estar entre el menos infinito y el infinito. Parmetros

Pag 163

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

rad: el ngulo en radianes (float) Retorno La tangente del ngulo (double) Nota Serial.print() y Serial.println() no soportan actualmente imprimir variales de tipo float. NOTA: float Descripcion El tipo variable para los nmeros en coma flotante (nmero decimal). Estos nmeros son usados, habitualmente, para aproximar valores analgicos y contnuos, debido a que ofrecen una mayor resolucin que los enteros. Las variables tipo float tienen el valor mximo 3.4028235E+38, y como mnimo pueden alacanzar el -3.4028235E+38. Ocupan 4bytes (32bits). Los floats tienen una precisin de 6 o 7 dgitos decimales. Esto significa el nmero total de dgitos, no el nmero a la derecha de la coma decimal. Al contrario que en otras plataformas, donde tu podras obtener mayor precisin usando una variable tipo double (por ejemplo, por encima de 15 dgitos), en Arduino los double tienen el mismo tamao que los float. Los nmeros en coma flotante no son exactos, y muchos proporcionan falsos resultados cuando son comparados. Por ejemplo, 6.0 / 3.0 puede no ser igual a 2.0. Debes comprobar que el valor absoluto de la diferencia entre los nmeros pertenezca a un rango pequeo. La matemtica en coma flotante es mucho ms lenta que la matemtica de enteros para realizar operaciones, por lo que deberas evitarla si, por ejemplo, un bucle tiene que ejecutarse a la mxima velocidad para funciones con temporizaciones precisas. Los programadores normalmente suelen asignar unas longitudes para convertir las operaciones de coma flotante en clculos con enteros, para aumentar la velocidad. Ejemplos float myfloat; float sensorCalbrate = 1.117; Sintaxis float var = val; var - el nombre de la variable tipo float val - el valor que le asignas a esa variable Cdigo de ejemplo int x; int y; float z; x = 1; y = x / 2; // y ahora contiene 0, la parte entera de la operacin

Pag 164

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

z = (float)x / 2.0; // z ahora contiene 0.5 (se debe usar 2.0, en lugar de 2) double Descripcion Nmero en coma flotante de doble precisin. Ocupa 4 bytes. La implementacin "double" en Arduino es exactamente lo mismo que la FLOAT, sin ganar nada de precisin. Consejo Los usuarios que porten cdigo de otras fuentes y que incluyan variable tipo double deberan examinar el cdigo para ver si la precisin necesaria es diferente a la que se puede lograr en Arduino. 8.0 Nmeros Aleatorios 8.1 randomSeed(seed) Descripcin randomSeed() inicializa el generador de nmeros pseudoaleatorios, hacindole empezar en un punto arbitrario de su secuencia aleatoria. Esta secuencia, aunque muy larga y aleatoria, es siempre la misma. Si es importante que la secuencia de valores generada por random() difiera en ejecuciones sucesivas de un programa, es recomendable utilizar randomSeed() (seed en ingls, semilla) para inicializar el generador de nmeros aleatorios con una entrada mnimamente aleatoria como analogRead() en un pin desconectado. No obstante, puede ser til usar secuencias pseudoaleatorias que se repitan exactamente. Esto se consigue llamando a randomSeed() con un nmero fijo antes de empezar la generacin de la secuencia. Parmetros long, int - recibe un nmero para generar la semilla. Devuelve no devuelve nada Example long numAleatorio; void setup(){ Serial.begin(9600); randomSeed(analogRead(0)); } void loop(){ randNumber = random(300);

Pag 165

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

Serial.println(numAleatorio); delay(50); } 8.2 random() Descripcin La funcin random genera nmeros pseudoaleatorios. Sintax is random(max) random(min, max) Parmetros min - lmite inferior del valor aleatorio, inclusive (opcional) max - lmite superior del valor aleatorio, exclusive (se devuelve hasta el anterior) Devuelve un nmero aleatorio entre min y max (long) Nota: Si es importante que la secuencia de valores generada por random() difiera en ejecuciones sucesivas de un programa, es recomendable utilizar randomSeed() (seed en ingls, semilla) para inicializar el generador de nmeros aleatorios con una entrada mnimamente aleatoria como analogRead() en un pin desconectado. No obstante, puede ser til usar secuencias pseudoaleatorias que se repitan exactamente. Esto se consigue llamando a randomSeed() con un nmero fijo antes de empezar la generacin de la secuencia. Ejemplo long numAleatorio; void setup(){ Serial.begin(9600); // si la entrada analgica 0 no est conectada, // la llamada a randomSeed() recibir ruido esttico // (analgico) y se generarn diferentes semillas // cada vez que se ejecute el sketch. randomSeed(analogRead(0)); } void loop() { // escribe un nmero aleatorio de 0 a 299

Pag 166

MICROCONTROLADOR ATMEL numAleatorio = random(300); Serial.println(numAleatorio); // escribe un nmero aleatorio de 10 a 19 numAleatorio = random(10, 20); Serial.println(numAleatorio); delay(50); } 9.0 Comunicacin: 9.1 Serial Se utiliza para la comunicacin entre la placa Arduino y un ordenador u otros dispositivos. Todas las placas Arduino tienen al menos un puerto serie (tambin conocido como UART o USART): Serial. Se comunica a travs de los pines digitales 0 (RX) y 1 (TX), as como con el ordenador mediante USB. Por lo tanto, si utilizas estas funciones, no puedes usar los pines 0 y 1 como entrada o salida digital. Puedes utilizar el monitor del puerto serie incorporado en el entorno Arduino para comunicarte con la placa Arduino. Haz clic en el botn del monitor de puerto serie en la barra de herramientas y selecciona la misma velocidad en baudios utilizada en la llamada a begin(). La placa Arduino Mega tiene tres puertos adicionales de serie: Serial1 en los pines 19 (RX) y 18 (TX), Serial2 en los pines 17 (RX) y 16 (TX), Serial3 en los pines 15 (RX) y 14 (TX). Para utilizar estos pines para comunicarse con el ordenador personal, necesitars un adaptador USB adicional a serie, ya que no estn conectados al adaptador USB-Serie de la placa Arduino Mega. Para usarlos para comunicarse con un dispositivo serie externo TTL, conecta el pin TX al pin RX del dispositivo, el RX al pin TX del dispositivo, y el GND de tu Arduino Mega a masa del dispositivo. (No conectes estos pines directamente a un puerto serie RS232, que operan a +/- 12V y esto puede daar la placa Arduino.) Funciones begin() end() available() read() flush() print() println() write() Ejemplos ASCII Table Dimmer Graph

Pag 167

MICROCONTROLADOR ATMEL

MANUAL PROGRAMACIN

Physical Pixel Virtual Color Mixer Serial Call Response Serial Call Response ASCII FUNCIONES DE COMUNICACIN SERIAL. 9.2 begin() Descripcin Establece la velocidad de datos en bits por segundo (baudios) para la transmisin de datos en serie. Para comunicarse con el computador, utilice una de estas velocidades: 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600 o 115200. Sin embargo, puedes especificar otras velocidades - por ejemplo, para comunicarte a travs de los pines 0 y 1 con un componente que requiere una velocidad de transmisin en particular. Sintaxis Serial.begin(speed) Solamente en Arduino Mega: Serial1.begin(speed) Serial2.begin(spee d) Serial3.begin(spee d) Parmetros speed: Velocidad en bits por segundo (baudios) - long Devuelve Nada Ejemplo: void setup() { Serial.begin(9600); velocidad en 9600 bps } void loop() {} Ejemplo para Arduino Mega: // Arduino Mega usando sus 4 puertos serie // (Serial, Serial1, Serial2, Serial3), // con diferentes velocidades de datos: void setup(){ // abre el puerto serie y establece la

Pag 168

MICROCONTROLADOR ATMEL

Serial.begin(9600); Serial1.begin(38400); Serial2.begin(19200); Serial3.begin(4800); Serial.println("Hola Ordenador"); Serial1.println("Hola Serial 1"); Serial2.println("Hola Serial 2"); Serial3.println("Hola Serial 3"); } void loop() {} 9.3 end() Descripcin Desactiva la comunicacin serie, permitiendo a los pines RX and TX ser usados como entradas o salidas digitales. Para reactivar la comunicacin serie, llama al mtodo Serial.begin(). Sintaxis Serial.end() Solamente en Arduino Mega: Serial1.end() Serial2.end() Serial3.end() Parmetros ninguno Devuelve nada 9.4 available() Descripcin Devuelve el nmero de bytes (caracteres) disponibles para ser leidos por el puerto serie. Se refiere a datos ya recibidos y disponibles en el buffer de recepcin del puerto (que tiene una capacidad de 128 bytes). Sintaxis Serial.available() Slo para Arduino Mega: Serial1.available() Serial2.available() Serial3.available()

Pag 169

MICROCONTROLADOR ATMEL

Parametros Ninguno Devuelve El nmero de bytes disponibles para ser Ledos Ejemplo int incomingByte = 0; { Serial.begin(9600); } void loop() { // enva datos solo cuando recibe datos: if (Serial.available() > 0) { // lee el byte de entrada: incomingByte = Serial.read(); // muestra lo que tiene: Serial.print("He recibido: "); Serial.println(incomingByte, DEC); } } Ejemplo Arduino Mega: void setup() { Serial.begin(9600); Serial1.begin(9600); } void loop() { // lee desde el puerto 0, enva al puerto 1: if (Serial.available()) { int inByte = Serial.read(); Serial1.print(inByte, BYTE); //
abre el puerto serie, establece la velocidad a 9600 bps

// para los datos de entrada serie void setup()

Pag 170

MICROCONTROLADOR ATMEL

} // lee del puerto 1, enva al puerto 0: if (Serial1.available()) { int inByte = Serial1.read(); Serial.print(inByte, BYTE); } } 9.5 read() Descripcin Lee los datos entrantes del puerto serie. Sintax is Serial.read() Solamente en Arduino Mega: Serial1.read() Serial2.read() Serial3.read() Parmetros Ninguno Devuelve el primer byte disponible recibido por el puerto serie (devuelve -1 si no hay datos disponibles) - int Ejemplo int incomingByte = 0; void setup() { Serial.begin(9600); } void loop() { // envia datos solamente cuando recibe datos if (Serial.available() > 0) { // lee el byte entrante: incomingByte = Serial.read(); // dice lo que ha recibido: Serial.print("He recibido: "); Serial.println(incomingByte, DEC); // abre el puerto serie a 9600 bps // para el byte leido

Pag 171

MICROCONTROLADOR ATMEL

} } 9.6 flush() Descripcin Vaca el bfer de entrada de datos en serie. Es decir, cualquier llamada a Serial.read () o Serial.available () devolver slo los datos recibidos despus la llamada ms reciente a Serial.flush (). Sintax is Serial.flush() Solamente en Arduino Mega: Serial1.flush() Serial2.flush() Serial3.flush() Parmetros ninguno Retorna nada 9.7 print() Descripcin Imprime los datos al puerto serie como texto ASCII. Este comando puede tomar muchas formas. Los nmeros son impresos mediante un juego de caracteres ASCII para cada dgito. Los valores de tipo "float" son impresos en forma de dgitos ASCII con dos decimales por defecto. Los valores tipo "byte" se envan como un nico carcter. Los caracteres y las cadenas se envan tal cual. Por ejemplo: Serial.print(78) imprime "78" Serial.print(1.23456) imprime "1.23" Serial.print(byte(78)) imprime "N" (cuyo cdigo ASCII es 78) Serial.print('N') imprime "N" Serial.print("Hello world.") imprime "Hello world." Un segundo parmetro opcional especifica la base (formato) a usar; los valores permitidos son BYTE, BIN (binarios o base 2), OCT (octales o base 8), DEC (decimales o base 10), HEX (hexadecimales o base 16). Para nmeros de coma flotante, este parmetro especifica el numero de posiciones decimales a usar. Por ejemplo: Serial.print(78, BYTE) imprime "N" Serial.print(78, BIN) imprime "1001110"

Pag 172

MICROCONTROLADOR ATMEL

Serial.print(78, OCT) imprime "116" Serial.print(78, DEC) imprime "78" Serial.print(78, HEX) imprime "4E" Serial.println(1.23456, 0) imprime "1" Serial.println(1.23456, 2) imprime "1.23" Serial.println(1.23456, 4) imprime "1.2346" Sintax is Serial.print(val) Serial.print(val, format) Parmetros val: el valor a imprimir - de cualquier tipo format: especifica el nmero de la base (para nmeros enteros) o el nmero de posiciones decimales (para nmeros de coma flotante o tipo "float") Devuelve Nada Ejemplo: /* Usa un bucle FOR para los datos e imprime un nmero en varios formatos. */ int x = 0; // variable // abre el puerto serie a 9600 bps: void setup() { Serial.begin(9600); } void loop() { // print labels Serial.print("SIN FORMATO"); Serial.print("\t"); Serial.print("DEC"); Serial.print("\t"); Serial.print("HEX"); Serial.print("\t"); Serial.print("OCT"); Serial.print("\t"); Serial.print("BIN"); // imprime un texto // imprime un tabulado

Pag 173

MICROCONTROLADOR ATMEL

Serial.print("\t"); Serial.println("BYTE"); for(x=0; x< 64; x++){ Serial.print(x); // solo una parte de la tabla // imprime en varios formatos: // imprime como codificado ASCII decimal - igual que "DEC" // imprime un tabulado // imprime un tabulado // imprime un tabulado // imprime un tabulado // imprime un tabulado Serial.print("\t"); Serial.print("\t"); Serial.print("\t"); Serial.print("\t"); Serial.print("\t");

Serial.print(x, DEC); // imprime como codificado ASCII decimal Serial.print(x, HEX); // imprime como codificado ASCII hexadecimal Serial.print(x, OCT); // imprime como codificado ASCII octal Serial.print(x, BIN); // imprime como codificado ASCII binario

Serial.println(x, BYTE);// imprime el valor en bruto del byte, // y aade el salto de linea con "println" delay(200); } Serial.println(""); } Su ger en cias de pr ogr amacin / Pr oblemas con oc idos El ltimo carcter a imprimir se transmite a travs del puerto serie despus de que Serial.print () ha regresado. 9.8 println() Descripcin Imprime los datos al puerto serie como texto ASCII seguido de un retorno de carro (ASCII 13, o '\r') y un carcter de avance de lnea (ASCII 10, o '\n'). Este comando tiene la misma forma que Serial.print (). Sintax is Serial.println(val) Serial.println(val, format) Prarmetros val: el valor a imprimir - de cualquier tipo //imprime otro salto de linea // espera 200 milisegundos

Pag 174

MICROCONTROLADOR ATMEL

format: especifica el nmero de la base (para nmeros enteros) o el nmero de posiciones decimales (para nmeros de coma flotante o tipo "float") Devuelve Nada Example: /* Analog input Lee el pin analgico 0, e imprime su valor por el puerto serie. */ int analogValue = 0; void setup() { // abre el puerto serie a 9600 bps: Serial.begin(9600); } void loop() { // lee la entrada analogica en el pin 0: analogValue = analogRead(0); // imprime el valor en varios formatos: Serial.println(analogValue); // imprime como ASCII decimal Serial.println(analogValue, DEC); // imprime como ASCII decimal Serial.println(analogValue, HEX); // imprime como ASCII hexadecimal Serial.println(analogValue, OCT); // imprime como ASCII octal Serial.println(analogValue, BIN); // imprime como ASCII binario Serial.println(analogValue, BYTE); // imprime el valor del byte // espera 10 milisegundos antes de la siguiente lectura. delay(10); } 9.9 Write() Descripcin Escribe datos binarios en el puerto serie. Estos datos se envan como un byte o una serie de bytes; para enviar los caracteres que representan los dgitos de un nmero usar funcion print () en su lugar. // variable para guardar el valor analogico

Pag 175

MICROCONTROLADOR ATMEL

Sy n t ax Serial.write(val) Serial.write(str) Serial.write(buf, len) Arduino Mega tambien soporta: Serial1, Serial2, Serial3 (en lugar de Serial) Parmetros val: un valor para enviar como un solo byte str: una cadena 'string' para enviar como una serie de bytes buf: un 'array' para enviar como una serie de bytes len: longitud del bfer

Pag 176

MICROCONTROLADOR ATMEL

EJEMPLOS Tabla ASCII Muestra las funciones avanzadas de impresin serie mediante la generacin de una tabla de caracteres ASCII y sus valores en decimal, hexadecimal, octal y binario. Para ms informacin sobre ASCII, mira http://www.asciitable.com y http://en.wikipedia.org/wiki/ASCII.
Code

/*
ASCII table Prints out byte values in all possible formats: * as raw binary values * as ASCII-encoded decimal, hex, octal, and binary values For more on ASCII, see http://www.asciitable.com and http://en.wikipedia.org/wiki/ASCII The circuit: No external hardware needed.

*/ void setup() { //Initialize serial and wait for port to open: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for Leonardo only } // prints title with ending line break Serial.println("ASCII Table ~ Character Map"); } // first visible ASCIIcharacter '!' is number 33: int thisByte = 33; // you can also write ASCII characters in single quotes. // for example. '!' is the same as 33, so you could also use this: //int thisByte = '!'; void loop() { // prints value unaltered, i.e. the raw binary version of the // byte. The serial monitor interprets all bytes as // ASCII, so 33, the first number, will show up as '!' Serial.write(thisByte);

Pag 177

MICROCONTROLADOR ATMEL

Serial.print(", dec: "); // prints value as string as an ASCII-encoded decimal (base 10). // Decimal is the default format for Serial.print() and Serial.println(), // so no modifier is needed: Serial.print(thisByte); // But you can declare the modifier for decimal if you want to. //this also works if you uncomment it: // Serial.print(thisByte, DEC); Serial.print(", hex: "); // prints value as string in hexadecimal (base 16): Serial.print(thisByte, HEX); Serial.print(", oct: "); // prints value as string in octal (base 8); Serial.print(thisByte, OCT); Serial.print(", bin: "); // prints value as string in binary (base 2) // also prints ending line break: Serial.println(thisByte, BIN); // if printed last visible character '~' or 126, stop: if(thisByte == 126) { // you could also use if (thisByte == '~') { // This loop loops forever and does nothing while(true) { continue; } } // go on to the next character thisByte++; }
Output
ASCII Table ~ Character Map !, dec: 33, hex: 21, oct: 41, bin 4, decASCII Table ~ Character Map !, dec: 33, hex: 21, oct: 41, bin: ", dec: 34, hex: 22, oct: 42, bin: #, dec: 35, hex: 23, oct: 43, bin: $, dec: 36, hex: 24, oct: 44, bin: %, dec: 37, hex: 25, oct: 45, bin: &, dec: 38, hex: 26, oct: 46, bin: ', dec: 39, hex: 27, oct: 47, bin: (, dec: 40, hex: 28, oct: 50, bin: ), dec: 41, hex: 29, oct: 51, bin:

100001 100010 100011 100100 100101 100110 100111 101000 101001

Pag 178

MICROCONTROLADOR ATMEL

*, +, ,, -, ., /, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, :, ;, <, =, >, ?, @, A, B, C, D, E, ...

dec: dec: dec: dec: dec: dec: dec: dec: dec: dec: dec: dec: dec: dec: dec: dec: dec: dec: dec: dec: dec: dec: dec: dec: dec: dec: dec: dec:

42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69,

hex: hex: hex: hex: hex: hex: hex: hex: hex: hex: hex: hex: hex: hex: hex: hex: hex: hex: hex: hex: hex: hex: hex: hex: hex: hex: hex: hex:

2A, 2B, 2C, 2D, 2E, 2F, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 3A, 3B, 3C, 3D, 3E, 3F, 40, 41, 42, 43, 44, 45,

oct: oct: oct: oct: oct: oct: oct: oct: oct: oct: oct: oct: oct: oct: oct: oct: oct: oct: oct: oct: oct: oct: oct: oct: oct: oct: oct: oct:

52, bin: 101010 53, bin: 101011 54, bin: 101100 55, bin: 101101 56, bin: 101110 57, bin: 101111 60, bin: 110000 61, bin: 110001 62, bin: 110010 63, bin: 110011 64, bin: 110100 65, bin: 110101 66, bin: 110110 67, bin: 110111 70, bin: 111000 71, bin: 111001 72, bin: 111010 73, bin: 111011 74, bin: 111100 75, bin: 111101 76, bin: 111110 77, bin: 111111 100, bin: 1000000 101, bin: 1000001 102, bin: 1000010 103, bin: 1000011 104, bin: 1000100 105, bin: 1000101

Pag 179

MICROCONTROLADOR ATMEL

Atenuador (Dimmer) Muestra el envo de datos desde el ordenador a la placa Arduino, en este caso para controlar el brillo de un LED. Los datos se envan en bytes individuales, cada uno de ellos oscila entre 0 y 255. Arduino lee estos bytes y los utiliza para ajustar el brillo de los LED. Puedes enviar bytes al Arduino desde cualquier software que tenga acceso al puerto serie del ordenador. Puedes ver ejemplos para Processing y Max/MSP versin 5 mas abajo. Circuito Un LED conectado al pin 9 utilizando la resistencia adecuada, segn sea necesario. Para la mayora de los LEDs comunes, generalmente se puede prescindir de la resistencia, ya que la corriente de salida de los pines de E/S digitales es limitada.
Esquema

Code

/* Dimmer Demonstrates the sending data from the computer to the Arduino board, in this case to control the brightness of an LED. The data is sent in individual bytes, each of which ranges from 0 to 255. Arduino reads these bytes and uses them to set the brightness of the LED. The circuit:

Pag 180

MICROCONTROLADOR ATMEL

LED attached from digital pin 9 to ground. Serial connection to Processing, Max/MSP, or another serial application This example code is in the public domain. */ const int ledPin = 9; // the pin that the LED is attached to

void setup() { // initialize the serial communication: Serial.begin(9600); // initialize the ledPin as an output: pinMode(ledPin, OUTPUT); } void loop() { byte brightness; // check if data has been sent from the computer: if (Serial.available()) { // read the most recent byte (which will be from 0 to 255): brightness = Serial.read(); // set the brightness of the LED: analogWrite(ledPin, brightness); } } /* Processing code for this example // Dimmer - sends bytes over a serial port // by David A. Mellis //This example code is in the public domain. import processing.serial.*; Serial port; void setup() { size(256, 150); println("Available serial ports:"); println(Serial.list()); // Uses the first port in this list (number 0). Change this to

Pag 181

MICROCONTROLADOR ATMEL

// select the port corresponding to your Arduino board. The last // parameter (e.g. 9600) is the speed of the communication. It // has to correspond to the value passed to Serial.begin() in your // Arduino sketch. port = new Serial(this, Serial.list()[0], 9600); // If you know the name of the port used by the Arduino board, you // can specify it directly like this. //port = new Serial(this, "COM1", 9600); } void draw() { // draw a gradient from black to white for (int i = 0; i < 256; i++) { stroke(i); line(i, 0, i, 150); } // write the current X-position of the mouse to the serial port as // a single byte port.write(mouseX); } */

Pag 182

MICROCONTROLADOR ATMEL

Grfico
Un ejemplo sencillo de comunicaciones desde la placa Arduino al ordenador: el valor de una entrada analgica es visualizado. Llamomos a esto comunicacin "serie" porque la conexin tanto en Arduino como en el ordenador es un tradicional y modernizado puerto serie, aunque en realidad actualmente uses un cable USB. Puedes utilizar el monitor serie de Arduino para ver los datos enviados, o pueden ser leidos mediante Processing (ver cdigo mas abajo), Flash, PD, Max/MSP, etc. Circuito Una entrada analgica conectada al pin 0 analgico. Esquema

Cdigo

/* Graph A simple example of communication from the Arduino board to the computer: the value of analog input 0 is sent out the serial port. We call this "serial" communication because the connection appears to both the Arduino and the computer as a serial port, even though it may actually use a USB cable. Bytes are sent one after another (serially) from the Arduino to the computer. You can use the Arduino serial monitor to view the sent data, or it can be read by Processing, PD, Max/MSP, or any other program capable of reading

Pag 183

MICROCONTROLADOR ATMEL

data from a serial port. The Processing code below graphs the data received so you can see the value of the analog input changing over time. The circuit: Any analog input sensor is attached to analog in pin 0. */ void setup() { // initialize the serial communication: Serial.begin(9600); } void loop() { // send the value of analog input 0: Serial.println(analogRead(A0)); // wait a bit for the analog-to-digital converter // to stabilize after the last reading: delay(2); } /* Processing code for this example // Graphing sketch // This program takes ASCII-encoded strings // from the serial port at 9600 baud and graphs them. It expects values in the // range 0 to 1023, followed by a newline, or newline and carriage return // // // // Created 20 Apr 2005 Updated 18 Jan 2008 by Tom Igoe This example code is in the public domain.

import processing.serial.*; Serial myPort; int xPos = 1; // The serial port // horizontal position of the graph

void setup () { // set the window size: size(400, 300); // List all the available serial ports println(Serial.list()); // I know that the first port in the serial list on my mac // is always my Arduino, so I open Serial.list()[0].

Pag 184

MICROCONTROLADOR ATMEL

// Open whatever port is the one you're using. myPort = new Serial(this, Serial.list()[0], 9600); // don't generate a serialEvent() unless you get a newline character: myPort.bufferUntil('\n'); // set inital background: background(0); } void draw () { // everything happens in the serialEvent() } void serialEvent (Serial myPort) { // get the ASCII string: String inString = myPort.readStringUntil('\n'); if (inString != null) { // trim off any whitespace: inString = trim(inString); // convert to an int and map to the screen height: float inByte = float(inString); inByte = map(inByte, 0, 1023, 0, height); // draw the line: stroke(127,34,255); line(xPos, height, xPos, height - inByte); // at the edge of the screen, go back to the beginning: if (xPos >= width) { xPos = 0; background(0); } else { // increment the horizontal position: xPos++; } } } */

Pag 185

MICROCONTROLADOR ATMEL

Llamada y respuesta Serial (handshaking)


Un ejemplo de la comunicacin multi-byte desde la placa de Arduino al ordenador utilizando un metodo de llamada-y-respuesta (handshaking). Este programa enva un ASCII A (byte de valor 65) en el arranque y lo repite hasta que el serial responde desde el ordenador. Entonces enva tres valores del sensor como bits simples, y queda esperando otra respuesta del ordenador. Puedes uilizar el monitor de serie de Arduino para ver los datos enviados, o puede ser leido por processing (ver cdigo siguiente), flash, PD, Max/MSP (ver siguiente ejemplo), etc. Circuito Las entradas analgicas conectadas a los pines de entrada analgica 0 y 1. Interruptor conectado a la I/O digital 2. Esquemas

Code

/*
Serial Call and Response Language: Wiring/Arduino This program sends an ASCII A (byte of value 65) on startup and repeats that until it gets some data in. Then it waits for a byte in the serial port, and sends three sensor values whenever it gets a byte in.

Pag 186

MICROCONTROLADOR ATMEL

Thanks to Greg Shakar and Scott Fitzgerald for the improvements The circuit: * potentiometers attached to analog inputs 0 and 1 * pushbutton attached to digital I/O 2

*/
int int int int firstSensor = 0; // first analog sensor secondSensor = 0; // second analog sensor thirdSensor = 0; // digital sensor inByte = 0; // incoming serial byte

void setup() { // start serial port at 9600 bps: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for Leonardo only } pinMode(2, INPUT); // digital sensor is on digital pin 2 establishContact(); // send a byte to establish contact until receiver responds

void loop() { // if we get a valid byte, read analog ins: if (Serial.available() > 0) { // get incoming byte: inByte = Serial.read(); // read first analog input, divide by 4 to make the range 0-255: firstSensor = analogRead(A0)/4; // delay 10ms to let the ADC recover: delay(10); // read second analog input, divide by 4 to make the range 0-255: secondSensor = analogRead(1)/4; // read switch, map it to 0 or 255L thirdSensor = map(digitalRead(2), 0, 1, 0, 255); // send sensor values: Serial.write(firstSensor); Serial.write(secondSensor); Serial.write(thirdSensor); } } void establishContact() { while (Serial.available() <= 0) { Serial.print('A'); // send a capital A

Pag 187

MICROCONTROLADOR ATMEL

} }

delay(300);

/* Processing sketch to run with this example: // This example code is in the public domain. import processing.serial.*; int bgcolor; // Background color int fgcolor; // Fill color Serial myPort; // The serial port int[] serialInArray = new int[3]; // Where we'll put what we receive int serialCount = 0; // A count of how many bytes we receive int xpos, ypos; // Starting position of the ball boolean firstContact = false; // Whether we've heard from the microcontroller void setup() { size(256, 256); // Stage size noStroke(); // No border on the next thing drawn // Set the starting position of the ball (middle of the stage) xpos = width/2; ypos = height/2; // Print a list of the serial ports, for debugging purposes: println(Serial.list()); // I know that the first port in the serial list on my mac // is always my FTDI adaptor, so I open Serial.list()[0]. // On Windows machines, this generally opens COM1. // Open whatever port is the one you're using. String portName = Serial.list()[0]; myPort = new Serial(this, portName, 9600); } void draw() { background(bgcolor); fill(fgcolor); // Draw the shape ellipse(xpos, ypos, 20, 20); } void serialEvent(Serial myPort) { // read a byte from the serial port: int inByte = myPort.read(); // if this is the first byte received, and it's an A,

Pag 188

MICROCONTROLADOR ATMEL

// clear the serial buffer and note that you've // had first contact from the microcontroller. // Otherwise, add the incoming byte to the array: if (firstContact == false) { if (inByte == 'A') { myPort.clear(); // clear the serial port buffer firstContact = true; // you've had first contact from the microcontroller myPort.write('A'); // ask for more } } else { // Add the latest byte from the serial port to array: serialInArray[serialCount] = inByte; serialCount++; // If we have 3 bytes: if (serialCount > 2 ) { xpos = serialInArray[0]; ypos = serialInArray[1]; fgcolor = serialInArray[2]; // print the values (for debugging purposes only): println(xpos + "\t" + ypos + "\t" + fgcolor); // Send a capital A to request new sensor readings: myPort.write('A'); // Reset serialCount: serialCount = 0;

} } } */

Llamada y respuesta serie (handshaking) con salida codificada en ASCII. Un ejemplo de comunicacin basada en cadenas entre la Arduino y el ordenador utilizando un mtodo de llamada-respuesta (handshaking). Este programa enva una cadena ASCII para comenzar y la repite hasta que obtiene una respuesta desde el ordenador. Despus enva tres valores, obtenidos de sensores, codificados en ASCII, separados con comas y terminados por un fin de lnea con retorno de carro, y espera otra respuesta desde el ordenador. Puedes usar el monitor serie de Arduino para ver los datos enviados. Tambin pueden ser leidos por Processing (ver cdigo mas adelante), Flash, PD, Max/MSP (ver ejemplo mas adelante), etc. Los ejemplos siguientes dividen las cadenas de entrada con comas y convierten la cadena en nmeros otra vez. Compara esto con el ejemplo de llamada y respuesta serie. Son similares, ambos utilizan el mtodo del aptretn de manos (handshaking), pero este codifica las lecturas de los sensores como cadenas, mientras que el otro enva valores binarios. Mientras que

Pag 189

MICROCONTROLADOR ATMEL

enviar cadenas codificadas como ASCII consume ms bytes, lo cual significa que puedes enviar fcilmente valores mayores de 255 para cada lectura del sensor. Circuito. Entradas analgicas conectadas a los pines analgicos 0 y 1. Interruptor conectado a la E/S digital 2. Esquema.

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

Pag 190

MICROCONTROLADOR ATMEL

Code

/*
Serial Call and Response in ASCII Language: Wiring/Arduino This program sends an ASCII A (byte of value 65) on startup and repeats that until it gets some data in. Then it waits for a byte in the serial port, and sends three ASCII-encoded, comma-separated sensor values, truncated by a linefeed and carriage return, whenever it gets a byte in. Thanks to Greg Shakar and Scott Fitzgerald for the improvements The circuit: * potentiometers attached to analog inputs 0 and 1 * pushbutton attached to digital I/O 2

*/
int int int int firstSensor = 0; // first analog sensor secondSensor = 0; // second analog sensor thirdSensor = 0; // digital sensor inByte = 0; // incoming serial byte

void setup() { // start serial port at 9600 bps and wait for port to open: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for Leonardo only } pinMode(2, INPUT); // digital sensor is on digital pin 2 establishContact(); // send a byte to establish contact until receiver responds

void loop() { // if we get a valid byte, read analog ins: if (Serial.available() > 0) { // get incoming byte: inByte = Serial.read(); // read first analog input: firstSensor = analogRead(A0); // read second analog input: secondSensor = analogRead(A1); // read switch, map it to 0 or 255L thirdSensor = map(digitalRead(2), 0, 1, 0, 255); // send sensor values:

Pag 191

MICROCONTROLADOR ATMEL

Serial.print(firstSensor); Serial.print(","); Serial.print(secondSensor); Serial.print(","); Serial.println(thirdSensor);

void establishContact() { while (Serial.available() <= 0) { Serial.println("0,0,0"); // send an initial string delay(300); } } /* Processing code to run with this example: // This example code is in the public domain. import processing.serial.*; // import the Processing serial library Serial myPort; // The serial port float bgcolor; float fgcolor; float xpos, ypos; void setup() { size(640,480); // List all the available serial ports println(Serial.list()); // I know that the first port in the serial list on my mac // is always my Arduino module, so I open Serial.list()[0]. // Change the 0 to the appropriate number of the serial port // that your microcontroller is attached to. myPort = new Serial(this, Serial.list()[0], 9600); // read bytes into a buffer until you get a linefeed (ASCII 10): myPort.bufferUntil('\n'); // draw with smooth edges: smooth(); // Background color // Fill color // Starting position of the ball

void draw() { background(bgcolor);

Pag 192

MICROCONTROLADOR ATMEL

fill(fgcolor); // Draw the shape ellipse(xpos, ypos, 20, 20);

// serialEvent method is run automatically by the Processing applet // whenever the buffer reaches the byte value set in the bufferUntil() // method in the setup(): void serialEvent(Serial myPort) { // read the serial buffer: String myString = myPort.readStringUntil('\n'); // if you got any bytes other than the linefeed: myString = trim(myString); // split the string at the commas // and convert the sections into integers: int sensors[] = int(split(myString, ',')); // print out the values you got: for (int sensorNum = 0; sensorNum < sensors.length; sensorNum++) { print("Sensor " + sensorNum + ": " + sensors[sensorNum] + "\t"); } // add a linefeed after all the sensor values are printed: println(); if (sensors.length > 1) { xpos = map(sensors[0], 0,1023,0,width); ypos = map(sensors[1], 0,1023,0,height); fgcolor = sensors[2]; } // send a byte to ask for more data: myPort.write("A");

} */

Pag 193

MICROCONTROLADOR ATMEL

Solucin de problemas con el Arduino


Por qu no puedo subir mis programas a la placa Arduino? Hay algunas cosas que podran no estar bien. En primer lugar asegrate de que tu placa est encendida (el LED verde est encendido) y conectada al ordenador (si no es as, consulta la seccin "qu pasa si mi placa no se activa?"). A continuacin, comprueba que el puerto correcto se ha seleccionado en el men Tools > Serial Port (si el puerto no aparece, reinicia el IDE con la placa conectada al ordenador). Asegrate de que tiene el item correcto seleccionado en el men Tools>Board. En particular, las nuevas placas Arduino Duemilanove vienen con un ATmega328, mientras que las antiguas tienen un ATmega168. Para comprobarlo, lee el texto impreso sobre el microcontrolador (el chip ms grande) en tu placa Arduino. Para obtener ms informacin sobre los tems del men Board, consulta la Gua para el entorno Arduino. Desconecta los pines digitales 0 y 1, mientras que secarga el firmware (pueden conectarse y utilizarse despus de que el cdigo se haya subido). Trata de cargar con nada ms conectado a la placa (aparte del cable USB, por supuesto). Asegrate que la placa no toca nada metlico o conductor. Comprueba que no ests ejecutando ningn programa que escanee todos los puertos serie, como aplicaciones de sincronizacin de PDA, Bluetooth, controladores USB (por ejemplo, BlueSoleil), Virtual Daemon Tools, etc Asegrate de que no tienes un software de firewall que bloquee el acceso al puerto serie (por ejemplo ZoneAlarm). Es posible que debas salir de Processing, PD, vvvv, etc, si los ests utilizando para leer datos a travs de la conexin USB o serie a la placa Arduino. Si tienes una placa que no es compatible con auto-reset, asegrate de que reinicias la placa un par de segundos antes de cargar. (Arduino Diecimila, Duemilanove, Mega, y Nano soportan auto-reset al igual que LilyPad, Pro y Pro Mini con conector de programacin de 6-pines). Sin embargo, ten en cuenta que algunos Diecimila fueron programados accidentalmente con el bootloader incorrecto y tal vez requieran volver a presionar el botn de reset fsico antes de cargar, ver ms sobreesta cuestin ms adelante. Sin embargo, en algunos equipos, es posible que tengas que pulsar el botn de reset en la placa despus de clicar el botn de descarga en el entorno Arduino. Pruebe diferentes intervalos de tiempo entre los dos, hasta 10 segundos o ms. sto sucede con ordenadores antiguos o que ejecutan muchos procesos en paralelo.

Pag 194

MICROCONTROLADOR ATMEL

Si recibes este error: [VP 1] device is not responding correctly. Intenta cargar el programa otra vez (es decir, resetea la placa y pulse el botn de descarga por segunda vez). Asegrate de que hay un bootloader en la placa Arduino. Para comprobarlo, conectar un LED al pin 13 (Arduino Duemilanove, Diecmila y Mega tienen un LED marcado con L que ya est conectado al pin 13) y resetea la placa. El LED debe parpadear. Si no es as, consulta la pgina del bootloader para obtener instrucciones sobre la grabacin de un bootloader en la placa. Si tienes una placa Arduino muy antigua, puede que tengas que cambiar la velocidad de transmisin de carga de sketches a 9.600 (19.200 es lo normal, o 57.600 para Arduino Mega). Tendrs que cambiar la velocidad en el archivo preferences directamente. Ver la pgina sobre el fichero de preferencias para obtener instrucciones sobre cmo encontrarlo. Bscalo en tu equipo y cambia la propiedad serial.download_rate para que coincida con la de tu placa. Lo dicho, si tu placa es muy antigua (Arduino NG o anterior), se recomienda que actualices al ltimo bootloader (que funciona a 19.200 baudios). Esto se puede hacer con el men Tools > Burn Bootloader por medio de un programador de hardware externo. Si an as no funciona, puedes pedir ayuda en el foro. Por favor incluye la siguiente informacin: Tu sistema operativo. Qu tipo de placa es la que tienes? Si se trata de un Mini, LilyPad u opcin que requiera cableado adicional, incluye una foto de tu circuito, si es posible. Independientemente de si fuiste capaz alguna vez de cargar software a la tarjeta. Qu estabas haciendo con la tarjeta antes / cuando dej de trabajar, y que paquete de software has aadido o eliminado de tu ordenador? Los mensajes que aparecen cuando se intenta cargar con salida detallada habilitada. Para ello, presiona la tecla Mays mientras haces click en el botn de subida en la barra de herramientas. Porqu aparece "Build folder disappeared or could not be written" (Mac OS X)? Esto se produce por una instalacin defectuosa del software en tu Mac. Arrastraste la aplicacin Arduino.app al instalar al icono de disco (y en, por ejemplo, la carpeta de Aplicaciones)? Si no lo hiciste, no sers capaz de cargar los ejemplos, ya que el programa no ser capaz de localizarlos. Actualizacin Mac Porqu el software de Arduino no se ejecuta despus haber actualizado el Java en mi Mac? (Arduino 0016) La ltima actualizacin de Java de Apple intenta utilizar la versin de 64 bits de las bibliotecas nativas, pero la aplicacin Arduino viene con una versin de 32 bits de la biblioteca RXTX. Si inicia Arduino, obtendrs un error como: @ @ Uncaught exception in main method: java.lang.UnsatisfiedLinkError: /Applications/arduino-0016/Arduino 16.app/Contents/Resources/Java/librxtxSerial.jnilib: no suitable image found. Did find: /Applications/arduino-0016/Arduino

Pag 195

MICROCONTROLADOR ATMEL

16.app/Contents/Resources/Java/librxtxSerial.jnilib: no matching architecture in universal wrapper @ @ Para solucionar este problema, haz click en la aplicacin Arduino (por ejemplo,Arduino 16.app) en el Finder y selecciona Obtener Informacin de la casilla Archivo del men. En el panel de informacin, haz click en la casilla Abrir en modo 32 bits. A continuacin, deberas ser capaz de ejecutar Arduino normalmente. # StackOverflow

Por qu aparece un java.lang.StackOverflowError cuando intento compilar mi programa? El entorno de desarrollo hace algunas transformaciones en el sketch de Arduino manipulando el cdigo utilizando expresiones regulares. Esto a veces se confunde con ciertas cadenas de texto. Si aparece un error como: java.lang.StackOverflowError at java.util.Vector.addElement(Unknown Source) at java.util.Stack.push(Unknown Source) at com.oroinc.text.regex.Perl5Matcher._pushState(Perl5Matcher.java) esto es lo que est pasando. Puedes buscar secuencias inusuales que supongan "comillas dobles", "comilla simple", las barras invertidas \, comentarios, etc, en particular la secuencia '\ "' parece ser la causa problemas, se recomienda el uso de '"' en su lugar. Alimentacin Externa Porqu no arranca mi sketch cuando estoy alimentando la tarjeta con una fuente de alimentacin externa? (Arduino Diecimila o anterior) Hay una serie de tarjetas Arduino antiguas (unas 1000) que presentan el problema de tener una versin del bootloader que tiene el pin RX sin conectar la resistencia de pullup interna. Esto produce que, en ocasiones, el bootloader piense que est recibiendo un nuevo programa, si bien se trata slo de datos aleatorios. Esto se puede solucionar actualizando el bootloader a la ltima versin o conectando el pin RX con una resistencia de 10K a tierra. Porqu se congela Arduino cuando intento cargar un programa? (En Windows)? Esto podra ser causado por un conflicto con el proceso de Logitech LVPrcSrv.exe, que es un programa residente en tu ordenador. Abre el Administrador de tareas y comprueba si este programa se est ejecutando, y si es as, cierra ese proceso antes de intentar subir ms datos a la placa [ ms informacin ]. Alimentacin Qu pasa si mi tarjeta no se enciende (el LED verde no se enciende)? Si ests utilizando una tarjeta USB Diecimila o NG, asegrate de que el puente (pieza de plstico pequea cerca del conector USB) es en los pines correctos. Si tienes la certeza que tu placa recibe alimentacin al usar una fuente de alimentacin externa (conectado a la clavija de red), el puente debe ser ms cercano a los dos pines para el cable de alimentacin. Si, por el contrario, alimentas tu placa a travs del puerto USB, el puente debe estar en los dos pines ms cercanos a los conectores USB. Esta foto muestra la disposicin para la alimentacin de la placa del puerto USB. Attach: jumper.jpg

Pag 196

MICROCONTROLADOR ATMEL

Bootloader equivocado Porqu mi Diecimila necesita tanto tiempo (6-8 segundos) para iniciar mi sketch? Algunas de las placas de Arduino Diecimila (unas 1000) salieron de fbrica accidentalmente con el bootloader Arduino NG, este es un error que en ningn caso debiera manifestarse en placas Arduino posteriores al ao 2008. En cualquier caso, tu placa funciona bien, pero requiere hacer reset manual de la placa al subir un sketch y necesita de ese tiempo de espera. Se puede reconocer el bootloader NG porqu el LED en el pin 13 parpadear tres veces al efectuar presionar el botn de reset en la placa (el bootloader de la Diecimila slo parpadear una vez). Puede el bootloader correcto en su Diecimila, consulte la pgina del bootloader para ms detalles. Inicio Qu debo hacer si me da un error al lanzar arduino.exe en Windows? Si obtienes un error al hacer doble click en el ejecutable arduino.exe en Windows, por ejemplo: @ @ Arduino has encountered a problem and needs to close. @ @ tendrs que poner en marcha Arduino utilizando el archivo run.bat situado en la misma carpeta. Por favor, ten paciencia, el entorno Arduino puede tomar algn tiempo para abrir segn la configuracin de tu ordenador. Porqu no se ejecuta Arduino en las versiones anteriores de Mac OSX? Si obtienes un error como este: Link (dyld) error: dyld: / Applications/arduino-0004/Arduino 04.app/Contents/MacOS/Arduino smbolos Indefinido: / Applications/arduino-0004/librxtxSerial.jnilib undefined referencia a _printf $ LDBL128 espera que est definido en / usr / lib / libSystem.B.dylib es probable que necesites actualizar a Mac OSX 10.3.9 o posterior. Las versiones anteriores tienen versiones incompatibles de algunas libreras del sistema. Qu hago si me da un error "UnsatisfiedLinkError ( librxtxSerial.jnilib native library )" al lanzar Arduino? Si obtienes un error como este al iniciar Arduino: @ @ Uncaught exception in main method: java.lang.UnsatisfiedLinkError: Native Library /Users/anu/Desktop/arduino-0002/librxtxSerial.jnilib already loaded in another classloader @ @ es probable que tengas una versin antigua de la biblioteca de comunicaciones en tu ordenador. Busca comm.jar, jcl.jar o en / System / Library / Frameworks / JavaVM.framework / o en los directorios del CLASSPATH o variables de entorno PATH. Qu pasa con el error "No se pudo encontrar la clase principal."? Si recibe este error al lanzar Arduino: @ @ JJava Virtual Machine Launcher: Could not find the main class. Program will exit. @ @

Pag 197

MICROCONTROLADOR ATMEL

asegrate de que descomprimiste correctamente el contenido del fichero Arduino.zip en particular, que el directorio lib est dentro del directorio Arduino y contiene el archivo pde.jar. Qu puedo hacer al respecto de conflictos con cygwin en Windows? Si ya tienes cygwin instalado en tu mquina, podras obtener un error como este al intentar compilar un sketch en Arduino: @ @ [main] ? (3512) C:\Dev\arduino-0006\tools\avr\bin\avr-gcc.exe: *** fatal error C:\Dev\arduino-0006\tools\avr\bin\avr-gcc.exe: *** system shared memory version mismatch detected - 0x75BE0084/0x75BE009C. This problem is probably due to using incompatible versions of the cygwin DLL. Search for cygwin1.dll using the Windows Start->Find/Search facility and delete all but the most recent version. The most recent version *should* reside in x:\cygwin\bin, where 'x' is the drive on which you have installed the cygwin distribution. Rebooting is also suggested if you are unable to find another cygwin DLL. @ @ Si es as, primero asegrate de que no tienes cygwin en ejecucin cuando se utiliza Arduino. Si esto no funciona, puedes intentar eliminar las libreras cygwin1.dll del directorio Arduino y cambiarlas por cygwin1.dll de tu instalacin existente de cygwin (probablemente en c: \ cygwin \ bin). Porqu tardan el software Arduino y/o el men Herramientas mucho tiempo en abrir (en Windows)? Si el software Arduino tarda mucho tiempo en ponerse en marcha y parece bloquearse al intentar abrir el men Herramientas, existe un conflicto con otro dispositivo en su sistema. El software de Arduino, al arrancar y al abrir el men Tools, trata de obtener una lista de todos los puertos COM de tu ordenador. Es posible que un puerto COM creado por uno de los dispositivos de tu equipo ralentice este proceso. Echa un vistazo en el Administrador de dispositivos. Intenta desactivar los dispositivos que usan los otros puertos COM (por ejemplo, dispositivos Bluetooth). Puerto Serie Porqu no mi no aparece mi placa en el men Tools | Serial Port? Si ests usando una placa USB Arduino, asegrate de instalar los drivers FTDI (vase el link de instalacin para instrucciones). Si ests utilizando un adaptador de USB a serie con una placa serie, asegrate de instalar los drivers correspondientes. Asegrate de que la tarjeta est conectada: el men del puerto serie se actualiza cada vez que abres la casilla Tools del men, as que si acabas de desenchufar la placa, no estar en el men. Comprueba que no ests ejecutando ningn programa que escanea todos los puertos serie, como aplicaciones de sincronizacin de PDA, Bluetooth controladores USB (por ejemplo, BlueSoleil), etc En Windows, el puerto COM asignado a la placa puede ser uno de cdigo muy alto. En ocasiones se recomienda probar a cambiar el nmero asignado al chip FTDI por uno ms bajo. Tal y cmo comenta Zeveland: "Tuve un montn de puertos virtuales COM creados para Bluetooth por lo que la placa estaba configurada para utilizar COM17. El IDE no fue capaz de encontrarla de modo que suprim los otros puertos virtuales en el Panel de control (en XP) y traslad el puerto asignado al chip FTDI de Arduino a otro ms bajo, en concreto el COM2.

Pag 198

MICROCONTROLADOR ATMEL

Asegrate de configurar el IDE de Arduino para utilizar el nuevo puerto y buena suerte. " En Mac, si tienes una versin antigua de los controladores de FTDI, puede ser necesario borrarlos y reinstalar la ltima versin. Mas informacin en esta conversacin del foro para instrucciones en cmo proceder (gracias a GCK). Qu pasa si recibo una "gnu.io.PortInUseException" al cargar cdigo o utilizando el monitor de serie (en Mac)? Error inside Serial.<init>() gnu.io.PortInUseException: Unknown Application at gnu.io.CommPortIdentifier.open(CommPortIdentifier.java:354) at processing.app.Serial.<init>(Serial.java:127) at processing.app.Serial.<init>(Serial.java:72) Esto probablemente significa que el puerto est actualmente en uso por otra aplicacin. Por favor, asegrate de que no ests ejecutando otros programas con acceso al puerto serie o puertos USB de tu placa, como la aplicacin de sincronizacin de PDA, los administradores de dispositivos bluetooth, ciertos servidores de seguridad, etc. Adems, ten en cuenta que algunos programas (por ejemplo, Max/MSP o Puredata) mantienen el puerto serie abierto, incluso cuando no los usas - puedes necesitar cerrar todos los parches que usan el puerto serie o salir de la aplicacin por completo. Si obtienes este error con Arduino 0004 o anterior, debieras actualizar a la ltima versin. Tengo problemas con los controladores USB FTDI. Intenta instalar los controladores ms recientes de FTDI o ponte en contacto con su grupo de soporte en support1@ftdichip.com. Arranque Sketch Porqu no arraca mi sketch al encender o reiniciar la placa Arduino? Lo ms probable es que alguna aplicacin est enviando datos en serie a tu placa al arrancar. Durante los primeros segundos, el bootloader (que viene pregrabado en tu placa) escucha la llegada de datos desde el ordenador. Despus de unos segundos sin comunicacin, el bootloader inicia el sketch que ya est en la placa. Si contina el envo de datos hacia el bootloader, nunca se determinar el final de ejecucin del bootloader y tu sketch no arrancar. Tendrs que encontrar una manera de cesar el envo de datos serie a la placa durante el tiempo que esta necesita para arrancar o grabar tu sketch en la placa con un programador externo, que sustituya al bootloader. Porqu mi sketch parece que carga correctamente, pero no hace nada? Es posible que hayas seleccionado tu placa apropiadamente, pero con la opcin de microcontrolador equivocado. Asegrate de que el microcontrolador corresponde al de tu placa (ya sea Atmega8, ATmega168, ATmega328, o ATmega1280) - el nombre est escrito en el ms grande de los chips en la placa. Comprueba si usas una fuente de alimentacin ruidosa. Esto podra causar al chip perder su sketch. Por otra parte, el sketch puede ser demasiado grande para la tarjeta. Al subir tu sketch, Arduino 0004 y posteriores comprueban si es demasiado grande para el ATmega8, pero

Pag 199

MICROCONTROLADOR ATMEL

basa su clculo en un bootloader de 1 Kb. Podras tener bootloaders de mayor tamao (p.ej. 2 Kb de los 8 Kb disponibles en tu placa). Si empleas placas Arduino oficiales, este problema no se presentar. Si tienes acceso a un AVR-ISP, AVR-ISP-MKII, el programador de puerto paralelo, o cualquier otro dispositivo externo de programacin de chips de la marca Atmel, puedes grabar la ltima versin del bootloader desde el men Tools | Burn Bootloader. De lo contrario, puedes determinar en el entorno Arduino la cantidad de espacio disponible para tus programas editando la variable upload.maximum_size en su archivo de preferencias (ver: instrucciones sobre cmo encontrar el archivo?). Tamao Cmo puedo reducir el tamao de mi sketch? Los chips ATmega en la placa Arduino son barato, pero tienen limitaciones en el espacio reservado para tus programas: 7Kb para el ATmega8, 14Kb para el ATmega168 y ATmega328, y 124Kb para el ATmega1280 (el resto del espacio es usado por el bootloader). Por ejemplo, un truco consiste en limitar que libreras usas. Si ests utilizando operaciones en coma flotante, trata de reescribir el cdigo para usar nmeros enteros, lo que debera ahorrar cerca de 2 Kb. Elimine los# include declaraciones en la parte superior de tu programa para eliminar las bibliotecas que no ests usando. Tambin puedes tratar de hacer tu programa ms corto. En cualquier caso, desde Arduino trabajamos para reducir el tamao del ncleo de Arduino para dejar ms espacio para tus programas. Porqu no puedo obtener un PWM (una salida analgica) cuando llamo analogWrite () en los otros pines que 3, 5, 6, 9, 10 o 11? (Arduino Duemilanove y Diecimila) El microcontrolador de la placa Arduino Duemilanove (ATmega328) y Diecimila (ATmega168) slo es compatible con PWM / analogWrite () en los pines determinados. Llamadas analogWrite () en las patas otro dar alto (5 voltios) para valores mayores de 128 y bajo (0 voltios) para valores inferiores a 128. (Ntese que placas Arduino antiguas con Atmega8 slo trabajan con salida PWM en los pines 9, 10 y 11.) Por qu recibo errores acerca de funciones o tipos no declaradas? El entorno Arduino intenta generar automticamente prototipos de sus funciones, de modo que puedas llamarlos a tu gusto en tus programas. Este proceso, sin embargo, no es perfecto, y en ocasiones produce mensajes de error. Si declaras un tipo personalizado en el cdigo y creas una funcin que acepte o devuelva valores de ese tipo, obtendrs un error al intentar compilar el sketch. Esto se debe a que el prototipo automtico para esa funcin aparecer sobre la definicin de tipo. Si declaras una funcin con un tipo de retorno de dos palabras (por ejemplo, "unsigned int"), el entorno no se dar cuenta de que es una funcin y no crear un prototipo para ello. Eso significa que debes proporcionar tu propia definicin, o colocar la definicin de la funcin por encima de cualquier llamada a la misma.

Pag 200

MICROCONTROLADOR ATMEL

Por qu recibo errores sobre un dispositivo de firma no vlida cuando se trata de subir un sketch? Si obtienes un error como: avrdude: Yikes! Invalid device signature. Double check connections and try again, or use -F to override this check. Puede significar una de dos cosas. Bien seleccionaste la placa equivocada en el men Tools > Board o no ests usando la versin correcta de avrdude. Arduino utiliza una versin ligeramente modificada de avrdude para subir programas a la placa Arduino. La versin estndar consulta la firma del dispositivo en un modo que el bootloader no es capaz de comprender. Asegrate de que ests utilizando la versin de avrdude que viene con Arduino

Pag 201

VIN +5V
1 8

RN1A 10K

CMP 10K 7 RN1B 2


3

U5A
1

L13
8

X1 POWERSUPPLY_DC21MMX

U1 NCP1117ST50T3G VIN D1 M7 PC1 47u


3 IN OUT 4 2

+5V +5V PC2 C2 47u 100n


+

1K

GATE_CMD

LMV358IDGKR

SCK

5 6

U5B
7

L YELLOW RN2A

C1 100n

+3V3

PWRIN

LMV358IDGKR

GND

GND

+5V USBVCC T1 FDN340P +5V


1 3 2 IN ON/OFF GND NC/FB 4

GND GND GND OUT 5 +3V3 C3 1u +5V


RESET

GND +5V

GND

GND

+3V3 GND GND VIN 2x2 M - NM

1 2 3 4 5 6 7 8

4 3

5 6

RN4D 1K RN4C 1K

+5V ICSP1 CD1206-S01575 MISO2 SCK2 RESET2


1 3 5 2 4 6

4 2

GND JP2
3 1

8x1F-H8.5 GND

CD1206-S01575 TS42031-160R-TR-7260 RESET

MOSI2 10K 6 RN1C 3 D3

GND ICSP
1 3 5 2 4 6

+5V C4 100n GND AREF GND 10x1F-H8.5 SCL AD5/SCL10 SDA AD4/SDA 9 SCK MISO MOSI SS SS IO9 IO8 AD5/SCL AD4/SDA AD3 AD2 AD1 AD0 IO7 IO6 IO5 IO4 IO3 IO2 IO1 IO0
8 7 6 5 4 3 2 1

3x2 M GND F1

100n

RN1D 10K D2

U3
24 (PCINT7/OC0A/OC1C)PB7 (PCINT6)PB6 RESET(PC1/DW) (PCINT5)PB5 (T1/PCINT4)PB4 (PD0/MISO/PCINT3)PB3 XTAL2(PC0) (PDI/MOSI/PCINT2)PB2 (SCLK/PCINT1)PB1 XTAL1 (SS/PCINT0)PB0 AVCC VCC GND UCAP UVCC DD+ UGND PAD (INT4/ICP1/CLK0)PC7 (OC1A/PCINT8)PC6 (PCINT9/OC1B)PC5 (PCINT10)PC4 (AIN2/PCINT11)PC2 (CTS/HWB/AIN6/TO/INT7)PD7 (RTS/AIN5/INT6)PD6 (XCK/AIN4/PCINT12)PD5 (INT5/AIN3)PD4 (TXD1/INT3)PD3 (RXD1/AIN1/INT2)PD2 (AIN0/INT1)PD1 (OC0B/INT0)PD0 21 PB7 20 PB6 19 PB5 18 PB4 17 MISO2 16 MOSI2 15 SCK2 14

RESET-EN 2 +5V
5

4 3

5 2 1

C5

3x2 M

GND

POWER

GREEN ON

C11 C9 22p 22p

DTR

16MHz

Y1

USB-B_TH X2
1 2 3 4

USB

XUSB

CG0603MLC-05E Z2

CG0603MLC-05E

USBVCC MF-MSMF050-2 500mA 22R 8 RN3A 1 DRDD+ 22R 5 RN3D 4 RD+

RESET2 XT2

ZU4
RESET XTAL2 XTAL1 AREF AVCC AGND VCC GND (SCK)PB5 (MISO)PB4 (MOSI)PB3 (SS)PB2 (OC1)PB1 (ICP)PB0 (ADC5)PC5 (ADC4)PC4 (ADC3)PC3 (ADC2)PC2 (ADC1)PC1 (ADC0)PC0) (AIN1)PD7 (AIN0)PD6 (T1)PD5 (T0)PD4 (INT1)PD3 (INT0)PD2 (TXD)PD1 (RXD)PD0 19 18 17 16 15 14 28 27 26 25 24 23 13 12 11 6 5 4 3 2

RESET GND XTAL2

GND

2 1

R1 1M
2

P$2 P$1

XT1

XT1
32 4 3

+5V

USB boot En 1K 5 RN2D 4

22 23 25 26 5 13 12 11 TXLED 10 RXLED 9 M8RXD 8 M8TXD 7 6

P$2 P$1

UGND

10 R2 1M 9 XTAL1 CSTCE16M0V53-R0 16MHZ AREF 21

13 12 11 10 9 8

IOH 6x1F-H8.5
6 5 4 3 2 1 2 3 7 6

Z1

+5V C6 100n +5V 1K 6 RN2C 3 TX YELLOW


7

20 22 7 8

RN3B 22R RN3C 22R

GND

USHIELD BLM21 100n C7 C8 1u

TP_VUCAP USBVCC RDRD+ UGND


2 1

27 31 30 29 28 33

AD 8x1F-H8.5
8 7 6 5 4 3 2 1

GND

GND

GROUND GND

ATMEGA16U2-MU(R) RX YELLOW

RN2B
2

1K

M8RXD M8TXD

ATMEGA328P-PU 1K 7 RN4B 2 1K 8 RN4A 1

7 6 5 4 3 2 1 0

L1

IOL

Arduino(TM) UNO Rev3

RESET TS42

SCK MISO GND +5V


1 3 5 2 4 6
3 4

MOSI

RESET

+5V
CD1206-S01575

C1
RN1D 10K

3x2M_NM

ICSP

ICSP

1 2 5

C2 100n +5V U1
34 43 13 16 17 44 24 42 14 15 23 35 6 2 3 4 5 7 VCC1 GND3 RESET XTAL2 XTAL1 AVCC1 AVCC AREF VCC GND GND1 GND2 UCAP UVCC DD+ UGND VBUS (PCINT7/OC0A/OC1C/#RTS)PB7 (PCINT6/OC1B/OC4B/ADC13)PB6 (PCINT5/OC1A/#OC4B/ADC12)PB5 (ADC11/PCINT4)PB4 (PD0/MISO/PCINT3)PB3 (PDI/MOSI/PCINT2)PB2 (SCLK/PCINT1)PB1 (SS/PCINT0)PB0 (ICP3/CLK0/OC4A)PC7 (OC3A/#0C4A)PC6 (INT6/AIN0)PE6 (#HWB)PE2 (T0/OC4D/ADC10)PD7 (T1/#OC4D/ADC9)PD6 (XCK1/#CTS)PD5 (ICP1/ADC8)PD4 (TXD1/INT3)PD3 (RXD1/AIN1/INT2)PD2 (SDA/INT1)PD1 (OC0B/SCL/INT0)PD0 (ADC7/TDI)PF7 (ADC6/TDO)PF6 (ADC5/TMS)PF5 (ADC4/TCK)PF4 EXP PAD (ADC1)PF1 (ADC0)PF0 12 30 29 28 11 10 9 8 32 31 1 33 27 26 22 25 21 20 19 18 36 37 38 39 40 41

D2

100n

U2 IO11* IO10* IO9* IO8 MISO MOSI SCK RXLED IO13* D5* D7 HWB D6* IO12 TXLED D4 D1/TX D0/RX D2/SDA D3/SCL A0 A1 A2 A3 GND P$1 A4 A5 GND ATMEGA32U4-XUAU
PAD (ADC1)PF1 (ADC0)PF0

IO ALT1
(PCINT7/OC0A/OC1C/#RTS)PB7 (PCINT6/OC1B/OC4B/ADC13)PB6 (PCINT5/OC1A/#OC4B/ADC12)PB5 (ADC11/PCINT4)PB4 (PD0/MISO/PCINT3)PB3 (PDI/MOSI/PCINT2)PB2 (SCLK/PCINT1)PB1 (SS/PCINT0)PB0 (ICP3/CLK0/OC4A)PC7 (OC3A/#0C4A)PC6 (INT6/AIN0)PE6 (#HWB)PE2 (T0/OC4D/ADC10)PD7 (T1/#OC4D/ADC9)PD6 (XCK1/#CTS)PD5 (ICP1/ADC8)PD4 (TXD1/INT3)PD3 (RXD1/AIN1/INT2)PD2 (SDA/INT1)PD1 (OC0B/SCL/INT0)PD0 (ADC7/TDI)PF7 (ADC6/TDO)PF6 (ADC5/TMS)PF5 (ADC4/TCK)PF4 12 30 29 28 11 10 9 8 32 31 1 33 27 26 22 25 21 20 19 18 36 37 38 39 40 41

ALT2
+A11 +A10 +A9

ALT3
+PWM COMPL IO10

AGND

22p

C3

+5V 34 AGND 43 RESET13 XTAL2 16 XTAL1 17 AVCC 44


24

GND

RESET Y1

VCC1 GND3 RESET XTAL2 XTAL1 AVCC1 AVCC AREF VCC GND GND1 GND2 UCAP UVCC DD+ UGND VBUS

XTAL2 XTAL1 L1 AVCC MH2029-300Y AREF


GND

GND

R1 1M 16MHz KX-7

IO11* IO10* IO9* IO8 MISO MOSI SCK RXLED IO13* D5* D7 HWB D6* IO12 TXLED D4 D1/TX D0/RX D2/SDA D3/SCL A0 A1 A2 A3 A4 A5

IO11*
IO10* IO9* IO8 MISO MOSI SCK

11# 10# 9# 8

#PWM 8/16bit #PWM 16bit #PWM 16bit

TO ICSP
13
GND

22p

C4

IO13*
USB boot En 10K 6 RN1C 3

#PWM 10bit

C5 100n
GND

1uF C6
AGND

C7 1uF UGND

UCAP RDRD+ VUSB

GND

AREF 42 +5V 14 GND 15 GND 23 GND 35 UCAP 6 2 +5V 3 RDRD+ 4 UGND 5 VUSB 7

12
D7 D6* D5* D4 D3/SCL D2/SDA D1/TX D0/RX

+A7 +AIN0

PWM 16bit COMPL D6

7 6# 5# 4 3# 2 1 0

#PWM Hi-Speed +A8 #PWM Hi-Speed


+A6

#PWM 8bit

AGND

R2 NM
GND

R3 NM
UGND

VUSB GND

GND GND UGND

ATMEGA32U4-XUMU

IO13*
13 12 11 10 9 8
10x1F-H8.5

3 2

IC2A
1

USB
XUSB J1 GND S1
S2 S3 S4 S5 S6 VBUS SH1 DSH2 D+ SH3 ID SH4 GND SH5 SH6 P1 XUSB P2 DP3 D+ P4 USBID P5 5 8 4 1

VUSB MF-MSMF050-2 500mA RDRD+

8x1F-H8.5

F1

NOT USED
2 6 7 3

LMV358IDGKR
7 6 5 4 3 2 1 0

ORIGIN

LL
8 7 6 5 4 3 2 1

JP1

10 9 8 7 6 5 4 3 2 1

RN3B 22R 22R RN3C IC1


3 IN OUT 4 2

22R RN3D 22R RN3A VUSB

D3/SCL D2/SDA

D7 D6* D5* D4 D3/SCL D2/SDA D1/TX D0/RX

J2

IO13* IO12 IO11* IO10* IO9* IO8

+5V

1K 7 RN2B 2

AREF GND

1K 6 RN2C 3

1K 5 RN2D 4

RN2A RX Yellow

GND

CG0603MLC-05E Z2

CG0603MLC-05E

L Yellow

RFU IOREF RESET +3V3

VIN

Z1

C9 GND GND

VIN GND

J3

8x1F-H8.5

6x1F-H8.5

J4

C10 10u GND +5V

+5V

GND TXLED RXLED GND


6 5 4 3 2 1

GND GND
+

C12 10u

+5V

10K 8 RN1A 1

VIN

+5V AUTO SELECTOR


CMP +3V3
RN1B 10K
5 6

IC2B
7

+5V GATE_CMD +3V3


1 3 IN ON/OFF GND NC/FB 4 OUT 5

GND

LMV358IDGKR C22 100n VUSB

C13 100n
4

C14 1u

T1 FDN340P

GND

GND

C11 GND 1u GND

GND

1 2 3 4 5 6 7 8

ON Green

D1 M7

C8 10u

100n

A5 A4 A3 A2 A1 A0

UGND

VIN

GND

TX Yellow

L2

+5V

1K

USB MICRO MH2029-300Y GND UGND

EXTPOWER POWERSUPPLY_DC21MMX

NCP1117ST50T3G

+3V3

+3V3

+3V3

10n C20
5 4

L1 MH2029-300Y VDDANA
MASTER-RESET

RESET TS42

GND

RN3D 1k GREEN ON YELLOW L

L2 MH2029-300Y VDDOUTMI
+

GND

1 2

L13

RN1C 100K

100K 6 RN2C 3

100K 7 RN2B 2

LMV358IDGKR

1k RN3C
+3V3
7

100K 7 RN1B 2

+3V3

RN3B 1k TX YELLOW

JR1 0R L3 MH2029-300Y AREF 100n C34 GND


+3V3

10u C11

100n C12

100n C13

100n C14

100n C15

100n C16

100n C17

CONNECT RXL

RX RN3A 1k YELLOW

1 3 5 7 9

JTAG

2 4 6 8 10

GND

100K 8 RN1A 1

100K 8 RN2A 1

100K 5 RN2D 4

CONNECT TXL

GND

VDDOUT

RN1D 100K

10u C1

100n C18

100n C4

100n C5

100n C6

100n C7

100n C8

100n C9

10u C2

100n C10

10u C3

+3V3

1 2 5

PWM13 3

IC1A

3 4

JTAG_TMS JTAG_TCK JTAG_TDO JTAG_TDI JTAG_RESET +5V

R1 0R

MASTER-RESET

AVREF 100n C19 GND


47 MASTER-RESET 69 N.C. - internal pullup

GND L5 MH2029-300Y VDDPLL


VDDOUT

GND
+

SPI
2 4 6

100n C32 GND

10u C33

1 MISO 3 SPCK MASTER-RESET 5

MOSI GND

VDDOUTMI VDDANA
AVREF

3x2M 18x2F-H8.5 VDDPLL PWMH SCL1 SDA1 AREF GND PWM13 PWM12 PWM11 SS0/PWM10 PWM9 PWM8
10 9 8 7 6 5 4 3 2 1

R4

XUSB C21 22p


GND GND GND
39

100K

GND

GND

+3V3 53 51 49 47 45 43 41 39 37 35 33 31 29 27 25 23 CANTX1/IO PIN51 PIN49 PIN47 PIN45 PIN43 PIN41 PIN39 PIN37 PIN35 PIN33 PIN31 PIN29 PIN27 PIN25 PIN23

TWCK0 TWD0

NRSTB NRST

VDDANA VDDBU VDDUTMI

VDDOUT VDDPLL

VDDIN VDDIO1 VDDIO2 VDDIO3 VDDIO4

VDDCORE1 VDDCORE2 VDDCORE3 VDDCORE4 VDDCORE5

GNDANA GNDPLL GNDBU GNDUTMI

FWUP SHDN

VBUS

JTAGSEL

ADVREF

C22 22p C23 22pF_NM

51 35 36 49 48

TST XOUT XIN

0R_NM XOUT XIN XOUT32

GND1 GND2 GND3 GND4 PD10 PD9 PD8 PD7 PD6 PD5 PD4 PD3 PD2 PD1 PD0 PC30 PC29 PC28 PC27 PC26 PC25 PC24 PC23 PC22 PC21 PC20 PC19 PC18 PC17 PC16 PC15 PC14 PC13 PC12 PC11 PC10 PC9 PC8 PC7 PC6 PC5 PC4 PC3 PC2 PC1 PC0

12 58 106 126 32 22 21 20 19 18 17 16 15 14 13 103 102 139 138 137 136 135 134 133 132 131 101 100 99 98 97 96 95 94 93 117 67 66 65 64 63 116 60 59 55 130

GND

Y1 12MHz KX-7 20pF

GND

AREF 13 12 11 10 ETH-CS 9 8

R8

XOUT32 XIN32 DHSDM DFSDM DHSDP DFSDP VBG

GND

C24 22pF_NM

Y2 32.768Khz XIN32

DD+ VBG

R5 39R 1% R6 39R 1%

38 43 37 42 40

10n C26

R7 6k8 1%
GND

22p C25 GND CANTX0 23 CANRX0 24 85 AD7 84 AD6 83 AD5 EEXTINT 25 82 AD4 26 PIN31 27 RX 2 TX 3 RXD2 4 TXD2 5 RXD1 6 TXD1 7 PIN23 8 PIN24 78 AD0 9 SDA1 70 SCL1 71 PIN42 72 PIN43 107 TXL 81 AD3 80 AD2 79 AD1 108 MISO 109 MOSI 110 SPCK SS0/PWM10 111 SS1/PWM4 112
PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 PA8 PA9 PA10 PA11 PA12 PA13 PA14 PA15 PA16 PA17 PA18 PA19 PA20 PA21 PA22 PA23 PA24 PA25 PA26 PA27 PA28 PA29

PIN32 PIN30 PWM12 PWM11 PIN29 RXD0 TXD0 PIN28 PIN27 PIN26 PIN25 RXL SS0/PWM10 PWM3 SS1/PWM4 PWM5 PWM6 PWM7 PWM8 PWM9 PIN44 PIN45 PIN46 PIN47 PIN48 PIN49 PIN50 PIN51 PIN41 PIN40 PIN39 PIN38 PIN37 PIN36 PIN35 PIN34 PIN33 ERASE +3V3

10x1F-H8.5 PWML PWM7 PWM6 PWM5 SS1/PWM4 PWM3 PWM2 TX RX


8 7 6 5 4 3 2 1

7 6 5 TWI pullups 4 SD-CS 3 2 1 UTXD 0 URXD

36 34 32 30 28 26 24 22 20 18 16 14 12 10 8 6 4 2

35 33 31 29 27 25 23 21 19 17 15 13 11 9 7 5 3 1

+5V+3V3 52 50 48 46 44 42 40 38 36 34 32 30 28 26 24 22 POWER MASTER-RESET


1 2 3 4 5 6 7 8

AD14(RXD3) PIN50 PIN48 PIN46 PIN44 PIN42 PIN40 PIN38 PIN36 PIN34 PIN32 PIN30 PIN28 PIN26 PIN24 PIN22 +5V

53 50 N.C.

57 11 62 105 125

73 52 41

10 45 61 104 124

56 34

46

74 33 54 44

75

IOREF

VIN GND

8x1F-H8.5

XIO

XUSB

USB AB
USB1
VUSB DD+ ID UGND SH1 SH2 SH3 SH4 G1 G2 G3 G4 G5 G6 G7 G8 G9 G10 G11 1 XUSB 2 D3 D+ 4 UOTGID 5 S1 S2 S3 S4 P$1 P$2 P$3 P$4 GND P$5 P$6 P$7 P$8 P$9 P$10 P$11

F1 MF-MSMF050-2 500mA USBVCC XUSB 10u C27


CG0603MLC-05E Z2 CG0603MLC-05E

10u C35 GND

R2 10K

8x1F-H8.5 COMMUNICATION 8 21 TWCK1 SCL0-3 7 20 TWD1 SDA0-3 6 19 RXD2 5 18 TXD2 4 17 RXD1 3 16 TXD1 2 15 RXD0 1 14 TXD0 8x1F-H8.5
+3V3

Z1

ADCL AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0


8 7 6 5 4 3 2 1

CG0603MLC-05E

AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0

ADCH 8 CANTX0 7 CANRX0 6 DAC1 DAC0(CANRX1) 5 4 AD11(TXD3) 3 AD10 2 AD9 1 AD8 8x1F-H8.5

1K5 5 RN5D 4

Z5

PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB7 PB8 PB9 PB10 PB11 PB12 PB13 PB14 PB15 PB16 PB17 PB18 PB19 PB20 PB21 PB22 PB23 PB24 PB25 PB26 PB27 PB28 PB29 PB30 PB31

(ETH) (SD) UOTGID

8x1F-H8.5 100K 7 RN4B 2


RN4C 100K

SCL0-3 SDA0-3

1K5 6 RN5C 3

1K5 8 RN5A 1

1K5 RN5B

I2C Voltage Translator

SCL0-3 SDA0-3

MICRO-USB-AB1

ETX_CLK 113 114 ETX_EN 115 ETXD0 118 ETXD1 119 ERX_DV 120 ERXD0 121 ERXD1 122 ERX_ER 123 EMDC 127 EMDIO UOTGVBOF 128 129 UOTGID 86 SDA0-3 87 SCL0-3 140 CANTX1/IO DAC0(CANRX1) 76 77 DAC1 88 AD8 89 AD9 90 AD10 91 AD11(TXD3) 92 AD14(RXD3)

141 142 143 144 1 68 28 29 30 31

U1 ATSAM3X8EA-AU

ERASE_S

VIN FDN340P ERASE T3


6

PWM2 PIN22 PWM13 JTAG_TCK JTAG_TDI JTAG_TDO JTAG_TMS

+5V
5 7 GATE_CMD 6

+5V
3

SS3

IC4 NCP1117ST33T3G -3V3


IN OUT 4 2

+3V3

+3V3 C29 10u GND


+

+3V3

GND CMP

RN4A 100K

JTAG

100K 5 RN4D 4

ERASE_CMD Q2 BC847BSMD R3 1K
8

IC1B LMV358IDGKR C31 100n

+5V

C30 100n
4

USBVCC T1 FDN340P

+5V

GND

EEXTINTA ERX_DVA EMDIOA EMDCA ERX_ERA ERXD1A ERXD0A ETXD1A ETXD0A ETX_ENA ETX_CLKA

X2 POWERSUPPLY_DC21MMX

UOTGVBOF Forces OFF the power supply to USB port when the USB port is in HOST mode (board powered from external power supply)
MACB

GND

3
1 2

L6 MH2029-300Y VIN
D1 M7

GND

13 11 9 7 5 3 1

FDN340P T2 USBVCCU2

VIN+

14 12 10 8 6 4 2

PC1 47u

ETH

VBUSPO: VBus Polarity Off 0: The UOTGVBOF output signal is in its default mode (active high) 1: The UOTGVBOF output signal is inverted (active low) GND

RESETA GND GND GND

2x2M - NM

4 2

8PB7 8PB6

+5V ICSP1
CD1206-S01575

MISO2 SCK2 RESET2 GND

1 3 5

2 4 6

MOSI2
D2

8PB5 8PB4

JP5

3 1

3x2M

C40 22p

RESET_CMD

USB B
J3
P1 VBUS P2 S1 DSH1 P3 S2 D+ SH2 P4 S3 ID SH3 P5 S4 SH4 GND S5 SH5 S6 SH6 P$1 SH7 P$2 USB-MICRO B SH8 P$3 SH9 P$4 SH10 P$5 SH11 P$6 SH12 P$7 SH13 P$8 SH14

R10

10k

EN 4

GND

C28 100n
GND

RESET2 XT2
GND

24 2 1

SS1P3L

GND

XVCC

F2

R20 R19 22R 22R

CG0603MLC-05E

CG0603MLC-05E

C39 22p

+5V

Y4 12MHz KX-7 20pF XT1


32 4 3

FB GND
22 23 25 26 5

52K3

USBVCCU2 MF-MSMF050-2 500mA BDBD+

RDRD+

GND

R12

R9 1M_NM

(PCINT7/OC0A/OC1C)PB7 (PCINT6)PB6 RESET(PC1/DW) (PCINT5)PB5 (T1/PCINT4)PB4 (PD0/MISO/PCINT3)PB3 XTAL2(PC0) (PDI/MOSI/PCINT2)PB2 (SCLK/PCINT1)PB1 XTAL1 (SS/PCINT0)PB0 AVCC VCC GND UCAP UVCC DD+ UGND PAD (INT4/ICP1/CLK0)PC7 (OC1A/PCINT8)PC6 (PCINT9/OC1B)PC5 (PCINT10)PC4 (AIN2/PCINT11)PC2 (CTS/HWB/AIN6/TO/INT7)PD7 (RTS/AIN5/INT6)PD6 (XCK/AIN4/PCINT12)PD5 (INT5/AIN3)PD4 (TXD1/INT3)PD3 (RXD1/AIN1/INT2)PD2 (AIN0/INT1)PD1 (OC0B/INT0)PD0

21 20 19 18 17 MISO2 16 MOSI2 15 SCK2 14

10K R23

R13 10K GND

IC6 MASTER-RESET VIN C41 10u


5
+

IC2 LM2734Y
BOOST VIN SW EN FB
2

D3 CD1206-S01575 BOOST
1 6 3
D4

+5V

C42 10n
K

SW

L4 10u SRR0604-100ML PC2 47u JTAG_TCK JTAG_TMS MASTER-RESET DEBUG


1 2 3 4

RESET_CMD ERASE_CMD
10K R18

GND USBVCC
1K R21 GND

STRIP 4x1V M GND

Z3

Z4

N$1

IF LM2736Y R2=1K R3=330R


R11 10K

GND

GND 100n C36 1u C38

VUCAP USBVCCU2 RDRD+ GND

27 31 30 29 28 33

ATMEGA16U2-MU
R15 1K

GND

GND

GND

CONFIG 5V
16U2-TX TX

RX1 YELLOW

R14 1K

13 12 USB boot En 11 TXL-U2 10 RXL-U2 9 16U2-TX 8 TX 7 6

+5V GND

TX1 YELLOW

GND 16U2-TX
1

TM

IC10 TX
2 4

RX

74LVC1G125DCK
100n C37 IC10P GND

VCC 5

GND 3

Arduino Due Reference Design

+3V3

You might also like