práctica
Ejercicios de
Arduino
NIVEL I
Prof. Daniel Tedesco
robótica
Capacitación DOCENTE
Ejercicio -3
Variables
¿Qué es una variable?
Es un tipo de dato que nos permite guardar información, en el entorno de programación y en una parte de la ram de la placa Arduino
Un programa (o “sketch” en la jerga Arduino) transmite datos procesados a los actuadores.
Lo que llamamos variables es simplemente una manera de codificar o representar estos datos dentro del sketch para facilitar su manipulación de cara a su transmisión hacia o desde los actuadores/sensores.
Desde un punto de vista práctico, podemos considerar las variables como los cajones de un escritorio, cada uno tiene una etiqueta describiendo el contenido y dentro de él se encuentra el valor de la variable (el contenido del cajón).
Hay tantos tipos de variables como de datos: números de todo tipo representados de diferentes maneras (enteros, reales, binarios, decimales, hexadecimales, etc.), textos (de un solo o varios caracteres o líneas), matrices (arrays), constantes, etc.
Tipos de variables Arduino
Para saber más: aquí
Variable int y unsigned int
//int es una variable para un dato entero, igual a un número tanto positivos como negativos
//int va desde los -32,768 to 32,767
//Si agregamos la variablable unisgned int, duplicamos las posibilidades del valor
Estos valores están limitados por las características del hardware Arduino que es de 16 bits o 2 bytes
Ejercicio sobre variables
/*Uso de la variable float, para números decimales
* Pueden utilizarse hasta 6 números decimales después de la coma
* Float y Double son vairables similares
*/
float a = 5.5;
int b = 6;
float c = 0;
void setup() {
Serial.begin(9600);
//SUMA
c = a+b;
Serial.println("Resultado : ");
Serial.println(c);
//RESTA
c = a-b;
Serial.println("Resultado2 : ");
Serial.println(c);
//MILTIPLICACION
float a = 5.6;//al tratarse de una variable. puedo actualizar su valor
c = a*b;
Serial.println("Resultado3 : ");
Serial.println(c);
//DIVISION
c = a/b;
Serial.println("Resultado4 : ");
Serial.println(c);
}
void loop() {
// put your main code here, to run repeatedly:
}
Consigna: realiza ejercicios con las operacines básicas y al menos dos variables
Strings
En C++ un String es un tipo de datos que es usado para guardar cadenas de caracteres.
Ejemplo:
String ejemplo1 = "Hola ";
String ejemplo2 = "Mundo!";
String resultado;
void setup() {
resultado = ejemplo1+ejemplo2;
Serial.begin(9600);
Serial.print("El resultado de la concatenacion es: ");
Serial.println(resultado);
}
void loop() {
// put your main code here, to run repeatedly:
}
Ejemplos de variables
Arrays
Un array o arreglo es un conjunto de datos que pueden indexarse y recuperarse. Es decir, es un conjunto de variables en al cuales puedo guardar datos
Ejemplos de variables
Arrays
Ejemplos:
int edades[5];//cantidad de casilleros o tamaño de la variable
float peso [10]; // guardo los valores de peso de 10 personas
int edades1 [] = {12, 56 ,60};// el sistema interpreta que existen 3 casilleros
int edades2[10]={12, 56, 60};// el sistema guarda 10 espacios pero solo utiliza 3
int dinero_en_cuenta[10] ={50,-12,30};//el sistema puede registrar números negativos
char mensaje[30] = "hola bienvenidos";// se pueden armar arryas de texto
Variables locales y globales
Ejemplos
// C++ code
//
String ejemplo1 = "Hola ";
String ejemplo2 = "Mundo!"; // variables globales(fuera de las funciones)
String resultado;
void setup() {
int ejemplo1= "Chau "//variable local(dentro de la función)
resultado = ejemplo1+ejemplo2;
Serial.begin(9600);
Serial.print("El resultado de la concatenacion es: ");
Serial.println(resultado);
}
void loop() {
// put your main code here, to run repeatedly:
}
Variables globales: Fuera de la función
Variables locales: Dentro de una función
Ejemplos de arrays
int dinero_en_cuenta[10] ={50,-12,30};
void setup (){
Serial.begin(9600);
delay(100);
Serial.println (String(dinero en cuenta[0]));// en el monitor serie se imprimre la posicion 0=50
}
void loop (){
}
int dinero_en_cuenta[10] ={50,-12,30};
void setup (){
Serial.begin(9600);
delay(100);
diero_en_cuenta[0] = 10;// cambio el valor de la posición 0,por 10
Serial.println (String(dinero_en_cuenta[0]));// en el monitor serie se imprimre la posicion 0=10
}
void loop (){
}
(Detectar el error de ambos códigos)
Ejercicio -2
Operadores y condicionales
Definiciones
Un operador es un elemento de programa que se aplica a uno o varios operandos en una expresión o instrucción. Un operador es un símbolo que indica al compilador que se lleve a cabo ciertas manipulaciones matemáticas o lógicas
Los operadores aritméticos que se incluyen en el entorno de programación son suma, resta, multiplicación, división, módulo y asignación. Estos devuelven la suma, diferencia, producto, cociente o resto (respectivamente) de dos operandos
Las operadores compuestos combinan una operación aritmética con una variable asignada. Estas son comúnmente utilizadas en los bucles tal como se describe más adelante. Estas asignaciones compuestas pueden ser:
++, –
+= , -= , *= , /=
Definiciones
Operadores de comparación. Las comparaciones de una variable o constante con otra se utilizan con frecuencia en las estructuras condicionales del tipo if, while, etc.. para testear si una condición es verdadera.
==, !=, <, >, <=, >=
Los operadores lógicos o booleanos son usualmente una forma de comparar dos expresiones y devuelve un VERDADERO o FALSO dependiendo del operador. Existen tres operadores lógicos, AND (&&), OR (||) y NOT (!), que a menudo se utilizan en estamentos de tipo if
Ejercicios -1
Función "if/else"
"If"
IF es un condicional, que ejecuta una orden si ocurre previamente una condición o estado
Ejemplo:
IF - SI(si se cumple el paréntesis) {entonces se ejecuta el corchete}
Ejemplo2:
IF - SI(si se cumple el paréntesis) {entonces se ejecuta el corchete}
else -sino{ocurre otra cosa}
Trabajando con pulsadores
ejercicio -1.1
Programa if/else
// C++ code//pulsar y mantener pulsado
//
void setup()
{
pinMode(2, INPUT);//configuro el pin 2 como entrada, para leer cuando el pulsador este presionado
pinMode(13, OUTPUT);//configuro el pin 13 y monitoreo el led onboard
}
void loop(){
int estadoboton = digitalRead(2);//leo el estado del pin 2, guardo el resultado en una variable
if(estadoboton == 1){//si lo que pasa en el parentesis se cumple, se ejecuta el corchete
delay(1000);//probar primeramente sin delay
digitalWrite(13, HIGH);
}
else{
delay(1000);
digitalWrite(13, LOW);
}
}
ejercicio -1.2
or || ejercicio -1.2
and && ejercicio -1.3
otras variaciones
> Mayor que
< Menor que
>= Mayor o igual
!= Desigual (cambiar en el código anterior)
ejercicio -1.4
Imprimir en monitor serie
Ejercicios 0
Bucles
BUCLE FOR
¿Qué es el ciclo FOR?
Es una estructura de control que sirve para repetir ciertas instrucciones un número determinado de veces. Las instrucciones que se repiten son las que el usuario decide, y el número de veces que se repiten también lo determina el usuario.
Fuente: https://www.wexterhome.com/curso-arduino/el-bucle-for/
/*
* SINTAXIS DEL BUCLE FOR
* for(expresión de inicio, condición, incremento/decremento){
* instrucciones;
* }
*/
Ejercicio 0.1 Encender leds sin bucle
código sin bucle
const int LED1 = 10;
const int LED2 = 11;
const int LED3 = 12;
void setup() {
// put your setup code here, to run once:
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
digitalWrite(LED1, HIGH);
delay(500);
digitalWrite(LED1, LOW);
delay(500);
digitalWrite(LED2, HIGH);
delay(500);
digitalWrite(LED2, LOW);
delay(500);
digitalWrite(LED3, HIGH);
delay(500);
digitalWrite(LED3, LOW);
delay(500);
}
código con bucle for
const int LED1 = 10;
const int LED2 = 11;
const int LED3 = 12;
void setup() {
// put your setup code here, to run once:
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
for(int i = 10; i<13; i++){
digitalWrite(i, HIGH);
delay(500);
digitalWrite(i, LOW);
delay(500);
}
}
Ejercicio 1
Encender leds
Ejercicio 1.1
Realizar las siguientes pruebas en TinkerCAD
Ejercicio 1.1
Tabla de resistencias: Varía las resistencias de tus leds según la tabla
Ejercicio 1.1
Interpretación de las resistencias
Ejercicio 1.1
Calculadora de resistencias (Click en la imagen)
Ejercicio 1.2
Diagrama
programa
byte led = 13;
void setup() {
pinMode(led, OUTPUT);
}
void loop(){
digitalWrite(led, HIGH);
delay(500);
digitalWrite(led, LOW);
delay(500);
}
Actividad extra:
¿Cómo cambiamos la intensidad el led?
¿Cómo variamos el tiempo de encendido?
¿Cómo logramos que el led quede encendido continuamente?
Ejercicio desafío
Encender led RGB
Código
int led_rojo = 6;//elegimos pines PWM ~
int led_azul = 5;
int led_verde = 3; // Dividimos el led RGB en 3 variables, 1 por cada pin o color
void setup()
{
pinMode(led_rojo, OUTPUT);
pinMode(led_verde, OUTPUT);
pinMode(led_azul, OUTPUT);//Asignamos los pineso variables como salida
}
void loop()
{
analogWrite(led_rojo, 255);//Aplicamos 255 a los 3 pines para formar el color "Blanco"
analogWrite(led_verde,255);
analogWrite(led_azul, 255);
delay(5000);//dejamos un delay mayor para le color blanco
analogWrite(led_rojo, 255);//Asignamos 255 a un color y 0 a otros
analogWrite(led_verde,0);
analogWrite(led_azul, 0);
delay(2000);
analogWrite(led_rojo, 0);
analogWrite(led_verde,255);
analogWrite(led_azul, 0);
delay(2000);
analogWrite(led_rojo, 0);
analogWrite(led_verde,0);
analogWrite(led_azul, 255);
delay(2000);
}
Actividad adicional
1. Seleccionar colores en https://htmlcolorcodes.com/es/ o Photoshop
2. Seleccionar en código decimal RGB
3. Reproducirlo con Arduino
Ejercicio desafio 2
Ejercicio desafío 2 - Código
/*
Vamos a configurar las diferentes salidas de nuestro arduino lograr diferentes colores utilizando la tecnica de adición
*/
//INICIO VARIABLES
int ledRojo = 9;
int ledVerde = 10;
int ledAzul = 11;
int ledTest = 13;
int rojo = 0;
int verde = 0;
int azul = 0;
int todos = 0;
/*FIN VARIABLES*/
void setup() {
//INICIO SETUP SALIDAS
pinMode(ledRojo, OUTPUT);
pinMode(ledVerde, OUTPUT);
pinMode(ledAzul, OUTPUT);
pinMode(ledTest, OUTPUT);
analogWrite(ledRojo, 0);
analogWrite(ledVerde, 0);
analogWrite(ledAzul, 0);
digitalWrite(ledTest, LOW);
//Saludo Inicial con bucle for
for(int i=0;i<3;i++){
digitalWrite(ledTest, HIGH);
delay(500);
digitalWrite(ledTest, LOW);
delay(500);
}
}
void loop() {
//INICIO ENCENDER COLORES
for (rojo = 0; rojo <= 255; rojo++) {
analogWrite(ledRojo, rojo); //Escribe un valor entre 0 y 255 en un pin analógico (~). Se puede usar para encender
delay(10); // un LED con luminosidad variable o accionar un motor a diferentes velocidades
}
for (rojo = 255; rojo >= 0; rojo--) { // en este caso, usando "rojo--" en vez de incrementar, decrementa el valor de la variable
analogWrite(ledRojo, rojo); // de control "rojo" en 1
delay(10);
}
for (verde = 0; verde <= 255; verde++) {
analogWrite(ledVerde, verde);
delay(10);
}
for (verde = 255; verde >= 0; verde--) {
analogWrite(ledVerde, verde);
delay(10);
}
for (azul = 0; azul <= 255; azul++) {
analogWrite(ledAzul, azul);
delay(10);
}
for (azul = 255; azul >= 0; azul--) {
analogWrite(ledAzul, azul);
delay(10);
}
analogWrite(ledRojo, 255); //
analogWrite(ledVerde, 0);
analogWrite(ledAzul, 0);
for (verde = 0; verde <= 255; verde++) {
analogWrite(ledVerde, verde);
delay(10);
}
for (azul = 0; azul <= 255; azul++) {
analogWrite(ledAzul, azul);
delay(10);
}
for (verde = 255; verde >= 0; verde--) {
analogWrite(ledVerde, verde);
delay(10);
}
for (rojo = 255; rojo >= 0; rojo--) {
analogWrite(ledRojo, rojo);
delay(10);
}
for (azul = 255; azul >= 0; azul--) {
analogWrite(ledAzul, azul);
delay(10);
}
delay(50);
for (todos = 0; todos <= 255; todos++) {
analogWrite(ledRojo, todos);
analogWrite(ledVerde, todos);
analogWrite(ledAzul, todos);
delay(10);
}
for (todos = 255; todos >= 0; todos--) {
analogWrite(ledRojo, todos);
analogWrite(ledVerde, todos);
analogWrite(ledAzul, todos);
delay(10);
}
}
Ejercicio 2
Encender dos leds en forma desigual
diagrama
programa
void setup() {
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
}
void loop() {
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);
digitalWrite(12, HIGH);
delay(1000);
digitalWrite(12, LOW);
delay(1000);
}
Ejercicio 3
Encender dos leds en forma paralela
diagrama
programa
void setup() {
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
}
void loop() {
digitalWrite(13, HIGH);
digitalWrite(12, HIGH);
delay(1000);
digitalWrite(13, LOW);
digitalWrite(12, LOW);
delay(1000);
}
Ejercicio 4
Velador
¿Cómo funciona un pulsador?
diagrama
programa
// C++ code
//
int pulsador = 3;
int led = 2;
int estado = LOW;
void setup()
{
pinMode(pulsador, INPUT);
pinMode(led, OUTPUT);
}
void loop()
{
while (digitalRead(pulsador) == LOW){
}
estado = digitalRead(led);
digitalWrite(led, !estado);
while (digitalRead(pulsador) == HIGH){
}
}
Ejercicio 5
Among us
Modelo 3d
Descargá el modelo 3D
para imprimir aquí
diagrama
programa
// C++ code
int led = 13;
int lecturasensor;
void setup(){
Serial.begin(9600);
pinMode(led, OUTPUT);
}
void loop(){
lecturasensor = analogRead(A0);
Serial.println(lecturasensor);
if (lecturasensor < 600) {
digitalWrite(led, LOW);
}
else {
digitalWrite (led, HIGH);}
}
Actividad complementaria
Conectar motor paso a paso
Programa 2
/*
Programa que realiza un giro completo del motor 28BYJ-48 en conjunto con el controlador
basado en ULN2003, detiene 5 segundos y luego comienza nuevamente. La secuencia es la de
paso completo simple (wave drive) energizando de a una bobina por vez utilizando una
matriz para su definicion.
Alimentar Arduino con fuente de alimentacion externa de 6 a 12 Vdc.
*/
int IN1 = 8; // pin digital 8 de Arduino a IN1 de modulo controlador
int IN2 = 9; // pin digital 9 de Arduino a IN2 de modulo controlador
int IN3 = 10; // pin digital 10 de Arduino a IN3 de modulo controlador
int IN4 = 11; // pin digital 11 de Arduino a IN4 de modulo controlador
int demora = 20; // demora entre pasos, no debe ser menor a 10 ms.
// paso completo simple
int paso [4][4] = // matriz (array bidimensional) con la secuencia de pasos
{
{1, 0, 0, 0},
{0, 1, 0, 0},
{0, 0, 1, 0},
{0, 0, 0, 1}
};
void setup() {
pinMode(IN1, OUTPUT); // todos los pines como salida
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
}
void loop() {
for (int i = 0; i < 512; i++) // 512*4 = 2048 pasos
{
for (int i = 0; i < 4; i++) // bucle recorre la matriz de a una fila por vez
{ // para obtener los valores logicos a aplicar
digitalWrite(IN1, paso[i][0]); // a IN1, IN2, IN3 e IN4
digitalWrite(IN2, paso[i][1]);
digitalWrite(IN3, paso[i][2]);
digitalWrite(IN4, paso[i][3]);
delay(demora);
}
}
digitalWrite(IN1, LOW); // detiene por 5 seg.
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
delay(5000);
}
Programa 3
/*
Programa que realiza un giro completo del motor 28BYJ-48 en conjunto con el controlador
basado en ULN2003, detiene 5 segundos y luego comienza nuevamente. La secuencia es la de
paso completo con dos bobinas para una maximo torque utilizando una matriz para su
definicion.
Alimentar Arduino con fuente de alimentacion externa de 6 a 12 Vdc.
*/
int IN1 = 8; // pin digital 8 de Arduino a IN1 de modulo controlador
int IN2 = 9; // pin digital 9 de Arduino a IN2 de modulo controlador
int IN3 = 10; // pin digital 10 de Arduino a IN3 de modulo controlador
int IN4 = 11; // pin digital 11 de Arduino a IN4 de modulo controlador
int demora = 20; // demora entre pasos, no debe ser menor a 10 ms.
// paso completo con maximo torque
int paso [4][4] = // matriz (array bidimensional) con la secuencia de pasos
{
{1, 1, 0, 0},
{0, 1, 1, 0},
{0, 0, 1, 1},
{1, 0, 0, 1}
};
void setup() {
pinMode(IN1, OUTPUT); // todos los pines como salida
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
}
void loop() {
for (int i = 0; i < 512; i++) // 512*4 = 2048 pasos
{
for (int i = 0; i < 4; i++) // bucle recorre la matriz de a una fila por vez
{ // para obtener los valores logicos a aplicar
digitalWrite(IN1, paso[i][0]); // a IN1, IN2, IN3 e IN4
digitalWrite(IN2, paso[i][1]);
digitalWrite(IN3, paso[i][2]);
digitalWrite(IN4, paso[i][3]);
delay(demora);
}
}
digitalWrite(IN1, LOW); // detiene por 5 seg.
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
delay(5000);
}
Programa 4
/*
Programa que realiza un giro completo del motor 28BYJ-48 en conjunto con el controlador
basado en ULN2003, detiene 5 segundos y luego comienza nuevamente. La secuencia es la de
medio paso para maxima precision y torque medio utilizando una matriz para su
definicion.
Alimentar Arduino con fuente de alimentacion externa de 6 a 12 Vdc.
*/
int IN1 = 8; // pin digital 8 de Arduino a IN1 de modulo controlador
int IN2 = 9; // pin digital 9 de Arduino a IN2 de modulo controlador
int IN3 = 10; // pin digital 10 de Arduino a IN3 de modulo controlador
int IN4 = 11; // pin digital 11 de Arduino a IN4 de modulo controlador
int demora = 20; // demora entre pasos, no debe ser menor a 10 ms.
// medio paso
int paso [8][4] = // matriz (array bidimensional) con la secuencia de pasos
{
{1, 0, 0, 0},
{1, 1, 0, 0},
{0, 1, 0, 0},
{0, 1, 1, 0},
{0, 0, 1, 0},
{0, 0, 1, 1},
{0, 0, 0, 1},
{1, 0, 0, 1}
};
void setup() {
pinMode(IN1, OUTPUT); // todos los pines como salida
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
}
void loop() {
for (int i = 0; i < 512; i++) // 512*8 = 4096 pasos
{
for (int i = 0; i < 8; i++) // bucle recorre la matriz de a una fila por vez
{ // para obtener los valores logicos a aplicar
digitalWrite(IN1, paso[i][0]); // a IN1, IN2, IN3 e IN4
digitalWrite(IN2, paso[i][1]);
digitalWrite(IN3, paso[i][2]);
digitalWrite(IN4, paso[i][3]);
delay(demora);
}
}
digitalWrite(IN1, LOW); // detiene por 5 seg.
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
delay(5000);
}
I DOCENTES - Arduino
By profdanieltedesco
I DOCENTES - Arduino
Proyecto 5to. B
- 84