Gyro output to TCP in degrees with calibration and correction
Dependencies: EthernetNetIf mbed
main.cpp
- Committer:
- SED9008
- Date:
- 2012-03-02
- Revision:
- 1:a88d1309f810
- Parent:
- 0:5de940cf9783
- Child:
- 2:96f81996a332
File content as of revision 1:a88d1309f810:
// TCP Echo server // 2010/9/7 /* (Execute Sample) PC side: telnet 192.168.0.25 12345 Trying 192.168.0.25... Connected to 192.168.0.25. Escape character is '^]'. mbed side: Setup OK mbed IP Address is 192.168.0.25 Binding.. Listening... Listening: TCP Socket Accepted Listening: Incoming TCP connection from 192.168.0.7 TCP Socket Readable Received&Wrote:test text TCP Socket Writable */ //############## INCLUDE FILES ##############// #include "mbed.h" #include "EthernetNetIf.h" #include "TCPSocket.h" #include "ADXL345_I2C.h" //#############################################// //############## DEFINES ##############// #define TCP_LISTENING_PORT 1337 #define PI 3.14159265 //#############################################// //############## VARIABLES ##############// double x_cor = 0, y_cor = 0, cont[2] = {0,0}; int print = 0, go = 0, calibrated = 0; //#############################################// //##############PIN CONFIGURATION##############// DigitalOut led3(LED3, "led3"); DigitalOut led4(LED4, "led4"); DigitalIn init(p5); DigitalIn calibrate(p20); //I2C i2c(p9, p10); // sda, scl ADXL345_I2C acc(p9, p10); //#############################################// //############## PROTOTYPES ##############// void tcp_send(const char*); void tcp_sendIfConnected( const char* data ); void onConnectedTCPSocketEvent(TCPSocketEvent e); void onListeningTCPSocketEvent(TCPSocketEvent e); double getAngle(char axis, int precision); //#############################################// //############## ETHERNET CONFIG ##############// // EthernetNetIf eth; EthernetNetIf eth( IpAddr(192,168,0,16), //IP Address IpAddr(255,255,255,0), //Network Mask IpAddr(192,168,0,1), //Gateway IpAddr(192,168,0,1) //DNS ); TCPSocket ListeningSock; TCPSocket* pConnectedSock; // for ConnectedSock Host client; TCPSocketErr err; //#############################################// Ticker routine; //############## INTERRUPT ##############// void interrupt() { // int count = 0; // for (int address=0; address<256; address+=2) { // if (!i2c.write(address, NULL, 0)) { // 0 returned is ok // if(go) { // tcp_send(" - I2C device found at address:"); // char buffer [128]; // sprintf (buffer, "%i\n",address); // tcp_send(buffer); // } // count++; // } // } if(go){ if(calibrated){ if(print){ char buffer [128]; sprintf (buffer, "x:%f - y:%f\n",cont[0],cont[1]); tcp_send(buffer); print = 0; } } } } //#############################################// //############## MAIN ##############// int main() { //##############ETHERNET&TCP INIT##############// EthernetErr ethErr = eth.setup(); if(ethErr) { return -1; } IpAddr ip = eth.getIp(); // Set the callbacks for Listening ListeningSock.setOnEvent(&onListeningTCPSocketEvent); // bind and listen on TCP err=ListeningSock.bind(Host(IpAddr(), TCP_LISTENING_PORT)); if(err) { //Deal with that error... } err=ListeningSock.listen(); // Starts listening if(err) { //listening error } //#############################################// //#############ACCELEROMETER INIT##############// //Go into standby mode to configure the device. acc.setPowerControl(0x00); //Full resolution, +/-16g, 4mg/LSB. acc.setDataFormatControl(0x00); //3.2kHz data rate. acc.setDataRate(ADXL345_3200HZ); //Measurement mode. acc.setPowerControl(0x08); wait(0.1); //#############################################// Timer tmr; tmr.start(); while(true) { Net::poll(); while(init) { if(!init) { tcp_send("You are a go!\n"); led3 = 1; go = 1; } } if(tmr.read() > 0.2) // sec { led4=!led4; //Show that we are alive tmr.reset(); } if(calibrate){ while(calibrate){}; x_cor = getAngle('x',100); y_cor = getAngle('y',100); char buffer [128]; sprintf (buffer, "Calibration values:\n"); tcp_send(buffer); sprintf (buffer, "x:%f - y:%f\n",x_cor, y_cor); tcp_send(buffer); sprintf (buffer, "------------------------\n"); tcp_send(buffer); calibrated = 1; wait(0.1); routine.attach_us(&interrupt,10); } if(calibrated){ cont[0] = getAngle('x',10) - x_cor; cont[1] = getAngle('y',10) - y_cor; print = 1; } } } //#############################################// //############## SUBROUTINES ##############// void tcp_send( const char* data ){ int len = strlen(data); pConnectedSock->send(data, len); } void onConnectedTCPSocketEvent(TCPSocketEvent e) { switch(e) { case TCPSOCKET_CONNECTED: break; case TCPSOCKET_WRITEABLE: //Can now write some data... printf("TCP Socket Writable\r\n"); break; case TCPSOCKET_READABLE: //Can now read dome data... // Read in any available data into the buffer //char buff[128]; //while ( int len = pConnectedSock->recv(buff, 128) ) { // And send straight back out again // pConnectedSock->send(buff, len); // buff[len]=0; // make terminater //} break; case TCPSOCKET_CONTIMEOUT: printf("TCP Socket Timeout\r\n"); break; case TCPSOCKET_CONRST: printf("TCP Socket CONRST\r\n"); break; case TCPSOCKET_CONABRT: printf("TCP Socket CONABRT\r\n"); break; case TCPSOCKET_ERROR: printf("TCP Socket Error\r\n"); break; case TCPSOCKET_DISCONNECTED: //Close socket... printf("TCP Socket Disconnected\r\n"); pConnectedSock->close(); break; default: printf("DEFAULT\r\n"); } } void onListeningTCPSocketEvent(TCPSocketEvent e) { switch(e) { case TCPSOCKET_ACCEPT: printf("Listening: TCP Socket Accepted\r\n"); // Accepts connection from client and gets connected socket. err=ListeningSock.accept(&client, &pConnectedSock); if (err) { printf("onListeningTcpSocketEvent : Could not accept connection.\r\n"); return; //Error in accept, discard connection } // Setup the new socket events pConnectedSock->setOnEvent(&onConnectedTCPSocketEvent); // We can find out from where the connection is coming by looking at the // Host parameter of the accept() method IpAddr clientIp = client.getIp(); printf("Listening: Incoming TCP connection from %d.%d.%d.%d\r\n", clientIp[0], clientIp[1], clientIp[2], clientIp[3]); break; // the following cases will not happen case TCPSOCKET_CONNECTED: printf("Listening: TCP Socket Connected\r\n"); break; case TCPSOCKET_WRITEABLE: printf("Listening: TCP Socket Writable\r\n"); break; case TCPSOCKET_READABLE: printf("Listening: TCP Socket Readable\r\n"); break; case TCPSOCKET_CONTIMEOUT: printf("Listening: TCP Socket Timeout\r\n"); break; case TCPSOCKET_CONRST: printf("Listening: TCP Socket CONRST\r\n"); break; case TCPSOCKET_CONABRT: printf("Listening: TCP Socket CONABRT\r\n"); break; case TCPSOCKET_ERROR: printf("Listening: TCP Socket Error\r\n"); break; case TCPSOCKET_DISCONNECTED: //Close socket... printf("Listening: TCP Socket Disconnected\r\n"); ListeningSock.close(); break; default: printf("DEFAULT\r\n"); }; } double getAngle(char axis, int precision) { int measurement[3] = {0,0,0}; double x_temp = 0, y_temp = 0, z_temp = 0, x_angle = 0, y_angle = 0; int i; for(i=0;i<precision;i++) { acc.getOutput(measurement); x_temp = (int16_t)measurement[0]; y_temp = (int16_t)measurement[1]; z_temp = (int16_t)measurement[2]; x_angle += x_temp/z_temp; y_angle += y_temp/z_temp; } x_angle = x_angle/precision; y_angle = y_angle/precision; // x_angle = atan(x_angle) * 180 / PI; // y_angle = atan(y_angle) * 180 / PI; if(axis == 'x')return atan(x_angle) * 180 / PI; if(axis == 'y')return atan(y_angle) * 180 / PI; }