3D Printserver

Om m’n Laser graveerder en 3D Laser printer via het netwerk te kunnen bedienen heb ik een Raspberry Zero ingericht als WiFi printserver en hierop Octoprint geinstalleerd.

Onderdelen:

OnderdeelAantalPrijsWebshop
Raspberry Pi Zero 2W1€ 24,20Raspberry Store
USB Mini HUB OTG 1€ 5,95KIWI Electronics
Sandisk High endurance 32Gb Micro- SD-card1€ 10,90Dataio.nl
M2,5 8mm boutjes en moertjes4€ 0,40Plat
Optioneel: Webcam1Rommelbak
Optioneel: Officiele Raspberry PI voeding1

Benodigdheden

  • Laptop/Desktop met (Micro)SD kaartlezer
  • Verloopkabel of -adapter HDMI naar HDMI-stekker D micro
  • USB-C male naar USB-A female adapter (of de USB Mini HUB OTG van hierboven)
  • Toetsenbord met USB-A aansluiting
  • Muis met USB-A aansluiting
  • Monitor met HDMI-aansluiting
  • 3D printer + PLA

Stap 1. Raspbian op de Micro SD kaart installeren en configureren

Download de Raspberry Pi Imager van https://downloads.raspberrypi.org/imager/imager_latest.exe, en open de exe. De installatie wizard van de Imager tool start. Klik op “Installeren”, en daarna op “Voltooien”

De Imager tool start en je krijgt een melding met de vraag of de Raspberry Pi imager wijzigingen op je apparaat mag aanbrengen, bevestig dit met “Ja

Daarna verschijnt de user-interface van de imager tool

Plaats de lege SD-Card in je kaartlezer. Kies bij “Besturingssysteem” voor “Raspberry PI OS (32-BIT)” en bij “Opslagapparaat” de SD-Card die je net geplaatst hebt. Klik daarna op “Schrijf”, en Raspbian wordt op je SD-Card geïnstalleerd.

Haal nadat de Imager tool klaar is, sluit de Imager tool en haal de SD-kaart uit je Laptop/Desktop en schuif hem in de Raspberry Zero 2W

Booting Raspberry Pi 3 B With a USB Drive : 3 Steps - Instructables

Sluit Toetsenbord, Muis en Monitor aan. (De Raspberry Zero ondersteund ook Bluetooth, dus je kunt ook een Bluetooth toetsenbord en muis gebruiken. Maar om die in te kunnen stellen zul je toch eerst met een USB-A variant aan de slag moeten). Sluit de Raspberry Zero met een voeding van minimaal 5.2v en 2.5A (gebruik hier bij voorkeur een officiele Raspberry Pi voeding) aan op het lichtnet. Raspbian start nu op in Desktop mode. Log in met username “pi” en wachtwoord “raspberry”.

raspbian desktop

Automatisch start de “Welkom bij Raspberry Pi” installatie wizard op

pi wizard

Klik op “Next”, en stel je Land, Taal en TimeZone in

Verander nu het wachtwoord van de user “pi”

pi wizard password

Selecteer het WiFi netwerk en vul het WiFi password in

Laat de Raspberry Zero de updates van Raspbian downloaden en installeren

pi wizard updating

En klik tenslotte op “Restart” om de setup af te ronden

pi wizard complete

Enable eventueel SSH volgens de tutorials op https://phoenixnap.com/kb/enable-ssh-raspberry-pi#ftoc-heading-1

Maak met een terminal programma, bijv. Putty, connectie met de Raspberry Zero 2W. Achterhaal hiervoor het ip-address van je Raspberry Zero 2W van je router of dhcp-server, of open op de desktop van de Raspberry Zero een terminalvenster en gebruik het commando ipconfig om het ip-address te achterhalen.

In mijn geval heb ik er voor gekozen om SSH te activeren op de Raspberry Zero 2W volgens de beschrijving op https://phoenixnap.com/kb/enable-ssh-raspberry-pi#ftoc-heading-3

En maak verbinding met de Raspberry Zero m.b.v. de volgende putty settings, de eerste keer dat je via SSH connectie maakt moet je bevestigen dat de fingerprint van de Raspberry Zero toegevoegd wordt aan het register, bevestig dit met “Ja”

Log in met user pi en het wachtwoord wat je eerder ingegeven hebt. We gaan nu nog een paar zaken configureren, zoals de hostnaam en (optioneel) syslog, voer hiervoor de volgende commando’s uit

$ sudo vi /etc/hostname

Verander de hostname “raspberrypi” naar een naam van je keuze, in mijn geval “printserver”, en sla de file op. Verander tevens in /etc/hosts de hostname achter 127.0.0.1 (zogenaamde localhost)ca

$ sudo vi /etc/hosts

Die ziet er dan als volgt uit

pi@raspberrypi:~ $ cat /etc/hosts
127.0.0.1       localhost
::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters

127.0.1.1               printserver

Voeg tot slot de hostname toe aan de dhcp-client configuratie file /etc/dhcpcd.conf, dit onder “# define static profile”

$ sudo vi /etc/dhcpcd.conf

Die ziet er dan als volgt uit

$ cat /etc/dhcpcd.conf
# A sample configuration for dhcpcd.
# See dhcpcd.conf(5) for details.

# Allow users of this group to interact with dhcpcd via the control socket.
#controlgroup wheel

# Inform the DHCP server of our hostname for DDNS.
hostname

# Use the hardware address of the interface for the Client ID.
clientid
# or
# Use the same DUID + IAID as set in DHCPv6 for DHCPv4 ClientID as per RFC4361.
# Some non-RFC compliant DHCP servers do not reply with this set.
# In this case, comment out duid and enable clientid above.
#duid

# Persist interface configuration when dhcpcd exits.
persistent

