Hallo,
Ich habe vor einiger Zeit einen DMX RGB Strahler der Marke MCCrypt
gekauft und wollte ihn in meiner Wohnung verwenden. Man kann daran
leider allerdings nur 6 verschiedene Festfarben einstellen, die alle
mehr oder weniger ungeeignet sind geschweige denn einen weichen
Frárbwechsel. Allerdings hat er einen DMX Eingang und deshalb habe ich
mir gedacht, dass ich einen ATTiny45 verwenden könnte um die Farbe zu
regeln.
Um dies zu erreichen habe ich den DMX + Anschluss des Strahlers mit Pin
0 des Tinys verbunden und an die Analogen Pins Potentiometer
angeschlossen, die die ersten 3 Byte des DMX Signals steuern. Ich habe
diesen Code bei 8MHz auf den Tiny geladen unter Verwendung der Arduino
IDE:
1 | #include "pins_arduino.h";
|
2 | #define sig 0 // DMX signal output pin
|
3 |
|
4 | void setup () {
|
5 | pinMode(sig, OUTPUT);
|
6 | digitalWrite(sig, HIGH);
|
7 | pinMode(A1, INPUT);
|
8 | pinMode(A2, INPUT);
|
9 | pinMode(A3, INPUT);
|
10 | }
|
11 |
|
12 | void loop(){
|
13 | //delay(10);
|
14 | digitalWrite(sig, LOW);
|
15 | delay(10);
|
16 | shiftDmxOut(sig, 0);
|
17 | shiftDmxOut(sig, analogRead(A1)/8);
|
18 | shiftDmxOut(sig, analogRead(A2)/8);
|
19 | shiftDmxOut(sig, analogRead(A3)/8);
|
20 | //for (int count = 1; count <= 512; count++){
|
21 | // shiftDmxOut(sig, 0);
|
22 | //}
|
23 | }
|
24 |
|
25 | void shiftDmxOut(int pin, int theByte){
|
26 | int port_to_output[] = { NOT_A_PORT, NOT_A_PORT, _SFR_IO_ADDR(PORTB)};
|
27 | int portNumber = port_to_output[digitalPinToPort(pin)];
|
28 | int pinMask = digitalPinToBitMask(pin);
|
29 | _SFR_BYTE(_SFR_IO8(portNumber)) |= pinMask;
|
30 | //delayMicroseconds(10);
|
31 | cli();
|
32 | _SFR_BYTE(_SFR_IO8(portNumber)) &= ~pinMask;
|
33 | fourUSdelay();
|
34 | for (int i = 0; i < 8; i++){
|
35 | if (theByte & 01){
|
36 | _SFR_BYTE(_SFR_IO8(portNumber)) |= pinMask;
|
37 | }
|
38 | else {
|
39 | _SFR_BYTE(_SFR_IO8(portNumber)) &= ~pinMask;
|
40 | }
|
41 | fourUSdelay();
|
42 | theByte >>= 1;
|
43 | }
|
44 | _SFR_BYTE(_SFR_IO8(portNumber)) |= pinMask;
|
45 | sei();
|
46 | }
|
47 |
|
48 | void fourUSdelay(void) {
|
49 | asm("nop\n nop\n nop\n nop\n nop\n nop\n nop\n nop\n");
|
50 | asm("nop\n nop\n nop\n nop\n nop\n nop\n nop\n nop\n");
|
51 | }
|
Allerdings verhält sich das licht sehr "komisch"...
Ist nur ein Poti aufgedreht so wird immer die Farbe Blau dargestellt und
zwischendurch beginnt das licht manchmal zu blinken / flackern,
allerdings nur bei bestimmten Einstellungen.
Vielleicht habe ich etwas übersehen.
Vielen Dank für eure Hilfe,
Moritz Bust