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.