Abstract

A problem for wheelchair users is that they have difficulty reaching high shelves, sitting at high tables or bars, and talking at eye level during a conversation. This system addresses this problem by using two motorized scissor jacks placed between the base and the bottom of the chair in order to raise and lower the chair with the press of a button.

Overview

A device was built that replaced the original plate that connected the chair to the base. A pole that fit into the base was welded to a plate onto which both jacks were bolted. The top of the jacks were bolted onto another plate that was bolted to the chair. The mechanical diagram and accompanying pictures show this.

In order to control the jacks, an adruino was used that interfaced with a matrix keypad. The buttons on the keypad sent signals to the arduino, which interpreted the signals to turn certain relays on and off. Relays had to be used in order to convert the 5 Volt signals that the aruino can send into the 12 Volt source that the motors need to operate. Transistors had to be used in order to source/sink all the current that the relays needed.

The jacks were designed to move together, but because they use two different motors, one of the jacks is able to be moved independently, so that the user can fix any tilting that may occur. The arduino code and the circuit diagrams are shown below.

Moving Forward

If the project were to be continued, several improvements should be made: - Use of a scissor lift or a gear train, so that there is only one motor for the entire system; - Incorporation of memory feature; and - Implementation of physical limit switches that do not require arduino interpretation.

Pictures

Code

/*EID101E
 
Chair Lift
 
by
Jung Whan Ahn, Aman Grewal, Jihung Kahn, 
Eli Soffer, & Tiffany Tang 
 
Prof. Kirtman
 
Controls motors that lift chair.
Both raises and lifts chair.
Ability to control one jack independently, to fix any slanting.
 
 
To be integrated with the other projects. */
 
#include <Keypad.h> //for interfacing with the Keypad
 
const int FmotPin = 1; //turns front motor on/off
const int RmotPin = 2; //turns rear motor on/off
const int dirPin = 3; //controls motor direction
const int uplimPin = 4; //limit switch for up
const int downlimPin = 5; //limit switch for down
 
void setup()
{
  pinMode(FmotPin, OUTPUT);
  pinMode(RmotPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
  pinMode(uplimPin, INPUT_PULLUP);
  pinMode(downlimPin, INPUT_PULLUP);
}
void uplimit() //defining the up limit switch function
{
  if (uplimPin==HIGH)
  {
    digitalWrite(FmotPin, HIGH); //PNP transistors allow current when the base is grounded
    digitalWrite(RmotPin, HIGH);
  }
}
void downlimit()
{
  if (downlimPin==HIGH)
  {
    digitalWrite(FmotPin, HIGH);
    digitalWrite(RmotPin, HIGH);
  }
}
void loop() 
{
  digitalWrite(FmotPin,HIGH);
  digitalWrite(RmotPin,HIGH); //ensures motors won't go on startup
  setHoldTime(200);
  char a = getKey();
  if (a == 'A') 
    {
      char b = getKey();
      if (b == '4') 
      {
         KeyState c = getState('4');
         while(c == HOLD) 
         {        
         digitalWrite(FmotPin,LOW);
         digitalWrite(RmotPin,LOW);
         digitalWrite(dirPin,LOW); // LOW is the down direction
         downlimit();
         }
      }
      if (b == '1') 
      {
        KeyState c = getState('1');
         while(c == HOLD) 
         {        
         digitalWrite(FmotPin,LOW);
         digitalWrite(RmotPin,LOW);
         digitalWrite(dirPin,HIGH); // HIGH is the up direction
         uplimit();
        }
      }
      if (b == '2') 
      {
        KeyState c = getState('2');
         while(c == HOLD) 
         {        
         digitalWrite(FmotPin,HIGH); //for adjustments
         digitalWrite(RmotPin,LOW);
         digitalWrite(dirPin,HIGH); // HIGH is the up direction
         uplimit();
         }
      }  
      if (b == '5') 
      {
        KeyState c = getState ('5');
        while(c == HOLD) 
        {        
         digitalWrite(FmotPin,HIGH);  // for adjustments
         digitalWrite(RmotPin,LOW);
         digitalWrite(dirPin,LOW); //LOW is the down direction
         downlimit();
         }      
       }
    }
}