# Rapid commit support.
# Safe to enable by default because it requires the equivalent option set
# on the server to actually work.
option rapid_commit

# A list of options to request from the DHCP server.
option domain_name_servers, domain_name, domain_search, host_name
option classless_static_routes
# Respect the network MTU. This is applied to DHCP routes.
option interface_mtu

# Most distributions have NTP support.
#option ntp_servers

# A ServerID is required by RFC2131.
require dhcp_server_identifier

# Generate SLAAC address using the Hardware Address of the interface
#slaac hwaddr
# OR generate Stable Private IPv6 Addresses based from the DUID
slaac private

# Example static IP configuration:
#interface eth0
#static ip_address=192.168.0.10/24
#static ip6_address=fd51:42f8:caae:d92e::ff/64
#static routers=192.168.0.1
#static domain_name_servers=192.168.0.1 8.8.8.8 fd51:42f8:caae:d92e::1

# It is possible to fall back to a static IP if DHCP fails:
# define static profile
#profile static_eth0
#static ip_address=192.168.1.23/24
#static routers=192.168.1.1
#static domain_name_servers=192.168.1.1
hostname=printserver.sydspost.nl

# fallback to static profile on eth0
#interface eth0
#fallback static_eth0

reboot de Raspberry Zero met

sudo reboot

Maak opnieuw verbinding met de Raspberry Zero in putty door voor de optie “Restart Session” te kiezen, en log opnieuw in als user pi. Als alles goed is gegaan zie je dat de prompt is aangepast naar: pi@printserver:~ $.

Optioneel kun je de systeem logging van de Raspberry Zero naar een centrale syslog server laten zenden, zie ook mijn tutorial “Syslog server inrichten“. Standaard is rsyslog al geïnstalleerd binnen de Raspbian image en behoeft alleen nog geconfigureerd te worden. Volg hiervoor stap 3. van voorgenoemde tutorial, dus:


sudo vi /etc/rsyslog.conf

Voeg nu onderstaande regel toe boven in de file, net onder de eerste uitgecommentarieerde regels:

@@<ip-address syslog server>:<poortnummer>

In mijn geval dus @@192.168.2.29:514, de eerste 5 regels van de file ziet er dan zo uit:

nslu2:~# cat /etc/rsyslog.conf
# /etc/rsyslog.conf    Configuration file for rsyslog.
#
#                      For more information see
#                      /usr/share/doc/rsyslog-doc/html/rsyslog_conf.html
@@192.168.2.29:514

Herstart ook daar de rsyslog deamon met:

sudo systemctl restart rsyslog

Check de /var/log/syslog file op je Centrale syslog-server om te checken of de Printserver zijn logging doorstuurt naar de centrale Syslog server.

Stap 2. OctoPrint installeren

Start m.b.v. terminal software, bijv. Putty, een telnet of SSH sessie naar je Raspberry Zero en log in als user Pi. Controleer eerst of de python3 versie die voor geinstalleerd is op je Raspbian image hoger of gelijk is aan versie 3.6.

$ python3 --version
Python 3.6.9

Indien lager dan versie 3.6, upgrade python3 dan met sudo apt-get install python3

Installeer nu Octoprint met m.b.v. de volgende commando’s:

$ pip3 install octoprint

Geef de user Pi voldoende rechten op de USB poorten

$ sudo usermod -a -G tty pi
$ sudo usermod -a -G dialout pi

Zorg ervoor dat OctoPrint automatisch opstart bij het starten van de Raspberry Zero

$ wget https://github.com/OctoPrint/OctoPrint/raw/master/scripts/octoprint.service && sudo mv octoprint.service /etc/systemd/system/octoprint.service

Verander het path naar de OctoPrint binary in /etc/systemd/system/octoprint.service, naar /home/pi/.local/bin/octoprint

[Unit]
Description=The snappy web interface for your 3D printer
After=network-online.target
Wants=network-online.target

[Service]
Environment="LC_ALL=C.UTF-8"
Environment="LANG=C.UTF-8"
Type=exec
User=pi
ExecStart=/home/pi/.local/bin/octoprint

[Install]
WantedBy=multi-user.target

Voeg het script toe aan de autostart met

$ sudo systemctl enable octoprint.service
Created symlink /etc/systemd/system/multi-user.target.wants/octoprint.service → /etc/systemd/system/octoprint.service.

En start OctoPrint voor de eerste keer op met

$ ./.local/bin/octoprint serve

of

$ sudo service octoprint start

Achterhaal het IP address van je Raspberry Zero met

$ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp2s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
    link/ether 0c:9d:92:30:0f:41 brd ff:ff:ff:ff:ff:ff
3: wlp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 80:c5:f2:ea:b3:69 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.115/24 brd 192.168.2.255 scope global dynamic noprefixroute wlp3s0
       valid_lft 3566sec preferred_lft 3566sec
    inet6 2a02:a459:46e4:1:82c5:f2ff:feea:b369/128 scope global dynamic noprefixroute 
       valid_lft 202831sec preferred_lft 116431sec
    inet6 fe80::6a46:a0e1:cc3a:1648/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

In mijn geval dus 192.168.2.115, open nu in een browser de url: http://<ip-address>:5000, in mijn geval http://192.168.2.115:5000/

Volg de Setup Wizard door op Next te klikken. Je hebt geen backup te restoren, dus sla deze stap over door op Next te klikken. Geef daarna een Username en Password op om OctoPrint te beheren, bijv:

  • Username: Pi
  • Password: <wachtwoord>

En klik op “Create Account” en daarna op “Next”

Klik daarna onderin op het tab “Online Connectivity Check” op “Enable Connectivity Check”, en klik op “Next”.

