This is the device firmware for the controlBoard in the DIY 3D Printable Raspberry Pi Raman Spectrometer. For more information please visit: http://hackaday.io/project/1279

Dependencies:   mbed

main.cpp

Committer:
flatcat
Date:
2014-08-15
Revision:
0:14942e263231

File content as of revision 0:14942e263231:

#include "mbed.h"
#include "DS18B20.h"
#include "OneWireDefs.h"

#define THERMOMETER DS18B20

#define     msg_cuvette_tray            0x10
#define     msg_cuvette_temp            0x11
#define     msg_cuvette_status          0x12
#define     msg_cuvette_tray_pos        0x13
#define     msg_cuvette_pelt_status     0x14
#define     msg_cuvette_stepper         0x15

#define     msg_filter_wheel            0x20
#define     msg_filter_pos              0x21

#define     msg_laser_temp              0x30
#define     msg_laser_power_status      0x31
#define     msg_laser_ttl_status        0x32
#define     msg_laser_good_status       0x33
#define     msg_laser_color             0x34
#define     msg_uv_index                0x35

#define     msg_ccd_pelt_status         0x40

#define     msg_shutter_servo_pos       0x50
#define     msg_shutter_status          0x51

#define     msg_board_ID                0x60
#define     msg_board_serial            0x61
#define     msg_board_status            0x62
#define     msg_board_time              0x63
#define     msg_board_model             0x64
#define     msg_board_version           0x65
#define     req_reboot                  0x66

#define     msg_ambient_temp            0x70
#define     req_baro                    0x71
#define     req_humidity                0x72

#define     cmd_cuvette                 0xA0
#define     tray_open                   0xA1
#define     tray_close                  0xA2
#define     cuvette_peltier             0xA3
#define     req_cuvette_status          0xA4
#define     req_cuvette_temp            0xA5
#define     req_cuvette_pelt_status     0xA6
#define     req_cuvette_tray_pos        0xA7

#define     cmd_filter_wheel            0xB0
#define     filter_select               0xB1
#define     filter_reset                0xB2
#define     req_filter_ID               0xB3
#define     req_filter_status           0xB4
#define     req_filter_count            0xB5
#define     req_filter_pos              0xB6

#define     cmd_laser                   0xC0
#define     laser_power                 0xC1
#define     laser_ttl                   0xC2
#define     req_laser_good_status       0xC3
#define     req_laser_color             0xC4
#define     req_laser_temp              0xC5
#define     req_uv_index                0xC6

#define     cmd_ccd_peltier             0xD0
#define     cmd_ccd_pelt_power          0xD1
#define     cmd_cuvette_peltier         0xD2
#define     cmd_cuvette_pelt_power      0xD3
#define     req_pelt_cool               0xD4
#define     req_pelt_heat               0xD5
#define     req_pelt_off                0xD6

#define     cmd_shutter_servo           0xE0
#define     shutter_open                0xE1
#define     shutter_close               0xE2
#define     shutter_deflect             0xE3
#define     shutter_alternate           0xE4
#define     req_shutter_state           0xE5
#define     req_shutter_status          0xE6

#define     packet_start                0xF0
#define     packet_ack                  0xF1
#define     packet_flag                 0xF2
#define     packet_end                  0xF3
#define     packet_err                  0xF4
#define     cmd_err                     0xF5
#define     req_err                     0xF6
#define     brd_err                     0xF7

#define     env_err                     0x80
#define     cuvette_err                 0x81
#define     laser_err                   0x82
#define     filter_err                  0x83
#define     ccd_pelt_err                0x84
#define     cuvette_pelt_err            0x85
#define     shutter_err                 0x86
#define     board_err                   0x87

DigitalIn button(USER_BUTTON);
DigitalOut grnLED(LED1);
DigitalOut cuvette_IN1(PC_14);
DigitalOut cuvette_IN2(PC_15);
DigitalOut cuvette_IN3(PH_0);
DigitalOut cuvette_IN4(PH_1);
DigitalOut filter_IN1(PA_4);
DigitalOut filter_IN2(PB_0);
DigitalOut filter_IN3(PC_1);
DigitalOut filter_IN4(PC_0);
PwmOut cuvettePeltA(PB_13); // in4
PwmOut cuvettePeltB(PB_14); // in3
PwmOut ccdPeltA(PB_1);      // in2
PwmOut ccdPeltB(PB_15);     // in1
AnalogIn peltCurrent(PC_5);

