Accelerometer Controlled Motors via Wifly

Lab 4 ECE 4180 GaTech

By Lindsay Herron and Javier Ceballos-Leon

This demo requires the use of

  • Two mbeds (one for client and one for server)
  • Two WiFly RN-XV modules (one for client and one for server)
  • LSM9DS1 Breakout for IMU Accelerometer data
  • uLCD-144-G2
  • Speaker
  • H-Bridge
  • Two DC Motors
  • Robot Shell
  • Power Supply

Server Setup

Requirements

  • An mbed
  • A WiFly RN-XV module
  • LSM9DS1 Breakout for IMU Accelerometer data
  • uLCD-144-G2
  • Speaker

The below image shows the overall layout of the server. /media/uploads/lherron8/server.jpg

To connect the speaker, the below information is required to connect the driver circuit. Mbed pin 21 will be connected to the resistor below.

/media/uploads/lherron8/drivercircuit.jpeg /media/uploads/lherron8/transistorlayout.png

The wifly interface is shown below for wifly pin out, but the table will show what pin out was used from our side of the mbed. /media/uploads/lherron8/wiflyinterface.png

The pin out of the server is shown below:

/media/uploads/lherron8/serverpinout.png

Client Setup

Requirements:

  • An mbed
  • A WiFly RN-XV module
  • H-Bridge
  • Two DC Motors
  • Robot Shell
  • Power Supply

The below image shows the overall client setup.

/media/uploads/lherron8/client.jpg

The wifly interface is shown below for wifly pin out, but the table will show what pin out was used from our side of the bed.

/media/uploads/lherron8/wiflyinterface.png

A power supply capable of 5V and 2A should work with this set-up, where + goes to the 5V rail and - goings to GND.

The pin out of the client is shown below:

/media/uploads/lherron8/clientpinout.png

Below is the code to take the accelerometer and send the data to the client.

TCP Echo Server Using Wifly Sending IMU Accelerometer Data

#include "mbed.h"
#include "WiflyInterface.h"
#include "LSM9DS1.h"
#include "uLCD_4DGL.h"
#define ECHO_SERVER_PORT   7
#define PI 3.14159
#define DECLINATION -4.94 
/* wifly object where:
*     - p9 and p10 are for the serial communication
*     - p25 is for the reset pin
*     - p26 is for the connection status
*     - "mbed" is the ssid of the network
*     - "password" is the password
*     - WPA is the security
*/

class Speaker
{
public:
    Speaker(PinName pin) : _pin(pin) {
// _pin(pin) means pass pin to the Speaker Constructor
    }
// class method to play a note based on PwmOut class
    void PlayNote(float frequency, float duration, float volume) {
        _pin.period(1.0/frequency);
        _pin = volume/2.0;
        wait(duration);
        _pin = 0.0;
    }
 
private:
// sets up specified pin for PWM using PwmOut class 
    PwmOut _pin;
};

Serial pc(USBTX, USBRX);
WiflyInterface wifly(p9, p10, p25, p26, "OnePlus2","password",WPA);//"ZETA", "vRinD87d", WPA);
uLCD_4DGL uLCD(p13, p14,p30);
float x = 64;
float y = 64;
float magX;
float magY;
float noteVal;
char buf[128];

int main (void)
{
    
    Speaker mySpeaker(p21);
    // loops forever playing two notes on speaker
    uLCD.baudrate(3000000); 
    pc.printf("Party Started!!!");
    wifly.init("192.168.43.140","255.255.255.0","192.168.43.1"); // do not use DHCP
    while (!wifly.connect()); // join the network
    pc.printf("IP Address is %s\n\r", wifly.getIPAddress());

    TCPSocketServer server;
    server.bind(ECHO_SERVER_PORT);
    server.listen();
    
    pc.printf("\nWait for new connection...\n");
    TCPSocketConnection client;
    server.accept(client);
    
    /// init IMU
    LSM9DS1 IMU(p28, p27, 0xD6, 0x3C);
    IMU.begin();
    if (!IMU.begin()) {
       //pc.printf("Failed to communicate with LSM9DS1.\n");
       }
    IMU.calibrate();
    while(1) {
       while(!IMU.accelAvailable()){pc.printf("Failed Acc\n\r");};
       IMU.readAccel();
        
        x = IMU.ax;
        y = IMU.ay;   
       
        //Level
        uLCD.circle(64, 64, 7, WHITE); 
        uLCD.filled_circle(x/240+64, y/240+64, 5, WHITE);
        wait(.075);
        uLCD.filled_circle(x/240+64, y/240+64, 5, BLACK);  
        sprintf(buf,"%f/%f\n\r",x,y);
        client.send_all(buf, 128);
        //pc.printf("%s",buf);
        noteVal =((fabsf(x)+fabsf(y))/18.285714286)+250;
        //pc.printf("%f",noteVal);
        mySpeaker.PlayNote(noteVal, 0.1, 0.1);
    }
    
}

