Raspberry Pi Zero med ethernet och hd44780-display

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!

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

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

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

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,

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:

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

3 reaktioner på ”Raspberry Pi Zero med ethernet och hd44780-display”

  1. Inspirerande guide! ”Tråkiga” med såna här småsaker (förrutom att de är slutsålda överallt) är att de blir inte så små när man väl kopplat in allt roligt till dom 🙂 kunde varit ethernet eller WLAN på zero:n kan man tycka.

  2. Hej!

    Tack! Kul att det inspirerar!

    Jag håller med fullständigt, det ska till ett specifikt användarfall för att välja en Zero över en modell B+ där man får både fullstora USB, HDMI och Ethernet direkt på kortet. Sen kan det ju vara en styrka att köra Zero och Ethernet-adaptern frånkopplade varandra såhär också beroende på användningsområde, hur den ska byggas in, hur trångt det är osv. Om jag skulle skippa finskalet, lägga Ethernet-prylen och Raspberryn på rad, displayen uppepå de två, sen 3d-printa ett anpassat skal så skulle det bli en mycket liten stav med Internet, Linux och display.

    Med det sagt så började jag under detta Zero-hack inse att RPi seriöst börjar konkurrera med Arduino nuförtiden. Ett växande community, ”Hat”-kort som motsvarar shields, pytteliten formfaktor, mycket GPIO, SPI osv direkt på kortet, med just skillnaden att det var enormt mycket lättare att köra Ethernet på Raspberryn än vad det någonsin har varit på Arduino. Visst döljs en del av komplexiteten i Arduinos bibliotek, men det är ändå en hel del meck beroende på chipet på Ethernet-prylen man väljer till Arduino, om man kör trådat Ethernet eller WiFi är två helt olika spel på Arduino, vilken kod som funkar till vilka bibliotek, vilka bibliotek som funkar till vilket Ethernet-chip osv.

    På Raspberryn med Linux i botten så ser TCP/IP-stacken likadan ut oavsett hur man väljer att koppla till Internet genom Ethernet, WiFi, GSM/3g/4g eller vad som helst, och i stort sett alla applikationer som finns till Raspbian/Debian/Ubuntu/Linux i stort bara funkar direkt. Det blir rätt kraftfullt.

    Det som skulle vara killer-featuren för mig vore om RPi skulle sätta 100Mbit Ethernet som ett tillägg till pin headern, fyra eller åtta extra pinnar, vilket skulle ge möjlighet att köra Power over Ethernet också. Det hade varit grymt! Funderar på hur/om det skulle gå att modda in i enc28j60-kortet, borde bara vara att bryta ett par banor på kortet och löda på ett par patchar 🙂

    /Jim

Kommentera