[ev3dev × Python] Capteur à ultrasons

Cet article s'adresse à tous ceux qui souhaitent travailler avec ev3 en Python. Cette fois, je souhaite effectuer diverses opérations à l'aide du capteur à ultrasons.

table des matières

  1. Quoi préparer
  2. Programme de capteur à ultrasons

0. Quoi préparer

◯ ev3 (réservoir) et capteur à ultrasons ◯ PC (code VS) ◯ bluetooth ◯ microSD ◯ Material (Il est recommandé de continuer en regardant ceci.)

1. Programme du capteur à ultrasons (Document p.35)

1-0. Un programme qui compare la distance aux obstacles et le seuil

ultrasonicsensor00.py


#!/usr/bin/env python3

#Importez uniquement ce dont vous avez besoin à partir du module
ev3dev2.sensor.lego import UltrasonicSensor
from ev3dev2.motor import MoveSteering,OUTPUT_A,OUTPUT_B,SpeedPercent

#Génération d'instance
us = UltrasonicSensor()
steering_drive = MoveSteering(OUTPUT_A,OUTPUT_B)

#Boucle exécutée alors que la valeur du capteur à ultrasons est supérieure à 30
while us.distance_centimeters > 30:
    steering_drive.on(0,SpeedPercent(75))
#Arrêter quand la boucle se termine
steering_drive.stop()
#Quitter le programme
exit()

** Point **: Un programme qui va droit alors que la distance à l'obstacle est supérieure à 30 cm

** Point **: article de référence sur les seuils Quel est le seuil

Point : distance_centimeters Variable qui stocke la valeur du capteur à ultrasons

1-1. Un programme qui affiche la distance à un objet

ultrasonicsensor01.py


#Importez uniquement ce dont vous avez besoin à partir du module
#!/usr/bin/env python3
from ev3dev2.display import Display
ev3dev2.sensor.lego import UltrasonicSensor
from time import sleep

#Génération d'instance
dsp = Display()
us = UltrasonicSensor()

#boucle infinie
while True:
    dsp.update()
    #round()Arrondissez avec
    distance = round(us.distance_centimeters)
    dsp.text_pixels(str(distance) + 'cm',True,0,52,font = 'helvB' + '24')
    sleep(0.1)

** Point **: Un programme qui continue d'afficher la valeur du capteur à ultrasons

1-2. Programme de commutation manuel et automatique

ultrasonicsensor02.py


#!/usr/bin/env python3
#Importez uniquement ce dont vous avez besoin à partir du module
from ev3dev2.motor import OUTPUT_A,OUTPUT_B,MoveTank
from ev3dev2.sensor.lego import TouchSensor,UltrasonicSensor
from ev3dev2.sensor import INPUT_1,INPUT_2,INPUT_3

#Génération d'instance
tank_drive = MoveTank(OUTPUT_A,OUTPUT_B)
us = UltrasonicSensor(INPUT_3)
ts_1 = TouchSensor(INPUT_1)
ts_2 = TouchSensor(INPUT_2)

#boucle infinie
while True:
    #Boucle à exécuter lorsque la valeur du capteur à ultrasons est supérieure à 20
    while us.distance_centimeters > 20:
        #ts_1 a été pressé
        if ts_1.is_pressed:
            #ts_1 a été pressé et ts_2 a été pressé
            if ts_2.is_pressed:
                tank_drive.on(100,100)
            #ts_1 a été pressé et ts_2 n'est pas enfoncé
            else:
                tank_drive.on(40,100)
        #ts_1 n'est pas enfoncé
        else:
            #ts_1 n'est pas enfoncé et ts_2 a été pressé
            if ts_2.is_pressed:
                tank_drive.on(100,40)
            #ts_1 n'est pas enfoncé et ts_2 n'est pas enfoncé
            else:
                tank_drive.stop()
    #Boucle à exécuter lorsque la valeur du capteur à ultrasons est supérieure à 20
    while us.distance_centimeters < 30:
        tank_drive.on(-80,-80)

Point : Lorsqu'il n'y a pas d'obstacles à moins de 20 cm, vous pouvez utiliser manuellement le contrôleur radio. Cependant, si l'obstacle est à moins de 20 cm, le programme s'échappera automatiquement vers l'arrière jusqu'à ce que la distance à l'obstacle soit supérieure à 30 cm pour éviter une urgence.

** Point **: Ce mécanisme (même contenu) par rapport à scratch ↓ スクリーンショット 2020-06-19 16.59.25.png

** Point **: ** Répéter jusqu'à ** et ** Répéter entre **

