"Comme la prunelle d'un œil ..." ou on fait un système de sécurité simple basé sur un microcontrôleur (Canny ou Arduino) et Raspberry PI

Lors de la préparation de l'article sur la reconnaissance des microcontrôleurs utilisant TensorFlow et OpenCV, Craftduino, Canny 3 tiny et Raspberry PI ont attiré mon attention en même temps, après quoi j'ai décidé que ce serait génial de les combiner à nouveau dans un seul article. J'ai longtemps réfléchi à quoi écrire, puis j'ai honte d'admettre, je me suis souvenu que j'étais un oncle en bonne santé, et je n'avais encore rien connecté via UART. «Tout doit être essayé dans la vie», ai-je pensé. Mais écrire uniquement sur la connexion à UART est ennuyeux, donc toutes sortes de «jouets» ont été immédiatement commandés, parmi lesquels le tout nouveau Arduino et quelques capteurs.

Donc, aujourd'hui, nous allons créer un système de sécurité pour mon stylo préféré. Êtes-vous surpris pourquoi un stylo? Le secret est simple, je suis très inexpérimenté dans toutes sortes de sujets électroniques, et donc, quand j'ai commandé le capteur de pression, j'ai pensé qu'il fonctionnerait sur toute la zone, mais il s'est avéré qu'il ne fonctionne que pour une zone de contact spécifique. Curieusement, mais dans toute la maison, il n'y avait rien de suffisamment lourd, stable et de taille convenable, à l'exception de ce stylo. Eh bien, sauf pour mon doigt, mais je n'étais pas prêt à l'expérimenter .

Dans l'article, je partagerai mon expérience de connexion d'un capteur de pression et d'un capteur de mouvement Doppler à des microcontrôleurs. Nous connecterons les contrôleurs via l'interface UART filaire au GPIO Raspberry PI 3. Ensuite, nous écrirons un programme simple en Python pour afficher l'état du système de sécurité, et à la fin, nous connecterons le smartphone à la framboise en utilisant VNC pour surveiller le système de sécurité à distance de l'ordinateur.

Vous voulez laisser Indiana Jones sans travail? Alors vous êtes les bienvenus sous chat.



Comme toujours, au début, je vais vous expliquer que je suis moi-même nouveau dans les problèmes d'électronique de bricolage et que j'apprends lentement d'un article à l'autre. Par conséquent, ne percevez pas ce que j'écrirai comme la vérité ultime. Certes, tout peut être mieux fait.

Voici ce dont nous allons parler aujourd'hui:

Partie I: Introduction
Partie II: Connexion du circuit et du programme pour Canny 3 tiny
Partie III: Connexion du circuit et du programme pour Arduino Uno
Partie IV: Raspberry PI et le programme de surveillance en Python
Partie V: Conclusion

Partie I: Introduction


Un lecteur attentif peut demander: «Pourquoi avez-vous acheté Arduino si vous avez mentionné CraftDuino auparavant?», Tout est très courant. CraftDuino s'est encore cassé. Une fois queDrzugrikJe l'ai réparé, et maintenant c'est "l'auto-isolement", et je ne voulais pas déranger une personne pour rien.

Nous nous sommes donc approchés en douceur de la base matérielle. Pour cet article, j'ai utilisé:

  1. Résistance de pression FSR402:


  2. Capteur de mouvement Doppler RCWL-0516:


    Dans le magasin où j'ai acheté les deux capteurs dans la description sur le site, il était écrit qu'ils étaient pour Arduino, mais en pratique, il s'est avéré qu'aucune bibliothèque spéciale n'était nécessaire et tout a commencé sans problème sur Canny.
  3. Microcontrôleur Arduino Uno:


  4. Microcontrôleur Canny 3 Tiny - version avec bornier et faisceau de câbles:


  5. Ordinateur à carte unique Raspberry PI 3 modèle B:

  6. Autre: planches d'expérimentation Breboard, fils et pinces crocodile, adaptateur secteur framboise

