Internetové radio - Raspberry pi - problém s lcdproc

Tomáš Bláha

Re:Internetové radio - Raspberry pi - problém s lcdproc
« Odpověď #15 kdy: 25. 12. 2017, 15:14:39 »
O kousek výše jsi psal, že spouštíš service LCDd start. LCDd je ta část, která poslouchá na portu a přijímá informace k zobrazení a lcdproc je klient, který zobrazuje systémové informace, viz man.

Logy ukládá běžným způsobem, využívá systémový logger. Já osobně bych prostě četl nějaký soubor v adresáři /var/log, ale nevím, jak přesně je to nastavené na tvojí distribuci. Pro ladění bude asi nejjednodušší spustit démona na popředí a pak tě bude na konzoli informovat o tom, co se děje a proč nepracuje, protože předpokládám skončí na nějaké chybě. Zkus příkaz: LCDd -f

Co se týče pythonu, tak netuším, proč přidání dvou řádků by mělo být tak složité, ale potíž je, že nereaguješ příliš konkrétně. Třeba ti někdo něco poradí a ty na to nezeraguješ a nebo zkusíš něco jiného. Možná se na nějakém kroku zarazíš, ale pak buď prosím konkrétní.


marty

Re:Internetové radio - Raspberry pi - problém s lcdproc
« Odpověď #16 kdy: 25. 12. 2017, 15:28:13 »
Ano LCDd je spuštěný. lcdproc spustit nelze. ve /var/log nic není (co by se týkalo lcdproc)

Jestli stačí přidat dva řádky do toho scriptu, tak bych šel touhle cestou, ale absolutně nechápu, jak na to, nejsem programátor.

Jestli tedy mám být konkrétní, nevím, kam ty dva řádky napsat, tak aby se zobrazoval ten textový výstup stejně jako v terminálu.

LCDd -f ukáže akorát informace o programu.(kdo ho vytvořil apod.)

marty

Re:Internetové radio - Raspberry pi - problém s lcdproc
« Odpověď #17 kdy: 25. 12. 2017, 15:32:04 »
Nebo jestli mám poslat nějaký jiný log z /var/log ve kterém by se ty informace dali najít, stačí říct.

Tomáš Bláha

Re:Internetové radio - Raspberry pi - problém s lcdproc
« Odpověď #18 kdy: 25. 12. 2017, 15:58:00 »
Já bych hledal něco jako:

Kód: [Vybrat]
grep -a LCDd /var/log/messages
A když spustíč LCDd -f, tak kromě informací o autorech zůstane spuštěný, nebo se hned ukončí a vrátí do příkazové řádky?

Co se týče python skriptu, na začátek bych přidal:

Kód: [Vybrat]
import subprocess
A tam dole, kde se posílá výstup (tj. řádka s lcd_string("Nejaky text",LCD_LINE_1)), tak bych udělal místo ní něco jako:

Kód: [Vybrat]
text = subprocess.check_output('echo "currentsong" | nc localhost 6600 | grep -e "^Title: "', shell=True)
lcd_string(text,LCD_LINE_1)

Možná to bude chtít malinko poladit, já to nemůžu vyzkoušet.

marty

Re:Internetové radio - Raspberry pi - problém s lcdproc
« Odpověď #19 kdy: 25. 12. 2017, 16:40:43 »
Ten první příkaz nedělá nic.

LCDd -f vypíše informace a ukončí se.

S tím scriptem už je mi to trochu jasnější, ale zkusím se ještě zeptat na nějakém python foru.


marty

Re:Internetové radio - Raspberry pi - problém s lcdproc
« Odpověď #20 kdy: 25. 12. 2017, 16:55:32 »
Tohle bude potřeba nějak upravit
Kód: [Vybrat]
def lcd_string(message,line):
  # Send string to display

  message = message.ljust(LCD_WIDTH," ")

Něco jako
Kód: [Vybrat]
def lcd_string(text,line):
  # Send string to display

  text = subprocess.check_output('echo "currentsong" | nc localhost 6600 | grep -e "^Title: "', shell=True)(LCD_WIDTH," ")

Chápu to správně ?

