[EV3 MicroPython] Mesure de distance avec capteur DIST-ToF (et communication I2C)

DIST-ToF

De mindsensors, qui fabrique et vend les produits tiers de LEGO, le capteur de distance ToF (DIST-ToF / ev3-and-nxt / 210-high-precision-time-of-flight-to-distance-sensor-for-nxt-or-ev3)) est en vente.

ToF est une abréviation de "Time of Flight" et est une technologie qui mesure la distance entre le temps nécessaire à la lumière (infrarouge) pour rebondir [^ 1]. La technologie ToF a permis de mesurer la position d'un objet de manière précise et précise.

La plupart des capteurs vendus par mindsensors sont supportés par ev3dev, qui est la base d'EV3 MicroPython [^ 2]. Et les capteurs supportés par ev3dev peuvent être facilement contrôlés par la classe ʻEv3devSensor du module ʻiodevices de EV3MicoroPythoh (pybricks2.0).

Cependant, ce capteur DIST-ToF ne prend pas en charge ev3dev (la commande n'est pas implémentée). Cependant, ce capteur peut être contrôlé par communication I2C.

Par conséquent, cette fois, je vais vous présenter comment gérer la communication I2C directement avec EV3 MicroPython. Ensuite, nous rendrons possible la manipulation du capteur DIST-ToF avec Ev3 MicroPython.

Communication I2C

I2C est un bus série (un type de communication série) développé par Phillips (actuellement NXP), qui utilise deux lignes, une ligne de données série (SDA) et une ligne d'horloge série (SCL), pour communiquer entre les appareils. C'est une méthode à faire. Puisqu'il peut communiquer avec plusieurs appareils avec un petit nombre, il est utilisé dans les appareils embarqués et les téléphones mobiles.

La raison pour laquelle la communication entre «plusieurs appareils» est possible avec deux lignes est que l'adresse est définie pour chaque appareil [^ 4].

De plus, la communication I2C utilise la méthode maître-esclave [^ 3]. Dans ce cas, EV3 est le maître et DIST-ToF est l'esclave.

Dans EV3MicroPython (Pybricks2.0), la classe ʻI2CDevice est fournie dans le module ʻiodevices comme une classe qui gère la communication I2C. ʻPour les spécifications de la classe I2CDevice`, cliquez ici [file: ///Users/asahi/.vscode/extensions/lego-education.ev3-micropython-2.0.0/resources/docs/iodevices.html#i2c-device )Prière de se référer à.

Communication I2C avec EV3MicoPython

Le code source suivant est un exemple d'implémentation d'un programme qui acquiert la valeur de capteur de DIST-TOF en utilisant la classe ʻI2CDevice` dans EV3MicroPython. La valeur acquise est affichée sur l'écran LCD de EV3. Le programme implémenté est basé sur le code de GitHub publié pour RobotC.

ms-dist-tof.py


#!/usr/bin/env pybricks-micropython
from pybricks.hubs import EV3Brick
from pybricks.parameters import Port
from pybricks.tools import wait
from pybricks.media.ev3dev import Font
from pybricks.iodevices import I2CDevice

# Write your program here
ev3 = EV3Brick()
ev3.speaker.beep()
font = Font(size=20)

dist = I2CDevice(Port.S4, 0x02 >> 1)

def get_ms_dist(dist):
    data = dist.read(0x42, length=2)
    return (0xFF & data[0]) + ((0xFF & data[1]) << 8)

ev3.screen.set_font(font)
while True:
    ev3.screen.clear()
    ev3.screen.print("DIST :", get_ms_dist(dist))
    wait(100)

Tout d'abord, créez une instance dist (objet de classe) à partir de la classe ʻI2CDevice(ligne 14). Dans l'argument du constructeur, entrez le port pour connecter le capteur (classePort`) et l'adresse du capteur (nombre hexa).

Ici, l'adresse (par défaut) de DIST-ToF est «0x02». Cependant, veillez à saisir l'adresse décalée vers la droite de 1 bit [^ 4].

La fonction get_ms_dist (lignes 16-18) effectue le traitement suivant.

  1. Passez un objet de classe de la classe ʻI2CDevice comme argument (en supposant une instance dist`).
  2. Appelez la fonction read de la classe ʻI2CDevice` pour obtenir la valeur du capteur.
  1. Ajoutez 2 octets de données pour créer une donnée. Ceci est renvoyé sous forme de données de distance.

Il semble que ce sera un programme plus intelligent pour préparer une classe pour DIST-ToF et implémenter la fonction get_dist dans la classe.

Comme mentionné ci-dessus, DIST-ToF utilise I2C comme méthode de communication, donc en le combinant avec d'autres capteurs avec des adresses différentes, il est possible de contrôler plusieurs capteurs avec un port d'EV3.

[^ 1]: Récemment, il est devenu possible d'incorporer un circuit qui effectue une telle mesure au niveau de l'élément du capteur, et il est souvent appelé ToF y compris.

[^ 2]: Pour les capteurs pris en charge par ev3dev (y compris ceux fabriqués par des tiers), ici Voir /sensors.html).

[^ 3]: Méthode maître-esclave: Lorsque plusieurs appareils fonctionnent en coopération, une machine «maître» qui contrôle et exploite plusieurs appareils et un «esclave» qui fonctionne sous le contrôle unilatéral de la machine maître. C'est une méthode de partage des rôles entre les machines (bien que ce nom ait récemment posé problème ...).

[^ 4]: pensez à une "adresse e-mail". De nombreux appareils sont connectés à Internet dans le monde entier, mais le courrier ne peut être envoyé qu'à l'adresse électronique (serveur) définie comme destination.

[^ 5]: Dans la communication I2C, parmi les données 8 bits, les 7 bits supérieurs sont "l'adresse esclave" et le bit inférieur est le "bit de désignation d'émission / réception". Comme la seule information requise ici est "l'adresse esclave", entrez la valeur sans le bit inférieur.

Recommended Posts

[EV3 MicroPython] Mesure de distance avec capteur DIST-ToF (et communication I2C)
Capteur à ultrasons SRF02 piloté par pyton utilisant i2c