Fysioterapi Helper (Arduino adxl345 matrix) (2 / 2 steg)
Steg 2: Funktion och programmering
Funktion
- Tryck på Control-knappen 3 sekunder att ändra läge
0-läge: Visa X enda
Läge 1: Visa Y endast
Mode 2: Visa att X och Y på matris av röd punkt
< p > / * < br > * iMediaBank 201605
*
* ENDAST för ADXL345 XYZ Sensor
*
* Anslut - ADXL345 och Arduino
* I2C:
SDA: A4 (Digispark D0)
SCL: A5 (Digispark D2)
SDO: GND
CS: V ++
*
*
* Anslut Matrix 8 x 8 och Arduino:
* CLK: STIFT 11
* CS: STIFT 10
* BULLER: STIFT 12
*
*
* / < /p >< p > #include < wire.h >
#include "LedControl.h"
#define enhet (0x53) //ADXL345 enhetens adress
#define TO_READ (6) //num byte vi ska läsa varje gång (två byte för varje axel)
byte buff [TO_READ]; 6 byte buffert för att spara data läses från enheten
char str [512]; strängbuffert att transformera data innan de skickas till den seriella porten
int regAddress = 0x32; första axel-acceleration-data registrera sig på ADXL345
int x, y, z; tre axis acceleration data
Dubbel rulle = 0,00, pitch = 0.00; Rulle & Pitch är de vinklar som rotera axeln X och y
i följd av R (x-y-z), mer information besök
https://www.dfrobot.com/wiki/index.php?title=How_...></p><p>//---matris
int matrix = 1;
LedControl lc=LedControl(12,11,10,matrix);
/ * vi alltid vänta lite mellan uppdateringar av displayen * /
osignerade långa fördröjningstid = 100; < /p >< p > / /---Control-knappen
int ctrlBtn = 2; Control-knappen
int dispMode = 2; Display-läget (x, y, z, xyz och freePoint) < /p >< p > / /---återställa matris
void resetMatrix() {
för (int k = 0; k < matris; k ++) = "" {= "" = "" lc.shutdown(k,false); = "" * = "" Ange = "" = "" ljusstyrka = "" till = "" a = "" medium = "" värden = "" lc.setintensity(k,8); = "" och = "" rensa = "" Visa = "" lc.cleardisplay(k); = ""} = ""} = ""---= "" Återställ = "" matrix = "" slutet < = "" p = "" >< / matrix; >< /p >< p > / /---Setup
void setup() {
Wire.BEGIN(); gå med i2c bussen (adress valfritt för master)
Serial.BEGIN(115200); Starta följetong för utdata
Vrida på ADXL345
writeTo (enhet, 0x2D, 0);
writeTo (enhet, 0x2D, 16).
writeTo (enhet, 0x2D, 8); < /p >< p > resetMatrix(); < /p >< p >} < /p >< p > const int XYZSize = 3;
byte XYZ [XYZSize] [8] = {
{B00100100, B00011000, B00100100, B00000000, B11111111, B00000000, B11111111, B00000000}, / / X
{B01010000, B01010000, B01010100, B01010011, B01010100, B01010000, B01010000, B01010000}, / / Y
{B01001000, B01011000, B01101000, B00000000, B00000000, B00111111, B00111111, B00000000}, / / Z
{B10011111, B01011111, B00000000, B10000111, B10000111, B00000000, B10001111, B11001111}, //XYZ
{B00000000, B01000000, B00000000, B00011100, B00011000, B00010100, B00000010, B00000001}}; Gratis punkt < /p >< p > / /---writeMatrix
void writeMatrix() {
för (int j = 0; j < xyzsize; j ++) {= "" = "" för = "" (int = "" jag = "0;" jag < 8. = "" i ++) = "" lc.setrow(0,i,xyz[j][7-i]); = "" lc.setcolumn(0,i,xyz[j][7-i]); = "" delay(delaytime); = ""} = ""} < = "" p = "" >< / xyzsize; j ++) >< /p >< p >} / /---writeMatrix slutet < /p >< p > / /---Display Matrix
void displayMatrix (int matrixIndex) {
för (int jag = 0; jag < 8; i ++) {
lc.setRow(0,i,XYZ[matrixIndex][7-i]);
lc.setColumn(0,i,XYZ[matrixIndex][7-i]);
Delay(delaytime);
}
} / /---Visa matris slutet < /p >< p > / /---Signle
int oldx = 0, oldy = 0;
void singel (int x, int y) {
om ((oldx! = x) || (oldy! = y))
lc.setLed (0, oldx, oldy, falskt);
lc.setLed(0,x,y,true); < /p >< p > oldx = x;
oldy = y;
} //-------------------------------- Single END</p><p>// ----------------------------------------- LOOP
void loop() {< /p >< p > om (digitalRead(ctrlBtn) == false) {
readFrom (enhet, regAddress, TO_READ, buff); läsa acceleration data från ADXL345
varje axel behandlingen kommer i 10 bit upplösning, dvs 2 byte. Minst Significat Byte första!
Således konverterar vi båda byte till en int
x = (((int)buff[1]) << 8) | buff [0];
y = (((int)buff[3]) << 8) | buff [2].
z = (((int)buff[5]) << 8) | buff [4].
Vi skickar x y z-värden som en sträng till den seriella porten
Serial.Print ("acceleration info av x, y, z är:");
sprintf (str, "%d %d %d", x, y, z);
Serial.Print(Str);
Serial.write(10); < /p >< p > int xx = karta (x, 280,-245, 0, 7);
int åå = karta (y, 280,-245, 7, 0);
sprintf (str, "%d/%d: %d", xx, yy, dispMode);
Serial.println(Str);
< /p >< p > switch (dispMode) {
fall 0: / / X
displayMatrix(dispMode);
singel (2, xx);
bryta;
fall 1: / / Y
displayMatrix(dispMode);
singel (åå, 2);
bryta;
fall 2: / / fri punkt
enstaka (åå, xx);
bryta;
standard: enstaka (åå, xx); bryta;
}
/*
Rulle & Pitch beräkna
RP_calculate();
Serial.Print("roll:"); Serial.println (roll);
Serial.Print("pitch:"); Serial.println (pitch);
Serial.println("");
Det verkar att dröjsmål behövs för att inte täppa till hamnen
*/
Delay(100);
} annat {
---Styrsätt
dispMode ++;
om (dispMode > = 3) dispMode = 0;
Serial.println(dispMode);
displayMatrix(dispMode);
Delay(3000);
lc.clearDisplay(0);
{} < /p >< p >} / /---LOOPA slutet < /p >< p > / /---ADXL345 funktioner
Skriver val till adressregister på enheten
void writeTo (int enhet, byte adress, byte val) {
Wire.beginTransmission(device); Starta överföringen till enhet
Wire.write(Address); Skicka registren adress
Wire.write(val); Skicka värde att skriva
Wire.endTransmission(); slutet överföring
}
läser num byte från adressregister på enhet i till buff array
void readFrom (int enheten byte adress, int num, byte buff[]) {
Wire.beginTransmission(device); Starta överföringen till enhet
Wire.write(Address); skickar adressen att läsa från
Wire.endTransmission(); slutet överföring
Wire.beginTransmission(device); Starta överföringen till enhet
Wire.requestFrom (enhet, num); begäran 6 byte från enheten
int jag = 0;
While(Wire.available()) //device kan skicka mindre än efterfrågades (onormalt)
{
buff [i] = Wire.read(); få en byte
i ++;
}
Wire.endTransmission(); slutet överföring
}
beräkna den rulle & Pitch
void RP_calculate() {
Double x_Buff = float(x);
Double y_Buff = float(y);
Double z_Buff = float(z);
rulle = ARCTAN2 (y_Buff, z_Buff) * 57.3;
pitch = ARCTAN2 ((-x_Buff), sqrt (y_Buff * y_Buff + z_Buff * z_Buff)) * 57.3;
} < /p >
Information om hur du installerar bibliotek, se: http://www.arduino.cc/en/Guide/Libraries
Detalj se: http://www.imediabank.com