Interface d'envoi SMS et d'appel d'un portable via un Atmega

Une question sur l’un des microcontrôleurs de la série des AT90, ATtiny ou des ATmega ? Une question sur la programmation assembleur ? C’est par ici.

Modérateur: Modérateur

Interface d'envoi SMS et d'appel d'un portable via un Atmega

Messagede owomax le 28 Avr 2008 15:16

Bonjour les amis !

Je voudrais bien que vous réfléchissez avec moi sur mon projet de fin de formation intitulé:

On voudrait que je détecte la température d'une enceinte climatisée donnée et que mon système envoie un SMS ou appelle un numéro dès qu'il constate que la température dépasse le seuil fixé pour le bon fonctionnement des équipements de l'enceinte.

A cela, j'ai pensé au choix de capteurs de température (CTN, CTP, Platine Pt) et je suis confronté à comment faire le choix( quels sont les paramètres sur lesquels, il me faut me baser).
Le conditionnement du signal délivré par le capteur choisi, et combien de capteurs drevrais-je employer d'autant plus qu'on sait que la température d'une enceinte suit le Gradient ( donc varie en tout point). Comment faire pour affirmer qu'il règnez une température donnée dans l'enceinte: J'ai pensé à un additionneur AOP + un inverseur recevrant au moins 5 capteurs conditionnés.
La sortie de l'inverseur, sera envoyer sur une entrée d'un atmega168 (que je dispose chez moi ) afin de commander l'envoi d'un SMS prédéfini dans un portable (mobile à définir avec vous) pour faire l'envoi par GSM.

