Piloter un robot par bluetooth

Bonjour,
Nous avons un projet qui consiste à piloter un robot ramasseur de balles à distance grâce à une application créée sur appInventor.
Notre robot est constitué d'une carte arduino UNO,un shield (AZDelivery L293D Motor Driver) alimenté par 12V , de 2 moteurs (branchés aux bornes m3 et m4 du shield), et un module hc-05(Rxd=A4 et Txd=A5).
Nous cherchons un programme pour diriger notre robot à distance à l'aide des messages envoyés avec notre application (exemple : on envoie 'a' le robot avance).
Nous souhaitons également allumer et éteindre un petit aspirateur d'une puissance de 3V branchés à m1. J'ai réussi à envoyer des messages de mon téléphone à l'ordinateur par le biais du module hc-05.
Merci énormément pour votre aide
Piluma

Snif .... cela sent le projet scolaire/universitaire, mais peut-être que je me trompe.

Si mon détecteur ne m'a pas induit en erreur il est fortement préférable de le dire de suite et d'indiquer le niveau scolaire/universitaire.

Et, bien sur exposer ce que vous avez déjà réalisé, ce sur quoi vous butez et qui vous fait demander de l'aide.

Deux bonnes lectures :

et
www.eskimon.fr

Très juste !
Ceci dit, il y a déjà un début puisque tu sais communiquer avec l'Arduino en bluetooth. Il te reste à donner des ordres à tes moteurs en fonction des commandes reçues via le HC-05. C'est juste une série de 'if else' ou une machine d'états. Il y a un tuto pour ça que le forum, dans la section des... tutos.

Si tu as la datasheet de ton shield, ça devrait être faisable. La sortie 'm1' est digitale ? Peut-elle fournir assez de puissance pour alimenter l'aspirateur ?

Bonjour, merci de ton aide,
nous avons déjà réussi à faire tourné les moteurs grâce à un programme de la librairie (Adafruit motor shield library) mais je ne sais pas comment tout mettre en relation.
De plus je n'ai pas la datasheet du shield et je ne sais pas ce que tu entend par "digital".

Bonjourpiluma

Que voilà un truc marrant à faire!
Si ta carte est celle-ci
image
Toute la doc est ici

Quand tu dis à l'ordinateur tu penses PC ou Arduino?
Si tu as réussi à recevoir les commandes de ton smartphone sur l'Arduino et réussi à faire tourner tes moteurs, met ces 2 programmes en ligne.

A+
Cordialement
jpbbricole

Une sortie digitale c'est une sortie 'tout ou rien' qui fournit soit 0 soit VCC.

Il a dit:

Bonjour, étudiant en 2ème année d'une classe préparatoire (PSI), je débute dans le codage arduino. j'ai un projet à réaliser pour cette année avec deux de mes camarades, mais il me manque des connaissances pour le codage. Ce projet consiste principalement à piloter un robot via un smartphone.

dans une présentation personnelle

C'est bien cette carte !
Les messages envoyés depuis le téléphone s'affichent sur le moniteur série.

C'est la même référence que le shield plus haut, malheureusement je ne parvient à identifier la sortie digitale.

MotorTest.ino (877 Octets)
programme-hc-05.ino (727 Octets)
Voici les deux programmes: l'un pour contrôler uniquement un moteur, et l'autre pour envoyer un message de notre téléphone au PC.

Je ne sais pas s'il y en a une. Je disais juste qu'il faut trouver une sortie qui puisse alimenter ton aspirateur. Ce serait plus facile avec une sortie digitale, en utilisant digitalWrite mais c'est aussi faisable avec une sortie analogique et un analogWrite.

Merci, j'ai essayer de regarder des tutos mais sans succès. De plus j'ai quelques éléments de programme mais n'arrive pas à les mettre en lien (voir une de mes réponses).Peut tu nous aider.

Pour mettre un code en ligne il suffit de le copier dans ton message puis de le sélectionner et d'utiliser le bouton </>

#include <SoftwareSerial.h>
#define rxPin A5 // Broche 11 en tant que RX, à raccorder sur TX du HC-05
#define txPin A4 // Broche 10 en tant que TX, à raccorder sur RX du HC-05
SoftwareSerial mySerial(rxPin, txPin);
#include <AFMotor.h>
char t;
AF_DCMotor motor4(4);
AF_DCMotor motor3(3);

void setup() {
   pinMode(rxPin, INPUT);
   pinMode(txPin, OUTPUT);
   mySerial.begin(9600);
   Serial.begin(9600);           // set up Serial library at 9600 bps


  // turn on motor
  motor4.setSpeed(150);
  motor3.setSpeed(150);

}