Nous allons passer aux choses sérieuses.

Partie II: Connexion du circuit et du programme pour Canny 3 Tiny


Il existe de nombreux exemples sur Internet pour connecter Arduino via UART, il y a beaucoup moins d'exemples sur Canny, alors commençons par cela.
Afin de ne pas gonfler la longueur de l'article et de ne pas me répéter, je vous rappelle que j'ai considéré les problèmes les plus fondamentaux de la façon de travailler avec Canny et l'environnement de développement CannyLab dans cet article , et un exemple de connexion de capteurs à un convertisseur analogique-numérique (ADC) et de transmission d'un message via Virtual COM port, j'ai fait dans cet article .

Pour ceux qui ne lisent pas ceci, mais essaient immédiatement de connecter les capteurs à l'ADC, il y a un point important. Ne répétez pas mon erreur, pour que les sorties des contrôleurs n ° 5 et n ° 6 fonctionnent en mode ADC, des cavaliers doivent être réglés, comme dans l'image ci-dessous. Ce n'est pas difficile, même moi je l'ai fait.


Et un autre point important aux sorties du contrôleur sera la tension d'alimentation, c'est-à-dire que si vous vous connectez à partir d'une source d'alimentation externe au lieu d'USB, assurez-vous que la tension de sortie ne dépasse pas la tension autorisée pour les capteurs et l'UART.

Pour cet article, un cavalier aurait été suffisant pour nous, mais si nous avions un fer à souder, pourquoi devrions-nous perdre du temps sur de petites choses?

Faites attention au bornier, le faisceau de câbles natif est livré en standard pour cette version du contrôleur, il est difficile et probablement pratique s'il est utilisé à l'intérieur de la voiture, mais pas pour des expériences à table. J'ai trouvé le savoir-faire, remplacé le harnais natif par des harnais qui sont souvent fournis avec du matériel informatique, enfin, ou vendus dans des magasins vendant de l'électronique de bricolage et cela s'est avéré très pratique. Ils ne sont pas mal assis dans le bloc, doux et donnent en même temps un allongement supplémentaire.

Passons au schéma de connexion:


Tout est assez simple et ne nécessite aucune compétence particulière, je pense que presque tout le monde peut y faire face.

Voyons d'abord le pouvoir du conseil d'administration. Nous prendrons le «terrain» de la sortie «-» du contrôleur, mais avec le plus, tout n'est pas si clair. À première vue, il semble logique de se connecter à la borne «+», mais en pratique il s'agit apparemment d'une borne pour + 5V INPUT. Par conséquent, au lieu de cela, nous configurerons l'une des sorties comme une sortie + 5V, en lui fournissant une unité logique et en la tirant vers le «plus». J'ai décidé de prendre la sortie numéro 3.

Le capteur de pression est connecté très simplement. En fait, c'est une résistance. Nous alimentons l'une de ses «jambes» et, à partir des deuxièmes «jambes», nous enroulons le fil à l'entrée du contrôleur connectée à l'ADC (n ° 5 ou n ° 6). J'ai choisi le n ° 6.

Au fait, j'ai perdu deux fois le capteur de pression. Ma deuxième erreur a été de connecter le capteur. Il ne rentre pas dans la planche à pain, il s'avère qu'il doit être connecté à un bornier à vis ou quelque chose de similaire. J'ai dû sortir avec les "crocodiles".

Le capteur de mouvement n'est pas connecté beaucoup plus compliqué, nous avons mis + 5V de la carte dans la prise Vin, le connectons à la prise GND sur la planche à pain, et connectons la prise OUT à n'importe quelle entrée numérique du contrôleur, je l'ai connecté à la sortie n ° 5 (nous nous ne le passerons pas en mode ADC).

Il reste à connecter le contrôleur au "Raspberry" via UART. Pour ce faire, la sortie de contrôleur n ° 2, qui dans notre mode UART devient la sortie TX, doit être connectée à l'entrée Raspberry GPIO RX, et la masse sur la carte et le Raspberry PI GPIO GND doivent également être connectés.

