Robot tondeuse arduino

j'ai regardé, il s'en sert au moins pour voir si le robot est coincé quelque part

    // Identify if the robot is stuck by checking if the sensor speed is lower than the m_fMotorSpeedForBeingStuckInCmPerSec.
    if (m_bCheckMotorSpeedForBeingStuck && m_fLeftSensorSpeedInCmPerSec < m_fMotorSpeedForBeingStuckInCmPerSec)
    {
//  #ifdef PRINT_OUT
      Serial.print("Left motor speed sensor detected low motor speed, Speed = ");
      Serial.println(m_fLeftSensorSpeedInCmPerSec);
//  #endif
      FastBackOffManeuver();
    }
 
    // Set right motor speed
    
    // Identify if the robot is stuck by checking if the sensor speed is lower than the m_fMotorSpeedForBeingStuckInCmPerSec.
    if (m_bCheckMotorSpeedForBeingStuck && m_fRightSensorSpeedInCmPerSec < m_fMotorSpeedForBeingStuckInCmPerSec)
    {
//  #ifdef PRINT_OUT
      Serial.print("Right motor speed sensor detected low motor speed, Speed = ");
      Serial.println(m_fRightSensorSpeedInCmPerSec);
//  #endif
      FastBackOffManeuver();
    }

donc c'est nécessaire

Bonjour et merci pour cette réponse

je vais donc essayer d'adapter ces codeurs sur mes moteurs, ce qui ne sera pas une partie de plaisir

Bonjour.

Pour ce qui est de monter 2 codeurs solidarisés avec les axes des roues, on n'est pas inquiets pour toi.

Aprés c'est juste du câblage et de l'adaptation de code en fonction du nombre de points par tours.

Exemple:

https://www.lextronic.fr/encodeur-rotatif-incremental-sen0230-40699.html

bonjour mon idée etait d'installe de tout petits codeurs provenant de moteurs installés sur des robots aspirateurs, j'en ais a la pelle de récup, mais effectivement celui le Lextronic serait plus adapté et l'adaptation plus facile, j'en posséde un aussi acheté sur aliexpress il y a belle lurette, mais pas au même prix (6€..)

le hic (pour moi) c'est l'adaptation du code

Bonjour osteblif

Aurais tu une photo en gros plan?

Là, aussi, as tu un lien ou une photo.

Je n'ai pas vu ton code pour ce qui est de l'adaptation, mais la lecture des encodeurs n'est pas très difficile.

A+
Cordialement
jpbbricole

Bonsoir,

Pour adapter le code, il faut je pense impérativement connaître la résolution (nombre de points par tours) du codeur utilisé dans le montage de Robert Malmstrom qui te sert d'exemple.

J'ai pas regardé sur le lien vers cette solution.

Et comparer cette résolution avec celle des codeurs que tu veux monter.

Avec un peu de chance, il faudra juste faire une régle de 3 pour modifier les valeurs dans le code?

Re:

J'ai l'impression que l'encoder fournit 11 tops par tour moteur AVANT réducteur, et sous toutes réserve, sur le lien menant au moteur, j'ai vu

Ratio = 600
Vitesse sortie réducteur = 10rpm

Donc vitesse entrée 6000rpm
Encodeur = 11top/tour

A vérifier si c'est le bon moteur
https://robertmalmstrom5.wixsite.com/robelibob/part-list

Voilà à premiére vue les donnés que j'ai trouvé.

Bonjour voiçi 2 photos de mes moteurs de traction et encodeur , concernant les moteurs j'etais parti sur un systéme de transmission par chaine avec le gros moteur rond mais finalement je vais opter pour une transmission directe sur l'axe de roue, ces moteurs on une demultiplication et sont hyper puissants, pas de soucis de ce coté là donc.
Le petit moteur donne une idée de la taille et certains robots tondeuses bas de gamme sont équipés de ce genre de moteur , avec démultiplication bien sur.

pour ce qui est des codeurs, j'avais pensé recuperer ceux de moteurs de robot aspirateur, identiques a ceux utilisés dans le montage, mais a vrai dire si il est possible d'adapter celui que je posséde déja ce serait un plus , pas de photo ne l'ayant pas retrouvé, mais c'est celui -ci
en 600pp et vendu sur aliex (entre autre) https://fr.aliexpress.com/item/1005005780216914.html?spm=a2g0o.productlist.main.35.3474fe1dipnalW&algo_pvid=935258f5-7dce-4b4f-8456-fb442fcabe34&algo_exp_id=935258f5-7dce-4b4f-8456-fb442fcabe34-17&pdp_npi=4%40dis!EUR!10.80!10.80!!!11.33!11.33!%40211b61bb17147286421017977e553d!12000034527971542!sea!FR!824887464!&curPageLogUid=1YBm41Vs6pS8&utparam-url=scene%3Asearch|query_from%3A