Klik op het tab “Anonymous Usage Tracking” op “Disable Anonymous Usage Tracking” en klik op “Next”.

Klik op het tab “Plugin Blacklist” op “Enable Plugin Blacklist Processing” en klik op “Next”.

Op tab “Default Printer Profile” maak ik een profiel aan voor m’n 3D printer Creality Ender 5 Pro, dit met de volgende settings:

Form factor: Rectangular
Origin: Lower Left
Heated Bed: Yes (checked)
Heated Chamber: No (unchecked)
Width: 220mm
Depth: 220mm
Height: 300mm
Axes: Default**
Custom Bounding Box: No (unchecked)
Nozzle Diameter: 0.4mm
Number of Extruders: 1

Klik daarna op “Next”. Het tab “Server Commands” laat ik leeg, evenals het tab “Webcam & Timelapse”. Klik op “Finish”

Octoprint opent nu het startscherm, configureer hier de connection settings van de Creality Ender 5 Pro 3D printer.

Achterhaal eerst de USB poort waarop de printer is aangesloten met behulp van het volgende commando

$ dmesg

[369738.533818] usb 1-1.1: new full-speed USB device number 17 using dwc_otg
[369738.767095] usb 1-1.1: New USB device found, idVendor=1a86, idProduct=7523, bcdDevice= 2.64
[369738.767113] usb 1-1.1: New USB device strings: Mfr=0, Product=2, SerialNumber=0
[369738.767123] usb 1-1.1: Product: USB Serial
[369738.767999] ch341 1-1.1:1.0: ch341-uart converter detected
[369738.770197] usb 1-1.1: ch341-uart converter now attached to ttyUSB0

In mijn geval dus ttyUSB0. Als je meerdere apparaten aangesloten hebt op je printserver dan is het handig om udev rules in te stellen die er voor zorgen dat je een vaste usb poortnaam toekend aan je apparaat. Als je dit niet doet dan krijgen apparaten in de volgorde waarop je ze aansluit of aanzet een ttyUSB* naam toegewezen door Raspbian, en zul je die instelling in Octoprint steeds moeten aanpassen. Ga als volgt te werk om vaste USB poortnamen toe te kennen.

Sluit het eerste apparaat aan (in mijn geval de Creality Ender 5 Pro 3D printer zoals hierboven staat beschreven). De automatisch toegewezen USB-poort is dus ttyUSB0, noteer dit en tevens de cijfers achter usb, in mijn geval: 1-1.1

Creality Ender 5 ProCNC Laser engraver
ttyUSB0
1-1.1

Sluit het tweede apparaat aan, en herhaal bovenstaande stap

[369991.924043] usb 1-1.3: new full-speed USB device number 19 using dwc_otg
[369992.168057] usb 1-1.3: New USB device found, idVendor=1a86, idProduct=7523, bcdDevice= 2.54
[369992.168084] usb 1-1.3: New USB device strings: Mfr=0, Product=2, SerialNumber=0
[369992.168095] usb 1-1.3: Product: USB2.0-Ser!
[369992.169237] ch341 1-1.3:1.0: ch341-uart converter detected
[369992.171358] ch341-uart ttyUSB1: break control not supported, using simulated break
[369992.171717] usb 1-1.3: ch341-uart converter now attached to ttyUSB1

Vul ook hiervan de gegevens in in de tabel

Creality Ender 5 ProCNC Laser engraver
ttyUSB0ttyUSB1
1-1.11-1.3

We hebben nog wat meer gegevens nodig om de udev regels in te stellen. Namelijk het leverancier-ID en Product-ID van de aangesloten apparaten. Voer hiervoor het volgende commando uit

pi@printserver:~ $ udevadm info --name=/dev/ttyUSB0 --attribute-walk

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.1/1-1.1:1.0/ttyUSB0/tty/ttyUSB0':
    KERNEL=="ttyUSB0"
    SUBSYSTEM=="tty"
    DRIVER==""
    ATTR{power/control}=="auto"
    ATTR{power/runtime_active_time}=="0"
    ATTR{power/runtime_status}=="unsupported"
    ATTR{power/runtime_suspended_time}=="0"

  looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.1/1-1.1:1.0/ttyUSB0':
    KERNELS=="ttyUSB0"
    SUBSYSTEMS=="usb-serial"
    DRIVERS=="ch341-uart"
    ATTRS{port_number}=="0"
    ATTRS{power/control}=="auto"
    ATTRS{power/runtime_active_time}=="0"
    ATTRS{power/runtime_status}=="unsupported"
    ATTRS{power/runtime_suspended_time}=="0"

  looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.1/1-1.1:1.0':
    KERNELS=="1-1.1:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="ch341"
    ATTRS{authorized}=="1"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bInterfaceClass}=="ff"
    ATTRS{bInterfaceNumber}=="00"
    ATTRS{bInterfaceProtocol}=="02"
    ATTRS{bInterfaceSubClass}=="01"
    ATTRS{bNumEndpoints}=="03"
    ATTRS{supports_autosuspend}=="1"

  looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.1':
    KERNELS=="1-1.1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{authorized}=="1"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bDeviceClass}=="ff"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bMaxPacketSize0}=="8"
    ATTRS{bMaxPower}=="98mA"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bcdDevice}=="0264"
    ATTRS{bmAttributes}=="80"
    ATTRS{busnum}=="1"
    ATTRS{configuration}==""
    ATTRS{devnum}=="21"
    ATTRS{devpath}=="1.1"
    ATTRS{devspec}=="(null)"
    ATTRS{idProduct}=="7523"
    ATTRS{idVendor}=="1a86"
    ATTRS{ltm_capable}=="no"
    ATTRS{maxchild}=="0"
    ATTRS{power/active_duration}=="42410"
    ATTRS{power/autosuspend}=="2"
    ATTRS{power/autosuspend_delay_ms}=="2000"
    ATTRS{power/connected_duration}=="42410"
    ATTRS{power/control}=="on"
    ATTRS{power/level}=="on"
    ATTRS{power/persist}=="1"
    ATTRS{power/runtime_active_time}=="41981"
    ATTRS{power/runtime_status}=="active"
    ATTRS{power/runtime_suspended_time}=="0"
    ATTRS{product}=="USB Serial"
    ATTRS{quirks}=="0x0"
    ATTRS{removable}=="unknown"
    ATTRS{rx_lanes}=="1"
    ATTRS{speed}=="12"
    ATTRS{tx_lanes}=="1"
    ATTRS{urbnum}=="132"
    ATTRS{version}==" 1.10"

