Port parallèle : pilotez jusqu'a 8 servomoteurs.

Soyez le premier à donner votre avis sur cette source.

Vue 22 070 fois - Téléchargée 4 005 fois

Description

Port parallèle : pilotez jusqu'a 8 servomoteurs.

Pour commander un bras de robot, table traçante, orientation webcam ou tout autres engins robotique...
Pour le cablage voir le fichier "LPTx_Servo.BMP".

Utilisation de « INPOUT32.DLL » -> dans zip.
Pour + d'infos sur cette DLL http://www.logix4u.net/

Bon pilotage !

ryl...

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

sparrow2104
Messages postés
2
Date d'inscription
samedi 7 avril 2007
Statut
Membre
Dernière intervention
9 juin 2013
-
Merci pour cette réponse rapide!
J'ai effectivement compris maintenant, les fonctions QueryPerformanceFrequency et QueryPerformanceCounter inscrivent en fait une valeur dans la variable entre parenthèses.
cirec
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 septembre 2019
32 -
Salut,

regarde cette reprise de la fonction de rylryl par Bactérius
il y a ajouté quelques commentaires qui devront t'aider à comprendre.

// Je vais modifier cette fonction pour la rendre plus lisible à moi
// Je cite donc son auteur : Rylryl !!

procedure Wait(MS: int64); // On fait une pause en microsecondes !!
var
Frq_Base, T_Mem,
T_Now, Dif: Int64;
begin
// On récupère l'indice fréquence du système
if QueryPerformanceFrequency(Frq_Base) then
begin
// On récupère le repère temps origine
QueryPerformanceCounter(T_Mem);
repeat
// On récupère le temps actuel
QueryPerformanceCounter(T_Now);
// On compare le temps actuel au temps d'origine
Dif := (T_Now - T_Mem) * 1000000 div Frq_Base;
until Dif > MS; // Jusqu'à ce qu'on ai atteint notre délai voulu
end;
end;
sparrow2104
Messages postés
2
Date d'inscription
samedi 7 avril 2007
Statut
Membre
Dernière intervention
9 juin 2013
-
Bonjour,

Je vois que le sujet n'a pas été traité depuis 2006 mais qui sait, peut être quelqu'un passera par ici pour répondre à ma question.

Je suis en fait intéressé par ce programme et plus particulièrement par la fonction d'attente, mais malheureusement je ne comprends pas tout.

Je n'ai retrouvé nulle part dans le programme d'initialisation ou de "remplissage" des variables Frq_Base, Time_memo et Time_Now. Du coup, je ne comprends pas bien à quoi servent la condition "if QueryPerformanceFrequency(Frq_Base) then" et les requêtes "QueryPerformanceCounter(Time_memo);" et "QueryPerformanceCounter(Time_Now);"

Quelqu'un, Ryl peut être, saurait-il donc m'expliquer un peu plus en détail cette partie du code?

Merci d'avance!
rylryl
Messages postés
328
Date d'inscription
mardi 9 mars 2004
Statut
Membre
Dernière intervention
15 décembre 2006
1 -
Bonjour SMDWD,

Cette simplification ne donnera rien de bon...
Cherche plutôt pouquoi "EAbstractError" mais n'ayant pas ce pb je ne peux pas t'aider (peut être un problème de "thread")...

A+
ryl...
smdwd
Messages postés
3
Date d'inscription
jeudi 19 octobre 2006
Statut
Membre
Dernière intervention
20 octobre 2006
-
Bonsoir Rylryl,

J'ai donc simplifié votre programme, il se compile bien, mais mon servo tourne de 30° à chaque
appuis sur le bouton envoyer (quelque sois la position du curseur), et ne tourne que dans un seul sens !
Je vous joint le code, si vous pouvez m'aider.... Merci !

==========================================================================

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
ButtonEnvoyer: TButton;
position1: TScrollBar;
procedure ButtonEnvoyerClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;

procedure Out32(PortAddress:word;Value:byte);stdcall;export;
external 'inpout32.DLL';

var
Form1: TForm1;
Valeur,LPTx:integer;

implementation

{$R *.DFM}

// Attendre N microSeconde
procedure DelayUS(MicroS: int64);
var Limite,Time_memo,Frq_Base,Time_now : Int64;
begin
if QueryPerformanceFrequency(Frq_Base) then
begin
QueryPerformanceCounter(Time_memo); // Repère temps
Limite := Time_Memo + round(MicroS * Frq_Base / 1000000); // calcul fait une seule fois
repeat
QueryPerformanceCounter(Time_now); // Comparer le Repère temps au temps actuel
until Time_now >= Limite; // Si pause pas suffisante recommencer
end;
end;



procedure TForm1.FormCreate(Sender: TObject);
begin
LPTx:=888; //LPT1 par defaut
end;


procedure TForm1.ButtonEnvoyerClick(Sender: TObject);
begin
out32(LPTx,1); // Servo sur Voie 1
DelayUS(position1.position); // Durée de l'impulsion pour cette voie
out32(LPTx,$00); // Forcer niveau bas
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
out32(LPTx,0); // Le Registre DATA est mis à zero
end;

end.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.