Bonjour et merci de prêter attention à mon post,
je pense bientôt devenir un membre actif de ce forum très intéressant.
Je développe en autodidacte depuis deux ans un robot, dont je concois les parties mécaniques, électronique et informatique.
Cela fait plusieurs semaines que je suis confronté à un problème de taille.
J'utilise des carte I2C de chez Devantech pour contrôler mes moteurs C.C ou Servos.
J'ai dors et déjà codé toute mon interface de pilotage du robot, qui marche à merveille.
Je génère donc sans problème dans un buffer ma trame à envoyer au port série virtuel (VCP de FTDI), qui passe donc dans l'USB avant d'etre mis en forme par le convertisseur pour le protocole I2C.
Voici la doc du fameux convertisseur (assez connu je pense):
http://www.robot-electronics.co.uk/htm/usb_i2c_tech.htm
J'ai bien lu et relu cette doc, et je pense avoir bien compris que il suffit d'envoyer la trame au port COM correspondant au VCP, et que le convertisseur se charge du protocole I2C.
Me confirmez vous ce point ?
J'ai bien réglé le port, comme indiqué (8dataBit 0parity, 2stop)
J'arrive à ouvrir le port. Les outils fournis par Devantech compilent bien sous Visual C++ et marchent...
Mon problème se situe donc sur le simple envoi de la trame.
Par exemple, pour régler le Servo1 à 1200µs, je dois comme il est écrit dans La Doc du controleur de Servomoteur SD21
Régler la position du servo en envoyant (dans le bon mode du convertisseur pour ce cas: 0x56) mot de 2bits (1200 sur 2bits correspond à 0x04 0xB0) sur deux registres dont je donne les adresses dans la trame.
En C (sous CVI avec sa librarie RS232), je pense pouvoir utiliser quelque chose comme:
Ceci est bien sûr une version très simplifiée de mon code, mais il illustre cette situation précise.Code:#include <rs232.h> #define COMPORTNUM 4 void main(void){ unsigned char buf[7]; int queuecount=0; buf[0] = 0x56; // I2C MODE (pour 2registres) buf[1] = 0xC2; // SD21 adress buf[2] = 0x02; // Low Byte register adress buf[3] = 0x01; // Hight Byte register adress buf[4] = 0x40; // Data bytes count buf[5] = 0x04; // LOW DATA buf[6] = 0xB0; // HIGH DATA OpenComConfig (COMPORTNUM, "COM4", 19200, 0, 8, 2, 512, 512); // on configure bien le port OpenCom (COMPORTNUM, "COM4"); // on l'ouvre queuecount = ComWrt (COMPORTNUM, buf, 6); // on y écrit la trame CloseCom (4); // et on referme
Au débeugeur, queuecount prend bien la valeur 6 qui est la valeur renvoyée par ComWrt indiquant le nombre de byte effectivement mis dans la queue.
Pourtant mon servo ne bouge pas d'un poil.
Si j'avais un oscilo sous la main je pourrais visualiser l'état de mes lignes I2C, mais ce n'est pas le cas.
Auriez vous une idée pour m'aider? Ou d'autre bibliothèques RS232 simple et utilisable en C++ sous Visual C++
Je n'ai pas le temps d'en dire plus tout de suite, j'attends votre aide avec (im)patience.
Si quelqu'un à de l'expérience avec ces modules, je serai prêt à le rencontrer.
Merci beaucoup et bonne journée à tous!
-----