en doe dit ook voor ttyUSB1

pi@printserver:~ $ udevadm info --name=/dev/ttyUSB1 --attribute-walk

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.3/1-1.3:1.0/ttyUSB1/tty/ttyUSB1':
    KERNEL=="ttyUSB1"
    SUBSYSTEM=="tty"
    DRIVER==""
    ATTR{power/control}=="auto"
    ATTR{power/runtime_active_time}=="0"
    ATTR{power/runtime_status}=="unsupported"
    ATTR{power/runtime_suspended_time}=="0"

  looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.3/1-1.3:1.0/ttyUSB1':
    KERNELS=="ttyUSB1"
    SUBSYSTEMS=="usb-serial"
    DRIVERS=="ch341-uart"
    ATTRS{port_number}=="0"
    ATTRS{power/control}=="auto"
    ATTRS{power/runtime_active_time}=="0"
    ATTRS{power/runtime_status}=="unsupported"
    ATTRS{power/runtime_suspended_time}=="0"

  looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.3/1-1.3:1.0':
    KERNELS=="1-1.3:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="ch341"
    ATTRS{authorized}=="1"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bInterfaceClass}=="ff"
    ATTRS{bInterfaceNumber}=="00"
    ATTRS{bInterfaceProtocol}=="02"
    ATTRS{bInterfaceSubClass}=="01"
    ATTRS{bNumEndpoints}=="03"
    ATTRS{supports_autosuspend}=="1"

  looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.3':
    KERNELS=="1-1.3"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{authorized}=="1"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bDeviceClass}=="ff"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bMaxPacketSize0}=="8"
    ATTRS{bMaxPower}=="96mA"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bcdDevice}=="0254"
    ATTRS{bmAttributes}=="80"
    ATTRS{busnum}=="1"
    ATTRS{configuration}==""
    ATTRS{devnum}=="22"
    ATTRS{devpath}=="1.3"
    ATTRS{devspec}=="(null)"
    ATTRS{idProduct}=="7523"
    ATTRS{idVendor}=="1a86"
    ATTRS{ltm_capable}=="no"
    ATTRS{maxchild}=="0"
    ATTRS{power/active_duration}=="491960"
    ATTRS{power/autosuspend}=="2"
    ATTRS{power/autosuspend_delay_ms}=="2000"
    ATTRS{power/connected_duration}=="491960"
    ATTRS{power/control}=="on"
    ATTRS{power/level}=="on"
    ATTRS{power/persist}=="1"
    ATTRS{power/runtime_active_time}=="491532"
    ATTRS{power/runtime_status}=="active"
    ATTRS{power/runtime_suspended_time}=="0"
    ATTRS{product}=="USB2.0-Ser!"
    ATTRS{quirks}=="0x0"
    ATTRS{removable}=="unknown"
    ATTRS{rx_lanes}=="1"
    ATTRS{speed}=="12"
    ATTRS{tx_lanes}=="1"
    ATTRS{urbnum}=="16"
    ATTRS{version}==" 1.10"

Zoek in de output naar de genoteerde cijfers achter USB, en mijn geval dus 1-1.1 en respectievelijk 1-3.1. Neem de waarden van ATTRS{idProduct} en ATTRS(idVendor) over in de tabel.

Creality Ender 5 ProCNC Laser engraver
ttyUSB0ttyUSB1
1-1.11-1.3
ATTRS{idProduct}==”7523″ ATTRS{idProduct}==”7523″
ATTRS{idVendor}==”1a86″ATTRS{idVendor}==”1a86″

In mijn geval zijn allebei de apparaten voorzien van dezelfde UART chipset, namelijk ch341 chipset. Vandaar dat de Leveranciers-ID en Product-ID gelijk zijn. Voor het instellen van de regels heb je een unieke combinatie van attributen nodig. Dus ik heb de selectie attributen uitgebreid met het attribuut “product”, die was voor mijn twee apparaten afwijkend. Hiermee kom je op de volgende tabel

Creality Ender 5 ProCNC Laser engraver
ttyUSB0ttyUSB1
1-1.11-1.3
ATTRS{idProduct}==”7523″ ATTRS{idProduct}==”7523″
ATTRS{idVendor}==”1a86″ATTRS{idVendor}==”1a86″
ATTRS{product}==”USB Serial”ATTRS{product}==”USB2.0-Ser!”

Met behulp van bovenstaande tabel gaan we de regels instellen, open het bestand met regels met vi

$ sudo vi /etc/udev/rules.d/10-usb-serial.rules

En kopieer hierin onderstaande regels, en pas deze aan conform de waarden in jou tabel

SUBSYSTEM=="tty", ATTRS{idProduct}=="7523", ATTRS{idVendor}=="1a86", ATTRS{product}=="USB Serial", SYMLINK+="ttyUSB_CREALITY"
SUBSYSTEM=="tty", ATTRS{idProduct}=="7523", ATTRS{idVendor}=="1a86", ATTRS{product}=="USB2.0-Ser!", SYMLINK+="ttyUSB_CNC"

