Home » BLOG

Utilisation d’un encodeur magnétique AS5048 avec la Raspberry Pi Pico

Un exemple d’utilisation d’un encodeur magnétique de référence AS5048 avec la carte Raspberry Pi Pico.

 

L’encodeur est relié en SPI au Pico via les pins :

  • GPIO4 => MISO
  • GPIO3 => MOSI
  • GPIO6 => SCK
  • GPIO5 => CS

Exemple de lecture

#include <SimpleFOC.h>
#include <SPI.h>

#define SPI_MISO 4
#define SPI_MOSI 3
#define SPI_SCK 6
#define SPI_CS 5

MagneticSensorSPI sensor = MagneticSensorSPI(SPI_CS, 14, 0x3FFF);

void setup()
{

SPI.setCS(SPI_CS);
SPI.setSCK(SPI_SCK);
SPI.setRX(SPI_MISO);
SPI.setTX(SPI_MOSI);

SPI.begin();

// initialise magnetic sensor hardware
sensor.init();
}


void loop()
{

sensor.update();

// display the angle and the angular velocity to the terminal
Serial.print(sensor.getAngle());
Serial.print("\t");
Serial.println(sensor.getVelocity());

delay(1000);
}

FIN !

Apprendre le microPython avec la carte Raspberry Pi Pico

 

Ce tutoriel a pour objectif d’apprendre la programmation en langage microPython en utilisant la carte Raspberry Pi Pico. Cette carte est équipé d’un microcontrôleur RP2040. Le langage microPython est le portage du langage Python adapté aux microcontrôleurs.

Matériels & Logiciel nécessaire

  • Une carte Raspberry Pi Pico
  • Une câble micro-usb
  • Un PC avec le logiciel Thonny (thonny.org)

Présentation de la carte Raspberry Pi Pico

Voici le pinout de la carte Pico :

Le microcontrôleur RP2040

Voici l’architecture du microcontrôleur RP2040 :

  • 2 cœur ARM Cortex M0+ à 48 Mhz (32 bits)
  • 264 KB RAM
  • 2MB de mémoire flash
  • 26 GPIO, PWM, SPI, I2C, UART
  • USB 1.1

Installation du logiciel IDE Thonny

Voir la page : thonny.org

Premier programme, Hello avec le shell

Un premier exemple très simple d’affichage de texte avec la fonction print() :

Gestion d’une led avec le shell

Un exemple de programmer pour allumer une led.

  • La led est connecté sur la pin n°2 (GP2)

Vous pouvez essayer de taper ces lignes de code dans le shell :

Et la lumière fut, allumer et éteindre une led !

Un exemple très simple de programme pour allumer une led :

  • La led doit être connectée sur la GPIO n°2
from machine import Pin
led = Pin(2, Pin.OUT) # configuration de la pin 2 en sortie
led.value(1) # mise à l'état haut de la pin 2, la led s'allume !

Un exemple simple de programme pour allumer une led pendant 2 secondes et ensuite l’éteindre :

from machine import Pin
import time

led = Pin(2, Pin.OUT) # configuration de la pin 2 en sortie

while True: # boucle infini
  led.value(1)
  time.sleep(2) # pause de 2 secondes
  led.value(0)
  time.sleep(1) # pause de 1 seconde

Un autre exemple avec l’utilisation de la fonction toggle():

  • La led va clignoter toutes les 2 secondes
from machine import Pin
import time

led = Pin(2, Pin.OUT)

while True:
  led.toggle()
  time.sleep(2)

Utilisation du shell, print

Utilisation de la fonction print() pour afficher du texte dans le shell :

from machine import Pin
import time

print("Hello Raspberry Pi Pico ! ")

Le résultat dans le shell :

Gestion d’un bouton poussoir

Un exemple pour lire le manière continue l’état d’un bouton poussoir connecter sur la pin 3 de la carte Raspberry Pi Pico :

from machine import Pin, ADC, PWM
import time

bouton = Pin(3, Pin.IN, Pin.PULL_UP) # configuration pin 3 en entrée

while True:
  valeur = bouton.value() #Lecture de l'état du bouton
  print(valeur)
  time.sleep(1)

