"Como la niña de un ojo ..." o hacemos un sistema de seguridad simple basado en un microcontrolador (Canny o Arduino) y Raspberry PI

Durante la preparación del artículo sobre el reconocimiento de microcontroladores utilizando TensorFlow y OpenCV, Craftduino, Canny 3 tiny y Raspberry PI me llamaron la atención al mismo tiempo, después de lo cual decidí que sería genial combinarlos nuevamente en un artículo. Pensé durante mucho tiempo sobre qué escribir, y luego me da vergüenza admitirlo, recordé que era un tío sano y que todavía no había conectado nada a través de UART. "Todo debe ser probado en la vida", pensé. Pero escribir solo sobre conectarse a UART es aburrido, por lo que se ordenó de inmediato todo tipo de "juguetes", entre los que se encontraba el nuevo Arduino y un par de sensores.

Entonces, hoy haremos un sistema de seguridad para mi bolígrafo favorito. ¿Te sorprende por qué una pluma? El secreto es simple, soy muy inexperto en todo tipo de asuntos electrónicos y, por lo tanto, cuando pedí un sensor de presión, pensé que funcionaría en toda el área, pero resultó que solo funciona para un área de contacto específica. Por extraño que parezca, pero en toda la casa no había nada lo suficientemente pesado, estable y de tamaño adecuado, a excepción de esta pluma. Bueno, excepto por mi dedo, pero no estaba listo para experimentar con él .

En el artículo, compartiré mi experiencia de conectar un sensor de presión y un sensor de movimiento Doppler a microcontroladores. Conectaremos los controladores a través de la interfaz UART con cable al GPIO Raspberry PI 3. Luego, escribiremos un programa simple en Python para mostrar el estado del sistema de seguridad, y al final conectaremos el teléfono inteligente al "raspberry" usando VNC para monitorear el sistema de seguridad a una distancia de la computadora.

¿Quieres dejar a Indiana Jones sin trabajo? Entonces eres bienvenido bajo cat.



Como siempre, al principio, explicaré que yo mismo soy nuevo en los problemas electrónicos de bricolaje y poco a poco estoy aprendiendo de un artículo a otro. Por lo tanto, no percibas lo que escribiré como la verdad última. Seguramente todo se puede hacer mejor.

Esto es de lo que hablaremos hoy:

Parte I: Introducción
Parte II: Conexión del circuito y programa para Canny 3 tiny
Parte III: Conexión del circuito y programa para Arduino Uno
Parte IV: Raspberry PI y el programa de monitoreo en Python
Parte V: Conclusión

Parte I: Introducción


Un lector atento puede preguntar: "¿Por qué compraste Arduino si mencionaste CraftDuino antes?", Todo es muy común. CraftDuino se rompió de nuevo. Una vezDrzugrikLo reparé y ahora es "autoaislamiento", y no quería molestar a una persona por nada.

Entonces, nos acercamos sin problemas a la base del material. Para este artículo, usé:

  1. Resistencia a presión FSR402:


  2. Sensor de movimiento Doppler RCWL-0516:


    En la tienda donde compré ambos sensores en la descripción del sitio, estaba escrito que eran para Arduino, pero en la práctica resultó que no se necesitaban bibliotecas especiales y todo comenzó sin problemas en Canny.
  3. Microcontrolador Arduino Uno:


  4. Microcontrolador Canny 3 Tiny - versión con bloque de terminales y mazo de cables:


  5. Computadora de placa única Raspberry PI 3 Modelo B:

  6. Otros: placas de prueba Breboard, cables y pinzas de cocodrilo, adaptador de corriente de frambuesa

Vamos a ir al grano.

Parte II: Conexión del circuito y programa para Canny 3 tiny


Hay muchos ejemplos en Internet sobre cómo conectar Arduino a través de UART, hay muchos menos ejemplos sobre Canny, así que comencemos con él.
Para no inflar la longitud del artículo y no repetirme, le recuerdo que consideré los problemas más básicos de cómo trabajar con Canny y el entorno de desarrollo CannyLab en este artículo , y un ejemplo de conectar sensores a un convertidor analógico a digital (ADC) y transmitir un mensaje a través de Virtual COM puerto, hice en este artículo .

Para aquellos que no leen esto, pero inmediatamente intentan conectar los sensores al ADC, hay un punto importante. No repita mi error, para que las salidas de los controladores n. ° 5 y n. ° 6 funcionen en el modo ADC, es necesario establecer puentes, como en la imagen a continuación. No es difícil, incluso yo lo hice.


