{"id":1411,"date":"2024-09-10T06:08:46","date_gmt":"2024-09-10T04:08:46","guid":{"rendered":"https:\/\/labopothier.com\/?p=1411"},"modified":"2025-03-21T17:15:53","modified_gmt":"2025-03-21T16:15:53","slug":"activite-arduino-python-etude-dun-mouvement-doscillations-avec-un-accelerometre-mpu6050-trace-de-graphe-en-temps-reel-et-modelisation","status":"publish","type":"post","link":"https:\/\/labopothier.com\/index.php\/2024\/09\/10\/activite-arduino-python-etude-dun-mouvement-doscillations-avec-un-accelerometre-mpu6050-trace-de-graphe-en-temps-reel-et-modelisation\/","title":{"rendered":"ACTIVIT\u00c9 ARDUINO\/PYTHON : Etude d&rsquo;un mouvement d&rsquo;oscillations avec un acc\u00e9l\u00e9rom\u00e8tre MPU6050 (trac\u00e9 de graphe en temps r\u00e9el et mod\u00e9lisation)"},"content":{"rendered":"\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Merci \u00e0 l&rsquo;auteur de cet article qui a \u00e9t\u00e9 une ressource tr\u00e8s pr\u00e9cieuse pour la r\u00e9alisation de cette activit\u00e9 : <\/p>\n\n\n\n<p><a href=\"http:\/\/gilles.thebault.free.fr\/spip.php?article32\" target=\"_blank\" rel=\"noreferrer noopener\">http:\/\/gilles.thebault.free.fr\/spip.php?article32<\/a><\/p>\n<\/blockquote>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Objectifs et enjeux <\/strong><\/h4>\n\n\n\n<p>Dans le cadre des nouveaux programmes CPGE, nous avons recherch\u00e9 un moyen de r\u00e9aliser des acquisitions d&rsquo;oscillations forc\u00e9es avec un acc\u00e9l\u00e9rom\u00e8tre et un microcontr\u00f4leur. Nous souhaitons r\u00e9aliser un graphe en temps r\u00e9el et mod\u00e9liser la courbe pour mesurer l&rsquo;amplitude et la fr\u00e9quence des oscillations.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Acc\u00e9l\u00e9rom\u00e8tre et carte Arduino<\/strong><\/h4>\n\n\n\n<div class=\"wp-block-group alignwide is-layout-flow wp-block-group-is-layout-flow\">\n<div class=\"wp-block-media-text alignfull is-stacked-on-mobile is-vertically-aligned-center\" style=\"grid-template-columns:17% auto\"><figure class=\"wp-block-media-text__media\"><img loading=\"lazy\" decoding=\"async\" width=\"499\" height=\"500\" src=\"https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/MPU6050.jpg\" alt=\"\" class=\"wp-image-829 size-full\" srcset=\"https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/MPU6050.jpg 499w, https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/MPU6050-300x300.jpg 300w, https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/MPU6050-150x150.jpg 150w\" sizes=\"auto, (max-width: 499px) 100vw, 499px\" \/><\/figure><div class=\"wp-block-media-text__content\">\n<p class=\"has-normal-font-size\">L&rsquo;acc\u00e9l\u00e9rom\u00e8tre-gyroscope utilis\u00e9 ici est le <strong>MPU 6050<\/strong>. <\/p>\n<\/div><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-media-text alignwide has-media-on-the-right is-stacked-on-mobile\" style=\"grid-template-columns:auto 52%\"><div class=\"wp-block-media-text__content\">\n<p class=\"has-normal-font-size\">Les branchements sont relativement simples car il suffit de brancher les bornes <strong>Vcc<\/strong>, <strong>GND<\/strong>, <strong>SCL<\/strong> et <strong>SDA<\/strong> pour r\u00e9cup\u00e9rer les 3 composantes de l&rsquo;acc\u00e9l\u00e9ration et les 3 composantes de l&rsquo;angle de rotation.<\/p>\n<\/div><figure class=\"wp-block-media-text__media\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"709\" src=\"https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/mpu6050_bb-1024x709.jpg\" alt=\"\" class=\"wp-image-830 size-large\" srcset=\"https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/mpu6050_bb-1024x709.jpg 1024w, https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/mpu6050_bb-300x208.jpg 300w, https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/mpu6050_bb-768x532.jpg 768w, https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/mpu6050_bb.jpg 1308w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n\n<p>Il est n\u00e9cessaire d&rsquo;installer pr\u00e9alablement les biblioth\u00e8ques I2C et MPU6050 d\u00e9velopp\u00e9es par <a href=\"https:\/\/github.com\/jrowberg\/i2cdevlib\">Jeff Rowberg<\/a> du MIT : <\/p>\n\n\n\n<p><strong>Pour installer ces bibloth\u00e8ques :<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ouvrir le logiciel&nbsp;Arduino<\/li>\n\n\n\n<li>\u00c0 partir du menu <strong>[Croquis][Inclure une librairie][Ajouter la librairie .ZIP]<\/strong>, installer la librairie \u00ab <strong>I2dev.zip<\/strong>\u00bb (disponible sur ce lien : <strong><a href=\"https:\/\/github.com\/jonasforlot\/python-arduino\/blob\/main\/Donn%C3%A9es%20s%C3%A9rie%20acc%C3%A9l%C3%A9rom%C3%A8tre%20Arduino\/I2Cdev.zip\" target=\"_blank\" rel=\"noreferrer noopener\">I2dev.zip<\/a><\/strong>)<\/li>\n\n\n\n<li>\u00c0 partir du menu <strong>[Croquis][Inclure une librairie][Ajouter la librairie .ZIP]<\/strong>, installer la librairie \u00ab <strong>MPU6050.zip<\/strong>\u00bb (disponible sur ce lien : <strong><strong><a href=\"https:\/\/github.com\/jonasforlot\/python-arduino\/blob\/main\/Donn%C3%A9es%20s%C3%A9rie%20acc%C3%A9l%C3%A9rom%C3%A8tre%20Arduino\/MPU6050.zip\" target=\"_blank\" rel=\"noreferrer noopener\">MPU6050.zip<\/a><\/strong><\/strong>)<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>\u00c9talonnage de l&rsquo;acc\u00e9l\u00e9rom\u00e8tre<\/strong><\/h4>\n\n\n\n<div class=\"wp-block-media-text alignwide has-media-on-the-right is-stacked-on-mobile\" style=\"grid-template-columns:auto 52%\"><div class=\"wp-block-media-text__content\">\n<p class=\"has-normal-font-size\">Pour \u00e9talonner l&rsquo;acc\u00e9l\u00e9rom\u00e8tre, t\u00e9l\u00e9verser le programme <strong>IMU_Zero<\/strong> \u00e0 partir du menu <strong>[Fichier]Exemples][MPU6050]<\/strong>. On laissera l&rsquo;acc\u00e9l\u00e9rom\u00e8tre au repos et \u00e0 plat.<\/p>\n\n\n\n<p>Ouvrir le moniteur s\u00e9rie, puis attendre la fin de l&rsquo;\u00e9talonnage (l&rsquo;op\u00e9ration prend quelques minutes)<\/p>\n<\/div><figure class=\"wp-block-media-text__media\"><img loading=\"lazy\" decoding=\"async\" width=\"703\" height=\"741\" src=\"https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/mpu6050_bb-1.jpg\" alt=\"\" class=\"wp-image-837 size-full\" srcset=\"https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/mpu6050_bb-1.jpg 703w, https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/mpu6050_bb-1-285x300.jpg 285w\" sizes=\"auto, (max-width: 703px) 100vw, 703px\" \/><\/figure><\/div>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><a href=\"https:\/\/youtu.be\/FUc_gd_pTFA\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/Accelerometre1-copie-1024x576.jpg\" alt=\"\" class=\"wp-image-859\" srcset=\"https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/Accelerometre1-copie-1024x576.jpg 1024w, https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/Accelerometre1-copie-300x169.jpg 300w, https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/Accelerometre1-copie-768x432.jpg 768w, https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/Accelerometre1-copie-1536x864.jpg 1536w, https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/Accelerometre1-copie.jpg 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\"><a href=\"https:\/\/www.youtube.com\/watch?v=FUc_gd_pTFA\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.youtube.com\/watch?v=FUc_gd_pTFA<\/a><\/figcaption><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Dispositif exp\u00e9rimental pour l&rsquo;acquisition<\/strong><\/h4>\n\n\n\n<p>Nous utilisons un <strong>vibreur de Melde<\/strong> aliment\u00e9 par un <strong>GBF <\/strong>(mod\u00e8le avec lequel il est possible de r\u00e9gler pr\u00e9cis\u00e9ment la fr\u00e9quence). <\/p>\n\n\n\n<p>Il faudra utiliser un<strong> suiveur de puissance type Geneboost<\/strong>  entre le GBF et le vibreur pour \u00e9viter les chutes de tension. <\/p>\n\n\n\n<p><strong>Mat\u00e9riel utilis\u00e9 : <\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>GBF Centrad GF265<\/li>\n\n\n\n<li>Geneboost Pierron<\/li>\n\n\n\n<li>Un ressort de 20 N\/m coup\u00e9 en deux (donc deux ressorts de 40 N\/m !)<\/li>\n\n\n\n<li>Acc\u00e9l\u00e9rom\u00e8tre MPU6050 fix\u00e9 sur pi\u00e8ce imprim\u00e9e en 3D qui contient une masse de 20 g.<\/li>\n\n\n\n<li>Support imprim\u00e9 en 3D sur masse de 500 g<\/li>\n<\/ul>\n\n\n\n<p>Les fichiers STL des pi\u00e8ces 3D sont disponibles <a rel=\"noreferrer noopener\" href=\"https:\/\/drive.google.com\/file\/d\/1Q4-i7_hlK95-Hg06cKGdlgWLxJN48jkq\/view?usp=sharing\" target=\"_blank\">ici<\/a>.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-gallery aligncenter has-nested-images columns-3 is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1920\" height=\"2560\" data-id=\"849\" src=\"https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/IMG-2570-scaled.jpg\" alt=\"\" class=\"wp-image-849\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1920\" height=\"2560\" data-id=\"847\" src=\"https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/IMG-2568-scaled.jpg\" alt=\"\" class=\"wp-image-847\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1920\" height=\"2560\" data-id=\"846\" src=\"https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/IMG-2567-scaled.jpg\" alt=\"\" class=\"wp-image-846\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1920\" height=\"2560\" data-id=\"845\" src=\"https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/IMG-2566-scaled.jpg\" alt=\"\" class=\"wp-image-845\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1920\" height=\"2560\" data-id=\"843\" src=\"https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/IMG-2569-scaled.jpg\" alt=\"\" class=\"wp-image-843\"\/><\/figure>\n<\/figure>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1920\" src=\"https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/IMG-3276-scaled.jpg\" alt=\"\" class=\"wp-image-850\" srcset=\"https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/IMG-3276-scaled.jpg 2560w, https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/IMG-3276-300x225.jpg 300w, https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/IMG-3276-1024x768.jpg 1024w, https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/IMG-3276-768x576.jpg 768w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>T\u00e9l\u00e9versement du programme Arduino<\/strong><\/h4>\n\n\n\n<p>Le programme t\u00e9l\u00e9vers\u00e9 dans la carte Arduino est le suivant, il est librement inspir\u00e9 du programme de l&rsquo;article disponible \u00e0 cette adresse : <strong><a rel=\"noreferrer noopener\" href=\"http:\/\/gilles.thebault.free.fr\/spip.php?article32\" target=\"_blank\">http:\/\/gilles.thebault.free.fr\/spip.php?article32<\/a><\/strong><\/p>\n\n\n\n<p>Certaines lignes ont \u00e9t\u00e9 d\u00e9sactiv\u00e9es (transform\u00e9es en commentaires avec<strong> \\\\<\/strong>) pour ne garder que les valeurs des 3 composantes de l&rsquo;acc\u00e9l\u00e9ration<\/p>\n\n\n\n<pre title=\"Programme Arduino pour mesure de l'acc\u00e9l\u00e9ration\" class=\"wp-block-code\"><code lang=\"cpp\" class=\"language-cpp\">    #include \"Wire.h\"  \/\/ Arduino Wire library\n    #include \"I2Cdev.h\"  \/\/biblioth\u00e8que I2Cdev \u00e0 installer\n    #include \"MPU6050.h\" \/\/biblioth\u00e8que MPU6050 \u00e0 installer\n    \/\/ AD0 low = 0x68 (default for InvenSense evaluation board)\n    \/\/ AD0 high = 0x69\n    MPU6050 accelgyro;\n    long temps;\n    int16_t ax, ay, az;  \/\/mesures brutes\n    int16_t gx, gy, gz;\n     \n    void setup() {\n      Wire.begin();  \/\/ bus I2C\n      Serial.begin(9600); \/\/ liaison s\u00e9rie\n      while (!Serial) {\n        ; \/\/ wait for serial port to connect. Needed for native USB (LEONARDO)\n      }\n      accelgyro.initialize();  \/\/ initialize device\n      temps = millis();\n      \n      \n    }\n     \n    void loop() {\n\/\/      accelgyro.getMotion6(&amp;ax, &amp;ay, &amp;az, &amp;gx, &amp;gy, &amp;gz);\n      temps = millis();\n      \/\/ On peut aussi utiliser ces m\u00e9thodes\n      accelgyro.getAcceleration(&amp;ax, &amp;ay, &amp;az);\n      \/\/accelgyro.getRotation(&amp;gx, &amp;gy, &amp;gz);\n     \n      \/\/ Affichage accel\/gyro x\/y\/z\n\/\/      Serial.print(\"a\/g:\\t\");\n\/\/      Serial.print(ax); \n\/\/      Serial.print(\"\\t\");\n      Serial.print(\"t : \");\n      Serial.print(\"\\t\");\n      Serial.print(temps); \n      Serial.print(\"\\t\");\n      Serial.print(\"ax : \"); \n      Serial.print(\"\\t\");\n      Serial.print(ax);\/\/    \n      Serial.print(\"\\t\");\n      Serial.print(\"ay : \"); \n      Serial.print(\"\\t\");\n      Serial.print(ay);\/\/    \n      Serial.print(\"\\t\");\n      Serial.print(\"az : \"); \n      Serial.print(\"\\t\");  \n      Serial.print(az);      \n      Serial.println(\"\\t\");\n\n\/\/      Serial.print(gx); \n\/\/      Serial.print(\"\\t\");\n\/\/      Serial.print(gy); \n\/\/      Serial.print(\"\\t\");\n\/\/      Serial.print(gz); \n\/\/      Serial.println(\"\\t\");\n      delay(10);  \n    }<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>A quoi correspond la valeur 16384 ?<\/strong><\/p>\n\n\n\n<p>Il s&rsquo;agit d&rsquo;un acc\u00e9l\u00e9rom\u00e8tre 16 bits pour une gamme -2g\/+2g (g acc\u00e9l\u00e9ration de la pesanteur 9,81 <strong>m\/s<sup>2<\/sup><\/strong>), donc il y a 2^16 valeurs comprises entre -2g et +2 g (donc sur une \u00e9tendue de 4g). 1g correspond donc \u00e0 2^16 \/4 =16384. On fera la conversion en g (avec g= 9,81 <strong>m\/s<sup>2<\/sup><\/strong>) dans le script Python.<\/p>\n<\/blockquote>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><a href=\"https:\/\/www.youtube.com\/watch?v=Wb6xFCufiT4\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/Accelerometre2-copie-1024x576.jpg\" alt=\"\" class=\"wp-image-860\" srcset=\"https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/Accelerometre2-copie-1024x576.jpg 1024w, https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/Accelerometre2-copie-300x169.jpg 300w, https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/Accelerometre2-copie-768x432.jpg 768w, https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/Accelerometre2-copie-1536x864.jpg 1536w, https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/Accelerometre2-copie.jpg 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\"><a href=\"https:\/\/www.youtube.com\/watch?v=Wb6xFCufiT4\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.youtube.com\/watch?v=Wb6xFCufiT4<\/a><\/figcaption><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>R\u00e9cup\u00e9ration des donn\u00e9es avec Python<\/strong><\/h4>\n\n\n\n<p>Une fois ce code Arduino t\u00e9l\u00e9vers\u00e9, nous pouvons r\u00e9cup\u00e9rer les valeurs avec Python (par biais d&rsquo;un IDE comme Pyzo, Spyder, IDLE, Sublime Text,..). Il est alors possible de tracer un graphe en temps r\u00e9el, traiter les donn\u00e9es, mod\u00e9liser les courbes etc&#8230;<\/p>\n\n\n\n<p>Dans cet article , je ne rentrerai pas dans les d\u00e9tails pour les \u00e9tapes de r\u00e9cup\u00e9ration de donn\u00e9es. pour cela, je vous invite \u00e0 consulter l&rsquo;article qui explique les diff\u00e9rentes \u00e9tapes sur ce lien : <\/p>\n\n\n\n<p class=\"has-text-align-center\"><strong><a href=\"https:\/\/labopothier.com\/index.php\/2024\/09\/10\/activite-arduino-python-recuperer-avec-python-les-donnees-dune-carte-arduino-avec-trace-de-graphes-exemple-avec-une-mesure-de-distance-par-ultrason\/\" target=\"_blank\" rel=\"noreferrer noopener\">R\u00e9cup\u00e9ration des donn\u00e9es d&rsquo;une carte Arduino avec Python<\/a><\/strong><\/p>\n\n\n\n<p>Voici le script Python \u00e0 ex\u00e9cuter :<\/p>\n\n\n\n<pre title=\"Script Python pour trac\u00e9 de graphe en temps r\u00e9el et mod\u00e9lisation\" class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">\n #importation des modules\n import serial\n import serial.tools.list_ports # pour la communication avec le port s\u00e9rie\n import matplotlib.pyplot as plt  # pour le trac\u00e9 de graphe\n from matplotlib import animation # pour la figure anim\u00e9e\n import time # gestion du temps\n import numpy as np # numpy pour l'importation des donnees en format txt\n from scipy.optimize import curve_fit\n \n\n liste_a = [] # liste pour stocker les valeurs de distance\n liste_t = []\n t_acquisition = 10.0 # en s\n amax =2 # en g\n amin= 0 # en g\n \n\n dt=0.1\n \n\n \n\n #pour le graphe en teamax= 3 # en temps r\u00e9el\n def animate(i):\n     line1 = Data.readline()\n     print (line1)\n     # on retire les caract\u00e8res d'espacement en d\u00e9but et fin de cha\u00eene\n     listeDonnees = line1.strip()\n     # on s\u00e9pare les informations re\u00e7ues s\u00e9par\u00e9es par les espaces et on stocke ces informations dans une liste pour chacune de lignes\n     listeDonnees = line1.split()\n     print (listeDonnees)\n \n\n \n\n     if len(listeDonnees) == 12 : # parfois des lignes de donn\u00e9es vides peuvent \u00eatre envoy\u00e9es, il faut les \"\u00e9carter\"\n         accelx = (float(listeDonnees[5].decode()))\/16384 # apr\u00e8s consultation des donn\u00e9es, nous choisissons le 6 \u00e8me \u00e9l\u00e9ment de listeDonnees, on convertit l'acc\u00e9l\u00e9ration en g\n         accely = (float(listeDonnees[8].decode()))\/16384 # apr\u00e8s consultation des donn\u00e9es, nous choisissons le 6 \u00e8me \u00e9l\u00e9ment de listeDonnees, on convertit l'acc\u00e9l\u00e9ration en g\n         accelz = (float(listeDonnees[11].decode()))\/16384 # apr\u00e8s consultation des donn\u00e9es, nous choisissons le 6 \u00e8me \u00e9l\u00e9ment de listeDonnees, on convertit l'acc\u00e9l\u00e9ration en g\n         accel =np.sqrt(accelx**2+accely**2 +accelz**2)\n         temps = (float(listeDonnees[2].decode()))\/1000.0 # apr\u00e8s consulation des donn\u00e9es, nous choisissons le 1er \u00e9l\u00e9ment de listeDonnees\n \n\n         while temps &lt;= t_acquisition:\n             liste_a.append(accel)\n             print(\"a = %f\"%(accel), \" g\") # affichage de la valeur de la distance\n             liste_t.append(temps)\n             print(\"temps = %f\"%(temps), \" s\") # affichage de la valeur du temps en partant de 0\n             line.set_data(liste_t,liste_a)\n             return line,\n \n\n \n\n \n\n \n\n \n\n \n\n # Fonction pour la r\u00e9cup\u00e9ration des donn\u00e9es s\u00e9rie venant de la carte Arduino\n def recup_port_Arduino() :\n     ports = list(serial.tools.list_ports.comports())\n     for p in ports:\n         if 'Arduino' in p.description :\n             mData = serial.Serial(p.device,9600)\n     print(mData.is_open) # Affiche et v\u00e9rifie que le port est ouvert\n     print(mData.name) # Affiche le nom du port \n     return mData\n \n\n \n\n \n\n \n\n \n\n \n\n Data =recup_port_Arduino() #r\u00e9cup\u00e9ration des donn\u00e9es\n \n\n # Cr\u00e9ation figure\n fig=plt.figure()\n line, = plt.plot([],[])\n plt.xlim(0, t_acquisition)\n plt.ylim(amin,amax)\n plt.xlabel('temps en s')\n plt.ylabel('a en g')\n plt.grid()\n \n\n \n\n #Animation\n ani = animation.FuncAnimation(fig, animate, frames=2000,  interval=20,repeat=False)\n \n\n plt.show()\n \n\n plt.close(fig)\n Data.close()\n \n\n \n\n \n\n \n\n#Ecriture dans un fichier txt\nlines=['t\\ta\\n'] #premi\u00e8re ligne du fichier txt\nfor i in range (len (liste_a)):\n    line = str(liste_t[i]) +'\\t'+ str(liste_a[i])+'\\n'\n    lines.append(line)\n\n# Utilisation de 'with open' pour assurer la fermeture du fichier\nwith open('data_accelerometre.txt', 'w', encoding='utf-8') as fichier:\n    fichier.writelines(lines)  # cr\u00e9ation d'un nouveau fichier texte\n\n\n \n\n \n\n t = np.array(liste_t) \n acc = np.array(liste_a) \n \n\n \n\n # Fonction d'estimation de la fr\u00e9quence\n def estim_freq(y) : \n     compt = 0\n     moy = np.mean(y)\n     etat_old = False\n     etat_new = False\n     for i in range (len(y)) :\n         if  y[i] &lt; moy :\n             etat_new = True\n         else :\n             etat_new = False\n         if etat_old != etat_new :\n             etat_old = etat_new\n             compt += 1\n \n\n     return (compt\/(2*t_acquisition))\n \n\n # Fonction d'estimation des valeurs des param\u00e8tres de la mod\u00e9lisation\n def get_p0(x, y): \n     \n     A0 = (np.max(y)-np.min(y))\/2\n     f0 =estim_freq(y)\n     phase0 =0\n     offset0 = np.mean(y)\n     \n     \n     return [A0, f0, phase0,offset0]\n \n\n def f(x,a,b,c,d):\n     return (a*np.sin(2.*np.pi*b*x+c)+d)\n \n\n popt,pcov = curve_fit (f,t,acc,p0=get_p0(t,acc))\n \n\n # popt,pcov = curve_fit (f,t,acc)\n \n\n texte = 'Acc\u00e9l\u00e9ration = '+str(round(float(popt[0]),2))+' sin (2pi*'+str(round(float(popt[1]),2))+'*t+'+str(round(float(popt[2]),2))+') + '+str(round(float(popt[3]),2))+'\\n' +'A = '+str(round(float(popt[0]),2))+'; f = '+str(round(float(popt[1]),2))+' ; phase ='+str(round(float(popt[2]),2))+' ; offset = '+str(round(float(popt[3]),2))\n \n\n # afficher points avec croix rouges. Inserer texte (titre, nom des axes,\u2026)\n plt.figure()\n plt.scatter(t, acc, c = 'red', marker = '+')\n plt.plot(t,f(t,*popt),'g--',label = texte)\n plt.xlabel(\"t en s\")\n plt.ylabel(\"a en g\")\n plt.legend()   # pour afficher les l\u00e9gendes (label)\n plt.show()\n \n\n \n\n print (texte)\n \n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><a href=\"https:\/\/youtu.be\/W3Gki7TVplk\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/Accelerometre3-copie-1024x576.jpg\" alt=\"\" class=\"wp-image-861\" srcset=\"https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/Accelerometre3-copie-1024x576.jpg 1024w, https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/Accelerometre3-copie-300x169.jpg 300w, https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/Accelerometre3-copie-768x432.jpg 768w, https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/Accelerometre3-copie-1536x864.jpg 1536w, https:\/\/labopothier.com\/wp-content\/uploads\/2021\/04\/Accelerometre3-copie.jpg 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\"><a href=\"https:\/\/youtu.be\/W3Gki7TVplk\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/youtu.be\/W3Gki7TVplk<\/a><\/figcaption><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Quelques pr\u00e9cisions concernant la mod\u00e9lisation  : la fonction CURVE FIT de scipy<\/strong><\/h4>\n\n\n\n<p>Les lignes de code concernant la mod\u00e9lisation m\u00e9rite des \u00e9claircissements !<\/p>\n\n\n\n<p>Nous utilisons la fonction curve_fit de scipy (en l&rsquo;important avec <\/p>\n\n\n\n<pre id=\"block-0ce7c544-758a-4fa2-ad1c-acab0ffb5d97\" class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\"> from scipy.optimize import curve_fit<\/code><\/pre>\n\n\n\n<p>Nous d\u00e9finissons une fonction pour le mod\u00e8le \u00e0 trouver :<\/p>\n\n\n\n<pre id=\"block-0ce7c544-758a-4fa2-ad1c-acab0ffb5d97\" class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\"> def f(x,a,b,c,d):<br>     return (a*np.sin(2.*np.pi*b*x+c)+d)<\/code><\/pre>\n\n\n\n<p>Pour ajuster la courbe par rapport au mod\u00e8le, il faut \u00e9crire :<\/p>\n\n\n\n<pre id=\"block-0ce7c544-758a-4fa2-ad1c-acab0ffb5d97\" class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">popt,pcov = curve_fit (f,t,acc)<\/code><\/pre>\n\n\n\n<p>Seul <strong>popt <\/strong>nous int\u00e9resse, il s&rsquo;agit des param\u00e8tres d&rsquo;optimisation de la courbe par rapport au mod\u00e8le (c&rsquo;est \u00e0 dire ici ces 4 valeurs:<strong> amplitude (a), fr\u00e9quence(b), phase(c), offset(d)<\/strong> )<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>M\u00eame si <strong>pcov <\/strong>ne nous int\u00e9resse pas,nous sommes oblig\u00e9s d&rsquo;\u00e9crire <strong>popt,pcov<\/strong> !<\/p>\n<\/blockquote>\n\n\n\n<p>&#8230; malheureusement cela ne suffit pas  \ud83d\ude41 Il faut \u00ab\u00a0aider\u00a0\u00bb le programme en donnant une estimation de ces param\u00e8tres pour que l&rsquo;optimisation se fasse correctement.<\/p>\n\n\n\n<p>Pour cela il faut d\u00e9finir au pr\u00e9alable une fonction <strong>get_p0(x,y) <\/strong>pour estimer ces valeurs :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Pour l&rsquo;<strong>amplitude<\/strong>, on divise par deux l&rsquo;\u00e9cart entre la valeur minimale et la valeur maximale des acc\u00e9l\u00e9rations mesur\u00e9es<\/li>\n\n\n\n<li>Par d\u00e9faut, on d\u00e9finit la <strong>phase <\/strong>\u00e9gale \u00e0 0<\/li>\n\n\n\n<li>Pour la tension de d\u00e9calage (ou <strong>offset<\/strong>), on calcule la moyenne des valeurs d&rsquo;acc\u00e9l\u00e9ration mesur\u00e9es<\/li>\n<\/ul>\n\n\n\n<pre title=\"Fonction d'estimation des valeurs des param\u00e8tres de la mod\u00e9lisation\" class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">\n def get_p0(x, y): \n     \n     A0 = (np.max(y)-np.min(y))\/2\n     f0 =estim_freq(y)\n     phase0 =0\n     offset0 = np.mean(y)<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Et pour l&rsquo;estimation de la fr\u00e9quence ?<\/strong><\/p>\n\n\n\n<p>On d\u00e9finit (encore !) une petite fonction qui va compter les passages par la valeur moyenne (donc toutes les demi-p\u00e9riodes). Cette fonction va retourner la valeur <strong>nombre de comptages\/temps d&rsquo;acquisition<\/strong> &#8230; qu&rsquo;il faut diviser par deux pour une p\u00e9riode enti\u00e8re !<\/p>\n<cite>Voici cette fonction (<strong>qu&rsquo;il faut d\u00e9finir avant get_p0<\/strong>) :<\/cite><\/blockquote>\n\n\n\n<pre title=\" Fonction d'estimation de la fr\u00e9quence\" id=\"block-7cf41b6d-5ab2-4d1e-b4c5-14efc60cce6d\" class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">\n def estim_freq(y) : \n     compt = 0\n     moy = np.mean(y)\n     etat_old = False\n     etat_new = False\n     for i in range (len(y)) :\n         if  y[i] &lt; moy :\n             etat_new = True\n         else :\n             etat_new = False\n         if etat_old != etat_new :\n             etat_old = etat_new\n             compt +=\n     return (compt\/(2*t_acquisition))<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Et pour l&rsquo;estimation de la fr\u00e9quence ?<\/strong><\/p>\n\n\n\n<p>On d\u00e9finit (encore !) une petite fonction qui va compter les passages par la valeur moyenne (donc toutes les demi-p\u00e9riodes). Cette fonction va retourner la valeur <strong>nombre de comptages\/temps d&rsquo;acquisition<\/strong> &#8230; qu&rsquo;il faut diviser par deux pour une p\u00e9riode enti\u00e8re !<\/p>\n<cite>Voici cette fonction (<strong>qu&rsquo;il faut d\u00e9finir avant get_p0<\/strong>) :<\/cite><\/blockquote>\n\n\n\n<p>En petit bonus, un script Python permettant de faire la mod\u00e9lisation directement \u00e0 partir de la derni\u00e8re acquisition (sans recommencer l&rsquo;acquisition) \u00e0 partir des valeurs sauvegard\u00e9es dans un fichier txt :<\/p>\n\n\n\n<pre title=\"Script Python pour mod\u00e9lisation \u00e0 partir de donn\u00e9es existantes (dans un fichier txt)\" class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">import matplotlib.pyplot as plt # pour les graphiques\n import numpy as np # numpy pour l'importation des donnees en format txt\n from scipy.optimize import curve_fit\n importation des donnees txt obtenues apres pointage en supprimant la premiere ligne dans le fichier texte\n lines = open('data_accelerometre.txt').readlines() #on lit les lignes du fichier texte\n open('data_new.txt', 'w').writelines(lines[1:]) #cr\u00e9ation d'un nouveau fichier texte sans la premi\u00e8re ligne\n data = np.loadtxt('data_new.txt')# importation du nouveau fichier texte pour r\u00e9cup\u00e9rer les valeurs det, x et y dans un tableau\n t = data[:,0] # selection de la premiere colonne\n acc = data[:,1] # selection de la deuxieme colonne\n def estim_freq(y) : \n     compt = 0\n     moy = np.mean(y)\n     etat_old = False\n     etat_new = False\n     for i in range (len(y)) :\n         if  y[i] &lt; moy :\n             etat_new = True\n         else :\n             etat_new = False\n         if etat_old != etat_new :\n             etat_old = etat_new\n             compt += 1\n <code>return (compt\/(2*10.0)) #temps d'acquisition de 10s<\/code>\n Fonction d'estimation des valeurs des param\u00e8tres de la mod\u00e9lisation\n def get_p0(x, y): \n <code>A0 = (np.max(y)-np.min(y))\/2 f0 =estim_freq(y) phase0 =0 offset0 = np.mean(y) return [A0, f0, phase0,offset0]<\/code>\n def f(x,a,b,c,d):\n     return (a<em>np.sin(2.<\/em>np.pi<em>b<\/em>x+c)+d)\n  \n pop,pcov = curve_fit (f,t,acc)\n popt,pcov = curve_fit (f,t,acc,p0=get_p0(t,acc))\n texte = 'Acc\u00e9l\u00e9ration = '+str(round(float(popt[0]),2))+' sin (2pi<em>'+str(round(float(popt[1]),2))+'<\/em>t+'+str(round(float(popt[2]),2))+') + '+str(round(float(popt[3]),2))+'\\n' +'A = '+str(round(float(popt[0]),2))+'; f = '+str(round(float(popt[1]),2))+' ; phase ='+str(round(float(popt[2]),2))+' ; offset = '+str(round(float(popt[3]),2))\n afficher points avec croix rouges. Inserer texte (titre, nom des axes,\u2026)\n plt.figure(1)\n plt.plot(t, acc, c = 'red', marker = '+')\n plt.plot(t,f(t,*popt),'g--',label = texte)\n plt.xlabel(\"t en s\")\n plt.ylabel(\"a en g\")\n plt.legend()   # pour afficher les l\u00e9gendes (label)\n plt.show()\n print (texte)\n print(get_p0(t,acc))\n estim_freq(acc)<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Changer de gamme pour de plus grandes acc\u00e9l\u00e9rations<\/strong><\/h4>\n\n\n\n<p>En cas d&rsquo;exp\u00e9riences avec des mouvements rapdes comme pour des chocs, il est n\u00e9cessaire de mesurer des valeurs d&rsquo;acc\u00e9l\u00e9ration plus \u00e9lev\u00e9es.<\/p>\n\n\n\n<p>Pour travailler sur une gamme -16g\/+16g (au lieu de -2g\/+2g), il suffit de rajouter une ligne de code dans le setup du programme Arduino :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"cpp\" class=\"language-cpp\">accelgyro.setFullScaleAccelRange(3);&nbsp;\/\/ pour la gamme -16g\/+16g<\/code><\/pre>\n\n\n\n<p>Voici le code Arduino modifi\u00e9 \u00e0 t\u00e9l\u00e9verser\u00a0(avec mesure de ax seulement). <\/p>\n\n\n\n<pre title=\"Code Arduino pour mesure d'acc\u00e9l\u00e9ration \u00e9lev\u00e9e\" class=\"wp-block-code\"><code lang=\"cpp\" class=\"language-cpp\">    #include \"Wire.h\"  \/\/ Arduino Wire library\n    #include \"I2Cdev.h\"  \/\/biblioth\u00e8que I2Cdev \u00e0 installer\n    #include \"MPU6050.h\" \/\/biblioth\u00e8que MPU6050 \u00e0 installer\n    \/\/ AD0 low = 0x68 (default for InvenSense evaluation board)\n    \/\/ AD0 high = 0x69\n    MPU6050 accelgyro;\n    long temps;\n    int16_t ax, ay, az;  \/\/mesures brutes\n    int16_t gx, gy, gz;\n     \n    void setup() {\n      Wire.begin();  \/\/ bus I2C\n      Serial.begin(9600); \/\/ liaison s\u00e9rie\n      while (!Serial) {\n        ; \/\/ wait for serial port to connect. Needed for native USB (LEONARDO)\n      }\n      accelgyro.initialize();  \/\/ initialize device\n      accelgyro.setFullScaleAccelRange(3); \/\/ pour la gamme -16g\/+16g\n      temps = millis();\n      \n     \n      \n    }\n     \n    void loop() {\n      temps = millis();\n      accelgyro.getMotion6(&amp;ax, &amp;ay, &amp;az, &amp;gx, &amp;gy, &amp;gz);\n\n      Serial.print(temps); \n      Serial.print(\"\\t\");\n      Serial.println(ax);  \n    }<\/code><\/pre>\n\n\n\n<p><a href=\"https:\/\/github.com\/jonasforlot\/python-arduino\/blob\/main\/Donn\u00e9es%20s\u00e9rie%20acc\u00e9l\u00e9rom\u00e8tre%20Arduino\/accelerometre_16g.ino\">https:\/\/github.com\/jonasforlot\/python-arduino\/blob\/main\/Donn\u00e9es%20s\u00e9rie%20acc\u00e9l\u00e9rom\u00e8tre%20Arduino\/accelerometre_16g.ino<\/a><\/p>\n\n\n\n<p>Si on fait cette modification, nous allons r\u00e9cup\u00e9rer 2^16 valeurs comprises entre -16g&nbsp;et&nbsp;16g&nbsp;donc 1g correspond \u00e0 2048 (au lieu de 16384) . <\/p>\n\n\n\n<p>Ci-dessous le script&nbsp;Python pour r\u00e9cup\u00e9rer les donn\u00e9es&nbsp;:<\/p>\n\n\n\n<pre title=\"R\u00e9cup\u00e9ration des donn\u00e9es d'un acc\u00e9l\u00e9rom\u00e8tre MPU6050 avec la gamme -16g\/+16g\" class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">#importation des modules\nimport serial\nimport serial.tools.list_ports # pour la communication avec le port s\u00e9rie\nimport matplotlib.pyplot as plt  # pour le trac\u00e9 de graphe\nfrom matplotlib import animation # pour la figure anim\u00e9e\n# import time # gestion du temps\nimport numpy as np # numpy pour l'importation des donnees en format txt\nfrom scipy.optimize import curve_fit\n\nliste_a = [] # liste pour stocker les valeurs de distance\nliste_t = []\nt_acquisition = 10.0 # en s\namax =4 # en g\namin= -4 # en g\n\n# dt=0.1\n\n\n#pour le graphe en temps r\u00e9el\ndef animate(i):\n    line1 = Data.readline()\n\n    print (line1)\n    # on retire les caract\u00e8res d'espacement en d\u00e9but et fin de cha\u00eene\n    listeDonnees = line1.strip()\n    # on s\u00e9pare les informations re\u00e7ues s\u00e9par\u00e9es par les espaces et on stocke ces informations dans une liste pour chacune de lignes\n    listeDonnees = line1.split()\n    print (listeDonnees)\n\n\n    if len(listeDonnees) == 2 : # parfois des lignes de donn\u00e9es vides peuvent \u00eatre envoy\u00e9es, il faut les \"\u00e9carter\"\n        accel = (float(listeDonnees[1].decode()))\/2048.0 # apr\u00e8s consulation des donn\u00e9es, nous choisissons le 6 \u00e8me \u00e9l\u00e9ment de listeDonnees, on convertit l'acc\u00e9l\u00e9ration en g\n\n        temps = (float(listeDonnees[0].decode()))\/1000.0 # apr\u00e8s consulation des donn\u00e9es, nous choisissons le 1er \u00e9l\u00e9ment de listeDonnees\n\n        while temps &lt;= t_acquisition:\n            liste_a.append(accel)\n            print(\"a = %f\"%(accel), \" g\") # affichage de la valeur de la distance\n            liste_t.append(temps)\n            print(\"temps = %f\"%(temps), \" s\") # affichage de la valeur du temps en partant de 0\n            line.set_data(liste_t,liste_a)\n            return line,\n\n\n\n\n\n\n# Fonction pour la r\u00e9cup\u00e9ration des donn\u00e9es s\u00e9rie venant de la carte Arduino\ndef recup_port_Arduino() :\n    ports = list(serial.tools.list_ports.comports())\n    for p in ports:\n        if 'Arduino' in p.description :\n            mData = serial.Serial(p.device,9600)\n    print(mData.is_open) # Affiche et v\u00e9rifie que le port est ouvert\n    print(mData.name) # Affiche le nom du port\n    return mData\n\n\n\n\n\n\nData =recup_port_Arduino() #r\u00e9cup\u00e9ration des donn\u00e9es\n\n# Cr\u00e9ation figure\nfig=plt.figure()\nline, = plt.plot([],[])\nplt.xlim(0, t_acquisition)\nplt.ylim(amin,amax)\nplt.xlabel('temps en s')\nplt.ylabel('a en g')\nplt.grid()\n\n\n#Animation\nani = animation.FuncAnimation(fig, animate, frames=2000,  interval=20,repeat=False)\n\nplt.show()\n\nplt.close(fig)\nData.close()\n\n\n\n\n#Ecriture dans un fichier txt\nlines=['t\\ta\\n'] #premi\u00e8re ligne du fichier txt\nfor i in range (len (liste_a)):\n    line = str(liste_t[i]) +'\\t'+ str(liste_a[i])+'\\n'\n    lines.append(line)\n\n# Utilisation de 'with open' pour assurer la fermeture du fichier\nwith open('data_accelerometre.txt', 'w', encoding='utf-8') as fichier:\n    fichier.writelines(lines)  # cr\u00e9ation d'un nouveau fichier texte\n\n\n\nt = np.array(liste_t)\nacc0 = np.array(liste_a)\nacc_moy=np.mean(acc0)\nacc = acc0-acc_moy\n\n\ndef estim_freq(y) :\n    compt = 0\n    moy = np.mean(y)\n    etat_old = False\n    etat_new = False\n    for i in range (len(y)) :\n        if  y[i] &lt; moy :\n            etat_new = True\n        else :\n            etat_new = False\n        if etat_old != etat_new :\n            etat_old = etat_new\n            compt += 1\n\n    return (compt\/(2*t_acquisition))\n\n\ndef get_p0(x, y):\n\n    A0 = (np.max(y)-np.min(y))\/2\n    f0 =estim_freq(y)\n    phase0 =0\n    offset0 = np.mean(y)\n\n\n    return [A0, f0, phase0,offset0]\n\ndef f(x,a,b,c,d):\n    return (a*np.sin(2.*np.pi*b*x+c)+d)\n\nXcalc = np.linspace(0,max(t) , 1024) # cr\u00e9ation de points pour le trac\u00e9 du mod\u00e8le : on cr\u00e9e 1024 points r\u00e9guli\u00e8rement espac\u00e9s entre 0 et la valeur max de I\n\n\npop,pcov = curve_fit (f,t,acc,p0=get_p0(t,acc))\n\n# pop,pcov = curve_fit (f,t,acc)\n\ntexte = 'Acc\u00e9l\u00e9ration = '+str(round(float(pop[0]),2))+' sin (2pi*'+str(round(float(pop[1]),2))+'*t+'+str(round(float(pop[2]),2))+') + '+str(round(float(pop[3]),2))+'\\n' +'A = '+str(round(float(pop[0]),2))+'; f = '+str(round(float(pop[1]),2))+' ; phase ='+str(round(float(pop[2]),2))+' ; offset = '+str(round(float(pop[3]),2))\n\n# afficher points avec croix rouges. Inserer texte (titre, nom des axes,\u2026)\nplt.figure()\nplt.scatter(t, acc, c = 'red', marker = '+')\nplt.plot(Xcalc,f(Xcalc,*pop),'g--',label = texte)\nplt.xlabel(\"t en s\")\nplt.ylabel(\"a en g\")\nplt.legend()   # pour afficher les l\u00e9gendes (label)\nplt.show()\n\n\nprint (texte)<\/code><\/pre>\n\n\n\n<p><a href=\"https:\/\/github.com\/jonasforlot\/python-arduino\/blob\/main\/Donn\u00e9es%20s\u00e9rie%20acc\u00e9l\u00e9rom\u00e8tre%20Arduino\/trac\u00e9%20acc\u00e9l\u00e9rom\u00e8tre%2016g\">https:\/\/github.com\/jonasforlot\/python-arduino\/blob\/main\/Donn\u00e9es%20s\u00e9rie%20acc\u00e9l\u00e9rom\u00e8tre%20Arduino\/trac\u00e9%20acc\u00e9l\u00e9rom\u00e8tre%2016g<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Merci \u00e0 l&rsquo;auteur de cet article qui a \u00e9t\u00e9 une ressource tr\u00e8s pr\u00e9cieuse pour la r\u00e9alisation de cette activit\u00e9 : http:\/\/gilles.thebault.free.fr\/spip.php?article32 Objectifs et enjeux Dans le cadre des nouveaux programmes CPGE, nous avons recherch\u00e9 un moyen de r\u00e9aliser des acquisitions d&rsquo;oscillations forc\u00e9es avec un acc\u00e9l\u00e9rom\u00e8tre et un microcontr\u00f4leur. Nous souhaitons r\u00e9aliser un graphe en temps [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1535,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"default","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"default","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[7,11],"tags":[],"class_list":["post-1411","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-microcontroleurs-et-python","category-recuperer-les-donnees-dune-carte-arduino-avec-python"],"_links":{"self":[{"href":"https:\/\/labopothier.com\/index.php\/wp-json\/wp\/v2\/posts\/1411","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/labopothier.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/labopothier.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/labopothier.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/labopothier.com\/index.php\/wp-json\/wp\/v2\/comments?post=1411"}],"version-history":[{"count":10,"href":"https:\/\/labopothier.com\/index.php\/wp-json\/wp\/v2\/posts\/1411\/revisions"}],"predecessor-version":[{"id":1776,"href":"https:\/\/labopothier.com\/index.php\/wp-json\/wp\/v2\/posts\/1411\/revisions\/1776"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/labopothier.com\/index.php\/wp-json\/wp\/v2\/media\/1535"}],"wp:attachment":[{"href":"https:\/\/labopothier.com\/index.php\/wp-json\/wp\/v2\/media?parent=1411"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/labopothier.com\/index.php\/wp-json\/wp\/v2\/categories?post=1411"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/labopothier.com\/index.php\/wp-json\/wp\/v2\/tags?post=1411"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}