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: mbed DCM_AHRS_GY80 PID MMA8451Q
Fork of quadCommand by
Revision 64:2b6399fe00f6, committed 2013-07-28
- Comitter:
- oprospero
- Date:
- Sun Jul 28 21:46:54 2013 +0000
- Parent:
- 63:f4cb482ac5d4
- Commit message:
- working state;
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/quadCommand/DCM_AHRS_GY80.lib Sun Jul 28 21:46:54 2013 +0000 @@ -0,0 +1,1 @@ +https://mbed.org/users/oprospero/code/DCM_AHRS_GY80/#49cbf2acc4e6
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/quadCommand/PID.lib Sun Jul 28 21:46:54 2013 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/gabdo/code/PID/#8172f254dff4
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/quadCommand/com/com.cpp Sun Jul 28 21:46:54 2013 +0000
@@ -0,0 +1,142 @@
+/****************************** com.cpp **********************************/
+/* Version: 1.0 */
+/* Last Updated: June 1, 2013 */
+/* */
+/* The com class implements reliable data transfer between two nodes */
+/*using a checksum and a sequence number for guaranteed message delivery */
+/*over an xbee modem connected to the passed in tx and rx pins. Messages */
+/*are received and placed in the rxBuffer to be read when convenient. */
+/*Messages are encoded by sending a byte with the value of the command */
+/*then and int of the command. */
+/* */
+/* Commands: 0 -> Ack, does not get placed in rxQueue. */
+/* 1 -> Throttle */
+/* 2 -> Pitch */
+/* 3 -> Roll */
+/* 4 -> Yaw */
+/*************************************************************************/
+
+#include "mbed.h"
+#include "com.h"
+
+/*********************** com( PinName, PinName ) *************************/
+/* */
+/*************************************************************************/
+
+com::com( PinName tx, PinName rx ) : xbee( tx, rx)
+{
+ bLength = 0; // How many bytes are in the buffer.
+ xbee.attach( this, &com::callback ); // Set callback as the interrupt handler.
+ xbee.baud(BAUDRATE); // Setup the serial baud rate.
+ rxBuffer = new queue(); // Point to the rxQueue.
+
+}
+
+/************************* bool isData() ********************************/
+/* */
+/*************************************************************************/
+
+bool com::isData()
+{
+ if( rxBuffer->isEmpty() )
+ return false;
+
+ return true;
+}
+
+/************************ void write( char ) *****************************/
+/* Write a packet out the xbee com port. */
+/* */
+/* Data format byte[] */
+/* byte[0] = command. */
+/* byte[1] = upper 8 bits of value. */
+/* byte[2] = lower 8 bits of value. */
+/* byte[3] = Checksum byte[0] + byte[2]. */
+/* byte[4] = Sequence Number. */
+/* byte[5] = 255 End of message. */
+/*************************************************************************/
+
+void com::write( short command, short value )
+{
+ xbee.putc( (char)command ); // Command
+ xbee.putc( 0 ); // First 8 bits in array.
+ xbee.putc( (char)value ); // Second 8 bits in array.
+ xbee.putc( command + value ); // Checksum array[0] + array[1].
+ xbee.putc( 0 ); // Sequence number.
+ xbee.putc( 255 ); // End of message.
+}
+
+/*************************** char read() ********************************/
+/* */
+/*************************************************************************/
+
+short * com::read()
+{
+ if( !rxBuffer->isEmpty())
+ return rxBuffer->pop();
+
+ return NULL;
+}
+
+/************************ void callback() ********************************/
+/* */
+/*************************************************************************/
+
+void com::callback()
+{
+ while( xbee.readable() )
+ {
+ char data = xbee.getc();
+// xbee.printf("data: %d\n\r", data);
+ if( bLength++ < BUFFERSIZE )
+ buffer[bLength] = data;
+
+ if( data == 255 )
+ packetBuilder();
+ }
+}
+
+/********************** void packetBuilder() *****************************/
+/* Creates a packet from the buffered data and places it in the rxBuffer */
+/*queue to be read whenever convenient. Max value of +/- 8063. */
+/*************************************************************************/
+
+void com::packetBuilder()
+{
+ char * commandData = new char[bLength];
+ commandData[4] = buffer[--bLength]; // Sequence Number.
+ commandData[3] = buffer[--bLength]; // CheckSum value.
+ commandData[2] = buffer[--bLength]; // Second 7 bits.
+ commandData[1] = buffer[--bLength]; // Fisrt 7 bits.
+ commandData[0] = buffer[--bLength]; // Command.
+
+ if( commandData[0] + commandData[2] == commandData[3] ) // Validate checksum.
+ {
+ short * array = new short[2];
+
+ array[0] = (short)commandData[0];
+
+ short value = (short)(commandData[1] * 128 + commandData[2]);
+
+ if( value > 8062 )
+ value = (short)value + 57344;
+
+ array[1] = value;
+// xbee.printf("Cmd: %d,\tVal: %d\n\r,",array[0],array[1]);
+ rxBuffer->add( array ); // Add to read buffer.
+ write( 0, (short)commandData[4]); // Ack the packet with sequence nuber.
+ }
+ delete[] commandData;
+ bLength = 0; // Reset the buffer length.
+}
+
+
+
+
+
+
+
+
+
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/quadCommand/com/com.h Sun Jul 28 21:46:54 2013 +0000
@@ -0,0 +1,42 @@
+/******************************* com.h ***********************************/
+/* Version: 1.0 */
+/* Last Updated: June 1, 2013 */
+/* */
+/* The com class implements reliable data transfer between two nodes */
+/*using a checksum and a sequence number for guaranteed message delivery */
+/*over an xbee modem connected to the passed in tx and rx pins. Messages */
+/*are received and placed in the rxBuffer to be read when convenient. */
+/*Messages are encoded by sending a byte with the value of the command */
+/*then and int of the command. */
+/* Alternative Pins RX = PTA1, TX PTA2 */
+/*************************************************************************/
+
+#ifndef COM_H
+#define COM_H
+
+#include "mbed.h"
+#include "queue.h"
+
+const int BAUDRATE = 38400;
+const int BUFFERSIZE = 10;
+
+class com
+{
+ public:
+ com( PinName, PinName ); // Setup the com serial port. (tx, rx)
+ bool isData(); // Is there data to be read?
+ void write( short, short ); // Write to the port.
+ short * read(); // Read from the queue.
+
+ private:
+ void callback(); // Handle the interrupts.
+ void packetBuilder(); // Called by callback to place commandes into the queue.
+
+ char buffer[BUFFERSIZE]; // Buffer for holding serial data.
+ int bLength; // Location in the buffer to place next data.
+ Serial xbee; // tx - DIN, rx - DOUT
+
+ queue *rxBuffer; // queue of commands ready to be read.
+};
+
+#endif
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/quadCommand/com/queue/queue.cpp Sun Jul 28 21:46:54 2013 +0000
@@ -0,0 +1,148 @@
+/*************************** queue.cpp ***************************************/
+/* */
+/* Authers: Oanh Tran, Ling Lei, Sihao Xie, Greg Abdo. */
+/* Date: February 23, 2013 */
+/* Version: 1.0 */
+/* */
+/* The queue is used to stack StructureItem in order with a FILO */
+/*arrangement. */
+/*****************************************************************************/
+
+#include "queue.h"
+
+/***************************** constructor ***********************************/
+/* Description: */
+/*****************************************************************************/
+
+queue::queue()
+{
+ front = NULL; // Set front to NULL at the start.
+}
+
+/******************************* distructor **********************************/
+/* Description: */
+/*****************************************************************************/
+
+queue::~queue()
+{
+ clear(); // Clear the entire queue.
+}
+
+/*****************************************************************************/
+/* Description: */
+/* Accepts: */
+/* Returns: */
+/*****************************************************************************/
+
+bool queue::isEmpty()
+{
+ // Is the queue empty?
+ if( front == NULL ) // Check the front pointer.
+ return true; // Queue is empty, return true.
+
+ return false; // There is atleast one item, not empty.
+}
+
+/*****************************************************************************/
+/* Description: */
+/* Accepts: */
+/* Returns: */
+/*****************************************************************************/
+
+void queue::clear()
+{
+ // Is the list already empty?
+ if( isEmpty() ) // Check for an empty list.
+ return; // List is empty, don't need to do anything.
+
+ queueNode * current = front; // Create node to help step through list.
+ queueNode * placeHold = front; // Create node to keep place of delete.
+
+ // As long as were not at the end, keep stepping to the next node.
+ while( current != NULL)
+ {
+ placeHold = current->next; // Hold where we have to go.
+ delete current; // Delete the node.
+ current = placeHold; // Set current to the next node.
+ }
+
+ front = NULL; // Reset the front to NULL;
+ length = 0;
+}
+
+/*****************************************************************************/
+/* Description: */
+/* Accepts: */
+/* Returns: */
+/*****************************************************************************/
+
+void queue::add( short * item )
+{
+ // Were we passed an invalid object somehow?
+ if( item == NULL ) // Check for NULL
+ return; // If so, return.
+
+ if( queueLength() > MAXQUEUELENGTH )
+ clear();
+
+ queueNode * newNode = new queueNode( item ); // Create the new node.
+
+ if( isEmpty() )
+ front = newNode; // Set front to the new node.
+
+ else
+ {
+ queueNode *temp = front;
+ while( temp->next != NULL )
+ temp = temp->next;
+
+ temp->next = newNode;
+ }
+ length++;
+}
+
+/*****************************************************************************/
+/* Description: */
+/* Accepts: */
+/* Returns: */
+/*****************************************************************************/
+
+short * queue::pop()
+{
+ // Is the list already empty?
+ if( isEmpty() ) // Check for an empty list.
+ return NULL; // List is empty, don't need to do anything.
+
+ short* dataHold = front->data; // Keep track of what were returning.
+ queueNode * oldNode = front; // Save the old node to be deleted
+ front = front->next; // Set front to next object.
+
+ delete oldNode; // Delete the front node.
+ length--; // Remove one from the length.
+ return dataHold; // return the stuctureItem.
+}
+
+/*****************************************************************************/
+/* Description: */
+/* Accepts: */
+/* Returns: */
+/*****************************************************************************/
+
+short * queue::peek()
+{
+ if( front != NULL )
+ return front->data;
+
+ return NULL;
+}
+
+/*****************************************************************************/
+/* Description: */
+/* Accepts: */
+/* Returns: */
+/*****************************************************************************/
+
+short queue::queueLength()
+{
+ return length;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/quadCommand/com/queue/queue.h Sun Jul 28 21:46:54 2013 +0000
@@ -0,0 +1,53 @@
+/**************************** queue.h ****************************************/
+/* */
+/* Authers: Greg Abdo. */
+/* Date: February 23, 2013 */
+/* Version: 1.0 */
+/* */
+/* The queue is used to stack StructureItem in order with a FILO arrangement.*/
+/*****************************************************************************/
+
+#ifndef QUEUE_H
+#define QUEUE_H
+
+#include "mbed.h"
+
+using namespace std;
+
+const int MAXQUEUELENGTH = 5;
+
+class queue
+{
+public:
+ queue(); // Queue constructor
+ ~queue(); // Queue destructor
+
+ bool isEmpty(); // Check for an empty queue.
+ void clear(); // Clears the entire queue.
+ void add( short* ); // Push commandData into the queue.
+ short* peek(); // Look at the last item in the queue.
+ short* pop(); // Pop the top item off the queue.
+ short queueLength(); // Return how many objects are in the queue.
+
+private:
+ int length;
+
+ struct queueNode // Node object for the queue.
+ {
+ queueNode( short* array )
+ {
+ data = array;
+ next = NULL;
+ }
+
+ ~queueNode()
+ {}
+
+ short* data; // Pointer to the StructureItem object.
+ queueNode * next; // Next node in the queue.
+ };
+
+ queueNode * front; // Root of the queue.
+};
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/quadCommand/motor/motor.cpp Sun Jul 28 21:46:54 2013 +0000
@@ -0,0 +1,75 @@
+/****************************** motor.cpp ********************************/
+/* Version: 1.0 */
+/* Last Updated: June 1, 2013 */
+/* */
+/* The motor class is used for motor control using a PWM ECS. When a */
+/*a motor object is created you must pass the PWM pin as the only */
+/*argument. */
+/*************************************************************************/
+
+#include "motor.h"
+
+/************************** motor( PinName ) *****************************/
+/* The motor constructor takes the pin to be used as for PWM and sets it */
+/*to default safe valuse. */
+/*************************************************************************/
+
+motor::motor( PinName pin )
+{
+ pwmPin = new PwmOut( pin );
+ pwmPin->period( 0.020 ); // Set the period to 20ms.
+ setPulseMin( 0.001000 ); // Set default min pulse.
+ setPulseMax( 0.002 ); // Set default max pulse.
+ setSpeed( 0 ); // Set motor to stopped.
+}
+
+/************************** setSpeed( int ) ******************************/
+/* Set speed takes an int value between 0 and 100 and sets the speed of */
+/*the motor based on passed in percent value of speed. */
+/*************************************************************************/
+
+void motor::setSpeed( int value )
+{
+ // Is the value to small?
+ if( value < 0 ) // Yup, just set to 0.
+ currentSpeed = 0;
+
+ // Is the value to large?
+ else if( value > 500 ) // Yup, just set to 100. Changed to 500 to increase
+ currentSpeed = 500; // motor control resolution
+
+ // Value must be in the correct range.
+ else
+ currentSpeed = value; // Set the new value.
+
+ // Calculate the value based on pulseMin, pulseMax and currentSpeed.
+ pulse = ((pulseMax - pulseMin) / 500 * currentSpeed) + pulseMin;
+ pwmPin->pulsewidth( pulse ); // Write the pulse to the pin.
+}
+
+/************************** setPulseMin( float ) *************************/
+/* */
+/*************************************************************************/
+
+void motor::setPulseMin( float value )
+{
+ pulseMin = value;
+}
+
+/************************** setPulseMax( float ) *************************/
+/* */
+/*************************************************************************/
+
+void motor::setPulseMax( float value )
+{
+ pulseMax = value;
+}
+
+/*************************** float getSpeed( ) ***************************/
+/* */
+/*************************************************************************/
+
+int motor::getSpeed()
+{
+ return currentSpeed;
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/quadCommand/motor/motor.h Sun Jul 28 21:46:54 2013 +0000
@@ -0,0 +1,41 @@
+/******************************* motor.h *********************************/
+/* Version: 1.0 */
+/* Last Updated: June 1, 2013 */
+/* */
+/* The motor class is used for motor control using a PWM ECS. When a */
+/*a motor object is created you must pass the PWM pin as the only */
+/*argument. */
+/* */
+/* Wiring diagrams */
+/* _______ _______ */
+/* CW ----| | CCW ---\/ --| | */
+/* ----| Motor | ---/\---| Motor | */
+/* ----|_______| --/ \--|_______| */
+/* Straight through Switch wire 1 and 3 */
+/* */
+/*************************************************************************/
+
+
+#ifndef MOTOR_H
+#define MOTOR_H
+
+#include "mbed.h"
+
+class motor
+{
+ public:
+ motor( PinName ); // motor object constructor.
+ void setSpeed( int ); // Set the speed for the motor 0-100
+ void setPulseMin( float ); // Set smallest pulse.
+ void setPulseMax( float ); // Set largest pulse.
+ int getSpeed();
+
+ private:
+ PwmOut *pwmPin; // Pin used for PWM.
+ int currentSpeed; // Speed of the motor.
+ float pulse; // Current pulse of the motor.
+ float pulseMin; // Shortest value for the pulse
+ float pulseMax; // Largest value for the pulse.
+};
+
+#endif
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/quadCommand/sensors/MMA8451Q.lib Sun Jul 28 21:46:54 2013 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/JoKer/code/MMA8451Q/#2d14600116fc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/quadCommand/sensors/sensors.cpp Sun Jul 28 21:46:54 2013 +0000
@@ -0,0 +1,33 @@
+/************************ quadCommand.cpp ********************************/
+/* */
+/*************************************************************************/
+#include "sensors.h"
+
+/***************************** sensors() *********************************/
+/* */
+/*************************************************************************/
+
+sensors::sensors()
+{
+ acc = new MMA8451Q( ACCSDA, ACCSCL, MMA8451_I2C_ADDRESS);
+}
+
+/************************** getAbsoluteX() *******************************/
+/* Returns a float from -1 to 1 for the value off level in the x */
+/*directoin. 0 = level. */
+/*************************************************************************/
+
+float sensors::getAbsoluteX()
+{
+ return acc->getAccX();
+}
+
+/************************** getAbsoluteY() *******************************/
+/* Returns a float from -1 to 1 for the value off level in the Y */
+/*directoin. 0 = level. */
+/*************************************************************************/
+
+float sensors::getAbsoluteY()
+{
+ return acc->getAccY();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/quadCommand/sensors/sensors.h Sun Jul 28 21:46:54 2013 +0000
@@ -0,0 +1,21 @@
+/************************* quadCommand.h *********************************/
+/* */
+/*************************************************************************/
+#include "quadCommand.h"
+#include "MMA8451Q.h"
+
+#ifndef SENSORS_H
+#define SENSORS_H
+
+class sensors
+{
+ public:
+ sensors();
+ void sendData();
+ float getAbsoluteX(); // Get the value off level in the X directoin.
+ float getAbsoluteY(); // Get the value off level in the Y directoin.
+
+ private:
+ MMA8451Q *acc; // Pointer to the acceleromi
+};
+#endif
\ No newline at end of file
