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
Carte Arduino Uno
#1
Posté 16 avril 2012 - 03:50
#4
Posté 16 avril 2012 - 05:03
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')
#6
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
Posté 17 avril 2012 - 07:48
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
Posté 17 avril 2012 - 01:52
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.
#10
Posté 19 avril 2012 - 09:13
Mon site internet : http://ferdinandpiette.com/
#11
Posté 20 avril 2012 - 08:44
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 donc je réessaie et toujours 20 s .
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
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 donc je réessaie et toujours 20 s .
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?
#13
Posté 23 avril 2012 - 05:40
#14
Posté 25 avril 2012 - 01:07
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
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
Posté 25 avril 2012 - 02:58
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
Posté 25 avril 2012 - 05:07
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.
#20
Posté 27 avril 2012 - 08:22
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