Aller au contenu


Fsociety

Inscrit(e) (le) 17 sept. 2017
Déconnecté Dernière activité août 06 2020 02:59
-----

#110704 Programme ROS Arduino

Posté par Fsociety - 31 juillet 2020 - 10:25

Bonjour,

 

J'ai écrit un petit programme tout bete histoire de voir comment on pouvait utilliser ROS avec Arduino a l'aide de rosserial, et du coup j'aimerais bien avoir votre avis sur ce que j'ai fait et si c'est la bonne facon de faire s'il vous plait.

 

Ce que le programme fait  :

 

Programme écrit sur l'IDE Arduino :

 

- Je récupère la durée d'impulsion d'un capteur ultrason HC-SR04.

- Je publie cette donnée dans un topic nommé "sensorDistance"

 

Programme écrit sur mon IDE C++ (Clion):

 

- Je sub au topic "sensorDistance" afin de récuperer la durée d'impulsion publié par le MC Arduino.

- J'effectue un calcul pour connaitre la distance de l'obstacle.

- Je publie cette distance dans un topic "motorSpeed"

 

- En fonction de la distance je décide soit d'avancer soit de tourner a droite.

- Ayant un tableau PWM[2] (car il y'a deux moteurs), si le robot avance je met les valeur a PWM[0] = 150 ,PWM[1] = 150, sinon je met PWM[0] = 150 , PWM[1] = 0

- Je publie le tableau PWM dans un topic nommé "motorControl"

 

Programme écrit sur l'IDE Arduino :

 

- Je sub au topic " motorControl" afin de récuperer le tableau PWM.

 

- Et j'appelle la fonction "avancer" ou "tournerAdroite" en attribuant le bon PWM au moteurs.

 

 

 

Je vais juste mettre le code écrit sur l'IDE Arduino car c'est la ou je suis le moins expérimenté:

#include <ros.h>
#include <std_msgs/Empty.h>
#include <std_msgs/Float64.h>
#include <std_msgs/Float64MultiArray.h>

// Motor A

int enA = 3;
int in1 = 2;
int in2 = 4;


// Motor B
int enB = 5;
int in3 = 6;
int in4 = 7;


// defines pins numbers
const int trigPin = 11;
const int echoPin = 12;

ros::NodeHandle  myNode;
std_msgs::Float64 pulseDuration;



void forward(const std_msgs::Float64MultiArray& PWM){
  digitalWrite(in1,HIGH);
  digitalWrite(in2,LOW);
  digitalWrite(in3,HIGH);
  digitalWrite(in4,LOW);

  analogWrite(enA,PWM.data[0]);
  analogWrite(enB,PWM.data[1]);
}

void backWard(const std_msgs::Float64MultiArray& PWM){
  digitalWrite(in1,LOW);
  digitalWrite(in2,HIGH);
  digitalWrite(in3,LOW);
  digitalWrite(in4,HIGH);

  analogWrite(enA,PWM.data[0]);
  analogWrite(enB,PWM.data[1]);
}

void turnRight(const std_msgs::Float64MultiArray& PWM){
  digitalWrite(in1,HIGH);
  digitalWrite(in2,LOW);
  digitalWrite(in3,LOW);
  digitalWrite(in4,HIGH);

  analogWrite(enA,PWM.data[0]);
  analogWrite(enB,PWM.data[1]);
}

void motorCallBack(const std_msgs::Float64MultiArray& PWM){
  Serial.print("PWM1=");
  Serial.println(PWM.data[0]);
  Serial.print("PWM2=");
  Serial.println(PWM.data[1]);
  if(PWM.data[0] > 0 && PWM.data[1] > 0){
    forward(PWM);
  }else{
    turnRight(PWM);
  }
}

ros::Subscriber<std_msgs::Float64MultiArray> subscriber("motorControl",&motorCallBack);
ros::Publisher publisher("sensorDistance",&pulseDuration);

void setup()
{ 
  
  pinMode(enA,OUTPUT);
  pinMode(enB,OUTPUT);
  pinMode(in1,OUTPUT);
  pinMode(in2,OUTPUT);
  pinMode(in3,OUTPUT);
  pinMode(in4,OUTPUT);

  digitalWrite(in1,HIGH);
  digitalWrite(in2,LOW);
  digitalWrite(in3,HIGH);
  digitalWrite(in4,LOW);
  
  
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

  
  myNode.initNode();
  myNode.subscribe(subscriber);
  myNode.advertise(publisher);
  
  Serial.begin(57600);
}

void loop()
{  
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  // Sets the trigPin on HIGH state for 10 micro seconds
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  // Reads the echoPin, returns the sound wave travel time in microseconds
  pulseDuration.data = pulseIn(echoPin, HIGH);

  publisher.publish(&pulseDuration);
  myNode.spinOnce();
  delay(1000);
}

 

Merci.




#110577 Calcul couple,force d'une base mobile

Posté par Fsociety - 21 juillet 2020 - 09:59

Bonjour a tous  :D ,

 

Dans le cadre d'un projet personnelle et dans un but d'apprentissage j'ai décidé de réaliser un robot de A a Z en ayant une démarche la plus scientifique possible et donc pouvoir justifier tout mes futurs choix technologiques.

 

Je commence donc par la base mobile de mon future robot, l'objectif étant de trouver le couple nécessaire que doit générer mes moteurs pour faire avancer la base a une vitesse et un temps donné, dans le but de choisir les bons moteurs DC (4 moteurs).

 

Le robot doit donc être capable d'atteindre une vitesse max de 5m/s en 5 secondes.

 

Les données initiales :

- Poids appliqué au centre de la base mobile ( base de forme carré ) : M = 15 Kg

- Vitesse initiale : Vi = 0 m/s

- Vitesse max : Vmax = 5m/s

- Temps pour arriver a la vitesse max : dt = 5 secondes

- Rayon des roues ( Mecanum wheel ) : R = 48 mm

- Gravité : g = 9.81 m/s^2

- Coefficient de frottement : U = 0.6

- Frottement de l'air négligé.

 

 

A partir de ces données voici donc mon approche :

 

On sait que la somme des forces extérieurs est égale a la masse * l’accélération : Fext = m.a

 

L’accélération peut être calculer a partir de la formule suivante : a = Vf-Vi/dt = (5-0)/5 = 1m/s^2

 

On sait également que la force normale appliqué au niveau de la roue N = m*g = 147,15

 

A partir de ça on peut calculer la force de frottement (roue/sol) qui est dans le sens opposé du mouvement : Fr = N*U = 88.3 N

 

On revient donc a notre première équation :

 

- Fext = force F en direction du mouvement + la force de frottement dans le sens inverse.

 

F - Fr = m.a

 

F - 88.3 = 15 * 1

 

F = 88.3 + 15

 

F = 103.3 N ( Force nécessaire pour faire bouger la base mobile en remplissant les conditions fixées plus haut )

 

Maintenant on peut calculer le couple :

 

C = F*R = 103.3*0.048 = 4. 95 Nm ( couple que doit générer mon moteur pour faire tourner les roues et bouger mon robot en remplissant les conditions fixées plus haut )

 

 

Voici donc mes questions :

 

- Est ce que ma démarche est correcte ?

 

- Est ce que mes calculs et équations sont correctes et les résultats trouvés représentant t'ils les résultats que je recherche ?

 

- Dois je diviser le couple par 4 étant donné que j'ai 4 moteurs (En sachant que le poids est au milieu de la base mobile) ?

 

- Est ce que le type de roue a une influence sur les calculs et les forces exercées, car les roues de la base mobile sont des mecanum wheel ?

 

- Y'a t'il d'autres données a prendre en compte ?

 

 

J’espère que j'ai bien expliqué la problématiques et les objectifs :P

 

 

Merci !