Le projet

Nous utiliserons les composant suivants :

  • Une carte Shield Grove pour Pi Pico
  • Un Pi Pico avec son câble USB-MicroUSB
  • un bouton du système Grove
  • une support de Led du système Grove et sa Led
  • un servomoteur Geekservo
  • un câble avec pin femelle du système Grove
  • quelques jumpers mâle-mâle.

composant grove

Le shield Grove en détail

Vous trouverez toutes les informations de ce shield à cet adresse : https://wiki.seeedstudio.com/Grove-Starter-Kit-for-Raspberry-Pi-Pico/. Par contre, il manque certaines informations utiles si vous réaliser vos propres composants grove. Le schéma ci-dessous comblera cette lacune indiquant les Pin utilisés par ces connecteurs.

shield grove pico

Le switch d'alimentation vous permet de sélectionner les deux tensions disponibles 3v3 ou 5v. Pour notre cas, nous positionnerons le switch à 5v, cela concernera les connecteurs suivants : I2C1, I2C2, UART0, UART1, D16, D18 et D20.

Le montage

Le montage est très simple. Il faudra connecter le bouton grove au connecteur D16 et la Led grove au connecteur D20. Pour le servomoteur, il faudra utiliser un câble grove avec des jumpers femelles. Pour le connecter au servomoteur, nous utiliserons des jumpers mâle-mâle. Voir l'image ci-dessous :

cable servomoteur

Pour informations

tableau connecteur

Le code

Nous prendrons le code de l'article précédent Le servo-moteur GeekServo avec un Raspberry Pi Pico en l'améliorant.

Premièrement, nous utiliserons une Led qui sera éteint lors du déclenchement du scénario puis s'allumera quand le scénario est terminé.

Deuxièmement, nous utiliserons la librairie random  (générateur de nombre aléatoire) pour modifier aléatoirement les mouvements des soldats médiévaux.

import machine #importe la librairie du Pi Pico
import utime   #importe la librairie mesurant le temps
import random  #importe la librairie générant des nombres pseudo-aléatoires	
from servo import Servo #importe la librairie gérant les servomoteurs

#initialisation de l'objet my_servo en l'attachant au GP28
#connecteur grove D18
my_servo = Servo(pin=18)

#initialisation de l'objet button en l'attachant au GP16
#connecteur grove D16
button = machine.Pin(16, machine.Pin.IN, machine.Pin.PULL_DOWN)

#initialisation de l'objet led en l'attachant au GP20
#connecteur grove D20
led_external = machine.Pin(20, machine.Pin.OUT)

#Allumage de la led
led_external.value(1)

#boucle principale
while True:
    if button.value() == 1:
        # si le bouton est appuyé on éteint la led
        led_external.value(0)
        # on lance une boucle (20 fois)
        for i in range(20):
            #on génère un nombre aléatoire entre 1 et 3
            duty = random.randint(1, 3)
            #en fonction du résultat on exécute un mouvement
            if duty == 1:
                #déplacement du servomoteur vers la droite 45°
                my_servo.move(45)
                #délai de deux dixièmes de seconde
                utime.sleep(0.2)
                #déplacement du servomoteur vers la gauche 9°
                my_servo.move(9)
                #délai de deux dixièmes de seconde
                utime.sleep(0.2)
                #déplacement du servomoteur vers la droite 30°
                my_servo.move(30)
                #délai de deux dixièmes de seconde
                utime.sleep(0.2)
                #déplacement du servomoteur vers la gauche 9°
                my_servo.move(9)
                #délai de deux dixièmes de seconde
                utime.sleep(0.2)
            elif duty == 2:
                #déplacement du servomoteur vers la droite 45°
                my_servo.move(45)
                #délai d'une demi-seconde
                utime.sleep(0.5)
                #déplacement du servomoteur vers la gauche 9°
                my_servo.move(9)
                #délai d'une demi-seconde
                utime.sleep(0.5)
            elif duty == 3:
                #déplacement pas à pas de 9° vers 45°
                for j in range(9,45):
                    my_servo.move(j)
                    utime.sleep(0.015)
                #déplacement pas à pas de 45° vers 9°
                for j in range(45,9,-1):
                    my_servo.move(j)
                    utime.sleep(0.004)
                #délai d'une demi-seconde
                utime.sleep(0.5)
        else:
            #on allume la led
            led_external.value(1)

 Et voici une petite démo

Petite astuce, j'utilise des supports Grove Wrapper 1 x 1 compatible Lego pour le bouton et la led. Ces supports sont disponible chez Gotronic par exemple.