Tomáš Bláha

Re:Internetové radio - Raspberry pi - problém s lcdproc
« Odpověď #21 kdy: 25. 12. 2017, 17:06:33 »
Ne. Čti prosím pozorně! Psal jsem, abys našel místo, kde je napsáno lcd_string("Nejaky text",LCD_LINE_1). Je to cca 15 řádek před koncem souboru. Tam to upravíš - přidáš před to volání subprocess a místo "Nejaky text" napises proměnnou text.

marty

Re:Internetové radio - Raspberry pi - problém s lcdproc
« Odpověď #22 kdy: 25. 12. 2017, 17:12:41 »
To jsem zkoušel. Syntax error EOL while scanning string literal

Ten můj pokus vypíše to samé

Tomáš Bláha

Re:Internetové radio - Raspberry pi - problém s lcdproc
« Odpověď #23 kdy: 25. 12. 2017, 17:21:27 »
Zkus ještě:

Kód: [Vybrat]
LCDd -f -r 5 -s 0

Tomáš Bláha

Re:Internetové radio - Raspberry pi - problém s lcdproc
« Odpověď #24 kdy: 25. 12. 2017, 17:24:32 »
Tak v tom pythonu máš asi nějaký překlep, pošli sem celé znění upraveného souboru...

marty

Re:Internetové radio - Raspberry pi - problém s lcdproc
« Odpověď #25 kdy: 25. 12. 2017, 17:39:35 »
LCDd -f -r 5 -s 0

Kód: [Vybrat]
LCDd version 0.5.7 starting
Built on Tue, 22 Mar 2016 19:45:10 +0100, protocol version 0.3, API version 0.5
Using Configuration File: /etc/LCDd.conf
Set report level to 5, output to stderr
LCDd 0.5.7, LCDproc Protocol 0.3
Part of the LCDproc suite
Copyright (C) 1998-2014 William Ferrell, Selene Scriven
                        and many other contributors

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

Server running in foreground
Listening for queries on 127.0.0.1:13666
screenlist_init()
driver_load(name="hd44780", filename="/home/pi/hd44780.so")
HD44780: using ConnectionType: rpi
hd44780: Using hd44780_default charmap
can not open /dev/mem
Failed to set up gpio.
Driver [hd44780] init failed, return code -1
Module /home/pi/hd44780.so could not be loaded
Could not load driver hd44780
There is no output driver
Critical error while initializing, abort.

Chápu to tak, že to nechce najít ovladač ? Cesta souhlasí.

Ten script jsem zkusil přepsat znovu a teď to píše
Kód: [Vybrat]
Traceback (most recent call last):
  File "/home/pi/Radio/i2clcda_pokus.py", line 98, in <module>
    main()
  File "/home/pi/Radio/i2clcda_pokus.py", line 91, in main
    lcd_string(text,LCD_LINE_1)
  File "/home/pi/Radio/i2clcda_pokus.py", line 75, in lcd_string
    message = message.ljust(LCD_WIDTH," ")
TypeError: ljust() argument 2 must be a byte string of length 1, not str

Script

Kód: [Vybrat]
import smbus
import time
import subprocess
# Define some device parameters
I2C_ADDR  = 0x27 # I2C device address, if any error, change this address to 0x3f
LCD_WIDTH = 16   # Maximum characters per line

# Define some device constants
LCD_CHR = 1 # Mode - Sending data
LCD_CMD = 0 # Mode - Sending command

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

LCD_BACKLIGHT  = 0x08  # On
#LCD_BACKLIGHT = 0x00  # Off

ENABLE = 0b00000100 # Enable bit

# Timing constants
E_PULSE = 0.0005
E_DELAY = 0.0005

#Open I2C interface
#bus = smbus.SMBus(0)  # Rev 1 Pi uses 0
bus = smbus.SMBus(1) # Rev 2 Pi uses 1

