Midi to PWM to control Solenoids

Status
Not open for further replies.

JRiNVENTOR

New member
Hey thanks for all the info already!

I hope to be able to add to the community with this question regarding direction.....

SO,
I have been reading and experimenting with controlling Solenoids (with no success) and Servo's (with some success) via midi send from a DAW (Ableton Live). I do not fully understand the language here, and I'm having trouble picking apart other concepts/tutorials in order to complete my puzzle...long and short of it I am on course to use midi signal as a trigger out of PWM pin on Teensy to hit a transistor gate that would then allow a higher power (about 18v) actuation of my solenoid...I have seen a bunch of similar schematics for this but not using midi in a "live" way, just something along the lines of "on for 1 second, off for 1 second"...or always just a bit different than what I am trying to achieve....is there any direction you can point me in or clarity you can provide for the language being used? maybe an example script of what each command is doing?

I would love to make a clarifying video with the information - it seems everyone who has a stake in this niche subject is very vague with the detail/explanation of how to communicate from Daw->Teensy->Solenoid.

TLDR; I'd like to use midi notes sent from a DAW to control individual PWM pins on the Teensy that will in turn activate a Solenoid for automated percussion through a MOSFET transistor.

Thanks for everything Paul & Community!!
JR

I have messed with this code to no avail....I am using a Teensy 2 so I know I'll have to change the PWM pins specified....
/* / **************************************
musicBotsPulse
Pulse the PWM pins specified in pins[] when
MIDI "note on" messages are received
automatically turn off after set amount of time

Use with 5 channel modular-muse motor driver board:
https://oshpark.com/shared_projects/uq5EsZsM
Made for a Teensy LC

or a 4 channel modular-muse motor driver board and some jumper wires
https://oshpark.com/shared_projects/1uvL8iDM

NOTE: this code uses Teensyduino:
https://www.pjrc.com/teensy/teensyduino.html

variables:
pins[] - this array determines output pins to use (assumes PWM)
lowNote - determines the starting MIDI note for the first motor channel, the rest count up one note per channel
onTime - length time motor is pulsed on (in ms)
MIDI velocity is mapped to PWM rate to control motor power

by Jiffer Harriman - modular-muse.com
************************************** */

// use PWM pins 3, 4, 6, 9, 10
int pins[] = {3, 4, 6, 9, 10};
#define numNotes 5

// motor channel 0 will be triggered by lowNote
// motor channel 1 will be triggered by lowNote + 1 etc.
int lowNote = 36; // MIDI note 60 (a.k.a. C-3)

// how long to pulse in ms
unsigned int onTime = 15;

// keep track of the last time a motor channel (note) was triggered
unsigned long lastHit[numNotes];

// keep track if a note is currently on (high) or if it has been released
bool noteHigh[numNotes];

// Teensy MIDI callbacks
void OnNoteOn(byte channel, byte note, byte velocity);
void OnNoteOff(byte channel, byte note, byte velocity);


void setup() {

// initialize output pins to control the motors
for (int i = 0; i < 5; i++) {
pinMode(pins, OUTPUT);
}

// no notes are on to start
for (int i = 0; i < numNotes; i++) {
noteHigh = false;
lastHit = 0;
}

// init MIDI callbacks
usbMIDI.setHandleNoteOn(OnNoteOn);
usbMIDI.setHandleNoteOff(OnNoteOff);
}

// main loop
void loop() {
// flush the MIDI read buffer
while (usbMIDI.read()) {
}

// for all motor driver pins
// check if onTime since lastHit has elapsed
for (int i = 0; i < numNotes; i++) {
// if so, turn the motor off
if (noteHigh && (millis() - lastHit > onTime)) {
noteHigh = false;
analogWrite(pins, 0);
}
}
}


// When a new "note on" message is recieved
void OnNoteOn(byte channel, byte note, byte velocity) {

// check if the note is in range of our possible motor outputs
if (note >= lowNote && note < lowNote + numNotes) {
// adjust for note # offset
int noteNumber = note - lowNote;

// bit shift 7 bits to 12
analogWrite(pins[noteNumber], velocity << 5);

// keep track of which note is high and reset the time since the lastHit to now
noteHigh[noteNumber] = true;
lastHit[noteNumber] = millis();
}

}

// do nothing on "note off" messages since they are
// automatically turned off after onTime
void OnNoteOff(byte channel, byte note, byte velocity) {

}
 
Status
Not open for further replies.
Back
Top