Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Contrôle du capteur et de l'actionneur Raspberry Pi

Généralement, en tant que programmeur, vous travaillerez avec des données sur disque, et si vous avez de la chance, vous dessinerez des images sur l'écran. Cela contraste avec l'informatique physique qui vous permet, en tant que programmeur, de travailler avec des données détectées dans le monde réel et de contrôler des appareils qui se déplacent dans le monde réel.

Objectif

Utilisez un Raspberry Pi pour lire la valeur de l'accéléromètre et pour contrôler un servomoteur.

Définitions

Dans cet article, je vais passer en revue quatre projets Python de base pour démontrer les capacités matérielles du Raspberry Pi. Ces projets sont :

Faire clignoter une LED.

Une LED est une diode électroluminescente. Une diode est un élément de circuit qui permet au courant de circuler dans un sens mais pas dans l'autre. Émettre de la lumière signifie… il émet de la lumière. Votre LED typique a besoin de courant dans la plage de 10 à 30 mA et chutera d'environ 2 à 3 volts. Si vous connectez une LED directement au GPIO de votre Pi, elle générera bien plus de 30 mA et fera probablement griller votre LED (et éventuellement votre Pi). Pour éviter cela, nous devons mettre une résistance. Si vous voulez faire des mathématiques, vous pouvez calculer la résistance appropriée en utilisant l'équation suivante :

R =(Vs - Vd) / I

Mais si vous ne voulez pas faire de maths, choisissez une résistance entre 500 et 1500 ohms. Une fois que vous avez rassemblé tous vos éléments de circuit (LED et résistance)

Le code est également assez simple. Mais vous devrez d'abord installer RPi.GPIO. (Il peut être préinstallé sur votre système d'exploitation.)

import timefrom itertools import cycleimport RPi.GPIO as ioio.setmode(io.BCM)io.setup(12, io.OUT)o =cycle([1, 0]) while True :io.output(12, o .next()) time.sleep(0.5)

Les lignes importantes sont essentiellement :

io.setup(12, io.OUT)io.output(12, 1)

Ces lignes de code configurent la broche 12 en tant que sortie, puis produisent un 1 (3,3 volts). Exécutez le code ci-dessus connecté au circuit et vous devriez voir votre LED clignoter toutes les demi-secondes.

Lire un pot.

Un pot est l'abréviation de potentiomètre, qui est une résistance variable. C'est juste un mot sophistiqué pour bouton. Fondamentalement, en tournant le bouton, vous affectez la résistance, ce qui affecte la tension aux bornes du pot. (V =IR , rappelles toi?). La variation de la tension par rapport à une valeur physique est le nombre de capteurs qui fonctionnent, et cette classe de capteur est connue sous le nom de capteur analogique . Vous vous souvenez quand j'ai dit que les broches GPIO ne peuvent représenter qu'un état binaire ? Nous devrons faire appel à un peu plus de silicium pour convertir cette valeur de tension analogique en un flux binaire de bits que notre Pi peut gérer.

Ce morceau de silicium est appelé convertisseur analogique-numérique (ADC). Celui que j'aime s'appelle MCP3008, il possède 8 canaux 10 bits, ce qui signifie qu'on peut lire 8 valeurs de capteurs avec une résolution de 1024 chacun (2^10). Cela mappera notre tension d'entrée de 0 à 3,3 volts à un nombre entier compris entre 0 et 1023.

J'ai transformé le Pi en étiquettes jaunes éphémères pour simplifier le schéma

Pour parler à la puce, nous aurons besoin d'un package python appelé spidev. Pour plus d'informations sur le package et son fonctionnement avec le MCP3008, consultez cet excellent article de blog

Avec spidev installé et le circuit construit, exécutez le programme suivant pour lire les valeurs des capteurs en direct et les imprimer sur stdout.

import spidev import timespi =spidev.SpiDev()spi.open(0,0)def readadc(adcnum):sinon 0 <=adcnum <=7:return -1 r =spi.xfer2([1, ( 8+adcnum)<<4, 0]) adcout =((r[1] &3) <<8) + r[2] return adcoutwhile True :val =readadc(0) print val time.sleep(0.5) 

Les parties les plus importantes sont ces deux lignes :

r =spi.xfer2([1, (8+adcnum)<<4, 0])adcout =((r[1] &3) <<8) + r[2]

