Vem är inte igång med gästbloggsinlägg igen, om inte Finkman? Idag ska han lära oss hur man gör med Raspberry Pi Zero! 🙂

Gästbloggare

Raspberry Pi Zero, perfekta grejen för Internet of Things-applikationer, info-radiatorer och dyl. iom dess formfaktor och låga strömförbrukning. Men.. Men, den har ju inget sätt att koppla upp sig till Internet? Nåja, det ska väl gå att lösa!

Tanken här är alltså att koppla ihop ett billigt enc28j60-ethernetinterface med en Raspberry Pi Zero. Det första jag gjorde var att googla det hela, och självklart så har någon annan redan gjort det. Jag utgick således ifrån denna beskrivning.

2016-01-01 19.43.01

USB OTG -> USB, mini HDMI -> HDMI

Jag ska börja från början. Jag fick ett RPi Zero-kit i julklapp! Iom att Pi Zero inte har fullstora kontakter så går det åt en adapter för USB OTG till fullstor USB, t.ex. denna, för att koppla i tangentbord. Sen kan det behövas en adapter från mini-HDMI till vanlig HDMI också lite beroende på vad man har tänkt att använda för skärm. Mycket trevligt att få allt i en bundle, inklusive minneskort, låda och allt. Min fru skämmer bort mig! 🙂

Ena sidan färdiglödd!

Ena sidan färdiglödd!

Nytt för RPi Zero är att det inte sitter någon pin header för GPIO monterad som standard. Som tur var så följde det med både rak och böjd pin header i mitt julklappspaket, och eftersom det är där vi ska koppla i ethernet-porten så fick jag börja med att löda fast pin-headern…

Jag använde den raka pin headern för att passa till “lådan”, en liten Pibow för Rpi Zero.

2015-12-29 14.09.53

Pinheadern fastlödd, lådan på!

Sådärja, allt ihopsatt! Raspbian installeras som vanligt, flasha över imagen till kortet. Här märktes en feature på Pibow-lådan, den spärrar minneskortet. Behöver man flasha om så får man skruva isär hela lådan igen!

 

Jag hade enc28j60-interface liggandes från lite gamla Arduino-projekt, vet inte om jag har någon äldre generation, annan Kina-kopia eller så, hur som helst så stämde inte min pinout på enc28j60-kortet med den i instruktionen länkad ovan. Dock lätt att översätta iom att alla pin-funktioner finns utskrivna på fotot i instruktionen. Det som verkligen skulle ha underlättat är en sånhär liten pryl. Så sjukt pilligt att räkna pinnar! Ungefär här så lärde jag mig dessutom om de olika numren på Raspberryns GPIO-header. Tydligen så finns det en numrering på GPIO-pinnarna som inte stämmer överens med att räkna pinnarna på pin-headern, en bra pinout-guide finns här. Hursom, dessa pinnar ska kopplas ihop:

enc28j60 Rpi Zero
GND       -> GND / pin25
VCC /5v       -> 5v /pin2
INT       -> GPIO25 /pin22
SO       -> GPIO9 / SPI_MISO /pin21
SCK       -> GPIO11 / SPI_SCLK / pin23
SI       -> GPOI10 / SPI_MOSI / pin19
CS       -> GPIO8 / SPI_CE0 /pin24

Det går åt hona-hona-breadboardingkablar för att koppla ihop grejorna. Iom att pin-layouten inte stämde ett till ett på SPI-pinnarna mellan Raspberryn och enc28j60n så är det enledar-breadboardingkablar som gäller, om man inte vill ta en större kontakt och plocka om pinnarna i kontakten. När man har pillat ihop allt så ser det ut typ såhär:

2015-12-29 22.33.32

Rpi Zero kopplad till enc28j60 ethernet-interface. Jepp, jag har snålat och använder bara fyra trådar i Ethernetkabeln till höger i bild..

Nåja, nu så borde allt funka! Lite pill kvar i Raspbian…

  • Aktivera SPI, gjorde jag genom att starta “sudo raspi-config”, bläddra ner till “Advanced Options”, bläddra ner till SPI, svara Ja på båda frågor som kommer, “Would you like the SPI interface to be enabled?” samt “Would you like the SPI kernel module to be loaded by default”.
  • Lägg till raden “dtoverlay=enc28j60” längst ner i /boot/config.txt, använd din favvo-editor, typ “sudo nano /boot/config.txt”
  • Starta om! “sudo reboot”.