const int mDelay=1;
double temp;
int z;
int trayOpen;
THERMOMETER device(PC_8);
Serial raspi(USBTX, USBRX);

typedef union bytes {
    double d ;
    char c[8];
} bytes;

void printDoubleToHex(double d)
{
    bytes b;
    b.d = d;
    raspi.printf("%f -> %x %x %x %x %x %x %x %x\r\n", b.d, b.c[0], b.c[1], b.c[2], b.c[3], b.c[4], b.c[5], b.c[6], b.c[7]);
}

void printHexToDouble(char *arr)
{
    bytes b;
    for (int i=0; i<8; ++i)
        b.c[i] = arr[i];
    raspi.printf("received hex: %x %x %x %x %x %x %x %x \r\n", b.c[0], b.c[1], b.c[2], b.c[3], b.c[4], b.c[5], b.c[6], b.c[7]);
    raspi.printf("convert to: %f\r\n", b.d);
}

void readTemp(int deviceNum)
{
    temp = device.readTemperature(deviceNum);
    if (deviceNum == 0) {
//        raspi.printf("Cuvette Temperature: %f\r\n", temp);
//        const char begin[2]= {packet_flag, packet_start};
//        raspi.printf(begin);
        printDoubleToHex(temp);
//        const char stop[2]= {packet_flag, packet_end};
//        raspi.printf(stop);
    }
    if (deviceNum == 1) {
//        raspi.printf("Laser Emitter Temperature: %f\r\n", temp);
//        const char begin[2]= {packet_flag, packet_start};
//        raspi.printf(begin);
        printDoubleToHex(temp);
//        const char stop[2]= {packet_flag, packet_end};
//        raspi.printf(stop);
    }
//    raspi.printf("Device %d is %f",deviceNum, temp);
    wait(0.5);
}

int openTray()
{
    while (z < 500) {
        z++;
        grnLED = 1;
        wait_ms(1);
        cuvette_IN1 = 0;
        cuvette_IN2= 0;
        cuvette_IN3= 0;
        cuvette_IN4= 1;
        wait_ms(mDelay);

        cuvette_IN1= 0;
        cuvette_IN2= 0;
        cuvette_IN3= 1;
        cuvette_IN4= 1;
        wait_ms(mDelay);

        cuvette_IN1= 0;
        cuvette_IN2= 0;
        cuvette_IN3= 1;
        cuvette_IN4= 0;
        wait_ms(mDelay);

        cuvette_IN1= 0;
        cuvette_IN2= 1;
        cuvette_IN3= 1;
        cuvette_IN4= 0;
        wait_ms(mDelay);

        cuvette_IN1= 0;
        cuvette_IN2= 1;
        cuvette_IN3= 0;
        cuvette_IN4= 0;
        wait_ms(mDelay);

        cuvette_IN1= 1;
        cuvette_IN2= 1;
        cuvette_IN3= 0;
        cuvette_IN4= 0;
        wait_ms(mDelay);

        cuvette_IN1= 1;
        cuvette_IN2= 0;
        cuvette_IN3= 0;
        cuvette_IN4= 0;
        wait_ms(mDelay);

        cuvette_IN1= 1;
        cuvette_IN2= 0;
        cuvette_IN3= 0;
        cuvette_IN4= 1;
        wait_ms(mDelay);

        cuvette_IN1= 0;
        cuvette_IN2= 0;
        cuvette_IN3= 0;
        cuvette_IN4= 0;
    }
    trayOpen = 1;
    z = 0;
    return(0);
}

