Monster Moto Shield

Bonjour, je me suis lancer dans un nouveau projet qui consiste a controler un moteur 12V avec un carde Arduino Uno et une carte Montser Moto Shield (DEV-10182)
J’ai reussi mon branchement alimenté en 12V, mais je n’arrive pas à introduire un delay dans ce programme.
J’aimerai que le moteur tourne durant 20 seconde, et s’arrête pendant 5 seondes, et ceci en boucle;

Voici le programme:

#define BRAKEVCC 0
#define CW 1
#define CCW 2
#define BRAKEGND 3
#define CS_THRESHOLD 15   // Definição da corrente de segurança (Consulte: "1.3) Monster Shield Exemplo").

 

int inApin[2] = {7, 4}; // INA: Sentido Horário Motor0 e Motor1 (Consulte:"1.2) Hardware Monster Motor Shield").
int inBpin[2] = {8, 9}; // INB: Sentido Anti-Horário Motor0 e Motor1 (Consulte: "1.2) Hardware Monster Motor Shield").
int pwmpin[2] = {5, 6};            // Entrada do PWM
int cspin[2] = {2, 3};              // Entrada do Sensor de Corrente

int statpin = 13;
int i=0;
void setup()                         // Faz as configuração para a utilização das funções no Sketch
{
Serial.begin(9600);              // Iniciar a serial para fazer o monitoramento
pinMode(statpin, OUTPUT);
for (int i=0; i<2; i++)
    {
    pinMode(inApin[i], OUTPUT);
    pinMode(inBpin[i], OUTPUT);
    pinMode(pwmpin[i], OUTPUT);
    }
for (int i=0; i<2; i++)
    {
    digitalWrite(inApin[i], LOW);
    digitalWrite(inBpin[i], LOW);
    }
}

void loop()                          // Programa roda dentro do loop
{
while(i<255)
    {
    motorGo(0, CW, i);             // Aumento do o PWM do motor até 255
    delay(50);                          // Se o motor travar ele desliga o motor e
    i++;                                  // Reinicia o processo de aumento do PWM
    if (analogRead(cspin[0]) > CS_THRESHOLD)
    motorOff(0);
    Serial.println(i);
    digitalWrite(statpin, HIGH);
    }
i=1;
while(i!=0)
    {                                      // Mantém o PWM em 255 (Velocidade Máxima do Motor)
    motorGo(0, CW, 255);       // Se o motor travar ele desliga o motor e
    if (analogRead(cspin[0]) > CS_THRESHOLD)              // Reinicia o processo de aumento do PWM
    motorOff(0);
    }
}
void motorOff(int motor)     //Função para desligar o motor se o mesmo travar
{

for (int i=0; i<2; i++)
    {
    digitalWrite(inApin[i], LOW);
    digitalWrite(inBpin[i], LOW);
    }
analogWrite(pwmpin[motor], 0);
i=0;
digitalWrite(13, HIGH);
Serial.println("Motor Travado");
delay(1000);
}
void motorGo(uint8_t motor, uint8_t direct, uint8_t pwm)         //Função que controla as variáveis: motor(0 ou 1), sentido (cw ou ccw) e pwm (entra 0 e 255);
{
if (motor <= 1)
    {
    if (direct <=4)
        {
        if (direct <=1)
            digitalWrite(inApin[motor], HIGH);
        else
            digitalWrite(inApin[motor], LOW);

        if ((direct==0)||(direct==2))
            digitalWrite(inBpin[motor], HIGH);
        else
            digitalWrite(inBpin[motor], LOW);

        analogWrite(pwmpin[motor], pwm);
        }
    }
}

Pouvez vous s’il vous plait m’aider? Merci d’avance

PS: je suis nouveau sur le forum, désolé si ma démarche ne correspond pas aux attentes :confused:

Non ta démarche est bien juste pense à mettre ton programme dans une balise code (le # dans un icone juste au dessus)

Alors voila une petite solution ( sans module de timer )

int temps=0,temps2=0;


while(1) // boucle infini
{
  Fonction_moteur_tourner();  // tu lance ton moteur, bien sur la fonction ne ce fait pas comme ça c'est pour imager


                                        // timing 20 seconde
  temps = 0;                       // mise a 0 compteur
  temps2 = millis();              // prise de début du temps
  while (temps <= 20000)       // condition 20 000 ms => 20 s
  {
    temps = millis() - temps2;   // actualisation du temps écoulé depuis la prise de début du temps
  }

  Arreter_moteur();              // arrêt de ton moteur


                                        // timing 5 seconde
  temps = 0;                       // mise a 0 compteur
  temps2 = millis();              // prise de début du temps
  while (temps <= 5000)       // condition 5 000 ms => 5 s
  {
    temps = millis() - temps2;   // actualisation du temps écoulé depuis la prise de début du temps
  }
}

Voila comment tu peut faire :slight_smile:

La

La fonction millis() te donne le temps écoulé depuis le début du programme, avec une valeur fixe puis la deuxième actualisé à chaque tour de boucle, tu peut facilement savoir le temps qui s’écoule.

Skizo

Alors avant de continuer (merci aux autres de ne pas répondre si ce n'est fait) , edite ton message et mets le code entre les balises.

Désolé déjà répondu ^^ mais j'ai précisé pour la balise ^^

T'inquiètes, je t'en veux pas XD

Merci beaucoup pour vos réponse, je vous informes des résultats très rapidement :slight_smile:

Bonjour, je viens d’introduire la fonction que vous m’avez donner, pourtant je n’ai pas l’impression que mon moteur s’arrête (20000 ms) :confused:
Je suis nouveau sur arduino, ai-je peu etre loupé une étape?

#define BRAKEVCC 0
#define CW 1
#define CCW 2
#define BRAKEGND 3
#define CS_THRESHOLD 15   // Definição da corrente de segurança (Consulte: "1.3) Monster Shield Exemplo").

 

int inApin[2] = {7, 4}; // INA: Sentido Horário Motor0 e Motor1 (Consulte:"1.2) Hardware Monster Motor Shield").
int inBpin[2] = {8, 9}; // INB: Sentido Anti-Horário Motor0 e Motor1 (Consulte: "1.2) Hardware Monster Motor Shield").
int pwmpin[2] = {5, 6};            // Entrada do PWM
int cspin[2] = {2, 3};              // Entrada do Sensor de Corrente
int temps=0,temps2=0;

int statpin = 13;
int i=0;
void setup()                         // Faz as configuração para a utilização das funções no Sketch
{
Serial.begin(9600);              // Iniciar a serial para fazer o monitoramento
pinMode(statpin, OUTPUT);
for (int i=0; i<2; i++)
    {
    pinMode(inApin[i], OUTPUT);
    pinMode(inBpin[i], OUTPUT);
    pinMode(pwmpin[i], OUTPUT);
    }
for (int i=0; i<2; i++)
    {
    digitalWrite(inApin[i], LOW);
    digitalWrite(inBpin[i], LOW);
    }
}

void loop()                          // Programa roda dentro do loop
{
while(i<255)
    {
    motorGo(0, CW, i);             // Aumento do o PWM do motor até 255
    delay(0);                          // Se o motor travar ele desliga o motor e
    i++;                                  // Reinicia o processo de aumento do PWM
    if (analogRead(cspin[0]) > CS_THRESHOLD)
    motorOff(0);
    Serial.println(i);
    digitalWrite(statpin, HIGH);
    }
i=1;
while(i!=0)
    {                                      // Mantém o PWM em 255 (Velocidade Máxima do Motor)
    motorGo(0, CW, 255);       // Se o motor travar ele desliga o motor e
    if (analogRead(cspin[0]) > CS_THRESHOLD)              // Reinicia o processo de aumento do PWM
    motorOff(0);
   }
[color=red]
while(1)
    motorGo(0, CW, i);             // Aumento do o PWM do motor até 255
 temps = 0;                       // mise a 0 compteur
  temps2 = millis();              // prise de début du temps
  while (temps <= 10000)       // condition 20 000 ms => 20 s
  {
    temps = millis() - temps2;   // actualisation du temps écoulé depuis la prise de début du temps
  }

  motorOff(0);              // arrêt de ton moteur


                                        // timing 5 seconde
  temps = 0;                       // mise a 0 compteur
  temps2 = millis();              // prise de début du temps
  while (temps <= 4000)       // condition 5 000 ms => 5 s
  {
    temps = millis() - temps2;   // actualisation du temps écoulé depuis la prise de début du temps
  }
}
[/color]

void motorOff(int motor)     //Função para desligar o motor se o mesmo travar
{

for (int i=0; i<2; i++)
    {
    digitalWrite(inApin[i], LOW);
    digitalWrite(inBpin[i], LOW);
    }
analogWrite(pwmpin[motor], 0);
i=0;
digitalWrite(13, HIGH);
Serial.println("Motor Travado");
delay(1000);
}
void motorGo(uint8_t motor, uint8_t direct, uint8_t pwm)         //Função que controla as variáveis: motor(0 ou 1), sentido (cw ou ccw) e pwm (entra 0 e 255);
{
if (motor <= 1)
    {
    if (direct <=4)
        {
        if (direct <=1)
            digitalWrite(inApin[motor], HIGH);
        else
            digitalWrite(inApin[motor], LOW);

        if ((direct==0)||(direct==2))
            digitalWrite(inBpin[motor], HIGH);
        else
            digitalWrite(inBpin[motor], LOW);

        analogWrite(pwmpin[motor], pwm);
        }
    }
}

M’erci d’avance :slight_smile:

Jean-François:
Alors avant de continuer (merci aux autres de ne pas répondre si ce n'est fait) , edite ton message et mets le code entre les balises.

Je parle du premier message...

C'est fait, désolé je ne savais pas que l'on pouvait éditer :slight_smile:

Bas écoute, j’ai un peut de mal avec l’espagnol mais si tes fonctions font bien on et off de ton moteur et que ça fonctionne le programme devrais faire on => 20s , off => 5s et rebelote.

Sinon une erreur d’accolade sur ton while(1)

corréction

//[color=red] <=== rien à faire la ( peut être pour nous montré la bonne partie ^^ )
while(1)  // <===== manque une accolade au début du while et donc à la fin
{     //<================= correction du manque d'accolade 

    motorGo(0, CW, i);             // Aumento do o PWM do motor até 255
 temps = 0;                       // mise a 0 compteur
  temps2 = millis();              // prise de début du temps
  while (temps <= 10000)       // condition 20 000 ms => 20 s      <====================== temps 10 seconde
  {
    temps = millis() - temps2;   // actualisation du temps écoulé depuis la prise de début du temps
  }

  motorOff(0);              // arrêt de ton moteur


                                        // timing 5 seconde
  temps = 0;                       // mise a 0 compteur
  temps2 = millis();              // prise de début du temps
  while (temps <= 4000)       // condition 5 000 ms => 5 s       <================= temps 4 secondes
  {
    temps = millis() - temps2;   // actualisation du temps écoulé depuis la prise de début du temps
  }
}     //<================= correction du manque d'accolade 

}   // accolade de fin du loop 
//[/color] <===== rien à faire la non plus

Sinon je vois pas l’erreur.

Skizo.

Merci beaucoup pour vos aides qui me sont précieuses!
J'avais une autre petite question pour éclairer mon expérience. Qu'est-ce que le composant "DIR" souvent accompagné d'un +, sur une carte montser moto shield ?
Que signifie le clignotement de ce DIR ?

Voici l'image de la carte où l'on peut voir les deux composant DIR SparkFun Monster Moto Shield - DEV-10182 - SparkFun Electronics (les composant se trouvent à droite et à gauche des VNH2SP30)

Merci beaucoup d'avance :slight_smile:

ce sont des leds qui t'indiquent le fonctionnement...