Cours:ErS2FermetureIUT : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
m (Programmation)
m (Programmation)
Ligne 65 : Ligne 65 :
  
 
==Programmation==
 
==Programmation==
<big>'''!!!Cette partie est en cours d'élaboration, ne vous y précipitez pas. Il vous manque quelques indications qui seront ajoutées Jeudi 19/03 !!!!'''</big>
 
  
A partir de maintenant l'intervalle de temps DT entre deux réceptions n'est plus considéré comme constant.
+
===Travail 1===
  
 
{{Question|
 
{{Question|
1°) Écrire un programme Arduino pour mesurer le temps en milliseconde entre deux réceptions (que vous simulerez par programme)
+
Réaliser sur Tinkercad un ensemble comprenant :
 +
* un Arduino UNO
 +
* un potentiomètre câblé sur A0
 +
* une led verte câblée sur une broche quelconque.
 
}}
 
}}
  
 
{{Question|
 
{{Question|
2°) Écrire un programme qui isole la valeur du champ '''PAPP''' d'une trame quelconque.
+
Le potentiomètre est destiné à modifier la puissance qui sera envoyée à votre programme principal. Ceci se fait à partir de votre programme par l'appel d'un sous programme fourni : '''Serial_get_trame()'''. Contrairement à ce que laisse supposé son nom, il n'a rien à voir avec une liaison série (mais il le devrait sur un compteur réel). Il est complété pour vous montrer comment l'utiliser ci-dessous.
 +
<source lang=Arduino>
 +
void setup()
 +
{
 +
  pinMode(5, OUTPUT);
 +
  Serial.begin(9600);
 +
}
 +
 
 +
char *Serial_get_trame() {
 +
  char trame[15]="PAPP 00000 ?";
 +
  uint16_t puissance;
 +
  uint8_t i;
 +
  puissance=analogRead(A0);
 +
  trame[6] = puissance/1000 + '0';
 +
  trame[7] = (puissance%1000)/100 + '0';
 +
  trame[8] = (puissance%100)/10 + '0';
 +
  trame[9] = (puissance%10) + '0';
 +
  delay(1000); // version simple
 +
  // pour la version plus compliquée décommenter la ligne suivante
 +
  //for (i=0;i<100+random(0,20);i++) delay(1);
 +
  return trame;
 +
}
 +
 
 +
void loop()
 +
{
 +
  // put your main code here, to run repeatedly:
 +
  char trame[15];
 +
  strcpy(trame , Serial_get_trame());
 +
  Serial.print("loop trame is ");
 +
  Serial.println(trame);
 +
}
 +
</source>
 +
Ce programme envoie toutes les secondes une valeur de puissance en format texte.
 +
 
 +
Faire fonctionner cet exemple en faisant bouger le potentiomètre.
 
}}
 
}}
  
 +
===Travail 2===
 +
Pour comprendre le travail demandé, il vous faut distinguer la chaîne de caractères qui contient un nombre (mais sous forme de caractères) et le nombre lui même que l'on vous demande de calculer.
 +
{{Question|
 +
Écrire un programme qui reconstitue la valeur du champ '''PAPP''' d'une trame sous forme numérique en l'envoyant par liaison série. La valeur numérique envoyée doit être identique à celle que l'on a initialement dans la trame.
 +
}}
 +
===Travail 3===
 +
{{Question|
 +
Modifier le programme précédent (Travail 2) pour utiliser les valeurs numériques reçues au fur et à mesure pour calculer l'énergie en Wh.
 +
}}
 +
 +
<u>'''Indication'''</u>
 +
 +