int closeTray()
{
    while (z < 500) {
        z++;
        grnLED = 1;
        wait_ms(1);
        cuvette_IN1= 1;
        cuvette_IN2= 0;
        cuvette_IN3= 0;
        cuvette_IN4= 1;
        wait_ms(mDelay);

        cuvette_IN1= 1;
        cuvette_IN2= 0;
        cuvette_IN3= 0;
        cuvette_IN4= 0;
        wait_ms(mDelay);

        cuvette_IN1= 1;
        cuvette_IN2= 1;
        cuvette_IN3= 0;
        cuvette_IN4= 0;
        wait_ms(mDelay);

        cuvette_IN1= 0;
        cuvette_IN2= 1;
        cuvette_IN3= 0;
        cuvette_IN4= 0;
        wait_ms(mDelay);

        cuvette_IN1= 0;
        cuvette_IN2= 1;
        cuvette_IN3= 1;
        cuvette_IN4= 0;
        wait_ms(mDelay);

        cuvette_IN1= 0;
        cuvette_IN2= 0;
        cuvette_IN3= 1;
        cuvette_IN4= 0;
        wait_ms(mDelay);

        cuvette_IN1= 0;
        cuvette_IN2= 0;
        cuvette_IN3= 1;
        cuvette_IN4= 1;
        wait_ms(mDelay);

        cuvette_IN1= 0;
        cuvette_IN2= 0;
        cuvette_IN3= 0;
        cuvette_IN4= 1;
        wait_ms(mDelay);

        cuvette_IN1= 0;
        cuvette_IN2= 0;
        cuvette_IN3= 0;
        cuvette_IN4= 0;
    }
    trayOpen = 0;
    z = 0;
    return(0);
}

int filterForward()
{
    while (z < 500) {
        z++;
        grnLED = 1;
        wait_ms(1);
        filter_IN1 = 0;
        filter_IN2= 0;
        filter_IN3= 0;
        filter_IN4= 1;
        wait_ms(mDelay);

        filter_IN1= 0;
        filter_IN2= 0;
        filter_IN3= 1;
        filter_IN4= 1;
        wait_ms(mDelay);

        filter_IN1= 0;
        filter_IN2= 0;
        filter_IN3= 1;
        filter_IN4= 0;
        wait_ms(mDelay);

        filter_IN1= 0;
        filter_IN2= 1;
        filter_IN3= 1;
        filter_IN4= 0;
        wait_ms(mDelay);

        filter_IN1= 0;
        filter_IN2= 1;
        filter_IN3= 0;
        filter_IN4= 0;
        wait_ms(mDelay);

        filter_IN1= 1;
        filter_IN2= 1;
        filter_IN3= 0;
        filter_IN4= 0;
        wait_ms(mDelay);

        filter_IN1= 1;
        filter_IN2= 0;
        filter_IN3= 0;
        filter_IN4= 0;
        wait_ms(mDelay);

        filter_IN1= 1;
        filter_IN2= 0;
        filter_IN3= 0;
        filter_IN4= 1;
        wait_ms(mDelay);

        filter_IN1= 0;
        filter_IN2= 0;
        filter_IN3= 0;
        filter_IN4= 0;
    }
    z = 0;
    return(0);
}
int filterBack()
{
    while (z < 500) {
        z++;
        grnLED = 0;
        wait_ms(1);
        filter_IN1= 1;
        filter_IN2= 0;
        filter_IN3= 0;
        filter_IN4= 1;
        wait_ms(mDelay);

        filter_IN1= 1;
        filter_IN2= 0;
        filter_IN3= 0;
        filter_IN4= 0;
        wait_ms(mDelay);

        filter_IN1= 1;
        filter_IN2= 1;
        filter_IN3= 0;
        filter_IN4= 0;
        wait_ms(mDelay);

        filter_IN1= 0;
        filter_IN2= 1;
        filter_IN3= 0;
        filter_IN4= 0;
        wait_ms(mDelay);

        filter_IN1= 0;
        filter_IN2= 1;
        filter_IN3= 1;
        filter_IN4= 0;
        wait_ms(mDelay);

        filter_IN1= 0;
        filter_IN2= 0;
        filter_IN3= 1;
        filter_IN4= 0;
        wait_ms(mDelay);

        filter_IN1= 0;
        filter_IN2= 0;
        filter_IN3= 1;
        filter_IN4= 1;
        wait_ms(mDelay);

        filter_IN1= 0;
        filter_IN2= 0;
        filter_IN3= 0;
        filter_IN4= 1;
        wait_ms(mDelay);

        filter_IN1= 0;
        filter_IN2= 0;
        filter_IN3= 0;
        filter_IN4= 0;
    }
    z = 0;
    return(0);
}

int cuvettePeltCycle(){
    cuvettePeltA = 0;
    cuvettePeltB = 0;
    wait(3);
    cuvettePeltA = 1;
    cuvettePeltB = 1;
    wait(3);
    cuvettePeltA = 1;
    cuvettePeltB = 0;
    wait(3);
    cuvettePeltA = 0;
    cuvettePeltB = 1;
    wait(3);
    cuvettePeltA = 0;
    cuvettePeltB = 0;
    return 0;
}    