Y otro punto importante en las salidas del controlador será el voltaje de suministro, es decir, si se conecta desde una fuente de alimentación externa en lugar de USB, asegúrese de que el voltaje de salida no exceda el voltaje permitido para los sensores y UART.

Para este artículo, un puente hubiera sido suficiente para nosotros, pero si obtuviéramos un soldador, ¿por qué deberíamos perder el tiempo con bagatelas?

Preste atención al bloque de terminales, el mazo de cables nativo viene de serie para esta versión del controlador, es resistente y probablemente conveniente si se usa dentro del automóvil, pero no para experimentos en la mesa. Se me ocurrió el know-how, reemplacé el arnés nativo por arneses que a menudo se incluyen con equipos informáticos, bien, o se venden en tiendas que venden productos electrónicos de bricolaje y resultó ser muy conveniente. No se sientan mal en el bloque, son suaves y al mismo tiempo dan un alargamiento adicional.

Pasemos al diagrama de conexión:


Todo es bastante simple y no requiere ninguna habilidad especial, creo que casi cualquiera puede manejarlo.

Primero, tratemos con el poder del tablero. Tomaremos el "terreno" de la salida "-" del controlador, pero con el plus, no todo está tan claro. A primera vista, parece lógico conectarse al terminal "+", pero en la práctica aparentemente es un terminal para ENTRADA + 5V. Por lo tanto, en lugar de ello, configuraremos una de las salidas como una salida de + 5V, proporcionándole una unidad lógica y llevándola al "más". Decidí tomar la salida número 3.

El sensor de presión está conectado de manera muy simple. De hecho, esta es una resistencia. Llevamos energía a una de sus "patas", y desde las segundas "patas" enrollamos el cable a la entrada del controlador conectada al ADC (ya sea No. 5 o No. 6). Elegí el número 6.

Por cierto, perdí el sensor de presión dos veces. Mi segundo error fue conectar el sensor. No cabe en el tablero, resulta que debe estar conectado a un bloque de terminales de tornillo o algo similar. Tuve que salir con los "cocodrilos".

El sensor de movimiento no está conectado mucho más complicado, ponemos + 5V de la placa en el conector Vin, lo conectamos al conector GND en la placa de pruebas y conectamos el conector OUT a cualquier entrada digital del controlador, lo conecté a la salida No. 5 (nosotros no lo cambiaremos al modo ADC).

Queda por conectar el controlador a la "Frambuesa" a través de UART. Para hacer esto, la salida del controlador No. 2, que en nuestro modo UART se convierte en la salida "TX", debe estar conectada a la entrada Raspberry GPIO RX, y la tierra en la placa y la Raspberry PI GPIO GND también deben estar conectadas.

Muchas personas aconsejan coordinar el nivel de voltaje a 3.3 V, e incluso intenté conectar Canny a través de un divisor de voltaje, pero funciona peor con él que sin él (o no funciona en absoluto), por lo que en este caso me conecté directamente al Raspberry UART. Parece que nada se quemó. Todo esta funcionando.


Tal vez usted pensó: "¿Por qué está conectado" con cables al UART, cuando sea posible a través de Bluetooth? De hecho, hay muchos ejemplos de conexión de Arduino a través de UART al módulo HC-06 en la red. Si crees en el foro , entonces Canny también se conecta a él sin problemas. Pero no lo he probado yo mismo. Quería conectarme usando cables, y decidí posponer la conexión Bluetooth hasta la próxima.

Así es como se ve el circuito:


Pasemos al programa para el controlador (diagrama):


En el bloque "Configuración de parámetros" , activamos el modo ADC para el canal (entrada) No. 6, transferimos el canal No. 3 al modo de salida discreta y lo alimentamos en una unidad lógica (+ 5V en nuestro caso), casi todo se analizó en este artículo .

Solo la configuración de UART no nos es familiar. Afortunadamente, todo es simple. Canny 3 tiny tiene solo 1 interfaz UART (por ejemplo, Canny 7 tiene dos de ellas). Cuando se activa el modo UART, la salida No. 1 se convierte en RX, la salida No. 2 TX. Elegiremos la velocidad de 9600 baudios habitual, pero el modo de transferencia de datos es limitado. El número disponible de bits de datos es de solo 8 bytes y 1 bit de parada (para modelos de controlador "más antiguos", hay más opciones). Para habilitar UART, es necesario ingresar el registro de configuración UART1 en el registro correspondiente escribe una constante predefinida:


