“Como a menina de um olho ...” ou criamos um sistema de segurança simples baseado em um microcontrolador (Canny ou Arduino) e Raspberry PI

Durante a preparação do artigo sobre o reconhecimento de microcontroladores usando TensorFlow e OpenCV, Craftduino, Canny 3 tiny e Raspberry PI chamaram minha atenção ao mesmo tempo, após o que decidi que seria ótimo combiná-los novamente em um artigo. Pensei durante muito tempo sobre o que escrever e, depois, tenho vergonha de admitir, lembrei-me de que era um tio saudável e nunca tinha conectado nada via UART ainda. "Tudo precisa ser tentado na vida", pensei. Mas escrever apenas sobre conectar-se ao UART é chato, então todos os tipos de "brinquedos" foram encomendados imediatamente, entre os quais o novíssimo Arduino e alguns sensores.

Então, hoje vamos criar um sistema de segurança para a minha caneta favorita. Você está surpreso por que uma caneta? O segredo é simples, eu sou muito inexperiente em todos os tipos de questões eletrônicas e, portanto, quando pedi um sensor de pressão, pensei que ele funcionaria em toda a área, mas descobriu-se que funciona apenas para uma área de contato específica. Curiosamente, mas em toda a casa não havia nada de peso suficiente, estável e de tamanho adequado, exceto por esta caneta. Bem, exceto pelo meu dedo, mas eu não estava pronto para experimentar .

Neste artigo, compartilharei minha experiência de conectar um sensor de pressão e um sensor de movimento Doppler aos microcontroladores. Vamos conectar os controladores via interface UART com fio ao GPIO Raspberry PI 3. Em seguida, escreveremos um programa simples no Python para exibir o status do sistema de segurança e, no final, conectaremos o smartphone ao "raspberry" usando o VNC para monitorar o sistema de segurança à distância do computador.

Deseja deixar Indiana Jones fora do trabalho? Então você é bem-vindo sob gato.



Como sempre, no começo explicarei que sou novo na eletrônica DIY e estou aprendendo lentamente de um artigo para outro. Portanto, não perceba o que vou escrever como a verdade suprema. Certamente tudo pode ser feito melhor.

Aqui está o que falaremos hoje:

Parte I: Introdução
Parte II: Conectando o circuito e o programa para o Canny 3 tiny
Parte III: Conectando o circuito e o programa para o Arduino Uno
Parte IV: Raspberry PI e o programa de monitoramento em Python
Parte V: Conclusão

Parte I: Introdução


Um leitor atento pode perguntar: "Por que você comprou o Arduino se você mencionou o CraftDuino antes?", Tudo é muito comum. CraftDuino quebrou novamente. Uma vezDrzugrikEu consertei e agora é "auto-isolamento", e não queria incomodar uma pessoa por nada.

Então, nós nos aproximamos suavemente da base do material. Para este artigo, eu usei:

  1. Resistor de pressão FSR402:


  2. Sensor de movimento Doppler RCWL-0516:


    Na loja onde comprei os dois sensores na descrição do site, estava escrito que eles eram para o Arduino, mas, na prática, verificou-se que não eram necessárias bibliotecas especiais e tudo começou sem problemas no Canny.
  3. Microcontrolador Arduino Uno:


  4. Microcontrolador Canny 3 Tiny - versão com bloco de terminais e chicote de cabos:


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

  6. Outros: Tábuas de pão Breboard, fios e clipes de crocodilo, adaptador de energia para framboesa

Vamos ao que interessa.

Parte II: Conectando o circuito e o programa para Canny 3 tiny


Existem muitos exemplos na Internet de como conectar o Arduino via UART, há muito menos exemplos sobre o Canny, então vamos começar com ele.
Para não aumentar o tamanho do artigo e não me repetir, lembro que considerei os problemas mais básicos de como trabalhar com o Canny e o ambiente de desenvolvimento do CannyLab neste artigo , e um exemplo de conexão de sensores a um conversor analógico-digital (ADC) e transmissão de uma mensagem via Virtual COM porta, eu fiz neste artigo .

Para quem não lê isso, mas tenta conectar imediatamente os sensores ao ADC, há um ponto importante. Não repita meu erro. Para que as saídas dos controladores 5 e 6 funcionem no modo ADC, é necessário configurar os jumpers, como na figura abaixo. Não é difícil, até eu fiz.


