summaryrefslogtreecommitdiff
path: root/m/motors/motors.pl
blob: c388ea314ff33f11e0eb6e8cceb7a348c64df455 (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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#!/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
    },
    'RE025G' => {
	U => 12,	# Tension nominale, V
	n_0 => 6800,	# Vitesse � vide, tr/min
	M_H => 146,	# 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)^2
    # 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_begin
{
    print <<EOF;
m  d  motor    gears     V_0     a_H     res tau_m_G
EOF
}

sub compute_end
{
    print <<EOF;

m : masse (kg)
d : diam�tre des roues (mm)
V_0 : vitesse � vide (m/s)
a_H : acc�l�ration au d�marrage (m/s^2)
res : r�solution du codeur (mm)
tau_m_G : temps pour arriver � 63% de la vitesse (s)
EOF
}

sub compute
{
    my ($r, $mn, $gn) = @_;
    my ($m, $g) = ($motors{$mn}, $gears{$gn});
    printf "%2d %2d %-8s %-5s %7.3f %7.3f %7.4f %7.3f\n",
	$$r{m}, $$r{d}, $mn, $gn,
	comp_max_speed ($r, $m, $g),
	comp_a_H ($r, $m, $g),
	comp_cod_res ($r, $m, $g) * 1000,
	comp_tau_m_G ($r, $m, $g);
}

compute_begin;
for (keys %motors)
{
    compute ({ m => 10, d => 80 }, $_, 10);
    compute ({ m => 10, d => 80 }, $_, 20.25);
    compute ({ m => 10, d => 60 }, $_, 10);
    compute ({ m => 10, d => 60 }, $_, 20.25);
    compute ({ m => 10, d => 40 }, $_, 10);
    compute ({ m => 10, d => 40 }, $_, 20.25);
}
compute_end;