Apr 112013
 

Aujourd'hui, pas de longues réflexions éxistancielles sur le monde, ni de gros pavés de code. Aujourd'hui, c'est placement de produit.

Je me fait un peu la main avec la suite de développement androide (Android Development Tools ; essentiellement éclipse configuré pour développer des applis androide). Autant le dire tout de suite, le java n'est vraiment pas ma tasse de thé (Je bois beaucoup de thé, et je ne supporte pas très bien le café. Ça me rend nerveu et je me met à sautiller de partout. Pas très productif...).

Alors, le produit, car il y à produit à placer, est une petite application servant à calculer la probabilité d'obtenir certains enchantements sur certains équipement dans le très célèbre jeu Minecraft (au quel, oui, je jou souvent). Rien de transcendant. L'interface graphique est ce qu'il y à de plus plat, et le calcule est une simple simulation du tirage çelon l'algorithme du jeu (Informations tirés du wiki officiel. Je ne me suis pas amusé à fouiller le jeu original.) répété un petit milier de fois. J'ai vu des projets plus passionant, mais bon, il faut bien se faire la main sur quelque chose, n'est-ce pas?

En tout cas, il fait bien le travail qu'on lui demande. Ça peu toujours servir, si vous cherchez un enchantement spécifique, et que vous voulez optimiser vos chances de l'obtenir.

Vous trouverez l'application sur google play : http://play.google.com/store/apps/details?id=fr.zenol.minecraftenchantmentcalculator

N'esitez pas à tester l'application et rédiger votre avis sur la page du store.

(Oui, promit, le prochain article, on feras du code.)

Aug 122012
 

Hi,

Today, I was testing my RPi, just to check that "everything is alright". I bought a cheap 1A/5V micro usb power supply from china (found on a well known auction website) and writed the official aspbian image. I plugged my new VGA/HDMI flat screen, and booted the RPi. Then.... nothing.

Actualy, to make it works, I had to modify the config.txt file, as said by Aptoitos on http://www.designspark.com/knowledge/what-you-need-get-your-raspberry-pi-and-running :

hdmi_drive=2
config_hdmi_boost=4
hdmi_group=1
hdmi_mode=16
hdmi_force_hotplug=1
disable_overscan=0

After adding/uncommenting such things in the config.txt file, it worked fine (I still  have to push the auto button of my screen to tell him something is coming from HDMI).

I can't tell exactly what was the problem (signal too low to be recognized, bad display mode, or something else) but then it works fine, and now I'll have to wait for a USB keyboard :)

For more informations about which setting change what : http://www.designspark.com/knowledge/what-you-need-get-your-raspberry-pi-and-running

 Posted by at 7:00 pm
Jun 132012
 

Matrice de LED 10x10 pou alimentation 5V

Dans ce billet, je vais développer les différentes étapes dans la réalisation d'une matrice de diode 10x10 pour une utilisation avec des tensions de 5V (Il faudra prévoir une/des résistances dans le circuit qui contrôleras les transistors).

Quel est l’intérêt de réaliser une matrice soit même? Certainement pas le prix, puisqu'on trouve des matrices 8x8 à 3€ sur un célèbre site d'enchère. Ni la qualité esthétique, puisque vous vous rendrez vite compte qu’aligner parfaitement les diodes relèverais du miracle.

Non, ce que l'on cherche ici, c'est la satisfaction d'avoir réalisé son premier circuit, et d'avoir fait le premier pas vers un nouveau monde. À mes yeux, ce projet est le plus simples des projets utile accessible à un néophyte, et fait suite à l'hello world.

Le projet terminé

Je fournit ici le projet Eagle contenant schéma et PCB, dans l’hypothèse où cela intéresserait des gens ; http://zenol.fr/dl/led_matrix.zip.

Dessin du circuit (PCB), détermination des composants

La première étape consiste à réaliser le circuit via un logiciel spécialisé, par exemple Eagle, en s’aidant des lois de la physique (Loi des mailles, des noeuds, et U=RI :) ) pour s'assurer que l'on a les bonnes tensions / intensités. J'ai réaliser les calculs pour des leds vertes haute luminosité. Notez que le seuil de tension (aussi appelé Forward Voltage) des led vari aelon les couleurs (2~2.6v pour les rouges/oranges/jaunes et 3~4V pour les vertes/bleu). Dans la configuration que j'ai réaliser, prévu pour une alimentation de 5V, on ne peut allumer les LED qu'une à une pour espérer une intensité lumineuse acceptable. Dans l'ensemble, pour l'adapter a d'autres tensions, vous pouvez vous contenter de recalculer/mesurer les résistances.

