S
CURSO DE ARDUINO 2
Las Matrices
Instructor: Ing. Konrad Peschka
Edición y textos PDF: Ing. Pablo Aquim [email protected]
Curso de Arduino nivel 2
¿QUÉ SON LAS MATRICES ?
En matemáticas y programación, una matriz es una estructura de datos
que organiza elementos en filas y columnas. Es similar a una tabla
bidimensional o una cuadrícula.
Puedes imaginar una matriz como una colección de elementos
dispuestos en filas y columnas, donde cada elemento tiene una posición única
definida por su fila y columna. Cada elemento de la matriz se denomina
"elemento de la matriz" o "entrada de la matriz".
Las matrices se utilizan para almacenar y manipular datos de manera
estructurada. Puedes acceder a los elementos de la matriz utilizando índices
que indican la posición del elemento en la matriz. Los índices de fila y
columna comienzan típicamente desde 0.
Por ejemplo, considera la siguiente matriz de 3 filas y 4 columnas:
2 4 6 8
1 3 5 7
9 0 2 4
Instructor: Ing. Konrad Peschka 1
Curso de Arduino nivel 2
En esta matriz, el elemento en la primera fila y la segunda columna es el
número 3.
Las matrices se utilizan en una variedad de aplicaciones, como
representar datos tabulares, realizar cálculos numéricos, manipular imágenes
y procesar datos en algoritmos.
Es importante tener en cuenta que las matrices pueden tener diferentes
dimensiones, es decir, diferentes números de filas y columnas. Pueden ser
matrices unidimensionales (vectores), matrices bidimensionales (como en el
ejemplo anterior) o incluso matrices multidimensionales con más de dos
dimensiones.
En definitiva, una matriz es una estructura de datos bidimensional que
organiza elementos en filas y columnas, lo que facilita el acceso y la
manipulación de datos de manera estructurada.
¿QUÉ PAPEL JUEGA UNA MATRIZ EN ARDUINO ?
ANTES HAGAMOS
UN REPASO DE VECTORES
Instructor: Ing. Konrad Peschka 2
Curso de Arduino nivel 2
VECTORES O ARRAYS
Recordemos que para crear un vector o array lo escribimos de la
siguiente forma, supongamos además ponerle como nombre justamente
VECTOR:
El número escrito entre corchetes es lo que
indicará cuántas variables vamos a necesitar
int vector [ 3 ] bajo este mismo nombre (vector en este caso)
y será además la misma cantidad de espacios
de memoria que ocuparemos.
Este es el nombre del vector o array La gran ventaja que tendremos es
(elegimos como nombre vector para el que bajo un mismo nombre (vector en
ejemplo y suponemos que sea una este caso) podremos acceder a distintas
variable de tipo int. variables. El programa lo hará en forma
Nótese que tendremos tres variables bajo secuencial.
un mismo nombre: vector
int vector [ 3 ] = { 3 , 4, 5 }
Memoria
Arduino
3 4 5 (posiciones
de memoria)
La sintaxis entre llaves le indicará al programa que en la primera posición
de la memoria de Arduino cargue el valor 3, en la segunda posición cargue el
valor 4 y en la tercera el valor 5.
Cuando creamos un vector o array, el programa automáticamente
reserva el primer espacio para el vector, espacio que corresponde a un índice
cero (en este primer espacio se almacenará el primer valor indicado en la
inicialización) y en los siguientes espacios, índice 1, índice 2, índice 3, etc,
almacenará los restantes valores indicados en la inicialización, en nuestro
ejemplo primero el 3, luego el 4 y en la posición tres o índice tres el 5.
Instructor: Ing. Konrad Peschka 3
Curso de Arduino nivel 2
De acuerdo a nuestro ejemplo:
int vector [0] int vector [1] int vector [2]
Corresponde a Corresponde a
Corresponde a 3º espacio
1º espacio 2º espacio
3 4 5
Memoria con datos del vector
VOLVAMOS AHORA AL CONCEPTO DE MATRICES EN EL
CONTEXTO DE ARDUINO
Podemos imaginar a una matriz en Arduino como vectores superpuestos,
en donde el vector es unidimensional (una sóla fila) en cambio ya
superpuestos se convierten en una matriz que ahora es de más de una
dimensión (varias filas), en el ejemplo siguiente tenemos una matriz
bidimensional: dos filas y cinco columnas:
Colum 0 Colum 1 Colum 2 Colum 3 Colum 4
fila 0 247 230 110 52 75
fila 1 74 19 126 8 47
Se puede decir que un vector es una matriz unidimensional en cierto
sentido. Ambos son estructuras de datos que almacenan elementos en
posiciones contiguas en la memoria. Tanto los vectores como las matrices se
utilizan para almacenar conjuntos de valores del mismo tipo.
Instructor: Ing. Konrad Peschka 4
Curso de Arduino nivel 2
La diferencia principal radica en la dimensión de la estructura. Un vector
es un arreglo unidimensional, lo que significa que almacena elementos en una
sola dirección utilizando un único índice. Por otro lado, una matriz es una
estructura bidimensional que organiza los elementos en filas y columnas, lo
que implica el uso de dos índices para acceder a los elementos.
Entonces, aunque un vector y una matriz comparten algunas similitudes
en términos de almacenamiento y manipulación de datos, la diferencia clave
está en la dimensión de la estructura. Un vector es una matriz
unidimensional, pero una matriz en general se refiere a una estructura
bidimensional o multidimensional.
En el contexto de Arduino, una matriz es una estructura de datos
bidimensional que se utiliza para almacenar y manipular conjuntos de valores
de manera organizada. Puedes pensar en una matriz como una tabla o una
cuadrícula que tiene filas y columnas.
En Arduino, una matriz se declara especificando su tamaño, es decir, el
número de filas y columnas que tendrá. Por ejemplo, si quieres crear una
matriz de 3 filas y 4 columnas, puedes hacerlo de la siguiente manera:
int matriz[3][4];
En esta declaración, `matriz` es el nombre que le damos a la matriz, y
`[3][4]` indica que tendrá 3 filas y 4 columnas. Puedes ajustar el tamaño de la
matriz según tus necesidades.
Una vez que has creado la matriz, puedes acceder a sus elementos
utilizando los índices de fila y columna. Por ejemplo, para acceder al elemento
en la fila 2 y columna 3 de la matriz, puedes hacer lo siguiente:
int elemento = matriz[1][2];
Aquí, el índice `[1][2]` se refiere a la segunda fila (índice 1) y tercera
columna (índice 2) de la matriz. Recuerda que los índices en Arduino y en la
mayoría de los lenguajes de programación comienzan desde 0.
Las matrices en Arduino son útiles cuando necesitas almacenar y
manipular datos en una estructura de dos dimensiones, como almacenar
píxeles de una imagen, valores de sensores en una cuadrícula, o cualquier
otro conjunto de datos que requiera una organización en filas y columnas.
Instructor: Ing. Konrad Peschka 5
Curso de Arduino nivel 2
APLICACIÓN PRÁCTICA
A UN CONTROL DE ACCESO
OBJETIVO
En base a la codificación de la clase anterior (ver recurso 6.2 Control de
acceso con RFID) nos proponemos desarrollar un sistema RFID que permita
dar acceso a los dos identificadores utilizados anteriormente, el llavero de
acceso y la tarjeta de acceso.
A tal efecto se deberán cargar una matriz, en una fila los números
identificatorios del llavero y en la fila siguiente los números identificatorios de
la tarjeta.
De tal forma que cuando se presente cualquiera de los identificadores,
llavero o tarjeta , el sistema permita el acceso, pero para cualquier otra
tarjeta deniegue el acceso.
El sistema dará un mensaje de bienvenida: “Apoye Tarjeta”.
Al apoyar la tarjeta entregará el mensaje: “Tarjeta detectada”.
Si la identificación de la tarjeta conicide con el código guardado en la
matríz, entregará el mensaje: “Acceso Aceptado” y encenderá el Led Verde.
Si la identificación de la tarjeta no conicide con el código guardado en la
matríz, entregará el mensaje: “Acceso Denegado” y encenderá el Led Rojo.
Instructor: Ing. Konrad Peschka 6
Curso de Arduino nivel 2
DIAGRAMA DE FLUJO
Instructor: Ing. Konrad Peschka 7
Curso de Arduino nivel 2
Instructor: Ing. Konrad Peschka 8
Curso de Arduino nivel 2
SOLUCION DE LA PROGRAMACIÓN
const int ledrojo=A1 ;
const int ledverde=A0 ;
#include <SPI.h>
#include <RFID.h>
#define RST_PIN 9
#define SS_PIN 10
RFID tarjeta_rfid(SS_PIN, RST_PIN);
const int id_usuario [2] [5]= {{74,19,126,8,47},
{247,230,110,52,75} };
int fila=0;
void setup()
{
pinMode(ledrojo, OUTPUT);
pinMode(ledverde,OUTPUT);
Serial.begin(9600);
SPI.begin();
tarjeta_rfid.init();
Serial.println("Apoye su tarjeta o tag RFID");
}
void loop()
{
if (tarjeta_rfid.isCard())
{
Serial.println("Tarjeta detectada:");
if(chequeo_tarjeta()==1)
{
Instructor: Ing. Konrad Peschka 9
Curso de Arduino nivel 2
Serial.println("Acceso Aceptado");
digitalWrite(ledverde, HIGH);
delay(3000);
digitalWrite(ledverde, LOW);
}
else
{
Serial.println("Acceso Denegado");
digitalWrite(ledrojo, HIGH);
delay(3000);
digitalWrite(ledrojo, LOW);
}
}
delay(1000);
}
bool chequeo_tarjeta()
{
tarjeta_rfid.readCardSerial();
fila=0;
for(int i=0;i<5;i++)
{
if (tarjeta_rfid.serNum[i]!=id_usuario [fila] [i])
{
fila++;
i=0;
if (fila>1) // salgo de la function si ya se terminaron de chequear todas las filas
{
return 0;
}
}
}
return 1;
}
Instructor: Ing. Konrad Peschka 10
Curso de Arduino nivel 2
ANÁLICEMOS LAS INSTRUCCIONES ANTERIORES
//-----------------------------------------------------------------------------------
// Este codigo se encarga de leer el ID de la tarjeta
// Libreria original modificado y traducido al español de :
// https://www.instructables.com/id/Interfacing-RFID-RC522-With-Arduino-MEGA-
a-Simple-/
// Traduccion y adaptacion: Konrad Peschka 2020
// Instagram: @konredus
//-------------------------------------------------------------------------------------
/*
PINOUT de como conectamos el Modulo al Arduino:
RC522 Uno/Nano MEGA
SDA / NSS D10 D9
SCK D13 D52
MOSI D11 D51
MISO / MIOS 12 D50
IRQ N/C N/C
GND GND GND
RST D9 D8
3.3V 3.3V 3.3V
*/
//Incluimos las librerias del SPI y del RFID
#include <SPI.h>
#include <RFID.h>
//Se definen los pines que son puntuales para este Modulo
//Que son el Reset y el SS (Select)
#define RST_PIN 9
#define SS_PIN 10
Instructor: Ing. Konrad Peschka 11
Curso de Arduino nivel 2
//Creo la Clase RFID
RFID tarjeta_rfid(SS_PIN, RST_PIN);
//creo una matriz con los datos id_usuario que quiero chequear
//estos codigos los obtenemos del ejemplo de lectura
const int id_usuario [2] [5]= {{74,19,126,8,47}, // id tarjeta
{247,230,110,52,75} }; // id llavero
int fila=0; // esta variable me permitirá saltar de fila
const int ledrojo=A1 ;
const int ledverde=A0 ;
void setup()
{
pinMode(ledrojo, OUTPUT);
pinMode(ledverde,OUTPUT);
Serial.begin(9600);
//inicia la comunicación en modo SPI (Serial Peripheral Interface).
SPI.begin();
//inicia la comunicación en modo SPI (Serial Peripheral Interface).
// inicializa el módulo o la tarjeta RFID antes de comenzar a utilizarla.
tarjeta_rfid.init();
//muestro un mensaje por puerto serie
Serial.println("Apoye su tarjeta o tag RFID");
}
void loop()
{
//se queda esperando si se detecta una tarjeta RFID
if (tarjeta_rfid.isCard())
{
//imprimimos por Serial que detectamos una tarjeta
Serial.println("Tarjeta detectada:");
Instructor: Ing. Konrad Peschka 12
Curso de Arduino nivel 2
//lo que hago en este if es llamar a la funcion que
//se encarga de chequear posicion por posicion lo
//que se leyo de la tarjeta
if(chequeo_tarjeta()==1)
{
Serial.println("Acceso Aceptado");
digitalWrite(ledverde, HIGH);
delay(3000);
digitalWrite(ledverde, LOW);
}
else
{
Serial.println("Acceso Denegado");
// enciendo luz roja
digitalWrite(ledrojo, HIGH);
delay(3000);
// luego de 3 segundos apago luz roja
digitalWrite(ledrojo, LOW);
}
}
delay(1000);
}
//Aqui esta la funcion que se encarga de verificar
//si cada una de las posiciones coincide con el id_usuario
//que ingresamos arriba de todo
bool chequeo_tarjeta()
{
// la función chequeo_tarjeta() utiliza la siguiente función
// tarjeta_rfid.readCardSerial() para obtener el número de serie de la tarjeta
//RFID y luego compara ese número con el número de serie del usuario
//almacenado en id_usuario[][] para determinar si la tarjeta es válida o no.
Instructor: Ing. Konrad Peschka 13
Curso de Arduino nivel 2
tarjeta_rfid.readCardSerial();
//con el siguiente for recorremos todas las posiciones
fila=0; // con esto me aseguro que fila arranque en cero.
for(int i=0;i<5;i++)
{
//el truco de este if es chequear si alguna de las posiciones NO coinciden
if(tarjeta_rfid.serNum[i]!=id_usuario [fila] [i])
{
fila++; // antes de salir incremento fila
i=0; // reseteamos i para que vuelva a posicionarse en la columna cero
if (fila>1) // salgo de la function si ya se terminaron de chequear todas las filas
{
return 0;
}
}
}
//si llego hasta aca, es por que todas las posiciones coincidieron
//por ende esta funcion nos va a retornar 1
return 1;
}
Instructor: Ing. Konrad Peschka 14
Curso de Arduino nivel 2
PRUEBA FUNCIONAL
Acceso Aceptado: (autoriza el LLAVERO)
247
230
110
52
75
Acceso Aceptado: (autoriza la TARJETA)
74
19
126
8
47
Instructor: Ing. Konrad Peschka 15