Chargement...

Article

Tracé en temps réel avec Arduino et Python : application au circuit RC

 Chargement de l'article en cours ...

Avec l’élan donné par les nouveaux programmes du lycée, l’utilisation de microcontrôleurs en Physique-Chimie permet une ouverture sur de nouvelles façons de relever des données issues du monde qui nous entoure, et ce, en acquérant des notions élémentaires d’algorithmique et de programmation.

Accessibles au grand public, les cartes Arduino permettent de relever les données (issues par exemple d’un capteur) en temps réel. Afin d’accéder à ces données, on peut par exemple utiliser :

  • le moniteur série de Arduino IDE : le relevé se fait alors point par point dans le moniteur puis le recours à un tableur permet d’obtenir une représentation graphique des données ;
  • le traceur série de Arduino IDE qui permet d’obtenir directement la représentation graphique ;
  • une carte SD pour stocker les données pour un traitement ultérieur (pas de temps réel ici…).

Toutes ces méthodes ont leurs avantages et inconvénients. L’objectif de cet article est de proposer une solution à la fois complète et pratique afin de représenter graphiquement, stocker et traiter en temps réel les données issues d’une carte Arduino.

Nous nous appuierons pour illustrer cela sur une étude de la charge et décharge d’un condensateur dans un circuit RC.

Le protocole de communication série de Arduino

Lorsqu’une carte Arduino est connectée à un ordinateur via un port USB, le protocole utilisé est la communication série. C’est ce protocole qui est utilisé par le logiciel Arduino IDE afin de transmettre ou recevoir des données.

L’information à transmettre est alors découpée en blocs de taille fixe (10 bits). Ces blocs sont ensuite transmis de manière asynchrone les uns à la suite des autres à fréquence choisie appelée baudrate (nombre de caractères par seconde). Ce protocole se révélera amplement suffisant dans la plupart des applications simples en Physique-Chimie mais pourra se révéler limité pour la transmission de données plus lourdes qui imposeront un temps de transmission plus long et ainsi la perte du caractère “temps réel” de l’expérience.

C’est ce protocole de communication que nous allons tenter d’exploiter afin de tracer les données en temps réel à l’aide de Python.

Python et la communication série

Python dispose de la librairie pyserial (documentation disponible  ici) permettant d’utiliser la communication série. Nous allons ici essayer de récupérer les données en ayant la possibilité d’y ajouter une partie de traitement des données.

Présentation du montage

Voici le montage qui servira d’exemple :

Ici, la résistance (10 kΩ) et le condensateur (150 μF) sont disposés en série. Le microcontrôleur réalise des charges et décharges successives du condensateur à l’aide de la broche D2. Lors de la charge, une tension de 5V est imposée aux bornes de la résistance et du condensateur. Lors de la décharge, l’alimentation est coupée et le condensateur se décharge à travers la résistance. Les valeurs sont quant à elle relevées à l’aide de la broche A7 qui renvoie une valeur encodée sur 10 bits (0 vaut 0 V et 1023 vaut 5 V).

Programmation du microcontrôleur et script Python

Voici le code commenté pour la partie Arduino. :

Du côté de Python, voici le script générique utilisé. Vous pouvez personnaliser la représentation graphique ainsi que les paramètres de la communication série en modifiant les variables en début de script :

Résultat obtenu

Après avoir relié la carte Arduino à l’ordinateur, on exécute le script Python. Une fenêtre Matplotlib s’ouvre et voici le résultat :

Ici, il est possible d’estimer graphiquement le temps caractéristique de décharge en traçant la tangente à l’origine de la décharge :

Nous obtenons alors τ = 1.5 ± 0.2 s en tenant compte de l’incertitude sur les composants et la lecture graphique. En comparant avec la valeur théorique τ = RC = 1.5 s, nous pouvons conclure que la valeur expérimentale munie de son incertitude semble cohérente avec la valeur théorique. Pour s’en assurer, nous pouvons aussi tracer la fonction f(t) = ln(E-Uc(t)) :

La pente correspond ici à -1/τ, nous trouvons donc τ = 1.6 ± 0.1 s en tenant compte de l’incertitude sur les valeurs des composants.

Conclusion et sources

Couplé avec Python, Arduino se révèle donc utile pour réaliser des acquisitions en direct de données simples. Nous pouvons y ajouter des grandeurs calculées à partir des données reçues comme par exemple, pour le circuit RC, la tension aux bornes de la résistance :

Pour aller plus loin, nous pourrions imaginer relever plusieurs valeurs en même temps (avec transmission des données sous forme de tableau ou au format JSON) ou utiliser le caractère bidirectionnel de la communication série afin de commander la carte Arduino grâce à Python. Bref, les possibilités sont innombrables. Si vous avez d’autres idées d’amélioration ou des remarques, l’espace de commentaires est à votre disposition !

Sources :

  Modifié le : 18/09/2021 10:18:30