Hallo,
ich habe ein Problem und weiss nicht woran es liegt:
Ich habe mich dem PI-Radio gewidmet und dieses mit einem LCD-Display versehen.
MPD und MPC laufen und streamen, alles gut. Mit meinen beiden Tastern kann ich vor/zurück schalten und das LCD gibt auch den Sendernamen aus.
Weil mir aber die Optik des LCD nicht gefallen hat, habe ich nach einem scrolling LCD gegoogelt und auch ein schönes Scrupt gefunden.
Und dieses lief quasi sofort und auch so wie ich es mir vergestellt habe, aber:
Die Taster sind invertiert!
Wenn ich das Script starte, dann wechselt es jede Sekund den Sender. Halte ich die beiden Taster hingegen gedrückt, läuft die Musik. Wenn ich jetzt einen kurz loslasse, z.B. "PREV" dann wechselt er auch die Station.
Klar könnte man jetzt sagen, dann nimm doch Öffner aber ich würde gerne verstehen, warum das ganze mal so und mal so interpretiert wird.
Ich habe die Button wie im unteren Teil angeschlossen.
Zusätlich gebe ich hier beide Scripts an:
(Ich habe diese nicht selbst geschrieben, nur an ein paar Stellen angepasst, ich bin also nicht der Author!)
Hier das Script mit dem es geht (aber keine Info am LCD):
#!/usr/bin/python
#
# Script for Raspberry Pi Internet Radio
#
# Author: Kyle Prier
# Site: http://wwww.youtube.com/meistervision
#
# LCD author : Matt Hawkins
# Site : http://www.raspberrypi-spy.co.uk/
#
# Date : 10/01/2012
#
# The wiring for the LCD is as follows:
# 1 : GND
# 2 : 5V
# 3 : Contrast (0-5V)*
# 4 : RS (Register Select)
# 5 : R/W (Read Write) - GROUND THIS PIN! We do not want the LCD to send anything to the Pi @ 5v
# 6 : Enable or Strobe
# 7 : Data Bit 0 - NOT USED
# 8 : Data Bit 1 - NOT USED
# 9 : Data Bit 2 - NOT USED
# 10: Data Bit 3 - NOT USED
# 11: Data Bit 4
# 12: Data Bit 5
# 13: Data Bit 6
# 14: Data Bit 7
# 15: LCD Backlight +5V
# 16: LCD Backlight GND (Red)
# 17: LCD Backlight GND (Green)
# 18: LCD Backlight GND (Blue)
#import
import RPi.GPIO as GPIO
import time
import os
# Define GPIO to LCD mapping
LCD_RS = 7
LCD_E = 8
LCD_D4 = 25
LCD_D5 = 24
LCD_D6 = 23
LCD_D7 = 18
# Defomte GPIO for Radio Controls
NEXT = 14
PREV = 4
# Define some device constants
LCD_WIDTH = 20 # Maximum characters per line
LCD_CHR = True
LCD_CMD = False
LCD_LINE_1 = 0x80 # LCD RAM address for the 1st line
LCD_LINE_2 = 0xC0 # LCD RAM address for the 2nd line
LCD_LINE_3 = 0x94 # LCD RAM address for the 3rd line
LCD_LINE_4 = 0xD4 # LCD RAM address for the 4th line
# Timing constants
E_PULSE = 0.00005
E_DELAY = 0.00005
def main():
# Main program block
GPIO.setmode(GPIO.BCM) # Use BCM GPIO numbers
GPIO.setup(LCD_E, GPIO.OUT) # E
GPIO.setup(LCD_RS, GPIO.OUT) # RS
GPIO.setup(LCD_D4, GPIO.OUT) # DB4
GPIO.setup(LCD_D5, GPIO.OUT) # DB5
GPIO.setup(LCD_D6, GPIO.OUT) # DB6
GPIO.setup(LCD_D7, GPIO.OUT) # DB7
GPIO.setup(NEXT, GPIO.IN) # Next Channel button
GPIO.setup(PREV, GPIO.IN) # Previous Channel button
# Initialise display
lcd_init()
# Send some test
lcd_byte(LCD_LINE_1, LCD_CMD)
lcd_string("Raspberry Pi",2)
lcd_byte(LCD_LINE_2, LCD_CMD)
lcd_string("Internet Radio",2)
lcd_byte(LCD_LINE_3, LCD_CMD)
lcd_string("by",2)
lcd_byte(LCD_LINE_4, LCD_CMD)
lcd_string("RasPI-Edition v1.0", 2)
time.sleep(4)
os.system("mpc play")
while 1:
if ( GPIO.input(NEXT) == True):
os.system("mpc next")
time.sleep(1)
os.system("mpc play")
if ( GPIO.input(PREV) == True):
os.system("mpc prev")
time.sleep(1)
os.system("mpc play")
f=os.popen("mpc current")
station = ""
for i in f.readlines():
station += i
# Send some text
lcd_byte(LCD_LINE_1, LCD_CMD)
lcd_string(station,1)
lcd_byte(LCD_LINE_2, LCD_CMD)
lcd_string("",1)
lcd_byte(LCD_LINE_3, LCD_CMD)
lcd_string("",1)
lcd_byte(LCD_LINE_4, LCD_CMD)
lcd_string("",1)
time.sleep(5)
def lcd_init():
# Initialise display
lcd_byte(0x33,LCD_CMD)
lcd_byte(0x32,LCD_CMD)
lcd_byte(0x28,LCD_CMD)
lcd_byte(0x0C,LCD_CMD)
lcd_byte(0x06,LCD_CMD)
lcd_byte(0x01,LCD_CMD)
def lcd_string(message,style):
# Send string to display
# style=1 Left justified
# style=2 Centred
# style=3 Right justified
if style==1:
message = message.ljust(LCD_WIDTH," ")
elif style==2:
message = message.center(LCD_WIDTH," ")
elif style==3:
message = message.rjust(LCD_WIDTH," ")
for i in range(LCD_WIDTH):
lcd_byte(ord(message[i]),LCD_CHR)
def lcd_byte(bits, mode):
# Send byte to data pins
# bits = data
# mode = True for character
# False for command
GPIO.output(LCD_RS, mode) # RS
# High bits
GPIO.output(LCD_D4, False)
GPIO.output(LCD_D5, False)
GPIO.output(LCD_D6, False)
GPIO.output(LCD_D7, False)
if bits&0x10==0x10:
GPIO.output(LCD_D4, True)
if bits&0x20==0x20:
GPIO.output(LCD_D5, True)
if bits&0x40==0x40:
GPIO.output(LCD_D6, True)
if bits&0x80==0x80:
GPIO.output(LCD_D7, True)
# Toggle 'Enable' pin
time.sleep(E_DELAY)
GPIO.output(LCD_E, True)
time.sleep(E_PULSE)
GPIO.output(LCD_E, False)
time.sleep(E_DELAY)
# Low bits
GPIO.output(LCD_D4, False)
GPIO.output(LCD_D5, False)
GPIO.output(LCD_D6, False)
GPIO.output(LCD_D7, False)
if bits&0x01==0x01:
GPIO.output(LCD_D4, True)
if bits&0x02==0x02:
GPIO.output(LCD_D5, True)
if bits&0x04==0x04:
GPIO.output(LCD_D6, True)
if bits&0x08==0x08:
GPIO.output(LCD_D7, True)
# Toggle 'Enable' pin
time.sleep(E_DELAY)
GPIO.output(LCD_E, True)
time.sleep(E_PULSE)
GPIO.output(LCD_E, False)
time.sleep(E_DELAY)
if __name__ == '__main__':
main()
Alles anzeigen
und hier das Script was das LCD scrollt aber bei dem die Taster gedrückt gehalten werden müssen:
#!/usr/bin/python
#
# Script for Raspberry Pi Internet Radio
#
# Updates : Peter Foster (2013/02/11)
# Email : kimberleycottage@gmail.com
# Notes:
# - fixed a few bugs
# - allowed quicker breakout from scrolling after channel change
#
# Updates : James Bos (2013/01/18)
# Email : jamesbos@gmail.com
#
# Notes:
# * Changed for 16x2 LCD
# * Scrolling Song name (not the best code since my python is quire poor but it works!)
# * Display Station Name on 2nd line of LCD
# * Added 3rd button to show IP address and Uptime
# * Silly starting animation!
#
# TO-DO:
# * Learn some better code practices so for loop for scrolling LCD doesn't
# affect button pushes (need to hold your finger on button for sleeptime)
# * Volume control!!!
# * Volume control display!!!!!!!
#
# Original Author: Kyle Prier
# Site: http://www.youtube.com/meistervision
#
# Original LCD author : Matt Hawkins
# Site : http://www.raspberrypi-spy.co.uk/
#
# Date : 10/01/2012
#
# The wiring for the LCD is as follows:
# 1 : GND
# 2 : 5V
# 3 : Contrast (0-5V)*
# 4 : RS (Register Select)
# 5 : R/W (Read Write) - GROUND THIS PIN! We do not want the LCD to send anything to the Pi @ 5v
# 6 : Enable or Strobe
# 7 : Data Bit 0 - NOT USED
# 8 : Data Bit 1 - NOT USED
# 9 : Data Bit 2 - NOT USED
# 10: Data Bit 3 - NOT USED
# 11: Data Bit 4
# 12: Data Bit 5
# 13: Data Bit 6
# 14: Data Bit 7
# 15: LCD Backlight +5V
# 16: LCD Backlight GND (Red)
# 17: LCD Backlight GND (Green)
# 18: LCD Backlight GND (Blue)
#import
import RPi.GPIO as GPIO
import time
import os
# Define GPIO to LCD mapping
LCD_RS = 7
LCD_E = 8
LCD_D4 = 25
LCD_D5 = 24
LCD_D6 = 23
LCD_D7 = 18
# Defomte GPIO for Radio Controls
NEXT = 14
PREV = 4
INFO = 15
# Define some device constants
LCD_WIDTH = 20 # Maximum characters per line (change to 20 for 20x4)
LCD_CHR = True
LCD_CMD = False
LCD_LINE_1 = 0x80 # LCD RAM address for the 1st line
LCD_LINE_2 = 0xC0 # LCD RAM address for the 2nd line
LCD_LINE_3 = 0x94 # LCD RAM address for the 3rd line
LCD_LINE_4 = 0xD4 # LCD RAM address for the 4th line
# Timing constants
E_PULSE = 0.00005
E_DELAY = 0.00005
def main():
# Main program block
#GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM) # Use BCM GPIO numbers
GPIO.setup(LCD_E, GPIO.OUT) # E
GPIO.setup(LCD_RS, GPIO.OUT) # RS
GPIO.setup(LCD_D4, GPIO.OUT) # DB4
GPIO.setup(LCD_D5, GPIO.OUT) # DB5
GPIO.setup(LCD_D6, GPIO.OUT) # DB6
GPIO.setup(LCD_D7, GPIO.OUT) # DB7
GPIO.setup(NEXT, GPIO.IN) # Next Channel button
GPIO.setup(PREV, GPIO.IN) # Previous Channel button
GPIO.setup(INFO, GPIO.IN) # INFO Button
# Calls the start up animation function
start_up_anime()
# Start playing mpc straight away
os.system("mpc play")
# Run our core function (scrolling and button code)
while True:
core()
# Define our core program
def core():
# Declare "f" as our mpc current song title var
f=os.popen("mpc -f %title% current")
# Declare "s" as our station name var
s=os.popen("mpc -f %name% current").read()
s=s.strip()
# Declare an empty var for station (for use further down)
station = ""
# Declare our default sleeptime for how quickly our text scrolls
# This also affects how quickly our button presses are picked up (not good :()
sleeptime=0.3
# Start reading our lines from out "f" var in order to break it down and scroll
for i in f.readlines():
i=i.strip()
station += i # include station in our iterator (i)
str_pad = " " * 16 # same as 16 spaces
station = str_pad + station # combine both together
# iterates of the length of our station var (16)
for i in range (0, len(station)):
lcd_byte(LCD_LINE_1, LCD_CMD) # set the marker to the first line of our LCD
lcd_text = station[i:(i+16)] # var for each line of text for each position as it iterates over for loop
lcd_string(lcd_text,1) # send our text to the LCD
lcd_byte(LCD_LINE_2, LCD_CMD) # set the marker to the 2nd line of our LCD
lcd_string(s,2) # display our station (this one doesn't scroll since 2 scrolling at once is headache worthy!)
# When our GPIO is high (button is pressed) calls mpc and moves to next track
if ( GPIO.input(NEXT) == False):
os.system("mpc next") # call mpc to move on to next track
time.sleep(0.5) # sleep for half a second and give her some time!
os.system("mpc play") # call mpc to play
# (sleeptime=0) changes sleep time to 0, this will cause previous track info on
# the LCD to quickly move across the screen and move on to next track.
# this isn't here for effect (since it kinda looks cool I know:)) but it is here
# so the the new track info is shown more quickly (so the for loop completes more quickly
# and moves on to pushing the new info on the screen)
sleeptime=0
time.sleep(1)
# Same as above but for previous track,
if ( GPIO.input(PREV) == False):
os.system("mpc prev")
time.sleep(0.5)
os.system("mpc play")
sleeptime=0
time.sleep(1)
# This calls the uptime and ip for diognostic junk (eg: oops, whats the IP again?? :))
#if ( GPIO.input(INFO) == True):
# osIp=os.popen("ip addr | awk 'NR==6'").read()
# osIp=osIp[9:24]
# osUptime=os.popen("uptime | awk -F'[,]' '{print $1 $2}'").read()
# osUptime=osUptime[10:]
# lcd_byte(LCD_LINE_1, LCD_CMD)
# lcd_string(osUptime,1)
# lcd_byte(LCD_LINE_2, LCD_CMD)
# lcd_string(osIp,2)
# time.sleep(5)
# sleep time for iterating over the loop
if(sleeptime==0):
break
time.sleep(sleeptime)
def lcd_init():
# Initialise display
lcd_byte(0x33,LCD_CMD)
lcd_byte(0x32,LCD_CMD)
lcd_byte(0x28,LCD_CMD)
lcd_byte(0x0C,LCD_CMD)
lcd_byte(0x06,LCD_CMD)
lcd_byte(0x01,LCD_CMD)
def lcd_string(message,style):
# Send string to display
# style=1 Left justified
# style=2 Centred
# style=3 Right justified
if style==1:
message = message.ljust(LCD_WIDTH," ")
elif style==2:
message = message.center(LCD_WIDTH," ")
elif style==3:
message = message.rjust(LCD_WIDTH," ")
for i in range(LCD_WIDTH):
lcd_byte(ord(message[i]),LCD_CHR)
def start_up_anime():
# Initialise display
lcd_init()
# Send some test
lcd_byte(LCD_LINE_1, LCD_CMD)
lcd_string("Raspberry Pi",2)
lcd_byte(LCD_LINE_2, LCD_CMD)
lcd_string(" RADIO ",1)
time.sleep(0.3)
lcd_byte(LCD_LINE_2, LCD_CMD)
lcd_string(" R A D I O ",1)
time.sleep(0.3)
lcd_byte(LCD_LINE_2, LCD_CMD)
lcd_string(" R A D I O ",1)
time.sleep(0.3)
lcd_byte(LCD_LINE_2, LCD_CMD)
lcd_string("R A D I O",1)
time.sleep(0.3)
lcd_byte(LCD_LINE_2, LCD_CMD)
lcd_string("R A D I",1)
time.sleep(0.3)
lcd_byte(LCD_LINE_2, LCD_CMD)
lcd_string("R A D ",1)
time.sleep(0.3)
lcd_byte(LCD_LINE_2, LCD_CMD)
lcd_string(" R A D",1)
time.sleep(0.3)
lcd_byte(LCD_LINE_2, LCD_CMD)
lcd_string(" R A ",1)
time.sleep(0.3)
lcd_byte(LCD_LINE_2, LCD_CMD)
lcd_string(" R A ",1)
time.sleep(0.3)
lcd_byte(LCD_LINE_2, LCD_CMD)
lcd_string(" R A ",1)
time.sleep(0.3)
lcd_byte(LCD_LINE_2, LCD_CMD)
lcd_string(" R A ",1)
time.sleep(0.3)
lcd_byte(LCD_LINE_2, LCD_CMD)
lcd_string(" R A ",1)
time.sleep(0.3)
lcd_byte(LCD_LINE_2, LCD_CMD)
lcd_string(" R A",1)
time.sleep(0.3)
lcd_byte(LCD_LINE_2, LCD_CMD)
lcd_string(" R ",1)
time.sleep(0.3)
lcd_byte(LCD_LINE_2, LCD_CMD)
lcd_string(" R ",1)
time.sleep(0.3)
lcd_byte(LCD_LINE_2, LCD_CMD)
lcd_string(" R ",1)
time.sleep(0.3)
lcd_byte(LCD_LINE_2, LCD_CMD)
lcd_string(" R ",1)
time.sleep(0.3)
lcd_byte(LCD_LINE_2, LCD_CMD)
lcd_string(" R ",1)
time.sleep(0.3)
lcd_byte(LCD_LINE_2, LCD_CMD)
lcd_string(" R",1)
time.sleep(0.3)
lcd_byte(LCD_LINE_2, LCD_CMD)
lcd_string(" ",1)
time.sleep(.7)
def lcd_byte(bits, mode):
# Send byte to data pins
# bits = data
# mode = True for character
# False for command
GPIO.output(LCD_RS, mode) # RS
# High bits
GPIO.output(LCD_D4, False)
GPIO.output(LCD_D5, False)
GPIO.output(LCD_D6, False)
GPIO.output(LCD_D7, False)
if bits&0x10==0x10:
GPIO.output(LCD_D4, True)
if bits&0x20==0x20:
GPIO.output(LCD_D5, True)
if bits&0x40==0x40:
GPIO.output(LCD_D6, True)
if bits&0x80==0x80:
GPIO.output(LCD_D7, True)
# Toggle 'Enable' pin
time.sleep(E_DELAY)
GPIO.output(LCD_E, True)
time.sleep(E_PULSE)
GPIO.output(LCD_E, False)
time.sleep(E_DELAY)
# Low bits
GPIO.output(LCD_D4, False)
GPIO.output(LCD_D5, False)
GPIO.output(LCD_D6, False)
GPIO.output(LCD_D7, False)
if bits&0x01==0x01:
GPIO.output(LCD_D4, True)
if bits&0x02==0x02:
GPIO.output(LCD_D5, True)
if bits&0x04==0x04:
GPIO.output(LCD_D6, True)
if bits&0x08==0x08:
GPIO.output(LCD_D7, True)
# Toggle 'Enable' pin
time.sleep(E_DELAY)
GPIO.output(LCD_E, True)
time.sleep(E_PULSE)
GPIO.output(LCD_E, False)
time.sleep(E_DELAY)
if __name__ == '__main__':
main()
Alles anzeigen
Da ich mich mit dem Raspi erst am anfreunden bin würde ich mich über ein paar kleine Tipps freuen. Leider steht dazu nichts in meiner Lektüre, obwohl ich diese eigentlich für solche Fälle gekauft habe
Vielen Dank...