Bonjour comme tu peux le voir, ton codeur est identique a ceux montés sur les moteurs de robots aspirateurs et même (je pense) au montage de la tondeuse robot

je dois étudier la faisabilité

Bonjour osteblif

Ah! tu as autant de b....l que moi, des fois j'ai plus vite fait de commander en chine :rofl:

Ces encodeurs sont très bien, un 600 peut délivrer 2400 tics par tour, si nécessaire.
Pour ce qui est de l'adaptation au programme, c'est difficile à dire, pourrais tu le mettre en ligne?

A+
Bonne après-midi
jpbbricole

Bonjour,

Je vois que tu as 2 types de moto-réducteur avec transmissions directes.

Pense tu pouvoir y "coller" les encodeurs d'aspi que tu orésente en photo?

Sur l'axe avant ou aprés réduction?

Je suis nul en ce genre d'adaptation mécanique, je ne me rends pas compte de la faisabilité.

bord.. c'est peu dire! ça fait plus de 40 ans que je récupére et stocke tout ce qui est en rapport a mes passions , c.a.d électronique et mécanique/robotique, garage, grenier, bureau tout déborde et madame geu.., normal tu me diras , je ne range rien.

tu me demandes de mettre en ligne le programme? tout est dans l'article du concepteur non ?

oui mon idée et de percer l'arriere du carter du moteur de traction dans le prolongement de l'axe de sortie, ( comme si l'axe sortait des 2 cotés) d'y fixer un petit axe qui commandera le codeur, ou tout bêtement d'utiliser l'axe du petit moteur sans desacoupler son codeur et de fixer l'ensemble, mais ça fait un peu bricolage et pas tres fiable vu que ça va être soumis aux vibrations et poussieres . celui que tu as présenté (le gros) identique au mien serait plus adapté

La passion quoi :wink:

Je vais jeter un œil.

Bonne soirée
jpbbricole

Peut être qu'avec celui là, si tu a la place, une transmission poulies courroie permet de jouer sur le nombres de points par tour pour être compatible avec le code déja écrit?

Bonsoir osteblif

J'ai regardé le programme et à première vue, il n'utilise qu'une pin pour un capteur:
int iPinRightSpeedSensor = 3;
traitée en interruption:
attachInterrupt(digitalPinToInterrupt(iPinRightSpeedSensor), RightSpeedSensorInterrupt, RISING);
et traitée ici:

void RightSpeedSensorInterrupt()
{
	unsigned long ulCurrentTime;

	#ifdef PRINT_OUT
	Serial.print("RightSpeedSensorInterrupt");
	#endif
	
	ulCurrentTime = micros();

	// Make sure it´s not a bounce, should be more than 5 millisec between pulses.
	//  if (ulCurrentTime - m_ulRightLastSensorInterruptTime > 10000)
	{
		m_fRightTimePerPulseInSec = (float)(ulCurrentTime - m_ulRightLastSensorInterruptTime) / 1000000.0f;
		m_ulRightLastSensorInterruptTime = ulCurrentTime;
		m_bNewRightSpeedSensorPulse = true;
	}
}

Donc tu n'aurai besoin que d'un fil par capteur, mais j'ai pas trouvé comment il en déduit la distance?

La suite au prichain épisode :wink:

Bonne soirée
jpbbricole

Bonjour
Pourquoi dis tu un seul fil de cablage? le capteur doit exploiter ces 2 signeaux A et B donc 3 fils de sortie, sans parler de ceux de son alimentation .
Je ne connais pas la résolution des capteurs montés sur les petits motoreducteurs vendus sur Alixpress (et autres) et utilisés sur le montage, mais cette résolution ne doit pas etre élevée, je me demandais si au lieu de mettre cet énorme encodeur dont on a parlé, un simple encodeur de type "potentiometre" n'irait pas? c'est le type monté sur l'électroménager , par ex sur les fours micro ondes. Bon dimanche


moteur3

Bonjour oui tout est réalisable, mais il ne faut pas non plus que ce soit une "usine a gaz" avec poulies et renvois, je viens de me demander sir un encodeur type "potentiometre " ne pourrait pas aller.
une idée de la résolution des encodeurs montés sur les moteurs made in china du montage?

Bon dimanche

Bonjour,

Des codeurs que je montre post47, j'ai compris que sur 1 tour, il y avait 11 tops sur la phase A, et idem sur la phase B.

Et que le rapport de réduction était de 600.

D'ailleurs le fabricant indique que grâce à cela, il y a 600x11 tops par tour d'axe de sortie du réducteur.

Se sont, d'aprés la Doc post47, des codeurs par effet Hall, c'est à dire qu'il y aurait 11 aimants sur le disque, et 2 capteurs à l'extérieur.

Pour le confirmer, peut-être que tu peut voir et compter ces aimants?

Pour revenir sur le nombre de fils utiles au comptage, s'il y a 2 voies, A et B sur 1 codeur, c'est entre autre pour déterminer le sens de rotation du codeur dans les applications où c'est nécessaire.

Pour ce qui est de compter le nombres de points, même s'il y a 2 voies, tu peux n'en utiliser qu'une des 2.

Et c'est ce que @jpbbricole a constaté en décortiquant le code, dans l'application que tu veux utiliser, celui qui a écrit le code n'utilise qu'une voie.

Donc ormis les fils d'alimentation, il n'y a besoin que du fil voie A ou B peu importe la voie.

A propos de ton idée, post57 je ne connais pas la résolution de cet encodeur.

Mécaniquement parlant, vu qu'il est prévu pour être manipulé à la main, je ne sais pas s'il supporterait la vitesse de rotation avant réduction, je doute qu'il supporte de tourner vite.

J'imagine que pour le solidariser à un axe, il faut un soufflet ou un montage adapté pour rattraper les éventuels problémes d'alignements.

Et évidement, il y a aussi le PB d'étanchéifier le montage.

Aprés, d'un point de vue élec, je ne vois pas ce qui s'opposerait à utiliser ces signaux pour Arduino.

Encore une fois, le gros PB est d'adapter la résolution de cet encodeur au code que tu utilise, il faudrait arriver à trouver les bonnes données pour les adapter dans le code Arduino.

Je ne sais pas personnellement par où attraper le probléme.

  • Il faudrait je pense, décoder le code que tu veux utiliser pour y extraire les données, @jpbbricole a commencé à te donner des infos à ce propos (le code n'utilise qu'une voie codeur).

  • il faudrait aussi je crois faire des essais en dynamique avec l'encodeur que tu veut utiliser acouplé à un moteur ou une roue (selon ton idée) pour voir comment il se comporte, pour voir si à vitesse stable et rapide, il donne une mesure constante.
    Il faudrait peut-être aussi faire qq essais d'endurance.

Voili voilou.

Tout cas, tu l'aura compris, ce ne sont que des suggestions ouvertes, c'est toi le boss.

Non, 2 fils, le fil Switch étant le bouton poussoir (pression sur l'axe).
Utiliser un tel encodeur est une fausse bonne idée, mécaniquement, je doute qu'il résiste longtemps :woozy_face: Mais, pour faire des essais à la main, pourquoi pas.

Par lecture du programme, la définition d'unb moteur donne ceci:

int iPinRightSpeedSensor = 3;
int pinRightMotorBack = 7; // define pin7 as left back connect with IN1
int pinRightMotorForward = 8; // define pin8 as left forward connect with IN2
int pinRightMotorSpeed=6;

Donc, uniquement iPinRightSpeedSensor est utilisé, il est géré en interruption:

pinMode(iPinRightSpeedSensor, INPUT);

attachInterrupt(digitalPinToInterrupt(iPinRightSpeedSensor), RightSpeedSensorInterrupt, RISING);

L'interruption est traitée ici:

void RightSpeedSensorInterrupt()
{
	unsigned long ulCurrentTime;

	#ifdef PRINT_OUT
	Serial.print("RightSpeedSensorInterrupt");
	#endif
	
	ulCurrentTime = micros();

	// Make sure it´s not a bounce, should be more than 5 millisec between pulses.
	//  if (ulCurrentTime - m_ulRightLastSensorInterruptTime > 10000)
	{
		m_fRightTimePerPulseInSec = (float)(ulCurrentTime - m_ulRightLastSensorInterruptTime) / 1000000.0f;
		m_ulRightLastSensorInterruptTime = ulCurrentTime;
		m_bNewRightSpeedSensorPulse = true;
	}
}

et j'en déduis que ce n'est pas un encodeur qui est utilisé, mais un simple disque avec fourche optique comme celui-ci qui est utilisé:
image.
Autre constations, les seules autres lecture de ports concernent les RADAR, un fin de course et le bouton stop.
Si tu as un générateur, ce serai intéressant d'envoyer des impulsions sur ces entrées pour voir la réaction de la bête. Je peux t'en faire un avec un Arduino si nécessaire.

A+
Bon dimanche
jpbbricole