arduino  RC Navy (2012)

Exemple asynchrone avec les librairies <TinyOscCal> et <SoftSerial>:

Le sketch: ce sketch montre comment implémenter un port série fiable sur un ATtiny84 ou ATtiny85 utilisant l'oscillateur interne à l'aide des librairies <TinyOscCal> et <SoftSerial>.

/*
Ce sketch montre comment utiliser la librairie <TinyOscCal> pour calibrer l'oscillateur interne des ATtiny84 et ATtiny85.
Ceci permet l'utilisation fiable des ports series logiciels <SoftSerial> sur les ATtiny84 et ATtiny85.
Par RC Navy 2012: http://p.loussouarn.free.fr
*/
#include <EEPROM.h> /* Utilisee par la librairie TinyOscCal */
#include <TinyPinChange.h> /* Utilisee par la librairie SoftSerial */
#include <SoftSerial.h>
#include <TinyOscCal.h>

#define SERIAL_RX_PIN 3 /* Physical Pin 2 for an ATtinyX5 and Physical Pin 10 for an ATtinyX4 */
#define SERIAL_TX_PIN 4 /* Physical Pin 3 for an ATtinyX5 and Physical Pin 9 for an ATtinyX4 */

SoftSerial MySerial(SERIAL_RX_PIN, SERIAL_TX_PIN);

void setup()
{
MySerial.begin(9600); /* IMPORTANT: initialiser le port serie AVANT d'appeler TinyOscCal.init() */
TinyOscCal.init(&MySerial, 0); /* Calibration de l'oscillateur interne si necessaire: stockage de l'offset en position 0 de l'EEPROM */
MySerial.print(F("Byte used in EEPROM for <TinyOscCal> library: "));MySerial.println((int)TinyOscCal.getEepromStorageSize());
}

void loop()
{
static uint16_t Sec=0;
static uint32_t StartMs=millis();

if((millis() - StartMs) >= 1000)
{
StartMs = millis();
Sec++;
MySerial.print(F("Uptime: "));MySerial.print(Sec);MySerial.println(F(" sec")); /* Affiche le nombre de secondes écoulées depuis le démarrage */
}
}
I. Calibration de l'oscillateur interne d'un ATtiny85 à l'aide de la console de l'EDI arduino

L'idée est d'utiliser le port série d'un PC pour vérifier que l'oscillateur est bien calibré. En effet, si les caractères émis par l'ATtiny sont bien reçus par le PC, cela signifie que le port série logiciel émet les caractères au bon débit (le débit est régi par l'oscillateur de l'ATtiny).

I.1. Le câblage
Console arduino avec ATtiny
Pour faire communiquer un ATtiny (qui n'a pas d'accès USB) avec un PC, il suffit de déclarer un port série logiciel <SoftSerial> dans le sketch de l'ATtiny.
- Le TX (broche d'émission du SoftSerial) sera connecté à la broche RX de l'UNO via une résistance de protection de 1K.
- Le RX (broche d'émission du SoftSerial) sera connecté à la broche TX de l'UNO via une résistance de protection de 1K.
Ainsi, l'ATtiny va pouvoir profiter du convertisseur RS232 TTL vers USB câblé sur la carte UNO.

I.2. Les étapes de la programmation de l'ATtiny85:

1) Dans l'EDI arduino, sélectionner le type de carte "UNO" (Outils->Type de carte->Arduino UNO)

2) Charger le sketch ArduinoISP (Fichier->Exemples->ArduinoISP) dans l'UNO pour le configurer en programmateur
3)
Dans l'EDI arduino, sélectionner le type de carte "ATtiny85" (Outils->Type de carte->ATtiny85 (internal 8 MHz clock) ou ATtiny85 (internal 16 MHz clock PLL))
4) Vérifier que l'UNO est bien sélectionné comme programmateur (Outils->Programmateur->Arduino as ISP)
5) Ouvrir le sketch de l'ATtiny et le téléverser
6) Re-sélectionner l'UNO par
Outils->Type de carte->Arduino UNO et téléverser le sketch "Blink", ceci va libérer les broches TX et RX de l'UNO
7) Ouvrir la Serial Console de l'EDI arduino et vérifier que le débit correspond à celui du sketch: l'ATtiny85 communique désormais avec la Serial Console

