summaryrefslogtreecommitdiff
path: root/m/motors/motors.pl
blob: 8e49a1c3e48a3269e56b4957cf300bc42d6059eb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
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);