d’un générateur de tension sinusoïdale, d’amplitude 5 V et de fréquence
111 Hz.
d’une résistance \(R\) de 2 \(\Omega\) connectée aux bornes de ce générateur.
d’un ampèremètre (“A”) mesurant le courant \(I\) traversant la résistance.
d’un voltmètre (“V”) mesurant la tension \(V\) aux bornes de la
résistance.
L’idée consiste à utiliser l’oscilloscope pour observer trois signaux :
La tension \(V\).
Le courant \(I\).
La puissance \(P\) dissipée dans la résistance.
Remarque : Pour ce circuit, le quatrième signal ne sera pas utilisé;
pour ne pas qu’il s’affiche, on lui attribuera une valeur constante qui sort de
la fenêtre, par exemple 100.
Procédure à suivre :
Recopier le programme de l’oscilloscope dans un nouveau programme prog-6.py.
Code de l’oscilloscope:
importmathimportpygameimportsys# Fonctionsdefdessiner_pointilles_h(surface,couleur,y):n=dimensions_fenetre[0]//(longueur_pointille*2)foriinrange(n+1):x1=int((i-0.25)*longueur_pointille*2)x2=x1+longueur_pointillepygame.draw.line(surface,couleur,(x1,y),(x2,y))returndefdessiner_pointilles_v(surface,couleur,x):n=dimensions_fenetre[1]//(longueur_pointille*2)foriinrange(n+1):y1=(i-0.25)*longueur_pointille*2y2=y1+longueur_pointillepygame.draw.line(surface,couleur,(x,y1),(x,y2))returndefafficher_grille():yc=dimensions_fenetre[1]//2nh=yc//taille_grilleforiinrange(1,nh+1):dessiner_pointilles_h(fenetre,GRIS,yc+i*taille_grille)dessiner_pointilles_h(fenetre,GRIS,yc-i*taille_grille)pygame.draw.line(fenetre,GRIS,(0,yc),(dimensions_fenetre[0],yc))nv=dimensions_fenetre[0]//taille_grilleforiinrange(0,nv+1):dessiner_pointilles_v(fenetre,GRIS,i*taille_grille)returndefgenerer_signaux(delta_t):PERIODE_1=0.009PERIODE_2=0.003PERIODE_3=0.0015PERIODE_4=0.0045AMPL_1=10AMPL_2=5AMPL_3=3AMPL_4=2globalsignaux_initialises,a1,a2,a3,a4ifnotsignaux_initialises:a1=0a2=0a3=0a4=0signaux_initialises=Truereturn(0,0,0,0)a1=math.fmod(a1+delta_t*2*math.pi/PERIODE_1,2*math.pi)a2=math.fmod(a2+delta_t*2*math.pi/PERIODE_2,2*math.pi)a3=math.fmod(a3+delta_t*2*math.pi/PERIODE_3,2*math.pi)a4=math.fmod(a4+delta_t*2*math.pi/PERIODE_4,2*math.pi)return(AMPL_1*math.cos(a1),AMPL_2*math.cos(a2),AMPL_3*math.cos(a3),AMPL_4*math.cos(a4))defacquisition(t):globalacquisition_initialisee,t_signaux_precifacquisition_initialisee:dt=t-t_signaux_precifdt<=0:print("erreur de timing")sys.exit()whiledt>t_echantillons:generer_signaux(t_echantillons)dt-=t_echantillonss=generer_signaux(dt)else:s=(0,0,0,0)acquisition_initialisee=Truet_signaux_prec=treturnsdefafficher_signal(x,v,couleur,gain):y=dimensions_fenetre[1]//2-v*gainpygame.draw.line(fenetre,couleur,(x,y-5),(x,y+5))returndefafficher_trame(temps_maintenant):signaux_prec=acquisition(temps_maintenant)forxinrange(dimensions_fenetre[0]):temps_maintenant+=t_echantillonssignaux=acquisition(temps_maintenant)if(signaux[0]>=seuil_triggerandsignaux_prec[0]<seuil_trigger):breaksignaux_prec=signauxforxinrange(dimensions_fenetre[0]):temps_maintenant+=t_echantillonssignaux=acquisition(temps_maintenant)foriinrange(4):afficher_signal(x,signaux[i],couleur_signaux[i],gain_signaux[i])returndefafficher_trigger():y=dimensions_fenetre[1]//2-seuil_trigger*gain_signaux[0]pygame.draw.line(fenetre,ROUGE,(0,y),(20,y),5)return# ConstantesBLEUCLAIR=(127,191,255)CYAN=(0,255,255)GRIS=(127,127,127)JAUNE=(255,255,0)MAGENTA=(255,0,255)ROUGE=(255,0,0)VERT=(0,255,0)# Paramètresdimensions_fenetre=(800,600)# en pixelsimages_par_seconde=25taille_grille=100longueur_pointille=10t_trame=0.010t_echantillons=t_trame/dimensions_fenetre[0]seuil_trigger=5seuil_trigger_delta=0.2couleur_signaux=[JAUNE,CYAN,MAGENTA,VERT]gain_signaux=[20,20,20,20]# Initialisationpygame.init()fenetre=pygame.display.set_mode(dimensions_fenetre)pygame.display.set_caption("Programme 4")horloge=pygame.time.Clock()couleur_fond=BLEUCLAIRpygame.key.set_repeat(10,10)acquisition_initialisee=Falsesignaux_initialises=False# DessinwhileTrue:forevenementinpygame.event.get():ifevenement.type==pygame.QUIT:pygame.quit()sys.exit()elifevenement.type==pygame.KEYDOWN:ifevenement.key==pygame.K_UP:seuil_trigger+=seuil_trigger_deltaelifevenement.key==pygame.K_DOWN:seuil_trigger-=seuil_trigger_deltatemps_maintenant=pygame.time.get_ticks()/1000fenetre.fill(couleur_fond)afficher_trame(temps_maintenant)afficher_trigger()afficher_grille()pygame.display.flip()horloge.tick(images_par_seconde)
Modifier la fonction generer_signaux() :
Le premier signal, correspondant à la tension \(V\), doit
être un signal périodique similaire à ceux du programme 4, d’amplitude
5 V et de fréquence 111 Hz.
Le deuxième signal, représentant le courant \(I\), peut se calculer
à partir de \(V\) grâce à la loi d’Ohm pour la résistance:
\[V = R \times I.\]
Le troisième signal, égal à la puissance dans la résistance, vaut
\[P = V \times I.\]
Comme discuté précédemment, le quatrième signal prend la valeur constante
100 de façon à ne pas être visible dans la fenêtre.
Essayer votre programme. Le résultat correspond-t-il à ce que vous
attendiez?
Lorsque le programme fonctionne, le déposer sur la platforme de soumission,
avec le suffixe prog-6.py.
Pour la suite de ce programme, nous allons simuler une variante du circuit précédent :
La seule différence est que le générateur produit maintenant un signal
carré d’amplitude 5 V et de fréquence 222 Hz. Cela signifie que ce signal
est égal à 5 V pendant la moitié de sa période, et à 0 V pendant l’autre
moitié.
Les modifications à apporter à votre code pour remplacer le signal sinusoïdal
par ce signal carré devraient être minimales. (En particulier, le calcul des
valeurs de \(I\) et de \(P\) devraient rester inchangés.) Le programme
fournit-il le résultat attendu? Si oui, déposez-le sur la platforme de soumission,
avec le suffixe prog-6-square.py.
La tension \(V_1\) produite par le générateur, qui prend comme pour le
programme 6 la forme d’un signal carré de fréquence 222 Hz.
La tension \(V_2\) aux bornes du condensateur.
Le courant \(I\) traversant la résistance et le condensateur
(mesuré par l’ampèremètre “A”).
La puissance \(P\) échangée avec le condensateur.
Les modifications à apporter au programme 6 sont les suivantes
(effectuez-les dans un nouveau programme prog-7.py). Dans la
fonction generer_signaux() :
La tension \(V_1\) est générée de la même façon que la tension
\(V\) dans le programme 6 version square.
La tension \(V_2\) dépend du niveau de charge du condensateur.
Le plus simple consiste à représenter cette tension par une nouvelle
variable globale tension_condensateur qui sera gérée par la fonction
generer_signaux(). Initialement, on peut considérer que cette tension
est nulle (c’est-à-dire, que le condensateur est déchargé au début de la
simulation).
A partir de \(V_1\) et de \(V_2\), le courant \(I\) peut
se calculer en appliquant la loi d’Ohm aux bornes de la résistance:
\[I = \frac{V_1 - V_2}{R}.\]
La valeur du courant \(I\) permet de mettre à jour la tension du
condensateur, celui-ci se chargeant si \(I\) est positif et se
déchargeant s’il est négatif; Pendant le pas de temps \(\textit{dt}\)
de la simulation, la tension \(V_2\) (mémorisée dans
tension_condensateur) doit évoluer selon la loi :
La puissance échangée avec le condensateur est donnée par le produit
\[P = V_2 \times I.\]
Note importante : Pour que les signaux 3 et 4 soient visibles,
vous devez modifier le gain qui leur est appliqué dans le
programme. Pour les valeurs proposées des composants, un gain de
20000 pour ces deux signaux produit un bon résultat.
Après avoir implémenté ces modifications dans votre programme,
qu’observez-vous? N’hésitez pas à expérimenter en modifiant
la valeur de R et de C. Les signaux obtenus correspondent-ils à ce que
prévoit la théorie?
Une fois que votre programme est au point,
déposez-le dans le répertoire des laboratoires, avec le suffixe
prog-7.py.
Il reste à présent à simuler le même circuit, mais avec un générateur
sinusoïdal :
Les modifications à apporter au programme sont simples. Cette fois,
avant de les effectuer et de tester l’application, essayez de dessiner
sur une feuille de papier la forme des quatre signaux qui devraient être
obtenus. Comparez ensuite vos prédictions avec le résultat de l’expérience.
Déposez enfin votre programme dans le répertoire centralisé, avec le
suffixe prog-7-sin.py.