Voilà posé mon problème, et je vous demande votre entière collaboration afin que je puisse réaliser le projet dans un mois au plus (j'en suis confus)

Fréjus, si Dieu le veut j'y parviendrai avec votre aide
owomax
 

Messagede EASYS le 13 Mai 2008 19:56

Enfin un projet interessant! Tout d'abord je pense qu'il faut bien cerné ce qu'on te demande. En fait je pense qu'il faut mettre l'accent sur la communication entre ton système et le mobile de communication et non sur le gradient et tout ce que ça comporte sinon tu ne verra pas le bout du tunnel d'ici tôt.
Puisque la température que tu mésureras sera une température en régime établi quelque soit les éléments qui entrent en jeux sinon tu satureras ta mémoire avec des données qui à la fin ne te serviront à rien. et tu la si bien dit tu envoie un message dès que la température de la salle atteint un seuil fixé c'est à dire à l'équilibre (température interne égale en tout point comme lorsque ton thermomètre t'affiche la température tu est d'accord avec moi que meme si tu te déplace dans la salle la température reste la meme) donc pas besoin de gradient juste la relation qui existe entre ton capteur et la tension.
tu met à l'entrée un filtre de antirepliement
tu convertie en numérique
et tu fait un filtre numérique dans ton processeur (question d'être plus précis dans tes mésures).
et tu compare cette valeur à ta consigne. Bon pour l'instant c'est tout à plus
EASYS
NOUVEAU
NOUVEAU
 
Messages: 7
Inscription: 31 Déc 2007 12:04
Localisation: Doala cameroun

Module d'acquisition par microcontroleur

Messagede Fréjus le 15 Mai 2008 16:34

Enfin Merci pour la contribution et l'éclaircissement apportés.
Mais il réside tjrs qlq chose en moi qui me fruste. C'est de savoir comment faire le filtre antirepliement et l'adapter à une entrée de mon microcontroleur. Comment m'y faire pour y parvenir? J'aimerais avoir un peu plus d'éclaircissement.

De plus pour aller loin, il me reste le module d'envoi de sms en cas de détection de sur-température.
Aidez-moi je vous en prie.

Fréjus
Fréjus
 

Messagede The Dude le 15 Mai 2008 18:33

Arretez moi si je me trompe, mais le filtre anti repliement, c'est pour pouvoir faire de l'échantillonage en fréquence avec des FFT.

Ton capteur il ne va pas osciller et tu ne vas pas l'analyser en fréquence, donc pas besoin de filtre anti repliement.

Maintenant, rien n'empèche d'en mettre un quand même, un simple réseau RC suffit.
The Dude
 

projet de fin d'étude

Messagede Fréjus le 16 Mai 2008 16:02

Bonjour les gars,

Merci pour les interventions. J'ai eu à en parler avec un ami et pour le choix du capteur, il me propose un DS1820 de chez Dallas qui fournit déjà un signal numérique
que l'on peut envoyer directement à une entrée de l'atmega via une résistance. Je crois que là, il me suffit de consulter le datasheet de ce capteur et de voir comment faire pour l'étalonner pour la plage de mesure qui est de 0 à 60°C chez moi.

Maitenant, la question qui me préoccupe et qui ronge mon coeur est celle qui consite à envoyer un SMS via le microcontroleur. J'ai eu à mener des recherches là-dessus et j'ai cru comprendre qu'il faudrait tester un portable tel que Sony Ericsson ou Siemens ou Nokia avec Hyper Terminal de Windows pour s'assurer de sa réponse au commandes AT nécessaire pour communiquer avec le port Série RS232, de quoi s'assurer de la communication du microcontroleur et du portable par l'UART (à savoir Rx et Tx).

Mon problème se situe au niveau de comment programmer en C ces commandes AT pour permettre l'envoi et la réception d'un SMS.

Je vous en prie si tout au moins, on peut me donner l'algorithme d'envoi de SMS ou le principe, cela me ferait plaisir et ce serait un plus pour moi pour évoluer.

J'attends de vous toujours, une aide et des contributions: soit des tutos ou des liens qui expliquent le sujet posé.

Merci
Fréjus
 

Messagede The Dude le 16 Mai 2008 16:10

Si tu peux passer directement par un teléphone c'est bien, sinon tu peux toujours acheter un module GSM mais il faut prévoir une centaine d'euros.

Regarde sur cette page:
http://www.lextronic.fr/P1372-module-oem-gm862-quad.html

C'est la page d'un module GSM chez Lextronic, à défaut de vouloir l'acheter il y a quand même en exemple la liste de commandes à lui envoyer pour un SMS, ca peut t'aider :d
The Dude
 

SMS remote controll

Messagede Fréjus le 19 Mai 2008 13:29

Merci bien Dude !

Excuz mopi si jè mal écrit ton pseudo. Je vais y jeter un coup d'oeil. Mais à part ça, pourrais-tu me dire comment communiquer vers un portable part USART d'un atmega et aussi comment l'appliquer dans mon cas pour envoyer un SMS. J'y arrive tjrs pas.

Je t'en prie aide-moi à trouver du renfort.
Fréjus
 

Messagede The Dude le 19 Mai 2008 18:31

Salut!

Je ne connais pas du tout les atméga, je travaille seulement avec des PICs, mais cherche un peu sur google tu devrais trouver sans souci des exemples de code pour utiliser l'USART.

Si tu codes en ASM va falloir faire ca à la main, mais si tu te sers d'un compilo type WinAVR je suis sur qu'il y a des codes tout fait et très simples. Regarde un peu s'il n'y a pas des exemples donnés avec.

En théorie pour se servir de l'usart, tu as juste à la configurer (Bauds, Parité, Bit de stop, etc...) puis à lui envoyer des données.
The Dude
 

USART

Messagede Fréjus le 26 Mai 2008 15:05

Merci Dude,

Je me suis mis à lire des cours sur l'tuilisation de l'USART avec mon microcontroleur ( atmega168) et je crois que en trouvant des sources faites en C dans un forum sur le sujet, je m'en sortirai. Mais pour le moment, je n'en trouve pas et je voudrais que tu m'aides à trouver un tout au moins.
Mon maître de mémoire me demande de faire l'étude de l'ART ou ETAT de L'ART dans certains jargons sur mon le système que j'ai à réaliser. je rappelle que mon système devra envoyer un sms ou appeler un numéro pour prévenir d'une mauvaise température régnant dans une enceinte donnée. Et je ne sais quoi dire, ni comment m'y prendre.
Essaies donc, je t'en prie de me donner un coup de main.
Passe de bons moments. je t'en remercie.
Fréjus
 

Re: Interface d'envoi SMS et d'appel d'un portable via un Atmega

Messagede legscar le 11 Juil 2008 11:26

Présentation

Que peut on trouver de mieux pour relier un microcontrôleur aux PC qu'une liaison RS232 ? En effet, cette liaison, bien que plus très récente, offre l'avantage d'etre facile et rapide à mettre en oeuvre par rapport à une liaison plus moderne comme par exemple l'USB.

Un UART (Universal Asynchronous Receiver Transmitter) ou son évolution l'USART (Universal Synchronous Asynchronous Receiver Transmitter) est un composant courant qui de plus est intégré au sein de la plupart des microcontrôleur AVR.
Il permet de gérer facilement la communication sur une ligne RS232.

Dans la suite, je parlerai d'USART car j'utilise un ATMEGA16 dans mes projets et celui-ci dispose d'un USART. L'aspect synchrone du composant n'étant pas utilisé, le fonctionnement est identique à celui d'un UART.

Je vais donc vous présenter dans cette partie le fonctionnement de ce composant, et illustrer mes propos par quelques fonctions que j'ai développé en langage C et permettant d'utiliser l'USART du microcontrôleur.

Je ne vous présenterai ici que le fonctionnement par interruption, plus propre que le fonctionnement par attente. De plus, pour être encore plus rigoureux, l'emission et la réception se font via deux buffers circulaires, un pour l'émission et un pour la réception. Jetez donc un coup d'oeil sur la gestion d'un buffer circulaire.

Fonctionnement de l'USART

Emission d'un caractère

L'émission d'un caractère suit les étapes suivantes (L'initialisation aillant été faite auparavant) :

Un caractère est placé dans le registre de données UDR.
Dès qu'un caractère est placé dans ce registre, l'USART déplace le caractère dans le registre à décalage et commence l'emission.
Le registre UDR étant vide, le flag UDRE (UDR Empty) du registre UCSRA est placé à 1 et une interruption est générée. C'est cette interruption qui est utilisée pour envoyer les caractères les uns après les autres. Il en existe une autre mais que je n'expose pas ici.
L'UDR étant vide, on peut y placer un nouveau caractère à émettre.
Dès la fin de l'émission du caractère précedent, le cycle recommence.
Réception d'un caractère

La réception d'un caractère est trivial : Lorsqu'un caractère est reçu, une interruption est génerée.



USART_Init

La fonction USART_Init initialise le module USART du microcontrôleur. Pour le moment, les paramêtres sont inscrit dans le code de la fonction mais je vais prendre le temps de modifier ceci afin qu'ils puissent être passés en tant que paramêtres de la fonction.
Néanmoins, le fait de placer les paramètres dans le code permet de réduire la taille de celui-ci.

Le registe UCSRA renseigne principalement sur l'état de l'USART (UDRE par exemple). Le registre UCSRB quant à lui permet de le controler (TXEN et RXEN qui active l'emission et la réception).

En plus de ces deux registres viennent s'ajouter les deux registres UBRRH et UBRRL qui reçoivent le nombre diviseur de la fréquence d'horloge afin de définir la vitesse de transmission.

void USART_Init(void)
{
/* Wait latest receive character was pull from UDR */
while(UCSRA & (1<<RXC));

/* Wait end of transmission */
while(!(UCSRA & (1<<UDRE)));

/* Disable transmitter and receiver */
UCSRB &= ~((1<<RXEN)|(1<<TXEN));

/* Init buffers */
Buffer_Reset(&in_buf);
Buffer_Reset(&out_buf);

/* Set baud rate */
UBRRH = (0<<URSEL)|(unsigned char)(BAUDRATE>>8);
UBRRL = (unsigned char)BAUDRATE;

/* Async mode, parity even, 1 stop bit, 8 data bits, * UCPOL set to zero for async transfert mode */
UCSRC = (1<<URSEL)|ASYNCHRONOUS|PARITY_EVEN|STOP_BIT_1|CHAR_SIZE_8;

/* Enable transmitter and receiver (RXEN and TXEN), * enable reception interrupt (RXCIE) */
UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
}

USART_Send

La fonction attend d'abord la fin d'une éventuelle transmission de données avant d'en commencer une autre. Ceci étant car si une intérruption se produit lorsque on est en train de modifier le buffer, les données de celui-ci serait corrompues.

Ensuite, on copie les données à emettre dans le buffer de sortie (ou d'émission) et on active l'interruption.

Remarque : La fonction ne teste pas si le buffer est plein pendant le remplissage de celui-ci. Veillez donc à ne pas émettre des données plus longue que la taille du buffer (la taille de celui-ci étant modifiable par un #define dans usart.h).

void USART_Send(char *p_data, unsigned short length)
{
/* Wait end of transmission */
while(!(UCSRA & (1<<UDRE)));

/* Copy data into the buffer */
for(u16_t i=0; i<length; i++)
Buffer_Push(&out_buf, *(p_data+i));

/* Enable UDR Empty interrupt */
UCSRB |= (1<<UDRIE);
}

SIGNAL(SIG_UART_DATA)

Lorsque le registe UDR de l'USART est vide, il génere cette interruption (pardonnez moi l'abus de langage, c'est plus simple :-p). C'est cette interruption qui est utilisée pour alimenter en continu le flot de caractères.

Un caractère est extrait du buffer de sortie et est placé dans le registre UDR si il est différent de -1. -1 indique que le buffer est vide et l'opération consiste donc à désactiver l'intérruption car sinon, l'interruption se repetera indefiniment jusq'au nouveau remplissage du registre UDR.

SIGNAL(SIG_UART_DATA)
{
char c = Buffer_Pull(&out_buf);

if(c == -1) // Buffer empty ?
UCSRB &= ~(1<<UDRIE); // Yes, stop UDR empty interrupt
else
UDR = c; // No, put c in UDR
}

SIGNAL(SIG_UART_RECV)

Lorsqu'un caractère est reçu, cette interruption est executée. Si il n'ya pas eu d'erreur de parité ou de format (bit stop ...), le caractère est stocké dans le buffer de réception (in_buf). Dans le cas contraire, il est tout simplement jeté.

SIGNAL(SIG_UART_RECV)
{
char garbage;

if((UCSRA & (1<<FE))||(UCSRA & (1<<PE))) // Frame or parity error ?
garbage = UDR; // Yes, UDR -> Garbage
else
Buffer_Push(&in_buf, UDR); // No, Char -> Input buffer
}

.
legscar
 


Retourner vers AT90-ATmega-ATtiny

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

cron