Aller au contenu


Photo
- - - - -

Robot balayeur


23 réponses à ce sujet

#1 j-l freerider

j-l freerider

    Membre

  • Membres
  • 16 messages

Posté 22 décembre 2013 - 06:17

Salut !

Donc je vous présente mon 1er projet robotique, un robot balayeur,.
Je suis pas le 1er et certainement pas le dernier a faire quelque chose du genre, juste l'architecture différente de se que j'ai pu voir ici et là.

Le châssis est réalisé avec de l'aluminium de récup', Les roues sont propulsée pas des petit servos modifiés pour fonctionner en rotation continu, Même chose pour le moteur de la brosse rotative.

Au niveau électronique, un PIC 16f88 s'occupe du contrôle des données, un capteur de distance IR Sharp posé sur un servomoteur pour la détection d'obstacle et une mesure de courant consommé sur les moteur des roue via le CAN du Pic, pour contourner un éventuel obstacle qui aurait échappé au capteur IR.

Je ne sais pas si mettre le programme du Pic est utile ? si besoin y'a qu'à demander smile.gif

Assez parlé : voici 2 vidéos de la bête:

 



1er Vidéo..

 



et la 2ème !

Bon visionnage ! happy.gif

J-L

Image(s) jointe(s)

  • DSC00396.jpg


#2 Uzrok

Uzrok

    Membre

  • Membres
  • 43 messages
  • Gender:Male

Posté 22 décembre 2013 - 07:18

Salutation,
ton robot est vraiment pas mal :ok: .Par contre je vois que tu utilise un capteur IR avec un servo pour le balayage optique.Pourais je savoir qu'elle à été ton approche de l'évitement d'obstacle avec ce robot.Je dois me décider niveau capteur ,de ce fait,à tu eu des problèmes avec le capteur sharp et quelle sont ses distances de champs.enfin,je trouve intéressant de connaitre le programme que tu as utilisé,du moins simplifier (pas le code source hein :laugh1: ).


#3 j-l freerider

j-l freerider

    Membre

  • Membres
  • 16 messages

Posté 23 décembre 2013 - 07:34

Salut,

Pour le capteur, j'ai utilisé le modele GP2Y0A41SK0F, qui délivre une tension de 0,4 à 2,25 V en sortie pour une distance comprise entre 4 à 30 cm.
La mesure est précise par contre c'est de L'IR donc très directif, il faut absolument que le capteur balai aussi large que la largeur du robot, si non difficile d'éviter un petit obstacle a coup sur.
L'approche de détection pour le programme :


Marche avant, Servo Ir à droite.
Si tension IR > à la référence(obstacle) alors rotation vers la gauche.
Si non marche avant, Servo Ir au centre
Si tension IR > à la référence(obstacle) alors marche arrière puis rotation vers la gauche.
Si non marche avant, Servo Ir à gauche
Si tension IR > à la référence(obstacle) alors rotation vers la droite
Si non marche avant, Servo Ir à gauche

Si mesure du shunt sur servo Roue (mesure de courant) > à la référence alors marche arrière puis rotation vers la droite.
Si non retour début programme.

Rien de compliqué en soit !
  • Uzrok aime ceci

#4 Uzrok

Uzrok

    Membre

  • Membres
  • 43 messages
  • Gender:Male

Posté 23 décembre 2013 - 01:09

Salut,

merci de votre réponse.Donc vous pensez qu'1 seul capteur Sharp avec balayage suffit pour un évitement dynamique ?.Le robot ici réalise un évitement qui m’intéresse car il tourne proportionnellement à l'angle d'approche de l'obstacle, c'est à dire un tout petit peu s'il est quasi parallèle à l'obstacle et beaucoup s'il arrive droit dessus(voir le paragraphe silence on tourne,à la fin).Le problème c'est qu'il comporte 3 capteurs sharps et je trouve que ça fait beaucoup :) pensez vous ,ainsi, qu'un évitement dynamique et si possible proportionnel au parallélisme de l'obstacle peut se faire avec seulement 1 ou deux capteur sharp ?.Votre robot tombe à pique en tout cas car c'est exactement le spécimen que je souhaitais interviwver-->un éviteur d'obstacle plutôt dynamique avec un capteur sharp IR sur servo ^_^

Merci et bon début d’après midi


#5 j-l freerider

