Smart Mobile Platform - UNLV Senior Design Project

This post will function as our project log and as a place to get input from other people.

Smart Mobile Platform (SMP)

The basic idea of the project is to create a mobile platform that can be customized according to the application needed.
Here is a block diagram of the general idea:

We decided to use a divide and conquer methodology and separate each part into modules.
Using modules also enables flexibility and expandability in the design, allowing us or other to add/remove modules depending on the application.
The modular design also enables us to monitor the staus of each module and replace/repair if one is malfumctioning

Some of the modules will have micro controllers in it. We will be using Arduino for initial prototyping.

Control Module:
-Sends movement control data to Master Module

Sensor Module:
-Sends sensor info to Master Module

Power Module:
-power management

Navigation Module:
-GPS, compass, etc

Master Module:
-gathers data from other modules and process them

  • connects to embedded system

Embedded System:
-provides GUI to user
-connects to internet
-for now we are considering the beaglebaord or pandaboard

Custom Modules
-modules can be added depending on the application or needs
-allows us to add a turret if we want :grin: :grin: :grin:

For our actual project, we will implement the SMP system to an electric wheelchair

Alternative Control System: (ACS)

  • Control system designed specifically according to the person’s disability or needs

  • Head Control
    -Head tilts
    -look direction
    -control system designed for quadriplegics and amputees

  • Other Control systems
    -voice
    -eeg (thought control)
    -remote control

Collision Avoidance System (CAS)
-avoid collision using sensors

Vital Signs Monitoring System (VSMS)
-monitor vital signs
-for these part I will implement a project I have done before
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1292560660/all

Navigation System (NavS)
-navigation via GPS

We also plan to have a web interface where we can monitor the vital signs and location of the user.

What we have done so far:
-interfacing with 3-axis accelerometer (head control)
-interfacing with i2c comapass module (head control and Navigation)
-interfacing with GPS module (naviagation)
-interfacing with ultrasonic proximity sensors (CAS)
-ECG circuit (vital sign monitoring) http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1292560660/all

Still needs to be done:
-motor controller/driver
-all the individual modules
-embedded system
-Local user GUI
-Web GUI
-Safety features
-power management
-communication between modules and master module
-we are considering of using CAN or creating our own protocol
-mechanical
-basically ALOT MORE!

We are in the first of Senior design, we are only required to have a paper design before the end of the semester but we decided to start early because of the complexity and magnitude of our project

Project Status:
3%

Pls feel free to leave comments, criticism, and especially ideas as they would be very helpful[/list]

In order for our modules to communicate, I needed to figure out a way where the slave modules(arduinos) can send data to the master without colliding with other slave modules.

I first though of using I2C but decided not to for several reasons:
-The master does not know in advance which slave or how many slave modules are connected.
-Cannot have multiple slave modules that are the same(ex. two control modules).
-Master would have two know addresses of each module in advance.
-Master would have to ask each module everytime.

Instead I figured out a way for multiple slave modules(arduinos) to share the UART.
I did this by having each slave Tx pin connected to a reverse diode, then connected two the rx pin of the master.
I also have two control pins to control which slave is allowed to send.

I call it Collision Prevention Mutiple Tx

There are a couple rules to achieve this:
-Only one slave module can send at a time.
-before sending data, slave would have to first check if the bPin(in) is high or low, if it is low the ok to send, if high delay random then try again.
-Before sending data slave module sets sPin(out) high, to lock the bus.
-when master is receiving data it sets a high in the rPin(in), it sets the bPin(out) high.

Here are some example code:

Example slave module code:

//Slave Module
//Dino Tinitigan

int ID = 1;

void setup()
{
   Serial.begin(57600);
   pinMode(7, INPUT);
   pinMode(13, OUTPUT);
   digitalWrite(13, LOW);
}

void loop()
{
  int test = digitalRead(7);
  if(test == HIGH)
  {
    //Bus is busy
    int x = random(5,50);
    delay(x);
  }
  else
  {
    digitalWrite(13, HIGH); //pull HIGH to signify sending
    Serial.print(ID, BYTE); //write the data   
    delay(10);
    digitalWrite(13, LOW); //pull LOW to signify done sending
    delay(100); //delay to give others a chance to use Bus
  }  
}

Example of Master slave Code:

//Master Module
//Dino Tinitigan
//implement checksum

byte incoming;
int busyPin = 52;
int rPin = 53;
int count;
void setup()
{
  Serial.begin(57600);
  pinMode(busyPin, OUTPUT);
  pinMode(rPin, INPUT);
}

void loop()
{
  int test = digitalRead(rPin);
  while(test == LOW) //nobody is sending
  {
    digitalWrite(busyPin, LOW);
    test = digitalRead(rPin);
  }
  
  count = 0; //counter for BYTES recieved
  digitalWrite(busyPin, HIGH); //set pin HIGH to lock bus
  
  //process commands
  if(Serial.available() > 0)
  {
    incoming = Serial.read();
    count++;
    if(count ==1;)
    {
      //read header byte
    }
    else if(count == 2)
    {
      //read function ID byte
    }
    /**
    ---------------test code-----------------------------
    if(incoming >10)
    {
      Serial.print("Collision!!!!!!!!!!!! Need to wait  ");
      Serial.println(incoming, DEC);
    }
    else
    {
      Serial.print("Received from: ");
      Serial.println(incoming, DEC);
    }
    **/
  }
  delay(10); //lock bus for 50ms more
  digitalWrite(busyPin, LOW); //set pin LOW to free bus
}

void controlModule()
{
}

void CASModule()
{
}

void ECGModule()
{
}

void navModule()
{
}

I am not sure if there is an actual proper name for this scheme or if somebody has though of it or something similar to it before.
Anyway pls feel free to leave comments.

Project Update

Main Enclosure with master module and motor controller


Control Module 50% completed

*Current Features
-Wii nunchuck control
-RJ-45 port for comms with master module
-Another RJ-45 port for comms with an external alternate control
-Tilt compensated compass

*Future Additions
-external head control via an additional tilt compensated compass on the head of the user
-joystick control


CAS(Collision Avoidance System) Module 40% completed

*Current Features
-3x ultrasonic distance sensors
-RJ 45 port for comms with master

  • Future Additions
    -Mores sensors for side and back distance detection

XBee Module

*Current Features
-XBee
-RJ45 port for comms with master


Project Description:
-Each module has an atmega328p with the arduino bootloader
-Master would have an atmega1280
-Motor Controller used is a Sabertooth 2x50HV

Project Status 10% Completed