Modifier un code pour moteur pas à pas

Hello JpbBricole
J'ai des questions sur le code que tu as fais,
Pourquoi quand je veux changer la valeur de la vitesse, ici , cela ne change rien

setupParamsDef setupParams =     
{// Position degrés   pas/seconde    Accélération
	      -1,            800,            600
};

Et je pense a une autre chose , est-ce que on pourrais changer la façon qu'il fais le gohome,
car la méthode qu'il fais ressemble plus a celle d'une machine et on as pas besoin de autant de précision , par contre il faudrait que après qu'il ai fais le gohom il aille a sa position départ qui devrais être a 180° idéalement , car c'est la moitié de sa course
Par contre l'info doit remonter a kstars comme quoi il est a 180° , tu pense que c'est possible.
A bientôt
Christophe

Bonjour Christophe

Parce que ces paramètres sont des valeur par défaut. C'est à dire qu'ils sont utilisés que dans certains cas qui sont détectés par ce test:

	if (EEPROM.read(0) != 112)
	{

On retrouve ce cas:
à l'utilisation, pour la première fois, de ce programme dans cet Arduino.
par la commande moniteur :FY# (Factory setting)

Si tu veux modifier la vitesse et ou l'accélération du MPAP, c'est les commandes moniteur
:SS800# pour la vitesse (pas/seconde)
:AC600# pour l'acceleration
Ces paramètres sont sauvés en mémoire permanente (EEPROM)
Pour ça, il faut déconnecter Kstars) et faire tes test avec les commandes :sn120# ou :gh#

Oui, je regarde ça.

C'est toujours 180 ou faut-il inclure une commande pour mémoriser cette position de départ?

Oui, c'est possible, mais je me pose la question, n'est-ce pas un paramètre de Kstars, cette position de départ?

A+
jpbbricole

alors je pense que cela devrais etre toujours 180° vu que c'est le milieux de la rotation maxi

Ok alors je l'ai déjà fais pour essayer et sa fonctionne nikel , c'est juste que je comprenais pas pourquoi en modifier cela n'agissait sur rien :wink:

A+
Christophe

Bonjour Christophe

J'ai fait une version avec homing minimal et, après, déplacement vers une position définie.
Pour définir cette position, c'est la commande :PS180#, pour désactiver :PS-1#

J'ai ajouté, provisoirement, un port série software:
SoftwareSerial debugSerial(3, 4); // RX, TX
pour faciliter le développement

J'ai un petit souci du côté de Linux et KStars, comment déclarer le port ttyUSB0 et à quelle vitesse il fonctionne?

/*
    Name:       constant1462_PlateauPhotoPyxis.ino
    Created:	06.11.2021
    Author:     jpbbricole
	
	Pour driver Pyxis
	Version:	0.50	16.11.2021	Simplification homing
									Modifié sauvegarde en EEPROM
*/

// Provisoire pour debug
#include <SoftwareSerial.h>
SoftwareSerial debugSerial(3, 4); // RX, TX

#define Trace debugSerial.println

//#define programmeur

#include <AccelStepper.h>     // https://www.pjrc.com/teensy/td_libs_AccelStepper.html
#include <EEPROM.h>

#ifdef programmeur
	#define mpapDriverType 1     // 1 pour driver A4988
	#define mpapDriverEnablePin 7
	#define mpapDriverStepPin 6
	#define mpapDriverDirPin 5
	const int mpapLowSpeedFactor = 8;     // Pour vitesse lente au homing
	AccelStepper mpap(mpapDriverType, mpapDriverStepPin, mpapDriverDirPin);

	#define homingPin 8
	const int homingPinStatOn = LOW;
	const int EnablePinStatOn = LOW;
	const int EnablePinStatOff = !EnablePinStatOn;

	const float mpapStepsNbr = 200;     // Nombre depas du MPAP
	const float mpapWheelTeethNbr = 16;     // Nombre de dents de la roue du MPAP
	const float trayWheelTeethNbr = 96;     // Nombre de dents du plateau

	const boolean stepperReverseDir = false;     // False = CW
	float mpapStepsMax = (trayWheelTeethNbr/mpapWheelTeethNbr) * mpapStepsNbr;  // **** steps needed for 2 complete revolutions.  prevent cord wrap.
	//float trayReferencePosition = 180.0;     // Pour positionner au milieu
	float stepsDegrees = mpapStepsMax/360.0;     // Pas par degrés
