[PROJ] / [REAL] Robot tondeuse

Modérateur : allinside

Avatar de l’utilisateur
matthieuweb
Ingénieur
Ingénieur
Messages : 380
Inscription : 17 nov. 2009, 01:00

Re: [PROJ] / [REAL] Robot tondeuse

Message par matthieuweb » 04 janv. 2015, 14:06

Salut Mikl,

J'ai mis en œuvre un algo utilisant le compas de la GY-80 avec une Arduino micro pro (léonardo).

J'ai un cap en degrés, (pas étalonné mais c'est pas grave: il suffit de faire faire au robot un 360° et noter les variations des valeurs pour trouver le Nord).

Ça marche bien, mais bien entendu c'est ultra sensible aux champs magnétiques, je te conseillerais de coller la GY80 sur un mat en bois au centre de rotation du robot, mat qui peut être devra sortir de la carlingue sur 10 cm de haut pour s'éloigner des champs magnétiques et électromagnétiques...

Par contre le compas est sensible aux roulis et tangage (au delà de 5°...10°...), je fouine sur le net pour trouver un algo (compatible avec tes besoins) compensant grâce aux mesures faites par les accéléros ce problème.

A ++ et bonne année !

Matt

Avatar de l’utilisateur
matthieuweb
Ingénieur
Ingénieur
Messages : 380
Inscription : 17 nov. 2009, 01:00

Re: [PROJ] / [REAL] Robot tondeuse

Message par matthieuweb » 04 janv. 2015, 19:56

Ok voici un code que j'ai bricolé et qui marche :)

Ca renvoie le roulis tangage et le cap corrigé et non, le tout en degrés... siouplé !


HMC5883L_compensation_ADXL345.ino
[cpp]

#include <Wire.h>
#include "HMC5883L.h" // Compass
#include "ADXL345.h" // Accelerometer

double fXg = 0;
double fYg = 0;
double fZg = 0;

HMC5883L compass;
ADXL345 accelero;

void setup()
{
Serial.begin(9600);
// Initialize HMC5883L
Serial.println("Initialize HMC5883L");
while (!compass.begin())
{
Serial.println("Could not find a valid HMC5883L sensor, check wiring!");
delay(500);
}

// Initialize ADXL345
Serial.println("Initialize ADXL345");
accelero.begin();
delay(100);

// Set measurement range
compass.setRange(HMC5883L_RANGE_1_3GA);
// Set measurement mode
compass.setMeasurementMode(HMC5883L_CONTINOUS);
// Set data rate
compass.setDataRate(HMC5883L_DATARATE_30HZ);
// Set number of samples averaged
compass.setSamples(HMC5883L_SAMPLES_8);
// Set calibration offset. See HMC5883L_calibration.ino
compass.setOffset(0, 0);
}


// Correct angle
float correctAngle(float heading)
{
if (heading < 0) { heading += 2 * PI; }
if (heading > 2 * PI) { heading -= 2 * PI; }
return heading;
}

void loop()
{
double pitch, roll, Xg, Yg, Zg;

// Acquisition et traitement compas:
Vector norm = compass.readNormalize();


// Acquisition et traitement accéléromètre:
accelero.readScaled(&amp;Xg, &amp;Yg, &amp;Zg); // Celui de l'exemple compensate

float heading1 = atan2(norm.YAxis, norm.XAxis);


// Compensation du compas avec l'accéléro

roll = asin(Yg);
pitch = asin(-Xg);

// Some of these are used twice, so rather than computing them twice in the algorithem we precompute them before hand.
float cosRoll = cos(roll);
float sinRoll = sin(roll);
float cosPitch = cos(pitch);
float sinPitch = sin(pitch);
// Tilt compensation
float Xh = norm.XAxis * cosPitch + norm.ZAxis * sinPitch;
float Yh = norm.XAxis * sinRoll * sinPitch + norm.YAxis * cosRoll - norm.ZAxis * sinRoll * cosPitch;
float heading2 = atan2(Yh, Xh);

// Set declination angle on your location and fix heading
// You can find your declination on: http://magnetic-declination.com/
// (+) Positive or (-) for negative
// For Bytom / Poland declination angle is 4'26E (positive)
// Formula: (deg + (min / 60.0)) / (180 / M_PI);
float declinationAngle = (0.0 + (-51.0 / 60.0)) / (180 / M_PI);
heading1 += declinationAngle;
heading2 += declinationAngle;
// Correct for heading < 0deg and heading > 360deg
heading1 = correctAngle(heading1);
heading2 = correctAngle(heading2);
// Convert to degrees
heading1 = heading1 * 180/M_PI;
heading2 = heading2 * 180/M_PI;

// Sortie
Serial.print("Tangage: ");
Serial.print(pitch* 180/M_PI); Serial.print(" ");
Serial.print(" Roulis: ");
Serial.print(roll* 180/M_PI); Serial.print(" ");

Serial.print(" Cap: ");
Serial.print(heading1);
Serial.print(" Cap corrige: ");
Serial.print(heading2);
Serial.println();
delay(100);
}

[/cpp]

ADXL345.cpp
J'ai ajouté la fonction readScaled

(Qui est au besoin à déclarer dans ADXL345.H en ajoutant la ligne qui suit dans ADXL345.H :
[cpp]void ADXL345::readScaled(double *x, double *y, double *z) [/cpp])

[cpp]
/********************************************************************************
* ADXL345 Library - ADXL345.cpp *
* *
* Copyright (C) 2012 Anil Motilal Mahtani Mirchandani(anil.mmm@gmail.com) *
* *
* License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> *
* This is free software: you are free to change and redistribute it. *
* There is NO WARRANTY, to the extent permitted by law. *
* Matthieu Weber: Added "readScaled" function*
*********************************************************************************/
#include "ADXL345.h"
#include "../Wire/Wire.h"
int ADXL345::writeRegister(byte reg_addr, int nbytes, byte *buffer)
{
int written_bytes;
Wire.beginTransmission(ADXL345::ADDRESS);
Wire.write(reg_addr);
written_bytes = Wire.write(buffer, nbytes);
Wire.endTransmission();
return written_bytes;
}
int ADXL345::readRegister(byte reg_addr, int nbytes, byte *buffer)
{
int idx = 0;
Wire.beginTransmission(ADXL345::ADDRESS);
Wire.write(reg_addr);
Wire.endTransmission();
Wire.requestFrom(ADXL345::ADDRESS, nbytes);
while(Wire.available() &amp;&amp; idx < nbytes)
{
buffer[idx++] = Wire.read();
}
return idx;
}
ADXL345::ADXL345()
{
Wire.begin();
zG[0] = -20;
zG[1] = 15;
zG[2] = -23;
}
void ADXL345::begin()
{
byte data = 0x08;
writeRegister(ADXL345::POWER_CTL, 1, &amp;data);
}
void ADXL345::end()
{
byte data = 0x00;
writeRegister(ADXL345::POWER_CTL, 1, &amp;data);
}
void ADXL345::read(double *x, double *y, double *z)
{
byte buffer[6];
readRegister(ADXL345::DATAX0, 6, buffer);
*x = ((buffer[0] + (buffer[1] << 8)) - zG[0])/256.0;
*y = ((buffer[2] + (buffer[3] << 8)) - zG[1])/256.0;
*z = ((buffer[4] + (buffer[5] << 8)) - zG[2])/256.0;
}
void ADXL345::read(int *x, int *y, int *z)
{
byte buffer[6];
readRegister(ADXL345::DATAX0, 6, buffer);
*x = buffer[0] + (buffer[1] << 8);
*y = buffer[2] + (buffer[3] << 8);
*z = buffer[4] + (buffer[5] << 8);
}

void ADXL345::readScaled(double *x, double *y, double *z)
{
byte buffer[6];
readRegister(ADXL345::DATAX0, 6, buffer);
*x = ((buffer[0] + (buffer[1] << 8)) )/256.0;
*y = ((buffer[2] + (buffer[3] << 8)) )/256.0;
*z = ((buffer[4] + (buffer[5] << 8)) )/256.0;
}

void ADXL345::setRange(range_t range)
{
switch(range)
{
case RANGE_16G:
case RANGE_8G:
case RANGE_4G:
case RANGE_2G:
writeRegister(ADXL345::DATA_FORMAT, 1, (byte *)&amp;range);
break;
}
}
void ADXL345::setZeroG(double x, double y, double z)
{
zG[0] = x*256.0;
zG[1] = y*256.0;
zG[2] = z*256.0;
}
void ADXL345::setZeroG(int x, int y, int z)
{
zG[0] = x;
zG[1] = y;
zG[2] = z;
}
[/cpp]

Les autres fichiers sont dispo ici:
https://github.com/jarzebski/Arduino-HMC5883L
https://github.com/jenschr/Arduino-libr ... er/ADXL345

