J'ai pour projet de commander un moteur dans les deux sens de marche a l'aide d'un module L298n en bluetooth, la partie commande en pwm du moteur fonctionne mais le problème c'est que je ne sais pas envoyer l'information du sens de marche. je voulais mettre une condition du genre "if((consigne.length()>0)&&(retour=="droite"))" mais cela ne fonctionne pas.
Voici mon programme (j'ai mis un double slash pour enlever mes dernier essai)
Bonjour,
as-tu essayé de débugger en utilisant Serial.println() pour voir les variables du début jusqu'à la fin du programme ?
Quelles sont leurs valeurs ?
Bonjour,
Mon programme tell présenté (sans les anti //) ,lorsque j'envoie le signal "droite" l'affiche sur le moniteur série mais mon signal pwm ne s'affiche pas. Lorsque j'avais mis "if ((consigne.lenght ())&&(infoo=="droite")) il ne m'afficher rien. Il me semble que c'est dans cette ordre la, sinon c'est l'inverse.
Bonsoir, pour résumer, je voudrais pour commander avec mon module Bluetooth le sens du moteur ainsi que sa tension. J'ai réussi a faire varier la tension grace au PWM mais pour le sens de variation je n'y arrive pas. Quelqu'un aurrait il une solution
#include <SoftwareSerial.h>
SoftwareSerial HC06(11,10);//Tx11,Rx10
int moteurenable = 3;//enable sortie PWM
int sensD=9;//in1
int sensG=8;//in2
int fdc1=7;
int fdc2=6;
int ledfdcG=5;
String consigne="";
String droite;
byte val;
//-------------------------------------------------------
void setup() {
Serial.begin(9600);
HC06.begin(9600);
pinMode(moteurenable, OUTPUT);
analogWrite(moteurenable, LOW);
pinMode(sensD,OUTPUT);
pinMode(sensG, OUTPUT);
pinMode(fdc1, INPUT);
pinMode(fdc2, INPUT);
attachInterrupt(0, fdcG, LOW);
//attachInterrupt(1, fdcD, LOW);
pinMode(ledfdcG, OUTPUT);
//rajouter 3 leds pour allumage,fdcd et fdcg
}
void loop() {
while(HC06.available())
{
delay(3);
char car = HC06.read();
consigne += car;
if(consigne.length())
{
Serial.println(consigne);
val=(consigne.toInt());
digitalWrite(sensD, LOW);
digitalWrite(sensG, HIGH);
analogWrite(moteurenable, val);
digitalWrite(ledfdcG, HIGH);}}
consigne="";
}
J'envoie un signal PWM "byte" :val (0 à 255) avec un slider ( fonctionne parfaitement ) par contre je cherche à envoyer "droite" ou "gauche" pour commander le sens de marche toujours avec la fonction PWM .
Il y a des tas de moyens de coder le sens.
Sans beaucoup changer ton code, il suffit d'envoyer un entier signé au lieu d'un byte: +123 -> G et -123 ->D
Pour décoder:
...
int val=(consigne.toInt());
if (val>=0)
{
// sens G
// faire le traitement sens G
}
else
{
// sens D
// faire le traitement sens D
val=-val;
}
analogWrite(moteurenable, val);
Bonjour, j'ai fait le programme avec un "char" de -126" à "126" et sa fonctionne mais le soucis c'est que du coup j'envoie une valeur entre 0 et 2,5 volts. Je commande un moteur qui tourne donc en 6 volts. Y aurait il une autre solution ?
Je me retrouve dans la même situation qu'avant , je ne peux pas commander mon sens de marche. Est il possible d'avoir cette variable byte et d'envoyer en plus ( par exemple envoyer le mot droite) commander mon sens de marche et ma vitesse?
Je reposte mon programme au cas ou quelque chose m'aurais échappé. J'envoie un byte pour la variation et un mot pour commander le sens ( le programme ne fonctionne pas :ISO C++ forbids comparison between pointer and integer [-fpermissive])
#include <SoftwareSerial.h>
SoftwareSerial HC06(11,10);//Tx11,Rx10
int moteurenable = 3;//enable sortie PWM
int sensG=9;//in1
int sensD=8;//in2
int fdc1=7;
int fdc2=6;
int ledfdcG=5;
// int ledfdcD=...;
String consigne="",gauche,droite;
int val;
//-------------------------------------------------------
void setup() {
Serial.begin(9600);
HC06.begin(9600);
pinMode(moteurenable, OUTPUT);
analogWrite(moteurenable, LOW);
pinMode(sensG,OUTPUT);
pinMode(sensD, OUTPUT);
pinMode(fdc1, INPUT);
pinMode(fdc2, INPUT);
attachInterrupt(0, fdcG, LOW);
//attachInterrupt(1, fdcD, LOW);
pinMode(ledfdcG, OUTPUT);
//rajouter 3 leds pour allumage,fdcd et fdcg
}
void loop()
{
while(HC06.available())
{
delay(3);
char car = HC06.read();
consigne += car;
}
if(consigne.length())
{
Serial.println(consigne);
val=(consigne.toInt());
if (val=="droite"){
digitalWrite(sensG, LOW);
digitalWrite(sensD, HIGH);
digitalWrite(ledfdcG, LOW);
}
if(val=="gauche") {
digitalWrite(sensG, HIGH);
digitalWrite(sensD, LOW);
digitalWrite(ledfdcG, HIGH);
}
analogWrite(moteurenable, val);}
consigne="";
}