L’accéléromètre 2 axes installé sur ce circuit est un composant fabriqué par Analog et porte la référence ADXL311.
Il est particulier dans le kit EasyAVR4 : il ne se branche pas directement sur la carte. Il a donc fallu créer un petit connecteur pour pouvoir manipuler l’accéléromètre à la main.
Les mesures effectuées par la puce MEMS sont mises à disposition sur deux sorties analogiques. Le circuit de MikroE ajoute les condensateurs et les résistances nécessaires.
On va afficher sur l’écran graphique (en utilisant WinAVR et AVRlib) les valeurs reçues sur le convertisseur analogique/numérique de l’AVR.
Voici le code source :
/*****************************************************************************
* ethernet.c
*
* Démonstration Ethernet AVRlib
*
*
* Auteur : Eric PASCUAL pour POBOT
* Cible : ATmega
* Compilateur : avr-gcc (WinAVR)
*/
#include
#include
#include
#include <stdlib.h>
#include <string.h>
#include "global.h" // informations générales sur le microcontrôleur utilisé (quartz, etc.)
#include "a2d.h" // bibliothèque AVRlib de conversion des valeurs analogiques en nombres
#include "glcd.h" // bibliothèque AVRlib de gestion d’un afficheur LCD graphique générique
#include "ks0108.h" // bibliothèque AVRlib implémentant les fonctions d’un afficheur LCD de type ks0108
#include "timer.h" // bibliothèque AVRlib de gestion des timers
//-----------------------------------------------------------------
// Définition des messages qui s’afficheront sur l’écran
char *msg1="Board to pos " ;
char *msg2="and press RB0 " ;
char *msg3="Zero G values : " ;
char *msg4="X= Y= " ;
char *msg5="One G values : " ;
char *msg6="Readings : " ;
/**
* Affichage d’une valeur numérique à un emplacement particulier (ligne/colonne) de l’afficheur LCD graphique
*/
static void display_uint_at(unsigned short value, u08 line, u08 col)
static char buffer[8] ;
// conversion d’un entier dans un tableau (int to array)
itoa(value, buffer, 10) ;
// fermeture du buffer pour en faire une chaine de caractère (string se termine toujours par 0)
buffer[7] = 0 ;
// l’afficheur LCD graphique est géré par un curseur qu’il faut déplacer au bon endroit
glcdGotoChar(line, col) ;
// puis une fonction générique permet d’afficher notre bufffer sans avoir à gérer chacun des pixels
glcdPutStr (buffer) ;
/**
*
*/
int main(void)
//
DDRB = 0xfe ; // PB0 used as input
// initialization of AVRlib libraries
a2dInit() ;
glcdInit() ;
timerInit() ;
//
u08 position_num = 1 ;
u08 line = 0 ;
//
glcdClearScreen() ;
glcdGotoChar(line, 0) ;
glcdPutStr(msg1) ;
glcdWriteChar(position_num++ + 48) ;
glcdGotoChar(++line, 0) ;
glcdPutStr(msg2) ;
while (!(PINB & 0x01)) ; while ((PINB & 0x01)) ;
unsigned short zeroG_X = a2dConvert10bit(0) ;
unsigned short zeroG_Y = a2dConvert10bit(1) ;
glcdGotoChar(++line, 0) ;
glcdPutStr(msg1) ;
glcdWriteChar(position_num++ + 48) ;
glcdGotoChar(++line, 0) ;
glcdPutStr(msg2) ;
while (!(PINB & 0x01)) ; while ((PINB & 0x01)) ;
unsigned short oneG_X = a2dConvert10bit(0) ;
glcdGotoChar(++line, 0) ;
glcdPutStr(msg1) ;
glcdWriteChar(position_num++ + 48) ;
glcdGotoChar(++line, 0) ;
glcdPutStr(msg2) ;
while (!(PINB & 0x01)) ; while ((PINB & 0x01)) ;
unsigned short oneG_Y = a2dConvert10bit(1) ;
glcdClearScreen() ;
line = 0 ;
glcdGotoChar(line, 0) ;
glcdPutStr(msg3) ;
glcdGotoChar(++line, 0) ;
glcdPutStr(msg4) ;
display_uint_at (zeroG_X, line, 2) ;
display_uint_at (zeroG_Y, line, 10) ;
glcdGotoChar(++line, 0) ;
glcdPutStr(msg5) ;
glcdGotoChar(++line, 0) ;
glcdPutStr(msg4) ;
display_uint_at (oneG_X, line, 2) ;
display_uint_at (oneG_Y, line, 10) ;
line+=2 ;
glcdGotoChar(line, 0) ;
glcdPutStr(msg6) ;
glcdGotoChar(++line, 0) ;
glcdPutStr(msg4) ;
while (1)
timerPause(100) ;
oneG_X = a2dConvert10bit(0) ;
oneG_Y = a2dConvert10bit(1) ;
display_uint_at (oneG_X, line, 2) ;
display_uint_at (oneG_Y, line, 10) ;
// supprimez la dernière ligne parasite