Voila j'ai un petit problème ^^" Je voudrai en effet exécuter deux commandes en même temps sauf que je sais vraiment pas comment faire, déjà parce que j'ai pas appris les threads sur d'autres langages et en plus que je sais que l'Arduino est pas tout a fait en C.
Je dispose de la bibliothèque IRremote et ce que je veux faire c'est d'un coté envoyer un signal avec une diode IR et de l'autre coté recevoir ce signal sur un TSOP 34838. Tout le materiel marche très bien. Enfait ce que je veux c'est faire une sorte de faisceau, dont on peut récupérer l'état.
Sauf que c'est soit j'envoie le signal, soit je recois le signal et j'ai pas vraiment trouvé comment faire les deux en même temps, ca serait pas possible ? Ou je me trompe de piste sur l'émission du signal peut être ? Mais un simple signal sorti du PWM je sais pas si ca serait efficace vu que le recepteur est fait pour les 38kHz
Alors effectivement je pense que je vais utiliser un NE555, si je l'utilise avec un montage astable est-ce que ca ira ? (En faisant ce montage http://www.robot-maker.com/index.php?/tutorials/article/13-composant-le-ne555/page___st__3) J'ai fait les calculs et je devrai utiliser deux resistances de 125 Ohms(je metterai 120 et 5.6 en série) et un condensateur de 100nF. Après je sais pas vraiment si c'est vraiment ce dont tu voulais parler Eskimon ^^"
Mais Lord pour le PWM je peux pas changer la fréquence en 38kHz pour générer le signal si ?
Citation : Tuto
Pour votre carte Arduino elle est de environ 490Hz.
Enfin si tu me dit comment faire c'est peut être plus facile que d'ajouter une composant ^^"
En fait pour changer la fréquence du PWM tu peux, mais il faut aller tripoter des notions plus "avancés" dans les registres du microcontrolleur (chose qui ne sont pas proposé dans les fonctions de bases d'arduino)
Ou alors tu utilises la fonction Tone() (je te réoriente vers la doc pour savoir comment l'utiliser et sur le sujet suivant pour en connaitre une limite)
Mais Lord pour le PWM je peux pas changer la fréquence en 38kHz pour générer le signal si ?
Si, c'est fait pour, l'unité pwm ne fait pas que du pwm, elle peut aussi sortir un signal carré à peu près à n'importe quelle fréquence, il suffit de la configurer, donc à 38 kHz dans ton cas.
Ensuite, je suppute que tu vas vouloir moduler ce signal en on/off vers 250-500 Hz pour que ton TSOP te sorte du 500 Hz quand la barrière n'est pas interrompue :
- tu configures un timer pour déclencher une interruption 1000 fois par seconde
- cette interruption regarde la sortie du TSOP
- ensuite, elle gère le on/off sur la sortie à 38 kHz
Genre, en pseudocode :
// variable globale pour communication entre interruption et main
static int passages = 0;
// fonction d'interruption qui est appelee 1000x par seconde (ou moins selon tes goûts)
void mytimer()
{
// variables d'état
static int temps_coupure = 0;
static bool emission = false; // si true on a déclenché l'émission au cycle précédent
bool reception = (état de la pin qui reçoit le signal du TSOP)
if( emission )
{
// au cycle precedent on a emis, check si le TSOP a reçu
if( reception )
{
// si on a reçu ce qu'on a émis, y'a personne devant
if( temps_coupure > un certain temps ) passages++;
temps_coupure = 0;
}
else
{
// on émet mais on ne reçoit pas : y'a quelqu'un
if( temps_coupure < maximum ) temps_coupure++;
}
}
else if( reception )
{
// on emet pas mais on reçoit, signaler un bug !...
}
// change l'etat du pwm
emission = !emission;
// configure le pwm pour émettre ou pas.
...
}
bon, le nom des variables devrait etre assez explicite, la on détecte les coupures de barriere lumineuse qui durent plus qu' "un certain temps".
Oui Lord pour la suite c'est a peu près ca que je ferai Après je veux bien mais faut juste que je sache comment changer la fréquence du PWM
Eskimon j'ai bien lu tout ce que tu m'as envoyé mais du coup ca veut dire que la fonction tone() sera pas une solution pour moi vu que je veux un signal a 38kHz et que la limite est 2^15 parce que la fonction prend un int :/
Après j'ai regardé des topics pour voir comment changer la fréquence du PWM, mais ca parle de timer et pleins d'autre trucs qui interfèrent en plus sur la gestion du temps. Ca poserai problème parce que mon projet est basé sur cette gestion du temps :/
Donc je fais quoi, PWM ou utilisation du 555(ca me dérangerai pas parce que j'ai stock de matos presque a volonté)? xD (N'empèche merci de m'aider je serai pommé si non ^^)
Il y a plusieurs unités timers* dans ton uC, l'un d'eux doit être utilisé pour la gestion du temps par le framework arduino, les autres sont dispo.
Je ne connais pas les commandes spécifiques arduino pour configurer ça, mais bon, comme pour tout uC il suffit de paramétrer les registres suivant les conseils de la datasheet (chez Atmel c'est très bien expliqué).
* = une unité timer/counter contient un compteur (ici 16 bits).
Le compteur peut compter des tops d'horloge (mode timer) fournis par un prescaler (qui te permet de diviser l'horloge du uC par une valeur de ton choix) ou bien des événements sur une broche (mode counter). Il y a d'autres modes utiles, par exemple la capture de la valeur du compteur quand une broche change d'état, utile pour mesurer une durée par exemple.
En mode compteur, tu peux mettre par exemple une horloge à 1 MHz avec le prescaler. Ton compteur va s'incrémenter 1 million de fois par seconde. Il y a un registre qui donne la période : si tu mets 2000 dedans, le compteur fera un tour tous les 2000 incréments, donc 500 fois par seconde.
Ensuite, il y a des registres de contrôle de PWM, à configurer, par exemple si tu actives le PWM et que tu mets dans le registre PWM la valeur 1000, quand le compteur est de 0 à 999 tu auras 1 en sortie sur la broche, de 1000 à 1999 tu auras 0 en sortie, tu as donc ton signal carré.
Le timer peut aussi activer une interruption (à configurer) pour appeler ta routine à chaque retour à zéro du compteur (parfois la valeur est aussi configurable).
Et ca interferera pas du tout avec les fonctions comme delay() et millis() ?
(Désolé si je suis un parano sur ca, tout mon projet repose sur un traitement du durées)
Timer0:
Timer0 is a 8bit timer.
In the Arduino world timer0 is been used for the timer functions, like delay(), millis() and micros(). If you change timer0 registers, this may influence the Arduino timer function. So you should know what you are doing.
Timer1:
Timer1 is a 16bit timer.
In the Arduino world the Servo library uses timer1 on Arduino Uno (timer5 on Arduino Mega).
Timer2:
Timer2 is a 8bit timer like timer0.
In the Arduino work the tone() function uses timer2.
Donc voila parfait vu que j'utilise pas la librairie Servo Si j'arrive a bien me servir de la libraire tout sera résolu je pense Je reviens vers vous une fois que j'ai fait tout ca
Encore merci !
Yeah !! Ca y est ca marche, donc ce que j'ai fait c'est avec la librairie un signal PWM d'une période de 26µs (~= 38461 Hz) ca rentre dans la plage du TSOP et je récupère l'état du faisceau simplement avec un digitalRead
Merci beaucoup de m'avoir aidé !
[Arduino] Faisceau IR
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !