Commander une Del avec Ardublock Déscriptif de la carte Arduino Installer Ardublock Faire de la musique avec Arduino Commander un Servomoteur Contrôler un robot avec le LM293 et un joystick utiliser un Joystick Contrôler un moteur avec le LM293 Photoresistance et hystérésis interrupteur et rebond Mesurer un champ électrique Communiquer en 433MHz Commander une diode en fonction de la lumière avec Arduino Oscilloscope avec Processing commander l’Arduino par IR Communiquer sans fil avec Arduino Fabriquer une PlacTest pour Arduino
Accueil du site | Accessibilité | Rechercher | Menu | Contenu | Plan du site | | Contact

°°TechNoLand°°

°°TechNoLand°°

 
Voir en ligne

Contrôler un robot avec le LM293 et un joystick

22 novembre 2015 - Dernier ajout 30 janvier 2016
par chamayou

On va combiner ici les valeurs reçues du potentiomètre du joystick avec un LM293 contrôlé en PWM.

const byte motorSpeedPin = 10; //pwm
int motor1_in1Pin = 8;
int motor1_in2Pin = 7;
const byte joyStickPin = A1;

//declaration des variables Joystick
int joyValue = 0;
int joyValueMax = 1023;
int joyValueMin = 0;
int joyValueMid = 512;
int joyValueMidUpper = joyValueMid + 20;
int joyValueMidLower = joyValueMid - 20;

//DC motor variables
byte motorSpeed = 0;
byte motorSpeedMax = 255;
byte motorSpeedMin = 90; //set to smallest value that make motor move (default 0)
                        // DC motor that I use start to move at 90 pwm value

void setup()
{

 pinMode(joyStickPin, INPUT);
//on initialise les pins du moteur
  pinMode(motor1_in1Pin, OUTPUT);
pinMode(motor1_in2Pin, OUTPUT);
pinMode(motorSpeedPin, OUTPUT);


Serial.begin(9600);
}

void loop()
{
{
   joyValue = analogRead(joyStickPin);
 
   if(joyValue > joyValueMidUpper) //Forward
   {
       motorSpeed = map(joyValue, joyValueMidUpper, joyValueMax, motorSpeedMin, motorSpeedMax);
       digitalWrite(motor1_in1Pin,HIGH);
digitalWrite(motor1_in2Pin,LOW);
   analogWrite(motorSpeedPin, motorSpeed);
   }
   else if(joyValue < joyValueMidLower) //Backward
   {
       motorSpeed = map(joyValue, joyValueMidLower, joyValueMin, motorSpeedMin, motorSpeedMax);
        digitalWrite(motor1_in2Pin,HIGH);
digitalWrite(motor1_in1Pin,LOW);
   analogWrite(motorSpeedPin, motorSpeed);
   }
   //joyValue Between joyValueMidLower - joyValueMidUpper.
   //Need some range here, because joystick sometime not in  exact center.
   else
   {
      analogWrite(motorSpeedPin, 0);  
   }
 
}

}

Pour faire un travail propre, il faudrait réaliser des circuits de branchements pour le LM293, dans l’idée de celui pour Picaxe.

Utilisation du shield adafruit motor

http://snootlab.fr/adafruit/634-ada...

source : http://robot.sumo.free.fr/robot-sum...

#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_MS_PWMServoDriver.h"

Adafruit_MotorShield AFMS = Adafruit_MotorShield();

// Branchement joystick et moteur
const int x = A0;
const int y = A4;

Adafruit_DCMotor *myMotor1 = AFMS.getMotor(1);
Adafruit_DCMotor *myMotor2 = AFMS.getMotor(2);

// Définition des variables
int lecX, lecY, calX, calY, retX, retY, vit;

void setup () {
AFMS.begin();

// Lecture des valeurs en x et y
lecX = analogRead(x);
lecY = analogRead(y);
}

void loop() {

// Calibration du joystick en 0,0
calX = analogRead(x)-lecX;
calY = analogRead(y)-lecY;

// Réatalonnage x et y de 0,1023 à -255,255
retX = map(calX, 0, 1023, -255, 255);
retX= constrain(calX, -255, 255);
retY = map(calY, 0, 1023, -255, 255);
retY = constrain(calY, -255, 255);
delay(100);

//prise en compte de x ou y pour la vitesse
if ((abs(retX)) > (10))
{
vit = (abs(retX));
}

if ((abs(retY)) > (10))
{
vit = (abs(retY));
}


//Vitesse et direction moteurs
if (((retX) > (10)) && ((abs(retY)) < (10)))
{
//avance
myMotor1->setSpeed(vit);
myMotor1->run(FORWARD);
myMotor2->setSpeed(vit);
myMotor2->run(FORWARD);
}
else if (((retY) < (-10)) && ((abs(retX)) < (10)))
{
//tourne droite
myMotor1->setSpeed(vit);
myMotor1->run(FORWARD);
myMotor2->setSpeed(vit);
myMotor2->run(BACKWARD);
}
else if (((retY) > (10)) && ((abs(retX)) < (10)))
{
//tourne gauche
myMotor1->setSpeed(vit);
myMotor1->run(BACKWARD);
myMotor2->setSpeed(vit);
myMotor2->run(FORWARD);
}
else if (((retX) < (-10)) && ((abs(retY)) < (10)))
{
//recule
myMotor1->setSpeed(vit);
myMotor1->run(BACKWARD);
myMotor2->setSpeed(vit);
myMotor2->run(BACKWARD);
}
else
{
//stop
myMotor1->setSpeed(0);
myMotor1->run(BACKWARD);
myMotor2->setSpeed(0);
myMotor2->run(BACKWARD);
}
delay(100);
}
opendocument text - 224.2 ko


calle

calle