Efter omstarten, om allt är kopplat rätt, så borde det dyka upp ett ethernet-interface! Titta så fint! Den har fått IP-adress genom DHCP redan!

pi@raspberrypi:~ $ ifconfig
eth0      Link encap:Ethernet  HWaddr ef:21:35:4b:77:64
          inet addr:10.0.0.218  Bcast:10.0.0.255  Mask:255.255.255.0
          inet6 addr: fe80::dd2b:c6d1:bcae:8040/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8044 errors:0 dropped:2205 overruns:0 frame:0
          TX packets:415 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1461080 (1.3 MiB)  TX bytes:40273 (39.3 KiB)
          Interrupt:163

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

pi@raspberrypi:~ $

Nåja, bara prova att pinga lite då, Yaaay! Internet!

pi@raspberrypi:~ $ sudo ping ping.sunet.se
PING ping.sunet.se (192.36.125.18) 56(84) bytes of data.
64 bytes from ping.sunet.se (192.36.125.18): icmp_seq=1 ttl=248 time=5.70 ms
64 bytes from ping.sunet.se (192.36.125.18): icmp_seq=2 ttl=248 time=5.41 ms

--- ping.sunet.se ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 5.415/5.559/5.703/0.144 ms
^Cpi@raspberrypi:~ $

Ok, så nu går det iaf att uppdatera systemet, sudo apt-get update, sudo apt-get upgrade osv. Men vad ska vi använda Rpi Zeron till då? Ptjaa, vi kan väl prova att sätta dit en ascii-display och visa något bra data från Internet!

Jag har läst en hel del i Adafruits jättbra guide för att koppla RPi till hd44780, men kände inte att jag behövde deras breakout-board för detta. Jag använder en OLED hd44780-display här till skillnad från vanlig LCD+backlight, vilket ger ett par fördelar.

  • Man slipper extra spänningsmatning och jord för backlight (vanligtvis pinnar 15 anod+16 katod på hd44780)
  • Man slipper en 10k-pot för kontrast (pinne 3 på hd44780, se kopplingsschema för kontrast-potentiometer i Adafruits guide)
  • OLED drar mindre ström och kan drivas från Raspberryn
  • Det är grym kontrast i OLED-displayen! 🙂

Det är lite lättare att koppla in hd44780-displayen än ethernetinterfacet iom att vi inte måste ta hänsyn till SPI-pinnarna på Raspberryn. Det går åt typ sju datapinnar plus strömmatning och två jord. Ifall man har en bakgrundsbelyst display så blir det ett par sladdar till, och ytterligare ett litet sladdnystan om man har en vanlig LCD-display som behöver kontrastpinnen. Ta en titt på denna pinout hos Raspberry Pi-Spy igen innan vi går vidare!

En liten tabell är på sin plats:

RPi Zero hd44780
GND/pin6       -> GND/pin1
5v/pin4       -> VCC/pin2
GPIO12/pin32       -> RS/pin4
GND/pin34       -> RW/pin5
GPIO16/pin36       -> E/pin6
GPIO6/pin31       -> DB4/pin11
GPIO13/pin33       -> DB5/pin12
GPIO19/pin35       -> DB6/pin13
GPIO26/pin37       -> DB7/pin14

Så, då kör vi igång och hoppas att allt funkar! Jag började med att prova Adafruits Adafruit_CharLCD.py från Github:

Förberedelser, kör dessa: sudo apt-get install python-setuptools; sudo easy_install -U distribute; sudo apt-get install python-pip; sudo pip install rpi.gpio

pi@raspberrypi:~ $ sudo apt-get install git
....
git clone https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code.git
pi@raspberrypi:~ $ git clone https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code.git
....
pi@raspberrypi:~ $ ls
Adafruit-Raspberry-Pi-Python-Code
pi@raspberrypi:~ $ cd Adafruit-Raspberry-Pi-Python-Code/Adafruit_CharLCD/
pi@raspberrypi:~/Adafruit-Raspberry-Pi-Python-Code/Adafruit_CharLCD $

Därefter så behöver vi uppdatera koden så att den använder rätt GPIO-pinnar,