E outro ponto importante nas saídas do controlador será a tensão de alimentação, ou seja, se você se conectar a partir de uma fonte de energia externa em vez de USB, verifique se a tensão de saída não excede a tensão permitida para sensores e UART.

Para este artigo, um jumper seria suficiente para nós, mas se obtivemos um ferro de soldar, por que deveríamos perder tempo com ninharias?

Preste atenção ao bloco de terminais, o chicote de cabos nativo é padrão para esta versão do controlador, é resistente e provavelmente conveniente se usado dentro do carro, mas não para experimentos na mesa. Eu inventei o know-how, substituí o chicote nativo por chicotes que geralmente são fornecidos com equipamentos de computador, bem ou vendidos em lojas que vendem eletrônicos DIY, e isso se mostrou muito conveniente. Eles não se sentam mal no quarteirão, macios e ao mesmo tempo dão alongamentos adicionais.

Vamos seguir para o diagrama de conexão:


Tudo é bem simples e não requer nenhuma habilidade especial, acho que quase qualquer um pode lidar com isso.

Primeiro, vamos lidar com o poder do conselho. Vamos usar o "ground" da saída "-" do controlador, mas com o plus, tudo não está tão claro. À primeira vista, parece lógico conectar-se ao terminal “+”, mas, na prática, aparentemente é um terminal para + 5V INPUT. Portanto, em vez disso, configuraremos uma das saídas como uma saída de + 5V, fornecendo uma unidade lógica e puxando-a para o "mais". Decidi pegar a saída número 3.

O sensor de pressão está conectado de maneira muito simples. De fato, este é um resistor. Trazemos energia para uma de suas "pernas" e, a partir das segundas "pernas", enrolamos o fio na entrada do controlador conectada ao ADC (No. 5 ou No. 6). Eu escolhi o número 6.

A propósito, perdi o sensor de pressão duas vezes. Meu segundo erro foi conectar o sensor. Ele não se encaixa na placa de ensaio, mas deve ser conectado a um bloco de terminais parafusados ​​ou algo semelhante. Eu tive que sair com os "crocodilos".

O sensor de movimento não é conectado muito mais complicado, colocamos + 5V da placa no conector Vin, conectamos ao conector GND na placa de ensaio e conectamos o conector OUT a qualquer entrada digital do controlador, conectei à saída n ° 5 (nós não o mudaremos para o modo ADC).

Resta conectar o controlador ao "Raspberry" através do UART. Para fazer isso, a saída do controlador nº 2, que em nosso modo UART se torna a saída “TX”, deve ser conectada à entrada Raspberry GPIO RX, e o terra na placa e o Raspberry PI GPIO GND também devem ser conectados.

Muitas pessoas aconselham coordenar o nível de tensão para 3,3 V, e eu até tentei conectar o Canny através de um divisor de tensão, mas funciona pior do que sem ele (ou não funciona), por isso, neste caso, conectei-me diretamente ao Raspberry UART. Parece que nada queimou. Tudo está funcionando.


Talvez você tenha pensado: "Por que ele está conectado" aos fios do UART, quando possível via Bluetooth? " De fato, existem muitos exemplos de conexão do Arduino através do UART ao módulo HC-06 na rede. Se você acredita no fórum , o Canny também se conecta a ele sem problemas. Mas eu não tentei eu mesmo. Queria conectar usando fios e decidi adiar a conexão Bluetooth até a próxima vez.

Aqui está a aparência do circuito:


Vamos para o programa do controlador (diagrama):


No bloco “Parameter Setting” , ativamos o modo ADC para o canal (entrada) nº 6, transferimos o canal nº 3 para o modo de saída discreta e alimentamos uma unidade lógica (+ 5V no nosso caso), quase tudo foi analisado neste artigo .

Apenas as configurações do UART não nos são familiares. Felizmente, tudo é simples. O Canny 3 tiny possui apenas 1 interface UART (por exemplo, o Canny 7 possui dois). Quando o modo UART é ativado, a saída nº 1 se torna RX, a saída nº 2 TX. Vamos escolher a taxa de 9600 bauds usual, mas o modo de transferência de dados é limitado. O número disponível de bits de dados é de apenas 8 bytes e 1 bit de parada (para modelos de controlador “mais antigos”, há mais opções) .Para habilitar o UART, é necessário inserir o registro de configuração do UART1 no registro correspondente. escreva uma constante predefinida:


De fato, no nosso caso, foi possível escolher uma constante que incluísse apenas o modo de transmissão UART, porque não planejamos recuperar nada. Mas eu decidi mostrar um exemplo mais geral.

