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-03
Revision:
17:258067827672
Parent:
16:585f8b5abc2c
Child:
18:b79a9a7cf5fb

File content as of revision 17:258067827672:

//*********************************************************************
// 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){
    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("Conneced\n");
    wait(2);
}

void PC_Comms::PC_Read(void){
    
    char Command[8];
    
    lcd->cls();
    lcd->printf("Reading PC");
    
    while(_PCbus.readable()==0){}
    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();
            }
            wait(2);
            lcd->cls();
            lcd->printf("%s", Command);
            wait(2);
            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);
                    wait(1);
                    my_AX12.SetGoal(angle2);
                    break;
                default:
                    break;
            }
        }
        wait(1);
    }
}

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%i",_returnToPC, load_data);
    }else if(load_data > 1000 && load_data >= 100){
        _PCbus.printf("%s0%i", _returnToPC, load_data);
    }else if(load_data> 1000 && load_data >= 10){
        _PCbus.printf("%s00%i", _returnToPC, load_data);
    }else{
        _PCbus.printf("%s000%i", _returnToPC, load_data);
    }
}