Kies voor de waarde achter SYMLINK+ een zinvolle naam voor jou apparaat. Op basis van die naam wordt namelijk een symbolic link aangemaakt in /dev, dus bijv. als een apparaat wordt aangemeld op /dev/ttyUSB0, dan wordt met behulp van bovenstaande regels een symbolic link aangemaakt /dev/ttyUSB_CREALITY -> ttyUSB0. In je software kun je vervolgens verwijzen naar deze symbolic link /dev/ttyUSB_CREALITY.

Laad nu de nieuwe regels met

$ sudo udevadm trigger

En controleer de werking met

pi@printserver:~ $ ls -l /dev/ttyUSB*
crw-rw---- 1 root dialout 188, 0 14 feb 16:13 /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 1 14 feb 16:13 /dev/ttyUSB1
lrwxrwxrwx 1 root root         7 14 feb 16:13 /dev/ttyUSB_CNC -> ttyUSB1
lrwxrwxrwx 1 root root         7 14 feb 16:13 /dev/ttyUSB_CREALITY -> ttyUSB0

De regels zijn nu ingesteld en in het vervolg krijgen je apparaten een vaste USB-poortnaam toegewezen, in mijn geval dus /dev/ttyUSB_CNC en /dev/ttyUSB_CREALITY

Klik eventueel in Octoprint op het refresh knopje naar Connection als je USB poort er (nog) niet tussen staat. Configureer de volgende instellen

Serial Port: /dev/ttyUSB_CREALITY
Baudrate: 115200
Printer Profile: Creality ender
Save connection settings: Yes (checked)
Auto-connect on server startup: Yes (checked)

En klik op “Connect”

Stap 3. CNC Laser graveerder configureren

Voor de ondersteuning van GRBL is een plugin voor Octoprint beschikbaar op Github. Deze kun je via de Plugin manager van Octoprint installeren. Kies hiervoor het “wrench” icoontje rechts boven in Octoprint

Scroll in de linker scrollbox naar beneden tot “Plugin Manager”, en klik deze aan

Klik daarna op de “+ Get More” knop

en zoek op “grbl”, en installeer de plugin “Better Grbl Support” door op “Install” te klikken

Klik op 2x op “Close”. Zoek daarna in de rechter scrollbox de “Better Grbl Support” plugin op, en enable deze

Klik op “Save”

Open een terminal window en voer het volgende commando uit op Octoprint te herstarten

$ sudo service octoprint restart

Maak een Printer profile aan voor de CNC Laser graveerder, klik wederom op het “Wrench” icoontje en open nu “Printer Profiles” en kies voor “+ Add Profile …”

Geef de CNC Laser graveerder een zinvolle naam en kies voor model “gbrl”, configureer op de volgende tab’s de volgende waarden

Form factor: Rectangular
Origin: Lower Left
Heated Bed: No (unchecked)
Heated Chamber: No (unchecked)
Width: 40mm
Depth: 40mm
Height: 0mm
Axes: Default**
Custom Bounding Box: No (unchecked)
Nozzle Diameter: 0mm
Number of Extruders: 1

Klik op “Confirm” en daarna op “Save”

Kies daarna op het startscherm van OctoPrint onder “Connection” voor de juiste USB poort, baudrate en Printer Profile

Serial Port: /dev/ttyUSB_CNC
Baudrate: 115200
Printer Profile: CNC Laser Graveerder
Save connection settings: Yes (checked)
Auto-connect on server startup: Yes (checked)

OctoPrint maakt verbinding met de CNC Laser graveerder

Optioneel is het mogelijk om Octoprint gewoon op poort 80 te benaderen, je kunt dan volstaan met het intoetsen van de URL http://printserver.<domeinnaam>, in mijn geval http://printserver.sydspost.nl. Hiervoor gaan we de reversed proxy functionaliteit van Apache gebruiken. Creëer met het volgende commando het configuratie bestand hiervoor

$ sudo vi /etc/apache2/sites-available/Apache2Proxy.conf

en kopieer hierin de volgende configuratie (verander het domeinnaam sydspost.nl in je eigen domeinnaam, en de het emailadres is je eigen emailadres)

<VirtualHost *:80>
        ServerName printserver.sydspost.nl
        ServerAlias www.sydspost.nl
        ServerAdmin joumailadres@gmail.com
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        ProxyRequests Off
        <Proxy *>
          Order deny,allow
          Allow from all
        </Proxy>

        ProxyPass / http://127.0.0.1:5000/
        ProxyPassReverse / http://127.0.0.1:5000/

        <Location />
          Order allow,deny
          Allow from all
        </Location>

   </VirtualHost>

Voer vervolgens achtereenvolgens de volgende commando’s uit

$ sudo a2enmod proxy
$ sudo a2enmod proxy_http
$ sudo a2enmod proxy_balancer
$ sudo a2enmod lbmethod_byrequests
$ sudo a2ensite Apache2Proxy.conf
$ sudo systemctl reload apache2
$ sudo systemctl restart apache2.service

Je kunt nu Octoprint benaderen op http://printserver.<domeinnaam>, ververs eventueel je browser cache met F5 als het niet werkt.

Stap 3. Laserweb server installeren op Raspberry Zero

Uiteraard kun je nu met de web-interface van Octoprint Gcode vanaf je desktop bestanden openen en printen, maar daarvoor moet je altijd een tussenstap maken door in Laserweb het bestand te exporteren naar Gcode, en in Octoprint inlezen. Het is ook mogelijk om direct vanuit Laserweb te printen. Laserweb bestaat uit een client en server deel. Hieronder beschrijven we hoe het server-deel installeren op de Raspberry Zero, en vanuit de windows client hiernaar connecten.