Beaucoup de gens conseillent de coordonner le niveau de tension à 3,3 V, et j'ai même essayé de connecter Canny via un diviseur de tension, mais cela fonctionne moins bien avec que sans lui (ou ne fonctionne pas du tout), alors dans ce cas, je me suis connecté directement au Raspberry UART. Il semble que rien ne se soit éteint. Tout fonctionne.


Peut-être avez-vous pensé: "Pourquoi est-il connecté" avec des fils à l'UART, si possible via Bluetooth? " En effet, il existe de nombreux exemples de connexion d'Arduino via l'UART au module HC-06 du réseau. Si vous croyez au forum , Canny s'y connecte également sans problème. Mais je ne l'ai pas essayé moi-même. Je voulais me connecter à l'aide de fils et j'ai décidé de reporter la connexion Bluetooth à la prochaine fois.

Voici à quoi ressemble le circuit:


Passons au programme du contrôleur (diagramme):


Dans le bloc "Parameter Setting" , nous activons le mode ADC pour le canal (entrée) n ° 6, transférons le canal n ° 3 en mode de sortie discrète et alimentons une unité logique (+ 5V dans notre cas), presque tout a été analysé dans cet article .

Seuls les paramètres UART ne nous sont pas familiers. Heureusement, tout est simple. Canny 3 tiny n'a qu'une seule interface UART (par exemple, Canny 7 en a deux). Lorsque le mode UART est activé, la sortie n ° 1 devient RX, la sortie n ° 2 TX. Nous choisirons le débit habituel de 9600 bauds, mais le mode de transfert de données est limité. Le nombre de bits de données disponibles n'est que de 8 octets et 1 bit d'arrêt (pour les modèles de contrôleurs "plus anciens", il y a plus de choix). Pour activer UART, il est nécessaire d' entrer le registre de configuration UART1 dans le registre correspondant écrire une constante prédéfinie:


En fait, dans notre cas, il a été possible de choisir une constante qui n'incluait que le mode de transmission UART, car nous ne prévoyons rien reprendre. Mais j'ai décidé de montrer un exemple plus général.

Si vous avez sélectionné le bon contrôleur lors de la création du diagramme, CannyLab ne vous permettra pas de choisir la constante qui ne lui conviendrait pas. Par conséquent, le choix d'un mode sciemment dangereux ne fonctionne pas. La vérité est toujours l'occasion d'entrer une constante manuellement, mais il vaut mieux ne pas le faire.

Nous enverrons 10 caractères dans le message (y compris 2 problèmes), donc nous écrirons une constante égale à 10 dans le registre des messages.

Je ne suis pas sûr de 1 élévation TX à un, mais juste au cas où j'allumerais cet élément, si je comprends bien, j'en ai besoin Ne serrez pas avec une résistance.

