Noise from relay shield/board

Hi Forum and happy easter :slight_smile: .

i have a project where I am controlling a 36V actuator that opens and closes a window in my greenhouse.
The problem is that the UNO is restarting randomly when the relay changes state wit load on.
in the beginning i thought it was the program that was something wrong with so i ended up stripping it down to basis still had the same problem.

i have tried splitting up the supplies so the UNO only puls the LED on the relay board not the coils.
I have tried extending the wires to get bigger distance between the UNO and the relay Board.

the only solution i have found is to disconnect the 36V power supply for tha actuator, when i do that it runs smooth with no hickups,

here is a list of hardware i am using.

the ''UNO''
http://www.ebay.com/itm/311155383820?_trksid=p2057872.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT

the relay shield/board

the power supply for the coils on the ralay shield.

the temperature sensor DS18B20
http://www.ebay.com/itm/140759967888?_trksid=p2057872.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT

the Actuator
http://www.ebay.de/itm/171219329078?_trksid=p2057872.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT

and the program

#include <OneWire.h>

// OneWire DS18S20, DS18B20, DS1822 Temperature Example
//
// http://www.pjrc.com/teensy/td_libs_OneWire.html
//
// The DallasTemperature library can do all this work for you!
// http://milesburton.com/Dallas_Temperature_Control_Library

OneWire  ds(02);  // on pin 02 (a 4.7K resistor is necessary)

const int WinEaClPin =  03;      // the number of the LED1 pin
const int WinWeClPin =  04;      // the number of the LED2 pin
const int WinEaOpPin =  05;      // the number of the LED3 pin
const int WinWeOpPin =  06;      // the number of the LED4 pin

// variables will change:
int WinEaClState = HIGH;             // State for window east closing on
int WinWeClState = HIGH;             // State for window west closing on
int WinEaOpState = HIGH;             // State for window east opening on
int WinWeOpState = HIGH;             // State for window West opening on

void setup(void) {
  Serial.begin(9600);

  pinMode(WinEaClPin, OUTPUT);
  // initialize the LED pin as an output:
  pinMode(WinWeClPin, OUTPUT);
  // initialize the LED pin as an output:
  pinMode(WinEaOpPin, OUTPUT);
  // initialize the LED pin as an output:
  pinMode(WinWeOpPin, OUTPUT);

  digitalWrite(WinEaClPin, WinEaClState);
  digitalWrite(WinWeClPin, WinWeClState);
  digitalWrite(WinEaOpPin, WinEaOpState);
  digitalWrite(WinWeOpPin, WinWeOpState);
 
}

void loop(void) {

 
 
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;
  
  if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(50);
    return;
  }
  
  Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
  Serial.println();
 
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      Serial.println("  Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
      Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
      Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
    default:
      Serial.println("Device is not a DS18x20 family device.");
      return;
  } 

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end
  
  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
  
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad

  Serial.print("  Data = ");
  Serial.print(present, HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  Serial.print(" CRC=");
  Serial.print(OneWire::crc8(data, 8), HEX);
  Serial.println();

  // Convert the data to actual temperature
  // because the result is a 16 bit signed integer, it should
  // be stored to an "int16_t" type, which is always 16 bits
  // even when compiled on a 32 bit processor.
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.0;
  fahrenheit = celsius * 1.8 + 32.0;
  Serial.print("  Temperature = ");
  Serial.print(celsius);
  Serial.print(" Celsius, ");
  Serial.print(fahrenheit);
  Serial.println(" Fahrenheit");



  // Window close temp, inhibit if hum is high:
 if (celsius < 20) {
    // window close on:
    WinEaClState = LOW;
    digitalWrite(WinEaClPin, WinEaClState);
    WinWeClState = LOW;
    digitalWrite(WinWeClPin, WinWeClState);
      Serial.print("WinEaClState = " );
      Serial.println(WinEaClState);
      Serial.print("WinWeClState = " );
      Serial.println(WinWeClState);
    delay(3000);
     // window close off:
    WinEaClState = HIGH;
    digitalWrite(WinEaClPin, WinEaClState);
    WinWeClState = HIGH;
    digitalWrite(WinWeClPin, WinWeClState);
      Serial.print("WinEaClState = " );
      Serial.println(WinEaClState);
      Serial.print("WinWeClState = " );
      Serial.println(WinWeClState);
    delay(60000);
 }

  // Win open for high temp:
 if (celsius > 22) {
    //window open on:
    WinEaOpState = LOW;
    digitalWrite(WinEaOpPin, WinEaOpState);
    WinWeOpState = LOW;
    digitalWrite(WinWeOpPin, WinWeOpState);
      Serial.print("WinEaOpState = " );
      Serial.println(WinEaOpState);
      Serial.print("WinWeOpState = " );
      Serial.println(WinWeOpState);
    delay(3000);
     //window open off:
    WinEaOpState = HIGH;
    digitalWrite(WinEaOpPin, WinEaOpState);
    WinWeOpState = HIGH;
    digitalWrite(WinWeOpPin, WinWeOpState);
      Serial.print("WinEaOpState = " );
      Serial.println(WinEaOpState);
      Serial.print("WinWeOpState = " );
      Serial.println(WinWeOpState);
    delay(60000);
 }
 WinEaClState = digitalRead(WinEaClPin);
 WinWeClState = digitalRead(WinWeClPin);
 WinEaOpState = digitalRead(WinEaOpPin);
 WinWeOpState = digitalRead(WinWeOpPin);


  
      Serial.print("WinEaClState = " );
      Serial.println(WinEaClState);
      Serial.print("WinWeClState = " );
      Serial.println(WinWeClState);
      Serial.print("WinEaOpState = " );
      Serial.println(WinEaOpState);
      Serial.print("WinWeOpState = " );
      Serial.println(WinWeOpState);
}

