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

Revision:
0:14942e263231
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Aug 15 10:38:50 2014 +0000
@@ -0,0 +1,601 @@
+#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
+            }
+        }
+    }
+}