Conclusion
La méthode retenue pour le mesurage[1] des grandeurs i et u a été celle consistant à utiliser un micro-contrôleur Arduino commandé par un programme en Python. Des mesures de tension à l'aide d'un multimètre numérique 2000 points n'ont pas montré de décalage significatif entre les mesures issues des deux méthodes de mesurage. En revanche, il convient de raisonner sur la valeur de la résistance étalon permettant d'accéder à la grandeur intensité du courant. Si la résistance étalon est trop faible par rapport à la résistance totale des dipôles en série, alors la mesure de la tension à ses bornes ne sera que quelques dizaines de fois la valeur du pas du CAN. L'erreur sur la mesure de i peut être importante. Un multimètre numérique dispose de plusieurs résistances étalons selon le calibre utilisé pour la mesure de l'intensité (20 mA, 200 mA, 2000 mA, 10 A...)
Le programme Python est tout à fait perfectible. Il ne réalise pas la validité des données saisies par l'opérateur, ce qui est une source de plantage. Les caractéristiques produites méritent d'être mieux légendées, nuage de points et modèle.
# Créé par Gilles Claudel, le 21/11/2018 en Python 3.4
from commandesPython import Arduino
import time
import os
import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as st
def fichImage(ref, nb):
os.makedirs("u=f(i)",exist_ok=True)
image = "u=f(i)/caracteristique_R" + ref + "_n" + str(nb) + "_modelisee.png"
plt.savefig(image, dpi=300) #sauvegarde du fichier image de la caractéristique u = f(i)
return(0)
def fichMes(ref, nb, i, u):
os.makedirs("mesures",exist_ok=True)
fichier = "mesures/fichier_R" + ref + "_n" + str(nb) + ".txt"
mes_mesures = open(fichier, "w") #création ou écrasement d'un fichier ouvert en écriture
j = 0
mes_mesures.write("i (A),u (V)\n") #entête du fichier de mesure
while j < nb:
mes_mesures.write(str(i[j]/1000)+","+str(u[j])+"\n") #Le séparateur est la virgule pour Geogebra
j = j + 1
mes_mesures.close() #fermeture du fichier texte
return(0)
def incertitudeType_u (i, u, a, b, n):
src = 0
for k in range(n):
src = src + (u[k]-(a*i[k]+b))**2 #résidu au carré
sigma_u = np.sqrt(1/(n-2)*src)
return sigma_u
def notation(valeur, erreur, cs):
n = int(np.log10(valeur))
a = round(valeur/10**n,cs)
err = round(erreur/10**n,cs)
sortie = "\\left("+str(a)+" \\pm"+str(err)+" \\right) \\times 10^{"+str(n)+"}"
return sortie
k=0
u=[]
i=[]
R=[]
port = "COM3" #à modifier si besoin
ard = Arduino(port) #La classe Arduino permet de communiquer via le port série avec le micro-contrôleur
#On teste les saisies et on vérifie si ce sont bien des nombres
dipole = input("Valeur de référence de la résistance ?\n")
while True:
try:
r = float(input("Valeur de la résistance étalon pour la mesure de l'intensité ?\n"))
break
except ValueError:
print("Entrez un nombre.")
while True:
try:
n = int(input("Nombre de mesures ?\n"))
break
except ValueError:
print("Entrez un nombre entier.")
print("Faire varier l'intensité du courant dans le dipôle pendant environ 5 secondes")
time.sleep(0.5)
#Période d'échantillonnage
T_e = 5.0/n #durée entre deux mesures telle que la durée totale soit de 5 s
while k < n:
sensorU2 = ard.analogRead(0) #La lecture d'une entrée analogique et sa conversion A/N : ce n'est pas instantané
time.sleep(0.001)
sensorUr = ard.analogRead(1)
time.sleep(0.001)
sensorGND = ard.analogRead(2)
time.sleep(0.001)
u.append(((sensorU2-sensorUr)/1023.0)*5.0) #u en V : u = u_2 - u_r
i.append(((sensorUr-sensorGND)/1.023)*5.0/r) #i en mA : i = u_r / r
k = k + 1
time.sleep(T_e)
ard.close() #Après n mesures, on libère le port de communication
#
# Travail de l'élève
# - représenter un nuage de points associé à la caractéristique du dipôle
# - modéliser la caractéristique de ce dipôle
#
# Création du fichier texte de mesures pour une 1re exploitation dans Geogebra
fichMes(dipole, n , i, u)
time.sleep(1)
# On vide les listes i et u
i = []
u = []
# On rouvre le fichier
file = "mesures/fichier_R" + dipole + "_n" + str(n) + ".txt"
i,u = np.loadtxt(file, delimiter=',', skiprows=1, unpack='true')
titre = "Caractéristique courant/tension d'un dipôle ohmique"
titreX = "intensité en mA"
titreY = "tension en V"
# arrondi au milliampère supérieur de la valeur maximale de i
i_max = 1000*np.ceil(10**np.ceil(-np.log10(np.max(i)))*np.max(i))*10**np.floor(np.log10(np.max(i)))
u_max = np.ceil(np.max(u)) #arrondi au volt supérieur de la valeur maximale de u
# Etude statistique
a, b, r_value, p_value, std_err = st.linregress(i, u)
i_mod = np.concatenate((i,[0.0, i_max]))
modele = np.concatenate((a*i+b,[b, a*i_max+b]))
soustitre = "u = "+ str(round(a,0)) + " i +" + str(round(b,2))
legende = r"$R="+notation(a, std_err, 2)+"\;\Omega$"
t = 0.6*i_max #abscisse de la légende
# Nuage de points à partir des première et deuxième colonnes du fichier texte
# Tracé du modèle linéaire
# On convertit l'intensité en mA
plt.scatter(1000*i, u, marker='+') # i en mA, car i est en A dans le fichier texte
yErrorValues = [incertitudeType_u(i, u, a, b, n) for m in range(n)]
plt.errorbar(1000*i, u, yerr = yErrorValues, fmt = 'none', capsize = 2, elinewidth = 1, ecolor = 'green', zorder = 1)
plt.plot(1000*i_mod, modele, c='r', label='modèle linéaire')
plt.suptitle(titre)
plt.title(soustitre)
plt.xlabel(titreX)
plt.ylabel(titreY)
plt.axis([0,i_max,0,u_max])
# On annote le modèle en précisant la pente et son incertitude-type
plt.annotate(legende,xy=(t, a*t/1000+b), xycoords='data',xytext=(-150, +50), textcoords='offset points', fontsize=14, arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))
# Sauvegarde en image de la caractéristique
fichImage(dipole, n)
plt.show()
plt.close()
L'archive contient les trois programmes (deux en Python et un en C++), des exemples de caractéristiques et le fichier Geogebra.
Le choix du tableur de Geogebra nous a semblé pertinent. L'outil est libre ; il est performant au niveau de l'analyse statistique, adapté aux programmes de mathématiques de lycée et permet de simuler les comportements des dipôles. Des activités hors la classe, tutorées, utilisant un groupe Geogebra sont un moyen de poursuivre l'activité au-delà de la séance.
Pour revenir aux objectifs d'apprentissage, l'activité se veut différente de ce que les élèves de collège ont pu faire autour de la loi d'Ohm et met l'accent sur la mesure et les incertitudes associées avec une approche qualitative et grandement étayée par les outils numériques. Elle est réalisable sur une séance d'une heure et vingt-cinq minutes à la condition que les élèves ne découvrent pas le langage Python. Une capsule vidéo leur montrant, en amont, comment relier des composants sur la breadboard à partir d'un schéma est souhaitable.
Représenter la caractéristique d'un dipôle et son modèle à l'aide d'un langage de programmation (Python).
La vidéo décrit l'utilisation du microcontrôleur, du programme Python et des outils d'analyse statistique : Geogebra.