Below is the code that was used to control the motor.

TCP Echo Client Using Wifly Receiving Server Data and Controlling DC Motors via H-bridge

#include "WiflyInterface.h"
#include "mbed.h"
#include "string.h"
#include "stdio.h"
#include "ultrasonic.h"

DigitalOut rright(p6);
DigitalOut fright(p5);
DigitalOut rleft(p7);
DigitalOut fleft(p8);
DigitalOut LED(LED1);
PwmOut a(p26);
PwmOut b(p25);

Serial pc(USBTX, USBRX);
//Motion Control Functions
void forward(float a);
void reverse(float a);
void rotLeft(float a);
void rotRight(float a);

//Wifly
const char* ECHO_SERVER_ADDRESS = "192.168.43.140";
const int ECHO_SERVER_PORT = 7;
WiflyInterface wifly(p9, p10, p21, p24, "OnePlus2", "password", WPA);


//vars
float x=0;
float y=0;

int main()
{
    char *p;//To split in_buffer
    char *p1;
    pc.printf("Party started");
    wifly.init(); // use DHCP
    while (!wifly.connect()); // join the network
    pc.printf("IP Address is %s\n\r", wifly.getIPAddress());
    TCPSocketConnection socket;
    while (socket.connect(ECHO_SERVER_ADDRESS, ECHO_SERVER_PORT) < 0) {
        pc.printf("Unable to connect to (%s) on port (%d)\r\n", ECHO_SERVER_ADDRESS, ECHO_SERVER_PORT);
        wait(1);
    }
    socket.set_blocking(false, 1500);
    char in_buffer[128];

    while (1) {

        int n = socket.receive(in_buffer, 128);
    
        //pc.printf("%s\n\r", in_buffer);

        p = strtok(in_buffer, "/");
        p1 = strtok(NULL, "/");
        x = (float) atof(p);
        y = (float) atof(p1);
        x = x/10000;//normalize
        y = y/10000;//normalize
    wait(0.1);
        //pc.printf("x is %f y is %f\n\r", x, y);

        //***************FORWARD**************
        //RIGHT
        if(x<0&&y<0) {
            if(fabsf(x)>fabsf(y)) {
                a= fabsf(y);
                b= fabsf(x);
                fright = 1;
                fleft = 1;
                rleft=0;
                rright=0;
            } else {
                a= fabsf(y)-fabsf(x);
                b= fabsf(y);
                fright = 1;
                fleft = 1;
                rleft=0;
                rright=0;
            }
        }
        //LEFT
        else if(x>0&&y<0) {
            if(fabsf(x)>fabsf(y)) {
                a=fabsf(x);
                b=fabs(y);
                fright = 1;
                fleft = 1;
                rleft=0;
                rright=0;
            } else {
                a= fabsf(y);
                b= fabsf(y)-fabsf(x);
                fright = 1;
                fleft = 1;
                rleft=0;
                rright=0;
            }
        }

        //**************REVERSE*****************
        //RIGHT
        else if(x<0&&y>0) {
            if(fabsf(x)>fabsf(y)) {
                a= fabsf(y);
                b =  fabsf(x);
                rright = 1;
                rleft = 1;
                fleft=0;
                fright=0;
            } else {
                a = fabsf(y)- fabsf(x);
                b = fabsf(y);
                rright = 1;
                rleft = 1;
                fleft=0;
                fright=0;
            }
        }
        //LEFT
        else if(x>0&&y>0) {
            if(fabsf(x)>fabsf(y)) {
                a= fabsf(x);
                b= fabsf(y);
                rright = 1;
                rleft = 0;
                fleft=0;
                fright=0;
            } else {
                a =  fabsf(y);
                b =  fabsf(y)- fabsf(x);
                rright = 1;
                rleft = 1;
                fleft=0;
                fright=0;
            }
        }
    }
}

The below video shows a demo of this project.


Please log in to post comments.