Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: EthernetNetIf mbed
Diff: main.cpp
- Revision:
- 2:53614df77a8e
- Parent:
- 1:5721a5772035
- Child:
- 3:849ebcaa62c7
diff -r 5721a5772035 -r 53614df77a8e main.cpp
--- a/main.cpp Thu Apr 12 15:46:38 2012 +0000
+++ b/main.cpp Thu Apr 19 10:25:48 2012 +0000
@@ -9,7 +9,7 @@
//Gravity at Earth's surface in m/s/s
#define g0 9.812865328
//Number of samples to average.
-#define SAMPLES 4
+#define SAMPLES 2
//Number of samples to be averaged for a null bias calculation
//during calibration.
#define CALIBRATION_SAMPLES 128
@@ -22,13 +22,11 @@
//Full scale resolution on the ADXL345 is 4mg/LSB.
#define ACCELEROMETER_GAIN (0.004 * g0)
//Sampling gyroscope at 200Hz.
-#define GYRO_RATE 0.005
+#define GYRO_RATE 0.0005
//Sampling accelerometer at 200Hz.
-#define ACC_RATE 0.005
-//Updating filter at 20Hz.
-#define FILTER_RATE 0.025
-//Defines the delay for the corrections made by the algorithm
-#define CORRECTION_DELAY 5
+#define ACC_RATE 0.0005
+//Updating filter at 40Hz.
+#define FILTER_RATE 0.02
//At rest the gyroscope is centred around 0 and goes between about
//-5 and 5 counts. As 1 degrees/sec is ~15 LSB, error is roughly
@@ -45,34 +43,12 @@
Ticker accelerometerTicker;
Ticker gyroscopeTicker;
Ticker filterTicker;
-Ticker motorTicker;
-//Variables for the tcp controls
+
int connected = 0,
calibrated = 0,
led1 = 0;
-
-//stabilizing variables, these control the thrust and wanted x/y level
-float m1_set = 0.001,
- m2_set = 0.001,
- m3_set = 0.001,
- m4_set = 0.001;
-
-double a_motor_1 = 0,
- a_motor_2 = 0,
- a_motor_3 = 0,
- a_motor_4 = 0;
-
-int x_level_1 = 0,
- x_level_2 = 0,
- x_level_3 = 0,
- x_level_4 = 0,
- y_level_1 = 0,
- y_level_2 = 0,
- y_level_3 = 0,
- y_level_4 = 0;
-
-//O1ffsets for the gyroscope.
+//Offsets for the gyroscope.
//The readings we take when the gyroscope is stationary won't be 0, so we'll
//average a set of readings we do get when the gyroscope is stationary and
//take those away from subsequent readings to ensure the gyroscope is offset
@@ -125,7 +101,6 @@
void sampleGyroscope(void);
//Update the filter and calculate the Euler angles.
void filter(void);
-void motor(void);
void tcp_send(const char*);
void onConnectedTCPSocketEvent(TCPSocketEvent e);
void onListeningTCPSocketEvent(TCPSocketEvent e);
@@ -212,38 +187,22 @@
}
-void motor(void) {
- int x = toDegrees(imuFilter.getRoll());
- int y = toDegrees(imuFilter.getPitch());
- a_motor_1 = a_motor_1+((float)(x/2)/CORRECTION_DELAY)+((float)(y/2)/CORRECTION_DELAY);
- if(a_motor_1>99){ m1_set = 0.002;}
- else if(a_motor_1 < 1){ m1_set = 0.001175;}
- else{ m1_set = (a_motor_1+117.5)/100000;}
- m1.pulsewidth(m1_set);
- m2.pulsewidth(m2_set);
- m3.pulsewidth(m3_set);
- m4.pulsewidth(m4_set);
-}
+
int main() {
-
+
EthernetErr ethErr = eth.setup();
if(ethErr) { return -1;}
- IpAddr ip = eth.getIp();
+ IpAddr ip = eth.getIp();
// Set the callbacks for Listening
- ListeningSock.setOnEvent(&onListeningTCPSocketEvent);
+ ListeningSock.setOnEvent(&onListeningTCPSocketEvent);
// bind and listen on TCP
err=ListeningSock.bind(Host(IpAddr(), TCP_LISTENING_PORT));
//Deal with that error...
- if(err){printf("Binding Error\n");}
+ if(err){printf("Binding Error\n");}
err=ListeningSock.listen(); // Starts listening
if(err){printf("Listening Error\r\n");}
-
- m1.pulsewidth(0.001);
- m2.pulsewidth(0.001);
- m3.pulsewidth(0.001);
- m4.pulsewidth(0.001);
-
+
//Initialize inertial sensors.
initializeAccelerometer();
calibrateAccelerometer();
@@ -251,34 +210,29 @@
//Set up timers.
//Accelerometer data rate is 200Hz, so we'll sample at this speed.
-// accelerometerTicker.attach(&sampleAccelerometer, 0.005);
+ accelerometerTicker.attach(&sampleAccelerometer, 0.005);
//Gyroscope data rate is 200Hz, so we'll sample at this speed.
-// gyroscopeTicker.attach(&sampleGyroscope, 0.005);
+ gyroscopeTicker.attach(&sampleGyroscope, 0.005);
//Update the filter variables at the correct rate.
-// filterTicker.attach(&filter, FILTER_RATE);
-
+ filterTicker.attach(&filter, FILTER_RATE);
+
Timer tmr;
tmr.start();
-
+
while(true)
{
- wait(0.2);
-
+ wait(FILTER_RATE);
+
Net::poll();
if(tmr.read() > 0.2){
// led4=!led4; //Show that we are alive
tmr.reset();
- }
+ }
if(connected & led1 == 0){
tcp_send("Connected\r\n");
led1 = 1;
calibrated = 1;
-
-// m1_set = 0.001175;
-// m2_set = 0.001175;
-// m3_set = 0.001175;
-// m4_set = 0.001175;
-
+
//Set up timers.
//Accelerometer data rate is 200Hz, so we'll sample at this speed.
accelerometerTicker.attach(&sampleAccelerometer, 0.005);
@@ -286,44 +240,19 @@
gyroscopeTicker.attach(&sampleGyroscope, 0.005);
//Update the filter variables at the correct rate.
filterTicker.attach(&filter, FILTER_RATE);
-
- motorTicker.attach(&motor, 0.02);
tcp_send("Done initializing\r\n");
}
if(calibrated){
-
-
-
-
-
-/* a_motor_2 = a_motor_2-((((x_level_2-x)/2)-((y_level_2-y)/2))/CORRECTION_DELAY);
- if(a_motor_2>99){ m2_set = (100+117.5)/100000;}
- else if(a_motor_2 < 1){ m2_set = (0+117.5)/100000;}
- else{ m2_set = (a_motor_2+117.5)/100000;}
-
- a_motor_3 = a_motor_3+((((x_level_3-x)/2)-((y_level_3-y)/2))/CORRECTION_DELAY);
- if(a_motor_3>99){ m3_set = (100+117.5)/100000;}
- else if(a_motor_3 < 1){ m3_set = (0+117.5)/100000;}
- else{ m3_set = (a_motor_3+117.5)/100000;}
-
- a_motor_4 = a_motor_4+((((x_level_4-x)/2)+((y_level_4-y)/2))/CORRECTION_DELAY);
- if(a_motor_4>99){ m4_set = (100+117.5)/100000;}
- else if(a_motor_4 < 1){ m4_set = (0+117.5)/100000;}
- else{ m4_set = (a_motor_4+117.5)/100000;}*/
-
-
char buffer [128];
sprintf (buffer, "x:%f - y:%f - z:%f \r\n",toDegrees(imuFilter.getRoll()),
toDegrees(imuFilter.getPitch()),
toDegrees(imuFilter.getYaw()));
- tcp_send(buffer);
- sprintf (buffer, "am1:%f\r\n",a_motor_1);
- tcp_send(buffer);
+ tcp_send(buffer);
}
- }
+ }
}
void initializeAccelerometer(void) {
@@ -346,7 +275,7 @@
a_xAccumulator = 0;
a_yAccumulator = 0;
a_zAccumulator = 0;
-
+
//Take a number of readings and average them
//to calculate the zero g offset.
for (int i = 0; i < CALIBRATION_SAMPLES; i++) {
@@ -437,54 +366,23 @@
// pConnectedSock->send(buff, len);
int test = buff[0];
char buffer[128];
- sprintf(buffer, "|%i|", test);
- tcp_send(buffer);
+ sprintf(buffer, "|%i|\r\n", test);
+ tcp_send(buffer);
if(test == 115) {connected = 1;}
- if(test == 112) {
- a_motor_1 += 5;
- a_motor_1 += 5;
- a_motor_1 += 5;
- a_motor_1 += 5;
- }
- if(test == 49) {
- m1_set += 0.00002;
- sprintf (buffer, " %f\r\n",m1_set);
- tcp_send(buffer);
- }
- if(test == 50) {
- m2_set += 0.00002;
- sprintf (buffer, " %f\r\n",m2_set);
- tcp_send(buffer);
- }
- if(test == 51) {
- m3_set += 0.00002;
- sprintf (buffer, " %f\r\n",m3_set);
- tcp_send(buffer);
- }
- if(test == 52) {
- m4_set += 0.00002;
- sprintf (buffer, " %f\r\n",m4_set);
- tcp_send(buffer);;
- }
- if(test == 113) {
- m1_set -= 0.00002;
- }
- if(test == 119) {
- m2_set -= 0.00002;
- }
- if(test == 101) {
- m3_set -= 0.00002;
- }
- if(test == 114) {
- m4_set -= 0.00002;
- }
+/* if(test == 49) {m1_set += 0.00001;}
+ if(test == 50) {m2_set += 0.00001;}
+ if(test == 51) {m3_set += 0.00001;}
+ if(test == 52) {m4_set += 0.00001;}
+ if(test == 113) {m1_set -= 0.00001;}
+ if(test == 119) {m2_set -= 0.00001;}
+ if(test == 101) {m3_set -= 0.00001;}
+ if(test == 114) {m4_set -= 0.00001;}
if(test == 107) {
m1_set = 0.0011;
m2_set = 0.0011;
m3_set = 0.0011;
- m4_set = 0.0011;
- }
-
+ m4_set = 0.0011;}*/
+
buff[len]=0; // make terminater
printf("Received&Wrote:%s\r\n",buff);
@@ -504,11 +402,11 @@
break;
case TCPSOCKET_DISCONNECTED:
//Close socket...
- printf("TCP Socket Disconnected\r\n");
+ printf("TCP Socket Disconnected\r\n");
pConnectedSock->close();
break;
default:
- printf("DEFAULT\r\n");
+ printf("DEFAULT\r\n");
}
}
@@ -519,7 +417,7 @@
{
case TCPSOCKET_ACCEPT:
printf("Listening: TCP Socket Accepted\r\n");
- // Accepts connection from client and gets connected socket.
+ // Accepts connection from client and gets connected socket.
err=ListeningSock.accept(&client, &pConnectedSock);
if (err) {
printf("onListeningTcpSocketEvent : Could not accept connection.\r\n");
@@ -530,7 +428,7 @@
// 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",
+ 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
@@ -557,10 +455,10 @@
break;
case TCPSOCKET_DISCONNECTED:
//Close socket...
- printf("Listening: TCP Socket Disconnected\r\n");
+ printf("Listening: TCP Socket Disconnected\r\n");
ListeningSock.close();
break;
default:
- printf("DEFAULT\r\n");
+ printf("DEFAULT\r\n");
};
}
\ No newline at end of file