Catégorie : Micro-contrôleurs

Les micro-contrôleurs de type AVR, Arduino, MSP430, LaunchPad, PIC, PICAXE…

Programmer un micro-contrôleur PIC comme un Arduino [MAJ]

ChipKIT Max32 (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2012/09/chipKIT-Max32-obl-500 NULL.jpg)Après Energia pour la plateforme LaunchPad à MSP430 de Texas Instruments (http://xv4y NULL.radioclub NULL.asia/2012/04/27/les-micro-controleurs-msp430-de-texas-instruments/), voici une autre alternative sérieuse à Arduino. Sérieuse d’une part parce qu’elle est 100% fonctionnelle et disponible facilement, et d’autre part parce qu’elle offre des spécificités intéressantes par rapport à Arduino ou LaunchPad.

Il s’agit de l’initiative ChipKIT (http://chipkit NULL.org/wiki/index NULL.php?title=Main_Page) de Microchip (le créateur de la famille de micro-contrôleurs PIC). Cette plateforme est composée d’un côté de circuits reprenant volontairement le format des Arduino UNO, Mega et consorts, et qui sont vendus par Digilent sous le nom de ChipKIT Uno32, ChipKIT Max32, etc (http://www NULL.digilentinc NULL.com/Products/Catalog NULL.cfm?NavPath=2,892&Cat=18), et d’un autre côté d’un environnement de développement (IDE) appelé MPIDE et basé sur Arduino mais produisant du code pour les PIC.

ChipKIT-WiFi (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2012/09/chipKIT-WiFi-Shield-obl-600 NULL.jpg)Je ne rentrerais pas dans le débat de savoir quelle architecture est supérieure à l’autre entre AVR, PIC ou   MSP430, car tout dépend de vos besoins. Il est toutefois intéressant de noter que ces cartes intègrent des microprocesseurs PIC32 qui bien qu’ils portent le même nom utilisent une architecture interne toute différente des PIC16 traditionnels. Les PIC32 sont des processeurs 32bits de type MIPS32 et qui sont cadencés à 80MHz sur les cartes ChipKIT. La mémoire Flash embarquée va de 128Ko à 512Ko et la RAM de 16Ko à 128Ko. Contrairement aux AVR les PIC32 ne contiennent pas d’EEPROM, mais la carte ChipKIT MAX32 inclue un circuit EEPROM accessible par I2C. Comparer les performances entre deux architectures différentes est très difficile et il ne faut pas se fier aux chiffres. Toutefois il est fort probable que pour un prix équivalent les ChipKIT offrent des performances et des fonctionnalités supérieures aux Arduino, sans égaler le rapport qualité / prix du LaunchPad (http://www NULL.ti NULL.com/tool/msp-exp430g2) bien entendu.

MAJ : J’ai eu le temps de me documenter un peu plus sur l’architecture PIC32 (http://www NULL.microchip NULL.com/stellent/groups/SiteComm_sg/documents/DeviceDoc/en542879 NULL.pdf) et c’est vraiment une architecture plus avancée que l’AVR d’Atmel. Elle offre des performances plus grandes (1,5 Drystone MIPS / MHz), un système de bus matriciel à haute vitesse, un cache à anticipation pour l’accès à la Flash et un mécanisme pour améliorer la compacité code (mélange d’instructions 16 et 32 bits apportant une réduction de 40% du code). L’architecture comparable chez Atmel s’appelle AVR32 (http://en NULL.wikipedia NULL.org/wiki/AVR32) et possède d’autre arguments en sa faveur (instructions SIMD et DSP, machine virtuelle JAVA par exemple). Actuellement aucun projet comparable à Arduino n’est disponible pour AVR32. Après tout cela, même si PIC32 est plus puissante que AVR, cela ne veut pas dire que vous en tirerez parti. Pour faire clignoter une LED, faire un manipulateur électronique ou même piloter un DDS, les Arduino actuels sont plus que largement suffisants.

Il est intéressant de noter que Microchip fait ouvertement référence à Arduino et vante la compatibilité physique et la portabilité du code entre les deux. Les shields proposés par Digilent sont aussi très intéressants et l’idée d’accéder à un Arduino par WiFi me trotte toujours dans la tête (le problème c’est que je n’ai pas trouvé d’application pratique et concrète!). A noter que comme le MSP430, le PIC32 utilise des tensions de 3,3V là où les ATMega sont en 5V. En pratique ça ne pose pas de problèmes, mais c’est à prendre en compte quand vous concevez vos circuits ou adaptez un circuit existant venant du monde Arduino.

On entend souvent la remarque suivante : ” Pour le même prix qu’un Arduino Mega (ou un ChipKIT MAX32) on peut avoir un Rapsberry PI ou une platine de développement à base (http://www NULL.arm9board NULL.net/sel/prddetail NULL.aspx?id=337&pid=199)Carte ARM9 OK6410 (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2012/09/OK6410_itf NULL.jpg)d’ARM (http://www NULL.arm9board NULL.net/sel/prddetail NULL.aspx?id=337&pid=199) qui sera beaucoup plus puissante! “. C’est à la fois vrai et faux. C’est vrai qu’en terme de puissance brute, de mémoire et de fonctionnalités, une carte à base d’ARM9 fait beaucoup mieux qu’un Arduino Mega. Toutefois, en terme de facilité d’accès aux périphériques et de robustesse, le micro-contrôleur l’emporte haut la main. Sur un “PC embarqué”, le système d’exploitation rajoute une couche non négligeable et le temps de développement pour un petit projet sera multiplié par 10. L’autre avantage net du micro-contrôleur c’est qu’une fois votre code rodé, vous pouvez très facilement concevoir vos circuits indépendants utilisant le micro-contrôleur sans la carte autour. Si vous voulez concevoir des petites séries, la réduction des coûts et la simplification du matériel sont très importantes. Là encore, tout dépend de vos besoins, mais pour le bricoleur occasionnel comme moi, le micro-contrôleur est ce qui offre le plus d’avantages.

Manip électronique compatible Winkeyer avec Arduino sur base K3NG

K3NG contest keyer par XV4Y (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2012/09/100_3275 NULL.jpg)Ca y est, j’ai enfin fini de monter le petit circuit de mon manipulateur électronique compatible Winkeyer. En fait de circuit il s’agit en gros d’un transistor et de quelques résistances et condensateurs : pas de quoi casser trois pattes à une diode. le plus gros du travail est fait par le micro-contrôleur de la platine Arduino-Nano, et le code qui tourne sur celui-ci est écrit par K3NG (http://sourceforge NULL.net/projects/k3ngarduinocwke/).

Il y a quelques mois mes essais s’étaient avérés infructueux et je n’arrivais pas à avoir un fonctionnement stable du circuit. Avec les dernières versions du logiciel tout semble réglé et j’ai compilé un binaire qui fonctionne parfaitement bien. J’ai toutefois noté que certaines combinaisons de fonctionnalités (activées à la compilation par des #define) sont instables ou ne se compilent tout simplement pas. Faites des tests en ajoutant progressivement des fonctionnalités si vous trouvez que cela ne marche pas comme vous l’attendez.  Le blog de K3NG étant indisponible depuis le Viêt-Nam en ce moment je n’ai pu lui communiquer mes remarques…

Comme vous pouvez le voir sur la photo j’ai fait une implémentation minimaliste du circuit. En fait je compte l’utiliser uniquement en conjonction avec le logiciel de N1MM pour envoyer les numéros de série durant les concours. La grande majorité des composants sont de récupération (les touches et le buzzer piezo viennent d’un vieux téléphone Panasonic) et comme j’avais la place j’ai ajouté trois touches et le connecteur pour le manip. J’ai fait un petit calcul rapide du coût de ce circuit et en comptant comme composant le plus cher l’Arduino Nano 3.0 de Gravitech (http://www NULL.gravitech NULL.us/arna30wiatp NULL.html) à 35 USD (port non inclus), on arrive à environ 50 USD pour un manipulateur plutôt haut de gamme. Bien entendu, si on souhaite ajouter l’écran LCD (j’attends un LCD 16×2 commandé pas cher sur eBay (http://www NULL.ebay NULL.com/itm/New-1602-16x2-Character-LCD-Display-Module-HD44780-Controller-blue-blacklight-/300777230298?_trksid=p4340 NULL.m1850&_trkparms=aid%3D222002%26algo%3DSIC NULL.FIT%26ao%3D1%26asc%3D11%26meid%3D2126416898780744236%26pid%3D100011%26prg%3D1005%26rk%3D1%26)) et le connecteur pour clavier PS/2, le prix peut monter un peu. A noter que K1EL propose maintenant le WKUSB-Lite (http://k1el NULL.tripod NULL.com/WKlite NULL.html) pour 38 USD (+10 USD de port), ce qui est prix franchement attractif même sans le boîtier ou les boutons.

Arduino Nano clone

En faisant cette recherche je suis tombé sur des clones d’Arduino Nano vendus sur eBay (http://www NULL.ebay NULL.com/itm/Nano-V3-ATmega328P-Free-Mini-USB-Cable-Arduino-compatible-/320983464502?pt=LH_DefaultDomain_0&hash=item4abc1afa36) à moins de 10 USD port inclus. Fabriqués en Chine (soit) en vendus à Hong Kong (bien sûr) ils semblent copier à 100% et parfois améliorer un peu le design de Gravitech (http://www NULL.ebay NULL.com/itm/Meduino-Nano-Enchancement-Arduino-Compatible-3-3-5V-adjustable-16MHz-MEGA328-/150889585154?pt=LH_DefaultDomain_0&hash=item2321b85a02). Comme il n’y a rien de sorcier dans celui-ci et que le code du bootloader Arduino est disponible librement, ces alternatives sont tout à fait viable techniquement. Avec un prix divisé par quatre, il est difficile de résister… Je me disais justement qu’avoir un Arduino supplémentaire pour quelques projets que j’ai en tête et dont je vous parlerai bientôt pourrait être utile, car même le LaunchPad et son MSP430 devraient être bloqués sur ma balise WSPR (http://xv4y NULL.radioclub NULL.asia/2012/05/11/balise-autonome-wspr-avec-msp430/) qui aura mon attention dans les semaines qui viennent.

J’ai lu sur des forums que certains de ces clones à bas prix ne marchaient pas. Il semblerait surtout que ce soit comme d’habitude le contrôle qualité qui est défaillant. Certaines soudures sont mal faites ou des ponts électriques involontaires existent entre des broches de l’ATMega328. Si vous êtes un peu bricoleur, cela ne vous effrayera pas, sinon préférés tout de même le modèle original de Gravitech…

Toujours sur le même thème, on peut utiliser avec un Arduino ou un Launchpad l’écran LCD d’un Nokia 5110 (http://www NULL.ebay NULL.com/itm/84-48-LCD-Module-White-backlight-adapter-pcb-for-Nokia-5110-/140730843931?pt=LH_DefaultDomain_0&hash=item20c436431b). Il est plus souple d’utilisation qu’un traditionnel 16×2 caractères et se trouve pour juste un peu plus cher. Le contrôleur n’est pas le même mais les librairies se trouvent facilement que ce soit pour les AVR ou le MSP430. Par contre, adapter le code de K3NG pour cet écran pourrait demander un peu de travail…

Le Manipulateur électronique Arduino K3NG, circuit par F6ITU

Implémentation du manip Arduino K3NG par F6ITU (http://wiki NULL.electrolab NULL.fr/Projets:Perso:2012:ArduiKeyer)Après avoir essuyé quelques fonctionnements erratiques du manipulateur sans en pouvoir déterminer la cause, j’avais un peu laissé tombé ce projet. De toutes façons je n’avais pas trop le temps pour les concours et ce qui me motivait à monter un manipulateur autour du code de K3NG (http://radioartisan NULL.wordpress NULL.com/arduino-cw-keyer/) c’était de pouvoir l’interfacer en mode WinKeyer avec le logiciel de N1MM (http://n1mm NULL.hamdocs NULL.com/tiki-index NULL.php).

Ces derniers jours j’ai téléchargé une nouvelle version du code sur le nouveau dépôt SourceForge du projet (http://sourceforge NULL.net/projects/k3ngarduinocwke/), pour me rendre compte qu’elle semblait fonctionner parfaitement en local avec Winwarbler de DXLabs. En jetant un oeil sur le blog de K3NG j’ai aussi lu dans les commentaires que F6ITU s’y intéressait et qu’il avait écrit une très belle page en français, bien documentée, autour de son implémentation du circuit (http://wiki NULL.electrolab NULL.fr/Projets:Perso:2012:ArduiKeyer). Je reprocherais toutefois à F6ITU de s’éloigner un peu trop des caractéristiques matérielles définie par K3NG, ce qui va rendre difficile le suivi par des tiers des mises à jour, par ailleurs très régulières. Mais tout est histoire de choix, et rien ne vous empêche de vous inspirer de ce qu’il a fait en restant plus proche de l’origine.

Mon propre objectif pour ce projet est beaucoup plus simpliste puisque je veux juste la fonctionnalité Winkeyer. Toutefois, cette page intéressera beaucoup les francophones qui peuvent être rebutés par le blog de K3NG dont la clarté n’est pas un exemple du genre.

Un PC miniature Quad-Core à 129$

Vu sur ArsTechnica (http://arstechnica NULL.com/gadgets/2012/07/korean-company-offers-3-5-inch-quad-core-arm-linux-computer-for-129/), la société coréenne Hardkernel propose sa carte ODROID-X qui vient compléter la famille des Raspberry Pi, BeagleBoard et consorts.

Carte ODROID-X, PC embarqué (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2012/07/201206301841017729 NULL.jpeg)Visiblement orientée sur le haut du marché, la carte comprend un processeur à quatre coeurs (Samsung Exynos 4 à 1,4 GHz), un processeur graphique quadri-core Mali 400, 1 Go de RAM, 6 ports USB, un port Ethernet, une entrée-sortie audio et un lecteur de carte SDHC. Le processeur étant construit sur l’architecture Cortex A9 d’ARM, il permet de faire tourner Ubuntu et Android.

La carte semble disponible à la vente immédiatement avec une expédition internationale à partir de fin juillet (http://www NULL.hardkernel NULL.com/renewal_2011/products/prdt_info NULL.php?g_code=G133999328931), livraison prévue en 2 semaines par EMS. Le prix de 129$ (plus 30$ de port) est plus élevé que celui d’autres cartes, mais les performances sont à la hausse. A noter la garantie de 4 semaines et l’ensemble de petites notes en bas qui vous font comprendre que l’achat est à vos risques…

Nouveau kit QRSS par G0UPL et G0XAR

Schéma G0UPL G0XAR Balise Multimode (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2012/05/G0UPL-G0XAR-Balise-Multimode NULL.jpg)Hans et Stephen viennent d’annoncer un nouveau kit balise multimode QRSS / QRPp (http://www NULL.hanssummers NULL.com/qrsskitmm). La grande nouveauté de ce kit c’est que le micro-contrôleur est maintenant un ATMega168 ce qui permet de faire beaucoup plus beaucoup plus de choses que le très limité ATTiny13 utilisé précédemment.

Les modes supportés seront :

  • QRSS (télégraphie lente par porteuse ON/OFF)
  • FSK/CW (télégraphie lente par modulation de la fréquence
  • DFCW (télégraphie lente par modulation de fréquence mais traits et points chacun sur une fréquence)
  • WSPR (Weak Signal Propagation Reporter par K1JT)
  • Hellschreiber lent (Hellschreiber lent par modulation de fréquence)
  • Hellschreiber (Hellschreiber vitesse normale et demi-vitesse)
  • CW (télégraphie normale)
  • Motifs FSK personnalisables

Autres fonctionnalités

  • Afficheur LCD 24 caractères LCD et interface utilisateur deux boutons
  • Programmable par l’utilisateur (indicatif, message, vitesse, FSK, mode, etc)
  • Paramètres stockés en EEPROM
  • Interface GPS pour verrouiller la fréquence
  • Génération du message WSPR (pas de PC requis)
  • Le locator de la séquence WSPR peut être généré à partir des informations du GPS
  • Taille de la trame QRSS paramètrable pour une réception QRSS de trames superposées (moyenne étalée dans le temps)
  • Balise CW standard à intervales réglables
  • Produit 150mW en sortie HF, sortie audio possible pour piloter un transceiver
  • Puissance supérieure possible par l’ajout d’un transistor supplémentaire au PA ou par l’utilisation d’une tension d’alimentation supérieure

Les commandes seront ouvertes d’ici une à deux semaines et l’expédition des kits devrait débuter dans trois semaines. Le prix prévu est de l’ordre de 15 à 20£, soit environ 23-31$US ou 18-25€.

Un brouillon du manuel de 26 pages peut-être téléchargé pour avoir plus de détails (http://www NULL.hanssummers NULL.com/images/stories/qrsskitmm/instructions1 NULL.pdf).

Un nouveau PC miniature à 49$

VIA Android PC board (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2012/05/apc-banana-640x358 NULL.jpg)Vu sur l’excellent site Ars Technica (http://arstechnica NULL.com/gadgets/2012/05/another-tiny-computer-vias-49-apc-offers-android-hdmi-video-out/). La société VIA, très connue pour ses chipsets et microprocesseurs pour micro-ordinateurs et compatibles PC, a annoncé la disponibilité d’un nouveau concurrent du Raspberry Pi et consorts (http://xv4y NULL.radioclub NULL.asia/2012/03/15/beagleboard-raspberry-pi-et-autres-pc-embarques-pour-les-radioamateurs/). C’est le APC ou Android PC qui embarque un processeur ARM (ARM11, donc compatible Android contrairement au Raspberry Pi), 512Mo de RAM, 2 Go de mémoire Flash, des sorties VGA, HDMI et audio, une entrée audio, un port MicroSD, un port Ethernet et 4 ports USB. La carte vendue nue et annoncée comme au format Neo-ITX consomme entre 4 et 13,5 Watts et est livré avec une version adaptée d’Android 2.3.

AllWiner Android PC USB clé (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2012/05/ea687cbe6b22cba6b63b77472f9c876d NULL.jpeg)L’article parle aussi d’un autre micro PC à 74$ mais mieux équipé avec Wifi et un processeur Cortex A8 à 1,5GHz qui fait tourner Android 4.0 (http://arstechnica NULL.com/gadgets/2012/05/new-74-android-mini-computer-is-slightly-larger-than-a-thumb-drive/). Avec tout cela, il y a du choix et avec un peu de chance ces produits seront réellement disponibles (qui a un Rasbperry Pi entre les mains ?)…

Bibliothèque RTC pour le MSP430

[GTranslate]

Le micro-contrôleur MSP430G2553 de Texas Instruments livrés avec le LaunchPad dispose de tout le nécessaire pour en faire une horloge temps-réel (RTC). Il suffit de lui connecter un quartz 32KHz et de le programmer convenablement.

TI donne les librairies en assembleur utilisable avec leur environnement de développement. Pour Energia, une nouvelle librairie était nécessaire, je me suis donc attelé à sa conception.

Rien de révolutionnaire, mais ça peut servir à d’autres. C’est sur cette librairie qu’est basée ma balise autonome WSPR que je compte proposer en semi-kit d’ici peu (certainement à mon retour de vacances début juillet). D’origine la dérive en fréquence est de l’ordre du Hertz pour 24 heures (20ppm) ce qui suffit pour une nuit de transmission WSPR, mais peut-être ajustée avec un condensateur variable pour corriger la fréquence du quartz.

Le fichier d’en-têtes (sRTCsec.h) :

/*
 sRTC.h - Library for adding simple RTC capabilities using MSP430 hardware
 By Yannick DEVOS (XV4Y) - 2012

///////////////////////////////// How to use the lib

 * Create an instance of the object

 RealTimeClock myClock;

 * In order to have this RTC library working you should add this code to the end of your main program :

 interrupt(TIMER1_A0_VECTOR) Tic_Tac(void) {
	myClock.Inc_sec();		      // Update secondes
 };

 * Enjoy the clock reading the RTC_sec, RTC_min, RTC_hr variables

 */

// ensure this library description is only included once
#ifndef RTCsec_h
#define RTCsec_h

// library interface description
class RealTimeClockSec
{
	// user-accessible "public" interface
public:
	RealTimeClockSec(void);
	void Set_Time(char hr, char mins, char secs);
    char RTC_sec; // This how you read the time, by reading the vars
    char RTC_min;
    char RTC_hr;
	void Inc_sec(void); // This methode should be invoked by an Interrupt call (see top of the file comment)
	// A few private methods
private:
	void Inc_min(void);
	void Inc_hr(void);
};

#endif

Le code par lui-même (sRTCsec.cpp) :

/*
 sRTC.h - Library for adding simple RTC capabilities using MSP430 hardware
 By Yannick DEVOS (XV4Y) - 2012
 */

// include this library's description file
#include <sRTCsec.h>
#include <legacymsp430.h>

// Constructor /////////////////////////////////////////////////////////////////

RealTimeClockSec::RealTimeClockSec(void)
{
	RTC_sec = 0;
	RTC_min = 0;
	RTC_hr = 0;

	WDTCTL = WDTPW | WDTHOLD; // Kill watch-dog

	BCSCTL1 = DIVA_3;        // Clock = ACLK / 8
	BCSCTL3 |= (LFXT1S_0 | XCAP_3);        // Internal 12.5pF cap for 32KHz crystal

	TA1CCTL0 = CCIE;             //  CCR0 interupt activated
	TA1CCR0 = 4096-1;               // 4096 ticks of 32KHz XTal = 1 second => CCR0 counts N+1
	TA1CTL = TASSEL_1 | ID_3 | MC_1;  // Clock for TIMER 1 = ACLK, By 8 division, up front

};

// Methods /////////////////////////////////////////////////////////////////

void RealTimeClockSec::Inc_sec(void) {
	RTC_sec = RTC_sec + 1;		      // Update seconds
	if (RTC_sec == 60) {
		RTC_sec=0;
		Inc_min();
	};
};

void RealTimeClockSec::Inc_min(void) {
	RTC_min = RTC_min + 1;		      // Update minutes
	if (RTC_min == 60) {
		RTC_min=0;
		Inc_hr();
	};
};

void RealTimeClockSec::Inc_hr(void) {
	RTC_hr = RTC_hr + 1;		      // Update hours
	if (RTC_hr == 24) {
		RTC_hr=0;
	};
};

void RealTimeClockSec::Set_Time(char hrs=0, char mins=0, char secs=0) {
	if ((hrs>=0 && hrs <24) && (mins>=0 && mins<60) && (secs>=0 && secs<60)) {
		RTC_hr = hrs;	// Set time to values given in parameters
		RTC_min = mins;
		RTC_sec = secs;
	};
};

Avec un exemple (testé sous Energia 005a) c’est plus facile à comprendre :

#include &lt;sRTCsec.h&gt;
#include &lt;legacymsp430.h&gt;
#include &lt;TimerSerial.h&gt;

TimerSerial mySerial;
RealTimeClockSec myRTC;

  int ledState = LOW;

void setup() {
  pinMode(2, OUTPUT);

  // This is to close the serial output so you are able to upload a new sketch to the LaunchPad
  pinMode(5, INPUT_PULLUP),
  attachInterrupt(5,fin,LOW);

  mySerial.begin();

};

// The LED1 will blink each exact second and the time will be printed to the serial port
void loop() {
  if ((myRTC.RTC_sec % 2)==0 && ledState== HIGH) {
  ledState = LOW;
  mySerial.print(myRTC.RTC_min, DEC);
  mySerial.print(":");
  mySerial.println(myRTC.RTC_sec, DEC);
  digitalWrite(2, ledState);
  };

  if ((myRTC.RTC_sec % 2)==1 && ledState== LOW) {
  ledState = HIGH;
  mySerial.print(myRTC.RTC_min, DEC);
  mySerial.print(":");
  mySerial.println(myRTC.RTC_sec, DEC);
  digitalWrite(2, ledState);
  };
};

void fin() {
  mySerial.end();
};

interrupt(TIMER1_A0_VECTOR) Tic_Tac(void) {
	myRTC.Inc_sec();		      // Update secondes
};

Balise autonome WSPR avec MSP430

[GTranslate]

Ces derniers jours je me suis amusé un peu à programmer le LaunchPad de TI avec Energia. Le but étant de voir si du code Arduino (AVR ATMega) était facilement portable sur le MSP430.

Capture port série Balise WSPR MSP430 XV4Y (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2012/05/Capture-Balise-WSPR-MSP430 NULL.jpg)La réponse est oui, si le code est propre (pas toujours facile) et s’il n’utilise pas des librairies non encore portée sur Energia (ce qui va diminuer avec le temps). En pratique je suis parti d’un morceau de code de F4GKA/VA2GKA (http://www NULL.itsrainingelephants NULL.com/2012/04/29/wspr-30m-ready/#comments) et d’un autre de DH3JO (http://wsprnet NULL.org/drupal/node/1342) pour faire une balise WSPR autonome. Le code est fonctionnel mais n’a pas encore été testé sur l’air. Cerise sur le gâteau, il est “rétroportable” sur Arduino car il suffit de changer les numéros de broches.

J’ai encore un peu de travail autour de cela, mais pour les curieux voici les résultats de quelques heures de réflexion ce matin. Il me faut maintenant connecter cela sur la balise QRSS du kit de G0UPL / G0XAR et voir comment cela se comporte en particulier du point de vue dérive de la synchronisation dans le temps. Contrairement à mon Arduino Nano le LaunchPad n’est pas équipé d’origine d’un quartz mais j’ai ce qu’il faut sous la main.

Au passage la modification du kit balise QRSS peut se faire comme l’a fait IW1QLH avec une échelle R-2R (http://www NULL.iw1qlh NULL.net/index NULL.php/projects-hardware-mainmenu-66/99-qrp/115-qrss-beacon).

Le fichier pour Energia/Arduino est disponible au téléchargement (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2012/05/WSPR_autonome_XV4Y NULL.txt). Attention, il faudra renommer le fichier en .ino au lieu du .txt (WordPress n’aime pas les .ino)

/* WSPR Static Generator for MSP430G2553
* Code for Energia 005a</code>

* By Yannick DEVOS - XV4Y - May 2012
* Free for HAM Radio usage

* Based on VA2GKA Guenael Jouchet code for sending
* Based on DH3JO Martin Nawrath for WSPR sequence encoding

*
* Internal clock of MSP430 could be not stable enough, try a Crystal
* Start the circuit on the second 0 of an odd minute

* Ouput on 2 bits PinA and PinB
* Mirror on LED1 and LED2 du LaunchPad for testing
* Output to Serial for testing
* Using an R-2R ladder it makes the G0UPL/G0XAR beacon frequency shift
*/

#include// Comment on Arduino, replace mySerial by Serial everywhere

#define wsprPinA 7
#define wsprPinB 6
#define LEDPinA 14
#define LEDPinB 2
#define StartBtn 5

const char SyncVec[162] = {
1,1,0,0,0,0,0,0,1,0,0,0,1,1,1,0,0,0,1,0,0,1,0,1,1,1,1,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0,1,0,
1,1,0,0,1,1,0,1,0,0,0,1,1,0,1,0,0,0,0,1,1,0,1,0,1,0,1,0,1,0,0,1,0,0,1,0,1,1,0,0,0,1,1,0,1,0,1,0,
0,0,1,0,0,0,0,0,1,0,0,1,0,0,1,1,1,0,1,1,0,0,1,1,0,1,0,0,0,1,1,1,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,0,
0,0,0,1,1,0,1,0,1,1,0,0,0,1,1,0,0,0
};

const char call[] = "XV4Y ";
const char locator[] = "OK20";
const byte power = 20;

int i;
char symbol;

int ii,bb;

byte c[11]; // encoded message

byte sym[170]; // symbol table 162
byte symt[170]; // symbol table temp
unsigned long n1; // encoded callsign
unsigned long m1; // encodes locator

TimerSerial mySerial; // Comment on Arduino

//******************************************************************
// Defining pins mode
// Encoding the WSPR sequence

void setup() {
mySerial.begin(); // Comment on Arduino
pinMode(wsprPinA, OUTPUT); // Change for Arduino/AVR
pinMode(wsprPinB, OUTPUT); // Change for Arduino/AVR
pinMode(LEDPinA, OUTPUT); // Change for Arduino/AVR
pinMode(LEDPinB, OUTPUT); // Change for Arduino/AVR
pinMode(StartBtn, INPUT_PULLUP); // INPUT for Arduino and put pin to HIGH
// digitalWrite(StartBtn, HIGH); // Don't use this on LaunchPad/MSP430

mySerial.print("\n\n\n*** MSP430 WPSR beacon \n");

encode_call();
mySerial.print("call: ");
mySerial.print(call);
mySerial.print(" ");
mySerial.print(n1,HEX);
mySerial.println(" ");

encode_locator();
mySerial.print("locator: ");
mySerial.print(locator);
mySerial.print(" ");
mySerial.print(m1 &lt;&lt; 2,HEX);
mySerial.println(" ");
for (bb=0;bb mySerial.print(c[bb],HEX);
mySerial.print(",");
}
mySerial.println("");
encode_conv();

mySerial.println("");

for (bb=0;bbmySerial.print(symt[bb],DEC);
mySerial.print(".");
if ( (bb+1) %32 == 0) mySerial.println("");
}
mySerial.println("");

interleave_sync();

mySerial.println("Channel symbols :");
for (bb=0;bb mySerial.print(sym[bb],DEC);
mySerial.print(".");
if ( (bb+1) %32 == 0) mySerial.println("");
}
mySerial.println("");

};

//******************************************************************
// Here starts the actual sequence sending

void loop() {
digitalWrite( wsprPinB, LOW );
digitalWrite( LEDPinB, LOW );

digitalWrite( wsprPinA, LOW );
digitalWrite( LEDPinA, LOW );
mySerial.println("*** Sequence sending delayed.");
mySerial.println("*** Press S2 to start now.");
i = 0;
while (i &lt; 9408) {
delay(1);
if (digitalRead(StartBtn)==LOW) {
i = 20000;
} else {
i++;
};

}

for (i = 0; i &lt; 170; i++) { symbol = sym[i]; mySerial.print(symbol%10, DEC); mySerial.print(" "); digitalWrite( wsprPinB, (symbol &gt;&gt; 1) );
digitalWrite( LEDPinB, (symbol &gt;&gt; 1) );

digitalWrite( wsprPinA, (symbol &amp; 1) );
digitalWrite( LEDPinA, (symbol &amp; 1) );
delay(682.667);
};
mySerial.println("\n *** End of sequence");
};

/* Functions declaration
* This code by DH3JO
* KHM 2009 / Martin Nawrath
* Kunsthochschule fuer Medien Koeln
* Academy of Media Arts Cologne
*/

//******************************************************************
void encode() {
encode_call();
encode_locator();
encode_conv();
interleave_sync();
};
//******************************************************************
// normalize characters 0..9 A..Z Space in order 0..36
char chr_normf(char bc ) {
char cc=36;
if (bc &gt;= '0' &amp;&amp; bc = 'A' &amp;&amp; bc &gt; 20;
t1=n1;
c[1]= t1 &gt;&gt; 12;
t1=n1;
c[2]= t1 &gt;&gt; 4;
t1=n1;
c[3]= t1 &lt;&lt; 4; } //****************************************************************** void encode_locator(){ unsigned long t1; // coding of locator m1=179-10*(chr_normf(locator[0])-10)-chr_normf(locator[2]); m1=m1*180+10*(chr_normf(locator[1])-10)+chr_normf(locator[3]); m1=m1*128+power+64; // merge coded locator and power into message array c[] t1=m1; c[3]= c[3] + ( 0x0f &amp; t1 &gt;&gt; 18);
t1=m1;
c[4]= t1 &gt;&gt; 10;
t1=m1;
c[5]= t1 &gt;&gt; 2;
t1=m1;
c[6]= t1 &lt;&lt; 6;

}
//******************************************************************
// convolutional encoding of message array c[] into a 162 bit stream
void encode_conv(){
int bc=0;
int cnt=0;
int cc;
unsigned long sh1=0;

cc=c[0];

for (int i=0; i &lt; 81;i++) {
if (i % 8 == 0 ) {
cc=c[bc];
bc++;
}
if (cc &amp; 0x80) sh1=sh1 | 1;

symt[cnt++]=parity(sh1 &amp; 0xF2D05351);
symt[cnt++]=parity(sh1 &amp; 0xE4613C47);

cc=cc &lt;&lt; 1;
sh1=sh1 &lt;&lt; 1;
}

}

//******************************************************************
byte parity(unsigned long li)
{
byte po = 0;
while(li != 0)
{
po++;
li&amp;= (li-1);
}
return (po &amp; 1);
}

//******************************************************************
// interleave reorder the 162 data bits and and merge table with the sync vector
void interleave_sync(){
int ii,ij,b2,bis,ip;
ip=0;

for (ii=0;iibis=1;
ij=0;
for (b2=0;b2 &lt; 8 ;b2++) { if (ii &amp; bis) ij= ij | (0x80 &gt;&gt; b2);
bis=bis &lt;&lt; 1;
}
if (ij &lt; 162 ) {
sym[ij]= SyncVec[ij] +2*symt[ip];
ip++;
}
}
}

Premiers pas avec le LaunchPad de TI

Texas Instruments LaunchPad Value kit MSP430 (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2012/05/100_3157 NULL.jpg)J’ai reçu mes deux kits LaunchPad il y a quelques jours. Oui, deux, car une première commande qui s’était conclue par une erreur du serveur web a quand même abouti. A 4,30$ le bout je n’ai pas annulé la commande… Au passage, livraison en temps record par Fedex avec 4 jours ouvrés, la douane ne semble même pas avoir ouvert le paquet.

La présentation est beaucoup plus valorisante que celle de l’Arduino Nano qui m’était tombé entre les mains il y a un an. Belle boîte, câble USB, petits autocollants, connecteurs… rien ne manque. Bonne nouvelle aussi, les micro-contrôleurs livrés sont équipés de respectivement 16ko (MSP430G2553) et 8ko (MSP430G2452), beaucoup mieux que les 1 et 2ko indiqués sur le site web lors de la commande. Détail pratique : la platine du Launchpad est équipée de petits patins en mousse permettant de la poser sur un bureau sans problèmes.

IDE Energia pour LaunchPad sous OS X (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2012/05/Energia_Launchpad NULL.jpg)J’ai commencé à jouer un peu avec ce circuit en utilisant l’IDE Energia. Ce dernier étant un fork d’Arduino, la prise en main est rapide. Le fait de se retrouver avec un langage similaire (inspiré de Wiring/Processing) aide aussi beaucoup. Par contre le manque de documentation ou du moins l’absence d’homogénéité de celle-ci est pénalisante. Contrairement à la plateforme Arduino pas de définition matériel précise et le brochage n’est pas évident à connaître car il change suivant la version du processeur. Les terminologies utilisées me paraissent un peu obscures mais c’est peut-être une histoire de temps pour trouver les docs.

En tous cas, le fait de pouvoir programmer facilement le micro-contrôleur et ensuite implanter le CI autonome dans un circuit ouvre de nouvelles possibilités.

Petit ajout : La version d’Energia que j’utilise est la 005a, mais celle sur laquelle travaille les développeur est la 006. Pas mal de travail entre les deux, en particulier sur le nommage des broches. L‘exemple disponible en ligne pour utiliser la sonde thermomètre ne fonctionne pas tel que car la broche P1.3 qui lit le contact PUSH2 semble en état instable. Elle permet en tous cas de voir que les broches sont accessibles tout simplement par le numéro sur le boîtier, mais il faut alors se plonger dans les datasheet… D’autres exemples sont en ligne mais sont prévus pour la 006, et je n’ai pas trop envie de me mettre à compiler moi-même le logiciel.

Convertisseur port USB vers port parallèle Centronics

Convertisseur USB parallèle - dos PCB (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2012/05/ul-16i2 NULL.jpg)Au passage, pour ceux qui utilisent encore des interface de programmation à port parallèle pour leurs PIC, AVR ou autres micro-contrôleurs, voici un petit convertisseur à réaliser soit même pour un coût tout à fait modique (http://www-user NULL.tu-chemnitz NULL.de/~heha/bastelecke/Rund%20um%20den%20PC/USB2LPT/ul-16 NULL.en NULL.htm). Attention, il semblerait qu’il soit trop lent pour une imprimante par contre…