pi@raspberrypi:~/Adafruit-Raspberry-Pi-Python-Code/Adafruit_CharLCD $ nano Adafruit_CharLCD.py

På rad 56, ändra

def __init__(self, pin_rs=25, pin_e=24, pins_db=[23, 17, 21, 22], GPIO=None):

till

def __init__(self, pin_rs=12, pin_e=16, pins_db=[6, 13, 19, 26], GPIO=None):
2015-12-30 20.49.15

Fungerar! 🙂

Ok, så nu försöker vi få ut lite vettig data på displayen då. Eftersom min OLED-display verkar vara lite nyckfull (läs “full med buggar”) så bytte jag bibliotek här till RPLCD istället. Förberedelse, kör: sudo pip install RPLCD

Lite mer kod,

#!/usr/bin/python
import RPi.GPIO as GPIO
from RPLCD import CharLCD
from RPLCD import cursor
import urllib
from random import randint

# get temperature from www.temperatur.nu, strip newline char 
temp=urllib.urlopen('http://www.temperatur.nu/termo/jagarvallen/temp.txt').read().rstrip()
# concatenate a string with the temperature
datastring='Temp: ' + temp

# initialize display. rw set to an unused pin as we have not connected rw.
lcd = CharLCD(pin_rs=12, pin_rw=17, pin_e=16, pins_data=[6, 13, 19, 26],
              numbering_mode=GPIO.BCM,
              cols=16, rows=2,
              auto_linebreaks=True)

# disable and enable the display, ugly workaround for poor behavior of 
# my Winstar EH1602A. These next two rows should not be needed.
lcd.display_enabled = False
lcd.display_enabled = True
# set cursor position, randomize row 0 or 1, start position 0-4. This
# is to minimize ware down of the OLED display
lcd.clear()
lcd.cursor_pos = (randint(0,1),randint(0,4))
# print only the first 32 characters to the display
lcd.write_string(datastring[:32])
#close the connection to the display
lcd.close()

Spara scriptet som te.x. /home/pi/lcd.py , kör sedan “chmod +x lcd.py” för att göra scriptet körbart. Prova sedan att köra med ./lcd.py

2015-12-30 23.13.30

SUCCESS!

Som ett sista steg, för att få displayen att uppdatera var 10:e minut, kör “crontab -e” och lägg till följande rad i schemaläggningen:

*/10 * * * * /home/pi/lcd.py

Sådärdå, efter uppstart av Raspberryn så kan det dröja 10 minuter tills displayen uppdaterar iom att scriptet bara körs var 10:e minut, men det går ju att lösa det med om man vill, det fanns dokumenterat i Adafruits guide.

Saker som stör mig:

  • Om jag hade sågat ur lite ur ena plexiglasskivan i skalet  och använt den böjda 40pin-headern istället så hade jag kunnat montera allting platt framåt med Raspberryn synlig. Nu sticker kablarna upp, måste avlöda pin headern och byta 🙁
  • Buggigheten i Winstar OLED-displayen. Iom att jag måste köra display_enabled=False, display_enabled=True på varje uppdatering av displayen så blinkar det till lite i displayen. Det verkar finnas senare revisioner av displayerna som kanske löser problemen.
  • Min enc28j60 får en ny MAC-adress efter varje uppstart, och därmed ett nytt IP genom DHCP efter varje uppstart. När man använder enc28j60 till Arduino så specar man MAC-adress själv, hur gör man det i RPi? [Brukar gå att spoofa MAC-adressen på nätverksinterface i Linux, reds. anm.]

Saker som värmer i vinterkylan:

  • Så sjukt lätt att få igång nätverket! Allt bara funkar efter minimalt med konfiguration! Jättemycket lättare än att pyssla med Ethernet på Arduino!
  • Som vanligt lätt att komma igång med Raspberryn, lätt att flasha, startar direkt, inget strul.
  • Storlek och strömförbrukningen på RPi Zero, denhär går ju att använda var som helst! Börjar verkligen bli en konkurrent till Arduino nu!
  • RPi Zero bootar blixtsnabbt, jag använde Raspbian Jessie Lite

Och med denna sammanfattning så får vi nog vara klara för den här gången! God fortsättning på er!

Hälsningar,
Jim