Aller au contenu


Photo
- - - - -

Carte Arduino Uno


22 réponses à ce sujet

#1 lestephanoi

lestephanoi

    Habitué

  • Membres
  • PipPip
  • 161 messages
  • Gender:Male

Posté 16 avril 2012 - 03:50

Bonjour à tous.

J'ai une carte Arduino Uno avec un shield pour contrôler un moteur pas à pas et je voudrais rajouter un écran LCD avec quelques boutons poussoirs. J'ai donc trouvé ça comme carte : Ecran+Clavier mais le problème c'est que je n'ai pas assez de sorties et d'entrées.
J'ai cherché s'il existait des extensions d'entrées sorties mais je ne trouve pas.
Est ce que ça existe ? Et si oui est ce que vous en connaissez ?

Merci



#2 Francky

Francky

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 967 messages
  • Gender:Male

Posté 16 avril 2012 - 04:29

Bonjour,
Il faut que tu utilises des multiplexeurs.
Regardes ici, il y a l'air d'y avoir des explications et des exemples :)

#3 lestephanoi

lestephanoi

    Habitué

  • Membres
  • PipPip
  • 161 messages
  • Gender:Male

Posté 16 avril 2012 - 04:39

J'y avait pensé mais cette solution ne me plait pas trop, si vraiment il n'y à pas d'autre solution je ferais ça.

#4 Francky

Francky

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 967 messages
  • Gender:Male

Posté 16 avril 2012 - 05:03

Ben après tu peux toujours relier plusieurs boutons sur une même patte et après essayer de traiter l'information par le soft (mais à mon avis c'est pas vraiment possible).

Ou alors, il faut que tu relies chaque BP à 2 ports (chaque BP étant décalé de 1 patte).
Ensuite tu traites par le programme.


Exemple de procédé :

BP1 = gauche (relié sur la patte 1 et la patte 2)
BP2 = droite (relié sur la patte 2 et la patte 3)
BP3 = centre (relié à la patte 3 et la patte 4)


patte 1 à 1 => BP1 enclenché

patte 2 à 1 ? Alors on test les pattes 1 et 3. Si patte 1 à 1 => BP1, si patte 3 à 1 => BP2

patte 3 à 1 ? Alors on test les pattes 2 et 4. Si patte 2 à 1 => BP2, si patte 4 à 1 => BP3




Voilà en espérant t'avoir donné des idées x')

#5 Thor

Thor

    Habitué

  • Membres
  • PipPip
  • 251 messages
  • Gender:Male

Posté 16 avril 2012 - 05:14

Pour augmenter le nombre de sorties il y a ce genre de choses sinon.

#6 Hexa Emails

Hexa Emails

    Membre passionné

  • Membres
  • PipPipPip
  • 439 messages
  • Gender:Male

Posté 16 avril 2012 - 05:17

Tu as largement assez d'entrées/sorties:

-le LCD + BP: 7 entrées, dont 6 digitales ( D4 à D9 ) et une entrée analogique (A0)

-Un pont basé sur L293D: 2 Pwm, 2 Sens et 2 enable (tu peux relier ces deux dernier au +5v selon ton utilisation, et économiser 2 pins)

=> total : 13 E/S dans le pire des cas.

Un arduino uno: 19 E/S.

Et en plus, les shields sont compatibles d'origine...
Ne soulève pas de problèmes qui n'existent pas.



#7 lestephanoi

lestephanoi

    Habitué

  • Membres
  • PipPip
  • 161 messages
  • Gender:Male

Posté 17 avril 2012 - 07:48

Merci de vos réponse.

Mon shield moteur à deux boutons intégrer sur la carte et j'utilise deux autres entrées pour des capteurs de fin course, ce qui fait 4 autres entrées digitales en moins. Et il y a même un entrée qui est relié sur un circuit logique de porte OU sur la carte et qui ne sert à rien. Donc ça fait 5 entrées digitales en moins, plus celle utilisé pour contrôler le moteur ça fait 11 entrées digitales pour le moteur shield et il y en aura pas assez pour l'écran + le clavier.

