Transmettre à Arduino des coordonnées x,y à exploiter

Bonjour,
J'ai écrit un logiciel d'analyse d'image sous FB qui identifie des points devant être traités en tps réel par mon Arduino. Je cherche donc à ce que Arduino soit à l'écoute, ou idéalement en boucle d'une lecture pour ces deux données x et y (possiblement deux octets). Comme il n'est pas simple sous FB d'écrire sur des port com, existe-t-il une solution ou une library qui permet à Arduino de lire un record d'un fichier .txt?

Bonjour olpica

Oui, un lecteur de carte SD et sa bibliothèque
image

PS: C'est quoi "programmer en FB", pourquoi c'est difficile d'écrire sur le port com, avec @pathy2023 on a réalisé ceci, qui permet de transmettre 2 paramètres par commandes série et qui serai aisément adaptable.

Cordialement
jpbbricole

Merci pour ces réponses,
FB = FreeBasic que j'utilise depuis longtemps pour mes appli de reconnaissance d'image. Sauf erreur, je n'y ai pas bien vu le moyen d'utiliser les port com. Donc j'imagine une solution plus simple à base de fichier .txt constamment mis à jour, mais le fichier reste sur drive C ... donc le lecteur de carte SD ne va pas convenir non plus...

C'est pourtant possible on dirait
https://www.freebasic.net/wiki/KeyPgOpenCom

Ce fil de discussion n'a pas été créé au bon endroit. Il était dans les "Réalisations et Projets Finis". Déplacé à la racine du forum francophone.

Merci de prendre quelques minutes pour lire "Les bonnes pratiques du forum Francophone"

A voir quelle est votre définition de temps réel. Que comptez vous vraiment faire faire à votre Arduino ?

sinon il y a une discussion (en anglais) = FreeBasic and Arduino communication - freebasic.net

Merci... Oups! je me suis égaré dans les recherches sur lFB qui faisait état de difficultés.

Et oui pardon d'utiliser ce forum je n'en ai pas trouvé d'autre ...

Je veux transmettre "au fil de l'eau" des coordonnées X,Y, permettant de positionner immédiatement deux servos pour positionner une tête laser vers le point identifié.

OK

en python ce serait facile :slight_smile: - je n'ai plus touché au basic depuis quelques années mais selon les liens web, ça semble possible. Vous êtes sur Windows je suppose ?

oui sous Windows mais mon logiciel est sous FB ...

D'après la doc de FreeBasic les ports COM s'utilisent comme des fichiers.
Tu ouvres un port et tu écris dedans. Je ne vois pas le problème.

Ok merci je pensais à plus de complications, je vais tester.

Bonjour olpica

Je peux te faire une adaptation de ce programme, pour 2 servo et tu transmettrai 25,60 pour mettre le servo X à 25° et le servo Y à 60°.

Intéressé :wink:

Cordialement
jpbbricole

Alors çà, ce serait super, je ne suis pas très habitué à manipuler les ports com et encore moins Arduino. Par contre je m’amuse bien en analyse d’image cf sur Gogol « olivier Picard voiture » . A l’époque c’était une connexion parallèle (ITC)…

Donc si tu peux m’aider ce sera avec grand plaisir ! (mais en retour, que puis-je faire ?)

Avec mon logiciel sous FB, je peux normalement écrire sur un port com les coordonnées x et y (dont les valeurs peuvent ne pas excéder 255) du point que ma tête laser va pointer.

Et donc mon Arduino doit être en standby et en veille sur ce port com. Dès qu’il reçoit, il provoque le mouvement des deux nema17, puis il allume la tête laser … ( il s’agit d’un Fly Killer, lol )

Ci-joint capture du repérage …

Je n’ai pas encore réfléchit au protocole d’acquittement pour l’instant …

<img width="997" height="503" style="width:10.3802in;height:5.2343in" id="Image_x0020_4" src="//cdck-file-uploads-europe1.s3.dualstack.eu-west-1.amazonaws.com/arduino/original/4X/e/9/5/e95126cb19feb5803938fbb766c6797847115234.jpeg" alt="Une image contenant texte, capture d’écran

Description générée automatiquement">

Bonjour olpica

Ok, je me lance!

Ton servo est sous quelle forme, si c'est des moteurs pas à pas, quelle est le driver que tu utilises,?
Fais une photo de l'installation, pour la mettre dans le forum, il suffit de la copier/coller le fichier de l'image ou de la capture d'écran.

Bien t'amuser avec ce programme :wink:

A+
Cordialement
jpbbricole

Bon : la partie technique est à l’état d’esquisse …

Suivant les conseils de Junon (Machine CNC la plus simple avec un minimum de pièces possible - DIY Laser Engraver (howtomechatronics.com) ) j’ai commandé des moteurs nema17, les pilotes DRV8825, les shield CNC Arduino, une Arduino uno, un module laser. Mais je n’ai rien câblé pour l’instant, car je m’entraine avec un kit Elegoo.

Et je prends tous les conseils car je suis complètement débutant coté Arduino…

Bonjour olpivs

L'idéal serai que tu puisses envoyer les coordonnées sous forme d'une chaîne de caractères 567,1243 par exemple.
Pour le matériel, Shield et drivers c'est nickel :wink:

Cordialement
jpbbricole

Bonsoir olpica

Voilà le programme de réception de commandes provenant de FB.

J'ai essayé d'expliquer un maximum en entête du sketch.
En résumé, il suffit d'envoyer une chaîne de caractère contenant 250,720, terminée par nouvelle ligne (chr$10) pour envoyer le servo X à 250 pas et le Y à 720 pas.