De hecho, en nuestro caso fue posible elegir una constante que incluyera solo el modo de transmisión UART, porque no planeamos retirar nada. Pero decidí mostrar un ejemplo más general.

Si seleccionó el controlador correcto al crear el diagrama, entonces CannyLab no le permitirá elegir la constante que no le convenga. Por lo tanto, elegir un modo conscientemente peligroso no funciona. La verdad siempre es la oportunidad de ingresar una constante manualmente, pero es mejor no hacerlo.

Enviaremos 10 caracteres en el mensaje (incluidos 2 problemas), por lo que escribiremos una constante igual a 10 en el registro de mensajes.

No estoy seguro acerca de 1 elevación TX a uno, pero en caso de que haya activado este elemento, según lo entiendo, lo necesito No apriete con una resistencia.

En bloque"Envío periódico a través de UART y VCP"
Utilizamos el generador PWM para enviar 1 vez en 2 segundos para que el controlador no obstruya el canal por un segundo enviando constantemente un mensaje, utilizamos el "Detector de borde posterior". Lo que funcionará solo una vez en el momento de cambiar de uno a cero, si el controlador está listo en ese momento para enviar un mensaje a través de UART, entonces dos unidades llegarán a la entrada del bloque de multiplicación lógica, respectivamente, también "1", que le indicará al controlador que envíe un mensaje a través de UART , y también en caso de depuración en un puerto USB-COM (escribí sobre esto en detalle en un artículo anterior ).

En el bloque "Pantalla"todo es bastante simple, si los valores del sensor de presión son inferiores a un cierto umbral y el sensor de movimiento se ha disparado (le dará "1" a la salida), entonces activaremos el LED verde del controlador como señal de alarma.

Sería genial si el sistema funcionara como en una película:



pero nos limitaremos a encender el LED.

Aquí hay una demostración visual:


El último bloque, "Formación de mensajes", permanece .

Recibimos datos del ADC, la resolución del ADC es de 0 a 1023. Enviamos caracteres a UART, lo que significa que las lecturas del sensor de presión deben convertirse en una cadena. Como el número máximo es 1023 (4 dígitos), entonces necesitamos 4 bytes. "Number to String Converter" genera un par de caracteres en las salidas, tendremos 2 pares de caracteres, cada uno de ellos enviaremos mensajes UART y VCP a los registros de instalación. Luego, necesitamos escribir un separador para que las lecturas no se fusionen, ya que CannyLab usa un par de caracteres, luego tomamos dos caracteres de "espacio" como separador. Del mismo modo, convertimos las lecturas del sensor de movimiento, da un discreto 00 o 01, lo que significa que solo necesitamos un par de caracteres. Al final del mensaje, escriba el retorno de carro y los caracteres de nueva línea.

Como ya escribí en el artículo sobre la fotorresistencia, Canny no tiene su propio monitor de puerto COM, pero puede usar uno de terceros, y dado que usaremos el IDE de Arduino un poco más tarde, usaremos el monitor de puerto COM incorporado.

Entonces, pongo un dedo en el sensor de presión y me muevo por el camino:



El diagrama, como todo el código a continuación, se puede descargar desde GitHub .

Ahora pasemos al Arduino.


Parte III: Diagrama de cableado y programa para Arduino Uno


No hablaré sobre Arduino con tanto detalle, porque todo es bastante trivial.

Diagrama de cableado:



¡Nota! Dado que la salida Arduino RX / TX funciona a un voltaje de 5 V y el Raspberry PI tiene 3.3 V, las personas aconsejan conectar el Arduino al Raspberry UART utilizando módulos especiales o al menos un divisor de voltaje. No tengo un módulo especial, pero el divisor de voltaje siempre es bienvenido. Tomé 3 resistencias con un valor nominal de 1000 ohmios. E hizo un golpecito después de la segunda resistencia, en la que caerán 2/3 del voltaje. Si completa la alimentación a través de USB a 5 V, entonces simplemente resulta 5*0.66=3.3 .

Aunque también conecté Arduino directamente al UART Raspberry PI y todo parecía funcionar.