Note
: une solution alternative et radicale pour l'étape 6): retirer l'ATmega328p du support de la carte arduino (à faire évidemment avec la carte hors tension), puis remettre la carte arduino sous tension pour bénéficier du convertisseur Série/USB de la carte. Avec cette alternative, les 2 résistances de 1K sont optionnelles: à utiliser avec précaution.

I.3. La calibration de l'oscillateur:


1)
Si l'EEPROM contient autre chose que 0xFF (0xFF=EEPROM effacée), et que la valeur est comprise entre -20 et +20, TinyOscCal.init() va utiliser la valeur stockée en EEPROM en considérant qu'il s'agit de la valeur de calibration du registre OSCCAL. Si cette valeur ne correspond pas à la valeur de calibration de l'oscillateur interne (registre OSCCAL), il est possible de forcer l'effacement de la zone EEPROM utilisée par la librairie <TinyOscCal> en ajoutant le paramètre optionnel ForceClear=1 en appelant:
TinyOscCal.init(&MySerial, 0, 1); dans la fonction setup() du sktech.
Une fois la calibration effectuée, re-téléverser le sketch en enlevant le paramètre optionnel: (sinon la calibration aura lieu à chaque redémarrage)
TinyOscCal.init(&MySerial, 0); dans la fonction setup() du sketch.

2) La fonction TinyOscCal.getEepromStorageSize() permet de connaître le nombre d'octets sauvegardés en EEPROM par la librairie <TinyOscCal>. Cela permet de déterminer le début de la zone EEPROM libre pour le stockage des futures valeurs à stocker en EEPROM (par exemple, pour d'autres librairies).

3) Au démarrage du sketch, si TinyOscCal.init() considère que la calibration n'est pas correcte, la librairie <TinyOscCal> va envoyer sur le port série toutes les 2 secondes le message suivant pour les valeurs d'offset d'OSCCAL de -20 à +20:
"Offset=+/-xx hit <Enter>"
a) Au démarrage du sketch, l'affichage sera probablement mauvais (ce sera le cas si l'EEPROM est vierge).
b) A partir d'une certaine valeur d'offset, l'affichage sera correct (par exemple pour un offset de -6).
c) Puis à
partir d'une autre valeur d'offset l'affichage redeviendra mauvais (par exemple pour un offset supérieur à +16).
d) Rebooter l'ATtiny84 ou ATtiny85 en débranchant/rebranchant l'alimentation.
e) Dans notre exemple, quand l'offset sera égal à
-6 + [(16 + 6) / 2 ] = +5, ce qui correspond à la valeur médiane, taper sur la touche Entrée du clavier
    ou cliquer sur le bouton "Envoyer" de la console.
    La valeur +5 va alors être sauvegardée en EEPROM (l'oscillateur interne est désormais calibré) et le sketch va exécuter la fonction loop().

Dans ce 1er screenshot, la valeur brute d'offset mémorisée en EPPROM valait à 0xFF (une EEPROM vierge ne contient que des 1).
La librairie <TinyOscCal> considère qu'une calibration est nécessaire et essaie avec un offset de -20 à +20.
Les messages sont lisibles avec un offset de -6 à +16.
La valeur centrale est donc: -6 + [(16 + 6) / 2 ] = 5.
Messages issus de la lib TinyOscCal

Dans ce 2nd screenshot, l'ATtiny a été rebooté et l'utilisateur a pressé la touche <Enter> du Terminal (flèche rouge) pendant que l'offset d'OSCCAL valait +5: "CAL: OK" apparait aussitôt. La valeur +5 est alors sauvegardée en EEPROM, puis <TinyOscCal> redonne la main au sketch.
Calibration à l'aide de la lib TinyOscCal

Au prochain redémarrage de l'ATtiny, TinyOscCal.init() verra que la valeur stockée en EEPROM est comprise entre -20 et +20 et la considérera (à juste titre) comme valeur de calibration et donnera directement la main à la fonction loop() sans passer par la phase de calibration.

Dans un ATtiny, un port série est très utile pour dialoguer avec le monde extérieur. Moyennant un interpréteur de commande, il est possible de lire ou écrire les paramètres du sketch en utilisant un simple Terminal sur PC.

Retour