#else  //                                  Ici, les paramètres propres à ton installation 
	#define mpapDriverType 1     // 1 pour driver A4988
	#define mpapDriverEnablePin 7
	#define mpapDriverStepPin 6
	#define mpapDriverDirPin 5
	const int mpapLowSpeedFactor = 8;     // Pour vitesse lente au homing
	AccelStepper mpap(mpapDriverType, mpapDriverStepPin, mpapDriverDirPin);

	#define homingPin 8
	const int homingPinStatOn = LOW;
	const int EnablePinStatOn = LOW;
	const int EnablePinStatOff = !EnablePinStatOn;

	const float mpapStepsNbr = 200;     // Nombre depas du MPAP
	const float mpapWheelTeethNbr = 19;     // Nombre de dents de la roue du MPAP
	const float trayWheelTeethNbr = 150;     // Nombre de dents du plateau

	const boolean stepperReverseDir = false;     // False = CW
	float mpapStepsMax = (trayWheelTeethNbr/mpapWheelTeethNbr) * mpapStepsNbr;  // **** steps needed for 2 complete revolutions.  prevent cord wrap.
	//float trayReferencePosition = 180.0;     // Pour positionner au milieu
	float stepsDegrees = mpapStepsMax/360.0;     // Pas par degrés
#endif


//-------------------------------------Paramètres sont sauvés en EEPROM
struct setupParamsDef
{
	float trayPositionDegrees;     // Position en degrés -1 = reset ou crash déplacement
	float mpapStepsSec;     // Vitesse du MPAP en pas/sec.
	float mpapAcceleration;     // Acceleration du MPAP
	float trayPositionStart;     // Position de départ, après homing (-1 = désactivé)
};

//********************************** Paramètres par défaut **********************************
setupParamsDef setupParams =     
{// Position degrés   pas/seconde    Accélération     Position de départ (-1 = désactivé)
	      -1,            800,            600,                180
};
const int eepromSetupParamsStart = 0;     // Position de la structure en EEPROM
const int eepromEndUsage = sizeof(setupParams)+1;     // Fin de l'utilisation de l'EEPROM

//------------------------------------- Ligne de commandes
bool cmdNouvelleRecue = false;      // Si une nouvelle commande a été reçue
String cmdTexte = "";               // Texte de la commande

//------------------------------------- Pyxis
boolean pyxisIsConnected = false;
float pyxisAngle = 0.0;

void setup()
{
	Serial.begin(19200);
	Serial.setTimeout(50);
	
	debugSerial.begin(19200);

	//EEPROM.update(eepromEndUsage, 0xFF);
	// Test si la mémoire a déjà été initialisée, sinon enregistremenr des paramètres par défaut
	if (EEPROM.read(eepromEndUsage) != 112)     // Chiffre de contrôle après la structure setupParams
	{
		eepromSaveSetupParams();
		EEPROM.update(eepromEndUsage, 112);

		Trace(F("Default settings"));
	}
	else     // Lecture des paramètres sauvés
	{
		EEPROM.get(0, setupParams);
	}

	pinMode(mpapDriverEnablePin, OUTPUT);
	digitalWrite(mpapDriverEnablePin, EnablePinStatOn);     // Activer le moteur
	pinMode(homingPin, INPUT_PULLUP);

    mpap.setMaxSpeed(setupParams.mpapStepsSec);
    mpap.setAcceleration(setupParams.mpapAcceleration);
    mpap.setPinsInverted(stepperReverseDir, false, false);       // Inverser DIR si nécessaire

	if (setupParams.trayPositionDegrees == -1)     // S'il y a eu crash ou reset pendant déplacement
	{
		cmdExecute(F(":gh#"));
	}
	else
	{
		mpap.setCurrentPosition(setupParams.trayPositionDegrees * stepsDegrees);     // Dernière position sauvée
	}
	Trace(F("constant1462_PlateauPhotoPyxis.ino"));
}