j-l freerider

    Membre

  • Membres
  • 16 messages

Posté 23 décembre 2013 - 06:41

Je pense que sa doit être faisable, il suffit de faire en sorte que la période de manœuvre soit proportionnel ( ou inversement proportionnel suivant le capteur) à la tension lu par le Can provenant du capteur IR.
Mais pour que le programme traite l'information corectement il faut aussi connaitre la position du servo ou se trouve le capteur IR, et integré cette donné au calcul final.
Et ainsi déterminé la periode de manœuvre pour éviter l'objet.
  • Uzrok aime ceci

#6 Uzrok

Uzrok

    Membre

  • Membres
  • 43 messages
  • Gender:Male

Posté 23 décembre 2013 - 06:51

Ainsi,plus le robot est proche et plus il tournera.

-->Mais pour que le programme traite l'information correctement il faut aussi connaitre la position du servo ou se trouve le capteur IR, et intégré cette donné au calcul final.

Auriez vous un exemple simple :)
merci de vos réponse ^_^ .

#7 j-l freerider

j-l freerider

    Membre

  • Membres
  • 16 messages

Posté 23 décembre 2013 - 07:33

c'est simple : le Can serra lu par le programme après que celui ci est envoyé le PWM correspondant au servo.
et la position du servo devra resté la même pendant quelque millisecondes le temps que la mesure s'effectue.
ensuite le programme oriente le servo sur une autre position et on recommence. ^_^

#8 Uzrok

Uzrok

    Membre

  • Membres
  • 43 messages
  • Gender:Male

Posté 23 décembre 2013 - 07:42

En fait,qu'est-ce que la CAN (ne me taper pas :black_eye: ).Et comment intégrer les mesures au manœuvres,comment prendre en compte la position du servo si vous préférer.


Désoler de vous déranger dans votre post de présentation de projet :unsure:

#9 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 934 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 23 décembre 2013 - 08:27

En fait,qu'est-ce que la CAN (ne me taper pas :black_eye:/> ).Et comment intégrer les mesures au manœuvres,comment prendre en compte la position du servo si vous préférer.


Désoler de vous déranger dans votre post de présentation de projet :unsure:/>


Tes capteurs à infra rouge sont des capteurs analogique, un CAN c'est un convertisseur analogique numérique c'est à dire qu'il converti un signal analogique : celui de ton capteur en signal numérique qui sera facilement interprétable dans ton programme : en général si ta conversion se fait sur 10 bit ton convertisseur te retourne un chiffre entre 0 et 1023 ! =)

Bon courage pour la suite !

Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#10 j-l freerider

j-l freerider

    Membre

  • Membres
  • 16 messages

Posté 23 décembre 2013 - 10:54

Pour compléter la réponse de mike118 :

admettons que ton capteur envoie une tension de 3 volt au Can sa nous fait : ((1024 / 5v) * 3v) = 613 ( ou 5volt correspond a l'echelle pleine du Can)

ton programme lira le chiffre "613" pour 3 volts

donc il suffit d'écrir qu'elle chose du style :

Si valeur Can > à 613 alors :
virage gauche;

se n'est qu'un exemple bien sur , en espérant que sa t'éclairera.

Par contre personnellement je ne sais que programmer des PIC microchips et en langage Mikropascal.
Je ne connais strictement rien au Arduino et leur langage.

#11 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 934 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 24 décembre 2013 - 03:43

Moi aussi je suis d'avantage microchip ;)/> mais bon quand tu sais programmer tu t'en sors facilement avec une arduino : tu trouve deux exemple sur le net qui se rapprochent un peu de ce que tu veux faire et hop ton programme est fait rapidement ^^
Côté pic par contre moi j'ai une galère : trouver des librairies et me poser sur un compiler x) pour l'instant j'oscille entre xc et hi tech x) Le côté plein de librairie de arduino est quand même très séduisant ;)/> C'est parfois plus casse tête un pic, avec parfois quelques heures de lectures de datasheet et malgré tout ce que je sais déjà de ce côté j'ai encore pas mal de chose à apprendre ^^ @ ma quatrième utilisation d'un arduino j'ai l'impression de l'avoir utilisé à 50% x) Les pics ça fait bien plus longtemps que je l'ai utilise je fais quand même bien plus de chose avec et j'arrive à peine à les utiliser à 50% donc j'ai encore beaucoup de marge avec ;)
Tu travailles avec quels pic toi en ce moment ? ^^ ( autre que le 16f88 biensur ^^ )


