Premier test Rotoshield avec 2 moteurs DC

Un shield de pilotage pour 4 moteurs à courant continu ou 2 moteurs pas à pas, qui permet une alimentation sur 12V et qui n'utilise que 4 sorties Pwm (sur 6) et 2 entrées analogiques (sur 6) de l'Arduino

Premier test Rotoshield avec 2 moteurs DC

Message non lude micmarn » Sam 26 Oct 2013 16:45

Bonjour,

Novice avec Arduino et les lignes de codes bien qu'ayant « bricolé » il y a fort longtemps sur un Commodore 64, je viens ici vous faire part de mon expérience (comme chacun sait l'expérience est une accumulation d'erreurs profitables) …. avec une carte arduino uno est un rotoshield achetés depuis quelques jours; et 2 moteurs DC.
Je suis parti d'un exemple pris sur ce site en anglais (ce qui ne m'arrange pas) http://tronixstuff.com/ merci au concepteur.
Voici le code :

/* exemple pris sur http://tronixstuff.com/ merci au concepteur.

#include <Wire.h> // inclure librairie Wire.
#include <snootor.h> // inclure librairie snootor.
SnootorDC M1; // moteur 1
SnootorDC M2; // moteur 2
void setup()
{
Wire.begin();
M1.init(2);
M2.init(1);
M1.setSpeed(255); // regler la vitesse
M2.setSpeed(255);
SC.dump(); // vider ??
}
void goForward(int duration)
// aller en avant 'duration'(durée) en milliseconds
{
M1.run(FORWARD); // vers l'avant
M2.run(FORWARD);
SC.delay(duration); // en milliseconds
M1.stop();
M2.stop();
M1.run(RELEASE); /// relacher
M2.run(RELEASE);
}
void goBackward(int duration)
// en arriere 'duration' durée en milliseconds
{
M1.run(BACKWARD); // en arriere
M2.run(BACKWARD);
SC.delay(duration); // en milliseconds
M1.stop();
M2.stop();
M1.run(RELEASE);
M2.run(RELEASE);
}
void
rotateLeft(int duration)
// tourner dans le sens antihoraire (à gauche) 'duration' (dueé) en milliseconds
{
M1.run(BACKWARD);
M2.run(FORWARD);
SC.delay(duration); // en milliseconds
M1.stop();
M2.stop();
M1.run(RELEASE);
M2.run(RELEASE);
}
void rotateRight(int duration)
// tourner dans le sens horaire (à droite) 'duration' milliseconds
{
M1.run(FORWARD);
M2.run(BACKWARD);
SC.delay(duration); // en milliseconds
M1.stop();
M2.stop();
M1.run(RELEASE);
M2.run(RELEASE);
}
void loop()
{
goForward(500); // en avant
rotateLeft(250); // tourner a gauche
goForward(500);
rotateRight(250); // tourner a droite
goBackward(500); // en arriere
rotateLeft(250);
goBackward(500);
rotateRight(250);
delay(2000);
}

J'ai donc fabriqué vite fait un petit montage avec une chute d'un passage de câbles électrique en plastique 90x40 mm ; voir photos.

Mes problèmes au démarrage:
1 carte arduino uno sur USB, carte rotoshield alimentés en 9 volts (pile rechargeable) les moteurs DC ne tournaient pas.

2 suite à l'alimentation avec la batterie 12 volts de ma visseuse les moteurs tournent, mais pas suivant les codes du programme ; ils tournent sans arrêt dans le même sens.

3 carte arduino uno sur pile 9 volts plusieurs fois les moteurs s’arrêtent, ils redémarrent en faisant « reset »........ la pile 9 volts alimentant arduino presque déchargée.

4 mon branchement des moteurs DC était mauvais en ce sens que j'avais branché un fils sur le GND du bornier, (ce qui n'a pas de sens direz-vous)

5 en résumé ….. une pile 9 volts + une batterie 12 volts bien chargées, les moteurs correctement branchés mon attelage à fonctionné impec.

6 pour la partie « go » et « rotate) j'ai modifié les valeurs ; je les ai divisé par 4.pour restreindre l'amplitude du parcours effectué.

goForward(500); // en avant
rotateLeft(250); // tourner a gauche
goForward(500);
rotateRight(250); // tourner a droite
goBackward(500); // en arriere
rotateLeft(250);
goBackward(500);
rotateRight(250);

Voilà … si cela peut aider à ne pas commetre les mêmes erreurs.[youtube][/youtube]
Fichiers joints
rotoshield 1a.jpg
rotoshield 1a.jpg (57.52 Kio) Vu 1576 fois
rotoshield 2a.jpg
rotoshield 2a.jpg (43.45 Kio) Vu 1576 fois
rotoshield 0a.jpg
rotoshield 0a.jpg (51.01 Kio) Vu 1576 fois
micmarn
 
Messages: 6
Inscription: Mar 15 Oct 2013 08:16

Re: Premier test Rotoshield avec 2 moteurs DC

Message non lude micmarn » Jeu 7 Nov 2013 22:22

rotoshield est 2 moteurs dc ...... suite ...
monté sur mon truc à 2 roues 2 moteurs (voir photos plus haut) un servo moteur avec capteur ultra son HC-SR04 . ( en partant de l'exemple suivant : Robot 2WD autonome capteur ultrason HC-SR04 de . http://itechnofrance.wordpress.com/2013 ... d-autonome ... merci au concepteur.

le problèmes ...... les deux moteurs tournent constamment dans le même sens mais s'arretent lorsqu'ils detectent un obstacle. Le servo moteur sur lequel est fixé le detecteur fait son "va et vient" correctemment.
En resumé le robot ne tourne pas lors de la detection d'un obstacle.
ci-apres le code ....j'ai fait de nombreux essais pour le bidouiller sans résultat. SVP à l'aide .....merci .

/*
Robot 2WD autonome capteur ultrason HC-SR04
de . http://itechnofrance.wordpress.com/2013 ... -autonome/
*/

#include <Servo.h>

// définition des broches utilisées par le capteur HC-SR04
int trig = 12;
int echo = 11;

// définition des broches utilisées sur le shield contrôle moteur DRI0001
int direction_moteur_droite = 7;
int controle_moteur_droite = 6;
int direction_moteur_gauche = 4;
int controle_moteur_gauche = 5;

long lecture_echo;
long cm, cm_gauche, cm_droite;
Servo monservo; // crée l’objet pour contrôler le servomoteur

void moteur (int moteur_gauche, boolean sens_moteur_gauche, int moteur_droite, boolean sens_moteur_droite)
{
// définition sens moteur LOW avance, HIGH recule
digitalWrite(direction_moteur_gauche, sens_moteur_gauche);
analogWrite(controle_moteur_gauche, moteur_gauche);
digitalWrite(direction_moteur_droite, sens_moteur_droite);
analogWrite(controle_moteur_droite, moteur_droite);
}

void virage_90 (boolean sens)
{
// on va toujours garder une valeur PWM à 200
// et on va jouer sur la durée en ms pour effectuer le virage souhaité
// sens à HIGH pour gauche, LOW pour droite
digitalWrite(direction_moteur_gauche, sens);
digitalWrite(direction_moteur_droite, !sens);
analogWrite(controle_moteur_gauche, 200);
analogWrite(controle_moteur_droite, 200);
delay(480);
analogWrite(controle_moteur_gauche, 0);
analogWrite(controle_moteur_droite, 0);
}

void calcul_distance()
{
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
lecture_echo = pulseIn(echo, HIGH);
cm = lecture_echo / 58;
}

void setup()
{
int i;
for (i=4;i<=7;i++)
pinMode(i, OUTPUT); //définit les port 4 à 7 en sortie
analogWrite(controle_moteur_gauche, 0); // arrêt moteur gauche
analogWrite(controle_moteur_droite, 0); // arrêt moteur droite
pinMode(trig, OUTPUT);
digitalWrite(trig, LOW);
pinMode(echo, INPUT);
monservo.attach(9); // utilise la broche 9 pour le contrôle du servomoteur
monservo.write(70); // positionne le servomoteur en fait à 90°
}

void loop()
{
monservo.write(70);
delay(1000);
calcul_distance();
if (cm >= 40)
{
// Robot avance tout droit
moteur(200, LOW, 200, LOW);
}
else
{
// Robot stop
moteur(0, LOW, 0, LOW);
monservo.write(30);
delay(1000);
calcul_distance();
cm_droite = cm;
monservo.write(120);
delay(1000);
calcul_distance();
cm_gauche = cm;
if (cm_droite < cm_gauche)
{
// Robot tourne 90° à gauche
virage_90(HIGH);
}
if (cm_droite > cm_gauche)
{
// Robot tourne 90° à droite
virage_90(LOW);
}
if (cm_droite == cm_gauche)
{
// Robot demi-tour
virage_90(HIGH);
virage_90(HIGH);
}
}
}

merci à vous .........
micmarn
 
Messages: 6
Inscription: Mar 15 Oct 2013 08:16


Retourner vers Rotoshield

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités

cron