Tabla de contenido:

Microcontrolador controlado MATLAB (Arduino MKR1000): 4 pasos
Microcontrolador controlado MATLAB (Arduino MKR1000): 4 pasos

Video: Microcontrolador controlado MATLAB (Arduino MKR1000): 4 pasos

Video: Microcontrolador controlado MATLAB (Arduino MKR1000): 4 pasos
Video: Webinar Arduino com MATLAB para Iiniciantes 2024, Mes de julio
Anonim
Microcontrolador controlado por MATLAB (Arduino MKR1000)
Microcontrolador controlado por MATLAB (Arduino MKR1000)

El objetivo de nuestro proyecto era utilizar MATLAB y Arduino MKR1000 lo mejor que pudiéramos. Nuestro objetivo era crear un script que permitiera que ciertas características del arduino realizaran una determinada salida basada en una entrada específica. Usamos muchos bucles y declaraciones condicionales incluidas en MATLAB que hicieron esto posible. También utilizamos MATLAB mobile mediante el uso de datos adquiridos del giroscopio de un dispositivo móvil para mejorar el proyecto tanto como fuera posible.

Paso 1: Piezas y materiales

Partes y materiales
Partes y materiales
Partes y materiales
Partes y materiales
Partes y materiales
Partes y materiales

MATLAB 2018a

-La versión 2018 de MATLAB es la versión más preferida, principalmente porque funciona mejor con el código que se conecta al dispositivo móvil. Sin embargo, la mayoría de las versiones de MATLAB pueden interpretar la mayor parte de nuestro código.

Arduino MKR1000

-Este es un dispositivo específico que nos permite cablear circuitos hasta puertos digitales y análogos. Es vital que también tenga una placa de pruebas que lo acompañe.

Accesorios

-Al usar el MKR1000, necesitábamos piezas accesorias para realizar las funciones necesarias.

Esto incluye

  1. Servo
  2. Botón (6)
  3. Luz LED RBG intercambiable
  4. Alambres simples
  5. tablero (s)
  6. mini interruptor de encendido
  7. sensor de temperatura
  8. Resistencia de 330 ohmios
  9. Resistencia de 10K ohmios
  10. Cable USB-microUSB
  11. Computadora portátil / escritorio
  12. Dispositivo móvil

También debe tenerse en cuenta que hay muchos, muchos más accesorios que se pueden usar con el MKR1000.

Paso 2: Paquete de soporte MATLAB Arduino

Para utilizar correctamente el Arduino MKR1000 a través de MATLAB, debe descargar el paquete de soporte de MATLAB para hardware Arduino. Esta descarga le da acceso a ciertas funciones y comandos directamente a la placa arduino.

Puede descargar el paquete en el enlace de abajo

www.mathworks.com/matlabcentral/fileexchange/47522-matlab-support-package-for-arduino-hardware

Paso 3: uso de sensores de datos adquiridos desde un dispositivo móvil

Uso de sensores de datos adquiridos desde un dispositivo móvil
Uso de sensores de datos adquiridos desde un dispositivo móvil

La aplicación MATLAB Mobile nos permite usar un dispositivo móvil para transmitir datos usando su giroscopio. Para adquirir los datos a través de MATLAB, obtenemos los datos recuperándolos de la matriz de orientación de MATLAB mobile. Hacemos esto creando una variable para cada columna de la matriz de orientación (Azimut, Pitch y Roll) e indexando el flujo constante de valores desde el dispositivo móvil a la computadora. Esto nos permite crear declaraciones condicionales que preformarán una salida si MATLAB recoge una entrada de datos específica del dispositivo móvil. Para hacer esto, necesitará MATLAB mobile en su dispositivo móvil y el paquete de soporte de dispositivo móvil para MATLAB en su computadora.

Puede descargar el archivo en el enlace de abajo

www.mathworks.com/matlabcentral/fileexchange/51235-matlab-support-package-for-apple-ios-sensors

Paso 4: el código y los puertos de cableado

El código comienza con un mensaje de inicio que pregunta si queremos iniciar nuestro dispositivo de seguridad para el hogar. Si respondemos que sí y damos la contraseña correcta, el script salta inmediatamente a un ciclo while. A partir de ahí, comienza a recopilar datos del dispositivo móvil. Hay condicionales que leen estos datos. Podemos desbloquear y bloquear el sistema desde nuestro dispositivo móvil, y el código encenderá el servo y hará parpadear la luz LED dependiendo de los datos dados desde el dispositivo móvil