Pour revenir côté arduino : avec arduino tu as une fonction analogRead(x) qui prend un int : x en paramètre, et qui te retourne le chiffre correspondant
en gros tu définis une variable can1 et une variable sensor1. Dans sensor1 tu mets un chiffre qui correspond au numéro de ta patte analogique, et dans ton code tu ecriras : can1=analogRead(sensor1);

Je ne l'avais pas dis avant mais ton robot est une belle réalisation =) un peu bruiyant à mon goût x) mais bon boulot quand même ! à bientôt !

Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#12 j-l freerider

j-l freerider

    Membre

  • Membres
  • 16 messages

Posté 24 décembre 2013 - 10:28

Salut,

C'est a dire que j'ai appris l'électronique seul il y'a 3 ans, j'avoue que le site sonelec-musique.com à été d'une grande aide !
Je suis loin d'être un électronicien confirmé et j'ai de grosse lacune en se qui concerne la programmation, C'est a force de décortiqué des code trouvé ici et là que j'apprend.

Il est vrai que ayant eu des programmes arduino devant les yeux, sa à l'aire bien plus intuitif que le mikropascal, et en plus il y'a des routines tout faite pour la gestion des servos, donc pour la robotique c'est idéal !
Mais j'ai tellement galéré à apprendre les Pics, leur particularités ainsi que le langage de programmation que j'ai " peur" de me lancé et de me perdre avec ses concurrents.

Si non je travaille avec des 12F675 (8 broches et Can), 16F628a (bon a tout faire mais pas de Can), 16F88 (générateur pwm et can) et 18F2520 (28 broches, 2 générateur pwm, 10 entré Can ect ..) que je ne dois même pas exploiter a 50 % ... lol

Je suis débutant donc à part utilisé les entrées en Can ou entré numérique, je ne sais pas utilisé les liasions serie, I2c ect, à vrai dire je n'ai même pas cherché, je me contente de faire avec se que je maitrise ... bref niveau débutant quoi :D/>

D'ailleurs il n'y a qu'a voir le programme utilisé pour le robot... loin d'être optimisée, au point d'avoir épuisé la routine (delay_) ... lool
Si sa te dit je veux bien posé mon code et que tu me conseille pour l'optimiser ?

Merci pour le robot ! Sur la Vidéo c'est vrai qu'il ronfle ! mais en réalité il fait pas autant de bruit que l'on pourrai le croire. Se qui fait du bruit c'est le servo su balai rotatif, qui est poussé a sa vitesse max, en même temps se n'est qu'un servo 8 grammes qui est surement une contrefaçon made in hongkong ..

a + :)

#13 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 934 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 24 décembre 2013 - 07:17

Le premier truc que je vais te conseiller c'est de te pencher sur les interruptions : que ce soit interruption du à un changement sur un port ( généralement le B x) ) ou par timer =) ça peut être très utile pour faire des tâches " en parallèle " ( les gillemets sont là car ce n'est pas réellement des actions en parallèle au sens stricte ^^ mais bon en gros ça permet d'éviter que ton pic attende sans rien faire ce qui est typique des delay ^^ donc tu peux faire quelque chose en attendant le moment venu de faire autre chose =).

Niveau pic en gros j'utilise des 12F1840 16F887 16F1939 18F4685 18F46(/26)K22 et puis ponctuellement quelques autres.

Après tu poste ton code si tu veux ;) je suis loin d'être le seul ici qui pourra avoir un regard critique sur l'optimisation et je suis loin d'être le mieux placé non plus ^^ Je pense qu'il y a bien meilleur que moi de ce côté sur le forum ;)

@+ =)

Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#14 j-l freerider

j-l freerider

    Membre

  • Membres
  • 16 messages

Posté 26 décembre 2013 - 09:47

Salut !

Je pose le code de mon programme, je rappel, je suis débutant se code fonctionne correctement, mais n'est certainement pas optimisé.
Donc quelque critiques de personnes plus habituées que moi à manier du Pic sont les bienvenus !

program mo_robot;  // Robot balayeur


// PIC 16F88 / int 8 MHz
// Written and compiled with MikroPascal Pro V5.30

