Carte contrôleur de matrice de LEDs

De Wiki de Projets IMA

Cahier des charges

Présentation générale du projet

Il est vous est demandé de réaliser une carte électronique avec des composants de surface pour gérer une matrice de LEDs. La matrice de LEDs peut être monochrome mais sa taille sera au minimum 8x8. Le contrôle de la matrice se fera par un micro-contrôleur ATMega328P à l'aide de registres de décalage. Il faut prévoir des connecteurs pour envoyer les données à votre carte par bus SPI. A chaque réception de paquets de 8 octets l'affichage est mis à jour sur la matrice.

Le programme de gestion de la matrice sera écrit en C pour avr-gcc. Pour la partie SPI, aidez-vous éventuellement des programmes déjà écrits pour le projet "ordonnanceur" de 2014/2015 (Malette Arduino éducative I).

Liste de matériel

Comme le stipule le cahier des charges, les composants suivants doivent être des CMS (composants montés en surface). Voici les divers composants nécessaires à la réalisation du projet :

  • Un microcontrôleur Atmega328p qui permettra le contrôle de la carte.
  • Une matrice de leds 8x8 pour l'affichage.
  • Des barrettes de connexion afin d'y placer notre matrice de leds et la connexion SPI.
  • Un registre à décalage pour l'envoi des données.
  • Un quartz pour établir une fréquence de travail sur la carte.
  • Un buffer d'amplification de courant en entrée des leds.
  • Des condensateurs pour le montage oscillateur du quartz.
  • Des résistances de protection sur les entrées du microcontrôleur.
  • Une LED (accompagnée d'un condensateur et d'une résistance) pour s'assurer que le montage soit bien alimenté.

Avancement du Projet

Choix techniques

  • Le système fonctionnera sous une tension de 5 V.
  • Afin de piloter notre matrice de leds sur la carte, on propose d'insérer des connecteurs (barrettes).
  • Pour fournir un signal d'horloge à notre microcontrôleur, afin qu'il puisse générer des signaux à intervalles réguliers, on pourra utiliser un montage oscillateur à quartz d'une fréquence de 16MHz afin d'utiliser les deux entrées du microcontrôleur prévues à cet effet.
  • On utilisera un registre à décalage et une sélection de ligne via l'Atmega pour notre matrice.
  • On intègrera un buffer à base de montages "Darlington" afin d'effectuer une amplification de courant en entrée de la matrice.
  • L'alimentation externe ainsi que la masse s'effectueront via la connexion SPI.
  • On inclura un connecteur afin de programmer l'Atmega sans passer par un Arduino mais directement par une broche de programmation.
  • La création de la schématique ainsi que la réalisation du PCB se feront via le logiciel Eagle.

Première version schématique

La première version schématique comprend le microcontrôleur pilotant les deux registres à décalage. Il présente également le montage "oscillateur à quartz". Il montre aussi l'envoi des données vers les différents ports de la matrice leds. Cependant, les connecteurs spi (entrée et sortie) ne sont pas représentés schématiquement, il faudra insérer les empreintes ou les créer si le montage est validé.

Modifications de la première version schématique

