Min magiska lilla röda [Raspberry pi+16 bit LCD=användbar maskin]
### Varning: Just nu finns det inga bilder, så det är mest en wall of text. Har försökt att sära lite på det med code- och spoiler-taggar, men förstår att det just nu är lite svårläst. Blir det lättare eller jobbigare att läsa med spoiler-taggarna? Ville ändå lägga upp det eftersom jag inte hittade någon spara-funktion och jag får lite eld i baken att fortsätta fylla på och inte glömma bort det. ###
Backstory:
För ett tag sedan skaffade jag mig en Raspberry pi. Eftersom jag aldrig sysslat med Linux förut sysselsatte jag mig i ett par veckor med att lära mig hur man navigerar och lekar med Raspberry pi, linux och python. Jag skrev små script som hämtade ip-adresser, kollade av resultat och andra automatiska saker. Jag köpte en kameramodul och gjorde en timelapse-film. Sen hittade jag en liten LCD i ett paket som skulle passa en RPi och klickade hem en, men när jag fick hem den såg jag till min förvåning (varför jag blev förvånad vet jag inte) att man behövde LÖDA IHOP sk*ten. Jag har aldrig lött något i hela mitt liv, hade ingen utrustning och blev lite trött på'et. Det som brukar hända hände och min lilla elektroniska pryttel hamnde i skymundan medan jag sysslade med andra saker. Tills en dag...
TL;DR: Jag köpte en RPi+LCD, kunde inte löda så jag sket i det.
Projektet:
Jag vill väldigt gärna pyssla med att koda för en LCD-skärm för RPi:n, men innan jag kan göra det så behöver jag sätta ihop den. På grund av detta har jag låtit den ligga ett tag, men i förra veckan när jag hittade en kodsnutt för att hämta senaste BitCoin-priset så kände jag igen att det vore roligt om man kunde ha någonting att visa det på.
Eftersom skärmen har knappar också ser min idé ut såhär:
Fixa ihop en liten låda med en RPi och en 16 bit LCD-skärm som kan visa information på ett enkelt sätt. Lådan skall placeras vid min ytterdörr så att man snabbt kan kolla av tex när nästa buss går från närmaste hållplats innan man sticker.
Att göra:
Löda ihop LCD-skärmen och sätta den på min Raspberry pi.
Bygga en låda som kan hålla RPi:n och skärmen (just nu verkar det bli Lego till att börja med).
Skriva kod så att lådan kan visa olika typer av information beroende på vilka knappar man trycker. Just nu har jag dessa funktioner i åtanke:
Nästa västtrafik-tur från närmaste busshållplats
Vädret i närheten
BitCoin-pris just nu
Eftersom jag även sitter på en kamera-modul så kanske jag kopplar in den så man kan ta en bild med ett enkelt knapptryck.
Har ni några andra idéer på vad man skulle kunna lägga in så hit me!
Material:
1 x Raspberry Pi Model B
1 x Adafruit Blue&White 16x2 LCD+Keypad Kit for Raspberry Pi
1 x lödstation
Lödtenn
∞ x legobitar
Strömsladd & ethernet till RPi:n
Instruktioner för LCD:n
(Tyvärr finns det inga bilder på den tidiga delen av projektet, eftersom jag kom på det här med byggloggen lite sent.)
Lödande:
Från början så lånade jag en gammal lödkolv av en kollega. Han tipsade mig om att det vore en bra idé om jag rengjorde spetsen innan jag började löda, men såklart lyssnade jag inte på honom. Detta resulterade i att mitt första löd-försök gick käpprätt åt skogen. Enligt instruktionerna i kittet så skulle man börja med att löda fast en resistor, men min lånade kolv blev inte tillräckligt varm. Detta gjorde att den lila plattan som man skall värma upp samtidigt som lödtennet inte blev varm och det blev mest en massa tennklumpar lite varstans. Efter mycket slit och svärande lyckades jag löda fast en av... benen(?) på resistorn, men det andra visades sig vara smått omöjligt. Till slut gick benet också av innan det var fastlött, vilket ju inte gjorde min frustration mindre.
Efter lite googlade kom jag fram till att det var kolven som var för kall och letade istället upp en lödstation på Kjell för 124 spänn. Nu har jag ju lite dålig koll på vad de kostar i vanliga fall, men det kändes som ett klipp så jag slog till. Jag köpte även "krokodilarmar" då jag tänkte att det kan ju vara bra att kunna spänna fast och vrida lätt på det man löder. De som jag köpte var aaaningen små och inte helt stabila, men vad kan man förvänta sig för 69 spänn?
Med min nya lödstation och en ledig söndag satte jag ut för att löda skiten ur LCD:n och herregud vilken skillnad det var med en varm lödkolv. "Bara" att värma upp ringen runt hålet och sedan lödtenn så flöt det på plats precis som det skulle. Det är ju säkert inte så snyggt som det kunde ha varit och vissa var riktigt jävliga, men jag är ändå riktigt nöjd med resultatet.
Lite nervös var jag när det var dags att löda fast knapparna eftersom det i instruktionerna stod "Solder each leg, taking care not to accidentally 'short' two button legs together.". Det gick bra ändå, men med tanke på mina bristande kunskaper kunde det nog ha tagit slut redan där. Speciellt som jag i sann devil may care-anda inte har någon tennsug eller liknande för att rätta till misstag.
Det tog någon timme och sedan var det klart. Eftersom jag kom på att jag skulle göra den här loggen lite sent så har jag inga bilder från det egentligen lödandet. I vilket fall blev det inga större missöden och jag kunde ge mig på koden direkt.
Kodande:
### Om det är någon som tänkt använda sig av det här inlägget för att försöka sig på det här själv, tänk på att indentering är väldigt viktigt i Python, så se så att det ser likadant ut efter att du kopierat. ###
Jag använder mig av en RPi som sedan tidigare är installerad och kan nås via SSH. För att göra RPi:n klar för att användas tillsammans med LCD:n behövde man dock uppdatera och installera lite paket.
/etc/modules (sudo nano /etc/modules) and add:
i2c-bcm2708
i2c-dev
Reboot
sudo apt-get install python-smbus
sudo apt-get install i2c-tools
Sedan kör man kommandot nedan för att kolla att LCD:n hittas på rätt plats (0x20).
sudo i2cdetect -y 0 (if you are using a version 1 Raspberry Pi)
sudo i2cdetect -y 1 (if you are using a version 2 Raspberry Pi)
För att ladda ner exempel-pythodkod för att styra skärmen gör man följande.
sudo apt-get install git
git clone https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code...
cd Adafruit-Raspberry-Pi-Python-Code
cd Adafruit_CharLCDPlate
sudo apt-get install python-dev
sudo apt-get install python-rpi.gpio
Och så kommandot nedanför för att köra igång ett test:
sudo python Adafruit_CharLCDPlate.py
(Allt detta enligt instruktionerna som finns länkade under material.)
Det testet gör är att köra upp lite text på skärmen och sedan händer det lite saker om man trycker på knapparna. Till att börja med såg jag ingen text alls, men efter lite skruvande på kontrast-skruven så löste det sig.
Efter det började jag bena ut hur exempel-filen fungerade.
Initiera skärmen och meddelande:
Efter att ha initierat skärmen:
from time import sleep
from Adafruit_CharLCDPlate import Adafruit_CharLCDPlate
# Initialize the LCD plate. Should auto-detect correct I2C bus. If not,
# pass '0' for early 256 MB Model B boards or '1' for all later versions
lcd = Adafruit_CharLCDPlate()
Var det inte svårare än såhär att slänga upp ett meddelande på skärmen:
lcd.message("Hej")
Däremot märkte jag att man manuellt behövde rensa skärmen innan man lade upp ett nytt meddelande, detta genom:
lcd.clear()
Knapparna:
Eftersom min LCD var blue/white så struntade jag i att kolla något på backlight-grejerna och gick direkt på knapparna. I exemplet hade de löst det genom att köra den här koden:
while True:
for b in btn:
if lcd.buttonPressed(b[0]):
if b is not prev:
lcd.clear()
lcd.message(b[1])
lcd.backlight(b[2])
prev = b
break
Men det kändes lite krångligt att börja så, varpå jag benade ut varje knapp istället. Tanken är att den här skall skrivas om för att fungera mer elegant senare:
while True:
try:
if lcd.buttonPressed(lcd.RIGHT):
lcd.clear()
lcd.message('right')
if lcd.buttonPressed(lcd.LEFT):
lcd.clear()
lcd.message('left')
if lcd.buttonPressed(lcd.UP):
lcd.clear()
lcd.message('left')
if lcd.buttonPressed(lcd.DOWN):
lcd.clear()
lcd.message('left')
if lcd.buttonPressed(lcd.SELECT):
lcd.clear()
lcd.message('select')
lcd.clear()
#stänger av backlight
lcd.backlight(lcd.OFF)
#avslutar while och stänger python-scriptet
break
except KeyboardInterrupt:
self.stopMenu(lcd)
I det här skedet så ändras texten på skärmen varje gång man trycker på en knapp. Trycker man på select (knappen längst till höger) så stänger skärmer ner sig och python-scriptet stoppas.
(Jag har löst det med den första lite mer eleganta koden och även lagt in tre funktioner, en för Västtrafik, en för BitCoins och en för vädret, men just nu hinner jag inte skriva mer. Ska försöka lägga in lite bilder i morgon när min kamera är laddad igen och jag har lite ljus.)
Mb: MSI Z77A-G43 ATX | Ram: Crucial Ballistix Sport 8GB 1600Mhz | CPU: Intel Core i5 3450 3,1Ghz (Ivy Bridge) | Chassi: Cooler Master Elite 430 Svart | Psu: Fractal Design Integra 500W | Grafikkort: PowerColor Radeon HD7970 | Hdd: 1TB Seagate Barracuda | SSD: Samsung EVO Basic 256gb | Monitor: HP Compaq LA2306x 23'' & (random) Acer 19''
Diverse projekt