i hope somebody can help me with this issue.

For complete isolation of your relay board, it needs to use a separate supply and there cannot be a ground connection to the Arduino. You'll also need to remove the jumper. [SOLVED] 5v 8 channel relay board - external power source problem. - #7 by dlloyd - General Electronics - Arduino Forum

Try adding a ferrite core (wind 4-10 turns through it) with the load wire to the actuator. That is, the wire from the NO contact of the relay to the actuator.

Hi dlloyd.

I already have the isolation by using a seperate power supply to the relay module.

I will try to find a ferrit core i can use, is it both plus and minus that needs to go through the ferritcore?

Søren

Hi lillelund,

Make sure there's no GND connection from the relay board to the Arduino.

The ferrite core would go only on the wire from the relay contact to the 36V actuator. This is the switched power wire to the actuator (or switched ground wire if that's how you have it connected). Anyways, this one wire (switched power) to the actuator gets wrapped through the ferrite core (try at least 5 turns) then it connects to the actuator as before.

Now when you control the relay, the interference will be reduced and hopefully the problem goes away.

Hi,

Can you please post a copy of your circuit, in CAD or a picture of a hand drawn circuit in jpg, png?

Can you please post a picture of your project?

Thanks.. Tom.. :slight_smile:

Also try putting a really big capacitor across the Vin pin and ground of the arduino board. Like a 1000 uF capacitor.

You probably just need a free-wheel diode or diodes - you are driving a motor which is a highly inductive load
so you need to handle that.

But firstly how is everything wired? Need to full diagram including the internals of the actuartor and its
limit switches ideally... That eBay listing lacked any technical information of use, we probably need
to see the instruction booklet that came with it.

Hi again.

Sorry for the long response time.

I don't have a drawing of the project, i have a few pictures and a brief description.

First i wan't to say that when i have been testing/troubleshooting the project the Buck module haven't been used to supply the UNO, instead the UNO has been supplied by usb cable from laptop.

The ds18b20 is having Gnd and 5V and the signal connected to pin 2 with a 4.7K resistor.

The relay module is connected to the UNO by 5V to vc and pin 3, 4, 5, and 6 to led 1 led 2 .. No GND between UNO and relay module.

The relay module is powered from a seperate 5V power supply by GND and VCC, jumper on relay module from VC to VCC has been removed.

The actuator is connected so that the relay module is switching the polarity to make the DC actuator change direction.

The endstops in the actuator is wired with 2 diodes.

I'm sitting here with my IPAD and can't attach pictures. Grrrrrr

Best regards: Søren

Hi,

Can you please post a copy of your circuit, in CAD or a picture of a hand drawn circuit in jpg, png?

Sorry but the time taken to draw a diagram can save you hours to days of problems.
Also a picture of your project will help use.
The links to parts were very helpful but we now need to see how it is all connected.

Thanks.. Tom.... :slight_smile:
Please do not use Fritzy, hand drawn picture will be fine.

Hi Tom.

I found a bit of time, I want to say again that the buck module haven't been used when I have been testing.

please see hand drawing, pictures of project and end stop setup on actuator.

Best Regards Søren

0549_001.pdf (110 KB)

0550_001.pdf (108 KB)

0551_001.pdf (110 KB)

Relay board connections:
EDIT: The GND connection is OK (it goes only to the separate power supply).

Fly-back diode protection (RL207):

So your actuator is two wire and stops automatically at the endstop?

Then you need only two relays to control it, if they are SPDT. Each relay has common terminal
to one of the motor wires, and others to the supply rails, making an H-bridge - diodes across
each switch.

@ dlloyd, if i will remove the supply from my external power supply to the relay board then i have no power for the coil in the relays only for the diodes and optocouplers.

@ MarkT, verry good point, i hadn't thought of turning the relay "around", i am a little in doubt about how the diodes should be mounted "across each switch". Also i would like to ask wether i should have plus or minus on both wires when the actuator is not activated? Does it matter?

Thanks for a great forum.

Hi,
So everyone can see.



Tom... :slight_smile:

@ dlloyd, if i will remove the supply from my external power supply to the relay board then i have no power for the coil in the relays only for the diodes and optocouplers.

Oops...the GND wire doesn't follow through to the Arduino, so the relay board is connected OK. (thanks TomGeorge for reposting the pictures).