var
  wIn1: word;
  wIn2: word;
  win3: word;
  win4: word;
  i: byte;
  i1: byte;
  i2: byte;
  i3: byte;
  i4: byte;
  i5: byte;
  i6: byte;
  
const
  cdo = 523; cdod = 554; cre = 587; cred = 622; cmi = 659;
  cfa = 698; cfad = 739; csol = 783; csold = 830; cla = 880;
  clad = 932; csi = 987;
  cdoG = 1046;

procedure Main_Init;
begin
  CMCON := CMCON or $07;  // turn off comparators
  CCP1CON := CCP1CON or %00001100; // turn on PWM
  OPTION_REG := %10000000; // pullup désactivé (bit 7 à 1)
  INTCON := $00;
  TRISA := %00001111;
  TRISB := %00000000;
  ANSEL := $00;
  ANSEL.ANS0 := 1; // set RA0 as analog input
  ANSEL.ANS1 := 1; // set RA1 as analog input
  ANSEL.ANS2 := 1; // set RA2 as analog input
  ANSEL.ANS3 := 1; // set RA3 as analog input
  ANSEL.ANS4 := 0; // set RA4 as digital I/O
  ANSEL.ANS5 := 0; // set RB6 as digital I/O
  ANSEL.ANS6 := 0; // set RB7 as digital I/O
  OSCCON := 0;
  OSCCON.IRCF2 := 1;
  OSCCON.IRCF1 := 1;
  OSCCON.IRCF0 := 1;
  ADC_Init;
  delay_ms(100);
  Sound_init(portb, 2);
end;

// Procedure de controle des servomoteur:

 // Roue gauche----------------------------------------------------------------

procedure PWM_9;
   begin
    PORTB.0 := 1;
    delay_us(1300);
    PORTB.0 := 0;
    delay_ms(5);
   end;

 procedure PWM_8;
    begin
      PORTB.0 := 1;
      delay_us(800);
      PORTB.0 := 0;
      delay_ms(5);
    end;
    
procedure PWM;
    begin
     {PORTB.0 := 1;
      delay_us(1435);}
      PORTB.0 := 0;
      delay_ms(5);
    end;

procedure pwm8;
   begin
    PORTB.0 := 1;
    delay_us(2000);
    PORTB.0 := 0;
    delay_ms(5);
   end;

procedure pwm9;
   begin
    PORTB.0 := 1;
    delay_us(1525);
    PORTB.0 := 0;
    delay_ms(5);
   end;



 // Roue droite----------------------------------------------------------------
 procedure PWM_9_;
   begin
    PORTB.1 := 1;
    delay_us(1280);
    PORTB.1 := 0;
    delay_ms(5);
   end;

 procedure PWM_8_;
    begin
      PORTB.1 := 1;
      delay_us(800);
      PORTB.1 := 0;
      delay_ms(5);
    end;
    
procedure PWM_;
    begin
    {PORTB.1 := 1;
      delay_us(1425);}
      PORTB.1 := 0;
      delay_ms(5);
    end;

procedure pwm8_;
   begin
    PORTB.1 := 1;
    delay_us(2000);
    PORTB.1 := 0;
    delay_ms(5);
   end;

procedure pwm9_;
   begin
    PORTB.1 := 1;
    delay_us(1590);
    PORTB.1 := 0;
    delay_ms(5);
   end;

//  Servo avec capteur infrarouge-----------------------------------------------

procedure pwmIR;
    begin
      PORTA.4 := 1;
      delay_us(1425);
      PORTA.4 := 0;
      delay_ms(2);
    end;

procedure pwmIR1;
    begin
      PORTA.4 := 1;
      delay_us(1925);
      PORTA.4 := 0;
      delay_ms(2);
    end;

procedure pwmIR2;
    begin
      PORTA.4 := 1;
      delay_us(925);
      PORTA.4 := 0;
      delay_ms(2);
    end;

 // Servo du Balai rotatif------------------------------------------------------


 procedure pwmB;
    begin
      PORTB.4 := 1;
      delay_us(2800);
      PORTB.4 := 0;
      delay_ms(2);
    end;

procedure pwmB1;
    begin
      PORTB.4 := 1;
      delay_us(1200);
      PORTB.4 := 0;
      delay_ms(2);
    end;