void loop()
{
  //--------------------------------- Ecoute du port serie
  //serialEvent();           // Enlever le commentaire si l'appel ne se fait pas automatiquement
                             // Pour Leonardo, Micro ou Yún
  if (cmdNouvelleRecue)      // Si une nouvelle commande depuis le moniteur
  {
	  if (cmdTexte.startsWith(":"))
	  {
		  cmdExecute(cmdTexte);
	  } 
	  else
	  {
		  pyxisCmdExecute(cmdTexte);
	  }
	  
	  cmdTexte = "";
	  cmdNouvelleRecue = false;
  }
}

//===================================== Pyxis
void pyxisCmdExecute(String cmdRx)
{
	Trace("\nPyxis Rx " + cmdRx);
	cmdRx.toUpperCase();
	
	if (cmdRx.startsWith("CCLINK"))
	{
		pyxisAnswer("!");
	}
	else if (cmdRx.startsWith("CMREAD"))     // Retourne si CW ou CCW
	{
		pyxisAnswer(stepperReverseDir ? "1" : "0");
	}
	else if (cmdRx.startsWith("CPA"))     // Commande nouvel angle
	{
		cmdRx.replace("CPA", "");     // Supprimer CPA pour garder le paramètre
		pyxisAngle = cmdRx.toFloat();
		Trace("New angle " + String(pyxisAngle));

		pyxisAnswer("!");
		mpapGotoDegrees(cmdRx.toFloat());
		pyxisAnswer("F");
	}
	else if (cmdRx.startsWith("CHOME"))     // Homing
	{
		Trace("HOMING");
		pyxisAnswer("!");
		homingStart();
		pyxisAnswer("F");
	}
	else if (cmdRx.startsWith("CGETPA"))     // Demande de position
	{
		pyxisAngle = (int)setupParams.trayPositionDegrees;
		pyxisAngle = pyxisAngle < 0 ? 0 : pyxisAngle;
		pyxisAnswer(toolPadding0(pyxisAngle, 3));
	}
	else
	{
		cmdRx = "???";
	}
}

void pyxisAnswer(String answer)
{
	Trace("pyxisAnswer " + answer);
	Serial.print(answer);
	Serial.write(0xA);
	Serial.write(0xD);
}

//===================================== Moteur pas à pas (mpap)
//------------------------------------- Goto degrés
void mpapGotoDegrees(float gotoDegr)
{
	setupParams.trayPositionDegrees = -1;
	eepromSaveSetupParams();
	
	mpapGoto(degreesToSteps(gotoDegr));

	setupParams.trayPositionDegrees = gotoDegr;
	eepromSaveSetupParams();
}

//------------------------------------- Goto pas
void mpapGoto(long gotoSteps)
{
	mpap.runToNewPosition(gotoSteps);
	mpap.runToNewPosition(mpap.currentPosition());
}

//------------------------------------- Retourne les pas pour n degrés
float degreesToSteps(float degrees)
{
	degrees = constrain(degrees, 0.0, 360.0);
	return degrees * stepsDegrees;
}

//===================================== Homing
//------------------------------------- Recherche de la position home
void homingStart()
{
	//Trace("********** HOMING LOCKED *************");
	//delay(2000);
	//return;

	if (digitalRead(homingPin) != homingPinStatOn)     // Si pasà sur contact homing
	{
		setupParams.trayPositionDegrees = -1;
		eepromSaveSetupParams();
		homingGoHome(3);
	}
	
	mpap.setMaxSpeed(setupParams.mpapStepsSec);

	if (setupParams.trayPositionStart > -1)     // Si position de départ
	{
		mpapGotoDegrees(setupParams.trayPositionStart);
	} 
	else
	{
		setupParams.trayPositionDegrees = 0;
	}
	eepromSaveSetupParams();
}

void homingGoHome(int speedFactor)     // Retour home
{
	mpap.moveTo(-mpapStepsMax);

	mpap.setMaxSpeed(setupParams.mpapStepsSec / speedFactor);     // On accèlère
	while(digitalRead(homingPin) != homingPinStatOn)     // Tant que pas home
	{
		mpap.run();
	}
	mpap.setCurrentPosition(0);
}

