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

Committer:
gidiana
Date:
Tue Oct 01 10:42:23 2019 +0000
Revision:
34:215d5ee0f434
Parent:
33:c1cefad6d338
first

Who changed what in which revision?

UserRevisionLine numberNew 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 }