//------------------------------------------------------------------------------
// Procedure de synchronisation des servos:

procedure robot_1; // marche avant / servoIR à gauche
  begin
      i:=0;
      while i < 10 do
        begin
        inc(i);
        pwmIR1; PWM_9; PWM9_; pwmB;
    end;
  end;

procedure robot_courant;  // évitement après mesure de courant > à la référence
  begin
      i1:=0;
      while i1 < 60 do
        begin
        inc(i1);
        pwmB1; PWM8; PWM8_;
        end;
   end;
    
procedure robot_obstacle1;  //contournement par la droite
  begin
      i2:=0;
      while i2 < 30 do
        begin
        inc(i2);
        PWM9; PWM9_;
        end;
  end;
  
procedure robot_2; // marche avant / servoIR au centre
  begin
      i3:=0;
      while i3 < 10 do
        begin
        inc(i3);
        pwmIR; PWM_9; PWM9_; pwmB;
      end;
    end;

procedure robot_3; // marche avant / servoIR à droite
  begin
      i5:=0;
      while i5 < 10 do
        begin
        inc(i5);
        pwmIR2; PWM_9; PWM9_; pwmB;
    end;
  end;
  
procedure robot_obstacle2;  //contournement par la gauche
  begin
      i6:=0;
      while i6 < 30 do
        begin
        inc(i6);
        PWM_9; PWM_9_;
    end;
  end;
     

begin
  Main_Init;
  delay_ms(100);
  sound_play(cdo, 200);
  delay_ms(100);
  sound_play(cdo, 200);
  delay_ms(3000);
  
  sound_play(cla, 160);  // Intro musique  Mario Bros... (très important ..)
  delay_ms(2);
  sound_play(cla, 160);
  delay_ms(60);
  sound_play(cla, 180);
  delay_ms(60);
  sound_play(cfa, 160);
  delay_ms(2);
  sound_play(cla, 160);
  delay_ms(60);
  sound_play(cdoG, 180);
  delay_ms(420);
  sound_play(cdo, 180);

  delay_ms(1000);
  wIn2 := ADC_Read(1) ;  // lecture référence de réglage pour le capteur IR
  wIn4 := ADC_Read(2);   // lecture référence de réglage pour la mesure de courant
  while true do
  begin

     wIn1 := ADC_Read(0) ;  // lecture capteur IR
     if (wIn1 <= win2) then
       begin
        robot_1;

        wIn3 := ADC_Read(3);  // lecture pour mesure de courant
        if (wIn3 < win4) then
          begin
            robot_courant;
          end;

        wIn1 := ADC_Read(0) ;  // lecture capteur IR

        if (wIn1 > win2) then
          begin
            robot_obstacle1;
          end;
       end;

     wIn1 := ADC_Read(0) ;  // lecture capteur IR
     if (wIn1 <= win2) then
     begin
       robot_2;

       wIn1 := ADC_Read(0) ;  // lecture capteur IR
        if (wIn1 > win2) then
        begin
          robot_obstacle2;
        end;
     end;

      wIn1 := ADC_Read(0) ; // lecture capteur IR  
      if (wIn1 <= win2)  then
       begin
         robot_3;

         wIn1 := ADC_Read(0) ;  // lecture capteur IR
         if (wIn1 > win2) then
         begin
           robot_obstacle2;
         end;
      end;

       wIn1 := ADC_Read(0) ;  // lecture capteur IR
       if (wIn1 > win2) then
           begin
             PWM9; PWM_9_;
             PWM9; PWM_9_;
            end;

    end;
end.

J'ai déjà réussi à épuré pas mal le code en utilisant des boucles type " While Do ". Mais sa ne doit pas être parfait je pense.

#15 nvaste

nvaste

    Habitué

  • Membres
  • PipPip
  • 265 messages
  • Gender:Male
  • Location:Lyon, France
  • Interests:La robotique, l'électronique et la réalisation de projets concrets

Posté 26 décembre 2013 - 10:11

Tu as bien fais de mettre des commentaires ;) Je sais pas si on peut plus l'obtimiser mais dans tout les cas tant que ça fonctionne ça va xD ;)
01110.01001.00011.01111.01100.00001.10011

#16 j-l freerider

j-l freerider

    Membre

  • Membres
  • 16 messages

Posté 26 décembre 2013 - 10:23

