1 1 Primeros Pasos en Arduino
-
Upload
prueba543210 -
Category
Documents
-
view
232 -
download
0
Transcript of 1 1 Primeros Pasos en Arduino
-
8/17/2019 1 1 Primeros Pasos en Arduino
1/93
1.1 Primeros pasos
en Arduino.
Cuando uno empieza con Arduino, parece que la cantidad de cosas que hay que
aprender es inabordable. Necesitas conceptos de electricidad de electrónica de
programación algo de ingeniería. Y dependiendo de lo que quieras hacer, algo de
matemáticas y mucha física (y !ios mío".
#emos dise$ado este itinerario pensando en la gente que como t%, amable lector, que si
estás leyendo esto, probablemente tengas que empezar desde el principio.
&or eso, estos primeros capítulos esta pensados para irte lle'ando de la mano, en
los conceptos básicos que 'as a necesitar en la a'entura que empiezas, e ir presentando
todas las ideas necesarias para ir siguiendo el curso en orden.
remos mezclando componentes electrónicos con la ley de Ohm e irán apareciendo las
primeras instrucciones de Arduino C++, con algunos programas y circuitos en los que
haremos prácticas.
)as primeras sesiones de este tutorial están pensadas para alguien que quiere iniciarse y
cuyos conocimientos en estos temas son nulos, pero que quiera aprender. Y creemos que
si nos sigues conseguirás ese ob*eti'o. +n ello hemos puesto todo nuestro empe$o.
1 – Instalación del entorno de trabajo Arduino.
+mpecemos por el principio. !escargando e instalando el entorno de traba*o.
– !uestro primer programa.
iempre hay una primera 'ez. -n programa muy sencillo y algunas ideas básicas.
" – !uestro primer circuito.
-n circuito para quitar el miedo. -n diodo )+! mas una resitencia.
# – Circuito con m$ltiples %&'s.
i funciona con un )+! /&orque no con 01
( – %as entradas digitales de Arduino.
http://www.prometec.net/instalacion-entorno-trabajo-arduino/http://www.prometec.net/nuestro-primer-programa/http://www.prometec.net/nuestro-primer-circuito/http://www.prometec.net/circuito-multiples-leds/http://www.prometec.net/entradas-digitales/http://www.prometec.net/nuestro-primer-programa/http://www.prometec.net/nuestro-primer-circuito/http://www.prometec.net/circuito-multiples-leds/http://www.prometec.net/entradas-digitales/http://www.prometec.net/instalacion-entorno-trabajo-arduino/
-
8/17/2019 1 1 Primeros Pasos en Arduino
2/93
)os sentidos de rduino. &ercibiendo el e2terior en digital.
) – Condicionales y botones.
eguimos introduciendo instrucciones de C33 4 )os condicionales
* – Comunicación con el eterior.
)as puertas -5 en rduino y la comunicación serie.
, – -unciones y enteros.
eguimos traba*ando 'uestro conocimiento de C++ *ugando con n%meros primos como
e2cusa.
– /n programa con 0arias unciones.
abemos que es cuesta arriba. nimo, como en la bici hay tramos así.
12 – %os pines cuasi analógicos.
)as salidas analógicas &67
11 – %os diodos %&' 345.
-n capítulo di'ertido. 8 como mezclar colores con un )+! 9:5.
1 – Arduino y las puertas analógicas.
8 de como usar las puertas analógicas para leer 'alores contínuos del e2terior.
http://www.prometec.net/condicionales-botones/http://www.prometec.net/comunicacion-exterior/http://www.prometec.net/funciones/http://www.prometec.net/programa-varias-funciones/http://www.prometec.net/pines-cuasi-analogicos/http://www.prometec.net/rgb-led/http://www.prometec.net/puertas-analogicas/http://www.prometec.net/condicionales-botones/http://www.prometec.net/comunicacion-exterior/http://www.prometec.net/funciones/http://www.prometec.net/programa-varias-funciones/http://www.prometec.net/pines-cuasi-analogicos/http://www.prometec.net/rgb-led/http://www.prometec.net/puertas-analogicas/
-
8/17/2019 1 1 Primeros Pasos en Arduino
3/93
Instalación del entorno de trabajo
Arduino'escargar y conigurar el I'&
Objeti0os
.
o !escargar del entorno de traba*o !+ de rduino..
o nstalación del entorno..
o Comprobar su correcto funcionamiento .
'escarga e instalación del I'& Arduino.
;amos s descargar e instalar el entorno de desarrollo de Arduino 6I'&7,y comprobar
que está correctamente configurado. &ara ello 'amos a la página de descarga4
http4
-
8/17/2019 1 1 Primeros Pasos en Arduino
4/93
• Aceptar las opciones por defecto de instalación es una opción razonable en caso de no estar
seguro de las preguntas que nos hace,
l cabo de unos minutos finalizara la instalación, y en el área de traba*o del equipoaparecerá el icono de rduino
Comprobación de la instalación.
.
-na 'ez instalado el !+, 'amos a comprobar que reconoce nuestro rduino
correctamente y que podemos programarlo. &ara ello, Conecta tu rduino a tu
ordenador mediante el -5
• Comprueba que las luces del Arduino se iluminan indicando que tiene alimentación.
l hacerlo nuestro &C debe detectar el nue'o dispositi'o -5 y montar el dri'er
adecuado.
Y finalmente4
-
8/17/2019 1 1 Primeros Pasos en Arduino
5/93
tención, el puerto serie en que se instala puede 'ariar del indicado en la imagen,
dependiendo de las características del equipo.
• En inu! adem"s os crear" una puerta #dev#tty! y tendr$is que daros de alta en el grupo deusuarios de los U%&s.
• 7ac debería instalartelo a la primera, sin complicaciones.
i nuestro modelo es un 'Ccduino /!O como el de la foto, en muchos &Cs necesitan
un dri'er adicional que puedes descargar desde aqui4
!ri'er !Ccduino para =indo=s
!ri'er !Ccduino para 7ac 8B
!escomprime e con 6inrar, y e*ecuta el programa incluido. e instalará un
controlador que resuel'e el problema.
hora, ya podemos arrancar el icono de rduino del escritorio de traba*o y configurar el
modelo de rduino y confirmar el puerto serie al que se conecta. +nD7en%EF#erramientasF&laca +legir el modelo e2acto de nuestro rduino. +n nuestro
caso elegimos un rduino -no4
http://www.prometec.net/wp-content/uploads/2014/09/ch341ser.rarhttp://www.prometec.net/wp-content/uploads/2014/09/ch341ser_mac.ziphttp://www.prometec.net/wp-content/uploads/2014/09/ch341ser.rarhttp://www.prometec.net/wp-content/uploads/2014/09/ch341ser_mac.zip
-
8/17/2019 1 1 Primeros Pasos en Arduino
6/93
+n D7en%EF#erramientasF&ort es necesario comprobar que tenemos asignado un puerto
y que tiene la marca de selección.
+s importante asignar el puerto y el modelo de rduino para garantizar el correcto
funcionamiento del !+. )a marca de selección debe estar con el ticG. ;amos ahora a
'olcar un programa de e*emplo4
-
8/17/2019 1 1 Primeros Pasos en Arduino
7/93
l pulsar D7en%EFrchi'oF+*emplosFH?.5asicsF5linG, aparecerá una serie de te2tos en el
entorno de traba*o, que ignoraremos por ahora. &ulsar el botón 7arcado en amarillo,
;eremos una línea de progreso 'erde a'anzando.
-
8/17/2019 1 1 Primeros Pasos en Arduino
8/93
i todo 'a correctamente 'eremos un mensa*e en la parte inferior del !+4
-
8/17/2019 1 1 Primeros Pasos en Arduino
9/93
+ste mensa*e en color blanco indica que hemos 'olcado correctamente el programa y ya
deberíamos 'er una luz que parpadea en nuestra placa rduino, seg%n indica la flecha
ro*a4
i 'emos la luz parpadeando en nuestro rduino, enhorabuena, el entorno está instalado
y configurado correctamente. Ya podemos pasar a la siguiente sesión.
-
8/17/2019 1 1 Primeros Pasos en Arduino
10/93
Nuestro primer programa
Blinking LED
Home Nuestro primer programa
Objetivos.
o Fijar algunas ideas básicas sobre programación.
o Comprender la estructura de un programa Arduino !ketc"#.
o De$nir las estructuras de blo%ues.
o Las primeras instrucciones.
Material requerido.
rduino -no o similar.
+sta sesión acepta cualquier otro modelo de rduino.
&n cable &!B adecuado al conector de tu
Arduino.
&n 'C con el entorno de Arduino correctamenteinstalado ( con$gurado..
Algunas ideas básicas sobre programación.
.
-n programa de ordenador es básicamente el equi'alente a una receta de cocina
pero destinado a un p%blico distinto.
http://www.prometec.net/http://www.prometec.net/categoria-producto/arduinos/http://www.prometec.net/http://www.prometec.net/categoria-producto/arduinos/
-
8/17/2019 1 1 Primeros Pasos en Arduino
11/93
7ientras que las personas somos razonablemente buenas interpretando las
instrucciones, generalmente 'agas, de una receta de cocina, cuando programamos quien
debe entendernos es un ordenador que espera instrucciones precisas respecto a lo que
debe hacer y que además carece por completo de la imaginación o capacidad de
impro'isación humana.
&or ello se desarrollan los lengua*es de ordenador, para dar instrucciones a una máquina
de forma4
• 'recisa) !in ambig*edades in"erentes a la comunicación "umana.
• &ni+oca) !olo se puede interpretar de una manera.
• Concisa) 're,eriblemente ordenes cortas.
+l !+ de rduino se programa en una 'ariante de C33 , que es un lengua*e muy
e2tendido por sus características, aunque no es un lengua*e sencillo. C33, que fi*a
reglas estrictas de cómo escribir estas instrucciones.
-n programa es una serie de instrucciones que se e*ecutan en secuencia ( sal'o que
indiquemos e2presamente condiciones precisas en las que esta secuencia se altera".
-n programa interno comprueba que la sinta2is de nuestro programa es acorde a la
norma de C33, y si hay cualquier cosa que no le con'ence dará un error y finalizará la
comprobación obligándonos a re'isar lo que hemos escrito.
Cuando el comprobador acepta nuestro programa, in'oca otro programa que traduce lo
que hemos escrito a instrucciones comprensibles para el procesador de nuestro rduino.
este nue'o programa se le llama compilador.
-
8/17/2019 1 1 Primeros Pasos en Arduino
12/93
Iuncion del compilador
+l compilador con'ierte nuestras instrucciones (código fuente" en instrucciones del
procesador (código e*ecutable".
Estructura de un programa Arduino.
-n programa o sGetch de rduino consiste en dos secciones o funciones básicas4
• Setup: Sus instrucciones se ejecutan solo una vez, cuando se arrancael programa al encender Arduino o cuando pulsamos el botón dereset. Generalmente incluye defniciones e inicializaciones de ahí sunombre.
• oop: Sus instrucciones se van ejecutando en secuencia hasta elfnal!. " cuando acaba, vuelve a empezar desde el principiohaciendo un ciclo sin fn.
Cuando abrimos el I'& de Arduino (o hacemos D7en%EFrchi'oFnue'o" Jl nos escribe
ya estas dos funciones (en color cobre"4
Nótese que el principio de cada función es indicado por la apertura de lla'e K L K y el fin
de la misma corresponde al símbolo de cerrar lla'es K M K.
-
8/17/2019 1 1 Primeros Pasos en Arduino
13/93
!e hecho el con*unto de instrucciones contenidas entre una apertura y cierre de lla'es se
llama blo8ue y es de capital importancia a la hora de que nuestro Arduino interprete de
una u otra manera las instrucciones que le damos.
+s imperati'o que a cada apertura de una lla'e corresponda un cierre de lla'e. +n
sucesi'os capítulos ampliaremos este concepto.
&or ahora resaltar las líneas que aparecen dentro de los bloques principales4
// put your setup code here, to run once// put your main code here, to run repeatedly
Cualquier cosa que escribamos precedido por K
-
8/17/2019 1 1 Primeros Pasos en Arduino
14/93
pines del H al ?
+n la sesión anterior cargamos un programa de e*emplo que hacia parpadear un )+! en
la placa con una cadencia definida. ;eamos como programar esto.
&ediremos a rduino que acti'e su pin ? como de salida digital y despuJs
encenderemos y apagaremos esta se$al lo que hará que el )+! que tiene conectado de
serie se encienda o apague al ritmo que marquemos.
&ara indicar al sistema que deseamos usar el pin ? como salida digital utilizamos la
instrucción4
pinMode ( 13, OUTPUT ) ;
+l primer parámetro indica el pin a usar y K8-&-O es para usarlo como salida, y
tambiJn podría usarse el 'alor KN&-O para indicar que 'amos a leer de este pin.
+stas definiciones se harán solo una 'ez al principio, en la función setup(". )a
nuestra quedará, con una %nica instrucción que declara que 'amos a usar el pin ? como
salida digital4
void setup() { // initialie the di!ital pin as an output pinMode( 13, OUTPUT) ; "
• Es importante $jarse en %ue a pesar de ser una 4nica instrucción/ "emosdelimitado el blo%ue de esta ,unción mediante abrir ( cerrar lla+es.
• 5bsr+ese %ue la instrucción $nali1a en 6 78 . C99 obliga a acabarlas instrucciones con un punto ( coma %ue delimite la orden. !i seomite generará un error.
-
8/17/2019 1 1 Primeros Pasos en Arduino
15/93
&ara encender el )+! usaremos la instrucción4
di!ital#rite( 13 , $%&$) ;
Y otra instrucción similar que le ordena apagarlo4
di!ital#rite( 13 , 'O#) ;+l ? indica el pin a utilizar y #:#, )86 indican el 'alor que deseamos poner en esa
salida, que en rduino corresponden a P; para #:# y H; para )86.
• !i en la ,unción loop# escribiramos estas dos instruccionesseguidas/ Arduino cambiar:a estos +alores tan deprisa %ue nopercibir:amos cambios/ as: %ue necesitamos ,renarle un poco para%ue podamos percibir el cambio.
&ara hacer este retraso de, digamos, un segundo, utilizaremos4
delay(1) ; // delay(n) con!ela* +rduino nmilise!undos
&or tanto para programar una luz que se enciende y se apaga, tendríamos que generar
una secuencia de órdenes (Como en una receta e cocina" que hicieran4
;. . Encender el LED ) 'oner +alor alto ?@# en dic"o pin.
=. Esperar un segundo.
. Apagar el LED) 'oner +alor bajo @# en dic"o pin.
?. @ol+er a esperar un segundo.
o Si omiti#ramos este segundo retraso, apagaría la luz y volveríaa empezar encontr$ndose la orden de volver a encender. %oapreciaríamos &ue se había apagado.'%o espero &ueme cre$is. (omprobadlo).
o *l procesador de Arduino +% es muy lento desde el punto devista electrónico, pero es capaz de conmutar la luz' pasar deencendido a apagado y vuelta a encender) unas -./// veces
por segundo.
+l primer concepto que tenJis que fi*ar, es que los ordenadores procesan las ordenes en
secuencia, una instrucción despuJs de otra y en el orden en que se las dais. 'uestro
-
8/17/2019 1 1 Primeros Pasos en Arduino
16/93
programa instruye al ordenador para que e(ecute esas instrucciones y fi(a el orden en el
que se e(ecutan.
)a forma de escribir un programa en rduino C33 que haga lo anteriormente descrito es
algo parecido a esto !escargar 4
void setup() { pinMode( 13 , OUTPUT); // Usaremos el pin 13 como salida "void loop() { di!ital#rite(13 , $%&$); // nciende el '- delay(1); // sperar un se!undo di!ital#rite(13 , 'O#); // +pa!ar el '- delay(1); // sperar otro se!undo "
• Nótese el sangrado de las l:neas para destacar los blo%ues de código.Esto se considera buena práctica ( os lo recomendamosencarecidamente/ por%ue ,acilita muc"o la comprensión delprograma.
• Cuando os e%ui+o%uis ( creadme/ os +ais a e%ui+ocar# el sangradoa(uda/( muc"o/ a +isuali1ar el programa.
• !olo "a( dos tipos de programadores. Los %ue se e%ui+ocan ( los %ue
se +an a e%ui+ocar
olo nos falta ya, comprobar si hay errores y para ello pulsamos el icono en amarillo4
i todo 'a bien,( si no hay errores en ro*o" podemos compilar y 'olcar con la siguiente
flecha, +n caso contrario ( y creedme que os pasará con frecuencia" habrá que re'isar
los posibles errores y corregirlos. ;ol'eremos sobre esto en el futuro.
http://www.prometec.net/wp-content/uploads/2014/09/Prog_2_1.rarhttp://www.prometec.net/wp-content/uploads/2014/09/Prog_2_1.rar
-
8/17/2019 1 1 Primeros Pasos en Arduino
17/93
)a flecha en amarillo 'olcara nuestro programa al rduino y podremos comprobar que
la luz del pin ? parpadea con un retraso de un segundo entre encendido y apagado.
• !ugerencia) !i modi$camos los +alores del dela(/ modi$caremos la cadenciadel parpadeo.
• Nota) Esto no ,uncionara con ning4n otro 'in del Arduino &N5/ por%uesolo el ;= tiene un LED conectado.
Resumen de la sesión
+n esta sesión hemos aprendido 'arias cosas importantes4
o El concepto cla+e de un programa/ como secuencia deinstrucciones %ue se ejecuta en el orden marcado.
o Ha( dos ,unciones básicas en todo programa Arduino) !etup# (Loop#..
o'ara delimitar un blo%ue de instrucciones usamos apertura (cierre de lla+es..
o odas las instrucciones acaban en punto ( coma Aun%ue "a(e-cepciones#
o 'odemos usar comentarios usando 22 .
o Hemos aprendido algunas instrucciones iniciales del ArduinoC99.
-
8/17/2019 1 1 Primeros Pasos en Arduino
18/93
Nuestro primer circuito
Arduino/ primer circuito
Home Nuestro primer circuito
Objetivos
.
o Fijar algunas ideas básicas sobre electrónica.
o ontar un circuito con LED ( esistencia comprender eles%uema elctrico..
o Aprender el manejo de la 'rotoboard..
o
-
8/17/2019 1 1 Primeros Pasos en Arduino
19/93
-n diodo %&'
-na resistencia de H 8hmios.
lgunos cables de &rotoboard.
Algunas ideas básicas sobre electrónica
.
Cuando de*amos fluir agua de un sitio alto a otro más ba*o, el agua corre libremente
mientras no se lo impidamos, y siempre de arriba aba*o. !ecimos que las diferentes
alturas suponen una diferencia de potencial entre ambos puntos que puede ser
transformada en traba*o %til.
Cuando e2iste una diferencia de tensión elJctrica (o diferencia de potencial" entre dos
puntos con cone2ión, la electricidad fluye del positi'o (o de mas carga" hacia el
negati'o o menos, y tambiJn podemos obtener traba*o %til de este principio.
unque la física detrás de estos dos e*emplos es diferente, conceptualmente son
bastante parecidos y por ello hablamos de4
• Corriente de agua 2 Corriente elctrica.
• Caudal de agua 2
-
8/17/2019 1 1 Primeros Pasos en Arduino
20/93
• 3e la misma manera, la di4erencia de altura entre dos puntos solorepresenta eso, una dierencia y no indica a &u# altura seencuentran con respecto a una re4erencia m$s o menos arbitraria.
#ay componentes que se oponen a a la libre circulación de la corriente. )os llamamosresistencias , su 'alor se mide en 8hmios y su símbolo es Q .
)a ley de Ohm, liga todos estos 'alores de una forma precisa4
9 : 3 I
!onde 9 es la tensión en 'oltios, 3 la resistencia e I la intensidad elJctrica que fluye.
• *n el mundo de Arduino la tensión es casi siempre 5, &ue es latensión a &ue 4unciona y la &ue es capaz de poner en sus salidasdigitales.
8tra manera de escribir esta ley de 8hm es
I : 9 ; 3
)o que implica que si la resistencia del circuito es nula (o casi, como en el caso de un
cable de cobre" la intensidad de la corriente se dispara y puede llegar a fundir el cable o
componente que encuentre.
• *sto se conoce como cortocircuito o corto simplemente y debe serevitado decididamente ya &ue suele acabar con olor a &uemado yalg6n susto, en el mejor caso.
!uestro primer circuito electrónico
.
+n la sesión anterior programamos el )+! conectado al pin ? de nuestro rduino. #oy
'amos a duplicar este circuito en el e2terior montándolo desde el principio con
componentes discretos. u esquema elJctrico sería4
-
8/17/2019 1 1 Primeros Pasos en Arduino
21/93
;emos a la izquierda el símbolo del diodo %&' que es emisor de luz y por eso tiene
esas flechitas salientes para indicarlo ()+! 'iene del inglJs )ight +mitting !iode, o
diodo emisor de luz".
)a resistencia se representa por ese segundo símbolo indicando un nombre 9? y su
'alor HQ.
su 'ez 'emos a la izquierda las letras :N! para indicar que es el negati'o. ienemuchos nombres4 7asa, +l símbolo R, ierra( aunque no es lo mismo", :round,
Negati'o, cátodo.
&or %ltimo a la derecha el símbolo de 3P; indica el e2tremo de tensión positi'a o
positi'o y a 'eces se representa como ;cc. )as líneas rectas y negras indican cone2ión
elJctrica mediante cables conductores.
• +n diodo, es un componente electrónico &ue solo permite pasar lacorriente en una dirección. *n la dirección del positivo al negativo 'la
parte ancha del tri$ngulo) al negativo, la punta del tri$ngulo '&ueindica la dirección).
• 7ara indicar cu$l de las patas de un diodo *3 es el positivo, #stesuele ser de mayor longitud.
• Si se conecta a la inversa, cortar$ el 1ujo de corriente muyefcazmente y no se iluminar$ en absoluto.
-
8/17/2019 1 1 Primeros Pasos en Arduino
22/93
• as resistencias en cambio no di4erencian un e8tremos del otro,decimos &ue no tienen polaridad.
+s importante entender los esquemas electrónicos porque permiten comprender con
rapidez cualquier circuito. ;ale la pena dedicarle un poco de esfuerzo porque son el
lengua*e de la electrónica.
-na 'ez comprendido el esquema elJctrico del circuito, 'eamos la cone2ión en la
&rotoboard4
+ste esquema sigue una pauta de marcar los cables que 'an a positivo en ro(o y los que
'an a )'D en negro. *ecomendamos encarecidamente se siga esta norma en la práctica
porque ayuda a identificar posibles problemas y e'ita errores.
• a 7rotoboard une los puntos de la línea azul entre si y los de encimade la línea roja entre sí, 'se les llama raíles), pero no conecta el raílrojo positivo con el raíl negro negativo.
-
8/17/2019 1 1 Primeros Pasos en Arduino
23/93
• A su vez e8isten dos zonas de líneas verticales en la 7rotoboard.*stas líneas verticales est$n unidas entre sí internamente, para4acilitar la cone8ión de los componentes, pero no se unen las líneas
paralelas.
)as cla'es para montar el circuito con J2ito, son4
• Conectamos el pin ;= de Arduino a la l:nea roja de la 'rotoboard)'ositi+o.
• Conectamos el GND de Arduino a la l:nea a1ul de la 'rotoboard)Ground.
• &samos el ra:l positi+o los pines de la l:nea roja# para conectar a laresistencia.
• El otro e-tremo de la resistencia se conecta al positi+o del LED por%ueestán en la misma +ertical de la 'rotoboard ( esta los conectaelctricamente#.
• %ótese &ue el positivo del *3 est$ claramente marcado como demayor longitud mediante un pe&ue9o $ngulo cerca de la base.
•
+n diodo *3 casi no presenta resistencia propia, por lo &ue siempredebe usarse una resistencia adicional &ue limite el paso de corriente, y evite &ue se &ueme. '+na resistencia entre / y ;;// < suele seradecuada).
• El circuito se cierra con un cable desde el negati+o del LED al ra:l deGND.
• Cuando nuestro programa ponga un +alor de H
-
8/17/2019 1 1 Primeros Pasos en Arduino
24/93
+n esta sesión hemos aprendido 'arias cosas importantes4
o Hemos +isto algunos conceptos básicos de electrónica) la le(
de 5"m/ %ue relaciona la tensión la resistencia.
o Hemos identi$cado dos componentes básicos en electrónica/resistencias ( los diodos.
o Aprendimos a desci,rar los primeros es%uemas electrónicos.
o Hemos montado nuestro primer circuito con estoscomponentes.
Circuito con m4ltiples LEDs
Arduino com I LEDs/ iteraciones
Home Circuito con m4ltiples LEDs
Objetivos
.
o Conocer las
-
8/17/2019 1 1 Primeros Pasos en Arduino
25/93
Material requerido.
Arduino Uno o similar. Esta sesión acepta
cual%uier otro modelo de Arduino.&n 'C con el
entorno de Arduino correctamente instalado (con$gurado.
&na Protoboard.
I - diodos LED.
&na resistencia de == 5"mios.
Algunos cables de 'rotoboard.
"n circuito con varios #E$% &teraciones 'or
.
+n las sesiones anteriores 'imos como gobernar que un diodo )+! e2terno. i
quisiJramos montar un circuito que tu'iera 0 )+!s y en el que la luz se desplazara de
uno a otro, una posibilidad sería repetir 'arias 'eces las mismas secuencias de
instrucciones que ya conocemos.
&or e*emplo si conectamos distintos )+!s a distintos pines digitales de rduino,
deberíamos declararlo en nuestra Iunción de setup(" que podría ser4
void setup() {
// initialie the di!ital pins as an output pinMode( 13, OUTPUT) ; pinMode( 1., OUTPUT) ;
http://www.prometec.net/producto/arduino-uno/http://www.prometec.net/producto/protoboard-830/http://www.prometec.net/producto/leds-de-colores-variados/http://www.prometec.net/producto/kit-de-resistencias-variadas/http://www.prometec.net/producto/cables-dupont-macho-macho/http://www.prometec.net/producto/arduino-uno/http://www.prometec.net/producto/protoboard-830/http://www.prometec.net/producto/leds-de-colores-variados/http://www.prometec.net/producto/kit-de-resistencias-variadas/http://www.prometec.net/producto/cables-dupont-macho-macho/
-
8/17/2019 1 1 Primeros Pasos en Arduino
26/93
pinMode( 11, OUTPUT) ; pinMode( 0, OUTPUT) ; "
Y a su 'ez nuestro loop(" debería repetir tantas 'eces como )+!s tengamos el *uego de
encender y apagar cada uno de los )+!s en secuencia desde el pin ? hasta el @.
+sta solución es la que podríamos describir como de fuerza bruta, pero no es muy
elegante, es traba*osa y probablemente cometeríamos más de un error al escribirla,
porque las personas tendemos a equi'ocarnos haciendo tareas repetiti'as aburridas (y
esta lo es mortalmente, imaginad un circuito de de ?@ )+!s".
+n cambio los ordenadores no se aburren y además C33 nos ofrece un medio cómodo
de indicarle que debe repetir algo un n%mero definido de 'eces. +ste medio es la
instrucción Ior que podemos usar en combinación con una 'ariable.
• &na +ariable es un contenedor %ue puede tomar +arios +alores/ ennuestro caso aceptará todos los +alores entre J ( ;=.
• C99 nos e-ige declarar el tipo de las +ariables antes de usarlas. Ennuestro caso usaremos el tipo entero %ue se escribe int para indicar%ue esta +ariables es numérica ( entera/ sin decimales.
•
-
8/17/2019 1 1 Primeros Pasos en Arduino
27/93
• El ciclo contin4a mientras se cumpla esta condición. En nuestro casomientras la i sea menor %ue ;/ o sea "asta el ;=) i K;
• Como cambia la +ariable en cada iteración. En nuestro caso i++ %uees pedirle a C99 %ue incremente en uno la +ariable i/ al $nal de cada
iteración.
Con el mismo criterio podríamos escribir la función loop(" así !escargar 4
void loop() { int i ; // %nicialiamos la varia2le i como unentero or ( i 0 ; i 4 15 ; i66) { di!ital#rite( i , $%&$) ;
delay (7) ; di!ital#rite( i , 'O#); delay (7) ; " "
+n la sesión el código era muy similar e2cepto en que escribíamos el 'alor ? para el
%nico pin que tenía un )+! conectado. quí asignamos el pin con una 'ariable i , que
'a tomando los 'alores de @ hasta el ? para el pin.
•
%ótese &ue la instrucción 4or no lleva un punto y coma al fnal. *stoes por&ue se aplica al blo&ue de instrucciones &ue le siguen entrellaves, como es el caso del loop') a iteración realiza las cuatroinstrucciones &ue siguen a la línea del 4or, por&ue est$n dentro de unblo&ue de instrucciones.
• Las instrucciones %ue se aplican a blo%ues de código/ no lle+an punto( coma al $nal.
• *n el caso de particular de &ue el blo&ue lleve una 6nica línea decódigo, las llaves pueden ser omitidas, como en el caso de lainstrucción 4or en la 4unción setup') de arriba.
Esquema electrónico del circuito
.
+l esquema del circuito es muy similar al de la sesión , sal'o por el hecho de que
colocamos en la &rotoboard 0 )+!s.
)a %nica no'edad es que dado que la función de la resistencia es limitar la intensidad de
la corriente que circula por el circuito, y puesto que todos los diodos tienen masacom%n, basta una %nica resistencia entre este punto y :round.
http://www.prometec.net/wp-content/uploads/2014/09/Prog_4_1.rarhttp://www.prometec.net/wp-content/uploads/2014/09/Prog_4_1.rar
-
8/17/2019 1 1 Primeros Pasos en Arduino
28/93
Cuando nuestro programa le'ante el pin correspondiente a 'alor a #:#, se cerrar el
circuito iluminándose el )+! asociado.
Con este circuito, y con el programa A.? descrito en las páginas anteriores, tendremos un
efecto de luces similar al del Kcoche fantásticoO (8 de los Tylon para los aficionados a
la ciencia ficción".
continuación incluimos un esquema de cone2ión del circuito en una protoboard.
-
8/17/2019 1 1 Primeros Pasos en Arduino
29/93
• *n general, se considera buena costumbre 'la recomendamos),montar los circuitos &ue veamos a partir del es&uema electrónico delmismo, m$s &ue a partir del diagrama de cone8iones de la7rotoboard.
• a razón es &ue con el es&uema, la comprensión del circuito escompleta y se evita la tentación de copiar la pr$ctica sin necesidadde entenderla.
• Adem$s, el diagrama electrónico del circuito es su completadescripción y suele resultar m$s sencillo comprender la 4unción delmismo. *n cambio a medida &ue los circuitos se hacen m$s
-
8/17/2019 1 1 Primeros Pasos en Arduino
30/93
complejos, comprender su 4unción desde un es&uema de 7rotoboard puede complicarse mucho, y peor a6n llevar a una interpretaciónerrónea.
(ariantes del programa con el mismo circuito
.
+ste monta*e nos permite *ugar con las luces y se presta a 'arios programas diferentes
para conseguir distintos efectos.
&or e*emplo, con el programa anterior A.?, el efecto no es e2actamente el del coche
fantástico porque cuando acabamos de iterar el for, el programa 'uel'e a empezar desde
el principio, lo que hace que la luz salte desde el pin @ hasta la del pin ?.
sí pues / &odríamos hacer que la luz rebotara 1 &ensadlo un poco.
!esde luego que sí, bastaría con usar dos ciclos for, similar a lo siguiente !escargar 4
void loop() // Pro!858. { or ( int i 0 ; i 4 15 ; i66) // -einimos lavaria2le i so2re la marcha { di!ital#rite( i , $%&$) ;
delay (7) ; di!ital#rite( i , 'O#); delay (7) ; " or ( int i 1. ; i 90 ; i::) // -einimos la varia2lei so2re la marcha { di!ital#rite( i , $%&$) ; delay (7) ; di!ital#rite( i , 'O#); delay (7) ; " "
• El primer ciclo ,or "ace %ue las luces se encienda en secuencia desdela J "asta la ;=. El segundo bucle entra a continuación empe1andocon la lu1 ;> para no repetir la ;=# ( $nali1ando con la para norepetir la J#/ ( +uelta a empe1ar.
• En el segundo bucle "emos "ec"o una cuenta atrás dicindole a la+ariable i %ue se decrcmentara en uno en cada iteración mediantela instrucción iM .
• ambin nos "emos apro+ec"ado de %ue C99 nos permite de$nirvariables sobre la marcha dentro de la propia instrucción for/ sin
http://www.prometec.net/wp-content/uploads/2014/09/Prog_4_2.rarhttp://www.prometec.net/wp-content/uploads/2014/09/Prog_4_2.rar
-
8/17/2019 1 1 Primeros Pasos en Arduino
31/93
necesidad de dedicarle una l:nea completa a la declaración einiciali1ación.
8tra 'ariante seria, hacer un efecto de ola en al que las luces subieran de*ando
encendidos los )+!s pre'ios hasta alcanzar el má2imo y ahora descender apagando los)+!s superiores. 8s recomendamos intentar resol'er el problema como desafío, antes
de buscar una solución.
• 7rogramar es en parte aprender las instrucciones de un lenguaje 'la parte 4$cil), y otra m$s di4ícil &ue es aprender a resolver los problemas de un modo &ue nos permita darle instrucciones a unordenador para &ue lo lleve a cabo.
• *stos procedimientos secuenciales de cómo resolver un cierto tipo de problemas es lo &ue se conoce como un algoritmo.
• Seg6n el problema &ue abordemos el algoritmo ser$ m$s o menoscomplicado pero aprender a programar tiene m$s &ue ver condesarrollar esta capacidad de resolver problemas lógicos en unasecuencia de pasos &ue podamos codifcar en un ordenador.
• 7or cierto, cual&uiera puede aprender a programar. %o lo dud#is. Solo&ue como en todo, a unos les lleva m$s tiempo &ue a otrosdesarrollar la habilidad necesaria. Al principio muchos me dicen &ue
les duele la cabeza de pensar en este tipo de cosas, pero os animo acontinuar 'poco a poco si es preciso) por&ue os encontrareis &ue valela pena.
Resumen de la sesión
.
+n esta sesión hemos aprendido 'arias cosas importantes4
• La instrucción For/ nos permite iterar un blo%ue de instruccionestantas +eces le indi%uemos.
• Hemos +isto uno de los tipos de +ariables %ue C99 acepta) losenteros.
• Hemos introducido el concepto de algoritmo/ como un procedimientosecuencial para resol+er un problema concreto ( lo "emos aplicado a+arios ejemplos de programas sencillos con luces.
-
8/17/2019 1 1 Primeros Pasos en Arduino
32/93
Las entradas digitales de Arduino
Le(endo un pulsador con Arduino
Home Las entradas digitales de Arduino
Objetivos
.
o Conocer las entradas digitales.
o Leer el primer pulsador.
o 'resentar los +alores booleanos.
o &n operador) Negación.
Material requerido.
Arduino Uno o similar. &n 'C con el entorno
de Arduino correctamente instalado (
con$gurado.
&na Protoboard.
&n diodo LED.
http://www.prometec.net/http://www.prometec.net/producto/arduino-uno/http://www.prometec.net/producto/protoboard-830/http://www.prometec.net/producto/leds-de-colores-variados/http://www.prometec.net/http://www.prometec.net/producto/arduino-uno/http://www.prometec.net/producto/protoboard-830/http://www.prometec.net/producto/leds-de-colores-variados/
-
8/17/2019 1 1 Primeros Pasos en Arduino
33/93
&n pulsador.
Dos resistencias de == 5"mios.
Algunos cables de 'rotoboard.
Entradas digitales
Con frecuencia en electrónica necesitamos saber si una luz está encendida o apagada, si
alguien ha pulsado un botón o si una puerta ha quedado abierta o está cerrada.
este tipo de se$ales todo < nada, < N8, 9-+
-
8/17/2019 1 1 Primeros Pasos en Arduino
34/93
7ontaremos un circuito con un diodo )+! y resistencia conectado al pin digital ?H de
rduino, tal y como 'imos en las sesiones pre'ias y ademas un segundo circuuito con
un pulsador ? conectado al pin @ con una resitencia como se muestra en el diagrama
siguiente.
8bsJr'ese que mientras no pulsemos ? el pin @ de rduino está conectado a P; atra'Js de la resistencia 9 forzando una lectura de tensión alta (#:#". +n cambio
cuando pulsemos ? cerraremos el circuito del pin @ a :round con lo que leerá tensión
ba*a, )86. +n ambos casos tenemos un 'alor de tensión definido.
i no pusiJramos la resistencia 9, al pulsar ? leeríamos correctamente )86 en el pin
@. &ero al de*ar de pulsar ? el pin @ estaría en un estado flotante, que es ni #:# ni
)86 sino indeterminado. Como esto es inaceptable en circuitos digitales forzamos una
lectura alta con 9.
• A esta resistencia &ue 4uerza el valor alto en vacio se le conoce como pullup Si la conect$ramos a masa para 4orzar una lectura a Groundse le llamaría pulldo)n resistor.
• *sta resistencia es clave para &ue las lecturas del pulsador seanconsistentes. *l circuito, simplemente, no 4uncionar$ bien si se omite'volveremos sobre esto).
Y aquí tenemos el esquema para protoboard del circuito.
-
8/17/2019 1 1 Primeros Pasos en Arduino
35/93
• *n este es&uema hemos seguido la pr$ctica habitual de usar cablesnegros para conectar a masa y cables rojos para conectar a tensión'5).
• bs#rvese &ue el pulsador S- tiene cuatro pines 'el &ue est$ sobre laresistencia horizontal). *sto es por&ue cada entrada del interruptortiene dos pines conectados. *n nuestro circuito simplementeignoramos los pines secundarios.
#e*endo los pulsadores
+mpecemos haciendo un programa que haga que el )+! se encienda cuando pulsamos
el botón y se apague cuando lo soltamos. &ara ello pediremos a rduino que configure
el pin digital ?H (!?H" como salida para mane*ar el )+!, y el pin digital @ (!@" como
entrada para leer el botón.
-
8/17/2019 1 1 Primeros Pasos en Arduino
36/93
Normalmente en programas sencillos basta con poner el n%mero de pin en las
instrucciones. &ero a medida que el programa se complica esto tiende a pro'ocar errores
difíciles de detectar.
&or eso es costumbre definir 0ariables con los n%meros de pin que usamos, de forma
que podamos modificarlos tocando en un solo lugar (y no teniendo que buscar a lo largo
del programa". ;amos a escribir esto un poco más elegantemente4
int '- 1 ; int 2oton 0;
void setup() { pinMode( '-, OUTPUT) ; // '- como salida pinMode( 2oton , %PUT) ; //2ot
-
8/17/2019 1 1 Primeros Pasos en Arduino
37/93
• +n operador es un símbolo &ue relaciona varios valores entre sí, o&ue modifca el valor de una variable de un modo previsible.
• *jemplos de operadores en (>> son los matem$ticos como >,,B , 2 C y hay otros como la negación D o el cambio de signo de una variable :
E 8. Fremos viendo m$s.
!e hecho este tipo de operaciones son tan frecuentes que C33 incorpora un tipo
llamado bool o booleano que solo acepta dos 'alores 9-+ (cierto" y I)+ y son
completamente equi'alentes al ? < H, y al #:# < )86
+ste nue'o programa sería algo así4
void loop() {
int valor di!ital=ead(2oton) ; // leemos el valorde 2oton en valor di!ital#rite( '-, >valor) ; //scri2imos valoren '-
"
#emos definido 'alor como bool, porque podemos usar el 'alor de tensión alto como
9-+ y el 'alor ba*o como I)+.
el botón no está pulsado el !@ leerá 9-+ y por tanto pondrá )+! a I)+. +n
caso contrario encenderá el )+!.
!e hecho podríamos escribir una 'ariante curiosa del blinGing )+! usando el operadornegación4
void loop() { 2ool valor di!ital=ead ('-) ; di!ital#rite( '-, >valor) ; delay ( 1) ; "
•
7odemos leer la situación actual de un pin 'nos devuelve su estadoactual), a6n cuando lo hayamos defnido como salida, *n cambio no podemos escribir en un pin defnido como entrada.
)a primera linea lee la situación del )+! y la in'ierte en la segunda línea, despuJs
escribe esto en )+!. Y puestos a batir alg%n record, podemos escribir el blinGing led en
solo dos líneas4
void loop() {
di!ital#rite( '- , > di!ital=ead( '-)) ; delay ( 1) ; "
-
8/17/2019 1 1 Primeros Pasos en Arduino
38/93
• as instrucciones dentro de los par#ntesis se ejecutan antes &ue las&ue est$n 4uera de ellos. 7or eso el digital0ead se ejecuta antes &ueel digitarite..
Resumen de la sesión
.
o Hemos +isto una ,orma de leer se3ales digitales del mundoe-terior además de poder en+iarlas)
digitalead pin#
digitalrite pin / +alor#
o Hemos conocido un nue+o componente) el pulsador.
o Conocemos un nue+o tipo en C99/ el booleano ( un nue+ooperador de negación.
-
8/17/2019 1 1 Primeros Pasos en Arduino
39/93
Condicionales ( botones
La instruccion i,
Home Condicionales ( botones
Objetivos
.
o Lógica digital ( algebra de Bool.
o Los condicionales.
-
8/17/2019 1 1 Primeros Pasos en Arduino
40/93
&n pulsador.
Dos resistencias de == 5"mio.
Algunos cables de 'rotoboard..
#ógica digital * algebra de ool
.
+n la sesión anterior presentamos el tipo de 0ariable bool destacando que solo puede
tomar dos 'alores4 True o False. unque para quienes no estJn acostumbrados al
algebra booleana o binaria puede parecer e2cesi'o dedicar un tipo a algo tan simple, en
la práctica buena parte de las instrucciones de programación se apoyan o dependen de
este tipo de 'ariables.
)a razón práctica es que con frecuencia hay que tomar decisiones para seguir un camino
u otro en función de que se cumpla una condición dadaV +sta condición se debe evaluar
necesariamente, a
-
8/17/2019 1 1 Primeros Pasos en Arduino
41/93
#a instrucción i
+n este capítulo 'amos a presentar unas instrucciones nue'as de C33, que nos permitan
tomar decisiones para hacer una cosa u otra.
)a instrucción if es muy sencilla de usar, basta con pasarle entre parJntesis una 'ariable
o condición que se e'al%e a true o false. i el resultado es true se hace el bloque que
'iene a continuación y en caso contrario se e*ecuta el bloque que hay detrás del else si
e2iste.
i no e2iste la clausula del esle, entonces el bloque que sigue al if, se e*ecuta o no, en
función de la condición y luego sigue con la secuencia de instrucciones a continuación.
i ( condici
-
8/17/2019 1 1 Primeros Pasos en Arduino
42/93
(olviendo con los botones
;amos con un programa diferente. >ueremos que el botón act%e como un interruptor,que al pulsarlo una 'ez se encienda, y la pró2ima 'ez lo apague. &odríamos plantear
algo así y os recomiendo que lo probJis en 'uestro rduino4
int '- 1 ; int 2oton 0 ; 2ool estado alse ; void setup() { pinMode( '-, OUTPUT) ; pinMode( 2oton , %PUT8PU''UP) ; di!ital#rite('- , 'O#) ; // +pa!amos el '- al empear "
void loop() {
2ool valor di!ital=ead(2oton) ;//leemos el 2ot
-
8/17/2019 1 1 Primeros Pasos en Arduino
43/93
una solución es nue'amente frenar a rduino y hacerle esperar un tiempo entre PH y SPH
miliWsegundos una 'ez que detecta que se ha pulsado el botón, de modo que nos dJ
tiempo a liberar el pulsador4
void loop()
{2ool valor di!ital=ead(2oton) ;
//leemos el 2ot estado8anterior) //hay cam2io @ $anpulsado o soltado
-
8/17/2019 1 1 Primeros Pasos en Arduino
44/93
{ i (estado 'O#) //+l pulsar 2otdi!ital=ead('-)); estado8anterior estado ; // Para recordarel ultimo valor
" "
Ya di*imos que para comprobar si dos 'alores son iguales usamos XX, &ara comprobar si
son diferentes usamos UX , y e2isten otros operadores relacionales
•
-
8/17/2019 1 1 Primeros Pasos en Arduino
45/93
Resumen de la sesión
.
o Hemos +isto la instrucción i, 2 else.
o @imos +arios programas con pulsadores ( como "acer eldebouncing.
o Hemos presentado los operadores lógicos de relación (comparación.
o Continuamos escribiendo pe%ue3os programas para desarrollarla ,orma de pensar necesaria para escribir nuestras propiasaplicaciones.
Comunicación con el e-terior
El puerto serie en Arduino ( los tipos !tring
Home Comunicación con el e-terior
Objetivos
.
o Comprender la comunicación +:a puerto serie.
o &tili1ar la librer:a !erial.
o 5peraciones con enteros.
o Los tipos !tring ( c"ar.
http://www.prometec.net/http://www.prometec.net/
-
8/17/2019 1 1 Primeros Pasos en Arduino
46/93
o 5perando con !trings.
o La instrucción T"ile.
Material requerido.
Arduino Uno o similar. &n 'C con el entorno
de Arduino correctamente instalado (
con$gurado.
Comunicación ,erie con el mundo e-terior
7ás antes que despuJs, 'amos a necesitar comunicar nuestro rduino con nuestro &C.
)as razones son 'arias, en'iarle órdenes o recibir información o se$ales por e*emplo.
)os &Cs disponen de teclados, pantallas y adaptadores de red, pero con rduino
tenemos que usar el puerto -5 que establecerá una coneión en serie con nuestro &C.
)a comunicación en serie es muy sencilla, bastan dos hilos para en'iar una diferencia de
tensión entre ellos y poder marcar ni'eles alto (P;" y ba*o(H;" y con esto podemos
transmitir información digital. hora solo nos falta pactar dos cosas entre quien en'ía y
quien recibe4
• &n códio com!n para codi$car los caracteres %ue en+iamos.
• &n acuerdo de velocidad para saber a %u ritmo "a( %ue leer losdatos.
+l código com%n que 'amos a usar con rduino se llama código A>CII y es estándar en
todos los &Cs. +s una forma de codificar las letras mediantes n%meros que representas
estos caracteres. 9ecordad que solo podemos transmitir unos y ceros.
http://www.prometec.net/categoria-producto/arduinos/http://www.prometec.net/categoria-producto/arduinos/
-
8/17/2019 1 1 Primeros Pasos en Arduino
47/93
sí por e*emplo la letra se representa por el numero @P, la 5 el @@, C el @[
&rácticamente todos los &Cs actuales utilizan este código y eso incluye a 6indo=s,
7ac y )inu2 (y por eso podemos leer emails en'iados desde distintas plataformas", pero
es importante comprender que estJ es uno más entre 'arios códigos de caracteres
posibles (+5C!C por e*emplo".
• Actualmente, en realidad, se suele usar una e8tensión del código A,C&& 'llamada "nicode ) &ue permita el uso de caracteres noincluidos en la tabla original, y &ue permita representar caracterescomo las I, o acentos para el espa9ol, pero tambi#n al4abetosdistintos como el Janji chino o el al4abeto cirílico. " este es el motivo
por el &ue pod#is leer las letras chinas o rusas en las p$ginas deinternet de estos países..
+l otro factor a pactar para realizar una comunicación serie es la 'elocidad. !ado que
solo disponemos de dos hilos para transmitir, necesitamos saber cuándo hay que leer la
línea y esto se hace estableciendo un acuerdo de 'elocidad. i la 'elocidad de en'ío es
distinta de la 'elocidad de lectura, el mensa*e final será irreconocible.
5uena parte de los errores de comunicación serie programando con rduino se suelen
deber a una diferencia de 'elocidad entre el emisor y el receptor.
+sta 'elocidad se mide en bits por segundo y 'amos a 'er que rduino soportadiferentes 'elocidades de comunicación serie.
Estableciendo la comunicación ,erie
.
rduino dispone de una librería serie incluida llamada erial, que nos permite en'ía
información al &C y para usarla simplemente tenemos que pedirle en nuestro setup("
que la incluya. )a instrucción que se encarga es4
Berial?2e!in( velocidad ) ;
• %ótese &ue Serial tiene la S may6sculas y &ue (>> di4erencia entremay6sculas y min6sculas
)a 'elocidad es una 'alor entre HH y ??P.SHH bits por segundo. Y suele ser costumbre
establecerla en \@HH (el 'alor por defecto" pero no hay ninguna razón para ello y esta no
es una 'elocidad especialmente alta.
-
8/17/2019 1 1 Primeros Pasos en Arduino
48/93
&ara en'iar un mensa*e desde rduino a nuestro &C podemos usar las funciones
erial.print(" y erial.println(".;eamos un e*emplo4
int '- 1 ; int 2oton 0 ; 2ool estado alse ;
void setup() {Berial?2e!in(C0) ; // %nicialia el
Puerto seria C0 2its por se!undo " void loop() {
int i 75 ;Berial?println( i );
"
+l println(" en'iara el 'alor de i al puerto serie de rduino (repetidamente". &ara leerlo
en nuestro &C necesitamos un monitor de puerto serie. +l !+ de rduino incluye uno
muy sencillo, pero suficiente que se in'oca con el botón del monitor4
Necesitamos además asegurarnos de que la 'elocidad de cone2ión es la misma enambos e2tremos. Ií*ate en la parte inferior derecha del monitor serie4
Normalmente la 'elocidad por defecto son los \@HH bits por segundo o baudios en los
que hemos programado nuestra puerta serie, y si lo desplegáis, 'erJis las diferentes
'elocidades aceptables para rduino.
• *strictamente hablando, bits por segundo y baudios no sone8actamente lo mismo salvo bajo ciertas condiciones particulares&ue en Arduino se cumplen, por lo &ue a&uí podemos usarlos comosinónimos.
• *n el mundo Arduino parece haber un acuerdo de usar velocidadesbajas como KL// en lugar de m$s altas como --//, para evitar
problemas. *sto es algo &ue hace a9os estaba justifcado por problemas de transmisión, pero con la tecnología actual no hay
-
8/17/2019 1 1 Primeros Pasos en Arduino
49/93
motivo para ello. *s m$s, en cuanto necesitemos utilizar dispositivosde comunicaciones como adaptadores *thernet o MlueNooth paracomunicarnos, la velocidad tendr$ &ue subir necesariamente.
hora que sabemos en'iar información y resultados al &C, 'amos a 'er cómo podemosoperar con enteros y mostrar el resultado en la puerta serie. +n C33 los operadores
numJricos son los normales en cálculo (y algunos menos frecuentes"4
• Adición) 9
• esta) M
• ultiplicación) U
• Di+isión entera) 2 Cociente sin decimales puesto %ueoperamos con enteros
• esto) V De+uel+e el resto de una di+isión.
+n C33 tenemos que e2presar las operaciones matemáticas en una sola línea y utilizar
parJntesis para garantizar que se opera como necesitamos. ;amos con algunos
e*emplos4
"peración #esultado $omentario
int i U > resultado I
int i U > 2 = resultado >'or%ue desprecia los decimales al ser
entero
int i ; V = resultado > El resto de ; entre =
9 I 2 > resultado J Calcula primero la di+isión.
9I# 2 > resultado ? El parntesis ,uer1a a %ue se realiceprimero la suma
!ada una e2presión, la precedencia de operadores indica que operaciones se realizaran
antes y cuales despuJs en función de su rango. &ara los que se inician en C33 no es fácil
saber que operadores tienen preferencia, por lo que es más seguro que ante la duda usJis
parJntesis.
)os parJntesis fuerzan las operaciones de una forma clara y con'iene utilizarlos ante la
duda porque de otro modo, detectar los errores de operación puede 'ol'erse muy difícil
especialmente cuando uno empieza a programar.
-
8/17/2019 1 1 Primeros Pasos en Arduino
50/93
+l operador resto es más %til de lo que parece a primera 'ista porque nos permite saber
si un numero es m%ltiplo de otro. upongamos que queremos saber si un n%mero dado
es par.
&odríamos escribir un programa como este4
void setup() { Berial?2e!in(C0) ; // %nicialia el Puerto serie " void loop() {
int i .D ; //l nEmero en cuesti
-
8/17/2019 1 1 Primeros Pasos en Arduino
51/93
Btrin! 2 Ga todos?G ; Berial?println( a 6 2);
"
Y tambiJn podemos construir un tring sobre la marcha así4
void loop()
{int resultado .7 ;
Btrin! s Gl resultado es@ G ; Berial?println( s 6 Btrin!( resultado ));
"
!onde imprimimos el resultado de concatenar s tring, y la con'ersión de un int a
tring (+l operador 3 a$ade un tring al final de otro".
Recibiendo mensajes a travs del puerto ,erie
.
#asta ahora solo hemos en'iado mensa*es desde rduino hacia el &C, /&ero comorecibimos mensa*es en rduino1
+n primer lugar disponemos de una función llamada erial.parsent(" que nos entrega lo
que se escribe en el monitor serie con'ertido a entero4
void loop() {
i (Berial?availa2le() 9 ) { int I Berial?parse%nt();
Berial?println ( I) ; " "
+ste programa simplemente recibe en 2 los n%meros que nos tecleen en la consola
(cuando pulsemos intro" y si es un te2to, lo interpreta como cero.
#emos utilizado otra función de erial 4 'ailable(" que es un booleano. Con'iene por
costumbre comprobar que antes de leer el puerto serie hay algo que nos han en'iado. i
lo hay 'ailable(" es rue y en caso contrario es Ialse.
&ara leer un tring del puerto serie tenemos que complicarnos un poco más y hablar del
tipo char.
-no de de las mayores quebradero de cabeza al iniciarse en C33 es comprender la
diferencia, antiWintuiti'a, entre char y tring. char es un tipo que representa un %nico
carácter y se define con comillas simples, a diferencia de tring que necesita comillas
dobles4
char c JaK ;Btrin! s *a* ;
unque parezca lo mismo para C33 son muy distintos.
-
8/17/2019 1 1 Primeros Pasos en Arduino
52/93
&ara leer una cadena desde el puerto serie necesitamos leer un carácter cada 'ez y
despuJs montar un tring a partir de ellos, pero antes, aseg%rate de seleccionar ambos
N) C9 en la parte inferior del monitor serie, para garantizar que se en'ía el carácter
de fin de línea4
-n programa para leer la consola sería algo así4
void setup() { Berial?2e!in(C0); "
void loop () {
char c L L ; Btrin! mensae GG ; % (Berial?availa2le()) //Nompro2amos si hay al!oesperando { hile( c > LnL) //Bi lo hay, lo leemos hastael intro {
mensae mensae 6 c ; // +Qadimos loleRdo al mensae
c Berial?read(); //'eer 1 carScter delay(.7); " Berial?println( mensae); //+l salir imprimir elmensae mensae GG ; //H
-
8/17/2019 1 1 Primeros Pasos en Arduino
53/93
• *l motivo del delay') es &ue a una velocidad tan lenta, enviar unchar de O bits por la puerta serie, tarda mucho m$s de lo &ue tarda
Arduino en ejecutar las instrucciones del Phile y volver a empezar.7or eso si se suprime el delay 'y os recomiendo la prueba) leer$ uncar$cter bueno 'de la palabra escrita y como -/ caracteres basura
para un Arduino +% o ?ega).
• Si subimos la velocidad de comunicación a --// bits por segundo,comprobareis &ue no hay este problema ya &ue al multiplicar lavelocidad de envío por m$s de -/ Arduino ya no tiene tiempo devolver a por m$s caracteres antes de &ue lleguen.
Resumen de la sesión
.
o Hemos +isto como establecer la comunicación con el 'Ce-terno/ tanto para en+iar como para recibir mensajes enteros( de te-to.
o Hemos presentado los tipos !tring ( c"ar.
o Hemos +isto las reglas básicas para operar con enteros ( con
!trings.
o 'resentamos una nue+a instrucción) T"ile.
Funciones ( enteros
De$niendo ,unciones ( di,erentes tipos de enteros
-
8/17/2019 1 1 Primeros Pasos en Arduino
54/93
Home Funciones ( enteros
Objetivos
.
o 5perar con enteros.
o Aprender a de$nir ,unciones en Arduino.
o rabajar el pensamiento lógico ( algor:tmico#
o Di,erentes tipos de enteros en C99.
Material requerido.
Arduino Uno o similar.&n 'C con el entorno
de Arduino correctamente instalado (
con$gurado.
#a primera unción% Calculando si un n/mero es primo
.
Ya hemos comentado antes, que programar es un poco como andar en bici, se aprende
pedaleando y a programar programando. #ay que ir aprendiendo la sinta2is del
lengua*e, C33 en nuestro caso, pero tambiJn aprendiendo a resol'er problemas lógicos
y partirlos en instrucciones.
#acer cursos de programación (o de andar en bici" está bien, pero al final hay que
ponerse a programar y tener problemas, porque solo teniJndolos y resol'iJndolos, solo
o con ayuda, se aprende. 'o se puede aprender a nadar sólo estudiando.
Con un cierto temblor de manos, 'amos a centrarnos en esta sesión en algunos e*emplos
clásicos de programación, como son el cálculo de n%meros primos para entrenar esta
capacidad de b%squeda de algoritmos prácticos para resol'er problemas más o menos
abstractos y para presentar algunos conceptos adicionales.
http://www.prometec.net/http://www.prometec.net/categoria-producto/arduinos/http://www.prometec.net/http://www.prometec.net/categoria-producto/arduinos/
-
8/17/2019 1 1 Primeros Pasos en Arduino
55/93
• *s importante destacar &ue no e8iste una 4orma 6nica de resolver un problema concreto y &ue una no tiene por&ue ser mejor &ue otra,aun&ue con 4recuencia se aplican criterios de efciencia o elegancia
para seleccionar una solución.
+sta sesion 'a a requerir un esfuerzo un poco mayor que las anteriores porque 'amos a
empezar a entrenar un musculo poco usado,el cerebro, en una tarea poco frecuente,
pensar. Y esto es algo que e2ige un poco e esfuerzo, pero es necesario para a'anzar.
upongamos que queremos crear un programa que nos de'uel'a true o false seg%n que
el n%mero que le pasamos sea primo o no y a la que podamos llamar 'arias 'eces sin
copiar el código una y otra 'ez. )a llamaremos &rimo (" y queremos utilizarla de la
siguiente manera4 i el numero n que le pasamos es primo nos tiene que de'ol'er true y
en caso contrario que de'uel'a false, o sea queremos que nos de'uel'a un 'alor bool.
+sto es lo que llamamos una unción.
+n realidad, ya hemos utilizado 'arias funciones que rduino trae predefinidas como el
erial.print(" o abs(" , o erial.a'ailable(" y se las reconoce por esa apertura y cierre de
parJntesis.
C33 nos ofrece todas las herramientas para crear nuestras propias funciones y es algo
muy %til porque nos ayuda a organizar un problema general en trozos o funciones más
peque$as y más fáciles de mane*ar.
&ara definir una función así, tenemos que declararla primero y describirle a C33 que
hacer4
2ool Primo( int I) // int I representa el parSmetro Aue pasaremosa esta unci
-
8/17/2019 1 1 Primeros Pasos en Arduino
56/93
;eamos cómo podría ser el código de la función &rimo("4
2ool Primo( int n) { or ( int i . ; i 4n ; i66) {
i ( n F i ) // Bi el resto es entonces esdivisi2le? {
Berial?println ( Btrin!(n) 6G es divisi2lepor@ G 6 Btrin!(i)) ; return(alse) ; " " return (true) ; "
&ara saber si un n%mero es o no primo basta con di'idirlo por todos los n%meros
positi'os menores que Jl y mayores que ?. +n el e*emplo di'idimos el n%mero n
empezando en S y finalizando en nW?.
i encontramos un 'alor de i que de'uel'e resto H, entonces es di'isible (no es primo",
de'ol'emos false con return y 'ol'emos a la intruccion que llamo a la función. i no
hallamos ning%n di'isor, al finalizar el for de'ol'emos true y listo. +ste es el mJtodo de
fuerza bruta y sin duda es me*orable pero de momento nos sir'e.
&ara usar &rimo hay que pasarle un entero. 9ecordad que al definir la función di*imos
bool &rimo (int n" donde n representa el 'alor que queremos probar. sí pues !escargar 4
void loop() // Pro!881 {
int I 5.D ; // l nEmero a pro2ar 2ool p Primo(I); i (p ) Berial?print( Btrin!(I) 6 G s primo?G) ; else Berial?print( Btrin!(I) 6 G o es primo?G ) ; "
;eamos cuantos primos hay hasta el, digamos ?HSA, !escargar 4
2ool control true ; // Pro!88.
int maIimo 1.5 ;
void loop() {
i ( control) // Bolo es para Aue no repita una y otrave lo mismo {
Berial?println( G'os numeros primos hasta el G6 Btrin!( maIimo)) ; or ( int I . ; I 4 maIimo ; I66) {
2ool p Primo(I); i (p ) Berial?println( I) ; // o hay
inconveniente en escri2irlo se!uido " "
http://www.prometec.net/wp-content/uploads/2014/10/Prog_8_1.rarhttp://www.prometec.net/wp-content/uploads/2014/10/Prog_8_2.rarhttp://www.prometec.net/wp-content/uploads/2014/10/Prog_8_1.rarhttp://www.prometec.net/wp-content/uploads/2014/10/Prog_8_2.rar
-
8/17/2019 1 1 Primeros Pasos en Arduino
57/93
control alse ; "
2ool Primo( int n) {
or ( int i . ; i 4n ; i66)
{ i ( n F i ) // Bi el resto es entonceses divisi2le? return(alse) ; " return (true) ; // Bi lle!a aAui es Aue no ha encontradonin!un divisor "
unque el programa funciona correctamente la salida no es muy presentable( 9ecordad
que nos gusta ser elegantes". ;amos a formatearla. &ara ello usaremos el carácter
tabulador que se representa como ^Ft_ y una coma despuJs. !escargar 4
2ool control true ; //Pro!8?3 int maIimo 1.5 ; int contador 1 ;
void loop() {
i ( control) // Bolo es para Aue no repitauna y otra ve lo mismo { Berial?println( G'os numeros primos hasta el G6 Btrin!( maIimo)) ; or ( int I . ; I 4 maIimo ; I66) {
i (Primo(I) ) i ( contador66 F ) Berial?println( Btrin!(I)6G,G) ; else Berial?print( Btrin!(I) 6G,G6LtL) ;
""
control alse ; "
hora el programa formatea la salida de una forma un poco más presentable y cómoda
de leer.
http://www.prometec.net/wp-content/uploads/2014/10/Prog_8_3.rarhttp://www.prometec.net/wp-content/uploads/2014/10/Prog_8_3.rar
-
8/17/2019 1 1 Primeros Pasos en Arduino
58/93
&ara conseguirlo, hemos a$adido una coma y un tabulador a cada n%mero e2cepto a uno
de cada 0 que a$adimos intro. ambiJn tenemosuna línea que con'iene comentar4
i ( contador66 F )
Cuando a una 'ariable se le a$aden dos símbolos mas al nombre, significa que primero
se use su 'alor actual en la instrucción en curso, ene este caso en el if, y despu$s se
incremente en ? su 'alor.
i hubiJramos escrito4
i ( 66contador F )
>uerría decir que queremos incrementar su 'alor antes de utilizarlo. +sta notación es
muy habitual en C33 y con'iene reconocerla. ambiJn podemos usar contadorW R y R
Wcontador para decrementar.
El tipo entero
.
-
8/17/2019 1 1 Primeros Pasos en Arduino
59/93
+ste sería un buen momento para preguntarnos hasta donde podría crecer má2imo en el
programa anterior. )e asignamos un 'alor de ?HSA, pero /iene un entero límite de
tama$o1
)a respuesta es afirmati'a. )os enteros int en rduino C33 utilizan ?@ bits por lo que el
má2imo seria en principio S?@ X @P.P@, &ero como el tipo int usa signo, su 'alor está
comprendido entre
WS.[@0 y 3S.[@[.
!e hecho en rduino C33 hay 'arios tipos de distintos tama$os para mane*ar enteros4
%ipo Descripción &alor
intEntero con signo/ ;J
bitsentre W=>/JI ( =>/J
unsigned
int
Entero sin signo/ ;J
bits>;J M ; 7 de "asta J?.?=?
longEntero con signo/ =>
bits
>=> M ; /Desde W>.;.I=/JI "asta
>.;.I=.J
unsigned
long
Entero sin signo/ =>
bitsDesde >=> M ; 7 a .>X.XJ.>X?
b(teEntero sin signo/ I
bits
>I de "asta >??
odos estos tipos representan enteros con y sin signo y se pueden utilizar para traba*ar
con n%meros realmente grandes pero no sin límite.
!e hecho C33 tiene la fea costumbre de esperar que nosotros lle'emos el cuidado de no
pasarnos metiendo un 'alor que no cabe en una 'ariable. Cuando esto ocurre se le llama
desbordamiento (o'erflo=" y C33 ignora olímpicamente el asunto, dando lugar a
problemas difíciles de detectar si uno no anda con tiento.
&rueba este a calcular esto en un programa4
int i 3.D0D ;Berial?println ( i61);
+nseguida 'eras que si iXS[@[ y le incrementamos en ?, para C33 el resultado es
negati'o. +so es porque sencillamente no controla el desbordamiento. ambiJn es
ilustrati'o probar el resultado de
int i 3.D0D ;
Berial?println (. i 6 1);>ue seg%n rduino es W?.
-
8/17/2019 1 1 Primeros Pasos en Arduino
60/93
• *sto no es un error, sino &ue se decidió así en su día y (>> no controla losdesbordamientos, así &ue mucho cuidado, por&ue este tipo de errores pueden ser muy complicados de detectar
Más sobre las unciones en C++
.
Cuando se declara una función se debe especificar que parámetro 'a a de'ol'er. sí4
-
8/17/2019 1 1 Primeros Pasos en Arduino
61/93
o Conocimos tipos con ma(or ( menor capacidad para manejarn4meros enteros mas o menos grandes/ pero %ue todos siguenteniendo un l:mite de tama3o.
o El e,ecto de desbordamiento de tipos es cla+e ' debe ser
tenido mu( en cuanta cuando operamos con enteros.
o Hemos ido jugando con problemas lógicos ( "emos +istoalgunas soluciones %ue os pueden a(udar a plantear las+uestras propias.
&n programa con +arias ,unciones
&n programa un poco mas complicado
Home &n programa con +arias ,unciones
Objetivos.
o Aprender a operar con Arra(s .
o Como partir un problema en ,unciones especialistas.
o 5perar con enteros ( !trings.
o Entrenar ( desarrollar algunas "abilidades cla+es paraprogramar.
Material requerido.
Arduino Uno o similar. &n 'C con el entorno
de Arduino correctamente instalado (con$gurado.
Planteando un programa un poco más complicado.
http://www.prometec.net/http://www.prometec.net/categoria-producto/arduinos/http://www.prometec.net/http://www.prometec.net/categoria-producto/arduinos/
-
8/17/2019 1 1 Primeros Pasos en Arduino
62/93
#emos 'isto ya como definir funciones. +n esta sesión 'amos a plantear un programa
que acepte un n%mero desde la consola y compruebe si es o no primo. Y en caso de no
serlo, nos calcule cuales son los di'isores primos de este.
Normalmente para resol'er un problema comple*o es buena política partirlo en otros
problemas más peque$os que podamos resol'er más fácilmente. +n este caso 'amos a
plantear al menos funciones4
• 'rimo# M Calcula si un n4mero dado es primo/ de+uel+e true ( encaso contrario ,alse.
• Di+isores# M 'ara un n4mero dado nos de+uel+e sus di+isores primos.
• GetLine# M @amos a de$nir una ,unción genrica %ue recoja unacadena de te-to de la puerta serie/ para procesarla a posteriori. Eneste caso recogerá el n4mero a probar.
)a idea es, que nuestro programa empiece comprobando si un numero es primo. i lo
es, bien por el. no llamaremos a una función que calcule cuales son sus di'isores. Y
por ultimo necesitamos de algo que nos pueda dar un n%mero desde la consola para
probarlo y por eso escribimos otro programa que nos permita recibir cómodamente este
numero de entrada.
Ii*aros que casi sin haber escrito una linea de programa, ya he decidido como partirlo en
bloques mas sencillos de mane*ar y programar. +n otras palabras, he buscado una
estrategia, de resolución
• *sto es un poco trampa. 7arece &ue se me acaba de ocurririnstant$neamente pero no 'Aun&ue parezca increíble).
• 3espu#s de pensar un rato y pasar un rato mayor escribiendo yafnando el programa, da gusto presentarlo como si 4uera 4$cil. Que loes, pero lo &ue no ves, es la de horas &ue hay &ue estar haciendo
pruebas hasta todo va encajando y &ueda afnado.
• (on tiempo y pr$ctica ' %o, no mucha) ir#is mejorando con rapidez,en vuestra habilidad de romper problemas en pedazos manejables,simplemente re&uiere tiempo y entrenamiento, y esto es algo &ue osser$ 6til no solo para programar.
Operando con Arra*s.
-
8/17/2019 1 1 Primeros Pasos en Arduino
63/93
Con la función &rimo(" que 'imos en la sesión anterior, a medida que el tama$o del
n%mero a probar, crece, el tiempo que tarda en determinar si es primo tambiJn, ya que
di'idimos por todos los n%meros que le preceden.
-na manera más eficaz de calcular si un n%mero es primo, es di'idirlo solo por los
n%meros primos menores que el. &ero para esto necesitaríamos un modo de archi'ar
estos primos.
&odríamos e*ecutar primero el programa &rog`0. para hallar los N primeros n%meros
primos, y si dispusiJramos de alg%n medio para guardarlos, tendríamos un sistema más
eficaz para decidir si un n%mero es o no primo.
-na manera de archi'ar estos n%meros es definir un array.
-n array es simplemente una colección de elementos organizados como una matriz, y pueden definirse con 'arias dimensiones. +mpecemos con un array de una sola
dimensión. &ara definirlo podemos optar por dos maneras4
int serie1 W 7X ; //Nreamos una colecci
-
8/17/2019 1 1 Primeros Pasos en Arduino
64/93
-n error muy peligroso, y difícil de detectar sería algo así (&rog`\.S"4
int serie.WX { 3,7,0,1., .3" ; or (int i ; i4CC ; i66)
Berial?println(GPosicion G 6 Btrin!(i)6 G@ G6Btrin!(serie.WiX)) ;
-no esperaría que C33 generase un error, ya que definimos un array de P elementos y
hacemos referencia a ?HH, pero no. Nue'amente C33 nos sorprende de'ol'iendo
correctamente los P primeros 'alores y luego sigue leyendo posiciones de memoria
consecuti'as tan tranquilo, como si tu'ieran sentido.
• (>> espera &ue seamos nosotros &uienes controlemos esto, así &uemucho cuidado
&or %ltimo, mencionar que podemos mane*ar arrays de 'arias dimensiones4
%nt Ta2leroW , X ;
maginad que ablero representa las posiciones de una partida de a*edrez y cada 'alor
que contiene esa posición corresponde a una pieza que se encuentra en esa casilla.
A0nando la unción Primo12
.
i corremos el programa &rog`0. nos dará en el monitor una lista de primos hasta el
?HSA (o hasta el n+mero que deseemos modificando el valor de m"!imo" y
seleccionándolos con el ratón podremos copiar esos 'alores y pegarlos en el !+ para
crear un array con ellos (&rog`\."4
int PWX { ., 3, 7, D,11, 13, 1D, 1C, .3, .C, 31, 3D,
51, 53, 5D, 73, 7C, 01, 0D, D1,D3, DC, 3, C, CD, 11, 13, 1D,1C, 113, 1.D, 131, 13D, 13C, 15C, 171,17D, 103, 10D, 1D3, 1DC, 11, 1C1, 1C3,1CD, 1CC, .11, ..3, ..D, ..C, .33, .3C,.51, .71, .7D, .03, .0C, .D1, .DD, .1,.3, .C3, 3D, 311,
313, 31D, 331, 33D,35D, 35C, 373, 37C,
-
8/17/2019 1 1 Primeros Pasos en Arduino
65/93
30D, 3D3, 3DC, 33,3C, 3CD, 51, 5C, 51C, 5.1, 531, 533,53C, 553, 55C, 57D, 501, 503, 50D, 5DC,5D, 5C1, 5CC, 73,
7C, 7.1, 7.3, 751,75D, 77D, 703, 70C, 7D1, 7DD, 7D, 7C3,7CC, 01, 0D, 013, 01D, 01C, 031, 051,053, 05D, 073, 07C, 001, 0D3, 0DD, 03,0C1, D1, DC, D1C, D.D, D33, D3C, D53,D71, D7D, D01, D0C, DD3, DD, DCD, C,11, .1, .3, .D, .C, 3C, 73, 7D,
7C, 03, DD, 1, 3, D, CD, C11,C1C, C.C, C3D, C51, C5D, C73, C0D, CD1,CDD, C3, CC1, CCD, 1C, 113, 11C, 1.1 " ;
#emos definido un array enumerando sus elementos, entre lla'es y separados por
comas.
• *s importante percatarse de &ue despu#s de copiar y pegar las salidade 7rogUO.; hemos borrado la coma despu#s del -/-, por&ue si nodaría un error de sinta8is al defnir el array.
• bs#rvese &ue hay un punto y coma despu#s de la llave de cierre delarray. Aun&ue est$ entre llaves es una instrucción de asignación y nouna defnición de 4unción.
• Al defnir el array por enumeración, si el n6mero es alto podemos perder de vista cuantos elementos contiene. Si necesitamos calcularel n6mero de miembros podemos utilizar la 4unción sizeo4'):
int size = sizeof(P) /
sizeof(int);
• Donde ' es nuestro arra( ( di+idimos por si1eo,int# por%ue de$nimos' como int. Y para este caso de+uel+e un +alor de ;> elementos
hora bastaría di'idir el n%mero a probar por aquellos elementos del array &, menores
que Jl4
2ool Primo(int I){ int indeI ;
-
8/17/2019 1 1 Primeros Pasos en Arduino
66/93
hile ( PWindeIX 4 I) { i ( I F PWindeI66X ) return(alse); " return(true);"
9ecorremos los 'alores almacenados en el array &DE mediante inde2 al que 'amosincrementando en cada iteración, hasta que nos toque probar un primo mayor que el
'alor que comprobamos.
'unción $ivisores 12
.
+sta función 'a a recorrer los elementos del array en tanto en cuanto sean menores
(posibles di'isores" que el n%mero que probamos. i encontramos di'isores primos losguardamos en un array que hemos llamado !i'DE al que le asignamos un má2imo de S
di'isores4
int -ivW3.X ;int -ivisores(int I) {
int indeI ; //+punta a la posiciondel array PWX int pos ; //Para apuntar al arrayde divisores -ivWX hile ( PWindeIX 4 I)
{int Y PWindeI66X ;
i ( I F Y ) -ivWpos66X Y ; //&uardamos el divisor enen el array -ivWX? " // para uso posterior return(pos); //-evolvemos el numero dedivisores encontrado "
Cuando queramos imprimir los di'isores, basta con recorrer !i'DE.
• *s importante entender &ue tanto la 4unción 7rimo') como 3ivisores')recorren el array de n6meros primos hasta &ue sobrepasan el valordel numero a probar. Si el n6mero &ue probamos es mayor &ue elm$8imo primo &ue contiene 7R, 7odemos obtener resultadose8tra9os, ya &ue leeremos m$s elementos de los &ue hemos defnido.
• *ste m#todo de buscar divisores es v$lido solo para n6merosin4eriores a -/T' o en su caso, al m$8imo n6mero hasta el &uehayamos calculado primos), por&ue un n6mero no ser$ primo si7rimo') lo afrma, ya &ue encontrar$ divisores. 7ero puede afrmar&ue un numero es primo erróneamente si sus divisores sonsuperiores al m$8imo primo en 7R.
-
8/17/2019 1 1 Primeros Pasos en Arduino
67/93
#a unción 3et#ine12
.
unque ya comentamos que podemos usar una función parsent (" incluida en rduino
para recoger un 'alor del puerto serie, tiene el incon'eniente de que si no recibe una
entrada salta al cabo de un tiempo ( muy escasito" y de'uel'e H, por lo que tendríamos
que controlar el 'alor de'uelto para que no se repitiese continuamente.
&or eso 'amos a escribir una función de uso general que nos permita recoger una cadena
de te2to de la puerta serie sin que salga hasta que reciba un tring que 'amos a hacer
finalice en intro. !e hecho ya 'imos este programa, aunque no como función en la
sesión Comunicación con el e2terior
Btrin! &et'ine(){
Btrin! B GG ; i (Berial?availa2le()) { char c Berial?read(); ; hile ( c > LnL) //$astaAue el character sea intro {
B B 6 c ; delay(.7) ; c Berial?read(); " return(B) ; " "
!efinimos :etline(" de tipo tring, porque queremos que nos de'uel'a un te2to.
Comprobamos que hay algo disponible en la puerta serie, y en caso afirmati'o
construimos un tring a$adiJndole cada uno de los caracteres que leemos del puerto
serie, hasta que encontremos un intro.
l encontrar el intro, se cumple la condición de salida del =hile y termina la función
de'ol'iendo la cadena construida (sin el intro".
• %ormalmente convendr$ comprobar si hay algo disponible en la puerta serie antes de llamar a Getine'), y si es así, la comprobación&ue hace Getine') de tener algo disponible en el Serial seriaredundante.
• 7ero si llam$ramos a Getine') sin comprobarlo y esta no locontrolase, &uedaríamos atrapados en esta 4unción hasta &ue alguien
escribiera algo fnalizado con intro para poder salir y podría no sersencillo comprender el problema.
http://http/www.prometec.net/comunicacion-exterior/http://http/www.prometec.net/comunicacion-exterior/
-
8/17/2019 1 1 Primeros Pasos en Arduino
68/93
• %uevamente hemos incluido un delay de ms en el Phile paraasegurarnos de &ue Arduino no puede volver a leer mas caracteresantes de &ue a la velocidad de KL// bps haya llegado el pró8imocar$cter. Si la velocidad de comunicación es de --// bits porsegundo o m$s, se puede suprimir este retraso.
El programa principal
.
&odemos ya escribir nuestra función principal loop(", que llame a las funciones que
hemos definido a lo largo de esta sesión, para determinar si un numero que le pasamos
por la puerta serie es primo o no y en caso negati'o que nos muestre los di'isores
primos encontrados.
&odría ser algo así4Calculo de numeros primos en arduino4
void loop() { i (Berial?availa2le()) { Btrin! s &et'ine(); int i s?to%nt() ; //Nomo esperamos unnumero, convertimos el teIto a numero i ( Primo(i)) Berial?println(Btrin!(i) 6 G s primo?G);
else { Berial?println(Btrin!(i) 6 G o es primo?G); Berial?println(GBus divisores son@ G); int -ivisores(i);//=eco!emos el numero de divisores encontrados or (int n ; n4 ; n66)//%mprimimos los divisors del -ivWX Berial?print(Btrin!(-ivWnX) 6 G,tG); Berial?println(G G); // +laca2ar salta de linea " "
"+mpezamos comprobando si hay algo sin leer en la puerta serie y si es asi llamamos a
:et)ine(" para que nos consiga lo que hay.
Como :et)ine(" nos de'uel'e un tipo tring(" usamos la función estándar de rduino
C33, s.tont(" que con'ierte el contenido tring a tipo numJrico int.
!espuJs llamamos a &rimo(" para que compruebe este n%mero. i es primo,
simplemente imprime un mensa*e para confirmarlo. +n caso contrario llamamos a
!i'isores(" que busca y almacena en el array !i'DE los di'isores primos que encuentra.
http://www.prometec.net/wp-content/uploads/2014/10/Prog_9_3.rarhttp://www.prometec.net/wp-content/uploads/2014/10/Prog_9_3.rar
-
8/17/2019 1 1 Primeros Pasos en Arduino
69/93
Cuando di'isores regresa, nos de'uel'e el n%mero de di'isores encontrados y podemos
imprimirlos con un sencillo bucle for.
Resumen de la sesión
.
o Hemos operado con arra(s de una 4nica dimensión tanto paraleer su contenido como para modi$carlo.
o Hemos utili1ado el programa de primos como e-cusa paramostrar cómo se pueden resol+er problemas complejos/di+idindolos en otros más sencillos %ue podamos resol+er con,unciones simples.
o Esta es/ sin duda/ una de las "abilidades cla+e para ser unprogramador competente/ ( como todo en la +ida re%uierepractica e ir trabajando.
o ambin "emos de$nido una ,unción de propósito generalGetLine# %ue utili1aremos más +eces en el ,uturo.
Los pines cuasi analógicos
Los pines analógicos
Home Los pines cuasi analógicos
Objetivos
.
o Comprender las di,erencias entre analógico ( digital.
o Conocer las salidas cuasi analógicas de Arduino.
o odulación '
http://www.prometec.net/http://www.prometec.net/
-
8/17/2019 1 1 Primeros Pasos en Arduino
70/93
Material requerido.
Arduino Uno o similar. *sta sesión aceptacual&uier otro modelo de Arduino
&na Protoboard.
&n diodo LED.
na resistencia de == 5"mios..
Algunos cables de 'rotoboard..
Analógico * digital
odas las se$ales que hemos mane*ado hasta ahora con nuestro rduino , de entrada o
de salida, comparten una característica com%n4 on digitales, es decir que pueden tomar
un 'alor #:# o )86 pero no 'alores intermedios.
i representamos una el 'alor de una se?al digital a lo largo del tiempo 'eríamos algo
así4
http://www.prometec.net/categoria-producto/arduinos/http://www.prometec.net/producto/protoboard-830/http://www.prometec.net/producto/leds-de-colores-variados/http://www.prometec.net/producto/kit-de-resistencias-variadas/http://www.prometec.net/producto/cables-dupont-macho-macho/http://www.prometec.net/categoria-producto/arduinos/http://www.prometec.net/producto/protoboard-830/http://www.prometec.net/producto/leds-de-colores-variados/http://www.prometec.net/producto/kit-de-resistencias-variadas/http://www.prometec.net/producto/cables-dupont-macho-macho/
-
8/17/2019 1 1 Primeros Pasos en Arduino
71/93
+n la 'ida muchas cosas son así, apruebas o suspendes, enciendes la luz o la apagas,
pero muchas otras son 'ariables mensurables continuas y pueden tomar cualquier 'alor
que imaginemos, como el ángulo del relo* o la temperatura, que aun dentro de 'alores
finitos pueden tomar tantos 'alores intermedios como podamos imaginar,
esta clase de 'ariables las llamamos analógicas y una representación por
contraposición a lo digital, sería algo como esto4
No es raro que queramos controlar algo del mundo e2terior con una se$al analógica de
forma que el comportamiento del sistema siga esa se$al. &odemos por e*emplo querer
'ariar la luminosidad de un diodo )+! y no simplemente apagarlo o encenderlo
+n esta sesión aprenderemos a en'iar se$ales analógicas a los pines de salida de
rduino.
,alidas cuasi analógicas.
#asta ahora hemos 'isto como acti'ar las salidas digitales de rduino, para encender y
apagar un )+! por e*emplo. &ero no hemos 'isto como modificar la intensidad del
brillo de ese )+!. &ara ello, tenemos que modificar la tensión de salida de nuestro
rduino, o en otras palabras tenemos que poder presentar un 'alor analógico de salida.
&ara empezar tenemos que de*ar claro que los rduino carecen de salidas analógicas
puras que puedan hacer esto (con la notable e2cepción del rduino !-+".
-
8/17/2019 1 1 Primeros Pasos en Arduino
72/93
&ero como los chicos de rduino son listos, decidieron emplear un truco, para que con
una salida digital podamos conseguir que casi parezca una salida analógica.
este truco se le llama &67, siglas de &ulse 6idth 7odulation, o modulación de
ancho de pulsos. )a idea básica es poner salidas digitales que 'arían de forma muy
rápida de modo que el 'alor eficaz de la se$al de salida sea equi'alente a una se$al
analógica de menor 'olta*e.
)o sorprendente es que el truco funciona.
Ii*aros en la anchura del pulso cuadrado de arriba. Cuanto mas ancho es, mas tensión
promedio hay presente entre los pines, y esto en el mundo e2terior es equivalente a un
'alor analógico de tensión comprendido entre H y P;. l PH] es equi'alente a una
se$al analogica del PH] de P;, es decir S,P. i mantenemos los P; un [P] del tiempo,
será el equi'alente a una se$al analógica de [P] de P; X ,[P ;.
&ara poder usar un pin digital de rduino como salida analógica, lo declaramos en el
etup(" igual que si fuera digital4
pinMode( C, OUTPUT) ;)a diferencia 'iene a la hora de escribir en el pin4
-
8/17/2019 1 1 Primeros Pasos en Arduino
73/93
di!ital#rite(C, $%&$); //Pone 7Z en la salidadi!ital#rite(C, 'O#); //Pone Z en la salidaanalo!#rite( C, Z) ;
analog6rite escribe en el pin de salida un 'alor entre H y P;, dependiendo de ; (que
debe estar entre H y SPP".
!e este modo si conectamos un )+! a una de estas salidas &67 podemos modificar su
brillo sin más que 'ariar el 'alor que escribimos en el pin.
&ero hay una restricción. No todos los pines digitales de rduino aceptan poner 'alores
&67 en la salida. olamente aquellos que tienen un símbolo delante del n%mero.
Ii*aros en la numeración de los pines de la imagen4
solo los que lle'an simbolo
• Solamente los pines ;, , L, K, -/ y -- pueden hacer 7? y simularun valor analógico en su salida.
• Si intentas hacer esto con un pin di4erente, Arduino acepta la ordentran&uilamente, sin error, pero para valores de / a -V entiende &ue
es y para el resto pone @FG@ y sigue con su vida satis4echo conel deber cumplido.
-
8/17/2019 1 1 Primeros Pasos en Arduino
74/93
Modi0cando el brillo de un #E$
.
;amos a hacer el típico monta*e de una resistencia y un diodo )+!, similar al de la
sesión , pero asegurándonos de usar uno de los pines digitales que pueden dar se$ales
&67. +n la imagen he usado el pin \.
&odemos escribir un programa parecido a esto4
void setup() //Pro!8181 {
pinMode( C, OUTPUT) ;"
void loop()
{ or ( int i ; i4.77 ; i66) { analo!#rite (C, i) ; delay( 1); " "
+l )+! 'a aumentando el brillo hasta un má2imo y 'uel'e a empezar
bruscamente. &odemos modificar un poco el programa para que la transición sea menos
'iolenta4
void setup() // Pro! 18.
{pinMode( C, OUTPUT) ;
"
void loop(){ or ( int i :.77 ; i4.77 ; i66) { analo!#rite (C, a2s(i)) ; delay( 1); ""
quí apro'echo ( por pura 'agancia" para hacer el ciclo de subir y ba*ar el brillo
del )+! con un %nico bucle. )a función abs(num", de'uel'e el 'alor absoluto o sin
signo de un n%mero num, y por eso mientras que i 'ia*a de WSPP a SPP, abs(i" 'a de SPP
a H y 'uelta a subir a SPP. />ue os parece el