Contrôler un moteur avec l'inclinaison d'un smartphone

Bonjour,

Je réalise un projet de voiture télécommandée. J'aimerais la contrôler en fonction de l'inclinaison de mon téléphone, de manière à ce que le moteur1 tourne dans un sens ou dans l'autre lorsque je penche mon téléphone vers l'avant ou l'arrière, et la même chose pour le moteur2, de droite à gauche. J'ai cherché sur internet s'il existait un projet similaire, mais je n'ai rien trouvé. La seule chose que j'ai trouvée, c'est une application pour mon téléphone appelée "Dabble", qui semble pouvoir récupérer les données d'inclinaison. Je viens donc vers vous pour savoir si vous avez une idée de comment je pourrais réaliser ce projet.

Bonjour ioko

Avec MIT App Inventor, tu peux récupérer les divers capteurs de ton smartphone

et les transmettre, via Bluetooth, à l'Arduino.

A+
Cordialement
jpbbricole

Bonjour,

Est-ce que MIT et BLUETOOTH sont très rapidement réactifs, quel est le temps de réponse entre inclinaison du tél et réception de l'info?

Bonjour jef59

C'est à essayer, j'utilise souvent cette liaison, mais n'ai pas mesuré le temps de réaction. Ca ne vaut, certainement pas, uns télécommande classique.

Cordialement
jpbbricole

Si vous ne voulez pas gérer des vitesses différentes, vous allez avoir 9 ordres différents à envoyer suivant l'inclinaison sur l'axe des X et Y (en définissant des bornes)

ça se code aisément sur un octet , par exemple en envoyer un nombre (ou un caractère)

7 8 9
4 5 6
1 2 3

le décodage côté arduino est donc trivial et comme le message est super court, ça va aller assez vite normalement