En bloc«Envoi périodique via UART et VCP»
Nous utilisons le générateur PWM pour envoyer 1 fois en 2 secondes afin que le contrôleur n'obstrue pas le canal pendant une seconde en envoyant constamment un message, nous utilisons le «Trailing Edge Detector». Qui ne fonctionnera qu'une seule fois au moment de passer de un à zéro, si le contrôleur est prêt à ce moment à envoyer un message via UART, alors deux unités viendront respectivement à l'entrée du bloc de multiplication logique, également «1», qui demandera au contrôleur d'envoyer un message via UART , et aussi juste au cas où un débogage dans un port USB-COM (j'ai écrit à ce sujet en détail dans un article précédent ).

Dans le bloc "Affichage"tout est assez simple, si les valeurs du capteur de pression sont inférieures à un certain seuil et que le capteur de mouvement a fonctionné (il donnera «1» à la sortie), alors nous allumerons la LED verte du contrôleur comme signal d'alarme.

Ce serait cool si le système fonctionnait comme dans un film:



Mais nous nous limiterons à allumer la LED.

Voici une démonstration visuelle:


Il reste le dernier bloc "Message Formation".

Nous recevons des données de l'ADC, la résolution de l'ADC est de 0 à 1023. Nous envoyons des caractères à l'UART, ce qui signifie que les lectures du capteur de pression doivent être converties en une chaîne. Puisque le nombre maximum est 1023 (4 chiffres), nous avons donc besoin de 4 octets. «Number to String Converter» génère quelques caractères aux sorties, nous aurons 2 paires de caractères, chacun d'eux enverra des messages UART et VCP aux registres d'installation. Ensuite, nous devons écrire un séparateur afin que les lectures ne fusionnent pas, puisque CannyLab utilise quelques caractères, puis nous prenons deux caractères «espace» comme séparateur. De même, nous convertissons les lectures du capteur de mouvement, il donne un 00 ou 01 discret, ce qui signifie que nous n'avons besoin que d'une seule paire de caractères. À la toute fin du message, écrivez le retour chariot et les caractères de nouvelle ligne.

Comme je l'ai déjà écrit dans l'article sur la photorésistance, Canny n'a pas son propre moniteur de port COM, mais vous pouvez en utiliser un tiers, et puisque nous utiliserons l'IDE Arduino un peu plus tard, nous utiliserons le moniteur de port COM intégré.

Alors, j'ai mis un doigt sur le capteur de pression et je me déplace le long du chemin:



Le diagramme, comme tout le code ci-dessous, peut être téléchargé depuis GitHub .

Passons maintenant à l'Arduino.


Partie III: Schéma de câblage et programme pour Arduino Uno


Je ne parlerai pas d'Arduino avec autant de détails, car tout est assez banal.

Schéma de câblage:



Remarque! Étant donné que la sortie Arduino RX / TX fonctionne à 5 V et que le Raspberry PI a 3,3 V, les gens conseillent de connecter l'Arduino au Raspberry UART à l'aide de modules spéciaux ou au moins à l'aide d'un diviseur de tension. Je n'ai pas de module spécial, mais le diviseur de tension est toujours le bienvenu. J'ai pris 3 résistances avec une valeur nominale de 1000 ohms. Et il a fait un tap après la deuxième résistance, sur laquelle les 2/3 de la tension vont baisser. Si vous coupez l'alimentation via USB à 5 V, cela se révèle 5*0.66=3.3 .

Bien que j'ai également connecté Arduino directement à l'UART Raspberry PI et tout semblait fonctionner.

Nous connectons le capteur de pression à «+» et à l'entrée analogique «A1». Le capteur de mouvement pour l'alimentation et l'entrée numérique n ° 5.

Voici à quoi ressemble le circuit lorsqu'il est assemblé:



Voici le code de croquis pour Ardino: Le code est simple, la seule chose qui mérite d'être expliquée est la variable «ajustement». Le fait est que lorsqu'il est connecté à l'Arduino, le capteur de pression a parfois montré des valeurs non nulles même sans charge, et je n'ai rien pensé de mieux que de soustraire la valeur moyenne du "bruit" pour unifier les lectures avec Canny. De plus, comme dans le cas précédent, nous avons implémenté l'affichage avec une LED intégrée, au cas où les capteurs fonctionneraient:

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);
}









Partie IV: Raspberry PI et le programme de surveillance en Python


Vous devez d'abord activer UART, ainsi que SSH et VNC, puis vous connecter à Raspberry à l'aide d'un smartphone.

Accédez aux paramètres Raspberry PI et activez SSH, VNC, UART, comme dans l'image:



Au cas où, j'aurais désactivé Bluetooth.

Nous allons écrire un simple programme Python, j'ai utilisé l'IDE intégré et n'ai installé aucun module Python supplémentaire. J'avais un Raspbian avec une image de bureau, de taille moyenne, qui prend environ 1,1 Go.

