LOCODUINO
Parlons Arduino => Vos projets => Discussion démarrée par: papytrain le avril 30, 2020, 11:27:00 am
-
Bonjour à tous
J'ai un projet de pont élévateur pour loco. Ma question est la suivante: quel est le nombre maxi de moteurs pas à pas ref: 28byj48, que l'on peut brancher sur une carte arduino uno r3.
Sachant qu'il me faudra 4 moteurs pour l'élévation.
En vous remerciant
@+
Papy
-
Bonjour,
Tu veux dire, « combien de moteurs pas-à-pas le régulateur de l'Arduino est capable d'alimenter ? » ?
-
Bonjour
Sur ce projet j'aurai 4 moteurs à faire tourner en même temps. Est-ce que l'arduino est capable de les faire tourner, disons si elle va accepter la puissance de ces 4 moteurs?
Ou alors 2 cartes arduino avec 2 moteurs chacune ce qui me ferait l'achat d'une carte supplémentaire.
@+
Papy
-
Il y a deux choses :
1) Le nombre de signaux que l'Arduino est capable de piloter. Ici c'est deux par moteur et donc 8 signaux. Ces petits moteurs sont pilotés via des ULN2003 dont la consommation sur les signaux de contrôle des moteurs est de l'ordre du mA. Donc aucun soucis.
2) Le courant que va tirer l'ULN2003. Pour savoir, il faut mesurer la résistance d'une bobine d'un de tes moteurs avec un contrôleur. Ensuite déduire le courant que va consommer une bobine sous 5V. Je vois chez Gotronic (https://www.gotronic.fr/art-moteur-28byj-48-08-5-vcc-21213.htm) que la résistance est de 21Ω, ce qui donne 24mA par bobine (ils donnent 25 mA). Donc 200mA (8 bobines) en tout.
Donc à priori, ça tient.
Au cas où le régulateur chaufferait trop et se mettrait en alarme, il ne faut pas ajouter un Arduino mais simplement un régulateur 5V externe ou une alimentation 5V externe.
-
Bonjour Papy,
Ca a l'air bien rigolo comme projet. Tu peux nous en dire un peu plus ? C'est une reproduction d'un pont existant ?
Merci
-
Bonjour
@Jean-Luc
Merci pour ces infos. ;)
@Pyk35
C'est un système d'élévateur de loco ou wagon que l'on trouve dans les ateliers de maintenance ferroviaire.
@+
Papy
-
Attention, 200 mA sur le régulateur de l'Arduino avec un VIN de 12V va y dissiper 1,4W soit x 90°C/W = +126°, je ne prendrais pas ce risque.
La bonne pratique me semble de choisir ce pas-à-pas en version 12V et l'alimenter directement du VIN de l'Arduino, donc sans passer par son régulateur.
La masse peut être commune entre logique et puissance et donc avoir qu'une alimentation 12V .
Je pense qu'on peut commander les 4 moteurs par les mêmes 4 sorties de l'Arduino (au lieu de 4 x 4 = 16 sorties) pour assurer la synchronisation.
Le moteur est souvent vendu avec son driver.
https://www.ebay.fr/itm/DC-12V-Stepper-Motor-28BYJ-48-ULN2003-Stepper-Motor-Driver-Module-for-Arduino/173449665712
La commande en 5V de la logique est indépendante de la puissance du moteur mais le repérage des connexions n'est pas clair.
Sur le module au bout du lien, le moteur s'alimente sur les broches VCC (= fil rouge) et GND.
La logique de l'ULN2003 se commande via les broches In1 à In7
Les 4 bobines du moteur sont commandées par In1 à In3. Il faut que le GND de l'Arduino soit mis en commun avec celui du module et de son alimentation 12 V, ce qui sera le cas si on utilise le Vin 12V de l'Arduino pour alimenter le moteur.
https://diydomo.com/boutique/robotique/moteur-pas-a-pas-28byj-48-interface-unl2003/
Un sujet a déjà été publié sur ces moteurs.
-
Bonjour
Je voulais me baser sur cet article:
http://locoduino.org/spip.php?article196 (http://locoduino.org/spip.php?article196)
Mon pont tournant je l'ai fait sur ce principe et aucun soucis. Il me semble que c'était toi qui m'avait aidé.
https://forum.locoduino.org/index.php?topic=829.msg9032#msg9032 (https://forum.locoduino.org/index.php?topic=829.msg9032#msg9032)
@+
Papy
-
Bonjour,
tout à fait, c'est bien de ces moteurs qu'il s'agit.
Il semble que c'est la même chose pour les ATTiny, une sortie d'un UNO est capable de 40 mA, une entrée d'ULN2003 fait 10k. Si on met 4 ça fait 2 mA donc OK.
On peut donc transposer l'article directement, mais à la différence du pont, la consommation est quatre fois plus importante, donc le 5V est à éviter, d'autant que ces modules peuvent alimenter des moteurs 12V sans modification.
-
Bonjour
Désolé si je ne comprends pas du 1er coup, donc ce que je saisis:
Je peux mettre des moteurs de 12v en remplacement en gardant la même configuration que le pont.
@+
Eric
-
Avec un schéma, c'est plus clair ?
-
Ah! Voilà je comprends mieux, merci
Quelle est la référence du composant à 3 pattes?
@+
-
Un 7805
Tu en as un sur ta carte Uno, c'est lui qui fabrique le 5V à partir de VIN
-
Oui, et il faut alimenter en 12V du coté marqué 12V (comme le Uno coté Vin par le jack)
-
Merci à vous ;)
Maintenant il n'y a plus qu'à commander les moteurs, je pense que l'attente va être longue vu la conjoncture.
@+
Eric
-
Pas nécessairement.
J'ai commandé le 5 avril des cartes CAN sur eBay. Elles ont été expédiées le 6 avril et je les ai reçues lundi dernier 27 avril. Donc 3 semaines.
-
En général pour le materiel électronique je commande à Amazon ou Ebay et en dernier recours Aliexpress.
@+
-
Si vous avez déjà les moteurs en 5V, et bien que ce ne soit pas la solution que je préfère (pour cause de parasites, condensateurs nécessaires) vous pouvez alimenter la version ATTiny entièrement en 5V. (drivers, moteurs et ATTiny) . Même remarque pour les délais de eBay. Seul changement, le port gratuit se fait rare.
-
Il me reste un moteur en 5v. Il va me servir pour essai en volant sur table avec la fabrication en 3 d de divers éléments pour le pont ou l'élévateur proprement dit. Disons je suis au stade de réflexion et de modélisation. Donc pas pressé pour les moteurs 12v. La priorité de mos commandes est, si je trouve sur Amazon car les frais de port sont gratuits le plus souvent.
Au final je ferai comme tu me l'as suggéré, en moteurs 12v.
@+
-
Merci pour ce cas d'école :
28BYJ-48 12V
Amazon https://www.amazon.fr/lignes-moteur-engrenage-28BYJ-48-ULN2003/dp/B07JFZ975H/ref=sr_1_5 3,66 € pièce soit 14,64 €
eBay https://www.ebay.fr/itm/DC-12V-Stepper-Motor-28BYJ-48-ULN2003-Stepper-Motor-Driver-Module-for-Arduino/173449665712 (1,79 x 4) + 1,28 = 7,44 €
D'autant que les deux offres viennent certainement de Chine ...
-
Tu sais, tout ce matériel vient de Chine vu les prix...
Sur Amazon c'est pareil, ce n'est qu'un intermédiaire. J'ai acheté sur Amazon une imprimante 3d ainsi qu'une cnc. En France ce genre d'appareil m'est impossible à acheter vu les prix excessifs et la plupart du temps c'est du pro.
@+
-
Re bonjour Papytrain,
Pour découvrir le monde Arduino, j'ai acheté un "Starter Kit" qui rassemble un clone Arduino Uno (fonctionnement au top), plein de composants dont un moteur pas à pas tel cité dans ton post.
C'est un moteur qui comprend un réducteur 1:64 par train d'engrenages. Je n'ai pas testé celui Dibé, mais le mien commence à donner des signes de faiblesses dus à la matière des engrenages....il commence à prendre du jeu et devient très audible, alors qu'il m'a servi qu'à tester le programme "Stepper"
Par contre, pour répondre à ton problème de carte de commande moteur, j'ai acheté un ensemble Shield 4 moteurs + 4 driver DRV8825 + 1 carte Arduino Uno originale "Made in Italy" + 4 dissipateurs + connectique et cavaliers pour moins de 18€☺
Voir ici : https://www.amazon.fr/gp/product/B07ZCRYWCV/ref=ppx_yo_dt_b_asin_image_o00_s01?ie=UTF8&psc=1
A bientôt et bonne continuation
PS : Pour faire tes premiers essais, tu peux toujours désosser des imprimantes jet d'encre destinées à la déchetterie....tu trouveras 2 moteurs PàP, des guides, courroie, poulies, tendeur et plein d'autres accessoires de quincaillerie....et ça lui donneras une seconde vie !!!
-
Bonjour à tous
En attendant la réception de mes moteurs j'ai fait un essai avec le moteur 5V puis le programme du moteur pas à pas publié sur Locoduino. Cela marche impeccable. Par contre j'aurais une question, est'il possible d'augmenter un peu la vitesse maximum?
En vous remerciant
@+
Papy
-
Bonsoir,
Tu veux parler du programme de cet article : https://www.locoduino.org/spip.php?article196 ?
-
Bonsoir Jean-Luc
Oui, exact ;)
-
Ok,
Pour augmenter maximum de rotation, il faut utiliser des délais en microsecondes entre deux pas sans diminuer au delà de ce que le moteur peut faire.
Pour ça, il faut :
- Changer le delay en delayMicroseconds à la ligne 78
- Changer les valeurs qui sont mises dans vitesse de la ligne 43 à 51. Là ça va de 2 à 40, c'est à dire traduit en microsecondes de 2000 à 40000 (attention, 40000 ne tient pas dans un int, la valeur max est 32767). Donc décale tout de manière à avoir, par exemple de 300 à 30000, ensuite tu ajusteras
-
Bonjour
Tu veux dire comme ceci:
if(potentiometre < 100) {vitesse = 0;}
if(potentiometre >= 100 && potentiometre < 150) {vitesse = 30000;}
if(potentiometre >= 150 && potentiometre < 200) {vitesse = 26000;}
if(potentiometre >= 200 && potentiometre < 250) {vitesse = 22000;}
if(potentiometre >= 250 && potentiometre < 300) {vitesse = 18000;}
if(potentiometre >= 300 && potentiometre < 350) {vitesse = 14000;}
if(potentiometre >= 350 && potentiometre < 400) {vitesse = 10000;}
if(potentiometre >= 400 && potentiometre < 450) {vitesse = 6000;}
if(potentiometre >= 450 && potentiometre < 500) {vitesse = 2000;}
if(potentiometre >= 500) {vitesse = 300;}
@+
-
tout à fait :)
Au passage ça pourrait être mieux ecrit comme ceci :
if(potentiometre < 100) {vitesse = 0;}
else if(potentiometre >= 100 && potentiometre < 150) {vitesse = 30000;}
else if(potentiometre >= 150 && potentiometre < 200) {vitesse = 26000;}
else if(potentiometre >= 200 && potentiometre < 250) {vitesse = 22000;}
else if(potentiometre >= 250 && potentiometre < 300) {vitesse = 18000;}
else if(potentiometre >= 300 && potentiometre < 350) {vitesse = 14000;}
else if(potentiometre >= 350 && potentiometre < 400) {vitesse = 10000;}
else if(potentiometre >= 400 && potentiometre < 450) {vitesse = 6000;}
else if(potentiometre >= 450 && potentiometre < 500) {vitesse = 2000;}
else if(potentiometre >= 500) {vitesse = 300;}
-
Je ne vois aucune différence.
Par contre à la ligne 78 est-ce qu'il faut laisser le (ms )
-
Il y a 9 else de plus ce qui évite de faire des tests inutiles
Ligne 78, ms est juste le nom de la variable (qui maintenant au lieu de signifier millisecondes signifie microsecondes). Donc oui il faut la laisser.
-
j'ai tout envoyé avec le else et ms, mais rien ne change, j'ai toujours les mêmes vitesses comme au début.
Est-ce que la valeur du potentiomètre peut jouer.
-
Peux tu mettre le code complet ?
-
Voici:
//ATtiny-UNO_Pont_tournant.ino
/*
Christian BEZANGER - Jean-Luc BECHENNEC - septembre 2019
*** Pour carte UNO ou µC ATtiny25/45/85 ***
Commande la rotation du moteur pas a pas avec un potentiomètre.
Peut servir a un pont tournant.
Les phases du moteur pas a pas sont reliees imperativement aux
sorties PB0:3 : soit 8, 9, 10, 11 sur UNO et broches 5, 6, 7, 2 sur ATtiny25/45/85
Le point milieu d un potentiometre est branche sur A2 (broche 3 sur ATtiny)
*/
#define UNO //
//#define ATtiny // a commenter si UNO
#ifdef UNO
const int portSortie[] = {8, 9, 10, 11};
#endif
#ifdef ATtiny //
const int portSortie[] = {0, 1, 2, 3};
#endif
void setup() {
// les pins en sortie
for (int i = 0; i < 4; i++) {
pinMode(portSortie[i], OUTPUT);
}
}
void loop() {
int vitesse; // plus petit implique plus rapide, sauf 0 = immobile
bool sens;
int potentiometre; // valeur du potentiometre
potentiometre = analogRead(A2); // valeur du potentiomètre (de 0 a 1023)
potentiometre = potentiometre - 512; // maintenant de -512 a +511
// Analyse de la valeur pour determiner le sens
if(potentiometre < 0) sens = false; else sens = true;
// Analyse de la valeur pour determiner la vitesse
potentiometre = abs(potentiometre); // on ne considere que la valeur absolue
if(potentiometre < 100) {vitesse = 0;}
else if(potentiometre >= 100 && potentiometre < 150) {vitesse = 30000;}
else if(potentiometre >= 150 && potentiometre < 200) {vitesse = 26000;}
else if(potentiometre >= 200 && potentiometre < 250) {vitesse = 22000;}
else if(potentiometre >= 250 && potentiometre < 300) {vitesse = 18000;}
else if(potentiometre >= 300 && potentiometre < 350) {vitesse = 14000;}
else if(potentiometre >= 350 && potentiometre < 400) {vitesse = 10000;}
else if(potentiometre >= 400 && potentiometre < 450) {vitesse = 6000;}
else if(potentiometre >= 450 && potentiometre < 500) {vitesse = 2000;}
else if(potentiometre >= 500) {vitesse = 300;}
// Rotation egale a un pas en fonction du sens
tourneUnPas(sens, vitesse);
}
void tourneUnPas(bool dir, int ms) {
// tableau pour la phase
const byte phases[] = {HIGH, LOW, LOW, LOW};
// variable "phaseIndex". Une variable static se comporte comme une variable globale.
// en ce qui concerne sa durée de vie : elle existe avant que le programme ne commence
// et donc en dehors de la fonction où elle est déclarée ; et comme une variable locale
// en ce qui concerne son 'scope' : elle n'est accessible que de tourneUnPas comme
// si il s'agissait d'une variable locale.
static byte phaseIndex = 0;
// La valeur de cette variable indique quelle phase du moteur est alimentee.
// On augmente (ou diminue) cette valeur de 1 unite pour alimenter la phase suivante,
// selon sens de rotation. phaseIndex reste egal a 0, 1, 2, 3 par operation modulo %
if(ms>0) { // moteur non immobile
if(dir) { // decalage vers la gauche
phaseIndex = (phaseIndex+1)%4;
}
else { // decalage vers la droite
phaseIndex = (phaseIndex-1)%4;
}
for(int i=0;i<4;i++) { // ecriture sur les lignes PB0:3
digitalWrite(portSortie[i], phases[(phaseIndex+i)%4]);
}
delayMicroseconds(ms);
}
}
-
Il n'y a que pour le dernier cran (>=500) que ça change quelque chose par rapport à la version avec des millisecondes.
Essaye ça
if(potentiometre < 100) {vitesse = 0;}
else if(potentiometre >= 100 && potentiometre < 150) {vitesse = 9600;}
else if(potentiometre >= 150 && potentiometre < 200) {vitesse = 4800;}
else if(potentiometre >= 200 && potentiometre < 250) {vitesse = 2400;}
else if(potentiometre >= 250 && potentiometre < 300) {vitesse = 1200;}
else if(potentiometre >= 300 && potentiometre < 350) {vitesse = 600;}
else if(potentiometre >= 350 && potentiometre < 400) {vitesse = 300;}
else if(potentiometre >= 400 && potentiometre < 450) {vitesse = 150;}
else if(potentiometre >= 450 && potentiometre < 500) {vitesse = 75;}
else if(potentiometre >= 500) {vitesse = 50;}
-
Mais on peut prendre le problème à l'envers : décrit ton système mécanique et la vitesse désirée.
Edit : parce que le moteur que tu comptes utiliser a une réduction. Au total une rotation complète de l'axe nécessite 4096 pas, ce qui est beaucoup. D'après ce que j'ai vu sur le web, il ne monte pas à plus de 30 tours/minutes, soit 2s pour un tour, soit 2048 pas/s et donc 488µs minimum. Donc il se peut que 300µs interpas ne soit pas atteignable, le moteur rate des pas.
-
J'ai prolongé l'axe du moteur par une tige filetée. Sue cette tige filetée j'ai réalisé un appui avec un écrou incrusté. Le faite de la rotation de l'axe du moteur, l'appui monte ou descend. Lorsque j'ai envoyé le programme initial, la rotation se fait impeccablement mais j'aurais voulu avoir une vitesse un peu plus élevée.
Maintenant quelle vitesse aucune idée. Disons un peu plus importante que l'originale. Sachant qu'il y aura 4 moteurs qui soulèveront une loco qui peut peser en gros 800g maxi.
Ave les dernières modifs que tu m'as envoyé je ne vois aucune différence.
-
Bon,
Comme j'avais un moteur pas-à-pas de ce type dans mes tiroirs (Le modèle distribué par Velleman : https://www.velleman.eu/products/view/?id=435560) j'ai fait des essais avec l'oscillo pour voir les impulsions.
Mauvaise nouvelle, le moteur déclare forfait quand la « vitesse » descend au dessous de 1900µs (environ, on peut descendre un peu plus bas mais le moteur doit être déjà en mouvement, il ne peut pas démarrer à cette cadence). Ce qui explique pourquoi la plus faible valeur du programme de Christian est 2000. En dessous le moteur décroche.
Avec un système à tige filetée, il te faut un autre moteur, sans doute sans réduction car la tige filetée s'en occupe. Si par exemple tu as une tige 6mm, le pas ISO est de 1mm. Donc un moteur 200 pas par tour aura une précision de 1/200 mm !
C'est pas forcément facile à trouver en unipolaire.
-
Aïe, en effet pas bon tout ça.
Ce que je vais faire, attendre la réception des moteurs en 12v. Faire des essais afin de voir avec un lestage du poids d'une loco.
Sinon, que penses-tu, au cas où, de bifurquer sur des moteurs dc?
@+
-
Ce que je vais faire, attendre la réception des moteurs en 12v. Faire des essais afin de voir avec un lestage du poids d'une loco.
Si ils sont aussi avec réduction, je ne pense pas que tu les fera tourner plus vite. Le poids de la loco ne devrait pas être un soucis.
Sinon, que penses-tu, au cas où, de bifurquer sur des moteurs dc?
Je pense que si tu veux faire tourner 4 moteurs à la même vitesse, il faut que tu programmes un asservissement et donc il va falloir que tu mettes des codeurs, 1 par moteur, pour compter les tours et piloter 4 PWM de manière à garder la différence entre les tours de chaque moteur à 0. Et échantillonner 4 interruptions en parallèle sans en perdre, ça commence à être velu. Accessoirement ils faut qu'ils fassent le même nombre de tours au total et avec un codeur tu vas au plus avoir une erreur de deux tours : on peut avoir compté le même nombre de tour pour deux moteurs mais le codeur de l'un est sur le point d'envoyer l'impulsion et le codeur de l'autre vient de l'envoyer. Et 2 tours d'erreur c'est, avec un filtage M3, 1mm d'erreur, 2mm avec un M6.
Non, les moteurs pas-à-pas sont idéaux pour ton application mais pas avec réduction.
-
ok, merci pour ta réponse.
Maintenant il faut trouver des moteurs unipolaires sans réducteur, je sens que ça va être galère. Surtout dans ces petites dimensions. :(
@+
Eric
-
Tu peux également prendre des bipolaires, exemple :
https://www.ebay.fr/itm/20mm-12V-MINEBEA-NMB-2-Phase-4-Wire-18-Stepping-Stepper-Motor-Printer-Scanner/132461947568
ou ça
https://www.ebay.fr/itm/Micro-15mm-15BY25-DC-3V-5V-2-phase-4-wire-Stepper-Mini-stepping-motor-19-Teeth/192486548037
Dans les deux cas c'est 18° par pas, 20 pas pour un tour moteur.
Il faut 2 ponts en H par moteur, ça peut être ça :
https://www.ebay.com/itm/1PCS-DRV8833-2-Channel-DC-Motor-Driver-Module-for-Arduino-NEW/401143969481
ou ça
https://www.ebay.com/itm/1pcs-L9110S-H-bridge-Stepper-Motor-Dual-DC-Driver-Controller-Board-for-Arduino/183459472429
-
Bonjour
Je note ces infos au cas où. ;)
Merci pour l'aide
@+
Eric