summaryrefslogtreecommitdiff
path: root/m/motors/motors.pl
blob: 1f173ac566565383958dc64261a3c24516f2bdbb (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
#!/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;
compute ({ m => 10, d => 80 }, 'RE025CLL', 10);
compute ({ m => 10, d => 80 }, 'RE025G', 20.25);
compute ({ m => 10, d => 60 }, 'RE025CLL', 10);
compute ({ m => 10, d => 60 }, 'RE025G', 20.25);
compute ({ m => 10, d => 40 }, 'RE025CLL', 10);
compute ({ m => 10, d => 40 }, 'RE025G', 20.25);
compute_end;