Using an accelerometer to assess musculoskeletal stresses
Accelerometers are helpful for characterising device usage and detecting the mode of use. Most of these devices have an internal accelerometer, but it is convenient for our purposes to use an external device (requires less programming and does not require a jailbroken device).
Setup
In order to use this device, you must first set up the serial port with a line like the following:
stty -F /dev/ttyUSB0 raw ispeed 38400 ospeed 38400 cs8 -ignpar -cstopb -echo
Code
The code probably won’t tell you all that much, but here’s one way to make your life much easier: assuming you’re running this on Linux, set your device ID as /dev/dlptilt, then change the line ‘/dev/ttyUSB0’ to read ‘/dev/dlptilt’ in the code before compiling.
#include #include #include #include #include #include #include #include #define BAUDRATE B38400 #define MODEMDEVICE "/dev/ttyS1" #define _POSIX_SOURCE 1 //POSIX compliant source #define FALSE 0 #define TRUE 1 #define DEBUG 0 volatile int STOP=FALSE; void signal_handler_IO (int status); //definition of signal handler int wait_flag=TRUE; //TRUE while no signal received char devicename[80]; long Baud_Rate = 38400; // default Baud Rate (110 through 38400) long BAUD; // derived baud rate from command line long DATABITS; long STOPBITS; long PARITYON; long PARITY; int Data_Bits = 8; // Number of data bits int Stop_Bits = 1; // Number of stop bits int Parity = 0; // Parity as follows: // 00 = NONE, 01 = Odd, 02 = Even, 03 = Mark, 04 = Space int Format = 4; FILE *input; FILE *output; int status; main(int Parm_Count, char *Parms[]) { int fd, tty, c, res, i, error; char In1, Key; struct termios oldtio, newtio; struct termios oldkey, newkey; struct sigaction saio; char buf[255]; char message[90]; // set device name here strcpy(devicename,"/dev/ttyUSB0"); newkey.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD; newkey.c_iflag = IGNPAR; newkey.c_oflag = 0; newkey.c_lflag = 0; newkey.c_cc[VMIN]=1; newkey.c_cc[VTIME]=0; BAUD=38400; DATABITS=CS8; STOPBITS=CSTOPB; PARITYON=0; PARITY=0; fd = open(devicename, O_RDWR | O_NOCTTY | O_NONBLOCK); if (fd < 0) { perror(devicename); exit(-1); } saio.sa_handler = signal_handler_IO; sigemptyset(&saio.sa_mask); saio.sa_flags = 0; saio.sa_restorer = NULL; sigaction(SIGIO,&saio,NULL); fcntl(fd, F_SETOWN, getpid()); fcntl(fd, F_SETFL, FASYNC); tcgetattr(fd,&oldtio); newtio.c_cflag = BAUD | CRTSCTS | DATABITS | STOPBITS | PARITYON | PARITY | CLOCAL | CREAD; newtio.c_iflag = IGNPAR; newtio.c_oflag = 0; newtio.c_lflag = 0; newtio.c_cc[VMIN]=1; newtio.c_cc[VTIME]=0; tcflush(fd, TCIFLUSH); tcsetattr(fd,TCSANOW,&newtio); write(fd,"T",1); while (STOP==FALSE) { status=1; if (status==1) // so redundant... { if(DEBUG){ write(fd,"P",1); printf("Printed Pn"); } else { // 7 - single a d conversion to host on current settings // z 3 bytes (both channels x and y of accelerometer) // s - 7 bytes (all 7 channels) // 8 - streaming a/d conversion data using current settings write(fd,"z",1); } } if (wait_flag==FALSE) //if output is available { res = read(fd,buf,255); if (res>0) { // Print serial output for (i=0; i