DFF4.1: Difference between revisions
Konnekting (talk | contribs) |
Konnekting (talk | contribs) No edit summary |
||
| Line 79: | Line 79: | ||
Check here for the [[DFF4.1 Building Instructions]] | Check here for the [[DFF4.1 Building Instructions]] | ||
== Help == | |||
If relays do not work as expected, you can run this test-sketch to be able to switch relais by serial console. Commands follow this syntax: | |||
[a-h0-1]\n | |||
f.i. "a0" disables relay A, "f1" enables relay F | |||
On startup all relays are disabled. | |||
It is recommended to use this test without attached window/shutter, but with am multimeter/continuity-tester to be able to test relay by relay. | |||
<syntaxhighlight lang="C" line='line'> | |||
#include <Wire.h> | |||
#include <Adafruit_MCP23017.h> | |||
Adafruit_MCP23017 mcp; | |||
#define LED A5 | |||
#define EN A0 | |||
// MCP23017 Output register<->pin map | |||
#define OA0 0 | |||
#define OA1 1 | |||
#define OA2 2 | |||
#define OA3 3 | |||
#define OA4 4 | |||
#define OA5 5 | |||
#define OA6 6 | |||
#define OA7 7 | |||
#define OB0 8 | |||
#define OB1 9 | |||
#define OB2 10 | |||
#define OB3 11 | |||
#define OB4 12 | |||
#define OB5 13 | |||
#define OB6 14 | |||
#define OB7 15 | |||
#define A_SET OB1 | |||
#define A_RESET OB0 | |||
#define B_SET OB3 | |||
#define B_RESET OB2 | |||
#define C_SET OB5 | |||
#define C_RESET OB4 | |||
#define D_SET OB7 | |||
#define D_RESET OB6 | |||
#define E_SET OA0 | |||
#define E_RESET OA1 | |||
#define F_SET OA2 | |||
#define F_RESET OA3 | |||
#define G_SET OA4 | |||
#define G_RESET OA5 | |||
#define H_SET OA6 | |||
#define H_RESET OA7 | |||
void setup() { | |||
SerialUSB.begin(115200); | |||
SerialUSB.println("SetupMCP Relais Test ..."); | |||
pinMode(LED, OUTPUT); | |||
pinMode(EN, OUTPUT); | |||
digitalWrite(LED, HIGH); | |||
digitalWrite(EN, HIGH); | |||
mcp.begin(1); | |||
for (int i = 0; i < 16; i++) { | |||
mcp.pinMode(i, OUTPUT); | |||
} | |||
pulseMCP(A_RESET); | |||
pulseMCP(B_RESET); | |||
pulseMCP(C_RESET); | |||
pulseMCP(D_RESET); | |||
pulseMCP(E_RESET); | |||
pulseMCP(F_RESET); | |||
pulseMCP(G_RESET); | |||
pulseMCP(H_RESET); | |||
SerialUSB.println("... done"); | |||
// initial delay | |||
delay(1000); | |||
SerialUSB.println("Initial delay done."); | |||
SerialUSB.println("Waiting for command...[a-h0-1]"); | |||
} | |||
//84 | |||
#define WAIT_TIME 84 | |||
//16 | |||
#define SET_TIME 16 | |||
String cmd; | |||
void loop() { | |||
cmd = SerialUSB.readStringUntil('\n'); | |||
if (cmd.length() > 0) { | |||
SerialUSB.print("Command: "); | |||
SerialUSB.println(cmd); | |||
if (cmd == "a1") { | |||
pulseMCP(A_SET); | |||
} else if (cmd == "a0") { | |||
pulseMCP(A_RESET); | |||
} | |||
else if (cmd == "b1") { | |||
pulseMCP(B_SET); | |||
} else if (cmd == "b0") { | |||
pulseMCP(B_RESET); | |||
} | |||
else if (cmd == "c1") { | |||
pulseMCP(C_SET); | |||
} else if (cmd == "c0") { | |||
pulseMCP(C_RESET); | |||
} | |||
else if (cmd == "d1") { | |||
pulseMCP(D_SET); | |||
} else if (cmd == "d0") { | |||
pulseMCP(D_RESET); | |||
} | |||
else if (cmd == "e1") { | |||
pulseMCP(E_SET); | |||
} else if (cmd == "e0") { | |||
pulseMCP(E_RESET); | |||
} | |||
else if (cmd == "f1") { | |||
pulseMCP(F_SET); | |||
} else if (cmd == "f0") { | |||
pulseMCP(F_RESET); | |||
} | |||
else if (cmd == "g1") { | |||
pulseMCP(G_SET); | |||
} else if (cmd == "g0") { | |||
pulseMCP(G_RESET); | |||
} | |||
else if (cmd == "h1") { | |||
pulseMCP(H_SET); | |||
} else if (cmd == "h0") { | |||
pulseMCP(H_RESET); | |||
} | |||
SerialUSB.println("\n\nWaiting for command...[a-h0-1]"); | |||
} | |||
} | |||
void pulseMCP(int i) { | |||
SerialUSB.print("Pulse at addr #"); | |||
SerialUSB.print(i); | |||
mcp.digitalWrite(i, HIGH); | |||
delay(SET_TIME); | |||
mcp.digitalWrite(i, LOW); | |||
delay(WAIT_TIME); | |||
SerialUSB.println(" *DONE*"); | |||
} | |||
</syntaxhighlight> | |||
Revision as of 19:17, 26 September 2019
| DFF4.1 | |
|---|---|
| Developer | Alexander Christian |
| Status | Version 1.0 finished |
| Microcontroller/Board | M0dularisM+ |
| KNX connectivity | Siemens BCU, Eugen's µBCU |
Description
The purpose of this actuator is, to control Roto Rototronic skylight with shutters and/or sun blinds. It has 4 "channels". Each channel internally uses two relays: One for the open-action, and one for the close-action.
Of course you can also control your Roto Rototronic skylight with help of a standard switch-actuator. But then you don't have the possibility to "open the window 75%" or "close the shutter 80%". The firmware for DFF4.1 provides all this neat feature that you know from typical shutter/blinds actuators.
Hardware
This actuator consists of the following REG parts:
- M0dularis+
- 8x Button + 8x LED
- 8x Relay Bistable, bus powered (8 relays in total, 2 for each channel = 4 channels).
I2C address on application board:
A0: 1 A1: 0 A2: 0
I2C address on frontend board:
A0: 0 A1: 0 A2: 0
Software
User Documentation
Check here for the DFF4.1 User Manual
Developer Documentation
Firmware sourcecode is on github: https://github.com/KONNEKTING/DFF4.1 Follow this guide for updating the firmare from source-code: KONNEKTING USB Firmware Update
Get a DIY kit
You are interested in this actuator? Great! This device is available as a DIY kit.
The kit includes all required parts with pre-soldered SMD parts and pre-flashed controller board.
You only need:
- soldering iron and solder
- a screw driver
- a sharp knife with a fine tip
- a working KNX installation where you can connect the device to
- ~2-3hrs to build it according to the build instructions linked on this page
- a computer: Windows, Linux or MAC that is able to run KONNEKTING Suite plus a KNX IP Interface or an KNX IP Router.
- for updating the firmware: A Mini USB cable (Not Micro-USB like on your smartphone. Mini USB is a big thicker as Micro USB)
Please write a mail to info@konnekting.de and refer to this page.
Build It
This actuator uses three PCBs, a bunch of SMD components as well as a lot of mechanical parts. As most users are not able to solder SMD, the PCBs are pre-soldered with all SMD components. Due to the big amount of parts, this actuator comes as a DIY kit: You have to solder non-SMD parts yourself and build up the device and finally flash the firmware with help of a USB connection.
Check here for the DFF4.1 Building Instructions
Help
If relays do not work as expected, you can run this test-sketch to be able to switch relais by serial console. Commands follow this syntax:
[a-h0-1]\n
f.i. "a0" disables relay A, "f1" enables relay F On startup all relays are disabled. It is recommended to use this test without attached window/shutter, but with am multimeter/continuity-tester to be able to test relay by relay.
#include <Wire.h>
#include <Adafruit_MCP23017.h>
Adafruit_MCP23017 mcp;
#define LED A5
#define EN A0
// MCP23017 Output register<->pin map
#define OA0 0
#define OA1 1
#define OA2 2
#define OA3 3
#define OA4 4
#define OA5 5
#define OA6 6
#define OA7 7
#define OB0 8
#define OB1 9
#define OB2 10
#define OB3 11
#define OB4 12
#define OB5 13
#define OB6 14
#define OB7 15
#define A_SET OB1
#define A_RESET OB0
#define B_SET OB3
#define B_RESET OB2
#define C_SET OB5
#define C_RESET OB4
#define D_SET OB7
#define D_RESET OB6
#define E_SET OA0
#define E_RESET OA1
#define F_SET OA2
#define F_RESET OA3
#define G_SET OA4
#define G_RESET OA5
#define H_SET OA6
#define H_RESET OA7
void setup() {
SerialUSB.begin(115200);
SerialUSB.println("SetupMCP Relais Test ...");
pinMode(LED, OUTPUT);
pinMode(EN, OUTPUT);
digitalWrite(LED, HIGH);
digitalWrite(EN, HIGH);
mcp.begin(1);
for (int i = 0; i < 16; i++) {
mcp.pinMode(i, OUTPUT);
}
pulseMCP(A_RESET);
pulseMCP(B_RESET);
pulseMCP(C_RESET);
pulseMCP(D_RESET);
pulseMCP(E_RESET);
pulseMCP(F_RESET);
pulseMCP(G_RESET);
pulseMCP(H_RESET);
SerialUSB.println("... done");
// initial delay
delay(1000);
SerialUSB.println("Initial delay done.");
SerialUSB.println("Waiting for command...[a-h0-1]");
}
//84
#define WAIT_TIME 84
//16
#define SET_TIME 16
String cmd;
void loop() {
cmd = SerialUSB.readStringUntil('\n');
if (cmd.length() > 0) {
SerialUSB.print("Command: ");
SerialUSB.println(cmd);
if (cmd == "a1") {
pulseMCP(A_SET);
} else if (cmd == "a0") {
pulseMCP(A_RESET);
}
else if (cmd == "b1") {
pulseMCP(B_SET);
} else if (cmd == "b0") {
pulseMCP(B_RESET);
}
else if (cmd == "c1") {
pulseMCP(C_SET);
} else if (cmd == "c0") {
pulseMCP(C_RESET);
}
else if (cmd == "d1") {
pulseMCP(D_SET);
} else if (cmd == "d0") {
pulseMCP(D_RESET);
}
else if (cmd == "e1") {
pulseMCP(E_SET);
} else if (cmd == "e0") {
pulseMCP(E_RESET);
}
else if (cmd == "f1") {
pulseMCP(F_SET);
} else if (cmd == "f0") {
pulseMCP(F_RESET);
}
else if (cmd == "g1") {
pulseMCP(G_SET);
} else if (cmd == "g0") {
pulseMCP(G_RESET);
}
else if (cmd == "h1") {
pulseMCP(H_SET);
} else if (cmd == "h0") {
pulseMCP(H_RESET);
}
SerialUSB.println("\n\nWaiting for command...[a-h0-1]");
}
}
void pulseMCP(int i) {
SerialUSB.print("Pulse at addr #");
SerialUSB.print(i);
mcp.digitalWrite(i, HIGH);
delay(SET_TIME);
mcp.digitalWrite(i, LOW);
delay(WAIT_TIME);
SerialUSB.println(" *DONE*");
}
