grouper 4 sorties en un byte

Bonjour a tous

je ne sais pas si le sujet est vraiment ce que je pense faire.

mon but est d'utiliser plusieurs moteurs pas a pas (je sais que les biblio stepper existe mais j aimerais apprendre plutôt que d'utilise sans savoir)

je voulais grouper mes 4 sorties pin moteur et mettre pin sortie a 1 en mettant une valeur en binaire

voila ce que je pensais

const int mot1[4]={22,24,26,28} grouper mes 4 sorties

setup // déclaration en sortie

pinMode(22,OUTPUT);
pinMode(24,OUTPUT);
pinMode(26,OUTPUT);
pinMode(28,OUTPUT);

et dans ma boucle je voulais mettre mais sortie a 1 en inscrivant mot1=B0001 (ex fait monter la sortie 28 a 1)

mais voila ca marche pas le programme ne reconnait pas B0001 il a la ire de le prendre comme une variable non déclaré

si quelqu'un peut m'expliqué pourquoi ca marche pas

merci de votre aide

Sans vouloir te vexer, ça frise le charabia tout ça. Un bon schéma de montage et un code bien placé entre balises seraient plus que souhaitables.

Avant toute chose, assure-toi de ne pas brancher de moteur directement sur une sortie arduino si tu veux pas griller ta carte direct. Renseigne-toi sur les CI L293 et L298 qui feront ton affaire pour un coût modique.

Ensuite, tu n'as pas l'air de manquer de sorties donc je ne vois pas bien pourquoi tu voudrais en économiser mais tu peux toujours aller voir comment fonctionnent les registres à décalage, qui sont très utiles lorsqu'on est à court de pin.

Il y a quelque chose qui existe de base, et ce n’est pas du charabia: ce sont les ports. Chaques broches sont regroupées par 8 et tout se manipule par le biais des registres et bit par bit.

Tu n'as pas très bien compris quelques basics du langage

const int  mot1[4]={22,24,26,28} grouper mes 4 sorties

setup // déclaration en sortie

pinMode(22,OUTPUT);
  pinMode(24,OUTPUT);
  pinMode(26,OUTPUT);
  pinMode(28,OUTPUT);

et dans ma boucle je voulais mettre mais sortie a 1 en inscrivant  mot1=B0001

Lorsque tu écris mot1[4]={22,24,26,28] tu déclares un ensemble de valeurs mais tu ne les groupes pas.
Lorsque tu écris mot1=B0001 tu n'affectes pas la valeurs au tableau. mot1 est un pointeur et donc tu modifies le pointeur.

22 24 26 28 font partie du port A : Arduino - PinMapping2560

https://www.arduino.cc/en/Reference/PortManipulation

En procédant de la sorte il est bien évident que la portabilité du logiciel sera nulle.

Au vu de ton essai de code, il semblerait que tu sois débutant. Je te conseillerais plutôt de te rabattre sur digitalWrite().

Ensuite comme tu ne dis rien de ton hardware, je ne ferai pas de supposition quant aux branchements ...

Salut , ca ne marche pas , parce que ca n’ est pas comme ca qu ’ on s ’ y prend .

lorsqu ’ on code , on " parle " a l ’ ordinateur .

il ne comprend que peu de mots et si les mots ne sont pas dans le bon ordre , qu il manque un point , une virgule ou un point virgule , un crochet une parenthese ou autre , rien ne marche ou avec beaucoup de chance une petite partie seulement .

bref , la logique veut que si tu as 4 elements que tu veux gerer , en declarant un tableau comme dans la premiere ligne de ton code , on fait ensuite une boucle pour les gerer , c ’ est la technique de base .
ca pourrait donner par exemple pour passer les 4 pins a 1 :

PS : les tableaux ont un indice qui pointe vers l’ element , ca commence ( presque tout le temps ) avec l’ indice 0

const int  mot1[4]={22,24,26,28} grouper mes 4 sorties

setup // déclaration en sortie

