affichage d’un message lumineux par Atmega32U4 J.-M Friedt
Objectifs Organisation Stockage de la police R´esultats Conclusion
Projet : Persistance of Vision (POV) – affichage d’un message lumineux par Atmega32U4
J.-M Friedt
FEMTO-ST/d´epartement temps-fr´equence [email protected]
transparents `ajmfriedt.free.fr
15 mai 2015
1 / 12
Persistance of Vision (POV) –
affichage d’un message lumineux par Atmega32U4 J.-M Friedt
Objectifs
Organisation Stockage de la police R´esultats Conclusion
Objectifs du projet
• Objectif: utiliser la persistance r´etinienne pour afficher un message au moyen d’un r´eseau de LEDs align´ees en mouvement
• Concept familier pour l’affichage 7-segments/LCD ou les ´ecrans cathodiques, mais historiquement utilis´e avant l’av`enement du cin´ema (folioscope et zootrope en 1834 ...)
• Domaine d’application : acquisition et traitement de donn´ees sur support mobile, n´ecessit´e d’alimenter sur pile un dispositif qui sera en rotation (roue, rotor de moteur ou de turbine).
2 / 12
affichage d’un message lumineux par Atmega32U4 J.-M Friedt
Objectifs
Organisation Stockage de la police R´esultats Conclusion
Etat de l’art ´
• Principe : une barrette de LEDs en mouvement affiche un motif qui
´
evolue pour afficher un message
• Contraintes : synchroniser sur la vitesse de rotation du support
• Projet classique faisant intervenir du GPIO, input capture, interruptions dans un cadre ludique
Exemples de d´emonstrations dans la litt´erature :
• SpokePOV Persistence of Vision for your Bike !1
• R.P. Paul, G.B. Rathod, V.R. Trivedi, P.V. Thakkar,Persistence of Vision Control Using Arduino, I.J. Intelligent Systems and
Applications, 2014, 01, pp.102-111 (10.5815/ijisa.2014.01.11)2
• Spinning 16-led POV display using Teensy 2.03
• S. Monk,15 Dangerously Mad Projects for the Evil Genius, Mc Graw Hill (2011), chap. 84
1. http://www.ladyada.net/make/spokepov/
2. http://www.mecs-press.org/ijisa/ijisa-v6-n1/IJISA-V6-N1-11.pdf 3. https://github.com/amcinnes/pov_display
4. https://www.youtube.com/watch?v=Ulq33B_GnLo
3 / 12
Persistance of Vision (POV) –
affichage d’un message lumineux par Atmega32U4 J.-M Friedt
Objectifs Organisation Stockage de la police R´esultats Conclusion
Organisation
10 s´eances de 3 heures :
0 comprendre le sujet + bibliographie
1 choix technologique : prise en main du microcontrˆoleur et des fonctions de base, planification du travail
2 conception du circuit (sch´ema) et commande des composants
3 suite de 2 (routage), test de la sonde `a effet Hall, tension d’alimentation et distance de d´eclenchement
4 r´ealisation d’un premier prototype permettant de se familiariser avec le concept de POV : un motif p´eriodique (chenillard) est affich´e tandis que la plateforme est en rotation – relation entre GPIO et position
5 programme permettant d’afficher un message – table de caract`eres (difficult´e : d´epassement de RAM)
6 d´eclenchement du motif sur un point fixe de r´ef´erence (INT0)
7 affichage sur timer au lieu d’afficher sur d´elai fixe (boucle vide)
8 ajustement de la vitesse du timer afin d’´etaler le message sur toute la surface
9 finalisation rapport et pr´esentation orale
4 / 12
affichage d’un message lumineux par Atmega32U4 J.-M Friedt
Objectifs Organisation Stockage de la police R´esultats Conclusion
Circuit imprim´ e et premi` ere d´ emonstration
• logiciel s’apparentant au chenillard
• Olimexino-32U4 respecte la
nomenclature Arduino et m´elange les ports ⇒LUT reliant chaque LED `a son port/position
• montage m´ecanique de mise en rotation
1 2 34 5 6 78 9 10 CON4
A0 A1 A2 A3A4 A5
D0 D1 D2D3 D4 D5 D6 D7
D8D9 D10 D11 D12D13 GND AREF RST3V3 5V GND GNDVIN
SDASCL PLATFORM1
12 3 4 56 7 8 CON3
1 23 4 5 6 CON1
1 23 4 5 6 CON2
IC1
VCC1
GND2 OUT3
LED1 LED2LED3 LED4
LED5 LED6
LED7LED8 LED9LED10 JP11
2 RESET
D1(TXD) D3(SCL) D2(SDA) D0(RXD)
D7(LED1)
D13(UEXT_#CS) D4D5 D6
D9(LED2) D10D11 D12 D8(UEXT_PWR_E)
POWERANALOGDIGITALDIGITAL ARDUINO LEONARDO PLATFORM
Circuit imprim´e : CADSoft Eagle (www.cadsoft.de)
5 / 12
Persistance of Vision (POV) –
affichage d’un message lumineux par Atmega32U4 J.-M Friedt
Objectifs Organisation Stockage de la police R´esultats Conclusion
Circuit imprim´ e et premi` ere d´ emonstration
• logiciel s’apparentant au chenillard
• Olimexino-32U4 respecte la
nomenclature Arduino et m´elange les ports ⇒LUT reliant chaque LED `a son port/position
• montage m´ecanique de mise en rotation
1 2 34 5 6 78 9 10 CON4
A0 A1 A2 A3A4 A5
D0 D1 D2D3 D4 D5 D6 D7
D8D9 D10 D11 D12D13 GND AREF RST3V3 5V GND GNDVIN
SDASCL PLATFORM1
12 3 4 56 7 8 CON3
1 23 4 5 6 CON1
1 23 4 5 6 CON2
IC1
VCC1
GND2 OUT3
LED1 LED2LED3 LED4
LED5 LED6
LED7LED8 LED9LED10 JP11
2 RESET
D1(TXD) D3(SCL) D2(SDA) D0(RXD)
D7(LED1)
D13(UEXT_#CS) D4D5 D6
D9(LED2) D10D11 D12 D8(UEXT_PWR_E)
POWERANALOGDIGITALDIGITAL ARDUINO LEONARDO PLATFORM
Circuit imprim´e : CADSoft Eagle (www.cadsoft.de)
6 / 12
affichage d’un message lumineux par Atmega32U4 J.-M Friedt
Objectifs Organisation Stockage de la police
R´esultats Conclusion
Table d’allocation des caract` eres
• 10 LEDs (0x000-0x3FF) encod´ees sur un short
• 10×5 pixels/caract`ere
• caract`eres affichables de la table ASCII : 32-127
• 95 caract`eres×2 octets/colonne×
5 colonnes/caract`ere=950 octets
• travail incr´emental : ajouter les caract`eres si n´ecessaire
short c[475]= // on a 2.5 KB RAM
{0x000,0x000,0x000,0x000,0x000, // space 0x000,0x3fb,0x3fb,0x000,0x000, // ! 0x000,0x000,0x000,0x000,0x000, // "
0x048,0x3ff,0x048,0x3ff,0x048, // # ...
0x3ff,0x203,0x206,0x20e,0x3f9, // 0 0x000,0x100,0x3ff,0x000,0x000, // 1 0x107,0x209,0x211,0x221,0x1c1, // 2 0x202,0x221,0x221,0x252,0x18c, // 3 0x3e0,0x020,0x020,0x3ff,0x020, // 4 0x3e1,0x221,0x221,0x212,0x20c, // 5 0x0fe,0x121,0x221,0x211,0x00e, // 6 ...
00 1100 1100 1100 1100 1100 1100 1100 1100 1100 11 00 11001100110011
00 1100 1100 1100 11 00 1100 1100 1100 1100 11
00 1100 1100 1100 1100 1100 1100 1100 1100 1100 11
00 11 00 11 00
11 0011 0011001100110011001100110011001100110011001100110011 00 0011 0011 11 00110011001100110011 00 1100 11 00
1100 1100 1100 1100 1100 1100 1100 1100 1100 11 00 11001100110011
00 11 00 11 00 1100110011
00 1100110011 0011001100110011001100110011001100110011
00 11 00 11 00
11 0011 0011001100110011001100110011001100110011 00 1100 00 11 1100 11
00110011001100110011 00 1100110011 00
1100 1100 1100 1100 1100 1100 1100 11
00 1100 1100 11 00 1100 1100 1100 1100 11 00 11 00 11 00 11 00 1100110011
00 0011 00 11
1100 1100 1100 1100 1100 1100 11
00 1100 1100 11 00 1100 1100 1100 11 00 110011 00 11 00 11 00 11 0011 00 11 0011
00 110011 00110011
00 1100 1100 1100 1100 1100 1100 11
00 00 11 1100 1100 1100 1100 1100 1100 11
00 11 0011001100110011001100110011
00 11 00
1100 1100 1100 1100 1100 1100 1100 1100 1100 11 00 110011 00 1100110011
00 11 00 1100 11
00 11 00 11 0011
00 1100 1100 11
00 11
00 11 00 1100 1100 11 00 1100 1100 1100 1100 11 00 11 00 11 00 11 000011 001111
00 1100 1100 1100 1100 1100 1100 1100 1100 11
00 1100 1100 1100 1100 11 00 1100 1100 1100 1100 11
00 1100 1100 1100 1100 1100 1100 1100 1100 1100 11
00 1100 11 00 1100 1100 110011 000011001111000011001111001100110011 00 1100 11 00
0011 0011 11 0011001100110011 00 11 00 11
00 1100110011 0011001100110011
00 1100 1100 1100 1100 11 00 11 00 11 00 110011 00 11 0011 00 1100110011 001100110011000011110011
00 11 00 1100110011 00 11 001100110011001100110011001100110011
00 1100 11 0011 0000110011110011 0011
00 11 00 11 0011
00 11 00 1100 1100 1100 0011 11 00110011
00 1100 1100 1100 1100 1100 11 00 1100 11 00 11 00 1100 1100 1100 1100 1100 11 00 1100 11 00 11 00
1100 1100 1100 1100 1100 1100 1100 1100 1100 11 00 110011 00 1100110011
00 110011 0011001100110011001100110011001100110011
00 1100 1100 1100 1100 1100 1100 1100 11
00 1100 00 11 1100 11
00 1100 1100 1100 00 11 11 00 1100 11 00 1100 1100 1100 11 00 11 00 11 0011 0011 0011 00
1100 1100 1100 1100 1100 1100 11
00 11 00 1100 1100 11 00 110011 00 11 00 11 00 11 0011 00 11
00 110011 00110011 00
1100 1100 1100 1100 1100 1100 1100 1100 11 00 11001100110011
00 1100 11 00 11 00 1100 1100 11 00 11
00 1100 1100 1100 1100 1100 1100 1100 11
00 11 00 11 00
11 0011 00110011001100110011001100110011 00 1100 1100 00 11 1100 11 00
11 0011
00 11 00 11 0011
00 1100110011 00 11 00 0011 11
00 110011 00 11
00 11 00 110011 00 11 00 11
00 1100110011
00 11 00 1100110011
00 11 00 11 00 11 00 11 001100110011
00 1100 1100 1100 1100 1100 1100 1100 11 00 110011
00 11 00 11 00 11 00 11 00 11
00 11 00 11 00 11 00 11
00 11
00 0011 0011 0011 1100 1100110011
00 1100 11
00 1100 11 00 11 001100110011
00 1100 1100 1100 1100 1100 1100 1100 11001100110011
00 11 00 11 0011
00 11
00 11
00 11 00 1100 11 00 11
00 11 00 11 00 11 0011
00 11 00 11
00 11 00 1100 11
00 1100 11 00 11
00 11 00
11 0011 00110011
00
11 0011
00 11 00 11 00 1100 1100 11 00 1100110011 00
110011
00 1100110011
00 11
00 11
00 0011 11 00 1100 1100110011 0011
00 0011 11 00 1100 11 00 1100110011
00 0011 11 00110011
00 1100 1100 11 00 1100 1100 1100 11 00 11 0011 0011
00 11 0011 00 1100110011001100110011 00 11
00 11 00110011 00110011
00 1100 11 00 0011 11 00 0011 11 00 11 00110011001100110011
00 1100 11 00 1100 1100 11 00 1100 1100 1100 1100 11 00 1100 1100 1100 11 000011001111 00 110011 00 110011 0011 00110011
00 110011
00 11 00 0011 0011 1100 1100 11 00110011001100110011
00 11001100110011
00 1100110011 00
11
00 1100 11 00 110011 00
1100110011 001100110011
00 1100 1100 11 00 1100 1100 11
00 11 00 1100 1100 11
00 1100 1100 1100 1100 1100 1100 1100 1100 1100 11 00
11 0011 00110011 0011001100110011 00 1100 1100 1100 1100 11 00 11 00 11 00 11
00 1100 1100 1100 1100 11 00110011 00
11 00 11 0011
00 11 00 11 00 1100110011001100110011
00 11
00 110011001100110011
00 110011
00 1100 11 00 11
00 11
00 11001100110011 00 110011 00 11 0011000011001111
00 1100110011 00 11
00 1100 1100 1100 11 00
11 00110011 001100110011001100110011001100110011 0011 0011 00 11 001100110011 00 1100 11 00 11 0011
00 11 00 11 00 1100 1100 1100 11 00 1100 1100 1100 11
00 11 0011 0011 00 11 0011 0011
0x3ff 0x210 0x220 0x250 0x18f 0x3ff
0x020 0x3ff 0x020 0x020
0x3ff 0x221 0x221 0x221 0x221
0x3ff 0x001 9
0
0x001 0x001 0x001
0x1fe 0x303 0x201 0x303 0x1fe
0x000 0x000 0x000 0x000 0x000
0x3ff 0x201 0x201 0x102 0x0fc 0x3fc 0x003 0x01e 0x003 0x3fc
0x3ff 0x0c0 0x3ff 0x078 0x00c
0x3ff 0x220 0x220 0x240 0x180
0x3ff 0x203 9
0
0x206 0x20e
0x3f9 0x200
0x3fe 0x001 0x001 0x001 0x3fe
0x380 0x040 0x03f 0x040 0x380 0x3fc 0x002 0x001 0x002 0x3fc
0x38f 0x050 0x020 0x050 0x38f 0x0c1
0x321 0x221 0x20c 0x200
0x200 0x3ff 0x300 0x213 (127−32) caracteres * 5 shorts = 950 octets
0x1ff 0x320 0x320
0x3ff 0x221 0x221 0x352 0x08c
0x1fe 0x303 9
0
0x201 0x201 0x201
0x1fe 0x303 0x323 0x13e
0x201 0x004 0x3ff
0x203 0x201 0x203
0x3ff 0x260 0x090 0x108 0x207 0x120
0x1ff
0x3ff 0x220 0x220 0x220 0x200
0x221 0x201 0x201 0x3ff 0x201
0x3fc 0x3ff0x100 0x100 0x0c0
0x203 0x20d 0x381 0x211 0x231
0x3fc 0x202 0x231 0x231 0x1c2
0x000 0x100 9
0
0x3ff 0x000
0x000 0x18c
0x3e0 0x020 0x020
0x200 0x200 0x23f 0x240 0x380 0x3e1 0x221 0x212 0x20c
0x0fe 0x121 0x221 0x211 0x00e 0x107
0x209 0x211 0x1c1 0x252
0x221 0x221 0x202
0x221 0x3ff
0x020
0x2de 0x121 0x2de 0x121 0x121
0x221 0x221 0x221 0x1fe
0x3ff 0x203 9
0
0x206 0x20e
0x3f9 0x000
0x000 0x003 0x003 0x000 0x000
0x000 0x3fb 0x3fb 0x000 0x000 0x007 0x00c 0x030 0x0c0 0x380
0x048 0x3ff 0x048 0x3ff 0x048 0x000
0x06c 0x06c 0x000 0x0000x06e
0x000 0x000
0x06d 0x1c2
0x221
7 / 12
Persistance of Vision (POV) –
affichage d’un message lumineux par Atmega32U4 J.-M Friedt
Objectifs Organisation Stockage de la police
R´esultats Conclusion
Probl` eme de gestion de m´ emoire
Seulement 2,5 KB de RAM, mais table de caract`eres est statique donc on peut la mettre en flash (32 KB) ... sauf sur une architecture Harvard.
• Sur MSP430 (Von Neumann), sans puis avecconst:
msp430-gcc -mmcu=msp430f1611 -O0 -o 3pov_memoire.msp430 3pov_memoire.c msp430-size 3pov_memoire.msp430sansconst
text data bss dec hex filename
112 966 2 1080 438 3pov_memoire.msp430sansconst msp430-size 3pov_memoire.msp430avecconst
text data bss dec hex filename
1062 16 2 1080 438 3pov_memoire.msp430avecconst
• Sur Atmega32U4 (Harvard), sans puis avecconst:
avr-gcc -mmcu=atmega32u4 -O0 -Wall -o 3pov_memoire.avr 3pov_memoire.c avr-size 3pov_memoire.avrsansconst
text data bss dec hex filename
232 966 0 1198 4ae 3pov_memoire.avrsansconst avr-size 3pov_memoire.avravecconst
text data bss dec hex filename
232 966 0 1198 4ae 3pov_memoire.avravecconst
(textva en flash, dataetbssen RAM)
8 / 12
affichage d’un message lumineux par Atmega32U4 J.-M Friedt
Objectifs Organisation Stockage de la police R´esultats Conclusion
Affichage d’un message alphanum´ erique
• 3000 rpm = 50 rps = 20 ms/tour, donc afficher
”HELLO WORLD ” = 12 chars⇒1.7 ms/char
• 5 colonnes/char et un espace = 6 colonnes/char⇒chaque colonne s’affiche 1700/6=283µs
• utilisation dutimeren modeOutput Comparepour cadencer l’affichage
• ajustement de la cadence sur vitesse de rotation (Input Capturev.s INT0)
9 / 12
Persistance of Vision (POV) –
affichage d’un message lumineux par Atmega32U4 J.-M Friedt
Objectifs Organisation Stockage de la police R´esultats Conclusion
Input Capture
• D´eclenchement d’une interruption sur une transition sur une broche li´ee `a untimer
• Etallonnage pr´´ eliminaire ⇒cadencement `a 62500 Hz=16 MHz/256
50 Hz=0x4E2, 20 Hz=0xC35, 10 Hz=0x186A, 8 Hz=0x1E84, 4 Hz=0x3D09
0x175A=96 ms=10,4 Hz 0x166F=92 ms=10,9 Hz
Attention: la sonde `a effet Hall5 n´ecessite une alimentation de 5 V/5 mA, elle ne commute pas si elle est aliment´ee en 3,6 V.
5. http://www.farnell.com/datasheets/1702865.pdf
10 / 12
affichage d’un message lumineux par Atmega32U4 J.-M Friedt
Objectifs Organisation Stockage de la police R´esultats Conclusion
G´ en´ eration 5 V
1 Convertisseur DC-DC en step-up (3,6 V→5 V)
2 MAX1674 : entr´ee entre 0,7 et 5 V, sortie fixe `a 5 V (300 mA)
3 ici, MAX631 : entr´ee entre 2,5 et 5 V, sortie fixe `a 5 V (50 mA) Montage endead-bug pour ne pas perdre de temps `a refaire un circuit imprim´e
11 / 12
Persistance of Vision (POV) –
affichage d’un message lumineux par Atmega32U4 J.-M Friedt
Objectifs Organisation Stockage de la police R´esultats Conclusion
Conclusion
1 Projet permettant d’aborder de nombreux p´eriph´eriques d’un microcontrˆoleur (GPIO, timer, interruption mat´erielle)
2 application embarqu´ee n´ecessairement aliment´ee sur pile (rotation)
3 complexit´e incr´ementale avec validation de chaque ´etape.
Perspectives
1 ajouter la couleur en rempla¸cant l’unique LED rouge par colonne par le triplet RGB ou une LED 3-couleurs6 7.
2 solution 1-wire du WS2812 (Hackable n.6, 2015) au lieu de 10 GPIOs ?
6. LED RGB 5 mm, Farnell r´ef´erence 2290374, 1 euro/p
7. Panasonic LED driver ICs POV (Persistence of Vision) illumination demo examples`ahttp://channel.panasonic.com/contents/10919/
12 / 12