16 changed files with 528 additions and 162 deletions
			
			
		- 
					BINfritzing_files/input_Platte.fzz
- 
					28source/INPUT_MCP23017_test/INPUT_MCP23017_test.ino
- 
					99source/MCP23017_test/MCP23017_test.ino
- 
					1source/_4051_test/_4051_test.ino
- 
					22source/input_4051_library_test/input_4051_library_test.ino
- 
					67source/libraries/INPUT_74HC4051/INPUT_74HC4051.cpp
- 
					29source/libraries/INPUT_74HC4051/INPUT_74HC4051.h
- 
					115source/libraries/INPUT_MCP23017/INPUT_MCP23017.cpp
- 
					51source/libraries/INPUT_MCP23017/INPUT_MCP23017.h
- 
					42source/library/input_4051/input_4051.cpp
- 
					28source/library/input_4051/input_4061.h
- 
					0source/midi_in_out/midi_in_out.ino
- 
					62source/midi_in_out_softwareserial/midi_in_out_softwareserial.ino
- 
					45source/midi_led/midi_led.ino
- 
					9source/piezo_input/piezo_input.ino
- 
					92source/sketches/testing/midi_in_out_softwareserial.ino
| @ -0,0 +1,28 @@ | |||
| #include <Wire.h>
 | |||
| 
 | |||
| #include <INPUT_MCP23017.h>
 | |||
| #include <INPUT_74HC4051.h>
 | |||
| 
 | |||
| INPUT_MCP23017 input_MCP23017; | |||
| INPUT_74HC4051 input_4051; | |||
| 
 | |||
| void setup() { | |||
|   Serial.begin(9600); | |||
|   input_MCP23017.begin(0,printValue); | |||
|   input_4051.begin(A0,11,12,13,printValue); | |||
| } | |||
| 
 | |||
| void loop() { | |||
|   input_MCP23017.loop();   | |||
|   input_4051.loop(); | |||
| } | |||
| 
 | |||
| void printValue(int id, int pin, int value) { | |||
|    Serial.print("id: "); | |||
|    Serial.print(id); | |||
|    Serial.print(" pin: "); | |||
|    Serial.print(pin); | |||
|    Serial.print(" value: "); | |||
|    Serial.print(value); | |||
|    Serial.println(); | |||
| } | |||
| @ -0,0 +1,99 @@ | |||
| #include <Wire.h>
 | |||
| 
 | |||
| #define MCP23017_ADDRESS 0x20
 | |||
| 
 | |||
| // registers (from https://github.com/adafruit/Adafruit-MCP23017-Arduino-Library/blob/master/Adafruit_MCP23017.h)
 | |||
| #define MCP23017_IODIRA 0x00
 | |||
| #define MCP23017_IPOLA 0x02
 | |||
| #define MCP23017_GPINTENA 0x04
 | |||
| #define MCP23017_DEFVALA 0x06
 | |||
| #define MCP23017_INTCONA 0x08
 | |||
| #define MCP23017_IOCONA 0x0A
 | |||
| #define MCP23017_GPPUA 0x0C
 | |||
| #define MCP23017_INTFA 0x0E
 | |||
| #define MCP23017_INTCAPA 0x10
 | |||
| #define MCP23017_GPIOA 0x12
 | |||
| #define MCP23017_OLATA 0x14
 | |||
| 
 | |||
| #define MCP23017_IODIRB 0x01
 | |||
| #define MCP23017_IPOLB 0x03
 | |||
| #define MCP23017_GPINTENB 0x05
 | |||
| #define MCP23017_DEFVALB 0x07
 | |||
| #define MCP23017_INTCONB 0x09
 | |||
| #define MCP23017_IOCONB 0x0B
 | |||
| #define MCP23017_GPPUB 0x0D
 | |||
| #define MCP23017_INTFB 0x0F
 | |||
| #define MCP23017_INTCAPB 0x11
 | |||
| #define MCP23017_GPIOB 0x13
 | |||
| #define MCP23017_OLATB 0x15
 | |||
