A DMX based Dowser for projectors.
Dependencies: DMX-K46Z SLCD Servo mbed
This is an update to map to the Freescale platform. DMX 512.
main.cpp@1:088d1710de36, 2015-03-26 (annotated)
- Committer:
- rosienej
- Date:
- Thu Mar 26 17:11:27 2015 +0000
- Revision:
- 1:088d1710de36
- Parent:
- 0:216a04cfcd28
comments and doc
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
rosienej | 0:216a04cfcd28 | 1 | #include "mbed.h" |
rosienej | 0:216a04cfcd28 | 2 | #include "SLCD.h" |
rosienej | 0:216a04cfcd28 | 3 | #include "Servo.h" |
rosienej | 0:216a04cfcd28 | 4 | #include "DMX.h" |
rosienej | 0:216a04cfcd28 | 5 | |
rosienej | 0:216a04cfcd28 | 6 | // The Switch Resources |
rosienej | 0:216a04cfcd28 | 7 | DigitalOut S1o(PTB19); |
rosienej | 0:216a04cfcd28 | 8 | DigitalOut S2o(PTC7); |
rosienej | 0:216a04cfcd28 | 9 | |
rosienej | 0:216a04cfcd28 | 10 | DigitalOut LD1(LED1); |
rosienej | 0:216a04cfcd28 | 11 | DigitalOut LD2(LED2); |
rosienej | 0:216a04cfcd28 | 12 | |
rosienej | 0:216a04cfcd28 | 13 | |
rosienej | 0:216a04cfcd28 | 14 | DigitalIn S1i0(PTD3,PullDown); |
rosienej | 0:216a04cfcd28 | 15 | DigitalIn S1i1(PTB18,PullDown); |
rosienej | 0:216a04cfcd28 | 16 | |
rosienej | 0:216a04cfcd28 | 17 | DigitalIn S2i0(PTC8,PullDown); |
rosienej | 0:216a04cfcd28 | 18 | DigitalIn S2i1(PTC6,PullDown); |
rosienej | 0:216a04cfcd28 | 19 | |
rosienej | 0:216a04cfcd28 | 20 | |
rosienej | 0:216a04cfcd28 | 21 | // The LCD display |
rosienej | 0:216a04cfcd28 | 22 | |
rosienej | 0:216a04cfcd28 | 23 | SLCD slcd; |
rosienej | 0:216a04cfcd28 | 24 | |
rosienej | 0:216a04cfcd28 | 25 | // The Servo |
rosienej | 0:216a04cfcd28 | 26 | Servo Shutter(PTC1); // put this on a PWM pin |
rosienej | 0:216a04cfcd28 | 27 | |
rosienej | 0:216a04cfcd28 | 28 | // The DMX protocol |
rosienej | 1:088d1710de36 | 29 | DMX dmx(PTE22, PTE23); // put it on a serial port DMX (PinName p_tx, PinName p_rx); |
rosienej | 0:216a04cfcd28 | 30 | |
rosienej | 0:216a04cfcd28 | 31 | int main() |
rosienej | 0:216a04cfcd28 | 32 | { |
rosienej | 0:216a04cfcd28 | 33 | |
rosienej | 1:088d1710de36 | 34 | int DMX_ADDR=0; // DMX_ADDR set from the config file |
rosienej | 1:088d1710de36 | 35 | unsigned int DMX_VALUE=0; // This value is set from the DMX stream |
rosienej | 1:088d1710de36 | 36 | // unsigned int DMX_LAST_VALUE=0; |
rosienej | 1:088d1710de36 | 37 | int DMX_MSG_COUNT=0; // A counter for diagnostic purposes |
rosienej | 1:088d1710de36 | 38 | int DMX_STATUS; |
rosienej | 0:216a04cfcd28 | 39 | |
rosienej | 1:088d1710de36 | 40 | int position1 =0; |
rosienej | 1:088d1710de36 | 41 | int position2 =0; |
rosienej | 1:088d1710de36 | 42 | float pos=0.0; |
rosienej | 1:088d1710de36 | 43 | |
rosienej | 1:088d1710de36 | 44 | |
rosienej | 0:216a04cfcd28 | 45 | S1o=1; |
rosienej | 0:216a04cfcd28 | 46 | S2o=1; |
rosienej | 0:216a04cfcd28 | 47 | |
rosienej | 1:088d1710de36 | 48 | Shutter.calibrate(0.0008,180); // Calibrate the servo |
rosienej | 1:088d1710de36 | 49 | |
rosienej | 1:088d1710de36 | 50 | /* while (true) { |
rosienej | 0:216a04cfcd28 | 51 | position1 = S1i0 + (S1i1<<1); |
rosienej | 0:216a04cfcd28 | 52 | position2 = S2i0 + (S2i1<<1); |
rosienej | 0:216a04cfcd28 | 53 | |
rosienej | 0:216a04cfcd28 | 54 | slcd.Home(); |
rosienej | 0:216a04cfcd28 | 55 | slcd.printf("%2d",position1*4+position2); |
rosienej | 0:216a04cfcd28 | 56 | |
rosienej | 1:088d1710de36 | 57 | pos = pos + 0.01; |
rosienej | 1:088d1710de36 | 58 | pos=(pos>1.0)?0.0:pos; |
rosienej | 1:088d1710de36 | 59 | |
rosienej | 1:088d1710de36 | 60 | Shutter = pos; |
rosienej | 1:088d1710de36 | 61 | wait(0.1); |
rosienej | 1:088d1710de36 | 62 | } */ |
rosienej | 1:088d1710de36 | 63 | |
rosienej | 1:088d1710de36 | 64 | DMX_MSG_COUNT=0; // set the number of (unique) messages so far to zero |
rosienej | 1:088d1710de36 | 65 | while(true) { // until power off..... |
rosienej | 1:088d1710de36 | 66 | |
rosienej | 1:088d1710de36 | 67 | position1 = S1i0 + (S1i1<<1); |
rosienej | 1:088d1710de36 | 68 | position2 = S2i0 + (S2i1<<1); |
rosienej | 1:088d1710de36 | 69 | |
rosienej | 1:088d1710de36 | 70 | DMX_ADDR = 200+position1*4+position2; // 1 to MaxDMX |
rosienej | 1:088d1710de36 | 71 | |
rosienej | 1:088d1710de36 | 72 | DMX_STATUS=dmx.get_mode_rx(); |
rosienej | 1:088d1710de36 | 73 | if(DMX_STATUS==DMX_MODE_BEGIN) {LD1= 0; LD2 = 1;} |
rosienej | 1:088d1710de36 | 74 | if(DMX_STATUS==DMX_MODE_BREAK) {LD1= 1; LD2 = 0;} |
rosienej | 1:088d1710de36 | 75 | if(DMX_STATUS==DMX_MODE_DATA) {LD1= 1; LD2 = 1;} |
rosienej | 1:088d1710de36 | 76 | if(DMX_STATUS==DMX_MODE_ERROR) {LD1= 0; LD2 = 0;} |
rosienej | 1:088d1710de36 | 77 | |
rosienej | 1:088d1710de36 | 78 | |
rosienej | 1:088d1710de36 | 79 | DMX_VALUE= dmx.get(DMX_ADDR-1); // get the data from the stream |
rosienej | 1:088d1710de36 | 80 | // if(DMX_VALUE == DMX_LAST_VALUE) continue; // ignore if it is the same as the last one |
rosienej | 1:088d1710de36 | 81 | // best as I can tell, the libary routine has a |
rosienej | 1:088d1710de36 | 82 | // bug, (is_recived = 1; in break time should be a zero |
rosienej | 1:088d1710de36 | 83 | // ignoring repeated values has the same result. |
rosienej | 1:088d1710de36 | 84 | |
rosienej | 1:088d1710de36 | 85 | // DMX_LAST_VALUE = DMX_VALUE; |
rosienej | 1:088d1710de36 | 86 | DMX_MSG_COUNT++; // update the count |
rosienej | 1:088d1710de36 | 87 | pos = (1.0*DMX_VALUE)/(1.0*255); // calculate the shutter position |
rosienej | 1:088d1710de36 | 88 | Shutter.write(pos); // position the servo |
rosienej | 1:088d1710de36 | 89 | // Print the message |
rosienej | 1:088d1710de36 | 90 | slcd.Home(); |
rosienej | 1:088d1710de36 | 91 | slcd.printf("%3d ",DMX_ADDR); |
rosienej | 1:088d1710de36 | 92 | //slcd.printf("%d-->%4.2f",DMX_VALUE,pos); |
rosienej | 1:088d1710de36 | 93 | |
rosienej | 0:216a04cfcd28 | 94 | } |
rosienej | 1:088d1710de36 | 95 | |
rosienej | 1:088d1710de36 | 96 | |
rosienej | 0:216a04cfcd28 | 97 | } |