Bon tests !

A ++
Et bonne année à tous :)
Matt

Avatar de l’utilisateur
mikl
Chef d'équipe
Chef d'équipe
Messages : 85
Inscription : 15 août 2008, 02:00

Re: [PROJ] / [REAL] Robot tondeuse

Message par mikl » 13 juin 2015, 00:56

Bonsoir a tous. J'ai laisser mon robot hiberner tout l'hiver dans un placard, il est temps de le ressortir.

Avant l'hiver j'ai finalement trouver une solution pour le GY-80, car dès que je l'approchais du robot le compas était figé, mais grâce a l'accéléromètre et au code que j'utilise (multiwii) la valeur change quand le robot tourne puis revient a la valeur mesuré par le compas.
J'ai donc adapter mon code pour prendre en compte cette valeur seulement quand le robot ne change pas de direction, ainsi dès que la valeur calculé du compas et de l'accéléromètre se décale le robot corrige sa trajectoire, j'ai fait des essais cette après-midi et je l'ai jamais vue aller aussi droit :D
C'est beaucoup de boulot pour juste faire en sorte qu'il aille tout droit mais il y a trop d'interférence pour utilisé un compas sous le capot.

Ces derniers semaine j'ai terminé ma carte que j'appel "la carte de sureté" c'est une carte placé entre ma carte arduino et la carte de contrôle de la puissance des moteurs.
J'ai installer plein de micro-interrupteurs sur le devant du robot, si le robot touche un obstacle grâce au micro-interrupteur la carte de sureté vas couper le moteur de tonte et couper les ordres entre l'arduino et les moteurs pour en données d'autre en fonction de la zone de contact.
Cette carte est très simple, elle fonctionne seulement avec des diode et des relais, ainsi elle est très fiable et peut sensible au surtension ou autre phénomène qui endommagerait l'électronique.
Cette carte est là seulement pour assurer la sécurité en cas de bug de l'électronique qui pourrait faire foncé le robot sur tout :heink:

Voilà les micro-interrupteur:
http://replayman.free.fr/images/di [...] 25_Pro.jpg
Et le robot avec les dernier ajout:
http://replayman.free.fr/images/di [...] 06_Pro.jpg
Bref sa commence a être le bordel.

Si vous voulez en savoir plus et avoir plus de détails hésitez pas a demandé, je suis ici pour ça :)

Pour le moment il faut que je fasse des essais, j'ai quelque problème avec mon ponts diviseur de tentions ou de masse j'ai la mesure l'état des batterie faussées et j'ai quelque bug sur mon code.

PS: merci a toi matthieuweb, je suis désolé j'ai du zapper tes message en ce début d'année, je vient donc de voir que tu avais super bien bosser sur un code pour le GY-80, mais comme j'ai pas mal de parasite et que je veut pas un capteur 15 cm au dessus du robot je vais rester sur ma solution pour le moment. (j'avais essayer d'étalonner le compas mais cela ne dure pas, c'était loin d'être fiable) bref je te remercie et j'espère que tu avance dans ton projet ;)

Avatar de l’utilisateur
mikl
Chef d'équipe
Chef d'équipe
Messages : 85
Inscription : 15 août 2008, 02:00

Re: [PROJ] / [REAL] Robot tondeuse

Message par mikl » 14 juin 2015, 22:17

Bonjours a tous.
J'ai fait des essais hier j'ai vue que le robot ce mettait parfois a tourné en rond et partait dans une direction, comme si il cherchais un cap et il c'est aussi complétement arrêter deux fois. :heink:

Comme je soupçonne la partie compas, je l'ai isolés dans le programme.
Pour facilité le débogage je me suis renseigner sur la connections sans fils, et c'est tellement simple que j'ai déjà commandé un module Bluetooth HC-06. Je n'aurais même pas a changer mon programme :love:

Avatar de l’utilisateur
matthieuweb
Ingénieur
Ingénieur
Messages : 380
Inscription : 17 nov. 2009, 01:00

Re: [PROJ] / [REAL] Robot tondeuse

Message par matthieuweb » 15 juin 2015, 11:04

Cool ca avance bien !

Une télémétrie c'est toujours pratique surtout pour un truc qui bouge ! Effectivement en Bluetooth ou wifi, c'est très simple à mettre en œuvre,

De mon coté j'avais trouvé un gros coffet electrique rectangulaire, mais... un robot rond c'est mieux pour tourner autours des massifs.