def lcd_init():
  # Initialise display
  lcd_byte(0x33,LCD_CMD) # 110011 Initialise
  lcd_byte(0x32,LCD_CMD) # 110010 Initialise
  lcd_byte(0x06,LCD_CMD) # 000110 Cursor move direction
  lcd_byte(0x0C,LCD_CMD) # 001100 Display On,Cursor Off, Blink Off
  lcd_byte(0x28,LCD_CMD) # 101000 Data length, number of lines, font size
  lcd_byte(0x01,LCD_CMD) # 000001 Clear display
  time.sleep(E_DELAY)

def lcd_byte(bits, mode):
  # Send byte to data pins
  # bits = the data
  # mode = 1 for data
  #        0 for command

  bits_high = mode | (bits & 0xF0) | LCD_BACKLIGHT
  bits_low = mode | ((bits<<4) & 0xF0) | LCD_BACKLIGHT

  # High bits
  bus.write_byte(I2C_ADDR, bits_high)
  lcd_toggle_enable(bits_high)

  # Low bits
  bus.write_byte(I2C_ADDR, bits_low)
  lcd_toggle_enable(bits_low)

def lcd_toggle_enable(bits):
  # Toggle enable
  time.sleep(E_DELAY)
  bus.write_byte(I2C_ADDR, (bits | ENABLE))
  time.sleep(E_PULSE)
  bus.write_byte(I2C_ADDR,(bits & ~ENABLE))
  time.sleep(E_DELAY)

def lcd_string(message,line):
  # Send string to display

  message = message.ljust(LCD_WIDTH," ")

  lcd_byte(line, LCD_CMD)

  for i in range(LCD_WIDTH):
    lcd_byte(ord(message[i]),LCD_CHR)

def main():
  # Main program block

  # Initialise display
  lcd_init()

  while True:
    text = subprocess.check_output('echo "currentsong" | nc localhost 6600 | grep -e "^Title: "', shell=True)
    # Send some test
    lcd_string(text,LCD_LINE_1)
   


if __name__ == '__main__':

  try:
    main()
  except KeyboardInterrupt:
    pass
  finally:
    lcd_byte(0x01, LCD_CMD)

Tomáš Bláha

Re:Internetové radio - Raspberry pi - problém s lcdproc
« Odpověď #26 kdy: 25. 12. 2017, 17:56:39 »
No vida - Failed to set up gpio. Na https://www.raspberrypi.org/forums/viewtopic.php?t=100066 zmiňovali nějaké nutné úpravy:

Citace
Find where GPIO_BASE is defined and change the value from 0x20xxxxxx to 0x3Fxxxxxx for the Pi2.

Takže pro začátek by bylo potřeba vědět, jaké přesně raspberry máš, třeba to je právě ta změna, kterou musíš udělat. A kompiloval sis ten driver hd44780 sám, tj. máš někde jeho zdrojáky?

Chyba s ljust() na řádku 75 vypadá, jako by v těch uvozovkách bylo něco jiného, než jedna mezera. Prosím důkladně zkontroluj, že mezi uvozovkami je jen jediný bajt a sice mezera s ASCII kódem 32, tj. že tam není nějaká unicode mezera nebo třeba tabelátor nebo dvě mezery atp. Vymaž obsah a napiš znovu, ono při kopírování se leckdy může připlést lecjaký bordel.

Tomáš Bláha

Re:Internetové radio - Raspberry pi - problém s lcdproc
« Odpověď #27 kdy: 25. 12. 2017, 18:01:10 »
Jo a nějaké to time.sleep(3) bych ve zdrojáku nechal, jinak to bude příliš zatěžovat systém.

marty

Re:Internetové radio - Raspberry pi - problém s lcdproc
« Odpověď #28 kdy: 25. 12. 2017, 18:02:56 »
Ten driver jsem stáhnul odsud https://www.dropbox.com/s/ww2zt0nah0o43f9/hd44780.so čili zdrojáky nemám.

Podle toho návodu je právě pro mojí HW revizi. Jedná se o raspberry pi zero w

Zbytek dodám později.

marty

Re:Internetové radio - Raspberry pi - problém s lcdproc
« Odpověď #29 kdy: 25. 12. 2017, 18:09:55 »
Je tam opravdu jen jedna mezera, navíc zrovna s tímhle řádkem jsem stejně nic nedělal a předtím to tuhle chybu neházelo.