| 
 | |||
| int _addr = 0; | |||
| int _value[16]; | |||
| 
 | |||
| void setup() { | |||
|   Serial.begin(9600); | |||
| 	Wire.begin(); | |||
| 	 | |||
| 	// set defaults!
 | |||
| 	Wire.beginTransmission(MCP23017_ADDRESS | _addr); | |||
| 	Wire.write((byte)MCP23017_IODIRA); | |||
| 	Wire.write(0xFF);  // all inputs on port A
 | |||
| 	Wire.endTransmission(); | |||
| 
 | |||
| 	Wire.beginTransmission(MCP23017_ADDRESS | _addr); | |||
| 	Wire.write(MCP23017_IODIRB); | |||
| 	Wire.write(0xFF);  // all inputs on port B
 | |||
| 	Wire.endTransmission(); | |||
| 	 | |||
| 	 | |||
| 	Wire.beginTransmission(MCP23017_ADDRESS | _addr); | |||
| 	Wire.write(MCP23017_GPPUA);  | |||
| 	Wire.write(0xFF);	// all pullup resistors on port A
 | |||
| 	Wire.endTransmission(); | |||
| 	 | |||
| 	Wire.beginTransmission(MCP23017_ADDRESS | _addr); | |||
| 	Wire.write(MCP23017_GPPUB);  | |||
| 	Wire.write(0xFF);	// all pullup resistors on port B
 | |||
| 	Wire.endTransmission(); | |||
| } | |||
| 
 | |||
| void loop() { | |||
|    	uint8_t pin,bank; | |||
| 	int value; | |||
| 	//read bank A
 | |||
| 	Wire.beginTransmission(MCP23017_ADDRESS | _addr); | |||
| 	Wire.write(MCP23017_GPIOA); | |||
| 	Wire.endTransmission(); | |||
|     Wire.requestFrom(MCP23017_ADDRESS | _addr, 1); | |||
| 	bank = Wire.read(); | |||
| 	for (pin=0; pin<8; pin++) { | |||
| 		value = (bank >> pin) & 0x1; | |||
| 		if (_value[pin] != value) { | |||
| 			_value[pin] = value; | |||
| 		printValue(_addr,pin,value); | |||
| 		} | |||
| 	}  	 | |||
| 	//read bank B
 | |||
| 	Wire.beginTransmission(MCP23017_ADDRESS | _addr); | |||
| 	Wire.write(MCP23017_GPIOB); | |||
| 	Wire.endTransmission(); | |||
|     Wire.requestFrom(MCP23017_ADDRESS | _addr, 1); | |||
| 	bank = Wire.read(); | |||
| 	for (pin=8; pin<16; pin++) { | |||
| 		value = (bank >> (pin-8)) & 0x1; | |||
| 		if (_value[pin] != value) { | |||
| 			_value[pin] = value; | |||
| 		printValue(_addr,pin,value); | |||
| 		}		 | |||
| 	} | |||
| } | |||
| 
 | |||
| void printValue(int id, int pin, int value) { | |||
|    Serial.print("id: "); | |||
|    Serial.print(id); | |||
|    Serial.print(" pin: "); | |||
|    Serial.print(pin); | |||
|    Serial.print(" value: "); | |||
|    Serial.print(value); | |||
|    Serial.println(); | |||
| } | |||
| @ -0,0 +1,22 @@ | |||
| #include <INPUT_4051.h>
 | |||
| 
 | |||
| 
 | |||
| 
 | |||
| INPUT_4051 input_4051(A1,10,9,8,printValue); | |||
| 
 | |||
| void setup() { | |||
|   Serial.begin(9600); | |||
|   input_4051.setPinCount(2); | |||
| } | |||
| 
 | |||
| void loop() { | |||
|   input_4051.loop(); | |||
| }  | |||
| 
 | |||
| void printValue(int pin, int value) { | |||
|     Serial.print("pin"); | |||
|     Serial.print(pin); | |||
|     Serial.print(" : "); | |||
|     Serial.print(value/8); | |||
|     Serial.println(); | |||
| } | |||
| @ -0,0 +1,67 @@ | |||
| #include "Arduino.h"
 | |||