Résultat sur le shell de l’appuie sur le bouton poussoir, passage de l’état haut à l’état bas :

  • Bouton non appuyé : état haut (1)
  • Bouton appuyé : état haut (0)

Un autre exemple pour gérer l’allumage de la led avec le bouton :

from machine import Pin, ADC, PWM
import time

led = Pin(2, Pin.OUT)
bouton = Pin(3, Pin.IN, Pin.PULL_UP)

while True:
  valeur = bouton.value()

  if valeur == 1:
    led.value(1)
    print("Bouton OFF")
  else:
    print("Bouton ON") 
    led.value(0)
time.sleep(0.5)

Gestion d’une entrée analogique

Un exemple pour lire une entrée analogique :


from machine import Pin, ADC
import time

adc = ADC(Pin(26)) # configuration pin 26 en entrée analogique

while 1:
  print("Valeur adc = ", adc.read_u16())
  time.sleep(0.2)

Le résultat de la lecture de l’entrée analogique avec le Plotter :

Écriture/lecture d’un fichier texte

Un exemple très simple d’écriture dans un  fichier :

import time

file = open("test.txt", "w") # Ouverture du fichier texte.txt en mode ecriture

file.write("Ecriture dans le fichier") # ecriture dans le fichier

file.close() # fermeture du fichier

Écriture en boucle d’une variable :

  • str() : permet de convertir en chaine de caractère
  • ‘\n’ : permet le saut d’une ligne
import time

file = open("test.txt", "w")

compteur = 0

while compteur &lt; 10:
  file.write("Bonjour, compteur = ")
  file.write(str(compteur) + "\n")
  print(compteur)
  compteur+=1

file.close()

Gestion d’un signal PWM

  • PWM : Pulse With Modulation ou modulation de la largeur d’impulsion

C’est quoi un signal PWM ?