pinMode(22,OUTPUT);
  pinMode(24,OUTPUT);
  pinMode(26,OUTPUT);
  pinMode(28,OUTPUT);

for ( byte i = 0; i < 4; i++ ) { // "i"  dans cette boucle va evoluer de 0 et jusqu ' a plus petit que 4 ( donc 3 ) en augmentant de 1 a chaque tour de boucle : le i++ .
 digitalWrite (mot1 [i] , HIGH ) ;// ici on remplace "i" au premier coup par 0 , puis par 1 puis 2 puis 3 et donc on modifie la sortie de mot1 indice 0 , on le passe a HIGH , au 2eme tour de boucle , on modifie mot1 indice 1 , on le passe a HIGH etc ..
}

a la fin de ce code on se retrouve avec les pins 22 24 26 et 28 avec leur sortie respective en etat HAUT .

bonjour

je suis débutant effectivement, l Arduino est un atmega2560.

peut être que je n ai pas pris le bonne façon de faire.

le but de mon programme est d utiliser mon moteur pas a pas. (28BGy avec son driver ULN2003 )

j ai déjà écris ce programme en utilisant digitalwrite pour chaque step ou demi step cela fonctionne,

mais cela fait beaucoup de ligne a chaque fois même en simplifiant (pas de raison de changer l'état d'une sortie si elle était déjà dans le même état a l'étape d'avant)

donc je me suis dit que je pouvais peut être grouper mes 4 sorties en un byte et qu'en donnant une valeur binaire avec B0000 pour chaque bit je pouvais mettre cette sortie a 1 ou a 0 en une seule ligne.

le but n est pas de monter toutes les sorties ensemble a 1 ou 0 mais quelles puissent être dans un état diffèrent (ex: B0001, B0010...)

je note aussi une chose j ai utiliser une "cons int mot[4]" qui serait une variable tableau et c est peut être pas la bonne façon de faire

est ce que je veux faire est plus compréhensible?

merci

le plus simple dans ce cas est de passer peut etre par une structure ou une fonction avec 4 parametres ( ou plus ) .

par exemple :

void mot1 (pin22 , pin24 , pin26 , pin28 ) {
// vous faites ce que vous voulez avec le tratement des pins .
}

il suffit ensuite d' ecrire mot1 (0,1,1,0) pour lancer la fonction .

je note aussi une chose j ai utiliser une “cons int mot[4]” qui serait une variable tableau et c est peut être pas la bonne façon de faire
est ce que je veux faire est plus compréhensible?

Il n’y a rien d’incompréhensible.
Pas besoin de répéter, je t’ai déjà donné tout les éléments en #4.

Un port GPIO ne se déclare pas. Aucun besoin de variable ni de tableau.
PORTA est déjà déclaré dans la librairie ARDUINO.

Mais sache que ce code ne marchera que sur MEGA.

Sache aussi qu’adresser la pin D13 d’une MEGA ou adresser la pin D13 d’une UNO ne se fera pas de la même façon en utilisant cette méthode.
Ce que tu veux faire s’appelle du code non portable.

On utilise cette méthode d’adressage direct des registres lorsque l’on a besoin de rapidité. Je ne pense pas que le pilotage de moteur nécessite une rapidité extraordinaire.

tu peux utiliser directement les instructions DDRA et PORTA… dans le programme ?

