Aller au contenu


Photo
- - - - -

[c+] Arduino: Questions diverses


  • Veuillez vous connecter pour répondre
81 réponses à ce sujet

#1 arthael

arthael

    Membre passionné

  • Membres
  • PipPipPip
  • 479 messages
  • Gender:Male

Posté 09 février 2011 - 06:21

Plutôt que de "polluer" le poste de mon Robot en cours, je fait refait un sujet dans le forum approprié.
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 webshinra

webshinra

    Membre passionné

  • Membres
  • PipPipPip
  • 510 messages

Posté 09 février 2011 - 07:07

la fréquence n'est pas supposée changer, mais la durée des impulsions oui.
a priori, tu peut faire la moyenne avec un condensateur et mesuré la tension avec une patte analogique.

#3 arthael

arthael

    Membre passionné

  • Membres
  • PipPipPip
  • 479 messages
  • Gender:Male

Posté 09 février 2011 - 07:11

ha ?.. ca a l'air compliqué.. comment tu fait ca ?.

moi je penser plus a un code du genre angle.read! (on peut toujours rêver ^^)

#4 Hexa Emails

Hexa Emails

    Membre passionné

  • Membres
  • PipPipPip
  • 439 messages
  • Gender:Male

Posté 09 février 2011 - 07:17

ça semble compliqué oui. Il faut faire comme webshinra dit, le problème est que tu ne connais ni la fréquence porteuse ni la fréquence du signal analogique. Vaut mieux utiliser un vrai oscilloscope si tu as possibilité, car lorsqu'on ne sais pas ce que l'on veut mesurer il faut échantillonner à très haute fréquence (et l'arduino n'en est pas capable). Ou sinon cherche sur le net quelqu'un a bien du faire ce type de démarche et a publié la "norme" de communication.

#5 arthael

arthael

    Membre passionné

  • Membres
  • PipPipPip
  • 479 messages
  • Gender:Male

Posté 09 février 2011 - 07:44

Et bien voila en cherchant j'ai trouvé ceci (qui est trés intéressant): http://www.maximummt.com/electronique-rc-f23/visualisation-du-dialogue-recepteur-servo-t20938.html

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 webshinra

webshinra

    Membre passionné

  • Membres
  • PipPipPip
  • 510 messages

Posté 11 février 2011 - 11:33

en fait, c'est la l’intérêt de la ruse du moyennage avec un condensateur.
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 arthael

arthael

    Membre passionné

  • Membres
  • PipPipPip
  • 479 messages
  • Gender:Male

Posté 11 février 2011 - 03:42

ok, je comprend parfaitement le principe :)

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 webshinra

webshinra

    Membre passionné

  • Membres
  • PipPipPip
  • 510 messages

Posté 11 février 2011 - 04:28

a priori, les valeurs qu'il a mis devrais convenir pour la plus part des usages, puisque tu ne réalise pas un filtrage très précis, mais que tu récupère juste la moyenne.

#9 arthael

arthael

    Membre passionné

  • Membres
  • PipPipPip
  • 479 messages
  • Gender:Male

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 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique
  • Interests:La robotique !

Posté 14 février 2011 - 01:45

N'oublie pas d'utiliser les balises "code"... Ça permet de montrer un code d'une manière bien plus claire et visible. ;)

#11 arthael

arthael

    Membre passionné

  • Membres
  • PipPipPip
  • 479 messages
  • Gender:Male

Posté 15 février 2011 - 06:55

ok (je connais pas les balise ^^).

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 zeqL

zeqL

    Membre passionné

  • Membres
  • PipPipPip
  • 393 messages
  • Gender:Male

Posté 15 février 2011 - 09:23

Cela vient de ton code. Enfin de toi en fait.

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 arthael

arthael

    Membre passionné

  • Membres
  • PipPipPip
  • 479 messages
  • Gender:Male

Posté 15 février 2011 - 10:03

oui!! merci, je vient d'y penser dans la voiture! je me suis dit "bon sang mais c'est bien sur!"

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 arthael

arthael

    Membre passionné

  • Membres
  • PipPipPip
  • 479 messages
  • Gender:Male

Posté 19 février 2011 - 09:58

Nouveau problème, j'ai bien avancé dans le futur programme de mon robot. mais en voulant l'amélioré je me suis heurté a ce problème.





#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 zeqL

zeqL

    Membre passionné

  • Membres
  • PipPipPip
  • 393 messages
  • Gender:Male

Posté 19 février 2011 - 10:52

Fonctionnement toujours correct vis-à-vis du code que tu as écrit.

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 arthael

arthael

    Membre passionné

  • Membres
  • PipPipPip
  • 479 messages
  • Gender:Male

Posté 19 février 2011 - 11:13

c'est justement ce que je veut, quand j'appuie sur le bouton la diode change d'état.

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 arthael

arthael

    Membre passionné

  • Membres
  • PipPipPip
  • 479 messages
  • Gender:Male

Posté 23 février 2011 - 02:29

J'ai un nouveau problème :/

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 Jbot

Jbot

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 801 messages
  • Gender:Male
  • Location:Paris
  • Interests:Robotics

Posté 23 février 2011 - 02:56

C'est deja bizzare que ton code compile...
Il manque les parentheses lors de ton appel a "diode" ligne 28.

diode();

#19 arthael

arthael

    Membre passionné

  • Membres
  • PipPipPip
  • 479 messages
  • Gender:Male

Posté 23 février 2011 - 03:14

effectivement la ca fonctionne, ce qui est étrange c'est que j'ai déjà fait des appel de fonction sans () qui fonctionné sans problème.

#20 GDV

GDV

    Nouveau membre

  • Membres
  • 1 messages

Posté 13 mars 2011 - 07:11

Bonsoir,

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.





0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users