Archives par mot-clé : ATMega328

The QCX: A QRP transceiver kit by Hans G0UPL

Hans G0UPL a récemment publié une vidéo du QCX. C’est un kit facile à monter qui vous permet d’avoir un transceiver 5W mono-bande pour 49USD.

Ce transceiver permet de communiquer en telegraphie (CW) sur une bande au choix entre les bandes 80, 60, 40, 30, 20 or 17 mètres. Il utilise un Si5351A pour générer la fréquence du VFO et dispose de filtre 7 pôles avec une bande passante de 200Hz. La réception se fait par détection par quadrature (QSD). Le manipulateur électronique, les mémoires et les fonctions habituelles de transceiver modernes sont disponibles grâce à un micro-contrôleur ATMega328.

Plus de détails sur le site de QRP Labs. (http://qrp-labs NULL.com/qcx NULL.html)

Vidéo du QCX par G0UPL

Merci à K4SWL pour l’information. (http://qrper NULL.com/2017/10/videos-featuring-the-qcx-transceiver-kit/)

Un TNC en mode KISS économique construit avec un Arduino [MAJ MicroModem MicroAPRS]

Il y a quelques années de cela, 99% de mon activité radio tournait autour du packet et du TCP/IP au travers de l’AX25. J’étais un des premiers dans la région lilloise à utiliser Linux (alors avec des kernels 1.2.x recompilés puis 1.3.x qui intégrait l’AX25 dans le source) pour le réseau packet-radio local. J’utilisais principalement une carte HDLC opto-scc avec un Z8530 qui pilotait des TCM3105. J’avais aussi construit avec mes petits doigts inhabiles un clone du TNC-2 en kit d’origine hollandaise (je crois) qui a du finir sa carrière chez F6IWQ Jean-Claude.

Aujourd’hui, puisqu’il n’y a personne autour de moi en VHF et au-delà, je regarde tout cela avec pas mal de distance, mais j’en reste pas moins curieux. Les choses ont bien évoluée depuis les coûteux TNC (http://en NULL.wikipedia NULL.org/wiki/Terminal_node_controller) de chez Kantronics, AEA (PK-232) ou PacComm (le Tiny-2 de F1GUM) très riches mais complexes. La grande mode est à l’APRS puisqu’avec Internet s’envoyer des messages par BBS interconnectées via des liens à 9600bps (merci G3RUH (http://www NULL.amsat NULL.org/amsat/articles/g3ruh/109 NULL.html)) pour les plus riches n’est pas excitant.

J’avoue que je ne me suis pas intéressé à cette technologie, car je n’en vois pas trop l’intérêt dans ma situation. Toutefois j’ouvre l’oeil aux différents matériels et en particulier aux constructions OM et solutions open-source. Plusieurs TNC et circuits APRS étaient déjà parus en utilisant des micro-contrôleurs PIC comme celui de WB8WGA paru dans QEX ici amélioré (http://www NULL.enide NULL.net/webcms/?page=wb8wga-tnc) ou le TNC-X avec port USB (http://www NULL.tnc-x NULL.com) ou encore le Mini-TNC de Fox Delta (http://www NULL.foxdelta NULL.com/products/minitnc NULL.htm). Par contre je n’avais rien trouvé autour des micro-contrôleurs AVR et de l’Arduino, sauf un projet de KI4MCW avorté car l’environnement Arduino souffre de trop de latences.

TNC Arduino (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2014/10/Breadboard_TNC_1 NULL.png)Heureusement, il y a quelques jours je suis tombé sur ce projet de TNC en mode KISS sur Arduino Nano (ATMega 328) (http://www NULL.mobilinkd NULL.com/2014/09/11/arduino-kiss-tnc/) qui va ravir les adeptes de la construction OM. Le code source est disponible sur GitHub, et on peut voir que son concepteur a utilisé BertOS (système temps-réel) pour résoudre les problèmes de latence. La programmation doit se faire AVRdude qui va “flasher” le binaire. Le concepteur propose aussi un TNC alimenté par batterie avec connexion Bluetooth pour être piloté directement par le téléphone (http://store NULL.mobilinkd NULL.com/products/battery-powered-bluetooth-kiss-tnc-with-case).

Je ne compte pas réaliser ce circuit, mais si vous prenez le temps de faire le montage, merci de m’informer de vos résultats!

Suite à une information de F8BXI, voici les liens vers MicroModem et MicroAPRS, deux codes librement disponibles écrits avec BertOS pour des Arduino qui implémentent un modem AX-25 AFSK 1200bps et un node APRS.

Le MINIMA : nouveau transceiver par VU2ESE Farhan

Schéma du MINIMA par VU2ESE (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2014/01/VU2ESE_MINIMA_schematic NULL.png)Farhan de VU2ESE, le père du Bitx, vient d’annoncer son nouveau projet sur la liste Bitx : le MINIMA (http://www NULL.phonestack NULL.com/farhan/minima NULL.html). C’est encore une fois un projet très original du point de vue de l’architecture et des choix techniques réalisés. Une initiative à saluer!

Sans lister les caractéristiques que vous trouverez sur le site du projet (http://www NULL.phonestack NULL.com/farhan/minima NULL.html), le MINIMA est un transceiver QRP BLU/CW à couverture générale avec une puissance de sortie de 1W et une ergonomie simplifiée (un bouton). Voici les principaux points innovants à retenir :

  • Utilisation du Si570 comme oscillateur local.
  • Utilisation d’un ATMega328 (Arduino Nano) comme micro-contrôleur avec un afficheur LCD 16×2. Le code source est disponible librement.
  • Fréquence intermédiaire de 20 MHz avec des quartz d’horloge d’ordinateur.
  • Topologie de filtres originale pour le premier étage (front-end).
  • Mélangeur KISS utilisant deux JFET J310 pilotés par l’OL (et non le signal).
  • Utilisation de transistors courants 2N3904/2N3906 pour tous les étages d’amplification et de mélange, y compris pour la BF.
  • Transmission CW générée par audio.

Selon Farhan, le MINIMA est un des transceivers les plus simples à réaliser et à utiliser. Son architecture le rend très tolérant et donc facile à mettre au point, tout en gardant des performances intéressantes et un bon confort d’utilisation.

Je gardais l’info sous le coude suivant la volonté de Farhan car celui-ci souhaitait mettre en place une liste de diffusion avant de rendre l’information publique. La nouvelle ayant déjà été reprise SolderSmoke et Radioamateur.org (http://www NULL.radioamateur NULL.org/les-news-radio/news-1566-Un-%C3%A9metteur-r%C3%A9cepteur-%C3%A0-couverture-g%C3%A9n%C3%A9rale-Le-Minima) je publie cet article…

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...

}

 

Station météo à mémoire avec Arduino et DHT11

Ecran Station météo Arduino (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2012/10/100_3301 NULL.jpg)A la maison j’ai une petite “station météo” Oregon Scientific BAR310HG avec un capteur distant sans fil. Elle m’a donné toute satisfaction pendant 5 ans pour son prix très correct, mais les conditions du climat tropical commence à avoir raison des contacts et le capteur sans-fil ne fonctionne plus… Ce type de produit là n’étant pas fait pour être réparé je me suis fait une raison.

Capteur Température Humidité DHT11 (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2012/10/100_3303 NULL.jpg)En cherchant après des composants électroniques à Hong Kong, je suis tombé sur la série de capteurs DHT11 et DHT22 qui sont à la fois économique et suffisamment performant pour un usage domestique. Le DHT22 est plus précis mais un peu plus cher, pour mes premier essais j’ai donc choisi le modèle moins cher.

Voici un premier jet d’un programme pour Arduino qui va interroger le capteur, affiche les valeurs en temps réel, mais surtout les sauvegarde dans la mémoire EEPROM pour en faire des statistiques. L’avantage de les sauvegarder en EEPROM c’est qu’on peut faire une mesure, éteindre la station météo, la rallumer bien plus tard pour faire une autre mesure et avoir la moyenne. Pour des raisons de rapidité de traitement seules 10 valeurs sont sauvegardées, mais la mémoire disponible en permet bien d’avantage.

La commande est simple, il suffit d’appuyer brièvement sur le bouton pour sauvegarder une valeur. Un appui long (plus d’une seconde) efface toutes les valeurs en mémoire.

Une version plus évoluée et utilisant un capteur DHT22 sera prochainement proposée en kit sur la boutique (http://xv4y NULL.radioclub NULL.asia/boutique/). Elle utilisera une horloge RTC pour faire de statistiques sur une période calendaire. Les sauvegardes seront interrogables par port série, et la possibilité d’interroger un capteur à distance via des modules radio 433 MHz sera incluse.

/*
Arduino Thermometer and Humidity display with EEPROM saved statistics using DHT11 sensor v1.00
By Yannick DEVOS - XV4Y
http://xv4y.radioclub.asia/

Copyright 2012 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
It saves 10 values in memory when button is pressed and display an average
Pressing the button more than 1 second will erase all the values
Values are stored in EEPROM, you can do measuring, turn off the Arduino, then do other measuring the day after...

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 3 libraries :
- Arduino Bounce Library
http://www.arduino.cc/playground/code/bounce
- New LiquidCrystal
https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home
- DHT-sensor Library by Adafruit
https://github.com/adafruit/DHT-sensor-library

====
Revision history :
v1.00    2012-10-26
         First release
====
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.

====
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 <Wire.h>
#include <EEPROM.h>
#include <LiquidCrystal.h>
#include <Bounce.h>
#include "DHT.h"

#define DHTPIN 12     // What pin we have connected the DHT sensor
#define BUTTON 2      // What

#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal lcd(10, 9, 8, 7, 6, 5);  // You can change this settings to your convenance, please see the library documentation
Bounce button_debounce = Bounce( BUTTON, 10 ); 

int t = 0, h = 0, a = 0, b = 0, avg_t = 0 , avg_h = 0, saved_t = 0, saved_h = 0;
int current_address = 1, i_address = 1;

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

  dht.begin();

  pinMode(BUTTON,INPUT_PULLUP);

  // We read where was the last saved value
  current_address = int(EEPROM.read(0));

}

void loop() {
  button_debounce.update ( );

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  h = int(dht.readHumidity());    // we convert to integer since the DHT11 has not enough precision anyway
  t = int(dht.readTemperature());

  // check if returns are valid, 0 degrees and 0 percent humidity is impossible with the DHT11 sensor...
  if (h == 0 && t == 0) {
    lcd.clear ();
    lcd.home ();
    lcd.print("Sensor Error");
    delay(1000);
    lcd.clear ();
    lcd.home ();
  } else {
    lcd.setCursor ( 0, 0 );
    lcd.print("T:    "); 
    lcd.setCursor ( 3, 0 );
    lcd.print(t);
    lcd.setCursor ( 5, 0 );
    lcd.print("*C");
    lcd.setCursor ( 0, 1 );
    lcd.print("H:    ");
    lcd.setCursor ( 3, 1 );
    lcd.print(h);
    lcd.setCursor ( 5, 1 );
    lcd.print("%");
  }

 int button_status = button_debounce.read();

 // If the button is pressed
 if (button_status == LOW) {
   if (button_debounce.duration()>1000) {  // For more than 1 second we erase the saved values in the EEPROM
     lcd.clear ();
     lcd.home ();
     lcd.print("Erasing");
     lcd.setCursor ( 0, 1 );
     lcd.print("All values");

     for (int i = 0; i <= 45; i++)  // We erase the 10 sets of values
        EEPROM.write(i, 0);
     current_address = 1;
     EEPROM.write(0, 1);

     delay(1000);
     lcd.clear ();
     lcd.home ();
   } else {                                // For shorter we save the value in the EEPROM
     lcd.clear ();
     lcd.home ();
     lcd.print("Saving value");
     lcd.setCursor ( 0, 1 );
     lcd.print("in memory ");
     lcd.setCursor ( 10, 1 );
     lcd.print(round((current_address/4)+1));

     EEPROM.write(current_address, byte(t & 0xFF));
     EEPROM.write(current_address+1, byte(t >> 8));
     EEPROM.write(current_address+2, byte(h & 0xFF));
     EEPROM.write(current_address+3, byte(h >> 8));
     current_address = current_address + 4;
     if (current_address >= 41) current_address = 1;
     EEPROM.write(0, byte(current_address & 0xFF));

     delay(500);
     lcd.clear ();
     lcd.home ();
   }
 }

 // Here we read the saved values in the EEPROM and do the average
 avg_t = 0;
 avg_h = 0;
 for (i_address = 1; i_address <= 41; i_address = i_address + 4) {

   a = EEPROM.read(i_address);
   b = EEPROM.read(i_address+1);
   saved_t = (b << 8 | a);
   if (saved_t != 0)
     if (avg_t == 0) {
       avg_t = saved_t;
     } else {
       avg_t = (saved_t + avg_t) / 2;
     };

   a = EEPROM.read(i_address+2);
   b = EEPROM.read(i_address+3);
   saved_h = (b << 8 | a);
   if (saved_h != 0)
     if (avg_h == 0) {
       avg_h = saved_h;
     } else {
       avg_h = (saved_h + avg_h) / 2;
     };
 }

 // Here we display the averaged values
 lcd.setCursor ( 8, 0 );
 lcd.print("Avg    "); 
 lcd.setCursor ( 12, 0 );
 if (avg_t != 0) {  // Display only when the value is significant
   lcd.print(avg_t);
 } else {
   lcd.print("--");   
 }
 lcd.setCursor ( 14, 0 );
 lcd.print("*C");
 lcd.setCursor ( 8, 1 );
 lcd.print("Avg    ");
 lcd.setCursor ( 12, 1 );
 if (avg_h != 0) {  // Display only when the value is significant
   lcd.print(avg_h);
 } else {
   lcd.print("--");   
 }
 lcd.setCursor ( 14, 1 );
 lcd.print("%");

}

A l’étroit avec un Arduino ou un LaunchPad ?

Texas Instruments fait encore une fois très fort! Si vous vous sentez restreints dans vos ambitions par les performances et les capacités mémoires limitées des ATMega328 ou MSP430G2553 des Arduino (http://arduino NULL.cc/en/Main/Hardware) ou LaunchPad, courrez acheter un Stellaris LaunchPad.

StellarPad (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2012/10/med_ek-lm4f120xl_stellarislaunchpad_tool NULL.jpg)Non seulement le Stellaris LaunchPad LM4F120 (http://www NULL.ti NULL.com/tool/ek-lm4f120xl#buy) embarque un processeur beaucoup plus puissant que tout ceux dont j’ai parlé jusqu’à présent, mais offert au prix de 5 USD par TI il est à peine plus cher que le LaunchPad et surtout 4 fois moins cher que n’importe lequel des Arduino!!! Ce nouveau petit jouet embarque un processeur 32 bits Stellaris LM4F120H5QR (http://www NULL.ti NULL.com/product/lm4f120h5qr) construit sur l’architecture Cortex M4F d’ARM, la version “électronique embarquée” des processeur tournant aujourd’hui des les iPad, iPhone. Tournant à 80MHz et possédant 256Ko de flash et 32Ko de SRAM, il est le chaînon manquant entre la catégorie “Arduino” et la catégorie “Rabsperry Pi”, plus proche des ChipKIT dont je vous parlais récemment (http://xv4y NULL.radioclub NULL.asia/2012/09/20/programmer-un-micro-controleur-pic-comme-un-arduino/). Le nombre des entrées-sorties, périphérique et canaux de communications est aussi à l’avenant, de quoi penser à de gros projets…

Cerise sur le gâteau, Robert Wessels vient de m’informer qu’il travaille sur l’incorporation du StellarPad (plus court que Stellaris LaunchPad) à Energia et qu’il sera donc très prochainement possible de programmer ce micro-contrôleur exactement comme un LaunchPad MSP430 ou un Arduino. Si après tout cela vous n’avez pas encore commandé celui-ci chez Texas Instruments, je ne sais pas ce qu’il me reste à faire!

Programmer un micro-contrôleur Atmel ATtiny avec un Arduino (MAJ)

[GTranslate]

Il y a plus d’un an j’avais monté un kit balise QRSS (MEPT QRSS pour être exact) de G0UPL (http://xv4y NULL.radioclub NULL.asia/2010/08/16/kit-balise-qrss/). Hans livre le micro-contrôleur ATTiny13 du kit programmé à l’avance avec l’indicatif que vous lui demandez, or le mien a changé entretemps!

Arduino utilisé comme ISP pour reprogrammer un ATTiny13

J’avais donc en tête de reprogrammer celui-ci avec le bon indicatif. C’est facilement faisable avec une platine Arduino programmée pour agir en tant qu’ISP (In System Programmer). Une condition cependant, que les Fuse-bits ne soient pas programmés car dans ce cas un programmateur à tension élevée est nécessaire pour tout remettre à zéro. Hans et Steve m’ont confirmé que ce n’était pas le cas pour leur micro-contrôleur.

Je ne vais pas vous faire un guide pas-par-pas ici, plusieurs tutoriaux sont disponibles sur internet et mieux documentés. Je vais plutôt vous dire où trouver les informations. A noter que j’utilise un Macintosh, mais les grandes lignes restent les mêmes.

Liste des ingrédients :

  • La dernière version de l’IDE de l’Arduino (http://arduino NULL.cc/en/Main/Software).
  • Le pack de développement CrossPack pour AVR (http://www NULL.obdev NULL.at/products/crosspack/index NULL.html) qui permettra de compiler le code vers un binaire AVR avec XCode et installera aussi AVRDude permettant de communiquer avec le microcontrôleur de chez Atmel.
  • Un Arduino avec ATMega328, une plaque d’essais, des câbles, des jumpers et un condensateur (à mettre entre la pin RESET et la masse de l’Arduino.
Recette :
  • Lancer l’IDE Arduino, ouvrir le sketch Arduino ISP des exemples, le programmer dans l’Arduino.
  • Créer un projet dans XCode, copier le code du keyer QRSS (http://www NULL.hanssummers NULL.com/images/stories/qrsskeyer/beacon NULL.c) et le compiler.
  • Câbler l’Arduino et l’ATTiny de telle façon à raccorder les masses et +5V des deux circuits ensembles. Connecter les broches 10, 11, 12 et 13 de l’Arduino respectivement aux broches 1 (RST), 5 (MOSI), 6 (MISO),7 (SCK) de l’ATTiny13. (Voir photo un peu plus haut)
  • Ouvrir une fenêtre du terminal (shell) et récupérer l’ancien binaire (voir capture ci-dessous,cliquez pour élargir).Récupération du binaire du précédent programme dans la Flash de l'ATTiny13 avec AVRDude (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2012/01/Download-binaire-ATTiny13-XV4TUJ NULL.jpg)
  • Programmer l’ATTiny avec le fichier .hex généré par XCode (voir capture ci-dessous, cliquez pour élargir).Envoi du binaire du nouveau programme dans la Flash de l'ATTiny13 avec AVRDude (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2012/01/Upload-binaire-ATTiny13-XV4Y NULL.jpg)

Ca marche, ma balise envoie maintenant le bon indicatif (voir plus bas pour la mise à jour). Je n’ai plus qu’à procéder au réalignement périodique de la fréquence car celle-ci bouge un peu (50Hz c’est beaucoup en QRSS) avec les changements de saison et de température moyenne.

Mon but était de reprogrammer un ATTiny13 (http://futurlec NULL.com/Atmel/ATTiny13V NULL.shtml) avec le code source de G0UPL/G0XAR. Celui-ci est dans le langage C spécifique à ce micro-contrôleur, et avec le template AVR de XCode ont produit un binaire (fichier .hex) en code machine pour celui-ci. La flash sur l’ATTiny13 et de 1Ko, le binaire fait 664o.

Si vous disposez d’ATTiny45 ou ATTiny85, (http://futurlec NULL.com/Atmel/ATTiny85 NULL.shtml) ceux-ci ayant plus de mémoire, une autre possibilité existe si vous souhaitez créer vos propres programmes. En effet, le projet Arduino-Tiny (http://code NULL.google NULL.com/p/arduino-tiny/) a pour but de porter le noyau Arduino sur ATTiny. Ceci permet d’utiliser l’environnement de développement (IDE) d’Arduino et son langage plus évolué. Toutes les commandes ne sont pas utilisables car certaines sont propres au micro-contrôleur ATMega (http://futurlec NULL.com/Atmel/ATMEGA328P-AU NULL.shtml) des Arduino. Toutefois, pour un bon nombre de projets simples (balise (http://xv4y NULL.radioclub NULL.asia/2011/07/01/balise-cw-a-base-de-micro-controleur-arduino/), manipulateur électronique (http://xv4y NULL.radioclub NULL.asia/2011/12/09/arduino-manipulateur-cw-de-numero-de-serie-pour-concours/)…) cela permet de réduire de le coût et de simplifier le circuit.

Mise à jour : Contrairement à ce que je pensais au début même si la programmation du micro-contrôleur se passait bien aucune “manipulation” n’était effectuée par la balise, le signal restait fixe mais variait à cause du changement de température…

Je prends contact avec Stephen et Hans qui me donne deux informations. D’abord la fréquence à indiquer dans le Makefile pour la compilation est 9 600 000 Hz, car les ATTiny ont été programmés avec les fuse-bytes indiquant une horloge de 9,6 Mhz et pas de prescaling par le diviseur-par-8. Ensuite un petit bogue réside dans leur code qui ne compile plus sur les nouvelles versions de WinAVR (qui utilise avr-libc comme Crosspack). Après quelques recherches (je ne suis pas très doué en programmation), le code est corrigé et compile maintenant parfaitement. La version mise à jour du code devrait être disponible chez G0UPL, n’hésitez pas à me contacter pour plus de détails.