Sockerbit MIDI Controller (25 / 38 steg)
Steg 25: Seriell kommunikation
I detta skede i projektet jag fick litet otålig och ville börja göra vissa ljud, så jag lagt några saker till firmware göra Arduino skicka och ta emot information seriellt. Jag har skrivit koden nedan. Jag använde en timer avbryta för att hålla Arduino lyhörda för inkommande seriell meddelanden, kan du läsa lite mer om hur det fungerar här. (om du ska testa här koden, använda app kopplad, den nya versionen av beat slicer app på github är lite annorlunda).
KNAPPEN TEST / 74HC595 och 74HC165 och seriell kommunikation
av Amanda Ghassaei
Juni 2012
/*
* Detta program är fri programvara; Du kan vidaredistribuera det och/eller ändra
* det enligt villkoren i GNU General Public License som offentliggjorts av
* den Free Software Foundation; antingen version 2 av licensen, eller
* (på ditt alternativ) någon senare version.
*
*/
denna firmware kommer att skicka data fram och tillbaka med maxmsp patch "beat slicer"
PIN-anslutningar
int ledLatchPin = 6;
int ledClockPin = 5;
int ledDataPin = 7.
int buttonLatchPin = 4;
int buttonClockPin = 3;
int buttonDataPin = 2;
looping variabler
byte i.
byte j;
byte k;
byte ledByte;
lagring för ledde staterna, 4 byte
byte ledData [] = {0, 0, 0, 0};
lagring för knappar, 4 byte
byte buttonCurrent [] = {0,0,0,0}.
byte buttonLast [] = {0,0,0,0}.
byte buttonEvent [] = {0,0,0,0}.
byte buttonState [] = {0,0,0,0}.
knappen Dämpningstid counter - 16 byte
byte buttonDebounceCounter [4] [4].
void setup() {
DDRD = 0xFA; //set stift D7-D4 som D2 som indata-utdata
Serial.BEGIN(57600);
(CLI); //stop avbrott
Ange timer2 avbryta varje 128us
TCCR2A = 0; / / Ställ in hela TCCR2A register till 0
TCCR2B = 0; / / samma för TCCR2B
TCNT2 = 0; //initialize värde till 0
Set jämför match registrera för 7,8 khz steg
OCR2A = 255; / / = (16 * 10 ^ 6) / (7812.5 * 8) - 1 (måste vara < 256)
Aktivera CTC läge
TCCR2A | = (1 << WGM21);
Ange CS11 bit för 8 prescaler
TCCR2B | = (1 << CS11);
Aktivera timern jämför avbrott
TIMSK2 | = (1 << OCIE2A);
SEI (); //allow avbrott
}
buttonCheck - kontrollerar status för en viss knapp.
denna buttoncheck funktion är i stort sett kopierade från monome 40h firmware brian crabtree och joe sjö
void buttonCheck (byte rad, byte index)
{
om (((buttonCurrent [rad] ^ buttonLast[row]) & (1 << index)) & & / / om det aktuella fysiska knapp läget skiljer sig från den
((buttonCurrent [rad] ^ buttonState[row]) & (1 << index))) {/ / last fysisk knapp staten och nuvarande debounced staten
om (buttonCurrent [rad] & (1 << index)) {/ / om nuläget fysisk knapp trycks
buttonEvent [rad] = 1 << index; köa upp en ny knapp händelse omedelbart
buttonState [rad] | = (1 << index); och ställa in debounced ner.
}
annat {
buttonDebounceCounter [rad] [index] = 12.
} / / annars knappen tidigare var deprimerad och nu
har släppts så vi våra debounce counter.
}
annars om (((buttonCurrent [rad] ^ buttonLast[row]) & (1 << index)) == 0 & & / / om det aktuella fysiska knapp läget är samma som
(buttonCurrent [rad] ^ buttonState[row]) & (1 << index)) {/ / den senaste fysiskt knappen stat men den nuvarande fysiskt
knappläge skiljer sig från den nuvarande debounce
statliga...
om (buttonDebounceCounter [rad] [index] > 0 & &--buttonDebounceCounter [rad] [index] == 0) {/ / om den räknaren debounce har
varit minskas till 0 (menande den
knappen har varit upp i
kButtonUpDefaultDebounceCount
iterationer / / /
buttonEvent [rad] = 1 << index; köa en knapp staten change-händelse
om (buttonCurrent [rad] & (1 << index)) {/ / och växla knapparna debounce staten.
buttonState [rad] | = (1 << index);
}
annat {
buttonState [rad] & = ~ (1 << index);
}
}
}
}
{Ogiltig shift()
för (jag = 0; jag < 4; i ++) {
buttonLast [i] = buttonCurrent [i];
byte dataToSend = (1 << (jag + 4)) | (15 & ~ ledData[i]);
ställa in spärren pin låg så lysdioderna inte ändra samtidigt skickas i bitar
digitalWrite (ledLatchPin, låg);
flytta ut bitarna av dataToSend
shiftOut (ledDataPin, ledClockPin, LSBFIRST, dataToSend);
ställa in spärren pin hög så lysdioderna kommer att få nya uppgifter
digitalWrite (ledLatchPin, hög);
När en rad har ställts in hög, ta emot data från knappar
ställa in spärren pin hög
digitalWrite (buttonLatchPin, hög);
skifta i data
buttonCurrent [i] = shiftIn (buttonDataPin, buttonClockPin, LSBFIRST) >> 3.
latchpin låg
digitalWrite (buttonLatchPin, låg);
för (k = 0; k < 4; k ++) {
buttonCheck(i,k);
om (buttonEvent [i] <> 1) & 3;
byte ledx = (ledByte >> 3) & 3;
om (ledstate) {
ledData [ledy] | = 8 >> ledx;
}
annat {
ledData [ledy] & = ~ (8 >> ledx);
}
} //end om seriell tillgängliga
} //end gör
medan (Serial.available() > 8);
}
void loop() {
Skift (); //updates lysdioder och tar emot data från knappar
}
Jag skickade detta seriella data till ljudbearbetning ansökan jag skrev i MaxMSP. Du kan hämta detta program nedan (kallade beat segmentfunktion) och öppna den med MaxMSP eller MaxRuntime (gratis version) här. Jag kör Max 5, jag antar att det kommer att fungera på Max 6 också. Det uppmanas du att välja en ljudfil (wav, mp3, aiff). Sedan kan du manipulera denna ljudfilen med knappsats som visas i videon nedan: