#!/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 < 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;