Notez que les transistors n'ont pas de résistance sur leur base. Vous DEVEZ en placer. Pour ma part elles figureront coté contrôleur, car je prévoir l'usage d'un démultiplexeur qui diminuera le nombre de résistances nécessaires.

Voilà la bête :

 

Schéma de la matrice

Une fois le schéma réalisé, le choix des connecteurs fait, les connexions vérifiés, on peut passer au dessin du PCB. Une petite réflexion vous conduira a la conclusion qu'il est impossible de relier les connexions avec une piste de cuivre simple face sans qu'elles se chevauchent. La solution? De petits fils qui vont venir jouer le rôle de pont. Cela se caractérise par le fait que les pistes ne sont pas complètement reliés, comme Eagle l’indique par la présence de 'fils aériens'. Sachez au passage que j'ai du réaliser le rooting (câblage) à la main, pour obtenir quelque chose d'esthétique.

Le PCB

Après tout ce travail, il ne reste qu'à prier pour que ne figurent pas d'erreurs, et fabriquer le circuit.

Le montage

Après quelques semaines, je reçoit le circuit que j'avais commandé. Et oui, vous avez crus que je ferait le circuit moi même? Commandé auprès d'un particulier qui ne traite que les commandes de particuliers ; etronics.free.fr si vous me demandez de dénoncer. Je sort les câbles, la soudure, et me prépare à poser la "deuxième couche" du circuit. Ah mais, il ne manquerait pas la moitié des trous?!

...

Bon, on essaye de retourner la situation à son avantage. Et si on se contentais de petites agrafes reliés entre elles via un long fil métallique? Mais oui! Ça fonctionne, et c'est même très pratique!

Placement des bootstraps en agrafes.

Après ceci vous pouvez commencer à placer les composants. Commencez par les résistances puis les diodes (dans l'ordre inverse vous aurez du mal à les monter...).

Bootstraps et LEDs

LEDs et résistances

Viennent alors les derniers composants : transistors, headers, OUF! C'est terminé!

Il ne reste que le dernier composant!

Petit rappel sur l'utilisation

-On n'allume qu'une led à la fois, quitte à le faire assez vite pour donner l'illusion que plusieurs sont allumé en même temps. Un affichage à 60kHz est suffisant.

-Il faut penser à mettre des résistances sur la base des transistors (Les headers C1-C10).

-Pour activer la diode en (4,8) (Avec la disposition où est prise la première photographie) on branche 5V sur L8 et l'on active C4 avec par exemple une résistance 10K relié à 5V.

 

À vous de faire une plus grosse matrice ;)

 

NB : Le montage que j'ai fait n'est pas la seul solution pour réduire le nombre de connections. Il existe des multiplexages à 'haute impédance', se basant sur le fait que l'on ne connecte que 2 broches sur l'ensemble des combinaisons possible (Sonelec-musique rubrique "multiplexage multiples"). Je ne garantit pas que ce soit une bonne idée pour utiliser conjointement avec des LED haute luminosité et un microcontroleur. Si quelqu'un a testé, je suis curieux de savoir ce que ça donne.

 Posted by at 4:14 pm
May 252012
 

ICSP?

ICSP (In-Circuit Serial Programming) ou encore ISP est le nom donné à l’interface de programmation des microcontroleurs pouvant être reprogrammé in- situ. C'est le cas des AVR de chez Atmels, dont figure la très célèbre famille des Atméga (Atmega328P pour la carte arduino uno), mais aussi les petits ATtiny, qui n'ont que peux à envier aux atméga, puisque pouvant surpasser la cadence des seconds (20Mhz pour l'attiny84 et l'attiny85).

Sachez que si vous disposez d'une carte arduino, vous ne programmez pas votre microcontroleur grace à l'ICSP, mais grâce au bootloader arduino, qui a chaque démarrage (appuis sur reset si vous préférez, ou mise sous tension) attend quelques instant une éventuelle communication sur les pins 0 et 1 (RX et TX) avant de finalement lancer votre programme(sketch). Vous l'aurez comprit, la programmation d'une arduino se fait en effectuant un reset et en transmettant les données sous la forme d'une liaison série asynchrone (http://fr.wikipedia.org/wiki/UART).

