Commande servo directe sur port // en C++

Fermé
kapack Messages postés 179 Date d'inscription vendredi 16 mai 2008 Statut Membre Dernière intervention 21 août 2012 - 9 avril 2009 à 17:22
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 - 16 avril 2009 à 09:37
Bonjour,
Je cherche en quelques ligne de C++ à commander un servomoteur de modélisme directement branché sur le port // ou pour le dire autrement envoyer 1 impulsion entre 1 ms et 2 ms répété toutes les <20ms sur le bit où est branché la commande du servo.
A voir également:

3 réponses

Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 193
9 avril 2009 à 17:29
la commande pour ecrire sur le port parallelle, c'est
#include <conio.h>
_outp(adresse,valeur);

pour la pause, c'est
#include <windows.h>
Sleep(temps);

donc avec ca, t'as cas faire (si par exemple t'es connecté sur la 1° broche du bus de données):

while(true)
{
Sleep(15);
_outp(0x378,2);
Sleep(1);
_outp(0x378,0);
}


si tu veux controller plusieurs cerveaux en meme temps, il faudra compliquer ca un peu... mais la tu peux deja en commander 1
0
kapack Messages postés 179 Date d'inscription vendredi 16 mai 2008 Statut Membre Dernière intervention 21 août 2012 12
13 avril 2009 à 14:33
merci nablas, juste une précision pour être sùre,

while(true) //la boucle, tant que je ne sais pas quoi est vrai, ça répète ce qui est entre pseudo parenthèse
{
Sleep(15); //15 c'est en ms et c'est l'attente avant la première impulsions ?
_outp(0x378,2); //envoit 2 sur le pin 0, où 2 est en ms est c'est la position du servo que l'on demande et là, c'est à fond d'un coté
Sleep(1); //délai d'attente de 1 ms
_outp(0x378,0); //envoit 0 sur le pin 0 du port parallèle
}
en fait je ne comprends pas très bien, pour être humble et franc
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 193
13 avril 2009 à 20:56
while(true) //répeter indéfiniment ce qui est entre acolades
{
Sleep(15); //fais une pause de 15 ms (c'est pour ta condition <20ms ... tu mets ce que tu veux comme délai)
_outp(0x378,2); //on met le bit de poid positionnel 2 (sur les lignes d0 à D7 ce sera D1) à l'état haut (1)-> j'ai expliqué en dessous comment déterminer quels bits de données tu va activer)
Sleep(1); //délai d'attente de 1 ms
_outp(0x378,0); //on remet tout les bits d0 a d7 à l'état bas (0)
}


les bits d0 à D7 coreespondent je croi aux broches 2 à 9 du port parallele
leur poid positionnel est
d0 1
d1 2
d2 4
d3 8
d4 16
d5 32
d6 64
d7 128

si tu veux activer par exemple D0 et D5 en meme temps, il faudra alors faire un _outp(0x378,(1+32));
les problèmes aque tu peux rencontrer sont: leport parallele qui ne délivrre pas assez de courant pour piloter le cervo-> dans ce cas il faudra mettre un petit montage (un transistor une résistance, et une alimentation (celle du PC ferai l'affaire).

si tu veux piloter tes cervo a des rythmes différents, il faudra faire un programme un peu plus complexe (avec threads et sémaphores)

pour tester deja le fonctionnement du programme, je te conseille de brancher une LED directement sur la sortie du port parallèle... le mieux est de lui mettre une petite résistance de 150 ohms, mais ca marche plutot bien sans....
tu mets la cathode (coté plat) sur la masse du port parallèle (broches 18 à 25)

je te donne le brochage trouvé sur le net:
http://f6bxm.free.fr/carte%20son/images/1db25_LPT.gif
0
kapack Messages postés 179 Date d'inscription vendredi 16 mai 2008 Statut Membre Dernière intervention 21 août 2012 12
15 avril 2009 à 23:21
merci pour tes précieuse infos, après essai, apparement la fonction sleep n'est pas assez précise, est-ce qu'en assembleur il y aurais une chance pour que ce soit plus précis ?
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 193
16 avril 2009 à 09:37
ha, je me rapelle qu'un prof nous avait parlé de ce problème avec sleep ....
il y a une alternative, en C++, mais je la connais plus

sinon je viens de trouver ca:
http://www.programmersheaven.com/mb/CandCPP/277075/277078/re-pausing-execution-for-a-set-number-of-microseconds/

avec ce code:
void MicroDelay (long MicroSecs)
{
_asm {
mov cx, word ptr [MicroSecs+2]
mov dx, word ptr [MicroSecs]
mov ah, 0x86
int 0x15
}
}

// For delay in Milliseconds (1000 Milliseconds = 1 second)

void MilliDelay (long MilliSecs)
{
MicroDelay (MilliSecs * 1000);
}

attention, dans l'entete du message il parle de win32, docn je pense que c'est de l'assembleur x86. Si tu veux faire tourner ca en C++ sur du 64 bits, ca devrai fonctionner (sauf processeurs itaniums je pense). Par contre, si tu veux faire tourner sur un microcontrolleur, ou sur du vieux ac, ca passera pas....
0