
[c+] Arduino: Questions diverses
#1
Posté 09 février 2011 - 06:21
Comme ca je pose mes petite question de programmation ici.
La grosse question que je me pose et dont j'ai besoin pour commencé a programmer mon robot, c'est: comment récupéré a la sorti d'un récepteur radio (de modélisme), l'angle imposé au servo.
si quelqu'un a une solution simple je suis preneur. sinon je vais mesuré a l'oscilo (enfin avec l'arduino) les fréquence de sorti pour diffèrent angle et les réutilisé après.
#2
Posté 09 février 2011 - 07:07
a priori, tu peut faire la moyenne avec un condensateur et mesuré la tension avec une patte analogique.
#3
Posté 09 février 2011 - 07:11
moi je penser plus a un code du genre angle.read! (on peut toujours rêver ^^)
#4
Posté 09 février 2011 - 07:17
#5
Posté 09 février 2011 - 07:44
mais du coup une question se pose ? comment je fait pour mesuré la duré des impulsion ??
comment je fait pour comparé le temps de l'impulsion avec un temps que je définit arbitrairement ?
#6
Posté 11 février 2011 - 11:33
en gros, tu réduit ton signal a sa valeur moyenne. pour un signal rectangulaire, elle ne dépend pas de la fréquence, mais seulement du rapport cyclique et de la tension a l’état haut. là, la tension haute est toujours a peu prés de 5 volts, seul le rapport cyclique varie en fonction de la durée des impulsions ( et de façon linéaire en plus, c'est beau la vie. ) donc, si tu utilise un condensateur, tu va te retrouvé avec une tension continue, mais dont la valeur varieras linéairement en fonction du signal que tu reçoit de ta radiocommande, et cette tension, tu pourras la retrouvé avec une patte analogique de ton microcontroleur.
#7
Posté 11 février 2011 - 03:42
par contre, j'ai cherché (peut être pas avec les bon termes)mais je trouve rien sur le sujet :(
Un schéma de montage m'aiderai beaucoup, si c'est pas trop demander :D
edit: J'ai trouvé! http://www.sonelec-musique.com/electronique_realisations_conv_pwm_tension_001.html
donc du coup juste un résistance et un condo ca suffit ?, c'est génial!!
par contre comment je calcule leur valeur ?,
#8
Posté 11 février 2011 - 04:28
#9
Posté 13 février 2011 - 06:11
ok, (je peut pas encore tester, j'ai pas mon récepteur avec moi pour le moment).
en attendant je teste certaine chose: je voulais faire tourné un servo avec deux bouton. L'un pour tourné dans un sens, l'autre pour tourné dans le sens opposé.
mais visiblement ce que j'ai tester ne fonctionne pas trés bien.
voici, mon code:
#include int angle;
int inPin = 0;
int in2Pin = 1;
Servo mservo;
void setup() {
pinMode(0, INPUT);
pinMode(1, INPUT);
mservo.attach(2);
angle = 90;
mservo.write(angle);
}
void loop() {
if(digitalRead(inPin) == HIGH)
{
angle = angle + 10;
mservo.write(angle);
}
if(digitalRead(in2Pin) == HIGH)
{
angle = angle - 10;
mservo.write(angle);
}
}
[/code]
#10
Posté 14 février 2011 - 01:45
#11
Posté 15 février 2011 - 06:55
le probleme que j'ai avec mon code, c'est que lorsque j'apuie sur un bouton, au lieu de se placé a 80° ou 100° (selon le cas), il va se mettre a 0 ou a 180...
alors je sais pas trop d'ou ca peut venir
#12
Posté 15 février 2011 - 09:23
Le code fait exactement ce qu'on attend de lui, lors que le bouton est à 1, il fait avancer le servo.
Or tu as mis ce code dans une boucle infinie qui ne dispose pas de "pause", donc à priori la boucle s'exécute en moins d'1 ms, autrement dit, quand tu appuie sur le bouton, ce qui est supérieur à 100 ms, bah le servo tourne de 100*10° = 1000° > 180°.
Il y a plusieurs manières de traiter ce problème :
- Utilisation d'une variable "Enfonce" qui est testée pour déclencher l'angle. Cette variable est mise à 1 lorsque le bouton est enfoncé, on fait un tour de boucle et ensuite un timer est déclenché pendant par exemple 100 ms pour éviter que la variable soit mise à 1 pendant ce laps de temps.
- Utilisation des interruptions lorsqu'on appuie sur le bouton, là aussi on change de valeur une variable. Principe similaire au précédent.
- Méthode conne : sleep(100) à la fin de ta boucle. :)
#13
Posté 15 février 2011 - 10:03
je teste demain soir, après le boulot (enfin le stage)
Edit (16/02/11): C'est bon, ca fonctionne exactement comme je le voulais.
#14
Posté 19 février 2011 - 09:58
#include
int A=1;
void setup() {
pinMode(0,INPUT);
pinMode(1,OUTPUT);
}
void loop() {
if (digitalRead(0) == HIGH)
{
if (A = 1)
{
digitalWrite(1,HIGH);
}
else
{
digitalWrite(1,LOW);
}
A = 0;
}
if (digitalRead(0) == LOW)
{
A = 1;
}
}
[/code]
En théorie ca devrait être une bascule D, si j'appuie sur mon interrupteur en 0 la diode en 1 s'allume, et elle s'éteint uniquement si j'ai relâché le bouton avant de le re-actionné.
#15
Posté 19 février 2011 - 10:52
Si tu fais attention tu ne peux changer l'état de la led que lorsque tu appuie sur le bouton.
Il faut que tu change tes tests :)
#16
Posté 19 février 2011 - 11:13
c'est pour me permettre d'évité a la diode de changer d'état 50 fois a chaque fois que j'appuie.
la, j'appuie elle s'allume, je relâche et quand je r appuie elle s'éteint.
Edit: j'ai reussi c'est bon :D
boolean A=1;
boolean etat = LOW;
void setup() {
pinMode(0,INPUT);
pinMode(1,OUTPUT);
}
void loop() {
if (digitalRead(0) == HIGH)
{
switch(A)
{
case 0:
break;
case 1:
etat = !etat;
A = 0;
break;
}
digitalWrite(1,etat);
}
if (digitalRead(0) == LOW)
{
A = 1;
}
}
[/code]
#17
Posté 23 février 2011 - 02:29
j'ai conecté un potar a la broche A5, un servo a la pin 5 et une diode a la pin 0 et j'ai écrit ce code:
#include
int angle = 90;
int VB = 5;
Servo mservo;
int haut = 150;
int bas = 30;
int mesure;
void setup()
{
mservo.attach(5);
mservo.write(angle);
pinMode(0,OUTPUT);
pinMode(1,OUTPUT);
}
void loop()
{
mesure = analogRead(VB);
angle = map(mesure,0,1023,0,180);
mservo.write(angle);
if(angle > haut)
{
digitalWrite(0,HIGH);
}
if(angle < bas)
{
digitalWrite(0,LOW);
}
}
[/code]
Et il fonctionne comme je veut.
par contre.. si je fait ce code:
#include
int angle = 90;
int VB = 5;
Servo mservo;
int haut = 150;
int bas = 30;
int mesure;
void setup()
{
mservo.attach(5);
mservo.write(angle);
pinMode(0,OUTPUT);
pinMode(1,OUTPUT);
}
void loop()
{
mesure = analogRead(VB);
angle = map(mesure,0,1023,0,180);
mservo.write(angle);
diode;
}
void diode()
{
if(angle > haut)
{
digitalWrite(0,HIGH);
}
if(angle < bas)
{
digitalWrite(0,LOW);
}
}
[/code]
la ca ne fonctionne pas. la diode ne s'allume jamais.. sauriez vous pourquoi ? :(
#18
Posté 23 février 2011 - 02:56
Il manque les parentheses lors de ton appel a "diode" ligne 28.
diode();
#19
Posté 23 février 2011 - 03:14
#20
Posté 13 mars 2011 - 07:11
Pour en revenir à la première question qui était de mesurer la durée d'un impulsion, il y a l'instruction PulsIn qui est faite pour ça:
http://www.arduino.cc/en/Reference/PulseIn
Cette fonction retourne le temps de l'impulsion en microseconde.
1 utilisateur(s) li(sen)t ce sujet
0 members, 1 guests, 0 anonymous users