Objectif : Réaliser des acquisitions de mesures d’accélérations sans liaison avec un ordinateur, en utilisant un modèle nano d’Arduino alimenté par une batterie, et en récupérant les données sur un smartphone.
Matériel nécessaire :
1. Une carte Arduino Nano iOt 33
Cette carte présente l’avantage d’avoir un accéléromètre intégré LSM6DS3.
Il sera nécessaire d’installer la bibliothèque nécessaire pour utiliser cet accéléromètre dans Arduino.
2. Une batterie LiPo
Une des meilleures options pour avoir un système complètement autonome est d’utiliser une batterie LiPo .
Batterie LiPo disponible sur Conrad
Pour recharger cette batterie, voici un modèle de chargeur disponible aussi sur Conrad :
Il faut relier respectivement les fils rouge et noir à l’Arduino sur les broches VIN et GND :
Attention : Bien vérifier le branchement à plusieurs reprises avant de mettre sous tension. Il faut relier le fil + à la borne VIN et le fil – à une des broches GND.
Une erreur de branchement est fatale (j’en suis à une bonne demi douzaine de cartes Arduino HS à cause de trop de précipitation !).
La solution idéale serait d’associer une diode au fil rouge et de condamner le système avec une mise sous tension au moyen d’un interrupteur (voir schéma ci-dessous)
Acquisition et récupération des données :
1. Installation des bibliothèques
Il est nécessaire d’installer préalablement les bibliothèques LSM6DS3 (pour l’accéléromètre) et Phyphox BLE (pour communication Bluetooth) :
Pour installer ces biblothèques :
- Ouvrir le logiciel Arduino
- À partir du menu [Croquis][Inclure une bibliothèque][Gérer les bibliothèques], rechercher puis installer la librairie « LSM6DS3» (disponible aussi sur ce lien, à télécharger en .zip : LSM6DS3 Github)
- À partir du menu [Croquis][Inclure une bibliothèque][Gérer les bibliothèques], rechercher puis installer la librairie « Phyphox BLE» (disponible aussi sur ce lien, à télécharger en .zip : Phyphox-arduino Github)
2. Installation de la carte Arduino Nano iOt33
À partir du menu [Outils][Type de carte][Gestionnaire de carte], rechercher « Nano iOt », puis installer le pack proposé : Arduino SAMD Boards
Ensuite dans [Outils][Type de carte][Arduino SAMD ….], sélectionner la carte Nano iOt 3
3. Exécution du code Arduino
Le code Arduino à téléverser sur la carte Nano est le suivant (il s’agit juste d’une mesure d’accélération selon x sur cet exemple) :
/*
Arduino LSM6DS3 - Simple Accelerometer
This example reads the acceleration values from the LSM6DS3
sensor and continuously prints them to the Serial Monitor
or Serial Plotter.
The circuit:
- Arduino Uno WiFi Rev 2 or Arduino Nano 33 IoT
created 10 Jul 2019
by Riccardo Rizzo
This example code is in the public domain.
*/
#include <Arduino_LSM6DS3.h>
#include <phyphoxBle.h>
#include <Wire.h> // Inclure la bibliothèque Wire pour la communication I2C
void setup() {
PhyphoxBLE::start(); //Start the BLE server
Wire.begin(); // Initialiser la communication I2C
delay(100); // Laisser le temps au capteur de s'initialiser
Serial.begin(9600);
if (!IMU.begin()) {
Serial.println("Failed to initialize IMU!");
while (1);
}
Serial.print("Accelerometer sample rate = ");
Serial.print(IMU.accelerationSampleRate());
Serial.println(" Hz");
Serial.println();
Serial.println("Acceleration in g's");
Serial.println("X\tY\tZ");
}
void loop() {
float x, y, z;
if (IMU.accelerationAvailable()) {
IMU.readAcceleration(x, y, z);
Serial.println(x);
PhyphoxBLE::write(x);
PhyphoxBLE::poll(); //IMPORTANT: In contrast to other devices, poll() needs to be called periodically on the 33 IoT
}
}
Ce code est disponible ici
4. Acquisition de données avec Phyphox
Exemple avec un appareil Apple (les différences sont indiquées ci-dessous mais sans les impressions écran)
- Ouvrez l’application PhyPhox (Disponible sur l’AppStore ou sur Google Play)
- Cliquez sur le bouton + en haut à droite (en bas à droite sur Android)
- Cliquez sur Ajouter une expérience avec un appareil Bluetooth (la Bluetooth doit être activée bien sûr !)
- Sélectionnez l’appareil Bluetooth « phyphox-Arduino »
- Appuyer sur le bouton Lecture pour lancer l’acquisition
- Puis dans les options en haut à droite, choisir Exporter les mesures
- Choisir le format de données en CSV (tabulation, point décimal), le fichier pourra être enregistré sur l’appareil (puis envoyé par mail par exemple pour le traitement sur ordinateur)
- Pour réaliser d’autres acquisitions, il est alors possible d’accéder directement à l’expérience créée. Pour cela, dans le menu d’accueil sélectionner : Arduino-Experiment
5. Récupération des données avec Python
Voici ci-dessous un script Python permettant de récupérer les données du fichier csv. Il serait ensuite possible de faire évoluer ce script avec du traitement de données (modélisation, incertitudes …).
Astuce dans Pyzo
Pour éviter d’indiquer le chemin d’accès du fichier CSV, créer un dossier contenant ce script et le fichier csv, puis lancer le script avec le raccourci CTRL+SHIFT+E
import matplotlib.pyplot as plt # pour les graphiques
import numpy as np # numpy pour l'importation des donnees en format txt
# Nom du fichier d'entrée et de sortie
fichier_entree = "mySet.csv"
fichier_sortie = "mySet_sans_3_dernieres_colonnes.csv"
# Ouvrir le fichier d'entrée en mode lecture
with open(fichier_entree, mode='r') as f_entree:
lignes = f_entree.readlines()
# Ouvrir le fichier de sortie en mode écriture
with open(fichier_sortie, mode='w') as f_sortie:
for ligne in lignes:
# Divisez la ligne en colonnes en utilisant la tabulation comme délimiteur
colonnes = ligne.strip().split('\t')
# Supprimez les trois dernières colonnes
nouvelles_colonnes = colonnes[:-3]
# Recréez la ligne en joignant les colonnes avec des tabulations
nouvelle_ligne = '\t'.join(nouvelles_colonnes) + '\n'
# Écrire la ligne modifiée dans le fichier de sortie
f_sortie.write(nouvelle_ligne)
data = np.genfromtxt(fichier_sortie, delimiter='\t', skip_header=1)
t = data[:,0] # selection de la premiere colonne
acc1 = data[:,1] # selection de la deuxieme colonne
# afficher points avec croix rouges. Inserer texte (titre, nom des axes,…)
plt.figure(1)
plt.title("Accélération selon x en fonction du temps")
plt.plot(t, acc1, c = 'red', marker = '+',label='Acc1')
plt.xlabel("t en s")
plt.ylabel("a en g")
plt.legend()
plt.show()
Ce script est disponible ici