IMA4 2018/2019 EC2 : Différence entre versions

De Wiki d'activités IMA
(Matériel nécessaire)
(Travail effectué)
 
(23 révisions intermédiaires par le même utilisateur non affichées)
Ligne 158 : Ligne 158 :
 
== Travail effectué ==
 
== Travail effectué ==
  
Cette section est consacrée à la réalisation du PCB de la partie Matrice de LED. Afin de comprendre le travail à réaliser, voyons voir d'abord les composants nécessaires individuellement.
+
Cette section est consacrée à la réalisation du PCB de la partie Matrice de LED. Afin de comprendre le travail à réaliser, voyons voir d'abord les différentes parties de plus près.
  
 +
 +
'''Partie Hardware : CONCEPTION DU PCB'''
 +
 +
La première partie du travail est consacrée à la conception et la mise en marche de la carte pour la partie matrice de LEDs.
  
 
'''''La matrice de LED'''''
 
'''''La matrice de LED'''''
  
La matrice de LEDs utilisée ici est une matrice 8x8 composée de LEDs CMS unicolores. Elle dispose de 16 broches. Le schématique de la matrice utilisée est le suivant :  [[Fichier:Luckylight-KWM-30881CVB-LED-Matrix-Datasheet-Diagram.jpg|center|Matrice de LED]]
+
La matrice de LEDs est entièrement réalisée à partir de LEDs CMS de boîtier 0803 .
Nous utiliserons le modèle AVB (anodes connectées aux rangées et cathodes aux colonnes). Les colonnes correspondant aux cathodes seront mises à la masse. Concernant les rangées, afin de respecter le cahier des charges, nous connecterons 8 pins des drivers TLC5947 à chaque rangée. Afin d'allumer les LED de la matrice, il faut faire attention à respecter les pins du module. Comme vous pouvez le constater en regardant la précédente image, les rangées sont connectées aux broches 9, 14, 8, 12, 1, 7, 2, 5 tandis que les colonnes sont connectées aux broches 13, 3, 4, 10, 6, 11, 15, 16. Si on désire, par exemple, allumer la LED située rangée 4 colonne 5, il faudrait donc mettre la broche 6 à la masse et injecter un courant sur la broche 12.  
+
Le principe du montage est similaire à celui de la matrice de LEDs 8x8 de Sparkfun. Les anodes de chaque LEDs sont reliées entre elles à un régulateur de tension qui fournira 3.3 V à sa sortie (sachant qu'on lui impose une certaine tension en entrée sans dépasser les 15 V), suffisant pour alimenter les LEDs. Chacune des broches de sortie des TLC (OUT0...OUT23) est reliée à la cathode d'une LED.
  
  
 
'''''Le TLC5947'''''
 
'''''Le TLC5947'''''
  
Il s'agit d'un driver de contrôle de LED composé de 24 pins de sorties. Son schématique est le suivant :  
+
Il s'agit d'un driver de contrôle de LED composé de 24 pins de sorties et 8 pin dédiées à la communication avec l'Atmega328p et les autres TLC5947 utilisés dans le montage. Son schématique est le suivant :  
[[Fichier:Téléchargement.jpg|center|TLC5947]]
+
[[Fichier:TLC5947.png|200px|thumb|center|TLC5947]]
En le connectant via le connecteur ICSP de l'Arduino, on peut contrôler l'allumage des LEDs par le biais de ce driver. Dans notre cas, on souhaite pouvoir allumer plusieurs LED en même temps or une pin du driver ne permet d'allumer qu'une LED à la fois. Il faut donc 8 pins du TLC5947 pour former un octet et les connecter sur une même rangée de la matice pour pouvoir contrôler les 8 LEDs de cette rangée. Sachant que la matrice est composée de 64 LEDs, il faut donc 3 drivers TLC5947 (3x24 = 72 pins disponibles donc 9 octets possibles).
+
En le connectant via le connecteur ICSP de l'Arduino, on peut contrôler l'allumage des LEDs par le biais de ce driver. Dans notre cas, on souhaite pouvoir allumer les LEDs de notre matrice tout en contrôlant leur luminosité. Chaque TLC doit pouvoir contrôler chaque LED indépendamment.
 +
 
 +
Ces paramètres étant pris en compte, nous aboutissons au schématique suivant :
 +
[[Fichier:MatriceLEDRex_schema.png|200px|thumb|center|Matrice de LED]]
 +
 
 +
Et donc le PCB suivant :
 +
[[Fichier:MatriceLEDRex_circuit_imprime.png|200px|thumb|center|Matrice de LED]]
 +
 
 +
Le PCB étant créé, il reste à encore à faire graver la carte et souder les composants.
 +
Une fois la carte gravée et les composants soudés, nous obtenons le montage suivant :
 +
[[Fichier:Carte_matrice.jpg|200px|thumb|center|Carte matrice de LEDs]]
 +
 
 +
Vous l'aurez constatez, des fils ont été ajoutés sur la carte. La LED servant à la vérification de l'alimentation de la carte ne s'allumait pas malgré que la carte était alimentée. Cela provenait du fait que celle-ci était isolée du montage, c'est-à-dire ses pins étaient bien connectées aux pins correspondantent du 328p mais n'étaient pas reliées à la masse et au +5V de la carte : ainsi la LED était fonctionnelle mais non alimentée. Nous avons donc créé un pont électrique (ou strap) entre l'anode de LED et le +5V de la carte et un autre pont entre la sortie de la résistance connectée à la cathode de la LED et la masse de carte par le biais de ces fils.
 +
 
 +
La carte est donc opérationnelle et prête à l'emploi comme vous pourrez le voir sur l'image suivante :
 +
[[Fichier:Carte_matrice_allumee.jpg|thumb|200px|center|Carte matrice de LEDs fonctionnelle]]
 +
 
 +
'''Partie Software : GESTION DE LA LIAISON SPI'''
 +
 
 +
La deuxième partie est dédiée à la programmation du micro-contrôleur de la matrice. Le micro-contrôleur doit attendre l'état des LEDs qui lui sera transmis via la communication SPI. Cela signifie donc que l'ATMega328p de la matrice doit donc être configuré dans le mode SPI esclave. Via cette communication, nous transmettons 64 octets de donnée codant chacun l'intensité lumineuse de la matrice.
 +
 
 +
Les LEDs n'étant pas soudées dans l'ordre prévu afin de mieux organiser l'espace sur la carte, nous avons dû effectuer une remise en ordre au préalable des LEDs. Pour cela, nous avons construit un 8 tableaux ou groupes auxquels nous avons affecté chacun un tableau de pointeurs. Le but du tableau de pointeur est d'aller récupérer l'adresse de la LED à allumer contenue dans le tableau correspondant. De cette manière on réorganise l'ordre d'allumage de nos LEDs.
 +
[[Fichier:Remise en ordre matrice.png|200px|thumb|center|Tableaux et pointeurs de tableaux pour la mise en ordre]]
 +
 
 +
Grâce à la fonction void matrice, nous récupérons le message reçu sur la liaison ISP et les tableaux de pointeurs créés afin de bien répartir le message reçu sur nos 8 tableaux de pointeurs. Nous gérons également la luminosité grâce à un facteur que nous appliquons sur les tableaux (facteur fixé, ici, à 255).
 +
[[Fichier:Tableau_pt.png|200px|thumb|center|Création des tableaux de pointeurs]]
 +
 
 +
Afin de communiquer via la liaison ISP, nous utilisons la fonction spi_exch(uint8_t output) grâce à laquelle notre 328p en mode "Slave" reçoit les octets émis par la partie contrôle qui est en mode "Master". Nous les stockons dans une variable chacun et utilisons la fonction matrice pour les dispatcher dans nos tableaux de pointeurs.
 +
[[Fichier:spi_exch.png|200px|thumb|center|Fonction de réception des octets]]
 +
 
 +
Ceci étant fait, nous avons programmé en Arduino la partie maître (car la parte contrôle n'était pas encore terminée) dans laquelle nous avons construit une fonction sendISP qui prend en paramètre l'octet à envoyer et sélectionne l'esclave qui le reçoit.
 +
 
 +
Ceci étant terminé, nous sommes désormais en mesure d'afficher un caractère sur la matrice de LED via la liaison ISP. Dans l'exemple ci-après, nous avons affichons un "1" sur notre matrice. Vous remarquerez que 2 LEDs sont éteintes. Cela provient sans doute d'une mauvaise affectation des LEDs dans notre tableau de pointeurs. Le programme est améliorable mais reste tout de même fonctionnel. Si le caractère souhaité ne s'affiche pas immédiatement, d'ébranchez puis rebranchez l'Arduino.
 +
[[Fichier:Matrice_char_un.jpg|thumb|200px|center|Affichge du caractère "1"]]
 +
 
 +
[[Fichier:Vue_moniteur_serie.jpg|thumb|200px|center|Vue sur le moniteur série du maître]]
  
 
== Documents ==
 
== Documents ==
 +
[[Fichier:EC2_Matrice_LEDS.zip]]

Version actuelle datée du 6 avril 2019 à 22:41

Présentation du projet

Contexte

L'élève continue son semestre S8 à l'école.

Objectif

Le but est de concevoir une partie d'une platine de travaux pratiques pour l'ordonnancement. Il faut aussi programmer le micro-contrôleur intégré.

Description du projet

La platine sera constituée de 3 parties bien distinctes :

  • la partie "contrôle" composée d'un ATMega328p, d'un FT232, d'un connecteur USB, de deux LED et de deux boutons, l'ordonnanceur doit être chargé sur ce micro-contrôleur ;
  • la partie matrice de LED, il s'agit d'une matrice de 8x8 LED CMS monochromes contrôlées par un ATMega328p et 3 pilotes de LED TLC5947 ;
  • la partie afficheur 7-segments, il s'agit de 6 afficheurs 7-segments implantés avec des LED CMS monochromes et contrôlés par un ATMega328p et 2 pilotes de LED TLC5947.

La communication entre la partie "contrôle" et les deux autres parties s'effectue via un bus SPI. Les trois parties sont conçues et réalisées séparément mais doivent s'interconnecter facilement. Les 3 PCB sont rectangulaires et doivent s'assembler aussi sous la forme d'un rectangle. Pour passer les lignes SPI et l'alimentation, des connecteurs doivent être prévus sur les 3 PCB. Vous commencerez par vous mettre d'accord sur les dimensions des PCB et sur l'emplacement des connecteurs. Une première phase de conception des PCB avec placement des composants peut être nécessaire pour cette étape.

Vous êtes chargé de réaliser la matrice de LED. Vous trouverez, sur les Wiki IMA, des exemples de cartes avec ATMega328p et TLC5947. Partez de l'un de ces exemples. Utilisez le logiciel Fritzing pour la conception de la carte. N'oubliez pas le connecteur ICSP pour la première programmation du micro-contrôleur.

Une fois la carte fonctionnelle vous programmerez le micro-contrôleur pour attendre l'état des LED par communication SPI. Votre ATMega328p doit donc être configuré dans le mode SPI esclave. Utilisez le même protocole de transmission des données que la matrice de LED RGB de SparkFun. Il y aura donc transfert de 64 octets de données. Pour votre matrice chaque octet ne codera pas la couleur de la LED correspondante mais son intensité lumineuse. Si la partie contrôle n'est pas opérationnelle, il sera possible de tester votre matrice avec un Arduino Uno et l'exemple de programme disponible sur le site de SparkFun.

Matériel nécessaire

Description Fabricant Référence Fabricant Fournisseur Quantité Lien fournisseur
LEDs CMS boîtier 0603 RS-Online 3
LEDs CMS boîtier 0805 ROHM SMLMN2BCTT86C RS-Online 64 LEDs matrice
Résistance 220 Ohms CMS Panasonic ERJ3EKF2200V RS-Online 3 Résistance 220 Ohms
Résistance 2.2 kOhms CMS Panasonic ERA3ARB222V RS-Online 3 Résistance 2.2 kOhms
Résistance 10 kOhms CMS Panasonic ERA3AEB103V RS-Online 1 Résistance 10 kOhms
Résistance 33 kOhms CMS Panasonic ERA3ARB333V RS-Online 1 Résistance 33 kOhms
Résistance 1 MOhms CMS Panasonic ERJ3EKF1004V RS-Online 1 1 Résistance MOhms
Condensateurs 10 pF CMS KEMET C0603C100J5GACAUTO RS-Online 2 Condensateurs 10 pF
Condensateurs 100 nF CMS KEMET C0603C104K9RACTU RS-Online 1 Condensateurs 100 nF
Condensateurs 10 µF CMS Murata GRT188R61E106ME13D RS-Online 3 Condensateurs 10 µF
TLC5947 CMS Texas Instrument TLC5947DAP RS-Online 3 TLC5947
Atmega328p CMS Microchip Technology ATMEGA328P-AN RS-Online 1 Atmega328p
Régulateur 3.3V Linear Technology LT1117CM-3.3#PBF RS-Online 1 Régulateur de tension
Connecteur ICSP 1
Connecteur femelle 6 ports 1
Quartz QANTEK QCS8.00000F18B23R RS-Online 1 Quartz
Bouton poussoir CMS 1

Planning prévisionnel

  • Vendredi 15 Février 2019 : lecture de l'énoncé et début des recherches;
  • Semaine du 18 au 24 Février 2019 : conception et validation du schématique puis routage et commande des composants;
  • Semaine du 25 Février au 03 Mars 2019 : Réalisation du PCB (si matériel disponible), test avec un Arduino Uno (si partie contrôle non fonctionnelle);
  • Semaine du 4 au 10 Mars 2019 : finalisation des test.

Objectif : rendre fonctionnelle la partie matrice de LED avant le 05 Avril 2019.

Travail effectué

Cette section est consacrée à la réalisation du PCB de la partie Matrice de LED. Afin de comprendre le travail à réaliser, voyons voir d'abord les différentes parties de plus près.


Partie Hardware : CONCEPTION DU PCB

La première partie du travail est consacrée à la conception et la mise en marche de la carte pour la partie matrice de LEDs.

La matrice de LED

La matrice de LEDs est entièrement réalisée à partir de LEDs CMS de boîtier 0803 . Le principe du montage est similaire à celui de la matrice de LEDs 8x8 de Sparkfun. Les anodes de chaque LEDs sont reliées entre elles à un régulateur de tension qui fournira 3.3 V à sa sortie (sachant qu'on lui impose une certaine tension en entrée sans dépasser les 15 V), suffisant pour alimenter les LEDs. Chacune des broches de sortie des TLC (OUT0...OUT23) est reliée à la cathode d'une LED.


Le TLC5947

Il s'agit d'un driver de contrôle de LED composé de 24 pins de sorties et 8 pin dédiées à la communication avec l'Atmega328p et les autres TLC5947 utilisés dans le montage. Son schématique est le suivant :

TLC5947

En le connectant via le connecteur ICSP de l'Arduino, on peut contrôler l'allumage des LEDs par le biais de ce driver. Dans notre cas, on souhaite pouvoir allumer les LEDs de notre matrice tout en contrôlant leur luminosité. Chaque TLC doit pouvoir contrôler chaque LED indépendamment.

Ces paramètres étant pris en compte, nous aboutissons au schématique suivant :

Matrice de LED

Et donc le PCB suivant :

Matrice de LED

Le PCB étant créé, il reste à encore à faire graver la carte et souder les composants. Une fois la carte gravée et les composants soudés, nous obtenons le montage suivant :

Carte matrice de LEDs

Vous l'aurez constatez, des fils ont été ajoutés sur la carte. La LED servant à la vérification de l'alimentation de la carte ne s'allumait pas malgré que la carte était alimentée. Cela provenait du fait que celle-ci était isolée du montage, c'est-à-dire ses pins étaient bien connectées aux pins correspondantent du 328p mais n'étaient pas reliées à la masse et au +5V de la carte : ainsi la LED était fonctionnelle mais non alimentée. Nous avons donc créé un pont électrique (ou strap) entre l'anode de LED et le +5V de la carte et un autre pont entre la sortie de la résistance connectée à la cathode de la LED et la masse de carte par le biais de ces fils.

La carte est donc opérationnelle et prête à l'emploi comme vous pourrez le voir sur l'image suivante :

Carte matrice de LEDs fonctionnelle

Partie Software : GESTION DE LA LIAISON SPI

La deuxième partie est dédiée à la programmation du micro-contrôleur de la matrice. Le micro-contrôleur doit attendre l'état des LEDs qui lui sera transmis via la communication SPI. Cela signifie donc que l'ATMega328p de la matrice doit donc être configuré dans le mode SPI esclave. Via cette communication, nous transmettons 64 octets de donnée codant chacun l'intensité lumineuse de la matrice.

Les LEDs n'étant pas soudées dans l'ordre prévu afin de mieux organiser l'espace sur la carte, nous avons dû effectuer une remise en ordre au préalable des LEDs. Pour cela, nous avons construit un 8 tableaux ou groupes auxquels nous avons affecté chacun un tableau de pointeurs. Le but du tableau de pointeur est d'aller récupérer l'adresse de la LED à allumer contenue dans le tableau correspondant. De cette manière on réorganise l'ordre d'allumage de nos LEDs.

Tableaux et pointeurs de tableaux pour la mise en ordre

Grâce à la fonction void matrice, nous récupérons le message reçu sur la liaison ISP et les tableaux de pointeurs créés afin de bien répartir le message reçu sur nos 8 tableaux de pointeurs. Nous gérons également la luminosité grâce à un facteur que nous appliquons sur les tableaux (facteur fixé, ici, à 255).

Création des tableaux de pointeurs

Afin de communiquer via la liaison ISP, nous utilisons la fonction spi_exch(uint8_t output) grâce à laquelle notre 328p en mode "Slave" reçoit les octets émis par la partie contrôle qui est en mode "Master". Nous les stockons dans une variable chacun et utilisons la fonction matrice pour les dispatcher dans nos tableaux de pointeurs.

Fonction de réception des octets

Ceci étant fait, nous avons programmé en Arduino la partie maître (car la parte contrôle n'était pas encore terminée) dans laquelle nous avons construit une fonction sendISP qui prend en paramètre l'octet à envoyer et sélectionne l'esclave qui le reçoit.

Ceci étant terminé, nous sommes désormais en mesure d'afficher un caractère sur la matrice de LED via la liaison ISP. Dans l'exemple ci-après, nous avons affichons un "1" sur notre matrice. Vous remarquerez que 2 LEDs sont éteintes. Cela provient sans doute d'une mauvaise affectation des LEDs dans notre tableau de pointeurs. Le programme est améliorable mais reste tout de même fonctionnel. Si le caractère souhaité ne s'affiche pas immédiatement, d'ébranchez puis rebranchez l'Arduino.

Affichge du caractère "1"
Vue sur le moniteur série du maître

Documents

Fichier:EC2 Matrice LEDS.zip