Tu as bien fais de mettre des commentaires ;)/>/> Je sais pas si on peut plus l'obtimiser mais dans tout les cas tant que ça fonctionne ça va xD ;)/>/>


Les commentaires sa devrait être obligatoire ! lol
Comme tu dis tant que sa fonctionne ;)

#17 hmnrobots

hmnrobots

    Membre passionné

  • Membres
  • PipPipPip
  • 316 messages
  • Gender:Male
  • Location:Périphérie Nantes

Posté 27 décembre 2013 - 08:33

Bonjour
voilà un petit robot travailleur!
pour optimiser le code une première évolution consiste à remplacer toutes les procédures "PWM" par une function ayant pour paramètres PortNumber,TimeOn, TimeOFF.
Ceci permettrait ainsi d'avoir un balayage continu.

Cependant normalement les servos doivent être pilotés toutes les 20ms; pour ce faire, vu la taille du code, une procédure gérant les servos et qui n'est exécutée que toutes les 20ms est possible, le mieux étant de générer une interruption toutes 20ms.

Une question est ce que le code actuel permet déjà le balayage du centre de la pièce ?
une autre : schéma de la mesure du courant ? un shunt sur le 0 avec un ampli op non inverseur?

Bonne continuation
Faire simple, c'est déjà bien assez compliqué!
http://hmnrobots.blogspot.fr/

#18 j-l freerider

j-l freerider

    Membre

  • Membres
  • 16 messages

Posté 27 décembre 2013 - 11:32

Salut,

une première évolution consiste à remplacer toutes les procédures "PWM" par une function ayant pour paramètres PortNumber,TimeOn, TimeOFF.
Ceci permettrait ainsi d'avoir un balayage continu.


Pourrais tu devellopper si sa ne te dérange pas ? Que je comprenne bien le principe.

Cependant normalement les servos doivent être pilotés toutes les 20ms; pour ce faire, vu la taille du code, une procédure gérant les servos et qui n'est exécutée que toutes les 20ms est possible, le mieux étant de générer une interruption toutes 20ms.



Se sont des servo 8grammes numériques, donc avec mon programme un état bas de 5 ms permet d'interrompre les sacades que font les servos avec un état bas de 20 ms.

le balayage du centre de la pièce se fait " au hasard " des obstacles rencontré, mais il y'a une tendance à être plus sur les exterieurs de la pièce qu'au centre effectivement.

une autre : schéma de la mesure du courant ? un shunt sur le 0 avec un ampli op non inverseur?


Du tout ! mesure toute simple ( m'en vas faire un schema et je reviend ...)

et merci d'avoir pris un peu de temps pour répondre ;)

#19 j-l freerider

j-l freerider

    Membre

  • Membres
  • 16 messages

Posté 27 décembre 2013 - 12:13

et voila le schéma !


shunt courant.jpg



^_^

#20 hmnrobots

hmnrobots

    Membre passionné

  • Membres
  • PipPipPip
  • 316 messages
  • Gender:Male
  • Location:Périphérie Nantes

Posté 27 décembre 2013 - 12:28

Je vois que dans ton code tu as une quinzaine de fois sensiblement la même procédure :
procedure PWM_9;
begin
PORTB.0 := 1;
delay_us(1300);
PORTB.0 := 0;
delay_ms(5);
end;

il est donc plus simple et efficace de créer une fonction (function en Mikro mais je ne pratique pas ce langage) avec passage de paramètres un peu comme ceci

function PWM (NumPort, TimeOn, TimeOff)
begin
portB.NumPort :=1
delay_us(TimeOn)
portB.NumPort :=0
delay_ms(TimeOff)
end

je répète que je ne pratique ce langage alors il faut affiner mais l'usage des fonctions permet déjà de beaucoup optimiser le code.

Effectivement les servos numériques sont moins regardant sur la fréquence de rafraîchissement; il serait je pense quand même mieux de n'avoir qu'une seule procédure (appelée toutes les 5 ou 10ms) de gestion des servos car dans ton code tu cumules les Time OFF: rien que cette ligne "pwmIR1; PWM_9; PWM9_; pwmB" prends 14ms en Time OFF
Faire simple, c'est déjà bien assez compliqué!
http://hmnrobots.blogspot.fr/



Répondre à ce sujet



  


0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users