Introduction: Controlling a Relay Board From Octoprint on a Raspberry Pi

So you have a raspberry pi with Octoprint and even have a camera setup. Last thing you need is a way to power on and off your 3d printer and maybe control a light. This instructable is for you!

This is inspired and simplified from : https://github.com/foosel/OctoPrint/wiki/Controlling-a-relay-board-from-your-RPi

Make sure to check my previous instructable where I built an enclosure box / fume hood for my 3d printer, as this is the sequel.

Tested with :

Linux octopi 4.14.79-v7+ #1159 SMP Sun Nov 4 17:50:20 GMT 2018 armv7l GNU/Linux
OctoPrint version : 1.3.11
OctoPi version : 0.16.0

Disclaimer : I don't take any responsibility for whatever bad could happen by you following these instructions.

Supplies

  • 5V relay board with optocoupler (ebay)
  • Some jumper wires
  • An electric box with outlets (optional)

Step 1: Connecting the Relay Board to Your Raspberry Pi

Although relay boards are made for 5V logic, they will trigger correctly at 3.3V. Knowing this, I was able to avoid any modification to the original board.

Relay shield		Raspberry
------------		---------
Coils:
JD-VCC		-	5V
VCC		-	Not connected
GND		-	GND
	
Logic:
GND		-	Not connected
IN1		-	GPIO #23
IN2		-	GPIO #18	
VCC 		-	3.3V

It is important to remove the jumper between JD-VCC and VCC if you have one. This will allow feeding 5V for the coils while feeding 3.3V for the logic inputs. And since both GND are wired together internally, we only connect one of them.

Step 2: SSH to Your Raspberry Pi and Configure It

Using putty or your favorite ssh client, connect to your raspberry pi using the same ip address that you use to access Octoprint. The default username is pi and password is raspberry.

First thing I would do is verify that the relays respond correctly. In order to do this, issue these commands

gpio -g mode 18 out
gpio -g mode 23 out
gpio -g write 18 0
gpio -g write 23 0
gpio -g write 18 1
gpio -g write 23 1

The first 2 lines allow to set the GPIO as an output. Then you toggle the outputs on and off. That should make the relay click. When the inputs are low (0), the relay should switch on and when the inputs are high (1) they should switch off. So yeah, this is a bit counterintuitive, but that's how it is!

Step 3: Add New Menu Options to Octoprint to Control Your Relays

You will need to edit the file config.yaml :

sudo nano .octoprint/config.yaml

Inside that file, locate the section "system" and add the following :

system:
  actions:
  - action: printer on
    command: gpio -g write 18 0
    name: Turn on the printer
  - action: printer off
    command: gpio -g write 18 1
    confirm: You are about to turn off the printer.
    name: Turn off the printer
  - action: lon
    command: gpio -g write 23 0
    name: LightOn
  - action: loff
    command: gpio -g write 23 1
    name: LightOff

After saving the file (ctrl+x), reboot the raspberry pi :

sudo reboot

You should now be able to control the relays from the Octoprint web interface!

Step 4: High Voltage Wiring (be Careful)

A relay act as a switch, only it is triggered by a controller, in this case a raspberry pi. The switch consists of an electromagnet that will connect pins together, that is the click you hear.

For wiring it you have two choices. Either you cut one of the wires of your 3d printer power supply and you connect the ends to the relay, or you make a power outlet for that. I prefer the second way, as this will allow moving the printer more easily. I will also use the second outlet to connect my exhaust fan (see my other instructable : Easy and Cheap 3D Printer Fume Hood).

Now the other relay is to control a light. It is the same principle, but in this case I recommend that you just cut one of the wires from the power cable and connect the ends to the relay, most likely it won't need to be moved.


Step 5: Configure GPIO Outputs and Prevent Your Relays From Turning on When the Raspberry Pi Reboots

To summarize the issue, GPIO are set low when raspbian reboots (at least for certain kernel versions). Apparently, there is not much we can do... oh well! So the idea is to call a script that will revert that once it finishes booting by setting the outputs high.

See this forum thread for more info :
https://www.raspberrypi.org/forums/viewtopic.php?t=35321

But most importantly, this script sets the GPIOs as outputs, otherwise the menu items won't work in Octoprint.


Create a script using nano :

nano /home/pi/setupgpio.sh

Paste in this code and save the file.

#!/bin/sh
echo 18 > /sys/class/gpio/export
echo 23 > /sys/class/gpio/export
udevadm settle
echo high > /sys/class/gpio/gpio18/direction
echo high > /sys/class/gpio/gpio23/direction

Make the file executable :

chmod +x /home/pi/setupgpio.sh

Edit the rc.local file :

sudo nano /etc/rc.local

And call the script you just created by adding these lines :

# setup the gpio pins for gate control
/home/pi/setupgpio.sh

Reboot your raspberry and check that it is working properly.