(je n'utilise pas MIT App Inventor donc je ne sais pas si ça rajoute des lourdeurs)

Bonsoir ioko,

J'ai fait l'essai avec:

image
image
En utilisant Pitch pour la vitesse et roll pour la direction, ça fonctionne impec!

A+
Cordialement
jpbbricole

Bonjour,

J'ai essayé d'utiliser MIT App Inventor en regardant des tutoriels et des sites internet, mais je suis toujours un peu perdu. Pour mon projet, j'aimerais contrôler des moteurs LEGO via une carte L9110S. Je voudrais pouvoir contrôler les moteurs avec des boutons dans un premier temps, puis éventuellement explorer la possibilité de les contrôler en inclinant le téléphone. Pouvez vous m'aider s'il vous plait ?

Bonjour ioko

Je te livre le résultat de mes cogitations :wink:
Si tu mets la console de l'IDE Arduino à 115200 tu verra fonctionner le programme:

CW	sp 88
CW	sp 90
CW	sp 93
CW	sp 94
CW	sp 121
CW	sp 123
CW	sp 142
CW	sp 164
CW	sp 151
CW	sp 165
CW	sp 176
CW	sp 188
CW	sp 224
CW	sp 242
CW	sp 234
CW	sp 245
CW	sp 243
CW	sp 230
CW	sp 179
CW	sp 133
CW	sp 107
CW	sp 88
CW	sp 54
CW	sp 35
-00-
-00-
CCW	sp 23
CCW	sp 42
CCW	sp 63
CCW	sp 74
CCW	sp 86
CCW	sp 104
CCW	sp 114

CW = moteur sens des aiguilles d'une montre, CCW l'inverse.

Le programme:

/*
    Name:       SmartphoneSensors.ino
    Created:	21.04.2024
    Author:     jpbbricole
	Remarque:	Utilisation des capteurs du smartphone
*/

#include <VarSpeedServo.h>     // https://github.com/netlabtoolkit/VarSpeedServo
#include <SoftwareSerial.h>
//------------------------------------- Communications Bluetooth
const int btRxPin = A2;     // Réception depuis Centrale
const int btTxPin = A3;     // Transmission vers Centrale

SoftwareSerial btSerial(btRxPin, btTxPin); // RX, TX

//------------------------------------- Driver moteur H-Bridge
const int motPwmRpin = 5;     // Pin H-Bridge Moteur A-1A 5 9
const int motPwmLpin = 6;     // Pin H-Bridge Moteur A-1B 6 10

const int motPwmCmdOn = HIGH;     // Niveau de commande ON

enum motPwmDirIndex {motPwmDirCW, motPwmDirCCW};     // Sene aiguilles montre et contraire
int motPwmBreakTime = 500;     // Temps de freinage
int motSpeed = 0;     // Vitesse du moteur
const int motPwmMinimum = 15;     // Vitesse minium

const int btCarSpeedMax = 5000;     // Vitesse maximum reçue de Bluetooth
const int btCarDirMax = 3000;     // Direction maximum reçue de Bluetooth

int btCarSpeed = 0;     // Vitesse reçue de Bluetooth
int btCarSpeedPwm = 0;     // Vitesse PWM

int btCarDir = 0;     // Direction reçue de Bluetooth
int btCarDirDegr = 0;     // Direction reçue de Bluetooth en debrés

//------------------------------------- Servo
int servoPin = 10;     // Connexion du servo
int servoSpeed = 255;     // Vitesse du servo
VarSpeedServo servoDir;    // create servo object to control a servo

void setup()
{
	Serial.begin(115200);
	btSerial.begin(9600);

	servoDir.attach(servoPin);     // Connexion du servo sur la pin servoPin
}

void loop()
{
	if(btSerial.available() > 0)     // Si reçu commande de Bluetooth
	{
		String btCmdRx = btSerial.readStringUntil('\n');
		btCmdRx.trim();

		if (btCmdRx.startsWith("O"))
		{
			cmdReceiveOrientation(btCmdRx);
		}
	}
}

void cmdReceiveOrientation(String orient)
{
	btCarSpeed = orient.substring(1, orient.indexOf("|")).toInt();
	btCarSpeed = constrain(btCarSpeed, -btCarSpeedMax, btCarSpeedMax);     // Limiter les valeurs
	btCarSpeedPwm = map(btCarSpeed, -btCarSpeedMax, btCarSpeedMax, -255, 255);     // Conversion enPWM
	motPwmRun(btCarSpeedPwm);

	btCarDir = orient.substring(orient.indexOf("|") +1).toInt();
	btCarDir = constrain(btCarDir, -btCarDirMax, btCarDirMax);     // Limiter les valeurs
	btCarDirDegr = map(btCarDir, -btCarDirMax, btCarDirMax, 0, 90);     // Servo 90°
	servoRun(btCarDirDegr, servoSpeed);
}


//------------------------------------- Servo direction
void servoRun(int angle, int speed)
{
	servoDir.write(angle, speed);
}

//------------------------------------- Commande moteur (-btCarSpeedMax à + btCarSpeedMax)
void motPwmRun(int pwmSpeed)
{
	int pwmDir = (pwmSpeed >= 0) ? motPwmDirCW : motPwmDirCCW;
	pwmSpeed = abs(pwmSpeed);

	//pwmSpeed = map(pwmSpeed, 0, btCarSpeedMax, 0, 255);
	if (pwmSpeed < motPwmMinimum)     // Si point neutre
	{
		analogWrite(motPwmRpin, 0);
		analogWrite(motPwmLpin, 0);
		Serial.println(F("-00-"));

		return;
	}

	if (pwmDir == motPwmDirCW)
	{
		Serial.print(F("CW\t"));

		analogWrite(motPwmRpin, pwmSpeed);
		digitalWrite(motPwmLpin, !motPwmCmdOn);
	}
	else if (pwmDir == motPwmDirCCW)
	{
		Serial.print(F("CCW\t"));

		analogWrite(motPwmLpin, pwmSpeed);
		digitalWrite(motPwmRpin, !motPwmCmdOn);
	}
	Serial.println("sp " + String(pwmSpeed));
}

void motPwmBreak()
{
	Serial.println(F("BREAK"));

	digitalWrite(motPwmRpin, motPwmCmdOn);     // Arrêter le moteur
	digitalWrite(motPwmLpin, motPwmCmdOn);
	
	delay(motPwmBreakTime);

	digitalWrite(motPwmRpin, !motPwmCmdOn);     // Arrêter le moteur
	digitalWrite(motPwmLpin, !motPwmCmdOn);
}

Le programme MIT App Inventor
SmartPhone_Sensors.zip (46.1 KB)

Je peux t'aider à la connexion de ton L9110S, mais il faut que je fasse le montage, mais, actuellement, je suis assez "serré" :woozy_face:

Cordialement
jpbbricole

Bonjour Jpbbricole,
Merci beaucoup pour tout, mais est-ce un code pour une carte Arduino ? J'utilise une carte ESP32, je ne l'avais pas précisé.

Bonjour Jpbbricole. Je suis confronté à un autre problème. J'ai configuré le Bluetooth sur MIT App Inventor (avec ton programme) et j'ai réussi à associer mon ESP, mais je n'arrive pas à me connecter sur l'ESP avec mon smartphone.

Voici le code arduino pour ESP32

#include "BluetoothSerial.h"
#if !defined(CONFIG_BT_ENABLED)
#error Bluetooth is not enabled!
#endif
#define NOMBT "Test Robot"
BluetoothSerial SerialBT;
String ordreBT = "";

void setup() {
  Serial.begin(115200);
  SerialBT.begin(NOMBT);
  Serial.println("Bluetooth activé");

}

void loop() {
  while (SerialBT.available() > 0) {
    char caract = SerialBT.read();
    Serial.print (caract) ;
    if (caract >= 32) ordreBT += caract;

  }
}

Peut tu me dire si il y un soucie dans mon code, ou autre chose que j'ai mal fait ?
Merci

Bonjour ioko

Il doit fonctionner, il faut supprimer SoftwareSerial et y "greffer" le BluetoothSerial
Pour le servo, la bibliothèque VarSpeedServo n'est pas compatible ESP32, mets y Servo.h

Ton sketch fonctionne, voici ce que j'ai dans le moniteur:

O-1136|-73
O-917|124
O-505|247
O-296|494
O3|652
O219|822
O322|404
O-215|-76
O-640|-806
O-897|-976
O-1563|-794
O-1998|-432
O-1933|-472
O-1685|-630
O-1844|-650
O-2103|-337

Je n'ai, malheureusement, pas le temps de pousser les essais plus loin :woozy_face:

A+
Cordialement
jpbbricole

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