Virtualisation d'un bouton poussoir à l'aide de bluetooth

Bonjour,
J'ai un programme et un montage avec une arduino uno qui font tourner un moteur pas à pas de modèle nema 19 à l'aide d'un driver A4988 lorsque l'on appuie sur un bouton poussoir. Le moteur continue de tourner tant que l'on reste appuyé sur le bouton. Sur la breadbord se trouve aussi un module blutooth HC-05 qui ne me sert pour le moment à rien:

#include "AccelStepper.h"

const char boutonNemaIng1 = 3;

const bool boutonPinEtatOn = LOW;

const char mpapDirPin = 4;     // Pour driver MPAP pin pas
const char mpapStepPin = 5;     // Pour driver MPAP pin direction

AccelStepper MPAP1(1, mpapStepPin, mpapDirPin); 

int mpapNombreDePasAtourner = 200;

void setup() {
  // put your setup code here, to run once:
  MPAP1.setMaxSpeed(400);
  MPAP1.setAcceleration(500);

  pinMode(boutonNemaIng1, INPUT_PULLUP);

  MPAP1.setPinsInverted(false, false, true);
  MPAP1.enableOutputs();     // Activer les signaux du MPAP
}

void loop() {
  boolean etatBouton=digitalRead(boutonNemaIng1);
  if (etatBouton == boutonPinEtatOn)
  {
    MPAP1.move(mpapNombreDePasAtourner);
  }
  MPAP1.run();

}

J'ambitionne de créer une application de petit niveau afin de virtualiser le bouton poussoir sur l'écran tactile d'un appareil avec blutooth à l'aide du HC-05 sur le logiciel en ligne MIT app inventor. Voici ou j'en suis:

Le problème est que j'ai du mal à me retrouver avec les blocs et comment relier les variables arduino sur MIT app inventor. Quelqu'un pourrait-il m'aiguiller ?

Cordialement

Bonjour

Il faut créer une communication série

Lorsque l’app sur le téléphone de lance elle doit s’appairer avec le HC-05 et ensuite vous envoyez depuis l’arduino l’état du bouton quand il change (le caractère 0 ou 1 par exemple)
Pour conserver la capacité de debug sur Arduino prenez un port SoftwareSerial à 9600 bauds pour communiquer avec le module BT

Cherchez « mit app inventor HC-05 » et vous verrez des tonnes d’exemples

Bonjour,
Voici le code que j'ai écrit et les blocks que j'ai assemblé:

#include "AccelStepper.h"

char Incoming_value = 0;
const char boutonNemaIng1 = 3;

const bool boutonPinEtatOn = LOW;

const char mpapDirPin = 4;     // Pour driver MPAP pin pas
const char mpapStepPin = 5;     // Pour driver MPAP pin direction

AccelStepper MPAP1(1, mpapStepPin, mpapDirPin); 

int mpapNombreDePasAtourner = 200;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600); 
  MPAP1.setMaxSpeed(400);
  MPAP1.setAcceleration(500);

  pinMode(boutonNemaIng1, INPUT_PULLUP);

  MPAP1.setPinsInverted(false, false, true);
  MPAP1.enableOutputs();     // Activer les signaux du MPAP
}

void loop() {
  if (Serial.available() > 0)  
  {
    Incoming_value = Serial.read();      
    Serial.print(Incoming_value); 
    Serial.print("\n");
    if (Incoming_value == '1')
    {
       MPAP1.move(mpapNombreDePasAtourner);
    }
    MPAP1.run();
  } 
}

Il n'y a pas beaucoup d'exemples trouvables sur le net avec des pilotages de moteur pas à pas s'approchant de ce que je voudrais faire. Je voudrais que tant que l'on reste appuyé sur le bouton virtuel, le moteur tourne et que lorsque l'on relâche le même bouton, il s'arrête. Or, actuellement le moteur ne fait que tourner d'un petit pas alors que je pensais que le tout allait marcher correctement. Qu'est-ce qui ne va pas que je devrais améliorer ?

Cordialement

Bonjour enash

J'ai peu pratiqué App Inventor, mais est ce que Button1 est à répétition, est ce que 1 s'affiche, de façon répétitive, dans la console de l'IDE aussi longtemps que tu "presses" sur Button1?
Je ne pense pas vu que ton moteur ne fait qu'un pas, le temps de la boucle if (Serial.available() et que MPAP1.run(); est également.dans cette boucle.

Cordialement
jpbbricole