L'inconvénient de cette méthode, est qu'un microcontroleur "brute de fonderie" ne permet pas une telle chose (C'est, un fait à mettre en parallèle avec les PIC et les PICAXE) et qu'il faut donc charger le bootloader arduino.

Une autre raison, plus pragmatique, est que le bootloader arduino mange tout de même plus d'une page mémoire, et que dans certains cas -- ce qui ne m'est pour le moment encore jamais arrivé -- il peut être utile de gagner quelques précieux octets.

La programmation atmel se fait via une interface SPI, Serial Peripherical Interface -- et c'est là que l'ordre des lettres dans un acronyme fait de grande différences (http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus).

Arduino as ISP

Par chance, des gens bien veillant se sont ouvert les veines -- ou pas ... -- pour implémenter un programmateur ISP à travers la carte arduino. Concrètement, l'utilisation du sketch Arduino As ISP (disponible dans la rubrique 'exemples' de l'IDE arduino) permet de transformer la carte arduino en un programmateur ISP, dialoguant avec le PC d'une façon standard -- compenez que les utilitaires pour avr comme avrdude arrivent a communiquer avec l'arduino -- et pouvant pogrammez un microcontroleur atmel... si vous avez de la chance.

Retenez qu'un programmateur ISP d'atmels doit avoir le contrôle sur 4 pins du composant : Le pin reset, car le protocole de programmation demande de pouvoir faire des choses bizarres avec ce dernier, et les 3 pins SPI (MISO, MOSI et SCLK. On n'utilise pas le SS). Le cablage de votre arduino avec un atmega est décrit :

- Dans le code de l'Arduino As ISP; les pins utilisé par le sketch sont indiqué. Y figure aussi au port 9 un "heartbeat" qui permet de savoir quand votre sketch a planté -- ce qui arrive plus souvent qu'on le souhaiterais.

-À cette adresse, dont l'image suivante est tirée : http://arduino.cc/en/Tutorial/ArduinoToBreadboard

Voici donc le schéma d'un montage avec votre arduino comportant le sketh Arduino As ISP, pour programmer un atmega328p (Si vous voulez programmer un autre atmel, il suffit de rechercher les port MOSI, MISO, SCLK et reset, puis de cabler comme sur l'atmega328p).

Sachez que, pour ma part, j'ai du modifier le sketch d'Arduino As ISP, en changeant le baud-rate de la liaison série (avec le PC) à 9600 (par défaut 12900), pour que tout se passe bien. (La pemiere ligne de setup() :   Serial.begin(19200); )

Hologe?

Si la résistance de pull-up sur le reset n'est pas obligatoire, pour un microcontroleur sortie de l'usine, il se peut que vous aillez besoin d'une horloge externe. L'horloge externe ou interne se configure via les fuses (fusibles), des registres spéciaux que le peut modifier... via ICSP -- donc, une fois que vous aurez réussi à faire fonctionner tout ce beau monde, ce qui ne nous aide pas.

Pour ma part, j'ai été obligé d'ajouter une horloge externe pour avoir une réponse du microcontroleur lorsqu’on lui demande d'épeler son nom (signature du composant). Un simple crystal 16MHz avec deux condensateurs 22pF -- non, ça ne marche pas avec 22nF, ce n'est pas faute d'avoir essayé... -- feras l'affaire. Il est fort probable qu'un crystal à 8MHz convienne aussi -- avec les mêmes condensateurs.

Let's GO!

Votre sketch est sur votre arduino, votre circuit est opérationnel, vous avez vérifier chaque câble, chaque branchement, et relut le schéma 8 fois? Bien, alors revérifiez encore une fois*.

Installez la suite AVRtools (WinAVR pour windows, votre gestionnaire de packets sous linux, et pour les autres, à vous de vous débrouiller :D ) -- documenté à cette adresse : http://www.nongnu.org/avr-libc/user-manual/using_tools.html

Lancez avrdude, avec une commande de cette forme :

avrdude -p atmega328p -c avrisp -P com4 -b 9600

Où vous remplacez atmega328p par votre microcontroleur, et com4 par votre port. Pensez aussi a entrer le baud-rate (-b) figurant dans le code du sketch Arduino As ISP. Si tout vas bien (Vous devez obtenir une réponse de votre microcontroleur, et les noms attendu et reçu doivent correspondre), vous pouvez alors envoyer un sketch avec :

avrdude -p atmega328p -c avrisp -P com4 -b 9600 -U flash:w:sketch.hex

Pour plus de détailles sur avrdude, référez vous à la documentation, ou bien http://www.ladyada.net/learn/avr/avrdude.html.

Sur ce, amusez vous bien :)

*Reflet d'acide joke : huit, ça suffit.

