Transistor based motor control circuit.
Fig. 1

Arduino Solid State Relay Motor Control

by Lewis Loflin

Here we will look into using solid state DC relays as replacements for transistor driver circuits. The advantages are simple construction and time savings. High voltage and high current is easier to obtain than building from scratch. Prices are low often less expensive than the parts used to build them yourself.

Fig. 1 illustrates transistor drivers for two motors with power enable.

How to connect DC motors to solid state relays.
Fig. 2

Fig. 2 illustrates the electrical connections for motors and solid state relays. The SSR can be used in the positive or negative side of the power supply.

In input connects to any microcontroller without additional components.

Typical solid state DC relays.
Fig. 3

Fig. 3 illustrates example SSRs packages.

Arduino uses solid state relay power control for H-bridge.
Fig. 4

In fig. 4 a solid state relay is used as a power enable switch for a generic H-bridge circuit. Below is the program used to operate fig. 4.

Pressing S1 and S2 together enables power. Press both again and power is off.


#define SW1 2
#define SW2 3
#define LED1 9
#define LED2 10
#define LED3 11
#define pot 0


// HIGH = 1 and LOW = 0

#define ON 1
#define OFF 0

byte temp;

void setup() {
  // put your setup code here, to run once:
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(SW1, INPUT);
  digitalWrite(SW1, HIGH); // pull up on
  pinMode(SW2, INPUT);
  digitalWrite(SW2, HIGH); // pull up on


}

void loop() {
  // put your main code here, to run repeatedly:
  delayMicroseconds(50000); // delay 50mS

  if ( S1() && !S2() ) {
    delay(200);
    if (S2()) { } // do nothing
    else digitalWrite(LED1, 1);
  }
  else digitalWrite(LED1, 0);

  if ( S2() && !S1() ) {
    delay(200);
    if ( S1() ) { } // do nothing
    else digitalWrite(LED2, 1);
  }
  else digitalWrite(LED2, 0);
  
  // power enable
  if ( S1() && S2() ) {
    byte temp = !digitalRead(LED3);
    digitalWrite(LED3, temp);
    while( S1() || S2() ) {}
  } // end if


}

// returns 1 if switched pressed
byte  S1(void)   {
  if (digitalRead(SW1) != 1)   return 1;
  // or use (digitalRead(SW1) == 0)
  // 1 is a HIGH
  else return 0;
}

// returns 1 if switched pressed
byte  S2(void)   {
  if (digitalRead(SW2) != 1)   return 1;
  else return 0;
}