** Répéter jusqu'à **: Répéter jusqu'à ce que la condition ne soit plus vraie ** Répéter pendant ~ **: Répéter tant que la condition est vraie

1-3. Programme de traitement parallèle

ultrasonicsensor03.py


#!/usr/bin/env python3

#Importez uniquement ce dont vous avez besoin à partir du module
from ev3dev2.motor import OUTPUT_A,OUTPUT_B,MoveTank
from ev3dev2.display import Display
from ev3dev2.sensor.lego import UltrasonicSensor
from time import sleep
from threading import Thread

#Génération d'instance
tank_drive = MoveTank(OUTPUT_A,OUTPUT_B)
dsp = Display()
us = UltrasonicSensor()

#distance_display()Définition de la fonction
def distance_display():
    #loop =Répéter tant que vrai
    while loop:
        dsp.update()
        distance = us.distance_centimeters
        dsp.text_pixels(str(distance) + 'cm',True,0,52,font = 'helvB' + '24')
        sleep(0.1)
#Assignez True à la boucle pour la rendre bouclable
loop = True
#Créer une instance t de la classe Thread
t = Thread(target = distance_display)
#Démarrer un fil
t.start()

#Répéter 10 fois
for i in range(10):
    #Répétez tant que la valeur du capteur à ultrasons est supérieure à 30
    while us.distance_centimeters > 30:
        tank_drive.on(10,10)
    tank_drive.stop()
    #Répétez tant que la valeur du capteur à ultrasons est inférieure à 50
    while us.distance_centimeters < 50:
        tank_drive.on(5,-5)
tank_drive.stop()
#Assignez False à la boucle pour arrêter le thread
loop = False

Point : S'il n'y a pas d'obstacles à moins de 30 cm, allez tout droit. Cependant, si l'obstacle est à moins de 30 cm, un programme comme Rumba tourne jusqu'à ce que la distance à l'obstacle soit supérieure à 50 cm. Ensuite, la distance à l'obstacle est affichée en même temps que la course.

** Point **: article de référence sur le traitement parallèle Multithreading

1-4. Programme de traitement parallèle

main.py


#!/usr/bin/env python3

#Importez uniquement ce dont vous avez besoin à partir du module
from ev3dev2.motor import OUTPUT_A,OUTPUT_B,MoveTank
from ev3dev2.sensor.lego import UltrasonicSensor
import subprocess

#Génération d'instance
tank_drive = MoveTank(OUTPUT_A,OUTPUT_B)
us = UltrasonicSensor()

#Démarrer un programme enfant dans un nouveau processus
subprocess.Popen(['python3','sub.py'])

#Répéter 10 fois
for i in range(10):
    while us.distance_centimeters > 30:
        tank_drive.on(10,10)
    tank_drive.stop()
    while us.distance_centimeters < 50:
        tank_drive.on(5,-5)
tank_drive.stop()
#Créer une instance de la classe Popen
proc = subprocess.Popen(['python3','sub.py'])
#Terminer le programme enfant
proc.kill()
exit()

sub.py


from ev3dev2.sensor.lego import UltrasonicSensor
from ev3dev2.display import Display
from time import sleep

dsp = Display()
us = UltrasonicSensor()

while True:
    dsp.update()
    distance = round(us.distance_centimeters)
    dsp.text_pixels(str(distance) + 'cm',True,0,52,font = 'helvB' + '24')
    sleep(0.5)
exit()

** Point **: Comment appeler sub.py depuis main.py pour un traitement parallèle. (Le traitement est lourd)

** Point **: article de référence sur le traitement parallèle Introduction à la programmation de traitement parallèle en Python

finalement

Merci pour la lecture! !! La prochaine fois, j'aimerais écrire sur le capteur gyroscopique!

Je veux faire un meilleur article ◯ C'est plus facile à comprendre ◯ C'est difficile à comprendre ◯ C'est faux ◯ Je veux que vous expliquiez plus ici Nous apprécions vos opinions et suggestions.

Recommended Posts

[ev3dev × Python] Capteur à ultrasons
[ev3dev × Python] Capteur tactile
[ev3dev × Python] Capteur gyroscopique
[ev3dev × Python] Capteur de couleur
[ev3dev × Python] Bouton de blocage intelligent
[ev3dev × Python] Construction de l'environnement de développement ev3dev
[ev3dev × Python] Commande de moteur unique
[ev3dev × Python] Contrôle de plusieurs moteurs
Python
[ev3dev × Python] Affichage, voix, contrôle LED
Récupérer les frappes de / dev / input (python evdev)
[ev3dev × Python] Contrôle SSH (opération à distance avec clavier)