This file is licensed under the Creative Commons Attribution-Share Alike 4.0 International license. (https://en.wikipedia.org/wiki/Pulse-width_modulation)

Un exemple sur la pin 4, d’un signal PWM. Ce signal PWM permet par exemple de contrôler l’intensité lumineuse d’une led ou encore la commande en vitesse d’un moteur à courant continu.

from machine import Pin, ADC, PWM
import time

signal = Pin(4, mode=Pin.OUT)
signal = PWM(Pin(4))

signal.freq(500) # fréquence de 500 Hz
signal.duty_u16(32000) # rapport cyclique

Un autre exemple de génération d’un signal PWM :

from machine import Pin, ADC, PWM
import time

signal = Pin(4, mode=Pin.OUT)
signal = PWM(Pin(4))

signal.freq(500)

for rapport in range(0,65_536):
  signal.duty_u16(rapport)
  print(rapport)
  time.sleep(0.001)

Contrôle d’un servomoteur

Maintenant, passons au contrôle d’un servomoteur en microPython.

Connexion du servomoteur :

  • Fil rouge : +5V
  • Fil noir : GND
  • Fil orange : GPIO 4

Un exemple de programme pour le contrôle d’un servomoteur :

  • Configuration de la GPIO 4 en signal PWM
  • Pour le contrôle d’un servomoteur la fréquence doit être de 50 Hz
  • Le contrôle angulaire d’un servomoteur varie en fonction du rapport cyclique (entre 1 et 2 ms environ, dépends du type de servomoteurs)
from machine import Pin, PWM
import time

servo = Pin(4, mode=Pin.OUT)
servo = PWM(Pin(4))

servo.freq(50)

while True:
  servo.duty_u16(2314)
  time.sleep(2)
  servo.duty_u16(7600)
  time.sleep(2)

Allumer une led avec un timer !

Un exemple d’utilisation d’un timer pour faire clignoter la led interne de la carte Raspberry Pi PICO toutes les secondes :

from machine import Pin, Timer

led = Pin("LED", Pin.OUT)

timer_led = Timer()

def mon_timer_led(timer):
  global led
  led.toggle()

timer_led.init(freq=1, mode=Timer.PERIODIC, callback=mon_timer_led)

Interruption matérielle avec un bouton poussoir

Un exemple de programme pour gérer l’appui d’un bouton poussoir avec une interruption matérielle (IRQ). Une interruption matérielle est déclenchée par une entrée (GPIO) du microcontrôleur. Dans cet exemple, l’entrée 3 est configurée en interruption.

from machine import Pin
import time

def mon_interruption(pin):
print("Bouton ON")


bouton = Pin(3, Pin.IN, Pin.PULL_UP) # configuration du bouton sur l'entée 3

bouton.irq(trigger=Pin.IRQ_FALLING,handler=mon_interruption)

# boucle infini
while True:
  print("Boucle infini, attendre ...") # attendre l'appuie sur le bouton
  time.sleep(1)

Programmation multicore

Le microcontrôleur RP2040 possédé 2 cœurs de processeur (ARM Cortex M0+)  de 133 Mhz:

  • Core0
  • Core1
from time import sleep
import _thread


def core0_thread():
  compteur= 0
  while True:
    print("Hello, Je suis le core0 : ", compteur)
    compteur+= 1
    sleep(1)


def core1_thread():
  compteur= 1
  while True:
    print("Hello, Je suis le core1 : ", compteur)
    compteur+= 1
    sleep(3)


thread_core1 = _thread.start_new_thread(core1_thread, ())

core0_thread()

 

Fin du Tuto !

LTspice – générateur de bruit

Un tutoriel pour générer un signal du bruit avec le logiciel LTspice.

  • Sélectionner le composant : bv (Arbitrary behavioral voltage source)

  • Relier le GND
  • Ajouter une fonction de bruit comme par exemple (clic droit) : V= white(2e7*time)

Fin du petit tuto !

Merci !

 

Gestion des déplacements du robot MR-Pico

Déplacements simple…

Un programme simple en microPython pour faire avancer, reculer et tourner le robot MR-Pico :

import time
import robot

# avancer le robot avec une vitesse de 20%
robot.forward(20)
time.sleep(2)

# reculer le robot avec une vitesse de 30%
robot.back(30)
time.sleep(3)

# tourner à droite avec une vitesse de 30%
robot.turnRight(30)
time.sleep(4)

# tourner à droite avec une vitesse de 30%
robot.turnLeft(30)

# avancer le robot avec une vitesse de 50%
robot.forward(50)

Déplacements avec contrôle en position

Un autre exemple, pour faire avancer le robot de 150 mm puis de 100 mm en ligne droite :

import time
import robot

robot.forwardmm(150,20) # avancer de 150 mm avec une vitesse de 20%
time.sleep(2)
robot.forwardmm(100,25) # avancer de 100 mm avec une vitesse de 25%

 

Maintenant dans l’autre sens, un autre exemple pour faire reculer le robot :

import time
import robot

robot.forwardmm(-300,20) # reculer le 300 mm

 

Exemple, pour faire tourner le robot de 90° vers la droite :

import time
import robot


robot.forwardmm(150,20) # Avancer de 150 mm

time.sleep(2)

robot.turnAngle(90,25) # Tourner à droite de 90°

time.sleep(2)

robot.turnAngle(-90,25) # Tourner à gauche de 90°

Raspberry Pico – Interruption timer répéter en C/C++

Exemple d’un programme en langage C/C++ d’ une minuterie répétitive appelée à plusieurs reprises à l’intervalle spécifié en millisecondes :

#include <stdio.h>

#include "pico/stdlib.h"

static uint compteur = 0;

// Interruption
bool repeating_timer_callback(struct repeating_timer *t)
{

  printf("Compteur IRQ timer %d\n", compteur);

  compteur = compteur + 1;

  return true;

}// Fin interruption


int main()
{
struct repeating_timer timer;

  stdio_init_all();
 
  // ajouter minuterie toute les 2000 microsecondes
  add_repeating_timer_ms(2000, repeating_timer_callback, NULL, &timer);

  // boucle infini
  while(1)
  {
     printf("wait irq ...\n");

     sleep_ms(1000);// attendre 1 seconde
  }

  return 0;

}

Résultat sous Putty :