TheBlue Phoenix
Created November 29, 2019 © GPL3+

ExoArm V1

A 35$ IOT, voice & gesture operated wearable exoskeleton arm that reduces the bicep muscle strain, enabling a weak arm to lift around 10kg.

IntermediateFull instructions provided10 days71
ExoArm V1

Things used in this project

Hardware components

STM32F103CBT6
×1
HC-05 Bluetooth Module
HC-05 Bluetooth Module
×1
SmartElex single channel DC motor driver
×1
DC motor (generic)
×1
LiPo battery 2200mAH, 12V
×1

Software apps and online services

BlueTalk
Arduino IDE
Arduino IDE
Circuit Maker
CircuitMaker by Altium Circuit Maker

Hand tools and fabrication machines

Welding machine
Lathe machine
Fixed Drill

Story

Read more

Custom parts and enclosures

ExoArm V1

Complete preliminary design, version 1

ExoArm V1 - Forearm

The preliminary CAD design of plate 1, meant for the forearm.

ExoArm V1 - Back Arm

Preliminary CAD design of the plate 2 meant for back arm

ExoArm V1 Shoulder plate

Preliminary design of the shoulder plate

ExoArm V1: Cut and drill file

File with measurements and holes

Schematics

ExoArm SchDoc file

It is the Altium 20 designer schematic file containing all the connections and circuitries of the ExoArm V1.

ExoArm Schematic Image

The PNG file of the Altium schematic file.

Code

aarp_code_exoarm

C/C++
Code for ExoArm
#include <SoftwareSerial.h>
/*********************************
 * Cod  e for ExoArm V1
 * Author : TheBluePhoenix
 * Pin Connections with Nano (or Bluepill) - 
 * 
 * **************Flex sensor************
 * A0 - Thumb flex sensor S1
 * A1 - Index finger flex sensor S2
 * A2 - Middle finger flex sensor S3
 * A3 - Ring finger flex sensor S4
 * A4 - Tiny finger flex sensor S5
 * Flex Sensor glove VCC - 5V
 * ****************HC-05****************
 * State - NC 
 * Key/EN - D9
 * RXD - D11
 * TXD - D10
 * GND - GND
 * VCC - VCC
 * **************Motor Driver***********
 * PWM - D2
 * DIR - D3 
 * GND - GND
 * 
 */

 #define S0 A0
 #define S1 A1
 #define S2 A2
 #define S3 A3
 #define S4 A4
 #define PWM_pin 2
 #define DIR_pin 3

SoftwareSerial BTSerial(10, 11);
int Sreadings[5];        // the readings from temp sensor
int Sindex = 0;                       //index of current reading
int Stotal = 0;                       // the running total
int SAverage = 0;                     // the average
int V1,V2,V3,V4,V5;
char ch;
int threshold;

 void setup()
{
  pinMode(9, OUTPUT);  // this pin will pull the HC-05 pin 34 (key pin) HIGH to switch module to AT mode
  digitalWrite(9, HIGH);
  Serial.begin(9600);
  Serial.println("Enter AT commands:");
  BTSerial.begin(38400);  // HC-05 default speed in AT command more
}

void loop()
{
  
V1 = analogRead(S0);
Sreadings[0] = map(V1,0,1023,0,255);
V2 = analogRead(S1);
Sreadings[1] = map(V2,0,1023,0,255);
V3 = analogRead(S2);
Sreadings[2] = map(V3,0,1023,0,255);
V4 = analogRead(S3);
Sreadings[3] = map(V4,0,1023,0,255);
V5 = analogRead(S4);
Sreadings[4] = map(V5,0,1023,0,255);
 
Stotal = Sreadings[0] + Sreadings[1] + Sreadings[2] + Sreadings[3] + Sreadings[4];
SAverage = Stotal / 5;      

// DIR_pin is used to set the direction of rotation
// PWM_pin is used to set the revolutions per minute
// If average value of flex sensors is more than the threshold value then move the arm UP

if(SAverage>threshold){
  digitalWrite(DIR_pin , 1);
  digitalWrite(PWM_pin , 50);
}

// If average value of flex sensors is equal to the threshold value then hold the arm position
else if(SAverage=threshold){
  digitalWrite(DIR_pin , 1);
  digitalWrite(PWM_pin , 1);
}

// If average value of flex sensors is less than the threshold value then move the arm DOWN
else if(SAverage<threshold){
  digitalWrite(DIR_pin , 0);
  digitalWrite(PWM_pin , 50);
}

// Check for bluetooth input and move the arm accordingly 
if (BTSerial.available()) {
  ch = BTSerial.read();
  switch (ch) {
      case 'u':
      digitalWrite(DIR_pin , 1);
      digitalWrite(PWM_pin , 50);
      break;
  
      case 's':
      digitalWrite(DIR_pin , 1);
      digitalWrite(PWM_pin , 1);
      break;
  
      case 'd':
      digitalWrite(DIR_pin , 0);
      digitalWrite(PWM_pin , 50);
      break;
  
      default:
      digitalWrite(DIR_pin , 1);
      digitalWrite(PWM_pin , 1);
      break;
  }
}
}

Credits

TheBlue Phoenix

TheBlue Phoenix

7 projects • 32 followers
I have represented India Internationally. I have knowledge of various boards and embedded coding, FPGAs, TI, ADI, On Semi, RPi, SBCs etc.

Comments