summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--m/motors/motors.pl104
1 files changed, 104 insertions, 0 deletions
diff --git a/m/motors/motors.pl b/m/motors/motors.pl
new file mode 100644
index 0000000..8e49a1c
--- /dev/null
+++ b/m/motors/motors.pl
@@ -0,0 +1,104 @@
+#!/usr/bin/perl
+#
+# Script de calcul de moteurs.
+#
+use warnings;
+use strict;
+
+my $pi = 3.14159265358979323846;
+
+my $cod = 2000;
+
+my %robot = (
+ m => 10, # Poid, kg
+ d => 80, # Diametre des roues, mm
+);
+
+my %motors = (
+ 'RE025CLL' => {
+ U => 12, # Tension nominale, V
+ n_0 => 4860, # Vitesse à vide, tr/min
+ M_H => 129, # Couple de démarage, mNm
+ },
+);
+
+my %gears = (
+ '10' => {
+ i => 10, # Rapport de réduction
+ ro_G => 0.75, # Rendement
+ },
+ '20.25' => {
+ i => 20.25, # Rapport de réduction
+ ro_G => 0.75, # Rendement
+ },
+);
+
+# Calcule la constante de temps mécanique. C'est le temps qu'il faut pour
+# atteindre 63% de la vitesse à vide.
+sub comp_tau_m_G
+{
+ my ($r, $m, $g) = @_;
+ # Sans réducteur :
+ # tau_m = J * R / k_m^2
+ # R / k_m^2 = (n_0 * (2pi rad/tr / 60 s/min)) / (M_H * (0.001 N/mN))
+ # J = m * (d/2 * 0.001 m/mm)
+ # Avec réducteur et deux moteurs :
+ # tau_m_G = tau_m / (i^2 * ro_G * 2)
+ my $r_ = $$r{d} / 2 / 1000; # Rayon, m
+ my $J = $$r{m} * $r_ * $r_; # Moment inertiel, kg/m^2
+ my $w_0 = $$m{n_0} * 2 * $pi / 60; # Vitesse angulaire à vide, rad/s
+ my $M_H = $$m{M_H} / 1000; # Moment de démarage, N.m
+ my $tau_m = $J * $w_0 / $M_H; # Constante de temps mécanique sans
+ # réducteur, s
+ my $tau_m_G = $tau_m / ($$g{i} * $$g{i} * $$g{ro_G} * 2);
+ return $tau_m_G;
+}
+
+# Calcule l'accélération au démarage
+sub comp_a_H
+{
+ my ($r, $m, $g) = @_;
+ my $r_ = $$r{d} / 2 / 1000; # Rayon, m
+ my $M_H = $$m{M_H} / 1000; # Moment de démarage, N.m
+ my $F_t = $M_H / $r_ * $$g{i} * $$g{ro_G} * 2; # Force tangentielle, N
+ return $F_t / $$r{m}; # Accélération linéaire, m/s^2
+}
+
+# Calcule la vitesse maximale sans frotement (utopique).
+sub comp_max_speed
+{
+ my ($r, $m, $g) = @_;
+ my $r_ = $$r{d} / 2 / 1000; # Rayon, m
+ my $w_0 = $$m{n_0} * 2 * $pi / 60; # Vitesse angulaire à vide, rad/s
+ return $w_0 / $$g{i} * $r_; # Vitesse linéaire à vide, m/s
+}
+
+# Calcule la résolution du codeur.
+sub comp_cod_res
+{
+ my ($r, $m, $g) = @_;
+ my $r_ = $$r{d} / 2 / 1000; # Rayon, m
+ return $r_ * 2 * $pi / $$g{i} / $cod;
+}
+
+sub compute
+{
+ my ($r, $mn, $gn) = @_;
+ my ($m, $g) = ($motors{$mn}, $gears{$gn});
+ #my ($in, $out, $def) = ("", "", "");
+ my ($in, $out, $def) = ("\e[31m", "\e[33m", "\e[0m");
+ print "m: $in$$r{m}$def, d: $in$$r{d}$def, motor: $in$mn$def, gears: $in$gn$def\n";
+ printf " vitesse max à vide : $out%.2f$def m/s\n", comp_max_speed ($r, $m, $g);
+ printf " accélération au démarage : $out%.2f$def m/s^2\n", comp_a_H ($r, $m, $g);
+ printf " résolution codeur : $out%.4f$def mm\n", comp_cod_res ($r, $m, $g) * 1000;
+ printf " tau_m_G : $out%.2f$def s (temps avant 63%% de la vitesse)\n",
+ comp_tau_m_G ($r, $m, $g);
+ print "\n";
+}
+
+compute ({ m => 10, d => 80 }, 'RE025CLL', 10);
+compute ({ m => 10, d => 80 }, 'RE025CLL', 20.25);
+compute ({ m => 10, d => 60 }, 'RE025CLL', 10);
+compute ({ m => 10, d => 60 }, 'RE025CLL', 20.25);
+compute ({ m => 10, d => 40 }, 'RE025CLL', 10);
+compute ({ m => 10, d => 40 }, 'RE025CLL', 20.25);