Installeer eerst, voor zover je dat nog niet gedaan hebt, de Node Version Manager “NVM”

$ cd
$ mkdir .nvm
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | bash

Sluit je terminal sessie af en log opnieuw in, voer dan het volgende commando in

$ export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"

Check of je over de juiste versies van NPM en NodeJS beschikt met

$ npm -v
6.12.1
$ node -v
v8.10.0

NPM zou hoger moeten zijn dan versie 6.14.15, en Node hoger dan 12.22.5, dus beide moeten geupgraded op geïnstalleerd worden met

$ nvm install v12.22.5

Recheck

$ npm -v
6.14.14
$ node -v
v12.22.5

Upgrade npm naar versie 6.14.15 met

$ npm install npm@6.14.15 -g

Download en installeer LaserWeb server

$ cd
$ git clone https://github.com/LaserWeb/lw.comm-server.git
$ cd lw.comm-server
$ npm install

Start nu de LaserWeb server op. Dit gaf bij mij een foutmelding, namelijk:

$ node server.js
/home/pi/lw.comm-server/server.js:149
var io = websockets.listen(app);
                    ^

TypeError: websockets.listen is not a function
    at Object.exports.LWCommServer (/home/pi/lw.comm-server/server.js:149:21)
    at Object.<anonymous> (/home/pi/lw.comm-server/server.js:3406:13)
    at Module._compile (internal/modules/cjs/loader.js:999:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)
    at Module.load (internal/modules/cjs/loader.js:863:32)
    at Function.Module._load (internal/modules/cjs/loader.js:708:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:60:12)
    at internal/main/run_main_module.js:17:47

Dit vrij eenvoudig aan te passen door in de file server.js de programmacode ” var io = websockets.listen(app);” aan te passen naar “var io = websockets(app); “. Dus open de file met vi, zoek naar “websockets”, en haal “.listen” weg en sla de file op

$ vi server.js

Start nu Laserweb server op met

$ node server.js

***************************************************************
        ---- LaserWeb Comm Server 4.1.000 ----
***************************************************************
  Use  http://127.0.1.1:8000 to connect this server.

* Updates:
  Remember to check the commit log on
  https://github.com/LaserWeb/lw.comm-server/commits/master
  regularly, to know about updates and fixes, and then when ready
  update accordingly by running git pull

* Support:
  If you need help / support, come over to
  https://forum.makerforums.info/c/laserweb-cncweb/78
***************************************************************

Sluit de server met <Ctrl-c> af en zorg ervoor dat de server automatisch opstart bij het opstarten van het systeem

$ sudo ln -s `pwd`/lw.comm-server.service /etc/systemd/system
$ sudo systemctl daemon-reload
$ sudo systemctl enable lw.comm-server.service
$ cd
$ sudo ln -s `pwd`/.nvm/versions/node/v12.22.5/bin/node /usr/bin/node

Omdat ik niet de user “pi” gebruik, moest ik tevens in de file lw.comm-server.service alle verwijzingen naar “pi” vervangen door “syds”, mijn lw.comm-server.service ziet er dan ook als volgt uit. :

$ cat lw.comm-server.service
[Unit]
Description=LaserWeb4 server

[Service]
ExecStart=/usr/bin/node /home/syds/lw.comm-server/server.js
Restart=always
RestartSec=10                       # Restart service after 10 seconds if node service crashes
StandardOutput=syslog               # Output to syslog
StandardError=syslog                # Output to syslog
SyslogIdentifier=lw.comm-server
WorkingDirectory=/home/syds/lw.comm-server
User=syds
#Group=<alternate group>
Environment=NODE_ENV=production PORT=8000

[Install]
WantedBy=multi-user.target

Als jij gewoon de user pi gebruikt hoef je hier uiteraard niets in aan te passen. Start de server op en controleer of de server goed loopt met