Ils envoient la commande de lecture et extraient les bits renvoyés pertinents. Voir l'article de blog que j'ai lié ci-dessus pour plus d'informations sur ce qui se passe ici.


Données de flux.

Pour diffuser des données sur le fil, nous utiliserons la bibliothèque de réseau ØMQ et implémenterons le modèle REQUEST/REPLY. ØMQ simplifie la configuration d'un client et d'un serveur en Python. Ce qui suit est un exemple de travail complet.

Serveur

import zmqcontext =zmq.Context()socket =context.socket( zmq.REP)socket.bind('tcp://*:1980') while True :message =socket.recv() print message socket.send ("Je suis là")

Client

import zmqcontext =zmq.Context()socket =context.socket( zmq.REQ)a ='tcp://192.168.1.6:1980'socket.connect(a)for request in range(10) :socket. envoyer('Vous êtes chez vous ?') message =socket.recv() imprimer le message

Nous pouvons maintenant utiliser traits et enaml pour créer une jolie interface utilisateur côté client. Consultez la démo acc_plot dans le référentiel github pour voir un exemple des données de streaming Pi sur le fil à tracer par un client.


Contrôler un servo

Les servos sont des moteurs (souvent petits) que vous pouvez entraîner dans certaines positions. Par exemple, pour un servo donné, vous pourrez peut-être régler l'arbre d'entraînement de 0 à 18o degrés, ou n'importe où entre les deux. Comme vous pouvez l'imaginer, cela pourrait être utile pour de nombreuses tâches, notamment la robotique.

La rotation de l'arbre est contrôlée par la modulation de largeur d'impulsion (PWM) dans laquelle vous encodez les informations pendant la durée d'une impulsion haute tension sur les broches GPIO. La plupart des servos de loisir suivent une signification de largeur d'impulsion standard. Une impulsion de 0,5 ms signifie aller à votre position minimale et une impulsion de 2,5 ms signifie aller à votre position maximale. Maintenant, répétez cette impulsion toutes les 20 ms et vous contrôlez un servo.

La largeur d'impulsion est beaucoup plus critique que la fréquence

Ce genre de timing n'est pas possible avec Python. En fait, ils ne sont pas vraiment possibles avec un système d'exploitation moderne. Une interruption peut survenir à tout moment dans votre code de contrôle, provoquant une impulsion plus longue que souhaitée et une gigue dans votre servo. Pour répondre aux exigences de synchronisation, nous devons entrer dans le monde amusant des modules du noyau. ServoBlaster est un module de noyau qui utilise les blocs de contrôle DMA pour contourner complètement le processeur. Une fois chargé, le module du noyau ouvre un fichier de périphérique à l'adresse /dev/servoblaster sur lesquelles vous pouvez écrire des commandes de position.

J'ai écrit un petit calque orienté objet autour de cela qui simplifie la commande d'asservissement. Vous pouvez trouver ma bibliothèque ici :

https://github.com/jminardi/RobotBrain

Connectez simplement le servo à 5v et à la terre sur votre Pi, puis connectez le fil de commande à la broche 4.

Le code python est assez simple :

import timeimport numpy as npfrom robot_brain.servo import Servoservo =Servo(0, min=60, max=200)for val in np.arange(0, 1, 0.05) :servo.set(val) time.sleep( 0.1)

Tout ce que vous avez à faire est d'instancier un servo et d'appeler son set() méthode avec une valeur à virgule flottante comprise entre 0 et 1. Consultez la démo servo_slider sur github pour voir le contrôle d'asservissement mis en œuvre sur le réseau.

Pour plus de détails :Contrôle du capteur et de l'actionneur Raspberry Pi


Processus de fabrication

  1. Communication MQTT entre NodeMCU et Raspberry Pi 3 B+
  2. Enregistreur de température Raspberry Pi
  3. Mesure des températures avec un capteur DS18B20 1 fil et Raspberry Pi
  4. Capteur de température Python et Raspberry Pi
  5. Station météo Raspberry Pi
  6. Capteur à ultrasons (HC-SR04) + Raspberry Pi
  7. Capteur de mouvement utilisant Raspberry Pi
  8. Capteur d'humidité du sol Raspberry Pi
  9. Capteur Hall numérique Raspberry Pi en JAVA