Conectamos el sensor de presión a "+" y a la entrada analógica "A1". El sensor de movimiento para alimentación y entrada digital No. 5.

Así es como se ve el circuito cuando se ensambla:



Aquí está el código de boceto para Ardino: el código es simple, lo único que vale la pena explicar es la variable de "ajuste". El hecho es que cuando se conecta al Arduino, el sensor de presión a veces mostraba valores distintos de cero incluso sin carga, y no pensé en nada mejor que restar el valor promedio de "ruido" para unificar las lecturas con Canny. Además, como en el caso anterior, implementamos la pantalla con un LED incorporado, en caso de que los sensores funcionaran:

byte photoPin = A0;

void setup() {
Serial.begin(9600);
pinMode(photoPin, INPUT);
pinMode(5, INPUT);
pinMode(13, OUTPUT);
}

void loop() {
int adjustment = 250;
int pressure_sensor = analogRead(A1) - adjustment;
int motion_sensor = digitalRead(5);

Serial.print(pressure_sensor);
Serial.print(" ");
Serial.println(motion_sensor);
if ((pressure_sensor<380) && (motion_sensor==1))
{
digitalWrite(LED_BUILTIN, HIGH);
}
else {
digitalWrite(LED_BUILTIN, LOW);
}
delay(1000);
}









Parte IV: Raspberry PI y el programa de monitoreo en Python


Primero, debe habilitar UART, así como SSH y VNC, luego conectarse a Raspberry usando un teléfono inteligente.

Vaya a la configuración de Raspberry PI y habilite SSH, VNC, UART, como en la imagen:



Por si acaso, apagué Bluetooth.

Escribiremos un programa Python simple, utilicé el IDE incorporado y no instalé ningún módulo Python adicional. Tenía un Raspbian con imagen de escritorio, de tamaño mediano, que ocupa aproximadamente 1.1 GB.

En nuestro programa de monitoreo, utilizaremos tanto la consola como la interfaz gráfica para mostrar información. Para implementar la GUI, decidí usar Tkinter. Realmente lo uso por segunda vez en mi vida, pero solo necesitaba un par de campos de texto y un cuadro de diálogo.

Aquí está el código del programa:

import serial
import time
from tkinter import *
from tkinter import ttk
from tkinter import messagebox

serialport = serial.Serial("/dev/ttyS0", baudrate=9600, timeout=1.0) 

window = Tk()  
window.title("Security system for my pen")  
window.geometry('400x170')
#Presure sensor label
lbl_ps = ttk.Label(window, text="Pressure sensor", font=("Arial Bold", 20))
lbl_ps.grid(column=0, row=0)
lbl_ps_status = ttk.Label(window, text=" ",  font=("Arial Bold", 20))
lbl_ps_status.grid(column=1, row=0)
#Motion sensor label
lbl_ms = ttk.Label(window, text="Motion sensor", font=("Arial Bold", 20))
lbl_ms.grid(column=0, row=1)
lbl_ms_status = ttk.Label(window, text=" ", font=("Arial Bold", 20))
lbl_ms_status.grid(column=1, row=1)

while True:
   counter = 0
   rcv = serialport.readline().decode('utf-8').replace("\r\n","").split('  ')
   if (len(rcv)==2):
       ps=rcv[0]
       ms=rcv[1]
       print (ps+ " " +ms)
       if (int(ps)<380):
           lbl_ps_status.config(text = " Warning!")
           counter += 1
       else:
           lbl_ps_status.config(text = " Ok")

       if (int(ms)>0):
           lbl_ms_status['text']=" Warning!"
           counter += 1
       else:
           lbl_ms_status['text']=" Ok"  
       window.update_idletasks()  
       window.update()
       if (counter == 2):
            messagebox.showinfo("Alarm!", "heck your pen!")     
       time.sleep(1)


Probablemente omitiré la importación de bibliotecas.

Después de la importación, establecemos la configuración para UART, el puerto en sí, la velocidad y el tiempo de espera.

serialport = serial.Serial("/dev/ttyS0", baudrate=9600, timeout=1.0) 


A continuación, colocamos los campos de texto (Etiqueta) en el diseño de la tabla (en la cuadrícula)
Tendremos 4 campos de los cuales 2 no cambian, y el estado del sensor se mostrará en los otros dos.

