Motor control for robotic arm

Dependencies:   MCP23017 WattBob_TextLCD mbed

Fork of Balanced Arm by Balanced Arm

PC_Comms/PC_Comms.cpp

Committer:
wm70
Date:
2016-02-15
Revision:
21:ab49231d1479
Parent:
20:d93f0af76c7a
Child:
22:d7f63f83f0e9

File content as of revision 21:ab49231d1479:

//*********************************************************************
// Author: 
// File: 
// Version: 
// Date: 
//*********************************************************************

#include <string>
#include "PC_Comms.h"
#include "mbed.h"
#include "MCP23017.h"
#include "WattBob_TextLCD.h"
#include "AX12.h"
    
    MCP23017 *par_port;
    WattBob_TextLCD *lcd;
    Serial ax12_bus(p28, p27);
    Serial _PCbus(USBTX, USBRX);
    AX12 my_AX12(ax12_bus, _PCbus, p29, 1);

//*********************************************************************
// Object: 
// Description:  
//*********************************************************************

PC_Comms::PC_Comms() 
    {
        
        par_port = new MCP23017(p9, p10, 0x40);
        par_port->config(0x0F00, 0x0F00, 0x0F00);
        lcd = new WattBob_TextLCD(par_port);
        par_port->write_bit(1, BL_BIT);
}

//*********************************************************************
// Method: PC_Connect
// Description: This method is used to connect the PC to the mbed.
//*********************************************************************

void PC_Comms::PC_Connect(void){
    
    my_AX12.SetCWLimit(0);
    my_AX12.SetCCWLimit(300);
    lcd->printf("Mode_Set 0-300");
    wait(1);
    
    lcd->cls();
    lcd->printf("Connecting");
    lcd->locate(1,0);
    lcd->printf("to PC");
    while('s' != _PCbus.getc()){
        }
    while('s' != _PCbus.getc()){
        }
    lcd->cls();
    lcd->printf("Connected\n");
    wait(2);
}

void PC_Comms::PC_Read(void){
    
    char Command[8];
    
    lcd->cls();
    lcd->printf("Reading PC");
    
    if(_PCbus.readable()==1){
    Command[0] = _PCbus.getc();
    if(Command[0]=='s')
    {
        while(_PCbus.readable()==0){}
        Command[1] = _PCbus.getc();
        if(Command[1]=='c')
        {
            for(int x=2;x<=7;x++)
            {
                while(_PCbus.readable()==0){}
                Command[x] = _PCbus.getc();
            }
          //  lcd->cls();
//            lcd->printf("%s", Command);
            switch(Command[2])
            {
                case '0':
                    char angle[3];
                    angle[0] = Command[4];
                    angle[1] = Command[5];
                    angle[2] = Command[6];
                    int angle2 = atoi(angle);
                    //lcd->cls();
                    //lcd->printf("%i", angle2);
                    
                    my_AX12.SetGoal(angle2);
                    break;
                default:
                    break;
            }
        }
    }
}
}

void PC_Comms::PC_WriteLoad(char _servo){

    char _returnToPC[4];
    int load_data;
    
    load_data = my_AX12.GetLoad();
    _returnToPC[0] = 'S';
    _returnToPC[1] = 'D';
    _returnToPC[2] = '0';
    _returnToPC[3] = _servo;
    
    if(load_data >= 1000){
    _PCbus.printf("%s%d\n",_returnToPC, load_data);
    }else if(load_data < 1000 && load_data >= 100){
        _PCbus.printf("%s0%d\n", _returnToPC, load_data);
    }else if(load_data < 100 && load_data >= 10){
        _PCbus.printf("%s00%d\n", _returnToPC, load_data);
    }else if(load_data < 10){
        _PCbus.printf("%s000%d\n", _returnToPC, load_data);
    }
}

void PC_Comms::PC_WritePosition(char _servo){
    
    char _returnToPC[4];
    int pos_data;

       pos_data = my_AX12.GetPosition();
    _returnToPC[0] = 'S';
    _returnToPC[1] = 'D';
    _returnToPC[2] = '1';
    _returnToPC[3] = _servo;
    
     if(pos_data >= 1000){
    _PCbus.printf("%s%i\n",_returnToPC, pos_data);
    }else if(pos_data < 1000 && pos_data >= 100){
        _PCbus.printf("%s0%i\n", _returnToPC, pos_data);
    }else if(pos_data < 100 && pos_data >= 10){
        _PCbus.printf("%s00%i\n", _returnToPC, pos_data);
    }else{
        _PCbus.printf("%s000%i\n", _returnToPC, pos_data);
    }
}
//
//void PC_Comms::PC_Human