Se você selecionou o controlador correto ao criar o diagrama, o CannyLab não permitirá que você escolha a constante que não combina com ele. Portanto, a escolha de um modo conscientemente perigoso não funciona. A verdade é sempre a oportunidade de inserir uma constante manualmente, mas é melhor não fazer isso.

Enviaremos 10 caracteres na mensagem (incluindo 2 problemas), portanto, escreveremos uma constante igual a 10 no registro de mensagens.

Não tenho certeza sobre o aumento de 1 TX para um, mas, caso ative esse item, como o entendo, preciso dele Não aperte com um resistor.

No bloco“Envio periódico via UART e VCP”
Usamos o gerador PWM para enviar 1 vez em 2 segundos, para que o controlador não obstrua o canal por um segundo enviando constantemente uma mensagem, usamos o “Trailing Edge Detector”. Que funcionará apenas uma vez no momento de alternar de um para zero, se o controlador estiver pronto neste momento para enviar uma mensagem via UART, duas unidades chegarão à entrada do bloco de multiplicação lógica, respectivamente, também "1", que instruirá o controlador a enviar uma mensagem via UART , e também no caso de depuração em uma porta USB-COM (escrevi sobre isso em detalhes em um artigo anterior ).

No bloco "Display"tudo é bastante simples, se os valores do sensor de pressão forem menores que um determinado limite e, ao mesmo tempo, o sensor de movimento foi acionado (ele dará "1" à saída), então acenderemos o LED verde do controlador como um sinal de alarme.

Seria legal se o sistema funcionasse como em um filme:



mas nos limitaremos a ligar o LED.

Aqui está uma demonstração visual:


Restou o último bloco “Message Formation”.

Recebemos dados do ADC, a resolução do ADC é de 0 a 1023. Enviamos caracteres para o UART, o que significa que as leituras do sensor de pressão devem ser convertidas em uma string. Como o número máximo é 1023 (4 dígitos), precisamos de 4 bytes. “Number to String Converter” gera dois caracteres nas saídas; teremos 2 pares de caracteres; cada um deles enviará mensagens UART e VCP aos registros de instalação. Em seguida, precisamos escrever um separador para que as leituras não se mesclem, já que o CannyLab usa dois caracteres e, em seguida, usamos dois caracteres "espaço" como separador. Da mesma forma, convertemos as leituras do sensor de movimento, fornecendo um discreto 00 ou 01, o que significa que precisamos apenas de um par de caracteres. No final da mensagem, escreva os caracteres de retorno de carro e nova linha.

Como já escrevi no artigo sobre o fotorresistor, o Canny não possui seu próprio monitor de porta COM, mas você pode usar qualquer monitor de terceiros e, como usaremos o Arduino IDE um pouco mais tarde, usaremos o monitor de porta COM integrado.

Então, eu coloco um dedo no sensor de pressão e me movo pelo caminho:



O diagrama, como todo o código abaixo, pode ser baixado no GitHub .

Agora vamos para o Arduino.


Parte III: Diagrama de fiação e programa para o Arduino Uno


Não falarei sobre o Arduino com tanto detalhe, porque tudo é bastante trivial.

Diagrama de fiação:



Nota! Como a saída do Arduino RX / TX opera a uma tensão de 5 V e o Raspberry PI possui 3,3 V, as pessoas aconselham a conexão do Arduino ao Raspberry UART usando módulos especiais ou pelo menos usando um divisor de tensão. Eu não tenho um módulo especial, mas o divisor de tensão é sempre bem-vindo. Tomei 3 resistores com um valor nominal de 1000 ohms. E ele fez um tap após o segundo resistor, no qual 2/3 da tensão cairá. Se você arredondar a energia via USB para 5 V, isso acontece 5*0.66=3.3 .

Embora eu também tenha conectado o Arduino diretamente ao UART Raspberry PI e tudo pareça funcionar.

Conectamos o sensor de pressão a “+” e à entrada analógica “A1”. O sensor de movimento para entrada de potência e digital n ° 5.

É assim que o circuito se parece quando montado:



Aqui está o código de rascunho para Ardino: O código é simples, a única coisa que vale a pena explicar é a variável "ajuste". O fato é que, quando conectado ao Arduino, o sensor de pressão às vezes mostrava valores diferentes de zero, mesmo sem carga, e eu não pensava em nada melhor do que subtrair o valor médio do "ruído" para unificar as leituras com Canny. Além disso, como no caso anterior, implementamos a tela com um LED embutido, caso os sensores funcionassem:

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 e o programa de monitoramento em Python