$ sudo systemctl start lw.comm-server
$ sudo systemctl status lw.comm-server
● lw.comm-server.service - LaserWeb4 server
     Loaded: loaded (/etc/systemd/system/lw.comm-server.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2021-12-20 18:06:15 CET; 5s ago
   Main PID: 5812 (node)
      Tasks: 11 (limit: 9345)
     Memory: 28.0M
     CGroup: /system.slice/lw.comm-server.service
             └─5812 /usr/bin/node /home/syds/lw.comm-server/server.js

dec 20 18:06:16 test lw.comm-server[5812]:   Remember to check the commit log on
dec 20 18:06:16 test lw.comm-server[5812]:   https://github.com/LaserWeb/lw.comm-server/commits/master
dec 20 18:06:16 test lw.comm-server[5812]:   regularly, to know about updates and fixes, and then when ready
dec 20 18:06:16 test lw.comm-server[5812]:   update accordingly by running git pull
dec 20 18:06:16 test lw.comm-server[5812]:
dec 20 18:06:16 test lw.comm-server[5812]: * Support:
dec 20 18:06:16 test lw.comm-server[5812]:   If you need help / support, come over to
dec 20 18:06:16 test lw.comm-server[5812]:   https://forum.makerforums.info/c/laserweb-cncweb/78
dec 20 18:06:16 test lw.comm-server[5812]: ***************************************************************
dec 20 18:06:16 test lw.comm-server[5812]:

Start nu op je Laptop/Desktop de LaserWeb applicatie op om de connectiegegevens van de LaserWeb server aan te passen. Kies voor “Comms” -> “Server Connection”. Verander het “Server IP” in <ip-address van je Raspberry Zero>:8000, in mijn geval dus 192.168.2.115:8000. En klik op “Connect”

Rechtsonder in in Laserweb zie je dat de connectie gelukt is

Noot: Helaas kan Laserweb niet uit de voeten met symbolic link USB-poortnamen, dus connecteer deze rechtstreeks op /dev/ttyUSB*

Stap 4. Casing Raspberry Zero uitprinten

Op internet een mooie compacte casing gevonden voor de Raspberry Zero 2W, zie ook https://cults3d.com/en/3d-model/tool/raspberry-pi-zero-2-w-camera-case-heatsink-and-octopi-ready Mijn Raspberry Zero heeft geen heatsink, dus voor de versie gekozen die uitsparing voor de heatsink biedt.

Voor het afdrukken van de casing gebruik ik Cura, Cura beschikt over een plugin voor Octoprint integratie. Cura kun je downloaden van https://ultimaker.com/software/ultimaker-cura

Nadat je Cura gedownload hebt, installeer je deze met de default installatie instellingen.

Start daarna Cura op en stel deze in, klik op “Get started” en accepteer de User Agreement en klik op “Next” bij de mededeling dat Cura machine data ed. verzameld.

Maak een Ultimaker Account aan en Login of sla deze stap over met “Skip”

Voeg een printer toe door op “Add a non-networked printer” te klikken en kies in de lijst voor jou merk en type printer, in mijn geval een Creality Ender 5. Accepteer de default Machine Settings door op “Next” te klikken.

Lees de “What’s New” en release notes, of sla deze over met “Skip” en “Next”

Cura is nu klaar voor gebruik

Maar eerst nog de Octoprint-plugin installeren. Klik hiervoor rechtboven binnen Cura op “Marketplace”, de beschikbare plugins worden geladen

Scroll naar beneden onder “Community Plugins” en zoek naar “OctoPrint Connection”

En installeer deze door op “Install” te klikken, de GNU voorwaarden te accepteren en Cura af te sluiten met “Quit Ultimaker Cura”

Start Cura opnieuw op en koppel de printer aan Octoprint door in het menu te kiezen voor “Settings”-> “Printer” -> “Manage Printers …”

Selecteer je printer en kies voor “Connect OctoPrint”

Je OctoPrint printserver “printserver._octoprint._tcp.local wordt automatisch gevonden, klik deze aan

Klik vervolgens op “Request…” of een API Key van je OctoPrint printserver te verkrijgen. Automatisch wordt Octoprint in een webbrowser geopend en verschijnt onderstaande melding. Klik op “Allow”

De gegenereerde API key en User name wordt automatisch overgenomen, klik op “Connect” en daarna 2x op “Close”

De setup van Cura is nu afgerond, tijd om de casing te printen. Laad hiervoor de eerder gedownloade file “pi_zero_2_w_cover_without_heatsink.stl” met “File” -> “Open File(s)…”

Klik nu op “Slice” en daarna op “Print with OctoPrint”

Als alles goed is gegaan wordt nu de casing uitgeprint. Je kunt dit volgen in Cura onder “Monitor” of via de OctoPrint website

Stap 5. Raspberry Zero in casing plaatsen, alles aansluiten en testen

Plaats de Raspberry Zero 2W tussen de twee onderdelen van de casing. Sluit de voeding en de 4-poorts USB-A hub op de Micro-B aansluitingen. Ik heb die twee met een klein stukje dubbelzijdig tape op elkaar bevestigd. Sluit de 3D printer, CNC Laser Graveerder en eventueel Webcam (zie Stap 6.) aan op de USB-A hub.

Test nu de werking door de CNC Laser graveerder via LaserWeb een ontwerpje te laten printen, en print een 3D-ontwerp via OctoPrint evt in combinatie met Cura op je 3D printer.

<foto’s nog t

Stap 6. Webcam installeren en instellen (optioneel)

Om je print werk op afstand te kunnen monitoren is het handig een webcam te plaatsen die live beelden van je CNC Laser graveerder en/of 3D printer aan je doorgeeft. Octoprint biedt hiervoor standaard ondersteuning.

Eerst zorgen we ervoor dat de Raspberry Zero als webcam server gaat fungeren, open hiervoor een ssh sessie en installeer het “motion” pakket

sudo apt-get install motion

Configureer nu het motion pakket door de file /etc/motion/motion.conf te editen

sudo vi /etc/motion/motion.conf

Pas de volgende parameters aan:

  • daemon on
  • framerate 1000
  • stream_port  8081
  • movie_quality 100
  • stream_localhost off
  • webcontrol_localhost off
  • width 1280
  • height 720
  • post_capture 5
  • movie_output off

Heb je meerdere webcams aan je Raspberry Zero hangen, pas dan eventueel ook de parameter videodevice aan naar /dev/video[0123]

Sla de file op en en pas de file /etc/default/motion aan

sudo vi /etc/default/motion 

Zet start_motion_daemon op yes

$ cat /etc/default/motion
# set to 'yes' to enable the motion daemon
start_motion_daemon=yes

Herstart de motion server nu met

sudo service motion restart
sudo motion

En zorg ervoor dat motion wordt gestart na reboot

$ sudo crontab -e

Voeg onderaan de crontab de volgende regel toe, en sla de file op

@reboot /usr/bin/motion -b

Nu gaan we OctoPrint configureren, hiervoor open je de settings door op het “wrench” icoontje te klikken, het volgende scherm opent:

Klik daarna links in het menu op “Webcam & Timelapse”

Vul bij “Stream URL” de url van je webcam in: http:\\<ip-address/hostname>:8081, in mijn geval http://test.sydspost.nl:8081/, en klik op “Save”

Om de camera verder te configureren, bijv. de brightness of het contrast aan te passen, is er een handige plugin beschikbaar. Ga naar de “Plugin Manager” en klik op “+ Get More”

Zoek op “Camera”, en installeer de “Camera Settings” plugin door hierachter op “Install” te drukken. Klik daarna 2x op “Close”

Zoek opnieuw op “Camera” in “Installed plugins” en klik op het “Enable” knopje achter “Camera Settings” om de plugin te activeren

OctoPrint heeft de v4l utilities nodig voor het managen van de camera settings, dus installeer deze tools met

$ sudo apt install v4l-utils

Herstart OctoPrint met

$ sudo systemctl restart octoprint

En in de OctoPrint Settings verschijnt onder “Plugins” een nieuwe optie “Camera Settings”, klik hierop

Speel wat met de Camera settings tot het beeld aansluit bij je wensen, en klik op “Save”. Als je nu een 3D model print kun je via de Webcam de vorderingen volgen

Remote monitoring frees you from sitting next to your printer for hours
<nog vervangen door eigen foto>

Stap 7. Printer verlichten

Om ’s avonds ook goed licht te hebben voor de Webcam opnames, maar ook voor het monitoren van je printer, is het handig om een lamp boven je printer automatisch aan- en uit te schakelen tijdens het printen. Hiervoor kun je de plugin Octoprint – Domoticz gebruiken. Deze installeer je als volgt. Open de settings door op het “wrench” icoontje te klikken, het volgende scherm opent:

Ga naar de “Plugin Manager” en klik op “+ Get More”

Zoek op “domoticz”, en installeer de “Octoprint-Domoticz” plugin door hierachter op “Install” te drukken. Klik daarna 2x op “Close”

Zoek opnieuw op “Octoprint-Domoticz” in “Installed plugins” en klik op het “Enable” knopje achter ” Octoprint-Domoticz ” om de plugin te activeren

Octoprint vraagt nu om het systeem te herstarten, klik op “Restart now”. Zodra Octorprint opnieuw is opgestart kies opnieuw voor het “wrench” icoontje om de Domoticz plugin te configureren. Kies voor “Domoticz” onder plugins.

Het volgende scherm opent, klik op het “Pennetje” om de instellingen aan te passen

Het volgende scherm verschijnt

Toelichting op non-default waarden

LabelWaardeToelichting
IP:PORTIP-address of hostname van je Domoticz server en poortnummerIn mijn geval 192.168.2.29:8080
Index104IDX van Printerverlichting in Domoticz, in mijn geval 104
LabelPrinterverlichtingZinvolle naam
Warning promptUitgevinktVond het een irritante melding of je wel of niet de verlichting uit wilt zetten.
GCODE TriggerAangevinktMaakt het mogelijk om met een GCODE commando de verlichting aan- en uit te schakelen. Wordt hieronder verder uitgelegd.

Je ziet nu dat er naast het “wrench” icoontje een “bliksem” icoontje is verschenen. Hiermee kun je het licht boven je printer handmatig aan- en uitzetten. Maar dat voegt natuurlijk niet zoveel toe aan de functionaliteit die Domoticz je al biedt. Met de GCODE Trigger is het mogelijk om vanuit je Slicer applicatie het licht automatisch aan- en uit te schakelen als het printen start. Ik gebruik Cura als Slicer applicatie en hieronder leg ik uit hoe dit precies binnen Cura configureert.

Start Cura op en kies voor Settings -> Printer -> Manage printers, het volgende scherm verschijnt

Selecteer je printer, en kies voor “Machine Settings” het volgende scherm verschijnt

Voeg bij “Start G-code” onder M221 de volgende regel toe (vervang 104 door het IDX van jou lamp):

@DOMOTICZON 104

en voeg bij “End G-code” onder M140 de volgende regel toe, en klik 2x op “Close”

@DOMOTICZOFF 104

Print een 3D ontwerp om het te testen

Stap 8. OctoRemote app

Voor het volgen van je printwerk vanaf je mobiel zijn een aantal app’s beschikbaar in de Playstore. Ik heb gekozen voor OctoRemote omdat de opzet en look-and-feel overeenkomst met die van OctoPrint. Eerst de app geïnstalleerd op mijn (Android) telefoon, zoek op “OctoRemote” in de google Playstore en installeer deze.

Zodra de app geïnstalleerd is, open deze en swipe naar links om bij de instellingen te komen

Vul onderstaande gegevens in

LabelWaardeToelichting
Display NamePrintserverZinvolle naam
IP Address192.168.2.119:5000IP address of Hostname van de printserver + poortnummer Octoprint
API Key<API key>In OctoPrint gegenereerde API key, zie hieronder voor een toelichting
Enable webcamAanAfhankelijk van een gekoppelde webcam aan je printserver aan of uit
Webcam URL192.168.2.119:5000/webcam/?action=streamWordt automatisch gevuld op basis van je ingegeven IP Address

Om de API key te genereren open je via een webbrowser OctoPrint

Klik rechtsboven het menu onder het poppetje “pi” open, en kies voor “User Settings”

Neem de API Key over, of scan met je telefoon de QR code. Klik op “ADD PRINTER”. De app opent nu het status tab

Vul onderstaande gegevens in, en klik op “Connect”

LabelWaardeToelichting
Serial PortAUTOKies voor AUTO om de seriële poorten automatisch te laten detecteren, of kies een specifieke seriële poort.
Baudrate115200Default voor Arduino met GBRL
Printer profileCreality EnderOf jou profile aangemaakt in stap 2.
Save connection settingsAangevinktSla de connectie settings op
Auto connect on server startupAangevinktMaak automatisch connectie als de Octoprint server opstart

Je maakt nu connectie met de printserver en printer. Onder het tabje “CONTROL” vindt je de webcam beelden. Door op de drie onder elkaar staande puntjes te klikken kun je de settings van de webcam aanpassen.

Vink daar de optie “Auto-start webcam stream” aan en keer terug naar het hoofdscherm.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.