| #include "INPUT_74HC4051.h"
 | |||
| 
 | |||
| void INPUT_74HC4051::begin(uint8_t analog, uint8_t s0, uint8_t s1, uint8_t s2,CallbackFunction cbF) { | |||
| 	_analog = analog; | |||
| 	 | |||
| 	_s0 = s0; | |||
| 	_s1 = s1; | |||
| 	_s2 = s2; | |||
| 	 | |||
| 	pinMode(_analog,INPUT); | |||
| 	 | |||
| 	pinMode(_s0,OUTPUT); | |||
| 	pinMode(_s1,OUTPUT); | |||
| 	pinMode(_s2,OUTPUT); | |||
| 	 | |||
| 	_callbackFunction = cbF; | |||
| 	 | |||
| 	//init start values
 | |||
| 	uint8_t pin,r0,r1,r2; | |||
| 	for (pin=0; pin<8; pin++) { | |||
| 		r0 = bitRead(pin,0);      | |||
| 		r1 = bitRead(pin,1); | |||
| 		r2 = bitRead(pin,2);    | |||
| 		digitalWrite(_s0, r0); | |||
| 		digitalWrite(_s1, r1); | |||
| 		digitalWrite(_s2, r2); | |||
| 		//delayMicroseconds(10);
 | |||
| 		_value[pin] = analogRead(_analog); | |||
| 	}  	 | |||
| } | |||
| 
 | |||
| void INPUT_74HC4051::loop() { | |||
| 	uint8_t pin,r0,r1,r2; | |||
| 	int value; | |||
| 	for (pin=0; pin<8; pin++) { | |||
| 		r0 = bitRead(pin,0);      | |||
| 		r1 = bitRead(pin,1); | |||
| 		r2 = bitRead(pin,2);    | |||
| 		digitalWrite(_s0, r0); | |||
| 		digitalWrite(_s1, r1); | |||
| 		digitalWrite(_s2, r2); | |||
| 		//delayMicroseconds(10);
 | |||
| 		value = analogRead(_analog); | |||
| 		if (_value[pin] < value - INPUT_74HC4051_TOLERANCE || _value[pin] > value + INPUT_74HC4051_TOLERANCE) { | |||
| 			_value[pin] = value; | |||
| 			(*_callbackFunction)(_analog,pin,value); | |||
| 		} | |||
| 	}  	 | |||
| } | |||
| 
 | |||
| int INPUT_74HC4051::getSpecificValue(uint8_t pin) { | |||
| 	if (pin >= 8) | |||
| 		return -1; | |||
| 	uint8_t r0,r1,r2; | |||
| 	r0 = bitRead(pin,0);      | |||
| 	r1 = bitRead(pin,1); | |||
| 	r2 = bitRead(pin,2);    | |||
| 	digitalWrite(_s0, r0); | |||
| 	digitalWrite(_s1, r1); | |||
| 	digitalWrite(_s2, r2); | |||
| 	//delayMicroseconds(10);
 | |||
| 	int value = analogRead(_analog); | |||
| 	_value[pin] = value; | |||
| 	return value; | |||
| } | |||
| 
 | |||
| @ -0,0 +1,29 @@ | |||
| /* | |||
|   INPUT_4051.h - Library for reading inputs from 4051 multiplexer | |||
| */ | |||
| #ifndef INPUT_74HC4051_h | |||
| #define INPUT_74HC4051_h | |||
| 
 | |||
| #define INPUT_74HC4051_TOLERANCE 1 | |||
| 
 | |||
| #if !defined(CallbackFunction) | |||
| typedef void (*CallbackFunction)(int,int,int); | |||
| #endif | |||
| 
 | |||