En fait que crois que je vais partir sur une topologie Roomba, avec un couvercle de poubelle pour le dessus et une planche de contre plaqué marine pour le plancher.

Reste a concevoir un détecteur d'obstacle type parechoc roomba, ou un truc du genre comme tes contacts en bandelettes de microswitchs...

Avatar de l’utilisateur
mikl
Chef d'équipe
Chef d'équipe
Messages : 85
Inscription : 15 août 2008, 02:00

Re: [PROJ] / [REAL] Robot tondeuse

Message par mikl » 17 juin 2015, 22:46

Oui c'est vrais que c'est mieux que le robot soit rond surtout a l'avant.
Au final ton robot vas ressembler un peu a une soucoupe volante :lol:

J'ai beaucoup de mal a trouver quelque chose de bien pour le parechoc.
Mes bouton sont des cms et je les ai soudé sur un fils dénudé de 8/10. J'ai déjà deux trois bouton qui on dessoudé :cry:, j'en ai eu pour environ 20€ les 24 Bouton et c'est pas le top pour le moment.
Si non j'avais pensé au détecteur sous les portail pour détecté un obstacle, j'ai trouvé seulement Tapeswitch comme revendeur mais c'est pas donné et c'est pas adapté pour faire des zones avec (parechoc droit, gauche...)
Image
le principes est bien, le plus dur c'est d'adapté.

Ou il reste une option, c'est de faire comme les robot aspirateur. Avoir un parechoc rigide qui appui sur quelque bouton bien positionner, mais c'est pas adaptée a mon robot, peut-être que toi tu peut le faire.

Avatar de l’utilisateur
matthieuweb
Ingénieur
Ingénieur
Messages : 380
Inscription : 17 nov. 2009, 01:00

Re: [PROJ] / [REAL] Robot tondeuse

Message par matthieuweb » 18 juin 2015, 11:46

Salut mikl,

C'est à peu près ça: une soucoupe volante... et solaire :) !

Je pense m’inspirer de ton idée, j'ai commandé 20 inters fin de course à roulette (au bout de la languette) que je vais positionner en périphérie du robot, sur la planche de contre plaqué marine qui servira de base.

Image

En enrobage externe à tout ça, (périphérie) je vais poser une garniture pour, à la fois cacher/étanchéifier les inters, mais aussi "lisser" la surface de contact pour protéger mécaniquement les interrupteurs des arêtes vives qu'offre le monde hostile de la Nature.

Comme garniture d'enrobage, je pense à un joint de haillon de coffre de voiture...

Avatar de l’utilisateur
Morb@ck
Ingénieur
Ingénieur
Messages : 353
Inscription : 31 oct. 2004, 02:00

Re: [PROJ] / [REAL] Robot tondeuse

Message par Morb@ck » 18 juin 2015, 13:11

Faudrait pas qu'un pissenlit soit vu comme un obstacle :D

Avatar de l’utilisateur
matthieuweb
Ingénieur
Ingénieur
Messages : 380
Inscription : 17 nov. 2009, 01:00

Re: [PROJ] / [REAL] Robot tondeuse

Message par matthieuweb » 18 juin 2015, 13:35

Tout a fait, ce qui exclue l'infra-rouge ou les ultrasons ! Pourtant plus simple à mettre en œuvre :(

Avatar de l’utilisateur
mikl
Chef d'équipe
Chef d'équipe
Messages : 85
Inscription : 15 août 2008, 02:00

Re: [PROJ] / [REAL] Robot tondeuse

Message par mikl » 18 juin 2015, 21:37

Faudrait pas qu'un pissenlit soit vu comme un obstacle :D
Moi je m'en fou j'ai pas de pissenlit dans ma pelouse :p

Mes capteur ir sont a 14cm du sol et l'ultrason a 18cm et sa me pose pas de problème puisque j'ai prévu de le mettre en route régulièrement (2-3 fois par semaine).
Image
Ici la pelouse a pas été tondu depuis plus d'une semaine.

Bien vue matthieuweb pour la garniture, moi j'ai remarquer que de l'herbe coupé finissaient toujours par remonté sous le capot et je sais pas si avec le temps sa pourrai pas gêner avec mes micro-interrupteurs.

En attendent je fais des essais et c'est pas mal sans le GY-80 et en oubliant les problèmes de mesure de la capacité des batterie qui arrête le robot 15min après une charge complète :fou: ,donc j'attend avec impatience mon module Bluetooth, peut-être demain :ange:

Répondre

Revenir à « Robotique »