![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
a stepper motor view as a serial midi device, use an interface such ttymidi to generate a serial to 115200 baudrate midi instrument
Dependencies: MIDI mbed X-NUCLEO-IHM05A1
main.cpp@34:215d5ee0f434, 2019-10-01 (annotated)
- Committer:
- gidiana
- Date:
- Tue Oct 01 10:42:23 2019 +0000
- Revision:
- 34:215d5ee0f434
- Parent:
- 33:c1cefad6d338
first
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
stebonicelli | 17:dc1b04f0b55d | 1 | #include "mbed.h" |
stebonicelli | 25:281c8e913db4 | 2 | #include "L6208.h" |
gidiana | 34:215d5ee0f434 | 3 | #include "pitches.h" |
gidiana | 34:215d5ee0f434 | 4 | #include "MIDI.h" |
gidiana | 33:c1cefad6d338 | 5 | |
stebonicelli | 25:281c8e913db4 | 6 | #define VREFA_PWM_PIN D3 |
stebonicelli | 25:281c8e913db4 | 7 | #define VREFB_PWM_PIN D9 |
gidiana | 34:215d5ee0f434 | 8 | |
gidiana | 34:215d5ee0f434 | 9 | |
stebonicelli | 25:281c8e913db4 | 10 | l6208_init_t init = |
stebonicelli | 25:281c8e913db4 | 11 | { |
gidiana | 34:215d5ee0f434 | 12 | 65000, //Acceleration rate in step/s^2 or (1/16)th step/s^2 for microstep modes |
stebonicelli | 25:281c8e913db4 | 13 | 80, //Acceleration current torque in % (from 0 to 100) |
gidiana | 34:215d5ee0f434 | 14 | 65000, //Deceleration rate in step/s^2 or (1/16)th step/s^2 for microstep modes |
stebonicelli | 25:281c8e913db4 | 15 | 80, //Deceleration current torque in % (from 0 to 100) |
stebonicelli | 25:281c8e913db4 | 16 | 8000, //Running speed in step/s or (1/16)th step/s for microstep modes |
stebonicelli | 25:281c8e913db4 | 17 | 80, //Running current torque in % (from 0 to 100) |
stebonicelli | 25:281c8e913db4 | 18 | 40, //Holding current torque in % (from 0 to 100) |
stebonicelli | 25:281c8e913db4 | 19 | STEP_MODE_1_16, //Step mode via enum motorStepMode_t |
stebonicelli | 25:281c8e913db4 | 20 | FAST_DECAY, //Decay mode via enum motorDecayMode_t |
stebonicelli | 25:281c8e913db4 | 21 | 0, //Dwelling time in ms |
stebonicelli | 25:281c8e913db4 | 22 | FALSE, //Automatic HIZ STOP |
stebonicelli | 25:281c8e913db4 | 23 | 100000 //VREFA and VREFB PWM frequency (Hz) |
stebonicelli | 25:281c8e913db4 | 24 | }; |
gidiana | 33:c1cefad6d338 | 25 | |
gidiana | 34:215d5ee0f434 | 26 | unsigned long motorSpeeds[] = {0, 0, 0, 0, 0}; |
gidiana | 34:215d5ee0f434 | 27 | int flag=0; |
stebonicelli | 25:281c8e913db4 | 28 | // Utility |
gidiana | 30:c40b060795a2 | 29 | //InterruptIn button(USER_BUTTON); |
stebonicelli | 25:281c8e913db4 | 30 | DigitalOut led(LED1); |
gidiana | 33:c1cefad6d338 | 31 | |
stebonicelli | 25:281c8e913db4 | 32 | // Motor Control |
stebonicelli | 25:281c8e913db4 | 33 | L6208 *motor; |
gidiana | 33:c1cefad6d338 | 34 | |
gidiana | 30:c40b060795a2 | 35 | InterruptIn end1(USER_BUTTON, PullUp); |
gidiana | 30:c40b060795a2 | 36 | DigitalIn end0(PA_5, PullUp); |
gidiana | 33:c1cefad6d338 | 37 | |
gidiana | 34:215d5ee0f434 | 38 | |
gidiana | 34:215d5ee0f434 | 39 | MIDI MIDI(PA_2, PA_3); |
gidiana | 34:215d5ee0f434 | 40 | |
gidiana | 34:215d5ee0f434 | 41 | void handleNoteOn(byte channel, byte pitch, byte velocity) //MIDI Note ON Command |
gidiana | 30:c40b060795a2 | 42 | { |
gidiana | 33:c1cefad6d338 | 43 | |
gidiana | 34:215d5ee0f434 | 44 | motorSpeeds[channel] = pitchVals[pitch]/4; //set the motor speed to specified pitch |
gidiana | 34:215d5ee0f434 | 45 | |
stebonicelli | 17:dc1b04f0b55d | 46 | } |
gidiana | 33:c1cefad6d338 | 47 | |
gidiana | 34:215d5ee0f434 | 48 | void handleNoteOff(byte channel, byte pitch, byte velocity) //MIDI Note OFF Command |
gidiana | 29:f888a2394027 | 49 | { |
gidiana | 34:215d5ee0f434 | 50 | motorSpeeds[channel] = 0; //set motor speed to zero |
gidiana | 34:215d5ee0f434 | 51 | flag=!flag; |
gidiana | 29:f888a2394027 | 52 | } |
gidiana | 33:c1cefad6d338 | 53 | /* Main ----------------------------------------------------------------------*/ |
gidiana | 30:c40b060795a2 | 54 | |
gidiana | 33:c1cefad6d338 | 55 | int main() |
stebonicelli | 17:dc1b04f0b55d | 56 | { |
gidiana | 33:c1cefad6d338 | 57 | led=1; |
gidiana | 34:215d5ee0f434 | 58 | |
gidiana | 34:215d5ee0f434 | 59 | MIDI.begin(MIDI_CHANNEL_OMNI); //listen to all MIDI channels |
gidiana | 34:215d5ee0f434 | 60 | MIDI.setHandleNoteOn(handleNoteOn); //execute function when note on message is recieved |
gidiana | 34:215d5ee0f434 | 61 | MIDI.setHandleNoteOff(handleNoteOff); //execute function when note off message is recieved |
gidiana | 33:c1cefad6d338 | 62 | |
gidiana | 33:c1cefad6d338 | 63 | // Motor Initialization |
gidiana | 33:c1cefad6d338 | 64 | motor = new L6208(D2, D8, D7, D4, D5, D6, VREFA_PWM_PIN, VREFB_PWM_PIN); |
gidiana | 33:c1cefad6d338 | 65 | motor->set_step_mode(StepperMotor::STEP_MODE_1_16); |
gidiana | 33:c1cefad6d338 | 66 | if (motor->init(&init) != COMPONENT_OK) |
gidiana | 33:c1cefad6d338 | 67 | { |
gidiana | 33:c1cefad6d338 | 68 | printf("ERROR: vvMotor Init\n\r"); |
gidiana | 33:c1cefad6d338 | 69 | exit(EXIT_FAILURE); |
gidiana | 33:c1cefad6d338 | 70 | } |
gidiana | 34:215d5ee0f434 | 71 | |
gidiana | 33:c1cefad6d338 | 72 | |
gidiana | 34:215d5ee0f434 | 73 | printf("DONE: Motor Init\n\r"); |
gidiana | 33:c1cefad6d338 | 74 | printf("Running!\n\r"); |
gidiana | 34:215d5ee0f434 | 75 | |
gidiana | 33:c1cefad6d338 | 76 | while(true) |
gidiana | 33:c1cefad6d338 | 77 | { |
gidiana | 34:215d5ee0f434 | 78 | MIDI.read(); |
gidiana | 34:215d5ee0f434 | 79 | if(motorSpeeds[0]==0) |
gidiana | 34:215d5ee0f434 | 80 | motor->hard_stop(); |
gidiana | 34:215d5ee0f434 | 81 | else |
gidiana | 34:215d5ee0f434 | 82 | { |
gidiana | 34:215d5ee0f434 | 83 | |
gidiana | 34:215d5ee0f434 | 84 | motor->set_max_speed(motorSpeeds[0]); |
gidiana | 34:215d5ee0f434 | 85 | if (flag==1) |
gidiana | 34:215d5ee0f434 | 86 | motor->run(StepperMotor::BWD); |
gidiana | 34:215d5ee0f434 | 87 | else |
gidiana | 34:215d5ee0f434 | 88 | motor->run(StepperMotor::FWD); |
gidiana | 34:215d5ee0f434 | 89 | |
gidiana | 34:215d5ee0f434 | 90 | |
gidiana | 33:c1cefad6d338 | 91 | |
gidiana | 34:215d5ee0f434 | 92 | } |
gidiana | 34:215d5ee0f434 | 93 | } |
gidiana | 34:215d5ee0f434 | 94 | } |