j ai pas forcement besoin de rapidité mais j ai besoin de bouger deux moteurs ensemble (déplacement d'une monture de télescope)

hors je n arrive que seulement a déplacer un moteur après l'autre d'où l idée qui m est venue de me dire que si je groupe mes sorties moteurs en une seule instruction je peux bouger les 2 moteurs mais est ce la bonne solution…..

Faire monter ou descendre deux pins avec PORTA ou deux appels à digitalWrite() ne devraient pas faire la différence, à moins d'avoir besoin d'une précision à la micro-seconde près.

ok si je reste dans l option d’utiliser digitalwrite mon problème devient la vitesse de déplacement.

du coup mon ecriture programme n est peut etre pas bonne

j ai chargé deux variables deplacement (nb de pas ) une pour chaque moteur, ensuite si j appuis sur mon bouton si mes variables de placement sont inferieur aux compteurs mes moteurs tournent

if (boutonstate == HIGH) {
pause = 20;
if (stepCount < deplacement1) {
start();
if (stepCount2 < deplacement2) {
start2();
}
}

ensuite j ai deux onglets différents moteur1 et moteur 2 avec la gestion de mes step dedans qui démarrent fonction de start et start2.

par contre entre chaque step j incrémente mon compteur et j ai mis un delay(pause) ici 20.

mon problème est je pense que l Arduino exécute beaucoup d instruction, que le délay n arrange pas non plus mais est obligatoire car sinon le prog défile trop vite et les uln 2003 se bloquent

je dirais que dans l ensemble c est fonctionnel ,mon moteur s’arrêtent bien quand mon compteur atteint la valeur de déplacement mais c est pas optimal pour moi
si quelqu’un peut m aiguiller sur l amélioration

la fonction
delay () est bloquante .

ca veut dire que quand le programme poireaute , il ne fait que ca .

donc la valeur du delay est trop grande , essaie de la reduire a 5 pour voir .

si ca ne va pas , il faut se tourner vers la fonction

millis()

et faire des comparaison .

de plus l ’ utilisation de fonction ( voir #7 ) permet d ’ eviter des codes repetitifs et simplifie l ’ ecriture et la comprehension bien souvent .

il se peut aussi qu ’ il y ait d’ autres problemes , mais evidement sans voir votre code complet , personne ne pourra vous dire lesquels .

A ce propos , merci d’ utiliser les balises codes prevu a cet effet pour poster vos bouts de codes .

les uln 2003 se bloquent

Les ULN2003 sont simplement des transistors réunis au sein du même boîtier.
Un transistor ne se bloque pas tout seul, il faut le lui demander.

hello
je suis justement sur ce type de moteur en ce moment
c’est pour un petit mobile à 2 roues.
je veux qu’il se déplace en marche avant/arrière, qu’il fasse demi tour sur lui même
et qu’il fasse des courbes.
donc les deux moteurs doivent être capables de tourner en même temps, à la même vitesse, à des vitesses différentes et dans des sens différents.

je suis sur MINI PRO en 8 Méga alimenté par un accu de 6 volts
les moteurs sont du meme type que les tiens 28BY J-48 5V pilotables via un 2003 (transistors darlington)
j’utilise les bits 0,1,2,3 du port B et les bits 4,5,6,7 du port D.

je choisi de passer par un timer et l’interruption de comparaison
à chaque occurrence, j’incrémente un “compteur_interruption”, qui sert d’horloge pour deux compteurs “compt_G” et "compt_D"dont les valeurs sont comparées avec des seuils qui alternent entre des seuils “pulse_G” / “pause_G” et “pulse_D” / “pause_D”

en meme temps que le changement de seuil, et en fonction d’une varaible de type char ‘A’, le changement des bits sur les ports “moteurs” sont effectués.

j’ai vérifié le fonctionnement avec un petit analyseur saleae.
la fréquence de cde varie de 0~10 Hz à 100Hz au delà, les moteurs n’accrochent pas

bonjour

en fait le blocage venait du fait que j utilisais la même variable ''temps'' pour le calcul avec millis dans mes deux fonctions moteur et puis aussi le fait de démarrer chaque pas moteur avec un if pour la gestion du temps, lorsque la fonction était appelé tous les conditions etaient valide j ai donc utilisé un switch case pour effectué mes pas moteur dans l ordre.

au niveau de la vitesse ca marche super bien car je peux etre au maximum meme a la milliseconde pour les 2 moteurs alors qu'avant, les deux moteurs ensemble ralentissaient quelle que soit la vitesse réglée par delay

merci