Reddy Update
From IntRoLab
Revision as of 15:06, 28 July 2009 by Dominic Létourneau (talk | contribs) (→Motor Controller Variables)
Contents
Schedule
Week 31, July 27 - August 1 |
|
Week 32, August 3 - August 9 |
|
Week 33, August 10 - August 15 |
|
Arm Improvements
To have better control of the arm (and neck) motors, we did the following :
- Change the Motor PCB to support
- Temperature detector. A signal will be sent to the motor controller if the motor temperature is higher than 60 degrees celcius. Analog temperature value is also available.
- Potentiometer feedback.
- Motor power connection.
- Design a new PCB with support to 4 motors
- Communicate with the CAN bus already available on Reddy
- Allow position feedback from the RS-232 interface
- Create a tuning GUI for easier setup of the robot controllers
Motor PCB
Motor Controllers
- A new motor drive that can connect up to 4 motors have been designed.
- A new adjustable bracket for fixing the drive to the side of the robot have been designed.
- We installed two motor controllers (one on each side) to allow the modification of 8 motors. Motors modified are :
- Arm-elbow (x2)
- Arm-shoulder (x2)
- Arm-updown (x2)
- Neck-YES (x1)
- Neck-NO (x1)
Cabling Improvements
- Cables are now better organized
- Added connectors inside the arm to disconnect motors easily for repairs
- Signals are color coded as follow (TODO ADD DOCUMENTATION)
- Red
- Green
- Black
- Yellow
- Purple
- Gray
- White
- Blue
Head Improvements
File:ReddyGravityCompensation.jpg
Motor controllers for head movement (YES-NO)
- Same motor controllers were used for the neck to add overheating protection and better feedback / control
- Internal servo potentiometers were used for position control.
Tuning the motor controller
A GUI was created to facilitate motor tuning.
RS-232 protocol enhancements
- We added a CAN command to the RS-232 robot interface to allow direct communication with the motor controllers. The RS-232 robot interface now acts as a RS-232 to CAN bridge and bidirectional communication is now possible. This will allow feedback from the motor controllers (current, position, speed, etc.)
(RS-232 CAN COMMAND) <------------------------> (MOTOR DRIVE CAN INTERFACE)
CAN command format for RS-232 communication
Serial messages containing CAN commands will have the following stucture :
HEADER | CAN_MSG_PRI_MSB_CMD | CAN_MSG_TYPE | CAN_MSG_BOOT_RTR_LENGTH | CAN_MSG_CMD | CAN_MSG_DEST | CAN_MSG_DATA |
(3 bytes) | (1 byte) | (1 byte) | (1 byte) | (1 byte) | (1 byte) | (8 bytes) |
|
|
|
|
if (MSG_TYPE == REQUEST)
endif if (MSG_TYPE == SENSOR_HIGH_PRIORITY)
endif |
|
|
Note: It is not essential to understand the structure of the CAN messages. Souce code will be provided to format the data correctly.
Motor Controller Variables
typedef struct _SharedVariables { union { struct { unsigned char CtrlMode; unsigned char CtrlType; unsigned char SetPointSource; unsigned char PosMesSource; unsigned short ErrorCode; short SetPoint; short SetPointMax; //Maximum SetPoint short SetPointMin; //Minimum SetPoint short Current; short CurrentOffset; short ADCValue; short ADCOffset; short ICValue; short ICOffset; short ThermalState; //CONTROL VARIABLES short Speed;//16 bit speed short Position; //16 bits position short Acceleration; //PID REF AND MES POINT short RefPoint; short MesPoint; float pid_kp; float pid_ki; float pid_kd; float pid_error; float pid_error_accum; float pid_error_derivative; float pid_error_accum_max; //PID I value max limit (abs) short PIDOut; //RAM LOC7 (PID + TRAPZ VARIABLES) short SpeedMax; //for Trapz short AccelerationStep; //for Trapz, Speed //RAM LOC8 (TRAPZ VARIABLES) short InitPoint; //for Trapz short DestPoint; //for Trapz short NextPoint; //for Trapz //RAM LOC9 (CURRENT LIMIT) short CurrentLimit; //unit = mA short PWM_CurrentLimit; short PWM_CurrentStep; //PWM increment unsigned char CurrentLimitActive; unsigned char EncoderBias; //Setting this to 1 will invert the encoder sign unsigned char MotorBias; //Setting this to 1 will invert motor polarity unsigned char padding[3]; } __attribute__((packed)); unsigned char m_data[]; }; } SharedVariables; typedef struct _GlobalVariables { union { struct { //All control variables SharedVariables m_variables[4]; //additional (global) variables unsigned char m_ESTOPEnabled; unsigned char m_WriteEEPROM; short m_loopTime; unsigned char m_padding[4]; } __attribute__((packed)); unsigned char m_data[]; };//union } GlobalVariables;
Useful Examples
Read all motor positions from the motor controller
Write the SetPoint of motor [0-3]
Future Improvements
- Single 12V power supply could be useful for direct connection to Pioneer robots. A 12V-->8.5V DC-DC (100W) converter is required for this operation. This item can be ordered at Vicor. 8.5V batteries would then be useless.