window.title("Security system for my pen")  
window.geometry('400x170')
#Presure sensor label
lbl_ps = ttk.Label(window, text="Pressure sensor", font=("Arial Bold", 20))
lbl_ps.grid(column=0, row=0)
lbl_ps_status = ttk.Label(window, text=" ",  font=("Arial Bold", 20))
lbl_ps_status.grid(column=1, row=0)
#Motion sensor label
lbl_ms = ttk.Label(window, text="Motion sensor", font=("Arial Bold", 20))
lbl_ms.grid(column=0, row=1)
lbl_ms_status = ttk.Label(window, text=" ", font=("Arial Bold", 20))
lbl_ms_status.grid(column=1, row=1)


Luego, crea un bucle sin fin.
Al comienzo del ciclo, restableceremos la etiqueta de la alarma counter .
Luego lea los datos del puerto serie.
Para no mirar todas las entradas como "\ x00", volvemos a codificar el mensaje en UTF-8.
Luego eliminamos el principio y el final de la línea para que solo queden números.
A continuación, dividimos la línea, prestamos atención al separador 2 espacios, no 1.
Para que el programa no se bloquee cuando el mensaje es incorrecto, el código adicional que está vinculado a recibir el mensaje está concentrado en una estructura condicional que funcionará solo si el mensaje se puede dividir en 2 partes.
Bien, muestre el sensor de presión y el sensor de movimiento en la consola.

while True:
   counter = 0
   rcv = serialport.readline().decode('utf-8').replace("\r\n","").split('  ')
   if (len(rcv)==2):
       ps=rcv[0]
       ms=rcv[1]
       print (ps+ " " +ms)


Compruebe si los sensores funcionaron, si todo está bien, el sistema escribe "OK", si uno de los sensores funciona, el contador aumenta en 1 y se emite una advertencia.


       if (int(ps)<380):
           lbl_ps_status.config(text = " Warning!")
           counter += 1
       else:
           lbl_ps_status.config(text = " Ok")

       if (int(ms)>0):
           lbl_ms_status['text']=" Warning!"
           counter += 1
       else:
           lbl_ms_status['text']=" Ok"  


En el último bloque, actualizamos los elementos del formulario Tkinter, después de lo cual verificamos cuántos sensores funcionaron. Si ambos sensores han funcionado en el ciclo, aparece una ventana modal con un mensaje de alarma.


       window.update_idletasks()  
       window.update()
       if (counter == 2):
            messagebox.showinfo("Alarm!", "heck your pen!")     
       time.sleep(1)


Es importante tener en cuenta aquí que el sensor de movimiento mantiene la salida "1" durante dos segundos desde el momento en que se detecta el movimiento. Entonces, como regla, el sistema logra funcionar.

A continuación se muestran capturas de pantalla que muestran el funcionamiento del programa:

Todos los sensores están tranquilos:



Una de las dos cosas funcionó:



Ambos funcionaron, el sistema espera a que el operador reconozca:



Parece que todo fue según lo planeado.


Conclusión


En conclusión, considere conectarse a una Raspberry PI desde un teléfono inteligente. En principio, no hay nada complicado, si puede conectarse desde una computadora, puede hacerlo desde un teléfono. Todo lo que necesita saber es la Raspberry IP, nombre de usuario y contraseña. Instalé VNC Viewer en mi teléfono inteligente Android, pero ciertamente puede tener otro cliente.

No es muy conveniente de usar, pero funciona:


Permíteme recordarte una vez más que todo el código se puede descargar desde GitHub .

Cada vez me prometo que no escribiré un artículo largo, pero aquí nuevamente el borrador ha excedido las 10 páginas impresas. El artículo muestra un ejemplo fácil de implementar de un sistema de seguridad hecho en casa, el alcance de la imaginación es enorme.

Si entiendo que el artículo fue interesante para usted, luego describiré otro sobre la conexión a través de un adaptador Bluetooth.

UPD:
Parece que obtuve una pequeña serie de artículos, por lo que para su comodidad, dejaré enlaces a otros artículos relacionados:


  1. "Uno, dos, tres - ¡quema el árbol de Navidad!" o mi primer vistazo al pequeño controlador CANNY 3 .
  2. "El destino tiene muchas formas ..." o automatizamos el control de una lámpara automática usando CANNY 3 tiny y un fotorresistor .
  3. "¿Qué puertos deportivos?" o controlamos el controlador a través de bluetooth usando una aplicación móvil en Xamarin (Android) .

All Articles