1 00:00:00,000 --> 00:00:14,960 Buenas tardes. Voy a explicar el paso 6 del aula donde hablamos de una iniciación a la 2 00:00:14,960 --> 00:00:23,320 programación en Arduino. Entonces voy a ir explicando cada una de las imágenes que nos 3 00:00:23,320 --> 00:00:31,079 aparecen en el aula lo que queremos lograr es una estructura lo que es una estructura básica de lo 4 00:00:31,079 --> 00:00:36,840 que se llama un sketch en arduino que sería el código que vamos a implementar para que funcione 5 00:00:36,840 --> 00:00:45,219 nuestro esquema entonces en todos los sketch tiene que haber como siempre dos métodos que son 6 00:00:45,219 --> 00:00:51,340 indispensables uno sería el setup y otro es el loop ya he hablado en varios vídeos sobre ellos 7 00:00:51,340 --> 00:01:07,659 Pero aquí lo vuelvo a explicar para que nos quede bien claro para qué se utilizan estos dos métodos y que son imprescindibles, siempre tienen que aparecer en nuestro código. 8 00:01:07,659 --> 00:01:14,439 el setup solo ya lo he dicho muchas veces pero solo se va a ejecutar una sola vez donde se 9 00:01:14,439 --> 00:01:19,959 pondrán aquí parámetros de configuración como aquí pues he puesto el pin mode que sería un 10 00:01:19,959 --> 00:01:27,280 método que lo que hace es que configura el pin 13 como un pin de salida en cambio el loop se va a 11 00:01:27,280 --> 00:01:33,939 ejecutar de manera repetitiva desde que iniciamos la ejecución del propio programa se va a estar 12 00:01:33,939 --> 00:01:38,680 repitiendo y repitiendo y repitiendo hasta que lo paremos aquí se pondrán pues otro tipo de 13 00:01:38,680 --> 00:01:44,799 lógica la lógica en definitiva la lógica principal del programa es la que se pondrá en el loop aquí 14 00:01:44,799 --> 00:01:51,219 no está diciendo que le está concediendo o le está aportando al pin 13 un valor alto un valor 15 00:01:51,219 --> 00:02:01,010 de 1 para que pues esto será un led para que se encienda bien una vez que hemos visto los dos 16 00:02:01,010 --> 00:02:07,390 componentes principales de todo programa es el método setup y el método loop, cómo se crea una 17 00:02:07,390 --> 00:02:14,270 variable en Arduino, tanto si la variable está fuera de esos dos métodos que serían variables 18 00:02:14,270 --> 00:02:21,009 globales y que valdrían para todo el programa, todo el programa incluidos los métodos podrían 19 00:02:21,009 --> 00:02:25,889 leer dichas variables o bien dentro de un método como dentro del setup o dentro del loop o dentro 20 00:02:25,889 --> 00:02:28,830 de otra función que nosotros creemos que serían a nivel local 21 00:02:28,830 --> 00:02:31,789 y solo se tendrían valor dentro 22 00:02:31,789 --> 00:02:34,849 del propio método. Hay distintos tipos en temas 23 00:02:34,849 --> 00:02:37,669 más de creación de variables, pero que sepáis que primero 24 00:02:37,669 --> 00:02:40,849 se tiene que poner el tipo de la variable 25 00:02:40,849 --> 00:02:43,650 luego el nombre y luego se inicializa si queremos 26 00:02:43,650 --> 00:02:45,490 como veis aquí 27 00:02:45,490 --> 00:02:49,870 una variable realmente no es nada más que un cajón 28 00:02:49,870 --> 00:02:52,449 que tiene un nombre, en ese cajón tú guardas algo 29 00:02:52,449 --> 00:02:55,710 en función del tipo de cajón, del tipo de variable 30 00:02:55,710 --> 00:02:58,990 que nosotros queramos, podremos guardar una cosa u otra. 31 00:02:59,490 --> 00:03:01,770 Si la variable es de tipo entero, en ese cajón 32 00:03:01,770 --> 00:03:04,189 solo podremos meter números enteros. 33 00:03:04,550 --> 00:03:07,530 Si es de tipo float, solo números decimales. Si es de tipo 34 00:03:07,530 --> 00:03:10,550 bool, solo verdadero o falso. Y si es de tipo char, 35 00:03:10,849 --> 00:03:13,689 solo caracteres. Pero que sepáis que una variable 36 00:03:13,689 --> 00:03:16,889 es un contenedor de algo en el que 37 00:03:16,889 --> 00:03:19,689 lógicamente tiene que tener un nombre para luego ser 38 00:03:19,689 --> 00:03:22,849 identificado. Y se le iguala 39 00:03:22,849 --> 00:03:25,650 al valor que nosotros queremos almacenar, que sería la inicial 40 00:03:25,650 --> 00:03:37,000 de la propia variable con respecto a la creación de constantes en c++ se hace de dos modos bien 41 00:03:37,000 --> 00:03:43,639 añadiendo una palabra const delante del esto sería si nos olvidamos la palabra const esto sería como 42 00:03:43,639 --> 00:03:49,400 la creación de una variable si nosotros le ponemos previo a ella le ponemos la palabra const estamos 43 00:03:49,400 --> 00:03:53,419 diciendo que es una constante una constante también va a ser un contenedor que va a contener 44 00:03:53,419 --> 00:03:59,960 algo, pero ese algo nunca va a cambiar. Si tenemos la constante LED, como es esta, va a tener siempre 45 00:03:59,960 --> 00:04:06,360 un 13 y no puede cambiar ese valor. Ese cajón siempre va a tener un 13, ese número entero que 46 00:04:06,360 --> 00:04:10,979 es el número 13. La otra manera es a través de una cláusula que se pone al principio del programa, 47 00:04:11,180 --> 00:04:15,919 como sucede con los includes, que luego veremos, que se pone con esta estructura, en el que estamos 48 00:04:15,919 --> 00:04:26,750 definiendo que LED va a tener un valor constante de 13. La otra cláusula que se puede poner al 49 00:04:26,750 --> 00:04:30,889 principio del programa sería la de include que es para incluir librerías externas y por tanto 50 00:04:30,889 --> 00:04:36,170 serán las primeras líneas que se pondrán en el programa aquí veis se hace con estos ángulos 51 00:04:36,170 --> 00:04:42,410 invertidos en el que se pone dentro la librería la librería generalmente la librería es una 52 00:04:42,410 --> 00:04:50,029 librería con una extensión punto h h de head de cabecera el archivo cabecera es el enlace a una 53 00:04:50,029 --> 00:05:03,579 librería esta sería por ejemplo la librería de servo está la del lcd etcétera entramos en dentro 54 00:05:03,579 --> 00:05:10,120 de un programa para el que no lo conozca podemos utilizar condicionales un condicional se va a 55 00:05:10,120 --> 00:05:15,019 utilizar con esta estructura que aparece aquí siempre con un if luego entre paréntesis dentro 56 00:05:15,019 --> 00:05:21,160 va una condición y luego hay un bloque con una apertura de una llave y una llave de cierre donde 57 00:05:21,160 --> 00:05:25,779 dentro tenemos una serie de comandos que vamos a ejecutar o no dependiendo si se cumple esta 58 00:05:25,779 --> 00:05:31,639 condición pero un condicional tiene que cumplirse esta condición para que pueda leer esta línea si 59 00:05:31,639 --> 00:05:35,800 esta condición no se cumple se lo saltará y seguirá con las siguientes líneas del programa 60 00:05:35,800 --> 00:05:43,519 hay otra versión veis aquí este ejemplo nos dice si se cumple la condición escribirá en el 13 en 61 00:05:43,519 --> 00:05:50,639 el pin 13 un valor de high o de 1 si no se cumple pues se nos salta y no haría esta línea el if else 62 00:05:50,639 --> 00:05:53,759 sería la otra posibilidad y es cuando tenemos un if 63 00:05:53,759 --> 00:05:56,980 y se cumple la condición, pues leería 64 00:05:56,980 --> 00:05:58,899 esta línea. Pero si no se cumple, ahora 65 00:05:58,899 --> 00:06:02,800 no seguiría el programa, pero tenemos 66 00:06:02,800 --> 00:06:05,819 otra posibilidad que es el else, que se pondría así, también con 67 00:06:05,819 --> 00:06:08,779 una llave de apertura y una de cierre y leería esta 68 00:06:08,779 --> 00:06:11,639 otra línea. Entonces, si se cumple la condición, valor mayor de 69 00:06:11,639 --> 00:06:14,660 500, escribiría en el pin 13 un valor de alto. 70 00:06:15,019 --> 00:06:17,779 Pero si no, ahora ya no lo perderíamos, sino que 71 00:06:17,779 --> 00:06:24,819 también hay otra línea que, en el caso de que no se cumpla, lo que hace es que al pin 13 le va a 72 00:06:24,819 --> 00:06:38,579 conferir un valor de low o de cero. Hemos visto los condicionales, vamos a ver los bucles for. Un 73 00:06:38,579 --> 00:06:43,199 bucle for se utiliza para repetir un conjunto de instrucciones, el número de veces que nosotros 74 00:06:43,199 --> 00:06:49,180 indiquemos, y siempre tendrá tres partes. Una inicialización, veis el for, se pone entre paréntesis, 75 00:06:49,560 --> 00:06:54,019 y entre paréntesis tiene tres partes separadas por puntos y coma. La primera parte sería esta, 76 00:06:54,019 --> 00:06:59,980 que es una inicialización, la segunda sería una condición y la tercera sería un incremento. 77 00:07:00,420 --> 00:07:04,720 Entonces esto lo que hará es que en un principio, veis, está en la inicialización, 78 00:07:04,879 --> 00:07:07,600 está inicializando la variable i de tipo entero a cero 79 00:07:07,600 --> 00:07:13,540 y nos está poniendo la condición de que i sea menor que 10 y luego aparecería el incremento. 80 00:07:13,660 --> 00:07:19,019 Entonces el primer valor con el que pasaría entraría aquí y nos sacaría en el monitor en serie, 81 00:07:19,019 --> 00:07:23,399 nos sacaría un cero, volvería otra vez para atrás y comprobaría la condición. 82 00:07:23,399 --> 00:07:50,339 ¿Cero es menor que 10? Sí. Entonces produciría el incremento, se formaría el valor de 1 y imprimiría 1 y así sucesivamente hasta el 9, porque cuando llegue al 9, le incremente y sea igual a 9, pasaría al monitor, lo imprimiría, pero cuando subiéramos otra vez, lo primero que hace es incrementarlo. 83 00:07:50,339 --> 00:07:52,759 al incrementarlo nos daría un valor de 10 84 00:07:52,759 --> 00:07:54,819 y él como ya no cumple la condición 85 00:07:54,819 --> 00:07:56,399 porque i tiene que ser menor que 10 86 00:07:56,399 --> 00:07:59,459 no lo imprimiría y saltaría y seguiría con las demás líneas 87 00:07:59,459 --> 00:08:01,079 con lo cual este programa 88 00:08:01,079 --> 00:08:03,339 lo que haría es que imprimiría en el monitor en serie 89 00:08:03,339 --> 00:08:06,120 de manera vertical 90 00:08:06,120 --> 00:08:09,180 0, 1, 2, 3, 4, 5, 6, 7, 8 y 9 91 00:08:09,180 --> 00:08:11,259 ¿para qué es usado? 92 00:08:11,379 --> 00:08:14,220 para barridos, contadores, animaciones con LED, etc. 93 00:08:19,699 --> 00:08:22,139 a continuación tenemos el apartado de funciones 94 00:08:22,139 --> 00:08:42,539 Las funciones las utilizaremos también en los ejemplos y se utilizan para agrupar instrucciones, pero de una manera ordenada y más clara y que esté separado de lo que es en un lugar apartado del programa al que podamos llamar a esa función, nos haga una determinada tarea y después nos devuelva un valor. 95 00:08:43,519 --> 00:08:46,200 Hay funciones en las que devuelven valores y otras en las que no. 96 00:08:46,740 --> 00:08:52,539 En este caso tenemos una función que sería voidEncenderLed y dentro haría esta línea. 97 00:08:53,080 --> 00:08:59,759 ¿Cómo se la llama? Se la llama poniendo el nombre de la función y los doble paréntesis y punto y coma. 98 00:08:59,759 --> 00:09:05,980 Esto se le llamaría desde otro lado del programa, a lo mejor dentro del void loop seguramente, 99 00:09:06,480 --> 00:09:09,639 y diríamos en el encenderLed esta otra función estaría separada, 100 00:09:09,639 --> 00:09:22,580 Pues dentro del programa tendría una función setup con su llave de apertura y de cierre, con sus líneas dentro. Luego tendríamos una loop y dentro del loop, por ejemplo, tendríamos encender LED. 101 00:09:22,860 --> 00:09:31,600 Cuando llegue a esa línea, llamaría a otra función, que es la tercera que tendríamos en el programa, que sería voice encender con su llave de apertura y su llave de cierre. 102 00:09:31,600 --> 00:09:35,340 la ejecutaría, le daría un valor de alto al pin 13 103 00:09:35,340 --> 00:09:37,879 y una vez que terminara la función 104 00:09:37,879 --> 00:09:39,480 volvería a la siguiente línea 105 00:09:39,480 --> 00:09:42,779 desde donde ha sido llamada dicha función 106 00:09:42,779 --> 00:09:46,879 o sea que seguiría leyendo debajo de la línea de encender LED 107 00:09:46,879 --> 00:09:56,850 pasamos a las entradas y salidas digitales 108 00:09:56,850 --> 00:09:59,409 a lo largo de todo el curso 109 00:09:59,409 --> 00:10:00,870 he hablado de ello 110 00:10:00,870 --> 00:10:04,690 pero lo vuelvo aquí a remarcar 111 00:10:04,690 --> 00:10:07,970 primero en configuración dentro del setup 112 00:10:07,970 --> 00:10:11,929 ya configurábamos los pines como de entrada o de salida 113 00:10:11,929 --> 00:10:15,309 un pin entonces se encarga de configurar aquí 114 00:10:15,309 --> 00:10:18,490 los pines 2 y 13, uno de entrada y otro de salida 115 00:10:18,490 --> 00:10:21,470 la lectura digital como se hace 116 00:10:21,470 --> 00:10:23,169 se hace con el digital red 117 00:10:23,169 --> 00:10:26,830 aquí nos está diciendo que recojamos en esta variable entera 118 00:10:26,830 --> 00:10:31,370 el estado fruto de la lectura digital del pin 2 119 00:10:31,370 --> 00:10:33,730 eso sería al leerlo 120 00:10:33,730 --> 00:10:55,830 Sería un pin de salida. En cambio, una escritura digital sería con digital write y le diríamos que le estamos confiriendo al pin 13 un valor alto. Entonces, sería lo que sería una escritura digital y, por tanto, esta sería de salida porque le estamos confiriendo al pin 13 un valor alto. 121 00:10:55,830 --> 00:11:05,730 mientras que, lo he dicho mal antes, esta sería con el pin 2, sería un valor de entrada. 122 00:11:05,730 --> 00:11:11,049 todo dependerá de lo que queramos utilizar 123 00:11:11,049 --> 00:11:12,789 para lo que queramos utilizar el pin 124 00:11:12,789 --> 00:11:15,990 si lo que queremos es que ese pin lea un dato 125 00:11:15,990 --> 00:11:17,769 con lo cual sería entrada 126 00:11:17,769 --> 00:11:23,710 o bien le proporcionaremos un voltaje 127 00:11:23,710 --> 00:11:25,889 o le escribamos un voltaje a ese pin 128 00:11:25,889 --> 00:11:27,070 y que sea de salida 129 00:11:27,070 --> 00:11:28,950 y por ejemplo encienda un LED 130 00:11:28,950 --> 00:11:36,360 en cuanto a las lecturas analógicas 131 00:11:36,360 --> 00:11:38,419 la diferencia con las anteriores 132 00:11:38,419 --> 00:11:43,299 es que ahora una lectura analógica se va a hacer a través de los pines analógicos 133 00:11:43,299 --> 00:11:47,659 y el método va a ser con el analogRED en vez de con el digitalRED. 134 00:11:48,179 --> 00:11:52,100 Este va a devolver, ahora ya no devuelve un valor de 0 o de 1 o de high o de low, 135 00:11:52,220 --> 00:11:55,159 sino que devolverá valores entre 0 y 1023. 136 00:12:00,240 --> 00:12:03,679 En cuanto al PWM, es la modulación por ancho de pulso, 137 00:12:04,120 --> 00:12:08,120 es como si dijéramos un intermedio entre lo que es el digital y el analógico. 138 00:12:08,120 --> 00:12:23,539 Esto es el pulse width modulation. Es una técnica que permite a Arduino simular una salida analógica utilizando pines digitales. Aunque el pin solo puede estar en high, encendido o apagado, con el PWM lo que vamos a conseguir es valores intermedios. 139 00:12:23,539 --> 00:12:28,039 aquí tenemos un ejemplo de un control de billo del LED 140 00:12:28,039 --> 00:12:34,379 en el que el análogo le está escribiendo un valor entre 9 y 128 141 00:12:34,379 --> 00:12:41,190 un ciclo de trabajo bajo significa que el pin está encendido poco tiempo 142 00:12:41,190 --> 00:12:42,549 y eso sería menos potencia 143 00:12:42,549 --> 00:12:45,629 en cambio cuando el ciclo de trabajo es alto 144 00:12:45,629 --> 00:12:48,870 lo que le estamos dando es un valor de más potencia 145 00:12:48,870 --> 00:12:56,580 para acabar tenemos aquí un ejemplo completo 146 00:12:56,580 --> 00:12:58,539 integrado en el que meto el include 147 00:12:58,539 --> 00:13:07,799 meto los dos tipos de constantes, meto cómo creo un objeto y luego meto lo único que no ha introducido, sería una función. 148 00:13:08,299 --> 00:13:17,360 Pero veis aquí lo que hace primero, importa la librería servo, a continuación lo que hace es que el define crea una variable llamada let con un valor de 13 149 00:13:17,360 --> 00:13:22,480 y luego creamos otra variable de tipo entero llamada pot con un valor de a0. 150 00:13:23,480 --> 00:13:35,500 Creamos un objeto servo que proviene de la librería que hemos importado y luego en el setup, que sería el que lee una vez, lo que hace es que configuramos el LED, o sea el 13, como de salida. 151 00:13:36,200 --> 00:13:45,279 Al servo le unimos al pin 9 para indicar que el pin que gobierna el servo va a ser el 9 de la placa de Arduino. 152 00:13:45,279 --> 00:14:10,720 Y ya entramos en el bucle loop que, acordaos, está continuamente leyéndolo. Lo primero que hace es que desde el pin analógico está leyendo el valor y lo está metiendo dentro de un valor entero y luego como es analógico y ese valor va a tener un valor comprendido entre 0 y 1023, nos dice que si ese valor es mayor de 512, 153 00:14:10,720 --> 00:14:15,580 que al LED, o sea, al pin 13, le pase un valor de 1. 154 00:14:16,080 --> 00:14:19,620 Si no, al LED le pasa un valor de 0. 155 00:14:20,320 --> 00:14:21,379 Con lo cual, ¿qué le está haciendo? 156 00:14:21,500 --> 00:14:25,299 Le está haciendo que cuando tenemos valores de mayor de 512, 157 00:14:25,419 --> 00:14:26,120 lo está encendiendo. 158 00:14:26,279 --> 00:14:30,139 Cuando tenemos valores menores de 512, lo está apagando. 159 00:14:31,059 --> 00:14:38,480 A continuación, tiene un for que una vez que hemos obtenido 160 00:14:38,480 --> 00:14:45,320 una vez que ya hemos obtenido el resultado del condicional 161 00:14:45,320 --> 00:14:47,120 lo que hace es una lectura del for 162 00:14:47,120 --> 00:14:50,639 y el for lo que hace es que crea una variable i con un valor 0 163 00:14:50,639 --> 00:14:53,980 y va a recorrer desde 0 hasta un valor de 180 164 00:14:53,980 --> 00:14:57,139 que serán de 0 a 180 grados del servo 165 00:14:57,139 --> 00:14:58,899 y va a ir de 10 en 10 166 00:14:58,899 --> 00:15:01,980 esto sería igual que i igual a i más 10 167 00:15:01,980 --> 00:15:04,279 recorrerá el i 168 00:15:04,279 --> 00:15:07,259 lo que hará es que en un principio 169 00:15:07,259 --> 00:15:10,840 y escribirá en el servo un valor de 0, con lo cual le está comunicando 170 00:15:10,840 --> 00:15:17,179 que se localice en la posición 0 grados, retrasará 100 milisegundos 171 00:15:17,179 --> 00:15:23,200 y acordaos que delay es un comando que nos va a indicar que pause la ejecución, 172 00:15:23,279 --> 00:15:28,299 la pausará 10-100 milisegundos, el parámetro que tiene dentro es milisegundos, 173 00:15:29,820 --> 00:15:33,059 pausará 100 milisegundos y a continuación subirá otra vez a la for. 174 00:15:33,059 --> 00:15:44,299 Se producirá el incremento de 10 y tendremos que ahora el valor de Y valdrá 10 y le pasará al servo o le escribirá en el servo un valor de 10 grados para que se gire 10 grados. 175 00:15:44,740 --> 00:15:47,399 Esperará 100.000 segundos y subirá otra vez. 176 00:15:47,840 --> 00:15:53,059 Pasará por 20, por 30, por 40, por 50, así hasta 180 grados. 177 00:15:53,940 --> 00:16:01,480 Y cuando termine ese for, cuando haga todo el recorrido cada 10 grados del servo, saldrá del mismo y volverá a leer el loop. 178 00:16:01,480 --> 00:16:10,740 Hará exactamente lo mismo y volverá a generar las distintas posiciones del propio servo. 179 00:16:11,500 --> 00:16:16,879 Este analogRED es porque está unido a un potenciómetro, 180 00:16:17,080 --> 00:16:21,919 entonces lo que vamos a hacer es que el potenciómetro con la ruedecita nosotros podemos modificarlo 181 00:16:21,919 --> 00:16:29,759 y darle distintos valores de entre 0 y 1023, de tal manera que movamos el servo o no lo movamos.