Vous remarquerez pour ce travail que votre appel '''strcpy(trame , Serial_get_trame());''' se fait toutes les secondes, non pas à cause d'un delay dans la boucle loop() mais à cause du delay dans '''Serial_get_trame()'''  !
 +
===Travail 4===
 
{{Question|
 
{{Question|
3°) Écrire un programme complet qui affiche correctement la led verte.
+
Écrire un programme complet qui affiche correctement la led verte tous les Wh.
 
}}
 
}}
  

Version du 19 mars 2020 à 11:41

Voici le travail que vous avez à réaliser pour la fin du projet du module M2203 :

  • rédaction d'un dossier portant sur les séances jusqu'à la fermeture à déposer sur le bureau virtuel / Mes Cours / M2203 / Devoir : 'Compte rendu carte projet µcontroleur'
    • le travail de recherche, choix des composants
    • le travail réalisé sur eagle
    • la fabrication (suivant votre avancement) de votre carte
  • simulation
    • sur tinkercad
    • fonctions arduino autorisées
    • lien vers le fichier tinkercad à envoyer à votre enseignant


Vous trouverez ci dessous quelques précisions pour les différents projets qui doivent vous aider à faire votre simulation.



fil pilote

On vous demande de faire une simulation avec Tinkercad de l’ « observateur fil pilote »

  • La partie programmée sera réalisée à l’aide d’une carte Arduino UNO.
       Il vous reste à mettre les composants sur la platine d’essais, la raccorder à la UNO et à faire le programme.
  • Pour le programme, vous pouvez au choix utiliser les fonctions Arduino ou programmer exclusivement en C.

mesure de distance par ultrason

Pas de changement pour ce projet qui se simule facilement sur tinkercad.

Vous devez donc faire la saisie du schéma avec les afficheurs, un bouton pour lancer une mesure et le module ultrason (attention il y en a 2 sur tinkercad, c'est bien le hc-sr04 !)

Quelques remarques :

  • les afficheurs sont forcément multiplexés
  • les afficheurs sont soit à anodes ou cathodes communes (propriété de l'objet)
  • connecter tous les segments sur le même port, programmation plus simple
  • un prochain td d'info pourra vous être utile pour gérer les afficheurs

téléinformation

Théorie : un peu de physique

L'information qui vous intéresse est précédée par l'étiquette PAPP (Puissance apparente) et est donnée en en Volt.ampères. On vous demande d'allumer une led verte tous les Wh.

Question.jpg Vous recevez sans arrêt la trame (partielle)

ADCO 031428005988 ?
HCHC 000643083 ^
IINST 003 Z
IMAX 029 J
PAPP 00620 )
MOTDETAT 000000 B

Au bout de combien de temps êtes vous susceptible d'allumer la led verte (si la puissance active et la puissance apparente sont égales) ?

Question.jpg En déduire le calcul que vous avez à faire à chaque réception de trame avec la donnée PAPP pour connaître à chaque réception le nombre de Wh consommé.

Indication : on notera l'intervalle de temps entre deux réceptions DT et on le supposera en millisecondes.

Programmation

Travail 1

Question.jpg Réaliser sur Tinkercad un ensemble comprenant :

  • un Arduino UNO
  • un potentiomètre câblé sur A0
  • une led verte câblée sur une broche quelconque.

Question.jpg Le potentiomètre est destiné à modifier la puissance qui sera envoyée à votre programme principal. Ceci se fait à partir de votre programme par l'appel d'un sous programme fourni : Serial_get_trame(). Contrairement à ce que laisse supposé son nom, il n'a rien à voir avec une liaison série (mais il le devrait sur un compteur réel). Il est complété pour vous montrer comment l'utiliser ci-dessous.

void setup()
{
  pinMode(5, OUTPUT);
  Serial.begin(9600);
}

char *Serial_get_trame() {
  char trame[15]="PAPP 00000 ?"; 
  uint16_t puissance;
  uint8_t i;
  puissance=analogRead(A0);
  trame[6] = puissance/1000 + '0';
  trame[7] = (puissance%1000)/100 + '0';
  trame[8] = (puissance%100)/10 + '0';
  trame[9] = (puissance%10) + '0';
  delay(1000); // version simple
  // pour la version plus compliquée décommenter la ligne suivante
  //for (i=0;i<100+random(0,20);i++) delay(1);
  return trame;
}

void loop()
{
  // put your main code here, to run repeatedly:
  char trame[15];
  strcpy(trame , Serial_get_trame());
  Serial.print("loop trame is ");
  Serial.println(trame);
}

Ce programme envoie toutes les secondes une valeur de puissance en format texte.

Faire fonctionner cet exemple en faisant bouger le potentiomètre.

Travail 2

Pour comprendre le travail demandé, il vous faut distinguer la chaîne de caractères qui contient un nombre (mais sous forme de caractères) et le nombre lui même que l'on vous demande de calculer. Question.jpg Écrire un programme qui reconstitue la valeur du champ PAPP d'une trame sous forme numérique en l'envoyant par liaison série. La valeur numérique envoyée doit être identique à celle que l'on a initialement dans la trame.

Travail 3

Question.jpg Modifier le programme précédent (Travail 2) pour utiliser les valeurs numériques reçues au fur et à mesure pour calculer l'énergie en Wh.

Indication

Vous remarquerez pour ce travail que votre appel strcpy(trame , Serial_get_trame()); se fait toutes les secondes, non pas à cause d'un delay dans la boucle loop() mais à cause du delay dans Serial_get_trame()  !

Travail 4

Question.jpg Écrire un programme complet qui affiche correctement la led verte tous les Wh.

mesure de consommation

Comme il est difficile de simuler la consommation d'un appareil USB sur tinkercad, nous utiliserons des lampes. En faisant varier la tension du générateur, le courant dans les ampoules va varier avec un maximum proche de 1A.

Vous récupérerez le schéma sur le lien suivant :

https://www.tinkercad.com/things/eCAHGzwWqyu


Câblage

vous ajouterez des afficheurs 7 segments afin d'afficher la valeur de la consommation. Bien entendu ces afficheurs doivent être multiplexé.

Attention, sur tinkercad les afficheurs peuvent être à cathodes ou anodes communes (cf propriété de l'objet).

Pensez à relier tous les segments sur le même port du µcontrôleur afin de simplifier la programmation. Un TD d'informatique embarquée à venir permettra de vous aidera si besoin pour la réalisation du programme.

Attendu

Vous devez ensuite programmer le µcontrôleur de la carte arduino UNO (atmega328p) pour afficher le courant circulant dans les lampes.

Vous pouvez utiliser les fonctions arduino. Pour la conversion analogique pensez à utiliser la fonction analogReference().