Motor control for robotic arm

Dependencies:   MCP23017 WattBob_TextLCD mbed

Fork of Balanced Arm by Balanced Arm

Committer:
wm70
Date:
Tue Feb 09 14:59:12 2016 +0000
Revision:
18:b79a9a7cf5fb
Parent:
17:258067827672
Child:
19:bf64727d5b0e
torque position half working ; set CW and CCW

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ADAMSTRUTT 7:40d7d88deba3 1 //*********************************************************************
wm70 12:68f82c3e27e9 2 // Author:
wm70 12:68f82c3e27e9 3 // File:
wm70 12:68f82c3e27e9 4 // Version:
wm70 12:68f82c3e27e9 5 // Date:
ADAMSTRUTT 7:40d7d88deba3 6 //*********************************************************************
ADAMSTRUTT 7:40d7d88deba3 7
ADAMSTRUTT 7:40d7d88deba3 8 #include <string>
wm70 12:68f82c3e27e9 9 #include "PC_Comms.h"
ADAMSTRUTT 7:40d7d88deba3 10 #include "mbed.h"
ADAMSTRUTT 7:40d7d88deba3 11 #include "MCP23017.h"
ADAMSTRUTT 7:40d7d88deba3 12 #include "WattBob_TextLCD.h"
wm70 9:87558e7cfecb 13 #include "AX12.h"
ADAMSTRUTT 11:7f74fb17c328 14
ADAMSTRUTT 11:7f74fb17c328 15 MCP23017 *par_port;
ADAMSTRUTT 11:7f74fb17c328 16 WattBob_TextLCD *lcd;
ADAMSTRUTT 11:7f74fb17c328 17 Serial ax12_bus(p28, p27);
wm70 14:3be8ca0c066d 18 Serial _PCbus(USBTX, USBRX);
wm70 14:3be8ca0c066d 19 AX12 my_AX12(ax12_bus, _PCbus, p29, 1);
ADAMSTRUTT 7:40d7d88deba3 20
ADAMSTRUTT 7:40d7d88deba3 21 //*********************************************************************
wm70 12:68f82c3e27e9 22 // Object:
wm70 12:68f82c3e27e9 23 // Description:
ADAMSTRUTT 7:40d7d88deba3 24 //*********************************************************************
ADAMSTRUTT 7:40d7d88deba3 25
wm70 14:3be8ca0c066d 26 PC_Comms::PC_Comms()
wm70 14:3be8ca0c066d 27 {
ADAMSTRUTT 7:40d7d88deba3 28
ADAMSTRUTT 11:7f74fb17c328 29 par_port = new MCP23017(p9, p10, 0x40);
ADAMSTRUTT 11:7f74fb17c328 30 par_port->config(0x0F00, 0x0F00, 0x0F00);
ADAMSTRUTT 11:7f74fb17c328 31 lcd = new WattBob_TextLCD(par_port);
ADAMSTRUTT 11:7f74fb17c328 32 par_port->write_bit(1, BL_BIT);
ADAMSTRUTT 7:40d7d88deba3 33 }
ADAMSTRUTT 7:40d7d88deba3 34
ADAMSTRUTT 7:40d7d88deba3 35 //*********************************************************************
ADAMSTRUTT 7:40d7d88deba3 36 // Method: PC_Connect
ADAMSTRUTT 7:40d7d88deba3 37 // Description: This method is used to connect the PC to the mbed.
ADAMSTRUTT 7:40d7d88deba3 38 //*********************************************************************
ADAMSTRUTT 7:40d7d88deba3 39
wm70 12:68f82c3e27e9 40 void PC_Comms::PC_Connect(void){
wm70 18:b79a9a7cf5fb 41
wm70 18:b79a9a7cf5fb 42 my_AX12.SetCWLimit(0);
wm70 18:b79a9a7cf5fb 43 my_AX12.SetCCWLimit(300);
wm70 18:b79a9a7cf5fb 44 lcd->printf("Mode_Set 0-300");
wm70 18:b79a9a7cf5fb 45 wait(1);
wm70 18:b79a9a7cf5fb 46
ADAMSTRUTT 11:7f74fb17c328 47 lcd->cls();
ADAMSTRUTT 11:7f74fb17c328 48 lcd->printf("Connecting");
ADAMSTRUTT 11:7f74fb17c328 49 lcd->locate(1,0);
ADAMSTRUTT 11:7f74fb17c328 50 lcd->printf("to PC");
Hamilton252 10:d7cce35b7bfd 51 while('s' != _PCbus.getc()){
ADAMSTRUTT 7:40d7d88deba3 52 }
Hamilton252 10:d7cce35b7bfd 53 while('s' != _PCbus.getc()){
ADAMSTRUTT 7:40d7d88deba3 54 }
ADAMSTRUTT 11:7f74fb17c328 55 lcd->cls();
wm70 18:b79a9a7cf5fb 56 lcd->printf("Connected\n");
ADAMSTRUTT 7:40d7d88deba3 57 wait(2);
wm70 9:87558e7cfecb 58 }
wm70 9:87558e7cfecb 59
wm70 12:68f82c3e27e9 60 void PC_Comms::PC_Read(void){
ADAMSTRUTT 11:7f74fb17c328 61
Hamilton252 10:d7cce35b7bfd 62 char Command[8];
ADAMSTRUTT 11:7f74fb17c328 63
ADAMSTRUTT 11:7f74fb17c328 64 lcd->cls();
ADAMSTRUTT 11:7f74fb17c328 65 lcd->printf("Reading PC");
wm70 9:87558e7cfecb 66
wm70 18:b79a9a7cf5fb 67 if(_PCbus.readable()==1){
ADAMSTRUTT 11:7f74fb17c328 68 Command[0] = _PCbus.getc();
ADAMSTRUTT 11:7f74fb17c328 69 if(Command[0]=='s')
Hamilton252 10:d7cce35b7bfd 70 {
ADAMSTRUTT 11:7f74fb17c328 71 while(_PCbus.readable()==0){}
ADAMSTRUTT 11:7f74fb17c328 72 Command[1] = _PCbus.getc();
ADAMSTRUTT 11:7f74fb17c328 73 if(Command[1]=='c')
ADAMSTRUTT 11:7f74fb17c328 74 {
wm70 12:68f82c3e27e9 75 for(int x=2;x<=7;x++)
wm70 12:68f82c3e27e9 76 {
wm70 12:68f82c3e27e9 77 while(_PCbus.readable()==0){}
wm70 12:68f82c3e27e9 78 Command[x] = _PCbus.getc();
wm70 12:68f82c3e27e9 79 }
wm70 18:b79a9a7cf5fb 80 // lcd->cls();
wm70 18:b79a9a7cf5fb 81 // lcd->printf("%s", Command);
wm70 12:68f82c3e27e9 82 switch(Command[2])
wm70 12:68f82c3e27e9 83 {
ADAMSTRUTT 11:7f74fb17c328 84 case '0':
ADAMSTRUTT 16:585f8b5abc2c 85 char angle[3];
ADAMSTRUTT 16:585f8b5abc2c 86 angle[0] = Command[4];
ADAMSTRUTT 16:585f8b5abc2c 87 angle[1] = Command[5];
ADAMSTRUTT 16:585f8b5abc2c 88 angle[2] = Command[6];
ADAMSTRUTT 16:585f8b5abc2c 89 int angle2 = atoi(angle);
wm70 18:b79a9a7cf5fb 90 //lcd->cls();
wm70 18:b79a9a7cf5fb 91 //lcd->printf("%i", angle2);
wm70 18:b79a9a7cf5fb 92
ADAMSTRUTT 16:585f8b5abc2c 93 my_AX12.SetGoal(angle2);
ADAMSTRUTT 16:585f8b5abc2c 94 break;
ADAMSTRUTT 11:7f74fb17c328 95 default:
ADAMSTRUTT 11:7f74fb17c328 96 break;
wm70 12:68f82c3e27e9 97 }
ADAMSTRUTT 11:7f74fb17c328 98 }
ADAMSTRUTT 11:7f74fb17c328 99 }
ADAMSTRUTT 11:7f74fb17c328 100 }
wm70 18:b79a9a7cf5fb 101 }
Hamilton252 10:d7cce35b7bfd 102
wm70 12:68f82c3e27e9 103 void PC_Comms::PC_WriteLoad(char _servo){
ADAMSTRUTT 16:585f8b5abc2c 104
wm70 14:3be8ca0c066d 105 char _returnToPC[4];
wm70 17:258067827672 106 int load_data;
ADAMSTRUTT 11:7f74fb17c328 107
wm70 17:258067827672 108 load_data = my_AX12.GetLoad();
ADAMSTRUTT 16:585f8b5abc2c 109 _returnToPC[0] = 'S';
ADAMSTRUTT 16:585f8b5abc2c 110 _returnToPC[1] = 'D';
ADAMSTRUTT 16:585f8b5abc2c 111 _returnToPC[2] = '0';
ADAMSTRUTT 16:585f8b5abc2c 112 _returnToPC[3] = _servo;
ADAMSTRUTT 11:7f74fb17c328 113
wm70 17:258067827672 114 if(load_data >= 1000){
wm70 17:258067827672 115 _PCbus.printf("%s%i",_returnToPC, load_data);
wm70 17:258067827672 116 }else if(load_data > 1000 && load_data >= 100){
wm70 17:258067827672 117 _PCbus.printf("%s0%i", _returnToPC, load_data);
wm70 17:258067827672 118 }else if(load_data> 1000 && load_data >= 10){
wm70 17:258067827672 119 _PCbus.printf("%s00%i", _returnToPC, load_data);
ADAMSTRUTT 16:585f8b5abc2c 120 }else{
wm70 17:258067827672 121 _PCbus.printf("%s000%i", _returnToPC, load_data);
ADAMSTRUTT 16:585f8b5abc2c 122 }
wm70 18:b79a9a7cf5fb 123 }
wm70 18:b79a9a7cf5fb 124
wm70 18:b79a9a7cf5fb 125
wm70 18:b79a9a7cf5fb 126
wm70 18:b79a9a7cf5fb 127 void PC_Comms::PC_WritePosition(char _servo){
wm70 18:b79a9a7cf5fb 128
wm70 18:b79a9a7cf5fb 129 // char _returnToPC_pos[4];
wm70 18:b79a9a7cf5fb 130 // int pos_data;
wm70 18:b79a9a7cf5fb 131 //
wm70 18:b79a9a7cf5fb 132 // pos_data = my_AX12.GetPosition();
wm70 18:b79a9a7cf5fb 133 // _returnToPC_pos[0] = 'S';
wm70 18:b79a9a7cf5fb 134 // _returnToPC_pos[1] = 'D';
wm70 18:b79a9a7cf5fb 135 // _returnToPC_pos[2] = '1';
wm70 18:b79a9a7cf5fb 136 // _returnToPC_pos[3] = _servo;
wm70 18:b79a9a7cf5fb 137 //
wm70 18:b79a9a7cf5fb 138 //// if(pos_data >= 1000){
wm70 18:b79a9a7cf5fb 139 // _PCbus.printf("%s%i",_returnToPC_pos, pos_data);
wm70 18:b79a9a7cf5fb 140 //// }else if(pos_data > 1000 && pos_data >= 100){
wm70 18:b79a9a7cf5fb 141 //// _PCbus.printf("%s0%i", _returnToPC_pos, pos_data);
wm70 18:b79a9a7cf5fb 142 //// }else if(pos_data> 1000 && pos_data >= 10){
wm70 18:b79a9a7cf5fb 143 //// _PCbus.printf("%s00%i", _returnToPC_pos, pos_data);
wm70 18:b79a9a7cf5fb 144 //// }else{
wm70 18:b79a9a7cf5fb 145 //// _PCbus.printf("%s000%i", _returnToPC_pos, pos_data);
wm70 18:b79a9a7cf5fb 146 //// }
ADAMSTRUTT 7:40d7d88deba3 147 }