/*--------------------------------------------------------------------------------
  Ligne de commandes
  Ce système n'est pas sensible à la casse.

  Commandes
	:sn120#     :gh# 
  Setup
	:SS800# pas/seconde  :AC# Acceleration     :PS# Pos Start     :FY# Factory
'*----------------------------------------------------------------------------------
*/
void cmdExecute(String cmdRx)
{	
	boolean paramAsauver = false;     // Si paramètre doit être sauvé
	String cmdParam = "";
	Trace("\nCommande recue: " + cmdRx); 
	cmdRx.toUpperCase();                    // Tout en majuscules
	cmdRx.replace(" ", "");                 // Supprimer les espaces
	
	if (cmdRx.startsWith(":") && cmdRx.endsWith("#")) 
	{
		cmdRx.replace(":", "");     // Supprimer :
		cmdRx.replace("#", "");     // Supprimer #
	}
	else
	{
		Trace("Commande invalide " + cmdRx);
		return;
	}

	cmdParam = cmdRx.substring(2);
	cmdRx = cmdRx.substring(0, 2);
	int cmdParamInt = cmdParam.toInt();
	long cmdParamLong = (long)cmdParam.toDouble();

	bool cmdOk = true;
	//--------------------------------- Commandes

	if (cmdRx == F("SN"))     // MPAP aller à en degrés
	{
		mpapGotoDegrees((float)cmdParamInt);
		Trace("Goto degres: " + String((float)cmdParamInt));
	}
	else if (cmdRx == F("GH"))     // Transbordeur home
	{
		homingStart();
		Trace("Homing");
	}
	//--------------------------------- Setup
	else if (cmdRx == F("SS"))     // MPAP vitesse en pas/seconde
	{
		setupParams.mpapStepsSec = cmdParamInt;
		mpap.setMaxSpeed(cmdParamInt);
		Trace("Pas/sec. " + String(cmdParamInt));
		paramAsauver = true;
	}
	else if (cmdRx == F("AC"))     // MPAP accélération
	{
		setupParams.mpapAcceleration = cmdParamInt;
		mpap.setAcceleration(cmdParamInt);
		paramAsauver = true;
		Serial.print(F("Acceleration ")); Serial.println(cmdParamInt);
	}
	else if (cmdRx == F("PS"))     // Position start
	{
		setupParams.trayPositionStart = cmdParam.toFloat();
		paramAsauver = true;
		Serial.print(F("Pos Start ")); Serial.println(setupParams.trayPositionStart);
	}
	else if (cmdRx == F("FY"))     // Reset de l'application, paramètres par défaut
	{
		EEPROM.update(eepromEndUsage, 0xFF);
		Serial.println(F("Factorty"));
	}
	else
	{
	Trace(F("Commande inconnue ")); Serial.println(cmdRx);
	cmdOk = false;
	}
	if (cmdOk)     // Si la commande est valide
	{
		if (paramAsauver)
		{
			eepromSaveSetupParams();     // Sauver les paramètres
		}
	}
}

//===================================== EEPROM
void eepromSaveSetupParams()
{
	EEPROM.put(eepromSetupParamsStart, setupParams);
}

/*-----------------------------------------------------------------------
  Réception de commandes depuis le moniteur /Pyxis
'*------------------------------------------------------------------------
*/
void serialEvent()                                       
{
  if (Serial.available())
  {
	  cmdTexte = Serial.readString();
	  cmdTexte.replace("\n", "");
	  cmdTexte.replace("\r", "");
	  cmdNouvelleRecue  = true;
  }
}

String toolPadding0(int number, int numD)
{
	String retVal = "000000" + String(number);
	return retVal.substring(retVal.length()-numD);
}

Cordialement
jpbbricole

Hello JpbBricole

alors je vais essayer se nouveau code !
au sujet du port tu vas l'onglet pyxis et ensuite connexion ,pour aller dans ces onglets il faut faire
ctrl+i .
ensuit tu as tous en bas , "analyser le port" et aussi la vitesse de celui-ci
redis moi si jamais tu arrives pas.
https://zupimages.net/viewer.php?id=21/46/vsvu.png
A+