Nb : Pour calculer les fuses, j'utilise http://www.engbedded.com/fusecalc.

 Posted by at 11:23 am
May 032012
 

Timer/Counter & PWM pour des fréquences élevés.

Cette article traite de l'utilisation de certaines fonctionnalités de l'ATMega328P qui peuvent s’avérer utiles pour le traitement des signaux audio (par exemple, réaliser une pédale d'effet), jouer des samples de musique (échantillonnés à 44100Hz ou moins), ou encore réaliser de la synthèse sonore.

Il est question d'aborder ici le stricte minimum pour utiliser le PWM (Pulse Width Modulation) à une fréquence suffisamment élevé affin de pouvoir générer un signale analogique et de contrôler son amplitude. En bonus, nous pourrons exécuter une interruption toute les 16uS.

Je recommande fortement au gens aillant un peut d'expérience de lire directement la documentation relative aux Timers/Counters, PWM, et aux registres DDRx/PORTx.

Timer et PWM

L'ATMega328P comprend 3 Timers, c'est à dire trois compteurs qui sont incrémenté par le microcontroleur tout les N ticks d'horloges (K peut valoir 1, 8, 32, 64, 256, 1024 celons vos envies). Ces timers se noment "Timer0", "Timer1" et "Timer2".  Le Timer0 est utilisé par la bibliothèque arduino pour évaluer l'écoulement du temps (delay, microsecond) et pour les sorties PWM associés à ce timer. Le Timer1 dispose d'un compteur 16bits, c'est à dire de 0 à 0xFFFF, alors que les timers 2 et 1 sont en 8bits (de 0 à 0xFF). L'idée est que nous voulons compter vite, très vite, donc nous avons intéret à utiliser un compteur 8bits. Notre choix se port donc tout naturellement sur le timer2.

Le PWM correspond à la mise sous tension d'une patte de l'ATMega durant un certain laps de temps, puis de sa mise à 0 durant un autre instant, et le tout répété très rapidement. Cela permet de simuler un signale analogique de tension comprise entre 5v et 0v (Moins si vous n'utilisez pas l'alimentation 5V). Le principe est très bien décrit par le schéma suivant provenant du site d'arduino(http://arduino.cc/en/Tutorial/PWM) :

Il faut savoir que chaque Timer controle deux sorties PWM. Les pattes correspondant à ces sorties sont indiqué sur la page 2 de la documentation atmel (OCnA et OCnB, où n est le numéro du timer). Dans notre cas nous utiliseront la sortie OC2A, qui correspond au pin 11 d'une carte arduino.

Le fonctionnement du PWM est extrêmement simple ; Vous réglez le PWM avec une valeur comprise entre 0 et 255, disons C. Alors, tant que le compteur est plus petit que C, il y auras une tension de 5V sur la sortie OC2A. Quand le compteur dépasse C, la tension passe à 0V. Pour accélérer une sortie PWM, il faut donc accélérer le timer qui est associé.

Le mode FastPWM (ATMega328P datasheet p152-153)

Il existe plusieurs configurations possible pour la sortie PWM, la frequence des timers, etc. Je vous conseille très fortement de lire la documentation atmel à ce sujet. Dans notre cas, nous cherchons la plus rapide, et il y en a une qui correspond tout à fait à nos besoins ; La configuration Fast PWM.

Le compteur que nous avons évoqué, associé au Timer2, se nome "TCNT2"(Timer Counter 2), et peut être lut et écrit à tout moment. La valeur à partir de la quel le signal basule de 5V à 0V est stocké dans OCR2A(Output Compare Register 2 A). Un second registre de comparaison est disponible, OCR2B, et correspond au pin OC2B.

Dans ce mode, le comTCNT2 part de 0, puis atteint progressivement OCR2A. Alors, la tension de sortie de OC2A s'inverse. À cette instant, une interruption peut être déclenchée. C'est à dire, si vous n'êtes pas familier avec ce mécanisme, qu'une fonction que vous aurez préalablement écrite, compilé, et associé à ce mécanisme, seras exécuté. De même pour OCR2B/OC2B.

Le compteur continus sa montée, et atteint alors 0xFF. Il y a alors overflow : le compteur repasse à 0x00 à la prochaine incrémentation, et éclanche interruption TIMER2_OVF (Timer 2 Overflow), si elle est activée.

Sachez enfin que vous pouvez configurer si la tension de sortie avant que le compteur atteigne OCR2A doit être haute ou basse. Nous choisirons qu'elle est haute, puis basse. De cette façon, si OCR2A = 0, la tension sera 0 sur une période (16us, pour mémoire), et si OCR2A = 0xFF, elle sera de 5V (toujours sur une période).

Le schéma suivant, issu de la documentation, décrit une succession d’interventions sur le registre OCR2A, l'évolution du compteur, le déclenchement des interruptions, et les tensions de sorties(haut pour 5V et bas pour 0V) celons la configuration des deux bits COM2A1 et COM2A0 (Pour les valeur 2( = 1 0 en binaire) et 3 = (1 1 en binaire))

La fréquence à la quel l’interruption TOV2(TIMER2_OVF) est appelé se calcul aisément à partir de celle de l'horloge de l'ATMega. Si vous utilisez un quartz externe à 16MHz (c'est le cas des cartes arduino) la fréquence est alors  \frac{f_{clock}}{N . 256}  N est le facteur d'échelle (prescale factor), dont nous parlerons un peu plus loin.

L'activation du mode FastPWM (p160 de la documentation) se fait en fixant les bits du "Timer Counter Control Register"  A et B (TCCR2A et TCCR2B).

Le premier contient le type de sortie COM2A1:0 et COM2B1:0, ainsi que les bits WGM21 WMGM20 contrôlant le mode de l'horloge.  Le second (p163)  contient le dernier bit de configuration du mode, WGM22 et les trois bits permettant de sélectionner le facteur d'échelle (dans notre cas, nous choisirons 1, pour que la fréquence soit la plus élevé) ; CS22, CS21, CS20.

Ainsi, nous pouvons déjà configurer le mode Fast PWM :

TTCCR2A = 1 << COM2A1 | 1 << WGM01 | 1 << WGM00;
TTCCR2B = 0 << WGM02 | 0 << CS22 | 0 << CS21 | 1 << CS20;

Nb : Sachez que pour chacun des modes, vous trouverez un tel schéma dans la documentation :)

Facteur d'échelle

Les bits CS22, CS21 et CS20 permettent de configurer le facteur d’échelle. Le concept est simple (p155 et p156 de la documentation pour des schéma extrêmement claires) ; le compteur TCNT2 seras incrémenté de 1 tout les N ticks d'horloge, où la valeur de n dépend du facteur d'échelle choisit, d'après le tableau suivant (p164 de la documentation) :

Activer la sortie PWM

Nous avons donc configurer le compteur, et la sortie PWM peut maintenant être utilisée. Mais encore faut-il l'activer. Pour cela, il faut sélectionner la "direction" du pin associé au comparateur A (OC2A) comme "OUTPUT". Cela se fait via le Data Direction Register B (car la sortie OC2A est la troisième patte du port B, c'est à dire la sortie 11 de la carte arduino).