int err;
char* command;
int packetFlag = 0;
int main()
{
    trayOpen = 0;
    raspi.baud(921600);

    cuvettePeltCycle();    
    
    wait(10);
//    raspi.printf("meridianScientific_ramanSpectrometer_controlBoard_V0\r\n");

    while (!device.initialize());    // keep calling until it works

    int deviceCount = device.getDeviceCount();
//    raspi.printf("Located %d sensors\n\r",deviceCount);

    z = 0;
    device.setResolution(twelveBit);
    while(1) {
//        for (int i = 0; i < deviceCount; i++) {
//            readTemp(i);
//        }
        if (raspi.readable()) {                                                                         // check if serial port is reaadable
            switch (raspi.getc()) {                                                                     // retrieve a character from serial
                case packet_start:                                                                      // case for packet start flag
                    switch (raspi.getc()) {                                                             // set condition for listening to another character
                        case packet_flag:                                                               // case for packet flag
                            packetFlag = 1;                                                             // turn the flag on
                            while (packetFlag == 1) {                                                   // start a loop that runs while the flag is on
                                switch (raspi.getc()) {                                                 // set another condition for listening to another character
                                    case cmd_laser:                                                     // case for cmd_laser
                                        grnLED = 1;                                                     // turn the led on
                                        raspi.printf("%x", cmd_laser);                                  // return cmd_laser to the raspi
                                        switch (raspi.getc()) {                                         // set another condition for listening to another character
                                            case req_laser_temp:                                        // case for req_laser_temp
                                                raspi.printf("%x\r\n", req_laser_temp);                 // return req_laser_temp to the raspi
                                                readTemp(0);                                            // read the temperature for device 0 which is the laser temp sensor
                                                grnLED = 0;                                             // turn led off
                                                continue;                                               // continue through loop
                                            default:                                                    // default if nothing matches
                                                break;                                                  // break from loop
                                        }
                                    case cmd_cuvette:                                                   // case for cmd_cuvette
                                        grnLED = 1;                                                     // turn led on
                                        raspi.printf("%x", cmd_cuvette);                                // return cmd_cuvette to raspi
                                        switch (raspi.getc()) {                                         // set condition for listening to another character
                                            case req_cuvette_temp:                                      // case for req_cuvette_temp
                                                raspi.printf("%x\r\n", req_cuvette_temp);               // return req_cuvette_temp to raspi
                                                readTemp(1);                                            // read the temperature for device 1 which is the cuvette temp sensor
                                                grnLED = 0;                                             // turn the led off
                                                continue;                                               // continue through the loop
                                            case tray_open:                                             // case for tray_open
                                                raspi.printf("%x\r\n", tray_open);                      // return tray_open to raspi
                                                if (trayOpen == 0) {                                    // check to see if the tray is closed
                                                    openTray();                                         // if not, open tray
                                                } else {                                                // otherwise
                                                    raspi.printf("%x\r\n", cuvette_err);                // send a cuvette error to the raspi
                                                }
                                                grnLED = 0;                                             // turn led off
                                                continue;                                               // continue through the loop
                                            case tray_close:                                            // case for tray close
                                                raspi.printf("%x\r\n", tray_close);                     // return tray_close to raspi
                                                if (trayOpen == 1) {                                    // check to see if tray is open
                                                    closeTray();                                        // if not, close tray
                                                } else {                                                // otherwise
                                                    raspi.printf("%x\r\n", cuvette_err);                // send a cuvette error to the raspi
                                                }
                                                grnLED = 0;                                             // turn led off
                                                continue;                                               // continue through loop
                                            default:                                                    // default if nothing matches
                                                break;                                                  // break from loop
                                        }
                                    case cmd_filter_wheel:                                              // case for cmd_filter_wheel
                                        grnLED = 1;                                                     // turn led on
                                        raspi.printf("%x", cmd_filter_wheel);                           // return cmd_filter_wheel to raspi
                                        switch (raspi.getc()) {                                         // set condidition for listening to another character
                                            case filter_select:                                         // case for filter_select
                                                raspi.printf("%x\r\n", filter_select);                  // return filter_select to raspi
                                                filterForward();                                        // move filter wheel forward one filter
                                                filterBack();                                           // move filter wheel reverse one filter (this is just to test the commands)
                                                grnLED = 0;                                             // turn led off
                                                continue;                                               // continue through loop
                                            default:                                                    // default if nothing matches
                                                break;                                                  // break from loop
                                        }
                                    case cmd_cuvette_peltier:
                                        grnLED = 1;                                                     // turn led on
                                        raspi.printf("%x", cmd_cuvette_peltier);                        // return cmd_ccd_peltier to raspi
                                        switch (raspi.getc()) {                                         // set condidition for listening to another character
                                            case cmd_cuvette_pelt_power:
                                                switch (raspi.getc()) {                                 // set condidition for listening to another character
                                                    case 0x00:                                          // case for cmd_ccd_peltier OFF
                                                        raspi.printf("%x\r\n", cmd_cuvette_pelt_power); // return filter_select to raspi
                                                        cuvettePeltA = 0;                               // set PWM A to zero
                                                        cuvettePeltB = 0;                               // set PWM B to zero
                                                        grnLED = 0;                                     // turn led off
                                                        break;
                                                    case 0x01:                                          // case for cmd_cuvette_peltier COOL
                                                        raspi.printf("%x\r\n", cmd_cuvette_pelt_power); // return filter_select to raspi
                                                        cuvettePeltA = 0.5;                             // set PWM A to 0.5
                                                        cuvettePeltB = 0;                               // set PWM B to zero
                                                        grnLED = 0;                                     // turn led off
                                                        break;
                                                    case 0x02:                                          // case for cmd_cuvette_peltier HEAT
                                                        raspi.printf("%x\r\n", cmd_cuvette_pelt_power); // return filter_select to raspi
                                                        cuvettePeltA = 0;                               // set PWM A to 0.5
                                                        cuvettePeltB = 0.5;                             // set PWM B to zero
                                                        grnLED = 0;                                     // turn led off
                                                        break;
                                                    default:
                                                        break;
                                                }
                                                continue;
                                            default:
                                                break;
                                        }
                                    case cmd_ccd_peltier:
                                        grnLED = 1;                                                     // turn led on
                                        raspi.printf("%x", cmd_ccd_peltier);                            // return cmd_ccd_peltier to raspi
                                        switch (raspi.getc()) {                                         // set condidition for listening to another character
                                            case cmd_ccd_pelt_power:
                                                switch (raspi.getc()) {                                 // set condidition for listening to another character
                                                    case 0x00:                                          // case for cmd_ccd_peltier OFF
                                                        raspi.printf("%x\r\n", cmd_ccd_pelt_power);        // return filter_select to raspi
                                                        ccdPeltA = 0;                                   // set PWM A to zero
                                                        ccdPeltB = 0;                                   // set PWM B to zero
                                                        grnLED = 0;                                     // turn led off
                                                        break;
                                                    case 0x01:                                          // case for cmd_ccd_peltier COOL
                                                        raspi.printf("%x\r\n", cmd_ccd_pelt_power);        // return filter_select to raspi
                                                        ccdPeltA = 0.5;                                 // set PWM A to 0.5
                                                        ccdPeltB = 0;                                   // set PWM B to zero
                                                        grnLED = 0;                                     // turn led off
                                                        break;
                                                    case 0x02:                                          // case for cmd_ccd_peltier HEAT
                                                        raspi.printf("%x\r\n", cmd_ccd_pelt_power);        // return filter_select to raspi
                                                        ccdPeltA = 0;                                   // set PWM A to 0.5
                                                        ccdPeltB = 0.5;                                 // set PWM B to zero
                                                        grnLED = 0;                                     // turn led off
                                                        break;
                                                    default:
                                                        break;
                                                }
                                                continue;
                                            default:
                                                break;
                                        }                                    case packet_end:                                                    // case for packed_end
                                        packetFlag = 0;                                                 // set the packetFlag to 0
                                        break;                                                          // break from loop
                                    default:                                                            // default if nothing matches
                                        break;                                                          // break from loop
                                }
                            }
                        default:                                                                        // defailt if nothing matches
                            break;                                                                      // break from loop
                    }
                default:                                                                                // default if nothing matches
                    break;                                                                              // break from loop
            }
        }
    }
}