Blog om alt muligt andet

Brug din Raspberry Pi som printerserver, og gør din printer til en netværksprinter

Ak, det papirløse samfund lader stadig vente på sig. I mellemtiden har de fleste husholdninger nok typisk 1 printer, men flere brugere. Herhjemme har løsningen været at skrive på sin laptop, sende en e-mail til sig selv (ak igen!), og logge på den stationære, som printeren er tilsluttet, og så printe ud.

Men har du alligevel en Raspberry Pi stående tændt, kan du lige så godt smide printeren over på den, og så lade Raspberry Pi’en være printerserver. Det er faktisk rigtig Leth:

1. På din Raspberry Pi

CUPS står for Common Unix Printing System, “but that’s not important right now”. På din hindbærsnitte installerer du CUPS med

sudo apt-get install cups

Der bliver oprettet en brugergruppe, som hedder lpadmin, og du skal tilføje din bruger (typisk “pi”) til denne gruppe:

sudo usermod -a -G lpadmin pi

Og så skal du selvfølgelig huske at slutte din printer til en af USB-portene på din hindbærsnitte 🙂

2. På din Windows-computer

Åbn en browser, og gå ind på

http://[din hindbærsnittes IP-adresse]:631/

for eksempel

http://10.0.0.2:631/

Du skulle gerne få en side, der ser nogenlunde sådan her ud:

Klik på “Administration” og “Add printer”. Hvis du får en sikkerhedsadvarsel, så bare sig, at du gerne vil se siden alligevel. Nu bliver du bedt om at indtaste brugernavn og password til din bruger “pi” på hindbærsnitten.

Nu skulle du gerne få en liste over printere, der er tilsluttet hindbærsnitten. Vælg din printer fra listen, og klik “Continue”:

cups2

Giv din printer et navn, en beskrivelse og en placering. Sæt hak i “Share this printer”, og click “Continue”:

cups3

Nu skal du vælge din printer fra listen:

cups4

Hvis din printer ikke er på listen, skal du have en PPD-fil til den. Jeg downloadede bare en driverpakke til min printer på epson.com, unzippede den og fandt PPD-filen et sted derinde.

Når du har fået tilføjet printeren, skal du klikke på “Printers” i topmenuen, og derefter på din nys tilføjede printer. Derefter kopierer du URLen i adresselinjen:

cups5

Så finder du “Enheder og printere” i Windows, og klikker på “Tilføj printer”:

cups6

Start med at klikke på “Den printer, jeg søger efter, findes ikke på listen” – du behøver ikke vente til den er færdig med at søge.

Klik på “Vælg en delt printer ved hjælp af navn”, og paste URLen fra før ind. Hvis URLen begynder med https, er det vigtigt, at du fjerner s’et:

cups7

Klik “Næste”. På et tidspunkt bliver du bedt om at vælge din printer fra en liste, eller selv finde den – “Har diskette/cd”. [“Diskette”??? WTF, Microsoft?]

Og så burde det virke! Det gjorde det i hvert fald her 🙂

Raspberry Pi-dørklokke

Da jeg (forholdsvis!) nemt kunne trække et kabel fra min dørklokke til den ene af de Raspberry Pi’er, der kører 24/7, var det jo lidt oplagt af få dørklokken på nettet. Vi kan nemlig godt have svært ved at høre klokken, når døren ud til gangen er lukket, og vi står i køkkenet og larmer. Og så ville det jo være smart, om ens mobiltelefon kunne sige ding-dong, når man trykker på knappen.

Figur 1: En klassisk Friedland Ding Dong.
Figur 1: En klassisk Friedland “Ding Dong”.

Det er en klassisk Friedland “Ding Dong”, som tager fire C-batterier. Der er fire skrueterminaler i den: To, der går til trykknappen, og to ubrugte. Det viser sig, at når man trykker på knappen, ligger der ca. 4,8 V på de to ubrugte skrueterminaler. Det skal så hældes ind i en Raspberry Pi. Og det går selvfølgelig ikke sådan uden videre, så jeg har lavet et lille interface:

Figur 2: Diagram over interfacet mellem dørklokke og Raspberry Pi. Lavet med det gratis værktøj Digi-Key Scheme-it, som varmt kan anbefales.

(Hvordan skal man i grunden smide sådan noget sammen? Pt. er det bare en fuglerede…)

Figur 3: En rigtig god, gammel 8 µF foliekondensator. Mums!
Figur 3: En rigtig god, gammel 8 µF foliekondensator.

Kondensatoren er en gammel 8 µF foliekondensator – se figur 3. Hvorfor ikke? Jeg burde jo nok beregne den nødvendige kondensatorværdi ud fra tidskonstanten

τ = RC

men eftersom der ikke er nogen modstand, kan tidskonstanten hurtigt blive meget lille, uanset hvor stor en kondensatorværdi jeg vælger – eller er der noget, jeg har misforstået?

Jeg kører GPIO4 med en pull-up-modstand (indbygget i Raspberry Pi), og så har jeg skrevet et lille program i Python, som ser sådan her ud:

import datetime
import logging
import os
import RPi.GPIO as GPIO
import subprocess
import sys
import time

GPIO.setmode(GPIO.BCM)
pin = 14
GPIO.setup(pin, GPIO.IN, GPIO.PUD_UP)

while True:
  try:
    logging.basicConfig(filename="dingdong.log", format="%(asctime)s %(message)s", level=logging.DEBUG)
    GPIO.wait_for_edge(pin,GPIO.FALLING)
    logging.info("Ding")
    subprocess.call("/home/pi/dingdong/tweet.sh", shell=True)

  except:
    logging.warning(sys.exc_info()[0])

Det program ligger i en fil, der hedder dingdong.py. Den kaldes fra et init-script:

echo 14 > /sys/class/gpio/export
echo in > /sys/class/gpio/gpio14/direction
python3 /home/pi/dingdong/dingdong.py

der køres af cron ved boot.

Så når nogen ringer på, sendes der et tweet, som min mobiltelefon så gør mig opmærksom på.

Problemer

  1. Kredsløbet er temmelig støjfølsomt. Skramler jeg lidt rundt om det, kan det trigge en jording af GPIO4.
  2. Processen med et tweet er alt for langsom. Der kan gå flere minutter, før jeg modtager en push-notifikation, og så er folk jo nok gået igen. Det må da for katten kunne lade sig gøre at sende et signal til en mobiltelefon i real time?!