Envoyez 1 à l’appui et 0 au relâchement du bouton - ce sera plus simple à gérer pour commencer

Ensuite vous pourrez rajouter un heartbeat qui permettrait de détecter la perte de connexion et arrêter le moteur

Bonjour enash

image

Avec 1:
MPAP1.move(mpapNombreDePasAtourner);
Avec 0:
MPAP1.stop();

et mettre MPAP1.run(); au "premier niveau" de loop().

Cordialement
jpbbricole

Si vous voulez tourner à une vitesse constante on peut aussi utiliser runSpeed() qui sera conditionné par la réception du 0 ou 1 (qui définit le mode - en pause ou en rotation)

Bonsoir
Voici mes nouveaux blocs et programme:

#include "AccelStepper.h"

char Incoming_value = 0;
const char boutonNemaIng1 = 3;

const bool boutonPinEtatOn = LOW;

const char mpapDirPin = 4;     // Pour driver MPAP pin pas
const char mpapStepPin = 5;     // Pour driver MPAP pin direction

AccelStepper MPAP1(1, mpapStepPin, mpapDirPin); 

int mpapNombreDePasAtourner = 200;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600); 
  MPAP1.setMaxSpeed(400);
  MPAP1.setAcceleration(500);

  pinMode(boutonNemaIng1, INPUT_PULLUP);

  MPAP1.setPinsInverted(false, false, true);
  MPAP1.enableOutputs();     // Activer les signaux du MPAP
}

void loop() {
  MPAP1.run();
  if (Serial.available() > 0)  
  {
    Incoming_value = Serial.read();      
    Serial.print(Incoming_value); 
    Serial.print("\n");
    if (Incoming_value == '1')
    {
      MPAP1.move(mpapNombreDePasAtourner);
    }
  }
}

Le résultat est meilleur car cette fois le moteur tourne de "mpapNombreDePasAtourner" à chaque appuie. Toutefois lorsque l'on reste appuyé sur le bouton virtuel, le moteur ne continue pas de tourner. Un 1 s'affiche dans le moniteur série, le moteur ne tourne que de "mpapNombreDePasAtourner", puis un 0 apparaît dans le moniteur série quand on relâche le bouton.

Puisque un 1 est l'équivalent d'une rotation de "mpapNombreDePasAtourner" comment pourrait-je m'y prendre afin que l'application envoie des 1 en continue tant que l'on reste appuyé sur le bouton ?

Cordialement

ça ne sert à rien - cf post 5

Quand vous recevez '1' vous lancez le moteur et quand vous recevez '0' vous l'arrêtez. Les 1 entre temps ne servent juste qu'à dire que la connexion est toujours là... en première approximation vous pouvez vous contenter d'un seul '1' et du '0' quand vous relâchez

Bonjour enash

Ce serait inutilement compliqué de faire ça dans App Inventor et beaucoup plus simple dans l'Arduino.

Il te faut une variable globale:
boolean mpap1Running = false;

et loop() comme ceci:

void loop()
{
	if (Serial.available() > 0)
	{
		Incoming_value = Serial.read();
		Serial.print(Incoming_value);
		Serial.print("\n");

		if (Incoming_value == '0')
		{
			MPAP1.stop();
			MPAP1.setCurrentPosition(0);
			mpap1Running = false;
		}

		if (Incoming_value == '1')
		{
			mpap1Running = true;
		}
	}
	

	if (mpap1Running)
	{
		MPAP1.run();
		MPAP1.move(mpapNombreDePasAtourner);
	}
}

C'est essayé avec App Inventor.

Cordialement
jpbbricole

De mémoire Il me semble que move() va recalculer l’accélération et donc qu’on n’aura peut être pas la vitesse max ?

Bonjour J-M-L

Je ne saurai confirmer, mais, la rotation est fluide et il n'y a pas de remarque à ce propos, par contre, moveTo(), il y a des remarques.

Cordialement
jpbbricole

Bonjour

Une légère amélioration, cet ajout permet d'avoir l'accélération à chaque pression du bouton, sans ça l'accélération est seulement au premier usage.

Cordialement
jpbbricole

merci pour les liens, ils disent que move() réference moveTo().

au final je suis allé voir le code source pour en avoir le coeur net et c'est cela:

void AccelStepper::move(long relative) {
    moveTo(_currentPos + relative);
}

donc le commentaire pour moveTo s'applique aussi mais peut être ce n'est pas visible

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.