Update:
Ich habe mal ein wenig weiter rum gebastelt und es nun auch geschafft Daten an das iPad zu senden.
Bei meinem Versuchsaufbau ist bei dem Multi-Toggle das locale feedback ausgeschaltet und wird vom Arduino übernommen.
Naja und den rest kann man im Video sehen:
Hier auch wieder der Code:
#include <SPI.h>
#include <Ethernet.h> // version IDE 0022
#include <Z_OSC.h>
#include <Wire.h>
// Krams für die Netzwerkverbindung
byte myMac[] = { 0xDE, 0xAD, 0xBE, 0xFE, 0xFE, 0xED };
byte myIp[] = { 192, 168, 1, 4 };
int serverPort = 8000;
byte gateway[] = { 192, 168, 1, 1 }; // ROUTER
byte subnet[] = {255, 255, 255, 0 }; // SUBNET
byte destIp[] = { 192, 168, 1, 3 };
int destPort = 9000;
// Ein paar Variablen
uint16_t i;
float floatValue;
boolean ifPos;
int Pos;
int xPos;
int yPos;
char adresse[10];
String blue = "/1/encoder_blue";
String red = "/1/encoder_red";
String green = "/1/encoder_green";
String touchPos = "/1/pos/";
String loeschen = "/1/clear";
// Datenspeicher für jede Farbe an jedem Ort
int valueBlue[64] ={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int valueRed[64] ={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int valueGreen[64] ={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
// OSC-Kram initialisieren
Z_OSCServer server;
Z_OSCMessage *rcvMes;
Z_OSCClient client;
// Setup-Routine
void setup(){
//Serial.begin(19200);
Serial.println();
Serial.print("init LAN");
Ethernet.begin(myMac ,myIp);
server.sockOpen(serverPort);
Serial.println(" <-OK");
// Rainbowduino löschen
setupRainbow();
}
// Loop schleife
void loop(){
if(server.available()){
rcvMes=server.getMessage();
for(i=0 ; i<rcvMes->getArgsNum(); i++){
switch( rcvMes->getTypeTag(i) ){
case 'f':
floatValue = rcvMes->getFloat(i);
String adress = rcvMes->getZ_OSCAddress();
// Ist auf die Matrix gedrueckt worden?
if(adress.startsWith("/1/pos")){
Pos = (adress.charAt(7)-48)+((adress.charAt(9)-48)*8-8)-1; // Position auslesen
xPos =adress.charAt(7)-48;
yPos = adress.charAt(9)-48;
adress.toCharArray(adresse,11);
Z_OSCMessage message;
message.setAddress(destIp,destPort);
if (floatValue==1){
message.setZ_OSCMessage(adresse , "s" ,"1");
ifPos = 1;
}
if (floatValue==0) {
message.setZ_OSCMessage(adresse , "s" ,"0");
ifPos =0;
}
client.send(&message);
message.flush();
}
if (ifPos == 1){
if(blue==rcvMes->getZ_OSCAddress()){
if (floatValue==1.0) if (valueBlue[Pos]<15)valueBlue[Pos]++; setRainbow();
if (floatValue==-1.0) if (valueBlue[Pos]>0)valueBlue[Pos]--; setRainbow();
}
if(red==rcvMes->getZ_OSCAddress()){
if (floatValue== 1.0) if (valueRed[Pos]<15)valueRed[Pos]++; setRainbow();
if (floatValue==-1.0) if (valueRed[Pos]>0)valueRed[Pos]--; setRainbow();
}
if(green==rcvMes->getZ_OSCAddress()){
if (floatValue== 1.0) if (valueGreen[Pos]<15)valueGreen[Pos]++; setRainbow();
if (floatValue==-1.0) if (valueGreen[Pos]>0)valueGreen[Pos]--; setRainbow();
}
// Serial.print ("Position: ");
// Serial.print (Pos);
// Serial.print ("\t Blau: ");
// Serial.print (valueBlue[Pos]);
// Serial.print ("\t Rot: ");
// Serial.print (valueRed[Pos]);
// Serial.print ("\t Gruen ");
// Serial.println (valueGreen[Pos]);
}
if(loeschen==rcvMes->getZ_OSCAddress()){
// Serial.print("clear");
if (floatValue== 1.0) setupRainbow();
}
break;
}
}
}
}
Für den Rainbowduino:
#include <stdio.h>
#include <avr/pgmspace.h>
// Befehlsstruktur definieren
#ifndef WireCommands_h
#define WireCommands_h
#define MAX_WIRE_CMD 0x80
#define CMD_NOP 0x00
#define CMD_SWAP_BUF 0x10
#define CMD_COPY_FRONT_BUF 0x11
#define CMD_SHOW_AUX_BUF 0x12
#define CMD_CLEAR_BUF 0x20
#define CMD_SET_PAPER 0x21
#define CMD_SET_INK 0x22
#define CMD_CLEAR_PAPER 0x25
#define CMD_DRAW_PIXEL 0x26
#define CMD_DRAW_LINE 0x27
#define CMD_DRAW_SQUARE 0x28
#define CMD_PRINT_CHAR 0x2A
#define CMD_DRAW_ROW_MASK 0x2B
extern unsigned char CMD_totalArgs[MAX_WIRE_CMD];
#endif
// Argumentenanzahl für jeden Befehl speichern
unsigned char CMD_totalArgs[MAX_WIRE_CMD] PROGMEM = {
// 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - A - B - C - D - E - F
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0 - 0x00 -> 0x0F
0, 2, 1, 2, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, // 1 - 0x10 -> 0x1F
3, 3, 3, 0, 0, 0, 2, 4, 4, 0, 3, 3, 0, 0, 0, 0, // 2 - 0x00 -> 0x2F
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3 - 0x00 -> 0x3F
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4 - 0x00 -> 0x4F
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 5 - 0x50 -> 0x5F
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6 - 0x60 -> 0x6F
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // 7 - 0x70 -> 0x7F
// 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - A - B - C - D - E - F
};
// sendCMD deklarieren
void sendCMD(byte address, byte CMD, ... );
// Krams vorbereiten (fest)
unsigned char RainbowCMD[20];
unsigned char State = 0;
unsigned long timeout;
byte remoteAddr = 0x10;
void setupRainbow() {
Serial.print("init Rainbow");
RainbowCMD[0] = 'r'; // Keine Ahnung
sendCMD(0x10, CMD_SET_PAPER, 0, 0, 0); // Inhalte löschen
sendCMD(0x10, CMD_SET_INK, 0xF, 0xF, 0xF);
sendCMD(0x10, CMD_CLEAR_PAPER);
sendCMD(0x10, CMD_SWAP_BUF);
sendCMD(0x10, CMD_CLEAR_PAPER);
Serial.println(" <- OK");
}
// ############################### setRainbow ##############################
void setRainbow(){
sendCMD(0x10, CMD_COPY_FRONT_BUF);
sendCMD(0x10, CMD_SET_INK, valueRed[Pos], valueGreen[Pos], valueBlue[Pos]);
sendCMD(0x10, CMD_DRAW_PIXEL,toByte(xPos-1),toByte(yPos-1));
sendCMD(0x10, CMD_SWAP_BUF);
}
// ############################ Funktionen ###################################
unsigned char toByte(int i) {
return map(i, -128, 127, 0, 255);
}
void sendCMD(byte address, byte CMD, ... ) {
int i;
unsigned char v;
byte t;
va_list args; // Create a variable argument list
va_start(args, CMD); // Initialize the list using the pointer of the variable next to CMD;
RainbowCMD[1] = CMD; // Stores the command name
t = pgm_read_byte(&(CMD_totalArgs[CMD]))+2; // Retrieve the number of arguments for the command
for (i=2; i < t; i++) {
v = va_arg(args, int); // Retrieve the argument from the va_list
RainbowCMD[i] = v; // Store the argument
}
sendWireCommand(address, t);
}
void sendWireCommand(int Add, byte len) {
unsigned char OK=0;
unsigned char i,temp;
while(!OK)
{
switch (State)
{
case 0:
Wire.beginTransmission(Add);
for (i=0; i<len ;i++) Wire.send(RainbowCMD[i]);
Wire.endTransmission();
delay(5);
State=1;
break;
case 1:
Wire.requestFrom(Add,1);
if (Wire.available()>0)
temp=Wire.receive();
else {
temp=0xFF;
timeout++;
}
if ((temp==1)||(temp==2)) State=2;
else if (temp==0) State=0;
if (timeout>10) { // war 5000
Serial.print("Rainbow-TimeOut");
timeout=0;
State=2;
}
delay(5);
break;
case 2:
OK=1;
State=0;
timeout=0;
break;
default:
State=0;
break;
}
}
}
Der code ist sicher ausbaufähig aber vielleicht hilft es ja schon jemanden.
Edit:
Negativ bei meinem Aufbau:
Die Encoder senden solange man dreht auch Signale raus, auch wenn die Farbe z.B. voll an ist.
Es wird zwar dann nichts ausgewertet aber solange kann nichts neues gemacht werden.
Verhindern könnte man das nur durch Schieberegler oder Drehregler mit absoluter Position.
Dann müsste man allerdings die Regler bei einer neuen Position erst setzen.
Vielleicht probiere ich das mal aus.
Rainbow_Control.touchosc (514 Bytes)