DFF4.1

From KONNEKTING Wiki
Revision as of 19:18, 26 September 2019 by Konnekting (talk | contribs)
Jump to navigation Jump to search
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:

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 (\n = LF/LineFeed/NewLine):

[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*");
}


Links