Accueil > NodeMCU > Pan / Tilt piloté par protocole UDP en Micropython

Pan / Tilt piloté par protocole UDP en Micropython

Il y a bien longtemps, j’avais commandé un système Pan/tilt équipés de servos SG90 afin de tester l’utilisation avec un Arduino. D’ailleur vous pouvez regarder l’article que j’avais écrit à l’époque : https://itechnofrance.wordpress.com/2013/05/24/utilisation-dun-pantilt-laide-dun-joystick/

Aujourd’hui je me suis lancé dans l’utilisation de celui-ci mais piloté par le réseau. Pour la partie pilotage je vais utiliser ma plateforme de test à base de Nodemcu Lolin équipé d’un Gyroscope / Accéléromètre MPU6050 :
 

Concernant l’utilisation du MPU6050, j’ai écrit une librairie en Micropython que vous pouvez voir l’utilisation dans cet article : https://itechnofrance.wordpress.com/2018/02/15/utilisation-du-capteur-mpu6050-en-micropython/
La partie émission va effectuer les actions suivantes :
– Création d’un point d’accès Wifi.
– Initialisation de la gestion du MPU6050.
– Affichage du comportement du capteur MPU6050 sur l’écran OLED SSD1306.
– Création d’une communication réseau en utilisant le protocole UDP.
La partie réception et pilotage du Pan / Tilt sera confié à un Wemos D1 Mini avec le schéma de câblage suivant :
Une photo présente le montage :
Celui-ci effectuera les actions suivantes :
– Connexion au point d’accès du Nodemcu
– Pilotage des 2 servos SG90.
– Configuration réseau pour utiliser le protocole UDP et traiter les requêtes envoyées par le Nodemcu.
Pour la partie émission le programme sera le suivant :
#
# Programme d’utilisation de la librairie MPU6050
# Telecommande de la tourelle en utilisant le protocole UDP
#
# Auteur : iTechnoFrance
#
from machine import I2C, Pin
import ssd1306, time, network, socket, mpu6050
def config_wifi():
    ap = network.WLAN(network.AP_IF)  # creation point d’acces WiFi
    ap.active(True)  # activation du point d’acces
    ap.config(essid=’ROBOTIQUE’, channel=11, hidden=True, password=’password’)
    ip = ap.ifconfig()[0]
    return ip
def dessine_tourelle(sens_fleche):
    oled.fill(0)
    oled.rect(50, 0, 20, 44, 1)
    oled.rect(57, 10, 5, 24, 1)
    oled.rect(20, 44, 80, 20, 1)
    oled.rect(40, 52, 40, 5, 1)
    if ((sens_fleche & 0x01) == 0x01):  # fleche bas
        oled.line(52, 34, 67, 34, 1)
        oled.line(52, 34, 59, 39, 1)
        oled.line(59, 39, 67, 34, 1)
    if ((sens_fleche & 0x02) == 0x02):  # fleche haut
        oled.line(52, 10, 67, 10, 1)
        oled.line(52, 10, 59, 5, 1)
        oled.line(59, 5, 67, 10, 1)
    if ((sens_fleche & 0x04) == 0x04):  # fleche gauche
        oled.line(40, 47, 40, 60, 1)
        oled.line(40, 47, 33, 53, 1)
        oled.line(33, 53, 40, 60, 1)
    if ((sens_fleche & 0x08) == 0x08):  # fleche droite
        oled.line(80, 47, 80, 60, 1)
        oled.line(80, 47, 87, 53, 1)
        oled.line(87, 53, 80, 60, 1)
    oled.show()
def communication(commande):
    com_net.sendto(commande, ((‘192.168.4.2’, 18000)))  # envoi la commande au recepteur sur le port 18000