DDRB |= 1 << DDB3;

Pour désactiver la sortie PWM lorsque le pin est toujours en mode output, il suffit de modifier la valeur de COM2A.

Utiliser les interruptions

Le dernier outil, pour pouvoir par exemple effectuer une acquisition audio à  31.25kHz, est interruption OVF, déclenchée dès que le compteur passe de 0xFF à 0x00.  Pour ce faire, il faut informer le compilateur que votre fonction doit être associé à une interruption, et activer l'intéruption grâce au masque d’interruption TIMSK2.

// Configuration
TIMSK2 = 1 << TOIE2;
 
// ...
 
ISR(TIMER2_OVF_vect)
{
  // Code de l'interruption
}

La bibliothèque C AVR

Si nous pouvons utiliser toute ces macros, c'est bien quelles sont définit quelques part. Il s'agit d'une bibliothèque C permettant de développer sur les microcontroleurs atmel en C. Cette bibliothèque contient une documentation dont je recommande chaudement la lecture, notamment pour ceux qui souhaiterais diminuer le temps perdu en entête C dans l’interruption OVF (environs 20 à ticks d'horloge à 16MHz, ce qui représente tout de même 20 à 30 256ième du temps d’exécution de votre microcontroleur!)

Sachez aussi qu'une façon plus agréable d'écrire (1 << ABCD) est _BV(ABCD).

Documentation :

-La bibliothèque C AVR (Interruptions) : http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html
-Atmel ATMega328 Datasheet : http://www.atmel.com/Images/doc8271.pdf
-Realtime Audio Processing de Martin Nawrath : http://interface.khm.de/wp-content/uploads/2008/10/arduino_realtime_audio_eng.pdf
-PWM : http://arduino.cc/en/Tutorial/PWM

 Posted by at 2:54 pm