Dans notre programme de surveillance, nous utiliserons à la fois la console et l'interface graphique pour afficher les informations. Pour implémenter l'interface graphique, j'ai décidé d'utiliser Tkinter. Je l'utilise vraiment pour la deuxième fois de ma vie, mais j'avais juste besoin de quelques champs de texte et d'une boîte de dialogue.

Voici le code du programme:

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)


Je vais probablement ignorer l'importation de bibliothèques.

Après l'importation, nous avons défini les paramètres pour UART, le port lui-même, la vitesse et le délai d'expiration.

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


Ensuite, nous plaçons des champs de texte (Label) sur la disposition du tableau (sur la grille)
Nous aurons 4 champs dont 2 sont inchangés, et l'état du capteur sera affiché dans les deux autres.

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)


Ensuite, créez une boucle sans fin.
Au début du cycle, nous réinitialiserons l'étiquette d'alarme counter .
Lisez ensuite les données du port série.
Afin de ne pas regarder toutes les entrées comme «\ x00», nous ré-encodons le message en UTF-8.
Ensuite, nous supprimons le début et la fin de la ligne afin qu'il ne reste que des chiffres.
Ensuite, nous divisons la ligne, faisons attention au séparateur 2 espaces, pas 1.
Afin que le programme ne se bloque pas lorsque le message est incorrect, le code supplémentaire lié à la réception du message est entassé dans une structure conditionnelle qui ne fonctionnera que si le message peut être divisé en 2 parties.
Eh bien, affichez le capteur de pression et le capteur de mouvement dans la 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)


Vérifiez si les capteurs ont fonctionné, si tout va bien, le système écrit «OK», si l'un des capteurs fonctionne, le compteur augmente de 1 et un avertissement est émis.


       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"  


Dans le dernier bloc, nous mettons à jour les éléments du formulaire Tkinter, après quoi nous vérifions le nombre de capteurs qui ont fonctionné. Si les deux capteurs ont fonctionné au cours du cycle, une fenêtre modale apparaît avec un message d'alarme.


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


Il est important de noter ici que le capteur de mouvement conserve la sortie «1» pendant deux secondes à partir du moment où le mouvement est détecté. Donc, en règle générale, le système parvient à fonctionner.

Voici des captures d'écran montrant le fonctionnement du programme:

Tous les capteurs sont calmes:



L'une des deux choses a fonctionné:



Les deux fonctionnaient, le système attend que l'opérateur reconnaisse:



Il semble que tout était comme prévu.


Conclusion


En conclusion, envisagez de vous connecter à un Raspberry PI à partir d'un smartphone. En principe, il n'y a rien de compliqué, si vous pouvez vous connecter à partir d'un ordinateur, vous pouvez le faire à partir d'un téléphone. Tout ce que vous devez savoir, c'est l'IP Raspberry, le nom d'utilisateur et le mot de passe. J'ai installé VNC Viewer sur mon smartphone Android, mais vous pouvez certainement avoir un autre client.

Ce n'est pas très pratique à utiliser, mais ça marche:


Permettez-moi de vous rappeler une fois de plus que tout le code peut être téléchargé depuis GitHub .

Chaque fois, je me promets de ne pas écrire un long article, mais là encore le brouillon a dépassé 10 pages imprimées. L'article montre un exemple facile à mettre en œuvre d'un système de sécurité fait maison, la marge d'imagination est énorme.

Si je comprends que l'article vous a intéressé, j'en décrirai plus tard un autre sur la connexion via un adaptateur Bluetooth.

UPD:
Il semble que j'ai reçu une petite série d'articles, donc pour votre commodité, je vais laisser des liens vers d'autres articles connexes:


  1. "Un, deux, trois - brûlez le sapin de Noël!" ou mon premier aperçu du petit contrôleur CANNY 3 .
  2. "La destination a beaucoup de formes ..." ou nous automatisons le contrôle d'une lampe automatique à l'aide de CANNY 3 Tiny et d'une photorésistance .
  3. "Quelles marinas?" ou nous contrôlons le contrôleur via Bluetooth en utilisant une application mobile sur Xamarin (Android) .

All Articles