startup = questdlg ('¿Le gustaría activar el sistema de energía del hogar inteligente ecoTECH?'); % Comienza la secuencia de activación de ecoTECHwaitfor (inicio); if startup == "Yes"% Si se selecciona "Yes" una secuencia de activación comienza y entra en el bucle while al final power = "on"; m1 = msgbox ('Iniciando ecoTECH…'); pausa (2); eliminar (m1); m1_wait = waitbar (0, 'Por favor espere …'); pasos = 25; para i = 1: pausa de pasos (.1); barra de espera (i / pasos); % Actualiza la eliminación final de la barra de espera (m1_wait); CONTRASEÑA = [0 0 0 0]; % Inicializa la contraseña ii = 0; % Inicializa una variable que se utiliza para salir de los bucles m2 = msgbox ('¡ecoTECH en pleno funcionamiento!'); pausa (2); eliminar (m2); elseif inicio == "No" || inicio == "Cancelar"% Si se selecciona "No" o "Cancelar", entonces la secuencia de activación no comienza y no ingresa al bucle while power = "off"; m3 = msgbox ('¡Bien! ¡Adiós!'); pausa (2); eliminar (m3); fin

% ecoTECH en la sección de acción mientras es verdadero mientras que el poder == "en"% Sección de tecla móvil mientras que% es verdadero Recopila datos sobre la orientación del rollo del dispositivo móvil CLAVE = m. Orientation (3); % Recopila datos sobre los botones b2 = readDigitalPin (a, 'D2'); % Botón 2 (rojo) b3 = readDigitalPin (a, 'D3'); % Botón 3 (blanco) si KEY> = 35% en grados m4 = msgbox ('¡Bienvenido a casa!'); writeDigitalPin (a, 'D8', 1); % Enciende la pausa de la luz verde (.5); writePosition (s, 1); % Gira el servo para desbloquear la pausa de la puerta (2); writeDigitalPin (a, 'D8', 0); % Apaga la luz verde borrar (m4); elseif KEY <= -35% en grados m5 = msgbox ('¡Puerta bloqueada!'); writeDigitalPin (a, 'D7', 1); % Enciende la pausa de la luz roja (.5); writePosition (s, 0); % Gira el servo para bloquear la pausa de la puerta (2); writeDigitalPin (a, 'D7', 0); % Apaga la luz roja eliminar (m5); ii = 1; break% Sale mientras el bucle contiene la llave móvil si la puerta está bloqueada con el dispositivo móvil elseif b2 == 0 && b3 == 0% Sale mientras el bucle contiene la llave móvil para ingresar la sección del código de acceso break end end

Después de esto, puede entrar en otro ciclo while. Este bucle while controla los resultados en función de las entradas de los botones. Si el primer ciclo while es insignificante, o se requiere un bloqueo manual, entrará en otro ciclo while donde se necesite una contraseña específica. Si la contraseña es incorrecta, reiniciará el ciclo

while true if ii == 1% Sale while loop que contiene el código de acceso si la puerta se desbloqueó con el dispositivo móvil break end% Recopila datos sobre los botones b5 = readDigitalPin (a, 'D5'); % Botón 5 (azul) b1 = readDigitalPin (a, 'D1'); % Botón 1 (negro) b4 = readDigitalPin (a, 'D4'); % Botón 4 (Blanco) si b5 == 0% Inicia la sección de ingreso de contraseña para b = 1: 5 m6 = msgbox ('Por favor presione y mantenga presionado un botón'); pausa (2); eliminar (m6); % Recopila datos sobre los botones b1 = readDigitalPin (a, 'D1'); % Botón 1 (negro) b2 = readDigitalPin (a, 'D2'); % Botón 2 (rojo) b3 = readDigitalPin (a, 'D3'); % Botón 3 (Blanco) b4 = readDigitalPin (a, 'D4'); % Botón 4 (amarillo) b5 = readDigitalPin (a, 'D5'); % Botón 5 (azul)% Reemplaza los valores en el código de acceso inicial uno a la vez si b1 == 0 PASSCODE (0 + b) = 1; elseif b2 == 0 CONTRASEÑA (0 + b) = 2; elseif b3 == 0 CONTRASEÑA (0 + b) = 3; elseif b4 == 0 CONTRASEÑA (0 + b) = 4; elseif b5 == 0 PASSCODE = sprintf ('%. 0f%.0f%.0f%.0f', PASSCODE (1), PASSCODE (2), PASSCODE (3), PASSCODE (4)); % Convierte la secuencia de botones presionados en números y luego la convierte en un final de cadena% Fin del ciclo for para ingresar dígitos para el código de acceso si PASSCODE == "2314"% Si el código de acceso ingresado coincide, la puerta se desbloquea durante unos segundos y luego se bloquea m7 = msgbox ('¡Bienvenido a casa!'); writeDigitalPin (a, 'D8', 1); % Enciende la pausa de la luz verde (.5); writePosition (s, 1); % Gira el servo para desbloquear la pausa de la puerta (5); writeDigitalPin (a, 'D8', 0); % Apaga la pausa de la luz verde (.1); writeDigitalPin (a, 'D7', 1); % Enciende la pausa de la luz roja (.5); writePosition (s, 0); % Gira el servo para bloquear la pausa de la puerta (1); writeDigitalPin (a, 'D7', 0); % Apaga la luz roja eliminar (m7); ii = 1; break% Sale del bucle que contiene la contraseña después de ingresar la contraseña correcta elseif PASSCODE ~ = "2314" writeDigitalPin (a, 'D7', 1); % Enciende la luz roja m8 = msgbox ('¡Código de acceso incorrecto! ¡Inténtelo de nuevo!'); esperar (m8) writeDigitalPin (a, 'D7', 0); % Apaga la luz roja continuar% Le permite volver a ingresar un código de acceso end elseif b1 == 0 && b4 == 0% Sale mientras el bucle contiene la sección del código de acceso si no desea ingresar un código de acceso ii = 1; romper fin fin