| class INPUT_74HC4051 | |||
| { | |||
| 	public: | |||
| 		void begin(uint8_t analog, uint8_t s0, uint8_t s1, uint8_t s2,CallbackFunction cbF); | |||
| 		void loop(void); | |||
| 		int getSpecificValue(uint8_t pin); | |||
| 	private: | |||
| 		uint8_t _analog; | |||
| 		uint8_t _s0; | |||
| 		uint8_t _s1; | |||
| 		uint8_t _s2; | |||
| 		int _value[8]; | |||
| 		CallbackFunction _callbackFunction; | |||
| }; | |||
| 
 | |||
| 
 | |||
| #endif | |||
| @ -0,0 +1,115 @@ | |||
| #include <Wire.h>
 | |||
| 
 | |||
| #include "Arduino.h"
 | |||
| #include "INPUT_MCP23017.h"
 | |||
| 
 | |||
| void INPUT_MCP23017::begin(uint8_t addr,CallbackFunction cbF) { | |||
| 	Wire.begin(); | |||
| 	 | |||
| 	if (addr > 7) | |||
| 		_addr = 7; | |||
| 	else _addr =  addr; | |||
| 	 | |||
| 	_callbackFunction = cbF; | |||
| 		 | |||
| 	// set defaults!
 | |||
| 	Wire.beginTransmission(MCP23017_ADDRESS | _addr); | |||
| 	Wire.write((byte)MCP23017_IODIRA); | |||
| 	Wire.write(0xFF);  // all inputs on port A
 | |||
| 	Wire.endTransmission(); | |||
| 
 | |||
| 	Wire.beginTransmission(MCP23017_ADDRESS | _addr); | |||
| 	Wire.write(MCP23017_IODIRB); | |||
| 	Wire.write(0xFF);  // all inputs on port B
 | |||
| 	Wire.endTransmission(); | |||
| 	 | |||
| 	 | |||
| 	Wire.beginTransmission(MCP23017_ADDRESS | _addr); | |||
| 	Wire.write(MCP23017_GPPUA);  | |||
| 	Wire.write(0xFF);	// all pullup resistors on port A
 | |||
| 	Wire.endTransmission(); | |||
| 	 | |||
| 	Wire.beginTransmission(MCP23017_ADDRESS | _addr); | |||
| 	Wire.write(MCP23017_GPPUB);  | |||
| 	Wire.write(0xFF);	// all pullup resistors on port B
 | |||
| 	Wire.endTransmission(); | |||
| 
 | |||
| 	Wire.beginTransmission(MCP23017_ADDRESS | _addr); | |||
| 	Wire.write((byte)MCP23017_IPOLA); | |||
| 	Wire.write(0xFF);  // inverse all inputs
 | |||
| 	Wire.endTransmission(); | |||
| 
 | |||
| 	Wire.beginTransmission(MCP23017_ADDRESS | _addr); | |||
| 	Wire.write(MCP23017_IPOLB); | |||
| 	Wire.write(0xFF);    // inverse all inputs
 | |||
| 	Wire.endTransmission(); | |||
| 
 | |||
| 	//init start values
 | |||
| 	uint8_t pin,bank; | |||
| 	//read bank A
 | |||
| 	Wire.beginTransmission(MCP23017_ADDRESS | _addr); | |||
| 	Wire.write(MCP23017_GPIOA); | |||
| 	Wire.endTransmission(); | |||
|     Wire.requestFrom(MCP23017_ADDRESS | _addr, 1); | |||
| 	bank = Wire.read(); | |||
| 	for (pin=0; pin<8; pin++)  | |||
| 		_value[pin] = (bank >> pin) & 0x1; | |||
| 	//read bank B
 | |||
| 	Wire.beginTransmission(MCP23017_ADDRESS | _addr); | |||
| 	Wire.write(MCP23017_GPIOB); | |||
| 	Wire.endTransmission(); | |||
|     Wire.requestFrom(MCP23017_ADDRESS | _addr, 1); | |||
| 	bank = Wire.read(); | |||
| 	for (pin=8; pin<16; pin++)  | |||
| 		_value[pin] = (bank >> (pin-8)) & 0x1;	 	 | |||
| } | |||
| 
 | |||