# Declaration I2C
# // D1 -> GPIO05 –> SDA
# // D2 -> GPIO04 –> SCL
i2c = I2C(scl=Pin(4), sda=Pin(5), freq=400000)
# Declaration OLED SSD1306
oled = ssd1306.SSD1306_I2C(128, 64, i2c, 0x3c)  # 128 x 64 pixels
oled.fill(0)  # efface l’ecran
oled.text(« Calibration du », 0, 0)
oled.text(« Gyro. / Accel. », 0, 10)
oled.text(« MPU6050 », 35, 20)
oled.show()
mpu_6050 = mpu6050.MPU6050(i2c)  # declaration mpu6050
oled.fill(0)
ip = config_wifi()
fleche = 0x00
com_net = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)  # initialise un socket UDP
if (mpu_6050.detect()):
    while True:
        mpu_6050.lecture_capteurs()
        if (mpu_6050.AngleX > 10):  # gauche
            fleche |= 0x04
            communication(b’g’)
        if (mpu_6050.AngleX < -10):  # droite
            fleche |= 0x08
            communication(b’d’)
        if (mpu_6050.AngleY < -10):  # haut
            fleche |= 0x02
            communication(b’h’)
        if (mpu_6050.AngleY > 10):  # bas
            fleche |= 0x01
            communication(b’b’)
        if (mpu_6050.AngleX < 10) and (mpu_6050.AngleX > -10):
            fleche &= 0x03
        if (mpu_6050.AngleY < 10) and (mpu_6050.AngleY > -10):
            fleche &= 0x0C
        dessine_tourelle(fleche)
else:
    oled.fill(0)  # efface l’ecran
    oled.text(« MPU not detected », 0, 0)
    oled.show()
Pour la partie réception, le programme sera le suivant :
#
# Programme de gestion de la tourelle pilote par le protocole UDP
#
# Auteur : iTechnoFrance
#
from machine import Pin, PWM
import time, network, socket
def config_wifi():
    sta = network.WLAN(network.STA_IF)  # creation client d’acces WiFi
    sta.active(True)  # activation du client d’acces WiFi
    sta.connect(‘ROBOTIQUE’, ‘password’)  # connexion au point d’acces WiFi
    while(sta.isconnected() == False):
        time.sleep(1)
    ip = sta.ifconfig()[0]
    return ip
def communication(pan, tilt):
    pan = pan
    tilt = tilt
    while True:
        reception = com_net.recvfrom(1024)  # receptionne les packets UDP
        if reception[0] == b’g’:  # commande gauche
            if pan > 30:
                pan -= 2
        if reception[0] == b’d’:  # commande droite
            if pan < 100:
                pan += 2
        if reception[0] == b’h’:  # commande haut
            if tilt > 30:
                tilt -= 2
        if reception[0] == b’b’:  # commande bas
            if tilt < 90:
                tilt += 2
        pan_tilt(pan, tilt)
        time.sleep(0.05)
def pan_tilt(pan, tilt):
    servo_pan.duty(pan)  # positionne le servo PAN
    servo_tilt.duty(tilt)  # positionne le servo TILT
ip = config_wifi()
com_net = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)  # initialise un socket UDP
com_net.bind((ip, 18000))  # UDP port 18000
pan = 70
tilt = 70
servo_pan = PWM(Pin(12), freq=50, duty=pan)  # sortie D6 Wemos D1 mini
servo_tilt = PWM(Pin(14), freq=50, duty=tilt)  # sortie D5 Wemos D1 mini
communication(pan, tilt)
Attention pour l’utilisation des servos, en théorie nous pouvons fournir une valeur entre 0 et 180. Mais il est nécessaire d’effectuer une calibration pour ne pas tomber en butée sur les servos.
Vous pouvez voir le montage en action à l’adresse suivante : https://www.youtube.com/watch?v=Tyn5W-fX3r0
Catégories :NodeMCU Étiquettes : , , , , ,
  1. Aucun commentaire pour l’instant.
  1. No trackbacks yet.

Votre commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l’aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google

Vous commentez à l’aide de votre compte Google. Déconnexion /  Changer )

Image Twitter

Vous commentez à l’aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l’aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s

%d blogueurs aiment cette page :