Уведомления

Группа в Telegram: @pythonsu

#1 Март 23, 2016 10:26:55

Lonf
Зарегистрирован: 2015-10-18
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с с автозапуском скрипта на Raspberry Pi

Есть программа для Raspberry Pi, которая сканирует накопители, выводит список файлов на текстовый экран. Список можно листать тактовыми кнопками. При ручном запуске программа работает нормально. Добавил программу в автозапуск и при нажатии на кнопку выводит “Error!”
В автозапуск добавлял так:

sudo nano /etc/xdg/lxsession/LXDE-pi/autostart 
Потом дописал строчку
@sudo python /home/pi/prog.py
Код самой программы:
#!/usr/bin/python
#import
import RPi.GPIO as GPIO
import os
import socket
import fcntl
import struct
import time
from time import gmtime, strftime, sleep
arr = []
for top, dirs, files in os.walk('/media/'):
  for nm in files:       
        arr.append(nm)
images1 = filter(lambda x: x.endswith('.STL'), arr)
images2 = filter(lambda x: x.endswith('.stl'), arr)
images = images1+images2
# Define GPIO to LCD mapping
LCD_RS = 7
LCD_E  = 8
LCD_D4 = 25
LCD_D5 = 24
LCD_D6 = 23
LCD_D7 = 18
# Define some device constants
LCD_WIDTH = 16    # 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
# Timing constants
E_PULSE = 0.0005
E_DELAY = 0.0005
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
  # Initialise display
  lcd_init()
  i=0
  GPIO.setmode(GPIO.BCM)
  GPIO.setup(21, GPIO.IN, pull_up_down=GPIO.PUD_UP)
  GPIO.setup(16, GPIO.IN, pull_up_down=GPIO.PUD_UP)
  while True:
    try:
        if GPIO.input(21) == False:    #обработка кнопки "вверх"
          i=i+1
          j=i+1
          g=len(images)
          g=int(g)
          if j < g:
            lcd_string(images[i], LCD_LINE_1)
            lcd_string(images[j], LCD_LINE_2)
          else:
            i = g - 2
            j = g - 1
            lcd_string(images[i], LCD_LINE_1)
            lcd_string(images[j], LCD_LINE_2)
        if GPIO.input(16) == False:    #обработка кнопки "вниз"
	  i=i-1
	  j=i+1
	  k=abs(i)
	  if k == i:
            lcd_string(images[i], LCD_LINE_1)
            lcd_string(images[j], LCD_LINE_2)
          else:
            i=0
            j=1
            lcd_string(images[i], LCD_LINE_1)
            lcd_string(images[j], LCD_LINE_2)
        sleep(0.2)
    except KeyboardInterrupt:
        exit()
		  
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 = 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
  lcd_toggle_enable()
  # 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
  lcd_toggle_enable()
def lcd_toggle_enable():
  # Toggle enable
  time.sleep(E_DELAY)
  GPIO.output(LCD_E, True)
  time.sleep(E_PULSE)
  GPIO.output(LCD_E, False)
  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)
if __name__ == '__main__':
  try:
    main()
  except KeyboardInterrupt:
    pass
  finally:
    lcd_byte(0x01, LCD_CMD)
    lcd_string("Error!",LCD_LINE_1)
    GPIO.cleanup()

На экран выводится “Error!”. В чем может быть проблема? Возможно, нужно перед выводом на экран элемента массива нужно принудительно преобразовывать его в str? Но при ручном запуске все работает и без преобразования.

Офлайн

#2 Март 23, 2016 11:26:28

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Проблема с с автозапуском скрипта на Raspberry Pi

Сделайте хоть какое нибудь логгирование что бы получить traceback ошибки. Может каких нибудь unix прав не хватает. Ну и изменить код, что бы проблемные места не скрывались

import traceback
try:
    some_code_here
except KeyboardException:
    exit()
except Exception:
    log_error  # print(traceback.format_exc())
finally:
    some_ending_actions



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version