| void INPUT_MCP23017::loop() { | |||
| 	uint8_t pin,bank; | |||
| 	int value; | |||
| 	//read bank A
 | |||
| 	Wire.beginTransmission(MCP23017_ADDRESS | _addr); | |||
| 	Wire.write(MCP23017_GPIOA); | |||
| 	Wire.endTransmission(); | |||
|     Wire.requestFrom(MCP23017_ADDRESS | _addr, 1); | |||
| 	bank = Wire.read(); | |||
| 	for (pin=0; pin<8; pin++) { | |||
| 		value = (bank >> pin) & 0x1; | |||
| 		if (_value[pin] != value) { | |||
| 			_value[pin] = value; | |||
| 		(*_callbackFunction)(_addr,pin,value); | |||
| 		} | |||
| 	}  	 | |||
| 	//read bank B
 | |||
| 	Wire.beginTransmission(MCP23017_ADDRESS | _addr); | |||
| 	Wire.write(MCP23017_GPIOB); | |||
| 	Wire.endTransmission(); | |||
|     Wire.requestFrom(MCP23017_ADDRESS | _addr, 1); | |||
| 	bank = Wire.read(); | |||
| 	for (pin=8; pin<16; pin++) { | |||
| 		value = (bank >> (pin-8)) & 0x1; | |||
| 		if (_value[pin] != value) { | |||
| 			_value[pin] = value; | |||
| 		(*_callbackFunction)(_addr,pin,value); | |||
| 		}		 | |||
| 	}  | |||
| } | |||
| 
 | |||
| int INPUT_MCP23017::getSpecificValue(uint8_t pin) { | |||
| 	if (pin > 16) | |||
| 		return LOW; | |||
| 	Wire.beginTransmission(MCP23017_ADDRESS | _addr);	 | |||
| 	uint8_t p = pin; | |||
| 	if (pin > 8) { | |||
| 		Wire.write(MCP23017_GPIOB); | |||
| 		p -= 8; | |||
| 	} else  | |||
| 		Wire.write(MCP23017_GPIOA); | |||
| 	Wire.endTransmission(); | |||
| 	uint8_t	bank = Wire.read(); | |||
| 	int value = (bank >> p) & 0x1; | |||
| 	_value[pin] = value; | |||
| 	return value; | |||
| } | |||
| 
 | |||
| 
 | |||
| @ -0,0 +1,51 @@ | |||
| /* | |||
|   INPUT_MCP23017.h - Library for reading inputs from MCP23017 port Expander | |||
| */ | |||
| #ifndef INPUT_MCP23017_h | |||
| #define INPUT_MCP23017_h | |||
| 
 | |||
| #if !defined(CallbackFunction) | |||
| typedef void (*CallbackFunction)(int,int,int); | |||
| #endif | |||
| 
 | |||
| class INPUT_MCP23017 | |||
| { | |||
| 	public: | |||
| 		void begin(uint8_t addr,CallbackFunction cbF); | |||
| 		void loop(void); | |||
| 		int getSpecificValue(uint8_t pin); | |||
| 	private: | |||
| 		uint8_t _addr; | |||
| 		int _value[16]; | |||
| 		CallbackFunction _callbackFunction; | |||
| }; | |||
| 
 | |||
| #define MCP23017_ADDRESS 0x20 | |||
| 
 | |||
| // registers (from https://github.com/adafruit/Adafruit-MCP23017-Arduino-Library/blob/master/Adafruit_MCP23017.h) | |||
| #define MCP23017_IODIRA 0x00 | |||
| #define MCP23017_IPOLA 0x02 | |||
| #define MCP23017_GPINTENA 0x04 | |||
| #define MCP23017_DEFVALA 0x06 | |||
| #define MCP23017_INTCONA 0x08 | |||
| #define MCP23017_IOCONA 0x0A | |||
| #define MCP23017_GPPUA 0x0C | |||
| #define MCP23017_INTFA 0x0E | |||
| #define MCP23017_INTCAPA 0x10 | |||
| #define MCP23017_GPIOA 0x12 | |||
| #define MCP23017_OLATA 0x14 | |||
| 
 | |||
| #define MCP23017_IODIRB 0x01 | |||
| #define MCP23017_IPOLB 0x03 | |||
| #define MCP23017_GPINTENB 0x05 | |||
| #define MCP23017_DEFVALB 0x07 | |||
| #define MCP23017_INTCONB 0x09 | |||
| #define MCP23017_IOCONB 0x0B | |||
| #define MCP23017_GPPUB 0x0D | |||
| #define MCP23017_INTFB 0x0F | |||
| #define MCP23017_INTCAPB 0x11 | |||
| #define MCP23017_GPIOB 0x13 | |||
| #define MCP23017_OLATB 0x15 | |||
| 
 | |||
| 
 | |||
| #endif | |||
| @ -1,42 +0,0 @@ | |||
| /*
 | |||
|   Morse.cpp - Library for flashing Morse code. | |||
|   Created by David A. Mellis, November 2, 2007. | |||
|   Released into the public domain. | |||
| */ | |||
| 
 | |||
| #include "Arduino.h"
 | |||
| #include "input_4051.h"
 | |||
| 
 | |||
| const int tolerance = 4; | |||
| 
 | |||
| input_4051::input_4051(int analogPin, int s0Pin, int s1Pin, int s2Pin, void (*valueChangeCallback(int,int))) | |||
| { | |||
| 	_analog = analogPin; | |||
| 	_s0 = s0Pin; | |||
| 	_s1 = s1Pin; | |||
| 	_s2 = s2Pin; | |||
| 	pinMode(_analog,INPUT); | |||
| 	pinMode(_s0,OUTPUT); | |||
| 	pinMode(_s1,OUTPUT); | |||
| 	pinMode(_s2,OUTPUT); | |||
| 	_valueChangeCallback = valueChangeCallback; | |||
| 	_value = {-1,-1,-1,-1,-1,-1,-1,-1}; | |||
| } | |||
| 
 | |||
| void input_4051::loop() | |||
| { | |||
| 	for (count=0; count<=7; count++) { | |||
| 		r0 = bitRead(count,0);      | |||
| 		r1 = bitRead(count,1); | |||
| 		r2 = bitRead(count,2);    | |||
| 		digitalWrite(_s0, r0); | |||
| 		digitalWrite(_s1, r1); | |||
| 		digitalWrite(_s2, r2); | |||
| 		int read = analogRead(_analog); | |||
| 		if (value[count] < read - tolerance || value[count] > read + tolerance) { | |||
| 			value[count] = read; | |||
| 			_valueChangeCallback(count, read); | |||
| 		} | |||
| 	}  	 | |||
| } | |||
| 
 | |||
| @ -1,28 +0,0 @@ | |||
| /* | |||
|   input_4051.h - Library for reading inputs from 4051 multiplexer | |||
|   Created by David A. Mellis, November 2, 2007. | |||
|   Released into the public domain. | |||
| */ | |||
| #ifndef input_4051_h | |||
| #define input_4051_h | |||
| 
 | |||
| #include "Arduino.h" | |||
| 
 | |||
| 
 | |||
| class input_4051 | |||
| { | |||
| 	public: | |||
| 		Morse(int analogPin, int s0Pin, int s1Pin, int s2Pin, void (*valueChangeCallback(int,int))); | |||
| 		void loop(void); | |||
| 		int getSpecificValue(int pin); | |||
| 	private: | |||
| 		int _analog; | |||
| 		int _s0; | |||
| 		int _s1; | |||
| 		int _s2; | |||
| 		void (*_valueChangeCallback(int,int); | |||
| 		int _value[8]; | |||
| }; | |||
| 
 | |||
| 
 | |||
| #endif | |||
| @ -0,0 +1,62 @@ | |||
| #include <Wire.h>
 | |||
| #include <SoftwareSerial.h>
 | |||
| 
 | |||
| #define IOPOLA   0x02
 | |||
| #define GPPUA   0x12
 | |||
| #define BIT_IS_SET(i, bits)  (1 << i & bits)
 | |||
| 
 | |||
| SoftwareSerial MIDI(10,11); | |||
| 
 | |||
| boolean button[8]; | |||
| 
 | |||
| void setup()   | |||
| { | |||
|   //printing baudrate
 | |||
|   Serial.begin(9600); | |||
|   MIDI.begin(31250); | |||
|   Wire.begin(); | |||
|    Wire.beginTransmission(0x20); | |||
|   Wire.write(0x12); // set MCP23017 memory pointer to GPIOB address
 | |||
|   Wire.write(0xFF); //PULLUP
 | |||
|   Wire.endTransmission(); | |||
| } | |||
| 
 | |||
| void loop() | |||
| { | |||
|   Wire.beginTransmission(0x20); | |||
|   Wire.write(0x12); // set MCP23017 memory pointer to GPIOB address
 | |||
|   Wire.endTransmission(); | |||
|   Wire.requestFrom(0x20, 1); // request one byte of data from MCP20317
 | |||
|   int inputs = Wire.read(); | |||
|   delayMicroseconds(10); | |||
|   //check if button is pressed
 | |||
|    | |||
|   int i; | |||
|   for(i=0;i<8;i++) { | |||
|     if (BIT_IS_SET(i,inputs)) { | |||
|       if(!button[i]) { | |||
|         button[i] = true; | |||
|         midiSignal(144,60+i,115); | |||
|       } | |||
|     } else { | |||
|       if(button[i]) { | |||
|         button[i] = false; | |||
|         midiSignal(128,60+i,0); | |||
|       } | |||
|     } | |||
|   }   | |||
| } | |||
| 
 | |||
| //send MIDI signal through softwareserial
 | |||
| void midiSignal(byte b1, byte b2, byte b3) { | |||
|   Serial.print(b1); | |||
|   Serial.print(" "); | |||
|   Serial.print(b2); | |||
|   Serial.print(" "); | |||
|   Serial.print(b3); | |||
|   Serial.print(" "); | |||
|   Serial.println(); | |||
|   MIDI.write(b1); | |||
|   MIDI.write(b2); | |||
|   MIDI.write(b2); | |||
| } | |||
| @ -0,0 +1,45 @@ | |||
| /*
 | |||
|  MIDI note player | |||
|   | |||
|  This sketch shows how to use the serial transmit pin (pin 1) to send MIDI note data. | |||
|  If this circuit is connected to a MIDI synth, it will play  | |||
|  the notes F#-0 (0x1E) to F#-5 (0x5A) in sequence. | |||
| 
 | |||
|   | |||
|  The circuit: | |||
|  * digital in 1 connected to MIDI jack pin 5 | |||
|  * MIDI jack pin 2 connected to ground | |||
|  * MIDI jack pin 4 connected to +5V through 220-ohm resistor | |||
|  Attach a MIDI cable to the jack, then to a MIDI synth, and play music. | |||
| 
 | |||
|  created 13 Jun 2006 | |||
|  modified 13 Aug 2012 | |||
|  by Tom Igoe  | |||
| 
 | |||
|  This example code is in the public domain. | |||
|   | |||
|  http://www.arduino.cc/en/Tutorial/Midi
 | |||
|   | |||
|  */ | |||
| 
 | |||
| void setup() { | |||
|   //  Set MIDI baud rate:
 | |||
|   Serial.begin(9600); | |||
|   pinMode(2, INPUT); | |||
|   digitalWrite(2, HIGH); | |||
|   pinMode(3, OUTPUT);  | |||
| } | |||
| 
 | |||
| void loop() { | |||
|   button(); | |||
| } | |||
| 
 | |||
| void button() { | |||
|   int sensorVal = digitalRead(2); | |||
|   if (sensorVal == HIGH) { | |||
|     digitalWrite(3, LOW); | |||
|   }  | |||
|   else { | |||
|     digitalWrite(3, HIGH); | |||
|   } | |||
| } | |||
| @ -0,0 +1,9 @@ | |||
| void setup() { | |||
|    Serial.begin(9600); | |||
| } | |||
| 
 | |||
| void loop() { | |||
|   int val = analogRead(5);      | |||
|   Serial.println(val); | |||
|   delay(100);  // we have to make a delay to avoid overloading the serial port
 | |||
| } | |||
| @ -1,92 +0,0 @@ | |||
| #include <SoftwareSerial.h>
 | |||
| 
 | |||
| // RX, TX for MIDI out
 | |||
| SoftwareSerial MIDI(10, 11);  | |||
| 
 | |||
| //button pin
 | |||
| const int switchPin = 6; | |||
| //rotary encoder pins
 | |||
| const int encAPin = 4; | |||
| const int encBPin = 5; | |||
| 
 | |||
| //for sending note-off once after button is released
 | |||
| boolean btnOff = false; | |||
| 
 | |||
| //old rotary encoder value
 | |||
| int encA = LOW; | |||
| //read rotary encoder value
 | |||
| int enc = HIGH; | |||
| 
 | |||
| void setup()   | |||
| { | |||
|   //printing baudrate
 | |||
|   Serial.begin(9600); | |||
|   //MIDI baudrate for software serial (pin 10 & 11)
 | |||
|   MIDI.begin(31250); | |||
|   //button and encoder pins as input
 | |||
|   pinMode(switchPin, INPUT); | |||
|   pinMode(encAPin, INPUT); | |||
|   pinMode(encBPin, INPUT); | |||
|   //activate pullup-resistors (read value is inverted, so LOW is active)
 | |||
|   digitalWrite(switchPin, HIGH); | |||
|   digitalWrite(encAPin, HIGH); | |||
|   digitalWrite(encBPin, HIGH); | |||
| } | |||
| 
 | |||
| void loop() | |||
| { | |||
|   //print incoming bytes on softwareserial, just for checking MIDI-in, worked
 | |||
|   if (MIDI.available()) | |||
|     Serial.println(MIDI.read()); | |||
|    | |||
|   //check if button is pressed
 | |||
|   if (digitalRead(switchPin) == LOW) | |||
|   {   | |||
|     if (!btnOff) { | |||
|       //send note on
 | |||
|       midiSignal(144,60,100); | |||
|       btnOff = true; | |||
|     } | |||
|   }   | |||
|   if (digitalRead(switchPin) == HIGH) | |||
|     { | |||
|     //send note off
 | |||
|     if (btnOff) { | |||
|         midiSignal(128,60,0); | |||
|         btnOff = false; | |||
|     } | |||
|   } | |||
|    | |||
|   //read encoder pin A
 | |||
|   enc = digitalRead(encAPin); | |||
|   //check if rotary encoder is turned
 | |||
|   if ((encA == HIGH) && (enc == LOW)) { | |||
|       //check direction of turning
 | |||
|       if (digitalRead(encBPin) == HIGH) { | |||
|          //send note on and note off directly, so signal is send on every turn 
 | |||
|          midiSignal(144,62,100); | |||
|          midiSignal(128,62,100); | |||
|        } else { | |||
|          //other direction, other note value
 | |||
|          midiSignal(144,61,100); | |||
|          midiSignal(128,61,100); | |||
|        } | |||
|    }  | |||
|    //save "old" encoder value
 | |||
|    encA = enc; | |||
| } | |||
| 
 | |||
| //send MIDI signal through softwareserial
 | |||
| void midiSignal(byte b1, byte b2, byte b3) { | |||
|   //debug printing
 | |||
|   Serial.print("send: "); | |||
|   Serial.print(b1); | |||
|   Serial.print(" | "); | |||
|   Serial.print(b2); | |||
|   Serial.print(" | "); | |||
|   Serial.print(b3); | |||
|   Serial.println(""); | |||
|   MIDI.write(b1); | |||
|   MIDI.write(b2); | |||
|   MIDI.write(b2); | |||
| } | |||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue