Test Program for the ES20X mbed board

Dependencies:   ServoOut mbed-rtos mbed

Fork of mbed_ES20X_Thread_Test by Joseph Bradshaw

main.cpp

Committer:
jebradshaw
Date:
2016-01-11
Revision:
2:b0061c3825b5
Parent:
1:31677f9c113f

File content as of revision 2:b0061c3825b5:

// J. Bradshaw 20160111
// Program for testing I/O on mbed ES201 Dev Board V1.1
#include "mbed.h"
#include "ServoOut.h"   //uses ServoOut.h library for generating servo pulses
#include "rtos.h"

#define PI 3.1415926

char DB9_F_char;
char DB9_M_char;

DigitalOut led1(LED1);
DigitalOut led3(LED3);

//PC serial connection
Serial pc(USBTX, USBRX);    //tx, rx via USB connection
Serial DB9_female(p9, p10); //DB9 serial female
Serial DB9_male(p13, p14); //DB9 serial male

//Port J4
BusOut bus_J4(p5, p6, p7, p8, p11);

//header for J4
DigitalOut J4_p5(p5);
DigitalOut J4_p6(p6);
DigitalOut J4_p7(p7);
DigitalOut J4_p8(p8);
DigitalOut J4_p11(p11);

//Analog port in J6
AnalogIn    J6_P16(p16);
AnalogIn    J6_P17(p17);
AnalogIn    J6_P18(p18);
AnalogIn    J6_P19(p19);
AnalogIn    J6_P20(p20);

// servo ports p21 - p24
ServoOut sv1(p21);
ServoOut sv2(p22);
ServoOut sv3(p23);
ServoOut sv4(p24);

DigitalOut mot1_ph1(p28);
DigitalOut mot1_ph2(p27);
PwmOut mot_en1(p25);

DigitalOut mot2_ph1(p29);
DigitalOut mot2_ph2(p30);
PwmOut mot_en2(p26);
//Motor control routine for PWM on 5 pin motor driver header
// drv_num is 1 or 2 (defaults to 1, anything but 2)
// dc is signed duty cycle (+/-1.0)

void mot_control(int drv_num, float dc){        
    if(dc>1.0)
        dc=1.0;
    if(dc<-1.0)
        dc=-1.0;
    
    if(drv_num != 2){           
        if(dc > 0.0){
            mot1_ph2 = 0;
            mot1_ph1 = 1;
            mot_en1 = dc;
        }
        else if(dc < -0.0){
            mot1_ph1 = 0;
            mot1_ph2 = 1;
            mot_en1 = abs(dc);
        }
        else{
            mot1_ph1 = 0;
            mot1_ph2 = 0;
            mot_en1 = 0.0;
        }
    }                
    else{
        if(dc > 0.0){
            mot2_ph2 = 0;
            mot2_ph1 = 1;
            mot_en2 = dc;
        }
        else if(dc < -0.0){
            mot2_ph1 = 0;
            mot2_ph2 = 1;
            mot_en2 = abs(dc);
        }
        else{
            mot2_ph1 = 0;
            mot2_ph2 = 0;
            mot_en2 = 0.0;
        }
    }                   
}

void mot1_thread(void const *args){
        while(1){
        // Run PWM and servo command signals
        for(float cycle=0;cycle<2.0*PI;cycle+=.078){
            sv1 = 1500 + (int)(sin(cycle)*500);
            sv2 = 1500 + (int)(cos(cycle)*500);
            sv3 = 1500 + (int)(sin(cycle)*500);
            sv4 = 1500 + (int)(sin(cycle)*500);
        
            mot_control(1, .85*sin(cycle));
            mot_control(2, .85*cos(cycle));
                        
            pc.printf("cycle = %.2f  \r", cycle);
            Thread::wait(10);
        } 
    }//while(1)
}

void digOut_thread(void const *args){
    //toggle bus I/O for testing
    while(1){
        bus_J4 = 0x1f;
        Thread::wait(500);
        bus_J4 = 0xAA;
        Thread::wait(100);
        bus_J4 = 0x55;
        Thread::wait(100);
        bus_J4 = 0xAA;
        Thread::wait(100);
        bus_J4 = 0x55;
        Thread::wait(100);        
        bus_J4 = 0; //all off
        Thread::wait(500);    
    }
}

void led1_flash(void const *args){
    while(1){
        led1 = !led1;
        Thread::wait(500);
    }
}

void serial_DB9M_test(void const *args){
    while(1){        
        for(char tx_char='a';tx_char <= 'z';tx_char++){
            DB9_male.printf("%c", tx_char);
            
            if(DB9_male.readable()){
                DB9_M_char = DB9_male.getc();
            }            
            Thread::wait(100);
        }
    }        
}

void serial_DB9F_test(void const *args){
    while(1){        
        for(char tx_char='A';tx_char <= 'Z';tx_char++){
            DB9_female.printf("%c", tx_char);
            
            if(DB9_female.readable()){
                DB9_F_char = DB9_female.getc();
            }            
            Thread::wait(100);
        }
    }        
}
//------------ Main ------------------------------
int main() {
    float analogVal[6];
    
    Thread t1(mot1_thread);
    Thread t2(digOut_thread);
    Thread t3(led1_flash);
    Thread t4(serial_DB9M_test);
    Thread t5(serial_DB9F_test);
    
    pc.baud(9600);
    DB9_female.baud(9600);
    DB9_male.baud(9600);
    mot_en1.period_us(20);
    mot_en2.period_us(20);
    
    while(1) {        
        analogVal[0] = J6_P16;
        analogVal[1] = J6_P17;
        analogVal[2] = J6_P18;
        analogVal[3] = J6_P19;
        analogVal[4] = J6_P20;
        pc.printf("%.2f %.2f %.2f %.2f %.2f DB9M=%c DB9F=%c\r\n", analogVal[0],analogVal[1],analogVal[2],analogVal[3],analogVal[4], DB9_M_char, DB9_F_char);            
    }
}