Cours:TPS 2103 tp positionnementMoteur : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
(Asservissement en position du moteur CC)
 
(13 révisions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
 
[[Fichier:Arduino-nano-pinout.png|600px|droite]]
 
[[Fichier:Arduino-nano-pinout.png|600px|droite]]
 +
 +
<big>{{Rouge|******************************************}}</big>
 +
<big>{{Rouge|*** Apporter la malette d'informatique ***}}</big>
 +
<big>{{Rouge|******************************************}}</big>
 +
 
{{EnTeteTdInfoS2|InfoS2_positionnementMoteur_corrige}}
 
{{EnTeteTdInfoS2|InfoS2_positionnementMoteur_corrige}}
  
Ligne 5 : Ligne 10 :
 
=Asservissement en position du moteur CC=
 
=Asservissement en position du moteur CC=
  
=Esclave (target) i2c=
+
On utilise la maquette avec le moteur à courant continu déjà utilisé : [[Cours:TPS_2103_tp_regulationVitesseRessources]]
 
 
On donne les exemples suivant pour qu'un µcontroleur atmegaxxx se comporte comme un esclave i2c avec différents registres
 
{|
 
|-
 
|
 
<source lang=cpp>
 
// *******
 
// *******
 
// i2c target
 
// *******
 
// *******
 
// ne pas modifier !!!
 
// *******
 
// *******
 
 
 
// Include the required Wire library for I2C
 
#include <Wire.h>
 
 
 
const int8_t i2cAddress = 0x1A;
 
  
volatile uint16_t valPotar;
 
  
void setup() {
+
{{Question|Ecrire un programme qui permet de faire tourner le moteur d'un certain nombre de tours}}
  // Start the I2C Bus as Slave on address
+
*on utilise la roue codeuse
  Wire.begin(i2cAddress);
+
*on compte le nombre d'incréments et donc on obtient la position angulaire du rotor
  Wire.onRequest(requestEvent);
+
*on pourra ralentir la vitesse du moteur lorsqu'on s'approche de la consigne (nombre de tours à réaliser)
}
 
  
 +
=bus i2c=
 +
nous allons raccorder la carte arduino qui pilote le moteur à une seconde carte arduino sur laquelle sera relié un écran lcd en i2c.
  
void requestEvent()
+
Ces cartes seront raccordées ensemble par le bus i2c :
{
+
*la "carte arduino écran" sera le master i2c
  Wire.write(valPotar>>2);
+
*la "carte arduino moteur" sera la slave i2c
}
 
  
 +
==Esclave (target) i2c==
  
void loop() {
+
La carte sur laquelle est connectée la moteur sera programmée comme {{Rouge|slave i2c}}.
  valPotar=analogRead(A0);
 
  _delay_ms(100);
 
}
 
</source>
 
||
 
<source lang=cpp>
 
// *******
 
// *******
 
// i2c target
 
// *******
 
// *******
 
// ne pas modifier !!!
 
// *******
 
// *******
 
  
// Include the required Wire library for I2C
+
Nous avons vu [[Cours:InfoS2_tdI2cSlave|en td comment écrire un tel programme]]
#include <Wire.h>
 
  
const int8_t i2cAddress = 9;
+
==lecture i2c==
  
 +
le µcontrôleur se comportant en esclave/target i2c ne comportera pas (dans un 1er temps) de registres.
  
void setup() {
+
Une lecture sur le bus i2c permettra d'obtenir le nombre de tours effectués par le moteur.
  DDRD=0xFF;
 
  // Start the I2C Bus as Slave on address
 
  Wire.begin(i2cAddress);
 
  Wire.onReceive(receiveEvent);
 
}
 
  
void receiveEvent(int nbBytes)
+
{{Question|Ecrire les programmes permettant d'afficher sur l'écran lcd le nombre de tours parcouru par le moteur}}
{
 
    PORTD=Wire.read();
 
}
 
  
 +
'''Remarque :'''
 +
*aide pour le master :
 +
**[[Cours:InfoS2_tdI2c]]
 +
**[[Cours:InfoS2_tdI2cRegistres]]
 +
*on pourra éventuellement faire tourner le moteur à la main pour simplifier
 +
*la valeur sur le bus i2c étant codée sur 8 bits, on sera limité à 255 tours
 +
*vous pourrez modifier vos programmes pour palier ce problème :
 +
**soit en ajoutant la notion de registres
 +
**soit en demandant 2 lectures successives
  
void loop() {
+
==écriture i2c==
  _delay_ms(100);
 
}
 
  
</source>
+
lorsqu'on envoie une donnée sur le bus i2c au µcontroleur esclave moteur, cela déclenche une rotation du moteur du nombre de tours correspondant à cette valeur.
|}
 
  
=Interface écran/bouton=
+
{{Question|Ajouter à votre programme cette possibilité}}
 +
'''Remarque :'''
 +
*vous avez 2 boutons sur votre shield arduino nano, par ex
 +
**l'appui sur l'un des boutons fera tourner le moteur de 2 tours
 +
**l'appui sur l'autre boutons fera tourner le moteur de 10 tours
 +
*vous pourrez éventuellement utiliser les boutons sur l'écran pour ajouter des possibilités (et/ou le joystick)

Version actuelle datée du 19 avril 2024 à 07:01

Arduino-nano-pinout.png
******************************************
*** Apporter la malette d'informatique ***
******************************************

Fiche résumé

Retour à la liste des Tds/Tps

Éléments de correction

simuler avec simulIDE

Pensez à mettre sur la 1ère ligne de votre code :
// Compiler: Avrgcc device: nomDuMicrocontroleur


Asservissement en position du moteur CC

On utilise la maquette avec le moteur à courant continu déjà utilisé : Cours:TPS_2103_tp_regulationVitesseRessources


Question.jpg Ecrire un programme qui permet de faire tourner le moteur d'un certain nombre de tours

  • on utilise la roue codeuse
  • on compte le nombre d'incréments et donc on obtient la position angulaire du rotor
  • on pourra ralentir la vitesse du moteur lorsqu'on s'approche de la consigne (nombre de tours à réaliser)

bus i2c

nous allons raccorder la carte arduino qui pilote le moteur à une seconde carte arduino sur laquelle sera relié un écran lcd en i2c.

Ces cartes seront raccordées ensemble par le bus i2c :

  • la "carte arduino écran" sera le master i2c
  • la "carte arduino moteur" sera la slave i2c

Esclave (target) i2c

La carte sur laquelle est connectée la moteur sera programmée comme slave i2c.

Nous avons vu en td comment écrire un tel programme

lecture i2c

le µcontrôleur se comportant en esclave/target i2c ne comportera pas (dans un 1er temps) de registres.

Une lecture sur le bus i2c permettra d'obtenir le nombre de tours effectués par le moteur.

Question.jpg Ecrire les programmes permettant d'afficher sur l'écran lcd le nombre de tours parcouru par le moteur

Remarque :

  • aide pour le master :
  • on pourra éventuellement faire tourner le moteur à la main pour simplifier
  • la valeur sur le bus i2c étant codée sur 8 bits, on sera limité à 255 tours
  • vous pourrez modifier vos programmes pour palier ce problème :
    • soit en ajoutant la notion de registres
    • soit en demandant 2 lectures successives

écriture i2c

lorsqu'on envoie une donnée sur le bus i2c au µcontroleur esclave moteur, cela déclenche une rotation du moteur du nombre de tours correspondant à cette valeur.

Question.jpg Ajouter à votre programme cette possibilité Remarque :

  • vous avez 2 boutons sur votre shield arduino nano, par ex
    • l'appui sur l'un des boutons fera tourner le moteur de 2 tours
    • l'appui sur l'autre boutons fera tourner le moteur de 10 tours
  • vous pourrez éventuellement utiliser les boutons sur l'écran pour ajouter des possibilités (et/ou le joystick)