Il n'est pas nécessaire d'avoir FB pour tester le programme avec les moteurs pas à pas (MPAP), tu peux introduire les commandes manuellement depuis le moniteur série de l'IDE Arduino
image
dans la ligne de commande:
image
Paramétré à 9600 et nouvelle ligne:

Le programme:

/*
Name:       olpica_FreeBasicToMpap.ino
Created:	04.08.2023
Author:     jpbbricole/olpica
https://forum.arduino.cc/t/transmettre-a-arduino-des-coordonnees-x-y-a-exploiter/1154805

Transmission d'ordres depuis FreeBasic pour commander 2 servo à moteurs pas à pas

Les commandes doivent se terminer avec, au minimun, un caractère Nouell Ligne (\n)
	 code ASCII 10 ou 0A en hexadécimal.

Les déplacements sont absolus : servoX.moveTo()
Pour servoX à 250 et servoY à 720 la commande est une chaîne de caractrères contenant 250,720
Pour ramener les servo à leur position de départ la commande est 0,0 ou 0
Les valeurs peuvent être négatives -250,720
Si le paramètre Y est manquant, comme une commande 250 ou 250, ça corespond à 250,0
*/

#include <AccelStepper.h>     // https://www.arduino.cc/reference/en/libraries/accelstepper/
							  // https://www.pjrc.com/teensy/td_libs_AccelStepper.html

/*
	Moteur pas à as (mpap)
	CNC Shield brochage GRBL 
	https://blog.protoneer.co.nz/grbl-arduino-g-code-processor-pin-layout/

*/
const int mpapDriverType = 1;     //Stepper Driver, 2 driver pins required

const int mpapXdirPin = 5;     // Driver X DIR pin
const int mpapXstepPin = 2;     // Driver X STEP pin
const boolean mpapXdirReverse = false;      // S'il est nécessaire d'inverser le signal

const int mpapYdirPin = 6;     // Driver Y DIR pin
const int mpapYstepPin = 3;     // Driver Y STEP pin
const boolean mpapYdirReverse = false;      // S'il est nécessaire d'inverser le signal

const int mpapEnablePin = 8;     // Driver ENABLE pin, commun

AccelStepper servoX(mpapDriverType, mpapXstepPin, mpapXdirPin);     // Création du MPAP X
AccelStepper servoY(mpapDriverType, mpapYstepPin, mpapYdirPin);

long servoXpos = 0;     // Position servo X
long servoYpos = 0;     // Position servo Y

const long servoXposDepart = 0;
const long servoYposDepart = 0;

//------------------------------------- Commandes (cmd)
const String cmdSeperateur = ",";     // Séparation entre la LED et le temps

void setup()
{
	Serial.begin(9600);

	//                         DIR           STEP   ENA
    servoX.setPinsInverted(mpapXdirReverse, false, true);
    servoX.setEnablePin(mpapEnablePin);
    servoX.setMaxSpeed(600);
    servoX.setAcceleration(8000);
	servoX.enableOutputs();     // Activer les signaux du MPAP

    servoX.setPinsInverted(mpapYdirReverse, false, true);
    servoX.setEnablePin(mpapEnablePin);
    servoY.setMaxSpeed(600);
    servoY.setAcceleration(8000);
	servoY.enableOutputs();     // Activer les signaux du MPAP

	Serial.println(F("\nCommande de servo depuis Free Basic\n"));
	mpapPositionner();

}

void loop()
{
	if (Serial.available())
	{
		cmdTraitement();
	}

	servoX.run();     // Fait tourner le servo X si nécessaire
	servoY.run();
}


//----------------------------------------------- Traitement de la commande reçue de FB
void cmdTraitement()
{
	String cmdRx=Serial.readStringUntil('\n');     // https://reference.arduino.cc/reference/fr/language/functions/communication/serial/readstringuntil
	cmdRx.trim();     // Pour nettoyer cmdRx  https://docs.arduino.cc/built-in-examples/strings/StringLengthTrim?

	Serial.println("\nCommande : " + cmdRx);

	if (cmdRx.length() > 0)     // Si au moins un caratctère
	{
		int sepPos = cmdRx.indexOf(cmdSeperateur);     // Position du séparateur de paramètres
		servoXpos = (long)cmdRx.substring(0,cmdRx.indexOf(cmdSeperateur)).toInt();     // Extraction de la position du servo X

		if (sepPos > 0)     // S'il y a eu un séparateur de paramètres
		{
			servoYpos = (long)cmdRx.substring(sepPos +1).toInt();     // Extraction de la position du servo Y
		}
		else
		{
			servoYpos = 0;     // Si pas de scond paramètre, servoY = 0;
		}

		mpapPositionner();
	}
	else
	{
		Serial.println("Commande > " + cmdRx + "< invalide!!!");
	}
}

void mpapPositionner()
{
	Serial.println("Servo X = " + String(servoXpos));
	Serial.println("\tServo Y = " + String(servoYpos));

	servoX.moveTo(servoXpos);
	servoY.moveTo(servoYpos);
}

Il faudra, bien sûr "renforcer" la transmission des commandes, mais ça peut attendre :wink:
Je suis à ton entière disposition pour toutes questions.
Amuses toi bien :wink:

PS: J'ai fait tout mes essais "Full step", c'est à dire sans aucun pont sur ces 3 paires de bornes.
image
Nécessite la bibliothèque AccelStepper.

A+
Cordialement
jpbbricolez

C'est un type demande qui revient souvent, il me semble, il n'y a pas de bibliothèque qui fait ça ?

Bonsoir Jp,

Grand merci pour tout ça je vais essayer de me l’approprier …

A bientôt,

OP

~WRD0000.jpg