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...
J'ai effectivement compris maintenant, les fonctions QueryPerformanceFrequency et QueryPerformanceCounter inscrivent en fait une valeur dans la variable entre parenthèses.
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;
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!
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...
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.