Archives par mot-clé : arduino

Ten-Tec 506 Rebel : le tranceiver HF QRP Open Source

L’information m’est venue de plusieurs côté mais c’est indéniablement K4SWL qui a écrit l’article le plus complet car il a eu la chance d’être béta-testeur de ce nouveau produit (http://qrper NULL.com/2013/05/ten-tec-introduces-the-model-506-rebel-an-open-source-qrp-transceiver/).

Ten-Tec 506 Rebel (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2013/05/TenTec506Rebel NULL.jpeg)Le Modèle 506 Rebel est un petit transceiver décamétrique qui opère en télégraphie sur les bandes 40 ou 20 mètres. Ce n’est pas un kit, mais son design est évolutif et Il a la particularité d’utiliser comme micro-contrôleur une platine ChipKIT Uno 32 (http://xv4y NULL.radioclub NULL.asia/2012/09/20/programmer-un-micro-controleur-pic-comme-un-arduino/) qui utilise un environnement de développement issu d’Arduino avec un micro-contrôleur PIC32. Le code source du programme est ouvert au pubic et vous pouvez le modifier et le télécharger dans le transceiver en un clin d’oeil.

Vous l’avez deviné, le VFO utilise un DDS mais il n’y a pas d’affichage de la fréquence sur le modèle de base (des circuits tiers sont dors et déjà adaptables). L’affichage des fonctions engagées et la selection des valeurs de bande passante du filtre ou de pas de VFO se font par deux séries de trois LEDs et deux boutons situées de chaque côté du vernier. Une LED supplémentaire dans le logo Ten-Tec informe par exemple du passage de chaque KHz. Par défaut le Rebel est prévu pour utiliser une pioche, il semble nécessaire d’activer le manipulateur électronique via une mise à jour du logiciel. La puissance en émission est d’environ 4-5W pour 10-15V en entrée.

Chose intéressante, le choix du ChipKIT Uno 32 comme micro-contrôleur est largement surdimensionné pour simplement contrôler un DDS et faire le manipulateur électronique. Cela montre que Ten-Tec avait clairement en tête de permettre aux acheteurs d’implémenter des fonctions plus évoluées. Un afficheur de spectre audio (http://xv4y NULL.radioclub NULL.asia/2012/10/11/spectroscope-audio-avec-arduino/) étant à la portée d’un Arduino Nano (ATMega328), implémenter un véritablement traitement du signal de style DSP sur le PIC32 doit être possible.

Du point de vue des performances, Thomas K4SWL les trouve tout à fait en ligne avec ce que l’on peut attendre d’un petit transceiver QRP à bas prix.

La disponibilité et le prix du nouveau Ten-Tec Modèle 506 Rebel seront annoncé sur le salon de Dayton au cours de la célèbre convention d’amateurs de QRP les FDIM (Four Days in May).

Mise à jour du Keyer Arduino de K3NG

K3NG contest keyer par XV4Y (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2012/09/100_3275 NULL.jpg)Ce week-end c’est le concours Japan International DX (JIDX) (http://jidx NULL.org/) partie télégraphie. Je mets donc à jour mon programme de cahier de trafic (N1MM) ainsi que le manipulateur électronique USB. Ca faisait longtemps que je n’avais pas jeté un oeil sur le code source du Manipulateur Electronique pour Arduino de K3NG (http://sourceforge NULL.net/projects/k3ngarduinocwke/files/?source=navbar) et pas mal de fonctionnalités ont été ajoutées. Je vous conseille donc de regarder un peu le descriptif détaillé sur son blog (http://blog NULL.radioartisan NULL.com/arduino-cw-keyer/) et de télécharger la mise à jour si vous l’utilisez.

Mesure de distances avec un capteur ultrason et un Arduino

Capteur Ultrason Arduino XV4Y (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2013/04/100_3524 NULL.jpg)Pour un projet professionnel auquel je participe avec un ami (il lit ces lignes donc je précise ami, ça ne coûte rien), je dois réaliser tout un tas de mesures sur ce qu’on pourrait appeler un environnement industriel. Vitesse de moteurs, niveaux de cuves, ouverture de portes…

J’ai donc commandé quelques échantillons de capteurs histoire de voir comment causer avec, interpréter leurs données et surtout vérifier s’ils étaient adaptés aux mesures qu’on veut leur faire faire et à l’environnement particulier d’installation. Parmi ceux-ci un des moins chers et des plus simples à utiliser est un capteur ultrason pour mesurer des distances. Suivant le descriptif, il se commande par une broche se lit par une autre, répond vite, fait des mesures jusque 4,5m avec une précision de 3mm. Le signal est envoyé par un transducteur (un petit haut-parleur piezo) sur une fréquence d’environ 40 KHz et reçu un peu plus tard par un autre. Il s’alimente en 5V et la consommation est inconnue mais vraisemblablement faible.

Première remarque, les deux cellules émettrice et réceptrice étant séparée de quelques centimètres, il faut que vous soyez bien “parallèle” à l’objet à mesurer, surtout pour des mesures à courte distance. Deuxième remarque, le signal transmis est assez peu directif, et un objet passant dans un champs de 90° est vite détecté et vient parasiter vos mesures. Troisième remarque, pour des mesures en champ lointain, il faut que l’objet à mesurer soit plan sinon l’écho retransmis est trop faible.

A ceci, vient s’ajouter une confusion qui est souvent faite entre précision de la mesure et justesse (ou taux d’erreur). Le fait que ce capteur est vendu à un français par des chinois qui écrivent en anglais n’aide pas à se mettre d’accord sur les mots. Tout cela pour dire que si les mesures ont une précision de 3mm, l’erreur est elle vraisemblablement supérieure au centimètre pour la distance maximale (de l’ordre de 1% semble probable). Je tiens encore une fois à préciser que j’ai pris le capteur le moins cher et qu’il y a certainement mieux sur le marché, mais les grands principes sont les mêmes.

Dernier, point, contrôler et lire ces capteurs est donc très simple, et j’ai d’abord tenté de faire mes mesures “à la mimine” comme on le voit sur beaucoup d’exemple. Ceux qui font ça n’ont pas du beaucoup valider leurs résultats ensuite. Même après filtrage des valeurs incohérentes et calcul d’une moyenne, la qualité des mesures était mauvaise. Ensuite je suis passé par la librarie NewPing et là tout de suite c’est devenu plus exploitable (mais avec les restrictions données ci-dessus).

En conclusion, si vous êtes intéressés pour faire des mesures avec de tels capteurs, je vous conseille d’abord de commencer par un proto et de valider son fonctionnement dans vos conditions avant de vous lancer. Pour moi, l’application de tels capteurs est plutôt dans le cadre de détection d’approche, de radar de recul ou de détecteur de présence, mais pas vraiment dans la mesure. A noter que souvent ils sont présentés comme Ultrasonic Range Detection Sensor et non comme outil de mesure… mais la suite de la description joue sur les mots.

Je publie ci-dessous mon code en sachant qu’il n’apporte pas grand chose par rapport aux exemples donnés avec la librairie NewPing, mais ça peut toujours servir.

/*
Prototype mesures ultrason avec affichage LCD
By Yannick DEVOS - XV4Y
http://xv4y.radioclub.asia/

Copyright 2013 Yannick DEVOS under GPL 3.0 license
Any commercial use or inclusion in a kit is subject to author approval

====
The display is on a 16x2 LCD Display with HD44780 compatible driver, use the traditional 4 bits interface on pins 10, 9, 8, 7, 6, 5

In order to compile this program with Arduino 1.0.1, you will need to install 2 libraries :
- New LiquidCrystal
https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home
- NewPing ultrasound sensor library
https://code.google.com/p/arduino-new-ping/

====
Revision history :
v1.00    2013-04-11
         First release

====

*/

#include <Wire.h>
#include <LiquidCrystal.h>
#include <NewPing.h>

// ****
// Here some Parameters you may change
// ****

#define ULTRA_TRIGGER A2        // What pin we have connected the Ultrasonic range sensor Trigger pin
#define ULTRA_ECHO    A3        // What pin we have connected the Ultrasonic range sensor Echo pin
#define MAX_DISTANCE 350        // Maximum distance we want to ping for (in centimeters). Most sensor are rated at 400-500cm.

// Variables
unsigned long duration=0;
long int      distance=0;

LiquidCrystal lcd(5, 6, 7, 8, 9, 10);  // You can change this settings to your convenance, please see the library documentation
NewPing sonar(ULTRA_TRIGGER, ULTRA_ECHO, MAX_DISTANCE); // NewPing setup of pins and maximum distance.

void setup()
{
  lcd.begin(16,2);
  lcd.home ();

  lcd.print("Ultraçon");

  pinMode(ULTRA_TRIGGER, OUTPUT);
  pinMode(ULTRA_ECHO, INPUT);

  delay(1000);
  lcd.clear();
  lcd.setCursor ( 0, 0 );
  lcd.print("Distance"); 
}

void loop()
{

  // The speed of sound is 340 m/s or 29 microseconds per centimeter.
  // The ping travels out and back, so to find the distance of the
  // object we take half of the distance travelled.
    duration = sonar.ping_median(5);  // We do 5 measurements to have a good average and filter bad measurements
    distance = ((340 * duration) / 1000)/2;

    lcd.setCursor ( 0, 1 );
    lcd.print("              mm");
    lcd.setCursor ( 0, 1 );
    lcd.print(distance);
    delay(500);

}

Station météo avec serveur web – code source

Prototype station météo (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2013/02/100_3440 NULL.jpg)J’ai continué mes travaux autour de ma mini-station météo avec serveur web. J’ai atteint les objectifs de fonctionnalités que je m’étais fixés, même s’il me reste à enrichir de quelques indicateurs les statistiques. Ensuite il me faudra repasser toutes les valeurs en type float car je les avais mises en entier pour gagner de la place mémoire et parce que l’espace d’affichage sur l’écran LCD était limité. Il me faudra aussi faire un peu de gestion de la cohérence des valeurs pour éviter d’afficher 255°C quand mon capteur distant n’a plus de piles (comme actuellement). A propos du capteur distant, il faudra aussi que je travaille sur son code pour gérer la mise en veille afin d’économiser les batteries. Dernier point important, j’attends toujours mes capteurs de pression atmosphérique (ils sont assez chers donc j’ai hésité à les inclure dans les kits) pour pouvoir gérer ce type de mesures. L’architecture générale étant présente ça ne devrait pas prendre trop de temps à mettre en place.

Vous pouvez donc le voir par vous-même sur ce prototype de mini serveur web météo (http://cairang NULL.radioclub NULL.asia:8080/), cela fonctionne et plutôt bien à mon goût. Ne vous étonnez pas si parfois il y a peu de valeurs affichées car je continue à faire des tests et à remettre à zéro les mémoires…

J’ai même eu ma première commande, car XYL a trouvé cela pratique (pour une fois à propos de mes montages) et en aura besoin d’un pour son café-restaurant. Les services de l’hygiène demande de relever ces valeurs chaque jour en principe, même si dans la réalité peu de monde le fait… Comme elle ne prévoit pas d’ouvrir le service de restauration avant avril, j’ai le temps de mettre tout cela au point.

Je dois encore faire une étude précise, mais je pense pouvoir proposer ces stations météos autour de 70$, le prix variant suivant les options (écran, contrôleur Ethernet, capteur de pression…). Dès que je peux, je mets les informations à jour sur la page produit de la boutique (http://xv4y NULL.radioclub NULL.asia/boutique/?slug=product_info NULL.php&products_id=31). Les composants sont en fait assez chers si on veut une précision correcte (les capteurs DHT-11 par exemple ne sont bons que pour des mesures relatives) et il y a deux micro-contrôleurs (un pour la station et un pour le capteur distant). Dans tous les cas ça ne sera pas avant mi-mars prochain car les approvisionnements vont être bloqués pour plusieurs semaines à partir du week-end prochain avec le nouvel an lunaire.

En attendant je partage avec vous le code source du premier programme de test que j’avais fait pour mon prototype de mini station météo web (http://xv4y NULL.radioclub NULL.asia/2013/02/01/mini-station-meteo-web/). Il a évolué depuis mais celui-ci en principe fonctionne et offre le service de base… Il est prévu pour un Arduino Nano (ATMega328) et se compile avec Arduino 1.0.1. Je vous conseille d’utiliser mes packages librairies (http://xv4y NULL.radioclub NULL.asia/boutique/docs/) pour pouvoir les compiler.

/*
Arduino Thermometer and Humidity mini web server using internal and remote DHT11 sensors
By Yannick DEVOS - XV4Y
http://xv4y.radioclub.asia/

Copyright 2013 Yannick DEVOS under GPL 3.0 license
Any commercial use or inclusion in a kit is subject to author approval

====
This program sense and displays the current temperature and relative humidity for a local and remote sensors
It serve the values to a mini web server thanks to an ENC28J60 Ethernet module

In order to compile this program with Arduino 1.0.1, you will need to install 3 libraries :
- DHT-sensor Library by Adafruit
https://github.com/adafruit/DHT-sensor-library
- VirtualWire Library by Mike McCauley
http://www.open.com.au/mikem/arduino/VirtualWire.pdf
- Ethercard Library by JeeLabs
http://jeelabs.net/pub/docs/ethercard/index.html
====
Revision history :
v1.00    2013-02-02
         First release with mini web server test
====
This program needs at least 2KB of SRAM, that means an ATMega328...

The DHT11 Sensor need to be connected as described here below
- Connect pin 1 (on the left) of the sensor to +5V
- Connect pin 2 of the sensor to whatever your DHTPIN is (here pin D12)
- Connect pin 4 (on the right) of the sensor to GROUND
- Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor
We also need a push button on pin D2.

For RF modules, please see the VirtualWire documentation

====
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You can download a copy of the GNU General Public License at <http://www.gnu.org/licenses/>
*/

#include <EtherCard.h>
#include "DHT.h"
#include <VirtualWire.h>

// Here some parameters you would like to edit

#define RXPIN  A1        // What pin we use for Remote Sensor RX module
#define BAUDRATE 2000    // Transmission speed in bps, 1000-2000 is ok a give similar ranges, higher is useless
#define RX_LOST 60       // Max time in seconds without the sensor is considered lost
#define DHTPIN A2        // What pin we have connected the DHT sensor
#define DHTTYPE DHT22

// ethernet interface ip address
static byte myip[] = { 192,168,1,100 };
// gateway ip address
static byte gwip[] = { 192,168,1,254 };

// ethernet mac address - must be unique on your network
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };

const byte header[4] = {0x01,'D','H','T'};

// Here you should not be touching it

const char http_OK[] PROGMEM =
    "HTTP/1.0 200 OK\r\n"
    "Content-Type: text/html\r\n"
    "Pragma: no-cache\r\n\r\n";

const char http_Found[] PROGMEM =
    "HTTP/1.0 302 Found\r\n"
    "Location: /\r\n\r\n";

const char http_Unauthorized[] PROGMEM =
    "HTTP/1.0 401 Unauthorized\r\n"
    "Content-Type: text/html\r\n\r\n"
    "<h1>401 Unauthorized</h1>";

DHT dht(DHTPIN, DHTTYPE);

byte Ethernet::buffer[700]; // tcp/ip send and receive buffer
BufferFiller bfill;

int hi=0xFF, ti=0xFF, hr=0xFF, tr=0xFF;
int last_rx;
unsigned int counter=0;

float tf=1;

byte buf[VW_MAX_MESSAGE_LEN];
byte buflen = VW_MAX_MESSAGE_LEN;

void setup(){
  ether.begin(sizeof Ethernet::buffer, mymac);  // Start the Ethernet module
  ether.staticSetup(myip, gwip);

  vw_set_rx_pin(RXPIN);
  vw_setup(BAUDRATE);

  vw_rx_start();       // Start the RF receiver PLL running
}

void loop() {

  hi = int(dht.readHumidity());    // we convert to integer since the DHT11 has not enough precision anyway
  ti = int(dht.readTemperature());

  if (vw_have_message()) {  // If we have a message from the RF module
    if (vw_get_message(buf, &buflen) && !memcmp(&buf, &header,4)) // If it is checked and the header is the same
    {
      // First temp, the RF module send a float but we only display an integer
      memcpy(&tf, &buf[4], 4);
      tr = int(tf);

      // THen humidity
      memcpy(&tf, &buf[8], 4);
      hr = int(tf);

      last_rx = millis()/1000;  // We save when was the last data received
    }
  }

  if ((millis()/1000) > (last_rx+RX_LOST)) {    // Without signal from the sensor for more than RX_LOST seconds, the sensor is considered out of reach
    hr = 0xFF;
    tr = 0xFF;
  }  

  // wait for an incoming TCP packet, but ignore its contents
  word len = ether.packetReceive();
  word pos = ether.packetLoop(len); 
  if (pos) {
    delay(1);
       bfill = ether.tcpOffset();
       char *data = (char *) Ethernet::buffer + pos;
    if (strncmp("GET /", data, 5) != 0) {
       // Unsupported HTTP request
       // 304 or 501 response would be more appropriate
       bfill.emit_p(http_Unauthorized);
    } else {
       data += 5;

       if (data[0] == ' ') {
           // Return home page
           homePage();
           counter++;
       } else {
           // Page not found
           bfill.emit_p(http_Unauthorized);
       }
    }
        ether.httpServerReply(bfill.position());    // send http response
  }
}

void homePage()
{
    bfill.emit_p(PSTR("$F"
        "<meta http-equiv='refresh' content='5'/>"
        "<title>Mini web météo v1.0 XV4Y</title>" 
        "<h1>Le temps du delta du mékong chez <a href=\"http://xv4y.radioclub.asia\">XV4Y</a></h1>"
        "<h2>Capteur interne</h2>"
        "Temp : $D°C</br>"
        "Hum. : $D%</br>"
        "<h2>Capteur distant</h2>"
        "Temp : $D°C</br>"
        "Hum. : $D%"
        "<h6>$Dème connexion.</h6>"
        "<h5>Copyright(C)2013 - <a href=\"http://xv4y.radioclub.asia/\">Yannick DEVOS XV4Y</a></h5>"
        ),
        http_OK,
        ti,
        hi,
        tr,
        hr,
        counter);
}

Voici aussi le code pour le capteur distant. Il fonctionne lui sur un MSP430G2452 et est écrit avec Energia 009.

/* Remote Temperature/Humidity sensor for MSP430G2452
 * Code for Energia 009

 * By Yannick DEVOS - XV4Y - December 2012
    http://xv4y.radioclub.asia/

    Copyright 2012-2013 Yannick DEVOS under GPL 3.0 license
    Any commercial use or inclusion in a kit is subject to author approval

====
  * Run on MSP430G2452
  * Hook a DHT sensor module to pin P2_1
  * Hook a 433MHz TX module to P2_4
  * Several pins are available for LED debugging
====
Revision history :
v1.00    2012-12-18
         First release, without MCU power saving features

====
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You can download a copy of the GNU General Public License at <http://www.gnu.org/licenses/>
*/

#include "DHT.h"
#include <VirtualWire.h>

#define DHTTYPE DHT11
#define DHTPIN   P2_1     // DATA Pin pour le DHT
#define TXPIN    P2_4     // DATA Pin pour le module TX RF
#define BAUDRATE 2000     // Transmission speed in bps, 1000-2000 is ok a give similar ranges, higher is useless
#define PWRPIN   P1_6     // Pin to turn ON/OFF power to the modules
#define LEDERR   P1_0     // This LED will turn on when DHT is not ok

float h, t;
byte trame[12] = {0x01,'D','H','T',0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};  // The frame to be transmitted with "DHT" as header

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  pinMode(PWRPIN, OUTPUT);     
  pinMode(LEDERR, OUTPUT);     

  vw_set_tx_pin(TXPIN);
  vw_setup(BAUDRATE);

  dht.begin();
}

void loop() {
  digitalWrite(PWRPIN, HIGH);  // Apply power to the modules
  delay (1000);                // We have to wait 1 second to let the DHT sensor stabilize

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  t = dht.readTemperature();
  h = dht.readHumidity();

  // Check if returns are valid, if they are both 0 then something went wrong!
  if (t == 0 && h == 0) {
    digitalWrite(LEDERR, HIGH);
  } else {
    // First temperature
    memcpy(&trame[4], &t, 4);
    // Then humidity
    memcpy(&trame[8], &h, 4);
    vw_send((byte *)trame, 12);
    digitalWrite(LEDERR, LOW);
  }
  vw_wait_tx(); // Wait until the whole message is gone

  digitalWrite(PWRPIN, LOW);  // We turn off power to save batteries
  delay(5000);                // We rest 5 seconds before the next reading, longer wait time will save more batteries...

}

 

Mini station météo web [MAJ]

Capture écran mini web météo XV4Y (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2013/02/WebMeteoXV4Y NULL.jpg)Pas mal de boulot ces derniers jours mais cet après-midi j’ai eu le temps de bricoler un peu. J’ai reçu un module Ethernet que je me suis empressé de connecter à un Arduino pour bricoler un petit serveur web embarqué. Histoire d’avoir quelque chose d’intéressant à afficher, j’ai aussi raccordé un module DHT22 (capteur température et humidité) sur le micro-contrôleur. Résultat, un mini serveur web météo (http://cairang NULL.radioclub NULL.asia:8080/) que vous pouvez consulter ici. Attention, je ne pense pas le laisser ad vitam eternam et surtout mon adresse IP n’est pas fixe donc en cas de coupure électrique ce ne sera plus la même.

Prototype serveur web météo kit Arduino (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2013/02/100_3437 NULL.jpg)Pour l’instant c’est vraiment du bricolage et le code n’est pas publiable. Dès que j’aurais quelque chose de plus propre intégrant la lecture d’une sonde distante par liaison radio, l’utilisation d’une horloge RTC sauvegardée par batterie et les statistiques en EEPROM, ça pourrait faire l’objet d’un kit sympa! On peut en effet s’affranchir vite des limites d’affichage des écrans LCD et avoir des statistiques plus intéressantes. Je vous tiens au courant et je publie le code dès qu’il est “propre”.

Sonde météo distance 433 MHz (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2013/02/100_3439 NULL.jpg)Mise à jour : ce matin, XYL est partie avec les enfants donc j’ai le temps de jouer un peu… J’ai intégré le code du serveur web dans celui existant de la station météo (http://xv4y NULL.radioclub NULL.asia/2012/10/26/station-meteo-a-memoire-avec-arduino-et-dht11/) et il affiche à présent les deux capteurs (internet et distant par liaison radio 433 MHz (http://xv4y NULL.radioclub NULL.asia/2013/01/09/librairie-virtualwire-1-10-pour-le-msp430/)) ainsi que l’horloge RTC. Attention, pour l’instant il n’y a pas de vérification de la pertinence des valeurs et en cas de problème de liaison HF par exemple les valeurs affichées peuvent être incohérentes. Il me manque surtout l’aspect statistiques (sauvegarde en EEPROM régulières et moyennes, etc), mais c’est en gros ce qui demande le plus de travail pour la mise en forme…

Librairie VirtualWire 1.12 pour le MSP430 [MAJ2]

[GTranslate]

Pour une fois, je ne cache pas ma fierté. En environ 2 heures de travail, j’ai réussi mon premier vrai portage d’une libairie conçue pour l’Arduino, la librairie VirtualWire (http://www NULL.open NULL.com NULL.au/mikem/arduino/), vers le MSP430 avec Energia. Sans être un exploit, c’est un succès personnel car cela demande de se plonger dans le travail des autres, ce qui n’est jamais facile.

La difficulté technique était, je l’avoue, faible, car la seule spécificité matérielle était liée aux Timer de l’AVR qui sont différents du MSP430. Par contre, une certaine dose de réécriture de code a été nécessaire pour que cela se compile convenablement car il y a toute de même quelques différences entre les deux environnements Arduino et Energia dès qu’on commence à écrire en C.

Pour mémoire, le but de cette librairie et de pouvoir utiliser des petits modules de communication sans-fil sur 433 MHz ou 2,4 GHz pour relier deux micro-contrôleurs. Ces modules étant souvent très sommaires au niveau matériel avec une transmission du signal bande de base en On-Off Keying (tout ou rien), il faut que le logiciel apporte quelques subtilités supplémentaires pour rendre la transmission fiable. On peut ensuite obtenir des débits de 9000 bps ou plus souvent environ 2000 bps si on s’éloigne de 150 mètres. C’est suffisant pour faire un capteur de station météo (http://xv4y NULL.radioclub NULL.asia/boutique/?slug=product_info NULL.php&products_id=31) par exemple…

Le code n’est pas complètement testé mais compile correctement et les premiers essais que j’ai pu faire s’avèrent très concluants. J’ai entre autres fait communiquer un Arduino et un MSP430 par liaison sans-fil ce qui prouve que les timings sont stables!

Je mets à disposition le code source tel qu’il est aujourd’hui avec peut-être encore des bugs. N’hésitez pas à me faire parvenir vos commentaires pour l’améliorer! La documentation d’origine (http://www NULL.open NULL.com NULL.au/mikem/arduino/VirtualWire NULL.pdf) reste valable pour cette version du code.

MAJ :   (http://xv4y NULL.radioclub NULL.asia/ftp/VirtualWire_110_EnergiaMSP430_20120109 NULL.zip)L’auteur a intégré mes modifications et publié une nouvelle version de la librairie, la 1.12, qui devrait fonctionner à la fois sur Arduino et Energia. Elle est téléchargeable ici (http://www NULL.open NULL.com NULL.au/mikem/arduino/VirtualWire/).

MAJ2 :   (http://xv4y NULL.radioclub NULL.asia/ftp/VirtualWire_110_EnergiaMSP430_20120109 NULL.zip)Il semblerait que l’auteur de la librairie originale a bien intégré mes apports mais n’a pas testé la librairie et celle-ci ne fonctionne pas. Voici mon portage de VirtualWire 1.10 pour Energia/MSP430 tel que je l’utilise (http://xv4y NULL.radioclub NULL.asia/ftp/VirtualWire110_Energia_XV4Y NULL.zip).

Librairie pour piloter un DDS AD9850 avec un LaunchPad/MSP430 ou un Arduino

[GTranslate]

Je partage avec vous un de mes premiers résultats dans la mise au point d’une balise WSPR autonome agile avec générateur de signal à DDS (http://xv4y NULL.radioclub NULL.asia/boutique/?slug=product_info NULL.php&products_id=33). Voici en effet une petite librairie qui simplifiera vos projets pour piloter un DDS de chez Analog Devices comme le AD9850. Vous pouvez aussi facilement concevoir un VFO pour vos montages personnel Bitx (http://xv4y NULL.radioclub NULL.asia/category/ham-radio/materiel/bitx/) ou Bingo.

Cette librairie est assez simple puisqu’elle comporte quelques fonctions pour initialiser le circuit et lui programmer une fréquence. Un paramètre permet de passer le circuit en mode Power Down et de le réveiller au cas où. Cela permet d’économiser de l’énergie et même de faire une forme de CW si votre DDS génère le signal directement.

La communication se fait en mode série via 4 broches d’un micro-contrôleur MSP430G2553 par exemple. Bien entendu il faut aussi fournir l’alimentation et la masse. Fait intéressant, l’AD9850 est très flexible et supporte 3,3V ou 5V pour son alimentation. Comme la librairie est aussi très simple et n’utilise qu’un mode de communication logicielle elle est virtuellement portable sur toutes les familles de micro-contrôleurs. Le code est écrit pour les environnement de développements basés sur Wiring comme par exemple Arduino ou Energia.

Vous pouvez télécharger la librairie complète sur la page de téléchargements (http://xv4y NULL.radioclub NULL.asia/boutique/docs/).

Le code pour le fichier de header AD9850.h

/*
 AD9850.h - Library for adding simple AD9850 control capabilities on MSP430

 Copyright 2012 Yannick DEVOS under GPL 3.0 license
 Any commercial use or inclusion in a kit is subject to author approval

 ====
 Revision history :
 v1.00    2012-12-16
 First release

 ====
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 at your option) any later version.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You can download a copy of the GNU General Public License at <http://www.gnu.org/licenses/>

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

 * Create an instance of the object with the pin for CLOCK, LOAD, DATA and RESET

 AD9850 myDDS (P1_5, P2_0, P2_1, P2_2);	 Example for LaunchPad

 * Initialize the AD9850 and do a reset

 myDDS.begin();
 myDDS.reset();

 */

// Core library
#if defined (__AVR_ATmega328P__) || defined(__AVR_ATmega2560__) // Arduino specific
#include "WProgram.h" // #include "Arduino.h" for Arduino 1.0
#elif defined(__32MX320F128H__) || defined(__32MX795F512L__) // chipKIT specific 
#include "WProgram.h"
#elif defined(__AVR_ATmega644P__) // Wiring specific
#include "Wiring.h"
#elif defined(__MSP430G2452__) || defined(__MSP430G2553__) || defined(__MSP430G2231__) // LaunchPad specific
#include "Energia.h"
#elif defined(MCU_STM32F103RB) || defined(MCU_STM32F103ZE) || defined(MCU_STM32F103CB) || defined(MCU_STM32F103RE) // Maple specific
#include "WProgram.h"	
#endif

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

// library interface description
class AD9850
{
	// user-accessible "public" interface
public:
	AD9850(uint8_t pinClock, uint8_t pinLoad, uint8_t pinData, uint8_t pinReset);
	void begin();
	void reset();
	void SetFrequency(unsigned long frequency, boolean powerdown);	// Set the frequency and send PowerDown command if needed
	// A few private methods
private:
};

#endif

Le code pour le fichier de déclaration des routines AD9850.cpp

/*
 AD9850.h - Library for adding simple AD9850 control capabilities on MSP430

 Copyright 2012 Yannick DEVOS under GPL 3.0 license
 Any commercial use or inclusion in a kit is subject to author approval

 Based on work by G7UVW

 ====
 Revision history :
 v1.00    2012-12-16
 First release

 ====
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 at your option) any later version.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You can download a copy of the GNU General Public License at <http://www.gnu.org/licenses/>

 */

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

#define DDS_CLOCK 125000000

// Constructor /////////////////////////////////////////////////////////////////
uint8_t _DDSpinClock;
uint8_t _DDSpinLoad;
uint8_t _DDSpinData;
uint8_t _DDSpinReset;

AD9850::AD9850(uint8_t pinClock, uint8_t pinLoad, uint8_t pinData, uint8_t pinReset)
{
	_DDSpinClock = pinClock;
	_DDSpinLoad = pinLoad;
	_DDSpinData = pinData;
	_DDSpinReset = pinReset;

};

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

void AD9850::begin()
{
    pinMode (_DDSpinClock, OUTPUT); 
    pinMode (_DDSpinLoad,  OUTPUT); 
    pinMode (_DDSpinData,  OUTPUT); 
    pinMode (_DDSpinReset, OUTPUT);

	digitalWrite(_DDSpinReset, LOW);
	digitalWrite(_DDSpinClock, LOW);
	digitalWrite(_DDSpinLoad, LOW);
	digitalWrite(_DDSpinData, LOW);		
}

void AD9850::reset()
{
	//reset sequence is:
	// CLOCK & LOAD = LOW
	//  Pulse RESET high for a few uS (use 5 uS here)
	//  Pulse CLOCK high for a few uS (use 5 uS here)
	//  Set DATA to ZERO and pulse LOAD for a few uS (use 5 uS here)

	// data sheet diagrams show only RESET and CLOCK being used to reset the device, but I see no output unless I also
	// toggle the LOAD line here.

    digitalWrite(_DDSpinClock, LOW);
    digitalWrite(_DDSpinLoad, LOW);

	digitalWrite(_DDSpinReset, LOW);
	delay(5);
	digitalWrite(_DDSpinReset, HIGH);  //pulse RESET
	delay(5);
	digitalWrite(_DDSpinReset, LOW);
	delay(5);

	digitalWrite(_DDSpinClock, LOW);
	delay(5);
	digitalWrite(_DDSpinClock, HIGH);  //pulse CLOCK
	delay(5);
	digitalWrite(_DDSpinClock, LOW);
	delay(5);
	digitalWrite(_DDSpinData, LOW);    //make sure DATA pin is LOW

	digitalWrite(_DDSpinLoad, LOW);
	delay(5);
	digitalWrite(_DDSpinLoad, HIGH);  //pulse LOAD
	delay(5);
	digitalWrite(_DDSpinLoad, LOW);
	// Chip is RESET now
}

void AD9850::SetFrequency(unsigned long frequency, boolean powerdown)
{
	unsigned long tuning_word = (frequency * 4294967296 ) / (DDS_CLOCK*10);  // As frequency is in tens of Hertz, we need to multiply by 10
	digitalWrite (_DDSpinLoad, LOW); 

	shiftOut(_DDSpinData, _DDSpinClock, LSBFIRST, tuning_word);
	shiftOut(_DDSpinData, _DDSpinClock, LSBFIRST, tuning_word >> 8);
	shiftOut(_DDSpinData, _DDSpinClock, LSBFIRST, tuning_word >> 16);
	shiftOut(_DDSpinData, _DDSpinClock, LSBFIRST, tuning_word >> 24);
	if (powerdown)
		shiftOut(_DDSpinData, _DDSpinClock, LSBFIRST, B00000100);	// If powerdown is true then send PowerDown command
	else
		shiftOut(_DDSpinData, _DDSpinClock, LSBFIRST, 0x0);

	digitalWrite (_DDSpinLoad, HIGH); 
}

Nouvelles des kits, balise WSPR à DDS et page téléchargements

Je viens de mettre en ligne une page avec quelques fichiers à télécharger (http://xv4y NULL.radioclub NULL.asia/boutique/docs/) pour le kit SpectroScope audio. Vous y trouverez pour l’instant le manuel utilisateur, les librairies nécessaires à la compilation des sources avec l’environnement Arduino et le code source la mini station météo. J’y ajouterai bientôt les librairies que j’ai écrites pour le MSP430 avec Energia.

Balise WSPR AD9850 et MSP430 (http://xv4y NULL.radioclub NULL.asia/2012/12/17/nouvelles-des-kits-balise-wspr-a-dds-et-page-telechargements/100_3338/)A part ça j’ai bien avancé ces derniers jours sur la balise QRSS / WSPR avec DDS 9850. Il reste encore pas mal de travail mais comme vous pouvez le voir j’ai un prototype pleinement fonctionnel sur le banc d’essai. Ce soir il devrait être relié à une antenne mais sans PA les reports risquent d’être limité par les 40mW du DDS. Le kit final comportera un écran graphique, un DDS et des boutons permettant de le reprogrammer comme générateur de signal ou comme VFO au besoin. L’ensemble des composants et logiciels fonctionnent bien mais j’ai du mal à faire cohabiter la génération de la séquence WSPR et le pilotage de l’écran LCD dans les faibles 512 octets de SRAM du MSP430G2553. J’y travaille…

J’ai aussi reçu mon StellarPad mais je ne l’ai pas encore sorti de sa boîte. Chaque chose en son temps. J’avoue ne pas avoir de projet précis qui nécessite toute la puissance d’un tel processeur. Je vais faire quelques en portant des programmes existants mais pour l’instant ce n’est pas une priorité.

Sortie de Energia 009 avec le support du StellarPad

Stellaris LaunchPad Texas Instruments (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2012/10/med_ek-lm4f120xl_stellarislaunchpad_tool NULL.jpg)L’équipe de développement de l’IDE Energia (fork d’Arduino pour les micro-contrôleurs de Texas Instruments) vient d’annoncer la sortie de la nouvelle release 009 (http://forum NULL.43oh NULL.com/topic/2993-new-energia-release-0101e0009-12062012/). Celle-ci ajoute en particulier le très attendu support du Stellaris LaunchPad (http://xv4y NULL.radioclub NULL.asia/2012/10/02/a-letroit-avec-un-arduino-ou-un-launchpad/). Coïncidence, TI vient de se compter de m’annoncer que mon StellarPad qui était en liste d’attente depuis plusieurs semaines vient d’être expédié par FedEx. Je devrais donc l’avoir dans les mains d’ici quelques jours!

J’ai téléchargé cette nouvelle version mais j’avoue que je n’ai pas encore eu le temps de la tester. Je suis en train de finaliser mon prototype de balise WSPR agile avec DDS afin de pouvoir commander les composants débuts janvier pour une première série.

Nouvelles des kits

Ca y est, j’ai enfin pu commencer l’expédition des kits qui m’avaient été commandés. Après les quelques péripéties que je vous ai déjà en partie raconté, ces deux derniers jours j’ai soudé et préparer les 8 kits Spectroscope Audio (http://xv4y NULL.radioclub NULL.asia/boutique/?slug=product_info NULL.php&products_id=29) et ils sont partis par colis postal ce matin (encore une histoire mais dont je vous fait grâce). Il me reste quelques kits balise WSPR / QRSS (http://xv4y NULL.radioclub NULL.asia/boutique/?slug=product_info NULL.php&products_id=30) à mettre en boîte (il manquait juste un câble) et ils partiront la semaine prochaine car ils avaient été commandé après.

Spectroscope et DDS audio en kit (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2012/12/100_3332 NULL.jpg)Au passage ceux qui m’ont commandé le Spectroscope Audio seront dédommagé pour leur attente puisqu’au final le circuit fait plus que ce qui était prévu. J’y ai en effet ajouté une fonction de générateur de signal audio à DDS et une extension possible pour les transformer en mini station météo (http://xv4y NULL.radioclub NULL.asia/2012/10/26/station-meteo-a-memoire-avec-arduino-et-dht11/). Le capteur température et pression DHT-11 est gracieusement inclus dans le paquet des premières commandes.

J’ai mis à jour la description du produit pour d’une part diminuer le prix car j’ai obtenu de meilleurs remise sur les composants, et d’autre part offrir les capteurs DHT-11 ou DHT-22 en option. Si vous prenez le kit de base plus le DHT-11, cela revient au même prix qu’avant, donc personne n’est lésé, c’est juste que vous avez le choix!

Avant la fin de la semaine prochaine je vais mettre en ligne une page de téléchargement pour diffuser les documentations et les librairies pour Arduino. Les mises à jour du code source seront aussi disponible en ligne via la boutique. Un code remise sera transmis aux acheteurs qui pourront ainsi les obtenir gratuitement.

La vraie station météo attendra un peu, elle, car j’ai encore du travail à faire sur la partie statistique et gestion de l’horloge RTC. Techniquement le code tourne, mais il reste du travail à faire pour le rendre vraiment pratique. J’ai aussi testé différent circuit de transmetteurs radio pour faire un capteur météo à distance sans être vraiment content du résultat… ce sera pour une étape suivante.

En conclusion j’avoue avoir sous-estimé le travail nécessaire pour rendre un produit correctement fini et bien documenté. Entre avoir une idée, la faire en prototype pour soi-même et en faire un produit viable, il y a du travail. Mais bon, tout le travail fait est acquis et que ce soit la production des kits actuels comme celle de nouveaux produits sera plus facile.