Si es correcto, entrará inmediatamente en un bucle while que controla el sensor de temperatura. Si el interruptor está encendido, el bucle continuará y trazará la gráfica de temperatura frente a tiempo, lo que permitirá ver la tendencia. Si se presiona el botón conectado al sensor de temperatura, también te enviará un correo electrónico indicándote cuál es la temperatura en tu "casa". Si el interruptor está apagado, finalizará inmediatamente el código

t = 0; % Tiempo inicial = 0 segundos pausa (5)% Da tiempo para que el usuario encienda el interruptor de temperatura SWITCH = readDigitalPin (a, 'D11'); % Recopila datos sobre el interruptor en el pin D11 mientras SWITCH == 0 SWITCH = readDigitalPin (a, 'D11'); % Recopila datos sobre el interruptor en el pin D11 voltage = readVoltage (a, 'A1'); % Lee el voltaje del sensor de temperatura temp_C = (voltaje. * 1000 - 500)./ 10; % Convierte el voltaje en temperatura en ° C temp_F = (9/5). * Temp_C + 32; % Convierte de ° C a ° F gráfico (t, temp_C, 'b.') Mantenga el título ('Temperatura ambiente'); xlabel ('Tiempo en segundos'); ylabel ('Temperatura'); eje ([0, 180, 0, 100]); plot (t, temp_F, 'r.') legend ('Temperatura en ° C', 'Temperatura en ° F') pausa (1); t = t + 1; % Contador de tiempo en segundos% Sección de correo electrónico b_temp = readDigitalPin (a, 'D0'); % Recopila los datos del botón de temperatura (azul) en el pin D0 si b_temp == 0 setpref ('Internet', 'SMTP_Server', 'smtp.gmail.com'); setpref ('Internet', 'Correo electrónico', '[email protected]'); % Sender setpref ('Internet', 'SMTP_Username', '[email protected]'); % Nombre de usuario del remitente setpref ('Internet', 'SMTP_Password', 'Integral_ecoTECH'); % Props de la contraseña del remitente = java.lang. System.getProperties; props.setProperty ('mail.smtp.auth', 'verdadero'); props.setProperty ('mail.smtp.socketFactory.class', 'javax.net.ssl. SSLSocketFactory'); props.setProperty ('mail.smtp.socketFactory.port', '465'); sendmail ('[email protected] ',' temperatura ambiente ecoTECH ', sprintf (' La temperatura ambiente actual es%.1f ° C o%.1f ° F. ', temp_C, temp_F)); % Envía un correo electrónico al destinatario con datos sobre la temperatura ambiente actual fprintf ('¡Correo electrónico enviado con éxito! / N') end if temp_F> = 75% Si la temperatura ambiente aumenta a 75 ° F… temp_AC = 65; % Cambia la temperatura en el termostato a 65 ° F elseif temp_F <= 65% Si la temperatura ambiente desciende a 60 ° F… temp_AC = 80; % Cambia la temperatura en el termostato a 80 ° F end end% Fin de "SWITCH == 0" mientras que el bucle si la energía == "off" || ii == 1% Sale "power == on" while loop break end end% Fin de "power == on" while loop si power == "off" || ii == 1% Sale completo mientras el bucle finaliza

Esta fue solo una breve descripción general del código y su funcionalidad. Hemos adjuntado el código completo en formato pdf si es necesario

Aquí está la lista de a qué puerto está conectado cada dispositivo

1. LED RGB: Pines digitales (7, 8, 9)

2. Servo: Pin digital 6

3. Botones: Pines digitales (1, 2, 3, 4, 5)

4. Botón azul para correo electrónico: Pin digital 0

5. Sensor de temperatura: Pin analógico 1

6. Interruptor: Pin digital 11

Recomendado: