Hallo Forumsgemeinschaft , ich habe mir auf Basis von :e-licktronic MIDI System compatible with Arduino eine Platine mit je 3 CD4021 zur Eingabe und 3 Stueck 595 Schieberegistern zur Ausgabe an LED-s gebaut . Leider bin ich absoluter Anfaenger in Sachen Arduino . Die Steuerung funktioniert auch , es werden die Taster abgefragt und deren Schaltzustand auch von den LED-s angezeigt , nur bekomme ich nichts auf MIDI ausgegeben .Wie koennte ich dieses pruefen , wenn ich im Serial Monitor die Ausgabe anschaue bekomme ich bei Tastendruck nur Quadrate ausgegeben , muesste unter Umstaenden etwas anderes angezeigt werden ?
//****************************************************************//
// Dilicktal_MIDI v1_0 //
// //
// Ce sketch montre comment utiliser la platine Dilicktal //
// pour envoyer des messages MIDI avec les boutons et afficher l' //
// état du bouton sur la led correspondante. //
// //
// Les boutons sont en mode TOGGLE ce qui signifie que lors de la //
// première pression on envoie ON en MIDI (127) et le bouton //
// reste ON jusqu'à la deuxième pression du bouton. //
// //
// Les fonctions shiftOut et shiftIn utilisées dans ce sketch //
// viennent des tutoriaux présents sur le site Arduino //
// http://www.arduino.cc/en/Tutorial/ShiftIn //
// http://arduino.cc/en/Tutorial/ShiftOut //
//****************************************************************
//Nombre de platines Dilicktal connectées (de 1 à 8 bei mir sind es 3)
#define numDigital 3
//Définir les PINs des 4021
#define latchPinIn 10
#define dataPinIn 11
#define clockPinIn 9
//Définir les PINs des 74hc595
#define latchPinOut 12
#define clockPinOut 9
#define dataPinOut 13
byte preBoutonRead[numDigital] = {
0};//flag de la valeur de chaques boutons
byte led[numDigital] = {
0};//valeur envoyer à chaques platines Dilicktal
byte stateBouton[numDigital] = {
0};//état de chaques boutons
boolean stateLed[numDigital][8]={
0};//état de chaques leds
byte boutonCC[]={
20,28,36,44,52,60,68,76};// numéro du control change pour chaques Dilicktal
// la valeur 20 correspond à la première platine Dilicktal connectée
// c'est à dire que les boutons de la première platine auront les valeurs de CC de 20 à 27
// la valeur 28 correspond à la deuxième platine Dilicktal connectée ...
void setup() {
//Serial baud rate à 57600 pour utiliser en USB et 31250 pour utiliser en MIDI
Serial.begin(31250);
//define pin modes
pinMode(latchPinIn, OUTPUT);
pinMode(clockPinIn, OUTPUT);
pinMode(dataPinIn, INPUT);
pinMode(latchPinOut, OUTPUT);
SendToLed (255,255,255,255,255,255,255,255);
delay (1000);
SendToLed (0,0,0,0,0,0,0,0);
}
void loop() {
for (int y=0; y<numDigital; y++){
//loop autant de fois que de nombre de Dilicktal connectée
preBoutonRead[y] = BoutonRead(y);
// Récupère la valeur actuelle de l'octet des boutons correspondante à la platine Dilicktal
if (stateBouton[y] != preBoutonRead[y]){
// la valeur de l'octet des boutons a t-elle changée?
stateBouton[y] = preBoutonRead[y];
// Stock la valeur de l'octet changée
for (int x =0; x <8; x++){
//scan les 8 bits de l'octet
if (bitRead (preBoutonRead[y], x)){
//teste chaques boutons
if (stateLed[y][x]==0){
//si la led correspondante au bouton est à 0
bitSet (led[y],x);
// on la met a 1
stateLed[y][x]=1;
// on met à jour l'état de la led
sendCC ((x+boutonCC[y]),127);
//On envoie le message MIDI Control Change "ON" correspondant sur le canal choisi
}
else{
// mais si la led correspondante au bouton est à 1
bitWrite (led[y],x,0);
// On la met à 0
stateLed[y][x]=0;
// On met à jour l'état de la led
sendCC ((x+boutonCC[y]),0);
//On envoie le message MIDI Control Change "OFF" correspondant sur le canal choisi
}
}
}
SendToLed (led[0],led[1],led[2],led[3],led[4],led[5],led[6],led[7]);
//Envoie des 8 octets correspondant aux leds
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////FONCTION//////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////
void SendToLed (byte data1,byte data2,byte data3,byte data4,byte data5,byte data6,byte data7,byte data8) {
digitalWrite(latchPinOut, 0);
delayMicroseconds(20);
shiftOut(dataPinOut, clockPinOut, data8);
shiftOut(dataPinOut, clockPinOut, data7);
shiftOut(dataPinOut, clockPinOut, data6);
shiftOut(dataPinOut, clockPinOut, data5);
shiftOut(dataPinOut, clockPinOut, data4);
shiftOut(dataPinOut, clockPinOut, data3);
shiftOut(dataPinOut, clockPinOut, data2);
shiftOut(dataPinOut, clockPinOut, data1);
digitalWrite(latchPinOut, 1);
}
byte BoutonRead (int flag) {
if (flag ==0){
int i;
digitalWrite(latchPinIn,1);
delayMicroseconds(20);
digitalWrite(latchPinIn,0);
i = shiftIn(dataPinIn, clockPinIn);
return i;
}
if (flag ==1){
int i;
digitalWrite(latchPinIn,1);
delayMicroseconds(20);
digitalWrite(latchPinIn,0);
shiftIn(dataPinIn, clockPinIn);
i = shiftIn(dataPinIn, clockPinIn);
return i;
}
if (flag ==2){
int i;
digitalWrite(latchPinIn,1);
delayMicroseconds(20);
digitalWrite(latchPinIn,0);
shiftIn(dataPinIn, clockPinIn);
shiftIn(dataPinIn, clockPinIn);
i = shiftIn(dataPinIn, clockPinIn);
return i;
}
if (flag ==3){
int i;
digitalWrite(latchPinIn,1);
delayMicroseconds(20);
digitalWrite(latchPinIn,0);
shiftIn(dataPinIn, clockPinIn);
shiftIn(dataPinIn, clockPinIn);
shiftIn(dataPinIn, clockPinIn);
i = shiftIn(dataPinIn, clockPinIn);// on stock les deux octets dans une variable
return i;
}
if (flag ==4){
int i;
digitalWrite(latchPinIn,1);// On met le 4021 en mode lecture
delayMicroseconds(20);
digitalWrite(latchPinIn,0);
shiftIn(dataPinIn, clockPinIn);
shiftIn(dataPinIn, clockPinIn);
shiftIn(dataPinIn, clockPinIn);
shiftIn(dataPinIn, clockPinIn);
i = shiftIn(dataPinIn, clockPinIn);
return i;
}
if (flag ==5){
int i;
digitalWrite(latchPinIn,1);
delayMicroseconds(20);
digitalWrite(latchPinIn,0);
shiftIn(dataPinIn, clockPinIn);
shiftIn(dataPinIn, clockPinIn);
shiftIn(dataPinIn, clockPinIn);
shiftIn(dataPinIn, clockPinIn);
shiftIn(dataPinIn, clockPinIn);
i = shiftIn(dataPinIn, clockPinIn);
return i;
}
if (flag ==6){
int i;
digitalWrite(latchPinIn,1);
delayMicroseconds(20);
digitalWrite(latchPinIn,0);
shiftIn(dataPinIn, clockPinIn);
shiftIn(dataPinIn, clockPinIn);
shiftIn(dataPinIn, clockPinIn);
shiftIn(dataPinIn, clockPinIn);
shiftIn(dataPinIn, clockPinIn);
shiftIn(dataPinIn, clockPinIn);
i = shiftIn(dataPinIn, clockPinIn);
return i;
}
if (flag ==7){
int i;
digitalWrite(latchPinIn,1);
delayMicroseconds(20);
digitalWrite(latchPinIn,0);
shiftIn(dataPinIn, clockPinIn);
shiftIn(dataPinIn, clockPinIn);
shiftIn(dataPinIn, clockPinIn);
shiftIn(dataPinIn, clockPinIn);
shiftIn(dataPinIn, clockPinIn);
shiftIn(dataPinIn, clockPinIn);
shiftIn(dataPinIn, clockPinIn);
i = shiftIn(dataPinIn, clockPinIn);
return i;
}
}
void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {
int i=0;
int pinState;
pinMode(myClockPin, OUTPUT);
pinMode(myDataPin, OUTPUT);
digitalWrite(myDataPin, 0);
digitalWrite(myClockPin, 0);
for (i=7; i>=0; i--) {
digitalWrite(myClockPin, 0);
if ( myDataOut & (1<<i) ) {
pinState= 1;
}
else {
pinState= 0;
}
digitalWrite(myDataPin, pinState);
digitalWrite(myClockPin, 1);
digitalWrite(myDataPin, 0);
}
}
byte shiftIn(int myDataPin, int myClockPin) {
int i;
int temp = 0;
int pinState;
byte myDataIn = 0;
pinMode(myClockPin, OUTPUT);
pinMode(myDataPin, INPUT);
for (i=7; i>=0; i--)
{
digitalWrite(myClockPin, 0);
delayMicroseconds(2);
temp = digitalRead(myDataPin);
if (temp) {
pinState = 1;
myDataIn = myDataIn | (1 << i);
}
else {
pinState = 0;
}
digitalWrite(myClockPin, 1);
}
return myDataIn;
}
void sendCC (int CCnum, int value)
{
Serial.write (0xB0);//Message "control change" sur canal MIDI 1
Serial.write (CCnum);
Serial.write (value);
}
Vielen Dank !