AFO Source Code
Arduino motor code
/* ME379M_Project.ino The University of Texas at Austin ME379M: Robot Mechanism Design Fall 2013 Group: Blake Anderson, Andrew Sharp, Courtney Shell Written By: Blake Anderson This program for the Arduino Uno is used to control the active response of an ankle orthosis device. The program reads potentiometer AND EMG inputs corresponding to the foot's rotational position about the coronal axis. A PWM signal is then delivered to a Sabretooth 2x5 motor driver. INPUTS Pin A0: 10kOhm Linear Potentiometer. 0-5V Range. 2.5V at zero ankle rotation. Pin A1: 0-9V EMG Sensor. External circuit downscales to 0-5V. 0V at zero ankle rotation. OUTPUTS Pin 10: 500Hz Pulse Width Modulated square wave. 50% duty cycle corresponds to midpoint. */ /* DEFINE PINS */ const int potInputPin = A0; // Input pin for the potentiometer const int emgInputPin = A1; // Input pin for the EMG const int motorOutPin = 10; // Output motor signal /* DEFINE VARIABLES */ double potValue = 0; // The ADC value read from the potentiometer (0-255) double emgValue = 0; // The ADC value read from the EMG (0-255) const double setpoint = 127; // Motor setpoint const double deadband = 1; // Setpoint deadband bool emgEnable = true; // Enable reading of EMG, enable(1) or disable(0) bool potEnable = true; // Enable reading of potentiometer, enable(1) or disable(0) const double emgThreshold = 25; // Theshold value in (0-255) for the EMG signal /* SETUP - RUNS ONCE */ void setup() { // Declare the sensor input pinMode(potInputPin, INPUT); pinMode(emgInputPin, INPUT); // Declare the motor control output pinMode(motorOutPin, OUTPUT); } /* OPERATING LOOP */ void loop() { /* READ INPUTS */ potValue = analogRead(potInputPin); // Read potentiometer input (10-bit) potValue = map(potValue, 0, 1023, 0, 255); // Downscale to 8-bit emgValue = analogRead(emgInputPin); // Read EMG input (10-bit) emgValue = map(emgValue, 0, 1023, 0, 255); // Downscale to 8-bit /* DETERMINE CONTROL SCHEME (EMG or POT) */ /* EMG CONTROL */ if ( emgEnable == true && emgValue > emgThreshold ) { emgValue = map(emgValue, emgThreshold, 255, 192, 255); // Response is linear above the threshold analogWrite(motorOutPin, emgValue); } /* POT CONTROL */ else if ( potEnable == true ) { if (potValue < setpoint-deadband) potValue = map(potValue, 0, setpoint-deadband, 0, 63); // -12V to -6V else if (potValue > setpoint+deadband) potValue = map(potValue, setpoint+deadband, 255, 192, 255); // +6V to +12V else potValue = setpoint; // Motor stop analogWrite(motorOutPin, potValue); } else // Motor stop analogWrite(motorOutPin, setpoint); }
Welcome to the University Wiki Service! Please use your IID (yourEID@eid.utexas.edu) when prompted for your email address during login or click here to enter your EID. If you are experiencing any issues loading content on pages, please try these steps to clear your browser cache.