Primeiro, você precisa habilitar o UART, bem como o SSH e o VNC, e depois conectar-se ao Raspberry usando um smartphone.Vá

para as configurações do Raspberry PI e ative o SSH, VNC, UART, como na figura:



Por precaução, desliguei o Bluetooth.

Vamos escrever um programa Python simples, usei o IDE embutido e não instalei nenhum módulo Python adicional. Eu tinha um Raspbian com imagem de desktop, de tamanho médio, que ocupa aproximadamente 1,1 GB.

Em nosso programa de monitoramento, usaremos o console e a interface gráfica para exibir informações. Para implementar a GUI, decidi usar o Tkinter. Eu realmente o uso pela segunda vez na minha vida, mas eu só precisava de alguns campos de texto e uma caixa de diálogo.

Aqui está o código do 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)


Provavelmente vou pular a importação de bibliotecas.

Após a importação, definimos as configurações do UART, a própria porta, velocidade e tempo limite.

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


Em seguida, colocamos os campos de texto (Etiqueta) no layout da tabela (na grade).
Teremos 4 campos, dos quais 2 não são alterados, e o status do sensor será exibido nos outros dois.

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)


Em seguida, crie um loop sem fim.
No início do ciclo, redefiniremos o rótulo do alarme counter .
Em seguida, leia os dados da porta serial.
Para não olhar para todas as entradas como "\ x00", recodificamos a mensagem em UTF-8.
Em seguida, removemos o início e o fim da linha para que apenas os números permaneçam.
Em seguida, dividimos a linha, preste atenção aos espaços 2 do separador, e não 1.
Para que o programa não falhe quando a mensagem estiver incorreta, o código adicional vinculado ao recebimento da mensagem será amontoado em uma estrutura condicional que funcionará apenas se a mensagem puder ser dividida em duas partes.
Bem, exiba o sensor de pressão e o sensor de movimento no console.

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)


Verifique se os sensores funcionaram, se está tudo bem, o sistema escreve "OK"; se um dos sensores funcionar, o contador aumenta em 1 e é emitido um aviso.


       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"  


No último bloco, atualizamos os elementos do formulário Tkinter, após o qual verificamos quantos sensores funcionaram. Se os dois sensores funcionaram no ciclo, uma janela modal aparece com uma mensagem de alarme.


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


É importante observar aqui que o sensor de movimento mantém a saída "1" por dois segundos a partir do momento em que o movimento é detectado. Então, como regra, o sistema consegue funcionar.

Abaixo estão as capturas de tela mostrando o funcionamento do programa:

Todos os sensores estão calmos:



Uma das duas coisas funcionou:



Ambos funcionaram, o sistema espera que o operador reconheça:



Parece que tudo estava como planejado.


Conclusão


Em conclusão, considere conectar-se a um Raspberry PI a partir de um smartphone. Em princípio, não há nada complicado, se você pode se conectar a partir de um computador, pode fazer a partir de um telefone. Tudo o que você precisa saber é o IP, nome de usuário e senha do Raspberry. Instalei o VNC Viewer no meu smartphone Android, mas você certamente pode ter outro cliente.

Não é muito conveniente de usar, mas funciona:


Deixe-me lembrá-lo mais uma vez que todo o código pode ser baixado do GitHub .

Cada vez que prometo a mim mesmo que não vou escrever um artigo longo, mas aqui novamente o rascunho ultrapassou 10 páginas impressas. O artigo mostra um exemplo fácil de implementar de um sistema de segurança caseiro, a capacidade de imaginação é enorme.

Se eu entendo que o artigo foi interessante para você, descreverei mais adiante sobre como conectar-se através de um adaptador Bluetooth.

UPD:
Parece que recebi uma pequena série de artigos, portanto, para sua conveniência, deixarei links para outros artigos relacionados:


  1. "Um, dois, três - queime a árvore de Natal!" ou meu primeiro olhar para o pequeno controlador CANNY 3 .
  2. “O destino tem muitas formas ...” ou automatizamos o controle de um autolamp usando CANNY 3 tiny e um fotorresistor .
  3. "Quais marinas?" ou controlamos o controlador via bluetooth usando um aplicativo móvel no Xamarin (Android) .

All Articles