void loop() {
  int i = 0;
char someChar[32] = {0};
// when characters arrive over the serial port...
if(Serial.available()) {
 do{
 someChar[i++] = Serial.read();
 delay(3);
 }while (Serial.available() > 0);
 mySerial.println(someChar);
 Serial.println(someChar);
}
while(mySerial.available())
 Serial.print((char)mySerial.read());
 
if(Serial.available()){
  t = Serial.read();
  Serial.println(t);
}
if(t == 'A'){ 
  motor4.run(FORWARD);
  motor3.run(FORWARD);
}
if(t == 'S'){ 
  motor4.run(RELEASE);
  motor3.run(RELEASE);
}

}

En lisant la datasheet, sur le lien de @jpbbricole je vois que M1 est une sortie analogique et qu'elle peut fournir 600 mA au maximum, soit 3W sous 5V. Est-ce suffisant pour ton aspirateur ?

Concernant le code : est-ce qu'il fait ce que tu en attends ?

De base notre aspirateur et alimenté par 2 piles de 1,5V (soit 3V) et on a réussi à le faire fonctionner par la borne 5V délivrée par Arduino (sans utiliser les piles et le shield). Cette tension de 5V est suffisante pour notre aspirateur.
Concernat le code, malheureusement le programme ne fait pas ce qu'on attend de lui. En effet, sur le PC, lorsque que l'on écrit une lettre pour la premiere fois dans le moniteur série (A ou S), le programme prend en compte rarement celle ci (les autres fois ne se passe rien). Les fois où le programme exécute l'action interprétée par la première lettre, il n'effectue pas les autres (ex: le S marche ensuite on envoie un A et rien ne se passe)
Sur téléphone la lettre envoyée est reçue par le moniteur série mais rien se produit.
Merci de votre aide

Il faut écrire ton code plus simplement. Je vois que tu écoutes la liaison BT mySerial pour afficher sur la console ce que tu en reçois, et que tu écoutes le port série (donc une entrée dans la console) pour envoyer des ordres au robot.
Mais, ce n'est pas très clair: parfois tu attends un caractère 'A' ou 'S' pour piloter les moteurs, parfois une chaine de caractères pour l'envoyer sur le Bluetooth. Mais surtout tu écoutes le port série plusieurs fois de suite, et je crois que ça vide le buffer à chaque fois, donc ça peut te jouer des tours.

Fais plus simple :

  1. Ecoute le BT et affiche ce qui arrive (ça c'est ok je pense)
  2. Ensuite écoute le port série et stocke dans un tableau de caractères ce qui en arrive.
  3. Si la chaine n'est pas vide, fais un test : si 'A' alors moteurs, si 'S' alors moteurs, sinon afficher et envoyer en BT.

@J-M-L a fait un bon tuto sur comment écouter le port série : trouve-le (dans la section tutos) et applique le.
EDIT : il est ici ...

Bonjour piluma

Je plussoie @lesept, c'est compliqué.
Pour écouter le moniteur ou le Bluetooth via SoftwareSerial, c'est absolument identique.
Si l'ordre vient de la console, il ne faut pas oublier de cliquer image
Le moniteur de l'IDE Arduino ne fait pas de saisie "à la volée"
J'ai corrigé ton code et ai mis des indications dans la console,
Commande A quand A est pressé
Commande S quand S est pressé
Ne pas oublier que ce système est sensible majuscule/minuscule a n'est pas = à A

#include <SoftwareSerial.h>
#define rxPin A5 // Broche 11 en tant que RX, à raccorder sur TX du HC-05
#define txPin A4 // Broche 10 en tant que TX, à raccorder sur RX du HC-05
SoftwareSerial mySerial(rxPin, txPin);
#include <AFMotor.h>
char t;
AF_DCMotor motor4(6);
AF_DCMotor motor3(7);

void setup() {
	pinMode(rxPin, INPUT);
	pinMode(txPin, OUTPUT);
	mySerial.begin(9600);
	Serial.begin(9600);           // set up Serial library at 9600 bps


	// turn on motor
	motor4.setSpeed(150);
	motor3.setSpeed(150);

}

void loop() {	
	if(Serial.available()){
		t = Serial.read();
		Serial.println(t);
		if(t == 'A'){
			Serial.println(F("Commande A"));
			motor4.run(FORWARD);
			motor3.run(FORWARD);
		}
		if(t == 'S'){
			Serial.println(F("Commande S"));
			motor4.run(RELEASE);
			motor3.run(RELEASE);
		}
	}

	if(mySerial.available()){
		t = mySerial.read();
		Serial.println(t);
		if(t == 'A'){
			Serial.println(F("Commande A bt"));
			motor4.run(FORWARD);
			motor3.run(FORWARD);
		}
		if(t == 'S'){
			Serial.println(F("Commande S bt"));
			motor4.run(RELEASE);
			motor3.run(RELEASE);
		}
	}
}

Cordialement
jpbbricole

Je vous remercie énormément, tout fonctionne comme on le souhaite.
Cordialement.

Fin de projet, je vous remercie sincèrement de votre aide. La bise