Alors je viens de faire un petit test !

  • Alors le gohome avec position a 180° c'est ok

  • La vitesse et encore un peut rapide ,mais je vais essayer de changer , car en astro tous vas plus tôt lent en déplacement que vite (vibrations).

  • La position reste bien en mémoire dans kstars , même après le redémarrage !!! Cooolll !!!

  • Par contre j'ai un truc étrange quand kstars se reconnecte et cela et aussi arrivé des fois que je remet l'alime sur l'arduino,, j'ai une sorte de parasite ou petit déplacement de qque pas du moteur.

Voila , a bientot
Christophe

Bonsoir Christophe

Super on avance!

Je pense que tu as un problème d'alimentation, ou les GND sont mal connectés ou les fils trop minces ou ton 5V est trop faible donc instable au démarrage Si tu as un condo de quelques dizaines de uF voire 100 uF à mettre au 5V.
D'où vient le 5V. expliques moi ton montage.

A+
jpbbricole

Bonjour Christophe

Pour ce faire, tu peux jouer avec les commandes
:SSnnn# pas/seconde
:ACnnn# Acceleration

Ces paramètres sont sauvés en EEPROM

Bonne journée
jpbbricole

Hello

alors mon schémas et classique, je passe tous par la carte arduino uno , et alimente en 9v et j'utilise la sortie vin pour alimenter le driver en 9v.

A bientot
Christophe

Bonjour Christophe

Essaies de faire un câble d'alimentation 9V en Y de telle façon que l'alimentation du driver A4988 ne passe pas "à travers" l'Arduino.

J'ai réussi à paramétrer Kstars mais j'ai toujours cette erreur
image
que se soit dans VirtualBox ou en vrai sur mon laptop?

Cordialement
jpbbricole

hello
alors c'est étrange , tu essayé de réinstaller sous linux, au pire j'ai demander sur le forum astro si qqun connais se problème, car cela ne met jamais arrivé .
je te redis

A bientot

hello
pour l'instant pas de réponse au sujet de ce problème.
mais as tu de ton coté essayer de refaire l'installation comme cela

sudo apt-add-repository ppa:mutlaqja/ppa
sudo apt-get update
sudo apt-get install indi-full kstars-bleeding

car c'est aussi comme cela que je refais lesw grosse mise a jour par dessus l'ancienne.

Bonjour Christophe

J'ai installé Kstars selon ta méthode, super, ça marche nickel.
Les déplacement, le homing et le retour de position sont OK!

En exploitation normale, comment commandes-tu la rotation du plateau?

A+
jpbbricole

Hello JpbBricole
alors une fois que tu est connecter, tu vas dans l'onglet camera
et tu verras il y a un petit rectangle ou c'est marqué rotation, tu clique dessus et la tu peux choisir l'angle.

la je suis au boulot, mais je peut te faire une copie d'écran se soir si tu trouve pas.

A bientôt
Christophe

Hello Jpbbricole,
Tu es arrivé a piloter depuis Kstars ?

A+
Christophe

Bonjour Christophe

Oui, sans problème, avec le retour de position et mémorisation de la dernière position.
Tout semble OK.
Quel est la suite des opérations?

A+
jpbbricole

hello
en effet tous fonctionne correctement !!!!
alors il me reste encore ce soucis de pas qui bouge quand je connecte le driver et le bruit du moteur.

ensuite je suis entrain de voir pour usiner le chassis en alu avec un pote et aussi de prendre un driver plus costaux ,je vais prendre celui-ci "Big Easy Driver A4988 30V" ,c'est juste pour avoir de la marge , mais je sais pas si et utile ,mais il est sans connecteur et ça c'est un plus !!

je vais aussi voir avec un moteur nema plus petit
Schrittmotor ACT 16HS2404L14.5P1-X 1,8°, 2 Phasen, 8,4 V online kaufen | Pollin.de
, c'est pour le poids , mais faut voir si cela vaut le coup et si c'est possible.

je te redis si il y a du neuf
et tous cas merci beaucoup pour le job tu es un chef !!!!!

a bientot
Christophe

Bonjour constant1462

Ce fut avec grand plaisir, j'ai découvert de nouvelles choses.
A ta disposition.

Cordialement
jpbbricole

1 Like