Je suis débutant et je me suis lancé dans un projet de slider motorisé et commander par bluetooth .
Mais j'avance...doucement.mais j'avance .
Sauf pour ce point précis pour laquelle je demande de l'aide .
Je commande mon moteur pas à pas à l'aide d'une L298n et d'un arduino uno .
J'utilise la library<Stepper.h>
Mais je voudrais ne pas mettre une valeur fixe à setSpeed , mais une variable que je renseignerais par serial.read ou autre.
est-ce possible ?
voici mon code actuel ( soyer indulgent )
#include <Stepper.h>
const int NbPasParTour = 200;
Stepper Moteur1(NbPasParTour, 8, 9, 10, 11);
//***VARIABLE***
int findroite;
int fingauche;
int Data;
int vitesse=150;
void setup()
{
Moteur1.setSpeed(vitesse); //Vitesse de rotation du moteur
Serial.begin(9600); //Initialise le moniteur série
findroite=4;
fingauche=5;
pinMode(13, OUTPUT); //pin 13 commande de la photo
pinMode(4,INPUT_PULLUP); //pin 4 fin de course droite
pinMode(5,INPUT_PULLUP); //pin 5 fin de course gauche
}
void loop()
{
boolean etatBoutondroit=digitalRead(findroite); //regarde l'état du capteur fin de course droite
boolean etatBoutongauche=digitalRead(fingauche); //regarde l'état du capteur fin de course gauche
{
int Data = Serial.read();
switch(Data)
{
case 'g': // bouton manu gauche du tél
Moteur1.step(300);
break;
case 'd': // bouton manu droit du tél
Moteur1.step(-300);
break;
case 'p':
digitalWrite(13, HIGH); // Déclenchement de la photo
delay(160);
digitalWrite(13, LOW); // arrêt du déclenchement
break;
}
}
if (etatBoutondroit==LOW) //test si capteur droit appuyé
{
Moteur1.step(-300);
}
else if (etatBoutongauche==LOW) //test si capteur gauche appuyé
{
Moteur1.step(300);
}
}
Re_bonjour à tous , encore merci pour votre aide , j'ai réussi à faire ce que je voulais avec vos conseilles.
Je reviens vers vous car mon programme avance mais malgré beaucoup de recherche je ne trouve pas le problème .
Je vous met mon code +program côté android ( fait avec APP inventor )
#include <Stepper.h>
const int NbPasParTour = 200;
Stepper Moteur1(NbPasParTour, 8, 9, 10, 11);
int findroite;
int fingauche;
int Data;
String trame = ""; // la trame est initialisée
int nb_photo;
int interval;
int vitesse;
int nb_pas;
int sens;
void setup() {
Serial.begin(9600); //Initialise le moniteur série
findroite=4;
fingauche=5;
pinMode(13, OUTPUT); //pin 13 commande de la photo
pinMode(4,INPUT_PULLUP); //pin 4 fin de course droite
pinMode(5,INPUT_PULLUP); //pin 5 fin de course gauche
}
void loop() {
boolean etatBoutondroit=digitalRead(findroite); //regarde l'état du capteur fin de course droite
boolean etatBoutongauche=digitalRead(fingauche); //regarde l'état du capteur fin de course gauche
{
if(Serial.available()>0){
char Data=Serial.read();
switch(Data)
{
case 'g': // bouton manu gauche du tél
Moteur1.setSpeed(200); //Vitesse de rotation du moteur
Moteur1.step(300);
break;
case 'd': // bouton manu droit du tél
Moteur1.setSpeed(200); //Vitesse de rotation du moteur
Moteur1.step(-300);
break;
case 'p':
digitalWrite(13, HIGH); // Déclenchement de la photo
delay(150);
digitalWrite(13, LOW); // arrêt du déclenchement
break;
case 's':
trame = Serial.readStringUntil(',');
nb_photo = trame.toInt();
trame = Serial.readStringUntil(',');
interval = trame.toInt();
trame = Serial.readStringUntil(',');
vitesse = trame.toInt();
trame = Serial.readStringUntil(',');
nb_pas = trame.toInt();
trame = Serial.readStringUntil('f');
sens = trame.toInt();
break;
}
}
for ( int i = 0 ; i < nb_photo ; i++ )
if (nb_photo > 1)
{
Moteur1.setSpeed(vitesse);
Moteur1.step(nb_pas); // partie à modifier par la suite par rapport à la variable "sens"
digitalWrite(13, HIGH); // Déclenchement de la photo
delay(160);
digitalWrite(13, LOW); // arrêt du déclenchement
delay(interval);
}
if (etatBoutondroit==LOW) //test si capteur droit appuyé
{
Moteur1.setSpeed(200);
Moteur1.step(-500);
}
else if (etatBoutongauche==LOW) //test si capteur gauche appuyé
{
Moteur1.setSpeed(200);
Moteur1.step(500);
}
}
}
Je me doute que mon code n'est pas exemplaire , mais je débute .
Actuellement les boutons "manu" droite et gauche fonctionne , comme les capteurs de fin de course et le déclenchement manuel .
Mais quand je met plusieurs valeurs dans mon program est fait start ... rien ne se passe ...
Un de mes soucis est aussi que je ne peut pas voir sur le moniteur série se que je reçois de l'android car le module bluetooth ( HC05 au faite ) utilise déjà le port série .
Merci de toute l'aide que vous pourriez m'apporter !
Sur Ardiuno tu peux créer des ports série virtuels grâce à la bibli Softwareserial : tu peux l'utiliser pour le module BT et conserver le port série hardware pour le PC
Merci pour ce conseil que j'ai suivie , j'ai repris mon code pour utiliser sofwareserial pour la commande BT et comme cela je peux voir le moniteur serial et savoir ce que je reçoit comme valeur .
#include <Stepper.h>
#include <SoftwareSerial.h>
const int NbPasParTour = 200;
Stepper Moteur1(NbPasParTour, 8, 9, 10, 11);
SoftwareSerial mySerial ( 6 , 7 ) ; // RX, TX
int findroite;
int fingauche;
int Data;
String trame = ""; // la trame est initialisée
int nb_photo;
int interval;
int vitesse;
int nb_pas;
int sens;
void setup() {
Serial.begin(9600); //Initialise le moniteur série
mySerial.begin(9600);
findroite=4;
fingauche=5;
pinMode(13, OUTPUT); //pin 13 commande de la photo
pinMode(4,INPUT_PULLUP); //pin 4 fin de course droite
pinMode(5,INPUT_PULLUP); //pin 5 fin de course gauche
}
void loop() {
boolean etatBoutondroit=digitalRead(findroite); //regarde l'état du capteur fin de course droite
boolean etatBoutongauche=digitalRead(fingauche); //regarde l'état du capteur fin de course gauche
{
{
int Data=mySerial.read();
Serial.println(Data);
switch(Data)
{
case 'g': // bouton manu gauche du tél
Moteur1.setSpeed(200); //Vitesse de rotation du moteur
Moteur1.step(300);
break;
case 'd': // bouton manu droit du tél
Moteur1.setSpeed(200); //Vitesse de rotation du moteur
Moteur1.step(-300);
break;
case 'p':
digitalWrite(13, HIGH); // Déclenchement de la photo
delay(150);
digitalWrite(13, LOW); // arrêt du déclenchement
break;
case 's':
trame = mySerial.readStringUntil(',');
nb_photo = trame.toInt();
trame = mySerial.readStringUntil(',');
interval = trame.toInt();
trame = mySerial.readStringUntil(',');
vitesse = trame.toInt();
trame = mySerial.readStringUntil(',');
nb_pas = trame.toInt();
trame = mySerial.readStringUntil('f');
sens = trame.toInt();
break;
}
}
for ( int i = 0 ; i < nb_photo ; i++ )
if (nb_photo > 1)
{
Moteur1.setSpeed(vitesse);
Moteur1.step(nb_pas); // partie à modifier par la suite par rapport à la variable "sens"
digitalWrite(13, HIGH); // Déclenchement de la photo
delay(160);
digitalWrite(13, LOW); // arrêt du déclenchement
delay(interval);
}
if (etatBoutondroit==LOW) //test si capteur droit appuyé
{
Moteur1.setSpeed(200);
Moteur1.step(-500);
}
else if (etatBoutongauche==LOW) //test si capteur gauche appuyé
{
Moteur1.setSpeed(200);
Moteur1.step(500);
}
}
}
Je vais essayer de débogué maintenant , car je vois bien des valeurs passées , lorsque je clique sur start , cela dois envoyer S à l'arduino ( je reçois 115 soit S ) mais derrière la récupération de la trame ne fonctionne pas .Aucune valeur arrive ... Softwareserial fonctionne avec trame = mySerial.readStringUntil(','); ?
j'utilise int Data = mySerial.read();
Je pense que cela bride la taille de variable ? je devrais utiliser char ?
Merci , grâce à vous j'avance toujours un peu plus !
Ok mais j'ai un peu de mal avec l'anglais , et quant on traduit , le code aussi est traduit , cela deviens compliqué .mais je vais regarder quand même .
J'ai testé avec char mais idem .
A la récupération de la trame , dois-je mettre un delay entre la réception pour laisser l'arduino le temps de stocké la valeur ?
J’espère me faire comprendre , j'essaie d'employé le plus possible les bon termes ...
Non, c'est toute ta gestion de la réception qui est à reprendre, ce n'est pas en ajoutant un delay que ça va améliorer les choses par magie. Lis les exemples et la démarche (désolé si c'est en anglais, mais tu peux certainement trouver des explications similaires en français) pour comprendre la gestion de la réception.
Ce dernier lien propose un code dont tu peux t'inspirer, en changeant la liaison série par celle créée avec SoftwareSerial :
int ledPin = 9;
void setup()
{
// begin the serial communication
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
}
if (Serial.available() > 0) {
char valeur = Serial.read();
switch(valeur) {
case 'a':
analogWrite(ledPin, 30);
case 'c':
analogWrite(ledPin, 120);
case 'd':
analogWrite(ledPin, 230);
}
}
Brasiligun:
Petit projet de slider moto? Je suis curieux de voir ce que tu veux en faire
Bon courage
Bonjour,
Je tente de faire un slider d'environs 1 métres , fait maison forcément (tout alu), et avec un poids et un prix réduit .
Pour l'instant j'avance bien la partie mécanique est pratiquement fini , je mettrais des photos si cela vous intéresse .
Le but ? je suis adepte de la photo et de la vidéo , et occasionnellement du timelaspe .
Ce slider devrait me permettre de faire cela avec des translations fort bien jolie
C'est le côté software qui me donne le plus de mal ...
J'ai fait un test dernièrement avec un programme donc les variables on été entrée en manuel , cela à bien fonctionner et m'a permis de mettre 2 choses en évidence :
1er : j'ai bien calibré l'alimentation pour l'autonomie , mais peut-être pas pour la puissance ...( trop puissant )
2 eme : sa chauffe ! je suis même étonner de rien avoir grillé ! à la fin du cycle de 400 photos , impossible de mettre le doigt 1/15 de s sur le moteur (moteur de scanner avec réducteur ) ou le driver (L298N)
J'alimente la parie logique avec une pile 9V 200mAh qui me donne théoriquement 4H d'autonomie .
et la partie puissance avec une Lipo 2S ( donc 7,4V ) en 2500mAh .
Je dois maintenant :
trouver le moyen d'abaissé le niveau de la L298n ( pour baissé la puissance , pas besoin de beaucoup avec le réducteur du moteur)
résoudre tout les soucis de mon code pour la transmission Bluetooth .
Mais avec votre aide et de la patience je devrais trouver
Bon je fait marche arrière sur la partie mécanique . J'ai finalement changer le moteur par un Nema17( Celui-ci ) qui je l’espère sera à la hauteur .
L'ancien , un moteur avec réducteur avait une force pas possible , j'arriver à faire monter mon chariot verticalement avec mon boitier et objectif le plus lourd ! mais soucis il chauffe dur dur car doit tourner vite et le driver également , et autre soucis c'est qu'au max le chariot pouvais ce déplacer de 0,5cm/s environs.
Du coup j'ai modifier pour y placer le Nema17 , souics ... avec quoi le piloté ?
Avec le L298N ( ICI ) la puissance est plutôt bonne , les mouvements plutôt fluide et pas trop de vibration . Mais comme d'hab le L298n tire trop ! il a réussie à faire fondre le petit câble de test qui l'alimente !
Avec un A4988 ( ICI) Beaucoup de vibration ( la courroie claque sur les bords tellement ça vibre ) , puissance bof , le chariot ne monte pas si je penche le slider de + de 45° , par contre chauffe assez peu idem pour le moteur .
Avec le L298N j'utilise la librairy Stepper.h
Avec le A4988 j'utilise la librairy A4988.h ou accelstepper.h
Voila donc je suis perdu , vous avez une proposition ? , un autre driver ? le moteur ? Ya t-il un moyen de réduire la puissance consommé par la L298N ( j'ai tenté de sous-alimenter , mais sous les 6v elle ne démarre plus ) et côté A4988 j'ai augmenter le potar mais sans gros changement .
Avant d’approfondir mes problèmes de code , il faut que je trouve ma config moteur/driver définitive .
zehypnos:
...
Voila donc je suis perdu , vous avez une proposition ? , un autre driver ? le moteur ? Ya t-il un moyen de réduire la puissance consommé par la L298N ( j'ai tenté de sous-alimenter , mais sous les 6v elle ne démarre plus ) et côté A4988 j'ai augmenter le potar mais sans gros changement .
Avant d’approfondir mes problèmes de code , il faut que je trouve ma config moteur/driver définitive .
Merci d'avance pour votre aide .
Bonjour
pour regler les A4988 ou DRV8825 , çà ne s'improvise pas
il te faut connaitre les caractéristiques de ton moteur
lire ce lien qui ne me semble pas trop mal fait (lecture rapide)