IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Récupération de données d'accélération


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 58
    Points : 31
    Points
    31
    Par défaut Récupération de données d'accélération
    Bonjour à tous,

    Dans le cadre d'un projet professionnel, j'ai à mettre un œuvre l'acquisition de données d'accélérations sur une application en C++ (développée sur C++ Builder XE2).

    J'ai donc pour le moment, réussi à mettre en place la communication avec mon accéléromètre (qui est un JoyWarrior 24F8), j'arrive donc à récupérer dans un timer les données de position (pas très compliqué).

    Mon problème se situe au niveau de l'accélération, car en effet, la position ... je m'en moque un peu, il me faut l'accélération pour pouvoir connaître la vitesse (et si mon appareil avance, ou recule), je n'ai absolument rien trouvé pour pouvoir récupérer ça. J'ai bien des petits softs fournis avec l'accéléromètre, dans l'un deux il semble y avoir la récupération des données qui m'intéressent, mais hélas, je n'arrive pas à intégrer ce code source (enfin j'arrive à le mettre, mais j'ai des valeurs nulles).

    Voici le code sur lequel je me fracasse le crâne depuis deux jours entiers :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
    /*
    Read acc-register
    */
    void TForm1::ReadAxes(HANDLE handle)
    {
    	AnsiString lsb, msb, calc;
     
    	unsigned char tLSB, tMSB;
    	short iDouble;
    	unsigned char LSB[3] = {0x02, 0x04, 0x06};
    	unsigned char MSB[3] = {0x03, 0x05, 0x07};
    	char axe[3] = {'X', 'Y', 'Z'};
     
    	AnsiString values[3];
     
    	HidD_FlushQueue(handle); //clear Hid-Queue
     
    	for(int i=0; i<3; i++)
    	{
    		tLSB = ReadData(handle, 0x82, LSB[i]);
    		tMSB = ReadData(handle, 0x82, MSB[i]);
     
    		iDouble = CalcMsbLsb(tLSB, tMSB);
    		calc.Format(_T("%d"), iDouble);
    		values[i] = calc;
    	}
     
    	Edit4->Text=values[0];
    	Edit5->Text=values[1];
    	Edit6->Text=values[2];
    };
     
     
    /*
    Read data to device
    */
    unsigned char TForm1::ReadData(HANDLE handle, unsigned char cmd, unsigned char addr)
    {
    	unsigned char			WriteBuffer[12];
    	unsigned char			ReadBuffer[12];
    	unsigned char			newAddr;
    	unsigned long			BytesWritten = 0;
    	unsigned long			NumberOfBytesRead = 0;
    	bool				        Result;
     
    	newAddr = 0x80 | addr;
     
    	memset(&WriteBuffer, 0, Capabilities.OutputReportByteLength+1);
     
    	WriteBuffer[0] = 0x00;
    	WriteBuffer[1] = cmd;
    	WriteBuffer[2] = newAddr;
     
    	Result = WriteFile(handle, &WriteBuffer, Capabilities.OutputReportByteLength, &BytesWritten, NULL);
     
    	if(Result != NULL)
    	{
    		memset(&ReadBuffer, 0, Capabilities.InputReportByteLength+1);
    		ReadBuffer[0] = 0x00;
     
    		ReadFile(handle, &ReadBuffer, Capabilities.InputReportByteLength, &NumberOfBytesRead, NULL);
    		return ReadBuffer[3];
    	}
    	else
    		return 0;
    };
     
     
    /*
    Calculate acc-value from MB and LSB into short
    */
    short TForm1::CalcMsbLsb(unsigned char lsb, unsigned char msb)
    {
    	short erg;
    	short LSB, MSB, EXEC;
    	short TEMP = 0x0000;
     
    	EXEC = (msb & 0x80) << 8;
    	EXEC = EXEC & 0x8000;
     
    	/*Calcluate nagative value*/
    	if(EXEC & 0x8000)
    		EXEC = EXEC | 0x7C00;
     
    	MSB = msb << 2;
    	MSB = MSB & 0x03FC;
    	LSB = (lsb & 0xC0) >> 6;
    	LSB = LSB & 0x0003;
     
    	erg = MSB | LSB | EXEC;
     
    	return erg;
    };

    Voilà, donc j'intègre ce code directement dans le .h, et j'effectue de simples appels de fonctions où bon me semble (notamment dans un timer donc).

    En espérant que quelqu'un s'y connaisse !

    Cordialement.

  2. #2
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Je vais probablement dire une idiotie mais si tu connais la position à un temps t et la position à un temps t+1 tu peux calculer la vitesse non ? La formule étant v = d / t. (d = position 1 - position 2 et t = (t+1) - t).

    Il te suffit d'échantillonner toutes les x millisecondes et voila non ?

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    effectivement, si tu cherches la vitesse et possèdes les positions, tu as tout ce qu'il faut comme données.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 58
    Points : 31
    Points
    31
    Par défaut
    Ça n'est pas une idiotie, mais j'y avait déjà pensé, le problème étant que la position que l'accéléromètre me donne, équivaut plus à sa propre inclinaison sur les trois axes, que sa position dans l'espace.

    En gros, j'ai beau le bouger comme je veux, quelque soit l'endroit où il est, au "repos" les valeurs indiquées sont sensiblement les mêmes.

    Du coup ce qui m'intéresse le plus, c'est surtout de récupérer l'accélération lors du mouvement de l'appareil, la multiplier par la valeur de mon timer, puis avoir la vitesse de déplacement.
    En gros, j'ai besoin de la vitesse, pour savoir de combien je me déplace (je dois faire un "point" tout les 11m à peu près), et si je recule ou j'avance (pour "réguler" le déplacement, justement).

    EDIT : Puis honnêtement, avec ce qu'il me renvoie, je vois pas trop ce que je peux faire de la position.




    EDIT2 : Au niveau du code que je vous ai fourni, il semblerait qu'une erreur se situerait là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    memset(&WriteBuffer, 0, Capabilities.OutputReportByteLength+1);
     
    		WriteBuffer[0] = 0x00;
    		WriteBuffer[1] = cmd;
    		WriteBuffer[2] = newAddr;
     
    		Result = WriteFile(handle, &WriteBuffer, Capabilities.OutputReportByteLength, &BytesWritten, NULL);
     
    		if(Result != NULL)
    		{
    			memset(&ReadBuffer, 0, Capabilities.InputReportByteLength+1);
    			ReadBuffer[0] = 0x00;
     
    			ReadFile(handle, &ReadBuffer, Capabilities.InputReportByteLength, &NumberOfBytesRead, NULL);
    			return ReadBuffer[3];
    		}
    		else
    			return 0;
    Result est constamment égal à "NULL", et la fonction memset également.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 58
    Points : 31
    Points
    31
    Par défaut
    D'après les nombreux tests que j'ai effectué en mode débogage, la fonction WriteFile renvoie le code d'erreur N°87, qui signifie qu'il y a un paramètre invalide dans la fonction.

    Au début j'ai constaté que l'erreur était la N°6 (handle invalide) car le handle était égal à "NULL", j'ai donc utilisé l'original, mais toujours une erreur à ce niveau.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 58
    Points : 31
    Points
    31
    Par défaut
    Re bonjour,

    J'ai réglé mon problème au niveau de la fonction WriteFile (le handle semblait ne pas être le bon en fin de compte, elle me renvoie bien true désormais).

    MAIS, oui car il y a toujours un mais en programmation, j'ai l'impression que mes valeurs d'accélération ne sont pas rafraîchies, mais c'est bel et bien le cas, le fait est que je reçois constamment les mêmes valeurs, même si je secoue l'accéléromètre dans tout les sens, comme si je voulais faire une mauvaise blague avec une canette de coca.

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
     
    /*
    	Read data to device
    	*/
    	unsigned char TForm1::ReadData(HANDLE handle, unsigned int cmd, unsigned int addr)
    	{
    		unsigned int			WriteBuffer[12];
    		unsigned int			ReadBuffer[12];
    		unsigned int			newAddr;
    		unsigned long			BytesWritten;
    		unsigned long			NumberOfBytesRead = 0;
    		bool				    Result;
     
    		newAddr = 0x80 | addr;
     
    		memset(&WriteBuffer, 0, Capabilities.OutputReportByteLength+1);
     
    		WriteBuffer[0] = 0x00;
    		WriteBuffer[1] = cmd;
    		WriteBuffer[2] = newAddr;
     
    		Result = WriteFile(handle, &WriteBuffer, Capabilities.OutputReportByteLength, &BytesWritten, NULL);
     
    		if(Result == false)
    		{
    			AnsiString error;
    			error=GetLastError();
    			Edit7->Text=error;
    		}
     
    		if(Result != false)
    		{
    			memset(&ReadBuffer, 0, Capabilities.InputReportByteLength+1);
    			ReadBuffer[0] = 0x00;
     
    			ReadFile(handle, &ReadBuffer, Capabilities.InputReportByteLength, &NumberOfBytesRead, NULL);
    			return ReadBuffer[3];
    		}
    		else
    			return 0;
    	};
     
    	/*
    	Calculate acc-value from MB and LSB into short
    	*/
    	short TForm1::CalcMsbLsb(unsigned int lsb, unsigned int msb)
    	{
    		short erg;
    		short LSB, MSB, EXEC;
    		short TEMP = 0x0000;
     
    		EXEC = (msb & 0x80) << 8;
    		EXEC = EXEC & 0x8000;
     
    		/*Calcluate nagative value*/
    		if(EXEC & 0x8000)
    			EXEC = EXEC | 0x7C00;
     
    		MSB = msb << 2;
    		MSB = MSB & 0x03FC;
    		LSB = (lsb & 0xC0) >> 6;
    		LSB = LSB & 0x0003;
     
    		erg = MSB | LSB | EXEC;
     
    		return erg;
    	};
    	void TForm1::ReadAxes(HANDLE handle)
    	{
            AnsiString lsb, msb, calc;
     
    		unsigned int tLSB, tMSB;
    		short iDouble;
    		unsigned int LSB[3] = {0x02, 0x04, 0x06};
    		unsigned int MSB[3] = {0x03, 0x05, 0x07};
     
    		AnsiString values[3];
     
    		HidD_FlushQueue(handle); //clear Hid-Queue
     
    		for(int i=0; i<3; i++)
    		{
    			tLSB = ReadData(handle, 0x82, LSB[i]);
    			tMSB = ReadData(handle, 0x82, MSB[i]);
     
    			iDouble = CalcMsbLsb(tLSB, tMSB);
    			//TVarRec args[1] = {iDouble};
    			calc=iDouble;
    			values[i] = calc;
    		}
     
    		Edit4->Text=values[0];
    		Edit5->Text=values[1];
    		Edit6->Text=values[2];
        }

    Donc pour la petite histoire, dans un timer de 100ms, j'appelle la fonction ReadAxes, qui appelle à son tour, deux fois consécutives la fonction ReadData, puis la fonction CalcLsbMsb.

    Et du coup les valeurs que je reçois, sont respectivement 48, -13 et -17.

    Même si apparemment personne ne semble avoir déjà codé pour récupérer ce genre de valeurs (à part un code source sur lequel je me suis basé, qui a été codé avec les pieds par des Allemands, et dont je ne comprends rien aux commentaires, forcément), j'espère que quelqu'un aurait une petite idée ...

    Cordialement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 05/04/2004, 10h09
  2. Réponses: 2
    Dernier message: 20/02/2004, 08h47
  3. [ DB2] => [ORACLE] Récupération de données
    Par LeDid dans le forum DB2
    Réponses: 3
    Dernier message: 25/06/2003, 17h10
  4. Réponses: 13
    Dernier message: 20/03/2003, 08h11
  5. [XMLRAD] récupération de donnée
    Par Mitch79 dans le forum XMLRAD
    Réponses: 7
    Dernier message: 30/01/2003, 15h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo