P18f4550-USB-HIDBootloader-INTERFACE C++ pour controler moteur pas à pas
Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

P18f4550-USB-HIDBootloader-INTERFACE C++ pour controler moteur pas à pas



  1. #1
    benjac42

    P18f4550-USB-HIDBootloader-INTERFACE C++ pour controler moteur pas à pas


    ------

    Bonjour ,ayant déjà avancé dans mon projet consistant à commander un moteur pas à pas unipolaire, nous devons désormais commander ce moteur par le biais de notre PIC18F4550 avec son bootloader HID par USB. On va devoir créer une interface en visual c++ (comme l'exemple dans microchip_solutions/USB/Device_HID-Custom Demos/ puis Simple Demo-Windows Software) j'ouvre le fichier .sln pour voir la form dans Visual C++ Express, étant novices en c++ je souhaiterais si possible que vous m'expliquiez par étapes comment réaliser les actions ci-dessous:

    Faire un programme permettant de contrôler notre moteur pas à pas unipolaire en deux sens de rotation (on sort de notre pic par 4 sorties pour aller sur un ULN2803 et ensuite sur notre moteur pour infos) en C++ avec une fenêtre du type de l'exemple fournit par Microchip.

    Je vous remercie d'avance de votre aide et de vos conseils

    -----

  2. #2
    benjac42

    Re : P18f4550-USB-HIDBootloader-INTERFACE C++ pour controler moteur pas à pas

    Please up, nous n'arrivons pas à faire notre commande avec la routine de contrôle moteur ( 0001, 0010, 0100, 1000 exemple de sequences). Nous avons placé 4 leds qui vont représenté les 4 sorties reliées à ULN2803.

    Nous utilisons le main de l'application TOGGLE de Microchip mais n'arrivons pas à reproduire des séquences qui fonctionne
    Code:
    void ProcessIO(void)
    {   
        //Blink the LEDs according to the USB device status
        if(blinkStatusValid)
        {
            BlinkUSBStatus();
        }
    
        // User Application USB tasks
        if((USBDeviceState < CONFIGURED_STATE)||(USBSuspendControl==1)) return;
        
        //Check if we have received an OUT data packet from the host
        if(!HIDRxHandleBusy(USBOutHandle))				
        {   
            //We just received a packet of data from the USB host.
            //Check the first byte of the packet to see what command the host 
            //application software wants us to fulfill.
            switch(ReceivedDataBuffer[0])				//Look at the data the host sent, to see what kind of application specific command it sent.
            {
                case 0x80:  //Toggle LEDs command
    		        blinkStatusValid = FALSE;			//Stop blinking the LEDs automatically, going to manually control them now.
                    if(mGetLED_1() == mGetLED_2())
                    {
                        mLED_1_Toggle();
                        mLED_2_Toggle();
                    }
                    else
                    {
                        if(mGetLED_1())
                        {
                            mLED_2_On();
                        }
                        else
                        {
                            mLED_2_Off();
                        }
                    }
                    break;
                case 0x81:  //Get push button state
                    //Check to make sure the endpoint/buffer is free before we modify the contents
                    if(!HIDTxHandleBusy(USBInHandle))
                    {
                        ToSendDataBuffer[0] = 0x81;				//Echo back to the host PC the command we are fulfilling in the first byte.  In this case, the Get Pushbutton State command.
        				if(sw3 == 1)							//pushbutton not pressed, pull up resistor on circuit board is pulling the PORT pin high
        				{
        					ToSendDataBuffer[1] = 0x01;			
        				}
        				else									//sw3 must be == 0, pushbutton is pressed and overpowering the pull up resistor
        				{
        					ToSendDataBuffer[1] = 0x00;
        				}
        				//Prepare the USB module to send the data packet to the host
                        USBInHandle = HIDTxPacket(HID_EP,(BYTE*)&ToSendDataBuffer[0],64);
                    }
                    break;
    
                case 0x37:	//Read POT command.  Uses ADC to measure an analog voltage on one of the ANxx I/O pins, and returns the result to the host
                    {
                        WORD_VAL w;
                        
                        //Check to make sure the endpoint/buffer is free before we modify the contents
    	                if(!HIDTxHandleBusy(USBInHandle))
    	                {
    	                    w = ReadPOT();					//Use ADC to read the I/O pin voltage.  See the relevant HardwareProfile - xxxxx.h file for the I/O pin that it will measure.
    														//Some demo boards, like the PIC18F87J50 FS USB Plug-In Module board, do not have a potentiometer (when used stand alone).
    														//This function call will still measure the analog voltage on the I/O pin however.  To make the demo more interesting, it
    														//is suggested that an external adjustable analog voltage should be applied to this pin.
    						ToSendDataBuffer[0] = 0x37;  	//Echo back to the host the command we are fulfilling in the first byte.  In this case, the Read POT (analog voltage) command.
    						ToSendDataBuffer[1] = w.v[0];  	//Measured analog voltage LSB
    						ToSendDataBuffer[2] = w.v[1];  	//Measured analog voltage MSB
    
                            //Prepare the USB module to send the data packet to the host
    	                    USBInHandle = HIDTxPacket(HID_EP,(BYTE*)&ToSendDataBuffer[0],64);
    	                }					
                    }
                    break;
            }
            //Re-arm the OUT endpoint, so we can receive the next OUT data packet 
            //that the host may try to send us.
            USBOutHandle = HIDRxPacket(HID_EP, (BYTE*)&ReceivedDataBuffer, 64);
        }
    
        
    }//end ProcessIO
    Si vous pouviez nous aider pour le code et les HardwareProfile

  3. #3
    RicounetZap

    Re : P18f4550-USB-HIDBootloader-INTERFACE C++ pour controler moteur pas à pas

    Bonjour,

    Difficile d'aider sans avoir aucun renseignement. Mais la procédure est simple.
    Essayer de faire fonctionner le programme d'exemple de Microchip sur votre platine, ou monter une platine de test avec 2 leds (connectées sur les mêmes ports que ceux décrit dans le fichier HardwareProfile.h)
    Ensuite, on modifier le cablage pour faire correspondre le branchement des leds au branchement moteur et on modifie le fichier HardwareProfile.h en conséquence
    Ensuite, on ajoute 2 leds pour avoir les 4 commandes, on modifie le fichier HardwareProfile.h en conséquence, on modifie l'initialisation du PIC pour prendre en compte ces 2 nouvelles sorties et on modifie le code pour allumer également ces leds.
    On applique le tout sur la carte de base avec les moteurs.
    On peut également passer en débug afin de voir si la communication USB fonctionne correctement et que l'on reçoit bien les commandes.

    Cordialement
    N'importe quoi, for ever :-)

  4. #4
    benjac42

    Re : P18f4550-USB-HIDBootloader-INTERFACE C++ pour controler moteur pas à pas

    Je constate que je n'est pas était très précis sur nos étapes et sur quoi on bloque, je vais essayer de reprendre plus clairement.

    Tout d'abord nous avons copier l'exemple de Microchip dans "Microchip -Device -HID Custom Demo" le .mcp situé dans le dossier firmware (C18 PICDEM FSUSB) qui se rapproche le plus de notre platine d'essai qui est composé de l'alimentation par le cable USB qui fonctionne, de 4 leds branchées sur le PORTD qui s'allume parfaitement avec le programme mit ci-dessus mais un peu modifier pour prendre les 4 leds. Ensuite on a créé un dossier sur le bureau pour copier ce .mcp et le renommer. Dans ce dossier on a mit un sous dossiers lib_USB puis encore un sous-dossiers USB, on a mit dedans les differents fichiers .h et .c la compilation marche.

    Ensuite nous avons attaqué l'interface en C++ d’après l'exemple "Microchip -Device -HID Custom Demo" puis "Simple Demo -Windows Software" on à copier tout le fichier dans notre dossier sur le bureau puis on à modifier le programme pour avoir deux boutons qui font comme séquences marche avant et marche arrière. Voilà ou nous rencontrons nos difficultés, nous avon sun problème à réaliser cette étape en utilisant le buffer et l'information qu'il envoie, pour ensuite modifier le main.c
    Si vous pouviez nous aider pour cette étape d'avoir deux boutons qui commande les 4 leds dans un sens de rotation puis l'autre bouton dans l'autre sens.

    Code:
     * Function:        void ProcessIO(void)
     *
     * PreCondition:    None
     *
     * Input:           None
     *
     * Output:          None
     *
     * Side Effects:    None
     *
     * Overview:        This function is a place holder for other user
     *                  routines. It is a mixture of both USB and
     *                  non-USB tasks.
     *
     * Note:            None
    
     *******************************************************************/
    int n=0;
    int b=0;
    void ProcessIO(void)
    {   
    
        /*//Blink the LEDs according to the USB device status
        if(blinkStatusValid)
        {
            BlinkUSBStatus();
        }*/
    
        // User Application USB tasks
        if((USBDeviceState < CONFIGURED_STATE)||(USBSuspendControl==1)) return;
        
        //Check if we have received an OUT data packet from the host
        if(!HIDRxHandleBusy(USBOutHandle))				
        {   
            //We just received a packet of data from the USB host.
            //Check the first byte of the packet to see what command the host 
            //application software wants us to fulfill.
            if(ReceivedDataBuffer[0]== 0x78)				//Look at the data the host sent, to see what kind of application specific command it sent.
            {
    					n=1;
    					b=0;
    			
    		}
    		if(ReceivedDataBuffer[0]== 0x79)				//Look at the data the host sent, to see what kind of application specific command it sent.
            {
    					b=1;
    					n=0;
    		}
    
                
    
            if(ReceivedDataBuffer[0]== 0x37)				//Look at the data the host sent, to see what kind of application specific command it sent.
            { 	//Read POT command.  Uses ADC to measure an analog voltage on one of the ANxx I/O pins, and returns the result to the host
                    {
                        WORD_VAL w;
                        
                        //Check to make sure the endpoint/buffer is free before we modify the contents
    	                if(!HIDTxHandleBusy(USBInHandle))
    	                {
    	                    w = ReadPOT();					//Use ADC to read the I/O pin voltage.  See the relevant HardwareProfile - xxxxx.h file for the I/O pin that it will measure.
    														//Some demo boards, like the PIC18F87J50 FS USB Plug-In Module board, do not have a potentiometer (when used stand alone).
    														//This function call will still measure the analog voltage on the I/O pin however.  To make the demo more interesting, it
    														//is suggested that an external adjustable analog voltage should be applied to this pin.
    						ToSendDataBuffer[0] = 0x37;  	//Echo back to the host the command we are fulfilling in the first byte.  In this case, the Read POT (analog voltage) command.
    						ToSendDataBuffer[1] = w.v[0];  	//Measured analog voltage LSB
    						ToSendDataBuffer[2] = w.v[1];  	//Measured analog voltage MSB
    
                            //Prepare the USB module to send the data packet to the host
    	                    USBInHandle = HIDTxPacket(HID_EP,(BYTE*)&ToSendDataBuffer[0],64);
    	                }					
                    }
            }     
         }
            //Re-arm the OUT endpoint, so we can receive the next OUT data packet 
            //that the host may try to send us.
            USBOutHandle = HIDRxPacket(HID_EP, (BYTE*)&ReceivedDataBuffer, 64);
    	if(n==1&&b==0)
    {
    marche_av();
    }
    	if(n==0&&b==1)
    {
    marche_ar();
    }
    
    
    
        
    }//end ProcessIO
    Nous avons utilise un système avec deux variables "n" et "b" pour utiliser deux boutons sur la Windows form en C++, mais le résultat n'est pas satisfaisant ...
    Je met en image le code des deux boutons et l'image de la windows form, on a essayer avec une check box mais c'etait pas ça non plus ...Sans titre.png Sans titre2.png

    Vous pouvez voir on a mit en C++ que notre buffer envoie 0x78 pour un bouton et 0x79 pour l'autre bouton, ces valeurs sont utilisée dans le main.c. Si vous pouviez donc nous aider pour avancer et avoir quelque chose qui fonctionne et surtout de clair, parce que je trouve que notre programme est une vrai usine à gaz ...
    Dernière modification par benjac42 ; 15/05/2013 à 10h38.

  5. A voir en vidéo sur Futura
  6. #5
    RicounetZap

    Re : P18f4550-USB-HIDBootloader-INTERFACE C++ pour controler moteur pas à pas

    Bonjour,

    Le problème dans une communication, c'est de savoir si le message est bien envoyé et s'il est bien reçu. Pouvez vous mettre un point d'arrêt sur la réception USB du Pic ?
    Si oui, vérifier le buffer de réception, je me demande pas s'il y a un décalage
    Avez vous vérifier le retour de WriteFile ainsi que lenombre d'octets envoyés ?

    Cordialement
    N'importe quoi, for ever :-)

  7. #6
    benjac42

    Re : P18f4550-USB-HIDBootloader-INTERFACE C++ pour controler moteur pas à pas

    Je ne pense pas qu'on puisse le faire parceque le main.c on le compile avec Mplab V8.90 ensuite on l'envoi au pic par le biais de l'USB (d'ou le Bootloader etc... fonctionnement de ça niquel) ensuite on ouvre notre logiciel (Visual C++) puis l'application .sln et on lance la fenetre que j'ai mit en photo ci-dessus. A l'appuie sur un bouton on n'a une séquence qui se produit (on à utiliser une boucle for pour paramétrer une durée de x boucles) , mais nous voulons faire la chose suivante mettre deux boutons marche avant / marche arrière et que quand on appuie sur un la séquence de fonctionnement soit "infinie" tant que on appuie pas sur l'autre bouton pour changer de sens ou pour arrêter complétement le moteur. Mais je pense et je suis quasi_sur que la communication se produit correctement.

  8. #7
    RicounetZap

    Re : P18f4550-USB-HIDBootloader-INTERFACE C++ pour controler moteur pas à pas

    Bonjour,

    Avez vous des I/Os disponibles sur votre PIC ?
    Si oui, pouvez vous inverser l'état d'une led lors de la réception du caractère 0x78 et faire la même chose lors de la réception du caractère 0x79 ?
    Il y a un émetteur, un récepteur et une commande : d'où vient l'erreur ? Il faut essayer de situer le problème avant de le régler. Le message est il bien envoyé, le message est il bien reçu, le message est il bien traité ?
    Dans mon cas strictement personnel, le quasi-sur n'a jamais fonctionné
    N'importe quoi, for ever :-)

  9. #8
    benjac42

    Re : P18f4550-USB-HIDBootloader-INTERFACE C++ pour controler moteur pas à pas

    Bonjour,

    C'est sur que le message est bien reçu et envoyé le toggle fonctionnait parfaitement, ce matin nous avons réussi à faire tourner le moteur avec son interface c++. C'etait un problème de faux contact

Discussions similaires

  1. [Programmation] contrôler un moteur pas a pas...
    Par invitec20c017b dans le forum Électronique
    Réponses: 5
    Dernier message: 21/03/2016, 21h33
  2. Controler moteur pas a pas avec une carte arduino
    Par zaille32 dans le forum Électronique
    Réponses: 2
    Dernier message: 03/10/2012, 00h25
  3. Contrôler un moteur pas à pas
    Par Tidus1707 dans le forum Électronique
    Réponses: 37
    Dernier message: 09/07/2011, 19h58
  4. interface pour controler un moteur avec un pc
    Par mokmap dans le forum Électronique
    Réponses: 33
    Dernier message: 01/09/2009, 17h29
  5. Programmer un carte Arduino pour contrôler un moteur pas à pas
    Par JFSGeneva dans le forum Électronique
    Réponses: 2
    Dernier message: 22/05/2008, 06h28
Découvrez nos comparatifs produits sur l'informatique et les technologies.