La seconde schématique comprend un autre "reference design" pour l'Atmega328p. Un registre à décalage a été supprimé (en effet certaines sorties du microcontrôleur serviront au choix de la ligne de la matrice). Les composants qui n'étaient pas "de surface" le sont désormais. Deux barrettes femelles ont été placées afin de pouvoir y connecter la matrice de leds. Afin de réaliser une amplification de courant en entrée des lignes de la matrice, on placera un buffer qui contient des montages "Darlington". Enfin, un "spi header" a été ajouté. On place également une LED (ainsi qu'une résistance et un condensateur) qui serviront au déboggage de la carte. Si la LED n'est pas allumée, c'est qu'il y des court-circuits. Enfin, un connecteur a été placé afin de pouvoir programmer le microcontrôleur à tout moment.

Création du PCB

Après avoir énuméré les composants nécessaires à la réalisation de la carte et avoir fait validé la schématique, nous pouvons passer à la création du PCB. Il s'agit de construire le routage des composants en dessinant les pistes qui les relient. Dans ce PCB, on place les deux barrettes femelles 1x8 sur une couche (en l'occurence la couche "bottom") afin de réserver une partie pour la matrice. De l'autre côté (la couche "top"), on place tous les autres composants. Finalement, le buffer a également été placé sur la couche "bottom" afin de faciliter le routage. En effet, de trop nombreuses pistes se chevauchaient et il a fallu y remédier. La contrainte de taille ne permet pas beacoup de marge de manoeuvres en terme de routage puisque notre carte électronique fait la taille de l'afficheur, soit 60,3 x 60,3 mm. Le côté rouge correspond à la couche "top", quant au côté bleu, il s'agit de la couche "bottom". En ce qui concerne les paramètres, la largeur des pistes est de 0,3 mm, la largeur des vias est de 0,6 mm et l'espace entre deux pistes vaut 0,3 mm (sauf sur certaines parties comme les sorties de l'Atmega par exemple qui, vues les dimensions du composants, ne permettent pas de tels espaces entre les pistes).

Modification du PCB

Suite aux remarques de l'encadrant, il a fallu modifier le premier PCB. L'empreinte du microcontrôleur a été changée. Le "design rule check" a été effectué et aucune erreur ne subsiste (excepté sur les pads de l'Atmega qui sont trop rapprochés). Le nombre de via a été diminué. Toutes les pistes qui étaient à angle droit ont été supprimées, désormais les angles sont à 45° au maximum. Certains paramètres ont également été changés. De ce fait, nous avons maintenant des largeurs de piste de 12 mil, des tailles de via de 24 mil ainsi que des espacements entre les pistes de 12 mil. D'autre part, une LED a été ajoutée pour vérifier l'alimentation de la carte. Les vias sous les composants ont été supprimés et espacés des pads s'ils étaient trop proches.

Soudage et tests de la carte

La première étape de la réalisation fut de souder la carte. La carte utilisée n'est pas celle présentée ici puisque la gravure n'était pas faite au moment de la réalisation. Voici ci-dessous le PCB de la carte réalisée :

Nouveau PCB

Il a fallut ensuite tester chaque partie. Tout d'abord, l'alimentation doit être vérifiée en effectuant la soudure de la partie LED. On injecte ensuite 5 V dans le spi input . Ce test a été concluant. Ensuite nous avons testé le fonctionnement du microcontrôleur et du montage oscillateur. Pour cela, nous avons implémenté un bootloader et un programme de test qui s'est avéré fonctionnel. Enfin, nous plaçons le registre ainsi que le buffer et testons l'état des sorties selon un programme de test également, ce qui s'est avéré concluant également. Finalement, voici à quoi la carte ressemble une fois tous les composants incorporés :

photo à venir

Le bootloader et les programmes tests

Dans un premier temps, nous avons décidé de programmer notre Atmega via un Arduino Duemilanove en utilisant l'ICSP disponible sur notre carte. Pour cela il nous faut relier chaque pin de l'Arduino (à savoir VCC, GND, SCK, RESET, MISO et MOSI) sur celui qui lui correspond sur la carte. Dans un premier temps, il s'agit d'implémenter un bootloader qui servira à pouvoir programmer dans notre configuration (Atmega328p à 16 MHz). Ceci a d'ailleurs permis de vérifier que le quartz était fonctionnel. Après que le bootloader soit installé, on peut choisir d'utiliser notre Arduino en tant que programmateur.

Nous avons dans un premier temps importé un simple programme "Blink" pour vérifier que nous pouvons réellement programmer et que le microcontrôleur soit capable de piloter la carte. Ce programme permet juste de faire clignoter un LED via le SCK mais nous conforte dans le fait que la programmation ainsi que le fonctionnement de la carte soient fonctionnels. Dans un second temps nous avons voulu tester les sorties du buffer et du registre à décalage. Pour cela nous avons choisis dans un premier temps de mettre des sorties du buffer à 1 et d'autre à 0 pour voir si l'on récupérait bien 5 V là où il fallait. Pour le registre, nous vérifions également les entrées sorties en vérifiant les tensions.

Test de la matrice de LEDs et problèmes rencontrés

  • Dans un premier temps nous avons remarqué que sur cette carte nous ne pouvions pas insérer la matrice directement puisque les pins des barrettes n'étaient pas situés dans le bon sens. Pour palier à celà nous avons placé les broches 1 à 8 directement et relié les autres via des câbles.
  • Dans un second temps, il s'agissait de tester les LEDs afin de voir si elles s'allumaient ou non. Nous avions au début des LEDs aléatoires puis nous avons trouvés comment les sélectionner. A l'heure actuellement seule la première ligne est opérationnelle. Nous pouvons la choisir en passannt à l'état "HIGH" notre variable qui gère cette sortie. Ensuite, pour allumer les LEDs, il s'agit de mettre la LED souhaitée à 0 et les autres à 1. Par exemple pour choisir le led de la colonne 4, nous implémentons ~0x08 dans le registre à décalage. Ci-dessous, voici ce que nous pouvons afficher :
  • photo à venir

  • Concernant les problèmes rencontrés, il semblerait que le colonne 3 ne soit pas opérationnelle. De plus, seule la ligne 1 a pu être sélectionnée. Pour tenter de résoudre cela, j'ai vérifié que chaque pin du registre et du buffer étaient reliés correctement à la matrice et au microcontrôleur. Ensuite, nous avons n'avons pas pu afficher de ligne complète, seulement une LED par une LED, peut être cela est-il dû au dysfonctionnement de la colonne 3. Il ne semble pourtant pas y avoir de courts-circuits au sein de la carte donc cela peut provenir d'un mauvais câblage de la carte vers la matrice.

Livrables

Schématique

Voici la schématique de la solution proposée :

Schématique

Etat : Validé

Liste de composants

Description Fabricant Référence Fabricant Fournisseur Code commande Quantité Prix unitaire HT Lien fournisseur
Microcontrôleur ATMEL ATMEGA328P-AU Farnell 1715486 1 2,74 http://fr.farnell.com/atmel/atmega328p-au/mcu-8bit-atmega-20mhz-tqfp-32/dp/1715486
Afficheur matrice de point 8x8 KINGBRIGHT TC23-11EWA Farnell 2290408 1 6,16 http://fr.farnell.com/kingbright/tc23-11ewa/display-dot-matrix-2-3-8x8-red/dp/2290408
Barrette femelle 1x6 SAMTEC SSM-106-L-SV Farnell 1668257 1 1,98 http://fr.farnell.com/samtec/ssm-106-l-sv/embase-2-54mm-vert-6voies/dp/1668257
Barrette mâle 1x6 SAMTEC TSM-106-02-L-SH-K-TR Farnell 2417064 1 1,01 http://fr.farnell.com/samtec/tsm-106-02-l-sh-k-tr/connecteur-header-2-54mm-1x6/dp/2417064
Barrette femelle 1x8 SAMTEC SSM-108-L-SV Farnell 1668259 2 2,26 http://fr.farnell.com/samtec/ssm-108-l-sv/embase-2-54mm-vert-8voies/dp/1668259
Barrette mâle 2x3 TE CONNECTIVITY 5-146130-2 Farnell 2311147 1 1,1 http://fr.farnell.com/te-connectivity/5-146130-2/connecteur-male-2-54mm-6-voies/dp/2311147
Registre à décalage NXP 74HC595D Farnell 1201269 1 0,469 http://fr.farnell.com/nxp/74hc595d/circuit-logique-74hc-cms/dp/1201269
Quartz EPSON Q22FA23800181 FA-238 16 MHZ 12.5PF Farnell 1712816 1 0,61 http://fr.farnell.com/epson/q22fa23800181-fa-238-16-mhz-12-5pf/quartz-fa-238-16mhz-50ppm-12pf/dp/1712816
Buffer TEXAS INSTRUMENTS ULN2803ADWR Farnell 1652419 1 0,93 http://fr.farnell.com/texas-instruments/uln2803adwr/array-darlington-8-x-50v-18soic/dp/1652419?CMP=os_Google-FR_ProductDetail_Redirect&_ga=1.205781847.597929948.1454953943
Condensateur 100 nF MULTICOMP MC0201X104K6R3CT Farnell 2320753 3 0,0116 http://fr.farnell.com/multicomp/mc0201x104k6r3ct/condensateur-mlcc-x5r-100nf-6/dp/2320753
Résistance 10 KOhm MULTICOMP MCMR04X1002FTL Farnell 2072517 1 0,0134 http://fr.farnell.com/multicomp/mcmr04x1002ftl/res-ceramique-10k-1-0-063w-0402/dp/2072517
Résistance 1 MOhm MULTICOMP MCMR04X1004FTL Farnell 2072521 1 0,0134 http://fr.farnell.com/multicomp/mcmr04x1004ftl/res-ceramique-1m-1-0-0625w-0402/dp/2072521
Résistance 470 Ohm MULTICOMP MC0063W06035470R Farnell 9332146 1 0,0097 http://fr.farnell.com/multicomp/mc0063w06035470r/res-couche-epaisse-470r-5-0-063w/dp/9332146
LED KINGBRIGHT KP-1608MGC Farnell 8529825 1 0,281 http://fr.farnell.com/kingbright/kp-1608mgc/led-0603-vert/dp/8529825

Etat : Validé

Carte électronique

Ci-dessous se trouve le PCB de la carte électronique :

PCB
PCB + plans de masse

Etat : Validé

Programme C

Pour cette partie, il s'agit d'écrire un code permettant de communiquer via un bus SPI. Sur le port SPI input, il s'agira d'envoyer des mots de 8 bits sur notre microcontrôleur pour que celui-ci soit capable d'afficher un message sur la matrice. Le protocole SPI nécessite un maître et un voire plusieurs esclaves. Ceux ci interagissent de la manière suivante :

Relations maître/esclave

Le SPI input ainsi que le programmeur sont maîtres de l'Atmega. Nous n'utilisons pas ici de SS (slave select) puisqu'aucun maître ne possède plusieurs esclaves. Nous ne nous intéressons pas dans notre cas au SPI output, qui lui sert dans le cas d'un chînage de matrices.

Ci-dessous un code permettant d'initialiser la connectique SPI au sein du microcontrôleur :

Média:init_spi.zip

Fichiers annexes

Ci-dessous, différents fichiers nécessaires à la réalisation du projet :