Thor est ce que tu as déjà utilisé cette carte d'extension ?

Sinon je pense utilisé un CI PCF8574 qui communique en I2C et qui me rajouté 8 entrées/sorties (pour mon afficheur LCD). Vous en pensez quoi ?

#8 Hexa Emails

Hexa Emails

    Membre passionné

  • Membres
  • PipPipPip
  • 439 messages
  • Gender:Male

Posté 17 avril 2012 - 01:52

Le shield moteur n'utilise que 4 sorties: D10 D11 D12 D13 d'après l'exemple. Le circuit logique n'est utile que si tu veux te servir d'encodeurs.

il te reste donc D2 et D3 (+D0 et D1 qui servent au port série) , ainsi que les entrées analogiques A1 à A5... que tu peux utiliser comme E/S digitales.

#9 lestephanoi

lestephanoi

    Habitué

  • Membres
  • PipPip
  • 161 messages
  • Gender:Male

Posté 19 avril 2012 - 07:11

Plus besoin de quoi que ce soit (plus besoin d'extension, de shield, ...), je vais piloter ma carte par PC grâce au logiciel PROCESSING. Vous connaissez ?

#10 Black Templar

Black Templar

    Membre

  • Membres
  • PipPipPipPipPip
  • 1 430 messages
  • Gender:Male
  • Location:Lille

Posté 19 avril 2012 - 09:13

EDIT : Oops, j'ai mal lu le sujet ! Désolé ! Mon post ne sert donc à rien ...

Mon site internet : http://ferdinandpiette.com/


#11 lestephanoi

lestephanoi

    Habitué

  • Membres
  • PipPip
  • 161 messages
  • Gender:Male

Posté 20 avril 2012 - 08:44

Bonjour à tous,

Je pense que je viens de découvrir un bug dans la librairie stepper (peut-être que d'autre l'avait déjà remarqué).
Je vous explique le truck :
En fait j'ai un moteur pas à pas qui fait 200 pas, quand j'écrit mon programme je met une vitesse de 120 tours/min et un nombre de pas de 10000. Je fait un petit calcul pour trouver en combien de temps il devrait faire les 10000 pas :
1 tour <-> 200 pas, je tourne à 120 tours/min qui correspond à 120*200 = 24000 pas/min = 400 pas/s donc pour faire 10000 pas => 10000/400 = 25 s. Conclusion mon moteur va tourné pendant 25 s, alors j'essai et la je vois qu'il ne tourne que pendant 20 s :mellow: donc je réessaie et toujours 20 s :wacko: .
Faisant confiance à mes calculs je décide d'allé voir dans la librairie stepper et je vois ça :
unsigned long step_delay;
void Stepper::setSpeed(long whatSpeed)
{
  this->step_delay = 60L * 1000L / this->number_of_steps / whatSpeed;
}
Ne savant pas ce que voulais dire 60L * 1000L, j'ai fait le calcul dans un programme et il m'a affiché 60000 donc je pense que ça doit faire 60000.
Alors quand je fais le calcul avec ma vitesse et mon nombre de pas, ça donne :
step_delay = 60000 / 200 / 120 = 2.5 et 2.5 est un nombre à virgule et step_delay est un long (nombre entier). step_delay va donc être arrondi à 2 et c'est pour cela je pense que mon moteur ne tourne que pendant 20 s.
Vous en pensez quoi ?

#12 swolf

swolf

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 626 messages
  • Gender:Male

Posté 22 avril 2012 - 11:00

Bonjour à tous,

Je pense que je viens de découvrir un bug dans la librairie stepper (peut-être que d'autre l'avait déjà remarqué).
Je vous explique le truck :
En fait j'ai un moteur pas à pas qui fait 200 pas, quand j'écrit mon programme je met une vitesse de 120 tours/min et un nombre de pas de 10000. Je fait un petit calcul pour trouver en combien de temps il devrait faire les 10000 pas :
1 tour <-> 200 pas, je tourne à 120 tours/min qui correspond à 120*200 = 24000 pas/min = 400 pas/s donc pour faire 10000 pas => 10000/400 = 25 s. Conclusion mon moteur va tourné pendant 25 s, alors j'essai et la je vois qu'il ne tourne que pendant 20 s :mellow: donc je réessaie et toujours 20 s :wacko: .
Faisant confiance à mes calculs je décide d'allé voir dans la librairie stepper et je vois ça :

unsigned long step_delay;
void Stepper::setSpeed(long whatSpeed)
{
  this->step_delay = 60L * 1000L / this->number_of_steps / whatSpeed;
}
Ne savant pas ce que voulais dire 60L * 1000L, j'ai fait le calcul dans un programme et il m'a affiché 60000 donc je pense que ça doit faire 60000.
Alors quand je fais le calcul avec ma vitesse et mon nombre de pas, ça donne :
step_delay = 60000 / 200 / 120 = 2.5 et 2.5 est un nombre à virgule et step_delay est un long (nombre entier). step_delay va donc être arrondi à 2 et c'est pour cela je pense que mon moteur ne tourne que pendant 20 s.
Vous en pensez quoi ?


T'as essayé de modifier step_delay en float pour voir?
Notre blog, à FJprod et moi: http://2froblog.wordpress.com/

#13 lestephanoi

lestephanoi

    Habitué

  • Membres
  • PipPip
  • 161 messages
  • Gender:Male

Posté 23 avril 2012 - 05:40

En fait j'ai trouvé pourquoi ca ne marche pas. Dans la librairie il utilise la fonction millis() et calcul le nombre de milliseconde qui s'écoule entre chaque pas du moteur. Avec les valeur que j'ai rentré il faut un temps de 2.5ms entre chaque pas et millis() donne un temps toutes les millisecondes donc impossible de calculer le 0.5ms.

#14 lestephanoi

lestephanoi

    Habitué

  • Membres
  • PipPip
  • 161 messages
  • Gender:Male

Posté 25 avril 2012 - 01:07

Bonjour,

J'ai trouvé une solution à mon problème, remplacé millis() qui donne le temps en milliseconde par micros() qui donne le temps en microseconde dans la librairie Stepper.
Ayant résolu un problème voila qu'un autre arrive : je voudrais avoir une vitesse de 300 tour/min mais ça ne fonctionne pas, quand je lance, le moteur ne tourne pas et fait un bruit comme s'il forçait. La vitesse max que je peux atteindre est de 225 tour/min. Savez-vous pourquoi ?

#15 Black Templar

Black Templar

    Membre

  • Membres
  • PipPipPipPipPip
  • 1 430 messages
  • Gender:Male
  • Location:Lille

Posté 25 avril 2012 - 01:55

Bonjour,

J'ai trouvé une solution à mon problème, remplacé millis() qui donne le temps en milliseconde par micros() qui donne le temps en microseconde dans la librairie Stepper.
Ayant résolu un problème voila qu'un autre arrive : je voudrais avoir une vitesse de 300 tour/min mais ça ne fonctionne pas, quand je lance, le moteur ne tourne pas et fait un bruit comme s'il forçait. La vitesse max que je peux atteindre est de 225 tour/min. Savez-vous pourquoi ?


Salut !
Essaye d'augmenter la valeur de la commande moteur dans ton programme. Fait le tourner au max pour voir.
Un moteur ne tourne pas en dessous d'une certaine tension d'alim.

++
Black Templar

Mon site internet : http://ferdinandpiette.com/


#16 lestephanoi

lestephanoi

    Habitué

  • Membres
  • PipPip
  • 161 messages
  • Gender:Male

Posté 25 avril 2012 - 02:58

C'est un moteur pas à pas donc on peut bien avoir de très faible vitesse, non ?

Et je ne peux pas mettre plus de 225 tour/min.

J'ai essayé de faire un programme sans passer par la librairie. J'utilise un Timer mais ça ne marche même pas, si vous pouviez regarder ce que j'ai fait :

#include <MsTimer2.h> // inclusion de la librairie Timer2

int Pin12[4] = { HIGH , HIGH , LOW , LOW };
int Pin13[4] = { HIGH , LOW , LOW , HIGH };


const int PinBoutonMarche = 7;
const int PinBoutonArret = 6;
int BoutonMarche = 0;
int BoutonArret = 0;

int Pas = 0;

 

void setup()
{
  MsTimer2::set(2.5, InterruptTimer2); // période 500ms
  
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
  
  pinMode(11, OUTPUT);  //pin 11 en sortie
  digitalWrite(11, HIGH);  //pin 11 à l'état haut
  pinMode(10, OUTPUT);  //pin 12 en sortie
  digitalWrite(10, HIGH);  //pin 12 à l'état haut

  Serial.begin(9600);
  Serial.println("Initialisation");
}

void loop()
{
  BoutonMarche = digitalRead(PinBoutonMarche);
  BoutonArret = digitalRead(PinBoutonArret);
  if (BoutonMarche == 0)
  {
    Serial.println("Marche");
    MsTimer2::start(); // active Timer2 
    Serial.println("Timer activé");
    delay(500);
  }
  if (BoutonArret == 0)
  {
    Serial.println("Arret");
    MsTimer2::stop();
    Serial.println("Timer désactivé");
  }
}

void InterruptTimer2()
{
  //Serial.println("Interruption");
  digitalWrite(12 , Pin12[Pas]);
  digitalWrite(13 , Pin13[Pas]);
  Pas++;
  if (Pas>3)
  {
    Pas = 0;
  }
}


#17 Hexa Emails

Hexa Emails

    Membre passionné

  • Membres
  • PipPipPip
  • 439 messages
  • Gender:Male

Posté 25 avril 2012 - 05:07

Chaque moteur a sa limite de vitesse: moi perso dans les moteurs PàP que j'ai testé certains dépassaient pas les 70 tr/min.
Des solutions: augmenter la tension d'excitation de tes bobines, passer en demi-pas, voire micro-pas.

Faut faire des tests au final, chaque moteur est légèrement différent.

#18 lestephanoi

lestephanoi

    Habitué

  • Membres
  • PipPip
  • 161 messages
  • Gender:Male

Posté 26 avril 2012 - 07:36

Dans le peu de notice que nous donne le constructeur il y a une courbe du couple en fonction de la vitesse et elle va jusqu'à 800 tour/min donc je devrais pouvoir atteindre cette vitesses, non ?

#19 Hexa Emails

Hexa Emails

    Membre passionné

  • Membres
  • PipPipPip
  • 439 messages
  • Gender:Male

Posté 26 avril 2012 - 05:51

Tu as la notice? souvent ils précisent sous quelles conditions ils ont effectués ces tests: tu es peu être sous une tension plus basse...

#20 lestephanoi

lestephanoi

    Habitué

  • Membres
  • PipPip
  • 161 messages
  • Gender:Male

Posté 27 avril 2012 - 08:22

Oui j'ai la notice mais il n'y a pas grand chose dessus.
Il donne :
Angle : 1.8°/200 pas
Tension : 12 V
Courant/Phase : 0.4 A
Resistance : 30 Ohms
Inductance/Phase : 55 mH
Couple de maintien : 4.4 kg.cm
Inertie Rotor : 68 g.cm2
Couple : 200 g.cm

Il y a aussi la courbe de couple en fonction du pas par seconde :
pour une vitesse presque nulle le couple est de 3250 g.cm
et à haute vitesse (environ 3000 pas par seconde) le couple est de 500 g.cm

Et le reste c'est des informations, je ne pense pas qu'elle soit utile.

J'ai test ma vitesse à vide sous tension 12 V, j'ai mesuré le courant à 220 tour/min => 400 mA crête-crête et pour une vitesse ou le moteur ne tourne pas (300 tour/min) => 300 mA crête-crête.

Je suis près à racheter un moteur et un shield moteur s'il le faut, mais qu'elle moteur choisir pour avoir une vitesse de 300 tour/min ?

EDIT : il y a en plus marqué au dessus de la courbe : ITC-CNC-1 Pull out torque curve. Je ne comprend pas trop ce que cela signifie.



Répondre à ce sujet



  


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

0 members, 0 guests, 0 anonymous users