Hallo
Ich habe ein Projekt, mit dem ich Sensoren auslese und Midi Befehle sende.
Über die Serielle Schnittstelle funktioniert dies auch. Zusätzlich möchte ich die selben Befehle auch über einen RFM12 senden.
Mit dem Serial Demo für RFM12 kann mann serielle Daten senden. Aber dies funktioniert nur mit Daten die auf der Seriellen Schnittstelle empfangen werden.
Habe schon einige Varianten probiert finde aber keine Lösung .
RFM12 Serial:
// Serial data over RF12 demo, works in both directions
// 2009-04-17 <jcw@equi4.com> http://opensource.org/licenses/mit-license.php
// $Id: rf12serial.pde 4727 2009-12-08 21:39:49Z jcw $
#include <Ports.h>
#include <RF12.h>
#include <RF12sio.h>
RF12 RF12;
void setup() {
Serial.begin(31250);
Serial.print("\n[rf12serial]");
rf12_config();
}
void loop() {
if (Serial.available())
RF12.send(Serial.read());
if (RF12.poll())
Serial.print(RF12.read());
}
Mein Arduino Code:
#define BUTTON1 7
#define STAT1 6
byte needToSend;
byte incomingByte;
byte note;
byte velocity;
int pot0;
int pot1;
int val,t;
int note1=48;
int Velo;
int Velor;
//*****************
// Variables
int switchState1 = HIGH;
int currentSwitchState1 = HIGH;
//****************************
byte byte1;
byte byte2;
byte byte3;
// RF 12
#include <Ports.h>
#include <RF12.h>
#include <RF12sio.h>
RF12 RF12;
// ENDE
void setup() {
Serial.begin (38400); //(31250); // Midi Baudrate
Serial.print("\n[rf12serial]");
rf12_config();
rf12_initialize(21, RF12_868MHZ, 8);
//
pinMode(STAT1,OUTPUT);
pinMode(BUTTON1,INPUT);
digitalWrite(BUTTON1,HIGH);
}
void loop () {
//****************Digital Ports************
pot0 = analogRead(0);
Velor= pot0/8;
pot1 = analogRead(1);
Velo= pot1/8;
//***********Variante B Pollen***************
currentSwitchState1 = digitalRead(BUTTON1); //switchPin1
if( currentSwitchState1 == LOW && switchState1 == HIGH ) // push
Midi_Send(0x90, note1,Velo);
RF12_Send(0x90, note1,Velo);
digitalWrite(STAT1,HIGH);
if( currentSwitchState1 == HIGH && switchState1 == LOW ) { // release
Midi_Send(0x80, note1,0x45);
RF12_Send(0x80, note1,0x45);
Midi_Send(0x90, note1+12,Velor); // release Ton on
delay (Velor);
Midi_Send(0x80, note1+12, 0x01); // release Ton off
}
switchState1 = currentSwitchState1;
digitalWrite(STAT1,LOW);
//**********Pollen Ende***************
}
void Midi_Send(byte cmd, byte data1, byte data2) {
Serial.print(cmd, BYTE);
Serial.print(data1, BYTE);
Serial.print(data2, BYTE);
RF12.send(Serial.read());
}
void RF12_Send(byte cmd, byte data1, byte data2) {
struct {
byte cmd:8; // Note on / off
byte data1:8; // Note Value
byte data2:8; // Note Velocity
} payload;
rf12_recvDone();
if (needToSend && rf12_canSend()) {
needToSend = 0;
// payload.cmd = 1;
// payload.data1 = 2;
// payload.data2 = 3;
rf12_sendStart(0, &payload, sizeof payload);
// RF12.send(Serial.read());
// RF12.send(cmd, BYTE);
// RF12.send(data1, BYTE);
// RF12.send(data2, BYTE);
if (RF12.poll())
Serial.print(RF12.read());
}
}
char button(char button_num) {
return (!(digitalRead(button_num)));
}
Die Baudrate steht auf 38400 um den Serial-Monitor zu benutzen. Da ich dort keine freien Werte einrichten kann.
Mit der Variant über Payload funktioniert es nicht.
Auch RF12.send(Serial.read()). macht hier keinen Sinn. Da die Midi befehle auf TX geschrieben werden und RX gelesen wird.
Hat Jemand einenen Lösungsansatz?