2017-02-02 23 views
0

Итак, я программирую на python на своем пи. Через библиотеку ciiid я соединяю свой контроллер wii. Это прекрасно работает.GPIO-контакты больше не будут работать в середине моей программы

Но, после того как мой контроллер wii подключает через Bluetooth, внезапно светодиоды не будут работать. Эта же строка кода работает перед подключением, но после подключения не работает. Как это возможно?

Мой полный код:

if __name__ == '__main__': 
from sys import path 

path.append("..") 


import RPi.GPIO as GPIO 
from time import sleep 
import os 
import cwiid 
from MotorPwm2 import MotorPwm 
from GPIOFuckUp import GPIOFuckUp 
from Basis import Basis 

GPIOFuckUp() 

GPIO.setmode(GPIO.BCM) 
GPIO.setwarnings(False) 

motor = MotorPwm([10, 9, 8, 7]) 
basis = Basis() 
startbool = False 

running = True 

left_light = 21 
right_light = 20 
left_siren = 16 
right_siren = 26 

GPIO.setup(left_light, GPIO.OUT) 
GPIO.setup(right_light, GPIO.OUT) 
GPIO.setup(left_siren, GPIO.OUT) 
GPIO.setup(right_siren, GPIO.OUT) 

left_pin = GPIO.PWM(left_light, 1000) 
right_pin = GPIO.PWM(right_light, 1000) 
left_pin_s = GPIO.PWM(left_siren, 1000) 
right_pin_s = GPIO.PWM(right_siren, 1000) 

left_pin.start(100) 
right_pin.start(100) 
left_pin_s.start(0) 
right_pin_s.start(0) 

# Code above works. Leds turn on, with no problems. 

def turn_on_left(): 
    dim_left(100) 

def turn_on_right(): 
    dim_right(100) 

def turn_on_lefts(): 
    dim_lefts(100) 

def turn_on_rights(): 
    dim_rights(100) 

def turn_on(): 
    print 'aan' 
    dim_left(100) 
    dim_right(100) 

def turn_off_lefts(): 
    dim_lefts(0) 

def turn_off_rights(): 
    dim_rights(0) 

def turn_off_left(): 
    dim_left(0) 

def turn_off_right(): 
    dim_right(0) 

def turn_off(): 
    dim_left(0) 
    dim_right(0) 

def dim(percentage): 
    dim_left(percentage) 
    dim_right(percentage) 

def dim_left(percentage): 
    left_pin.ChangeDutyCycle(percentage) 
    print 'left' 

def dim_right(percentage): 
    right_pin.ChangeDutyCycle(percentage) 
    print 'right' 

def dim_lefts(percentage): 
    left_pin_s.ChangeDutyCycle(percentage) 

def dim_rights(percentage): 
    right_pin_s.ChangeDutyCycle(percentage) 

def siren_loop(): 
    while running: 
     dim_lefts(100) 
     dim_rights(100) 
     sleep(0.05) 

     turn_off_lefts() 
     turn_off_rights() 
     sleep(0.05) 

     dim_rights(100) 
     sleep(0.05) 

     turn_on_rights() 
     sleep(0.05) 

     dim_lefts(100) 
     sleep(0.05) 

     dim_lefts(0) 
     sleep(0.05) 

# Def things above also work. Copied the code in another file just to try 
the leds, and that also worked. 


button_delay = 0.1 

print 'Press 1 + 2 on your Wii Remote now ...' 

# Here the controller is connecting. After it is connected the leds turn of 
# Before the following print lines are printed. 

# Connect to the Wii Remote. If it times out 
# then quit. 
try: 
    wii = cwiid.Wiimote() 
    #GPIO.output(PIN_LED, 0) 

except RuntimeError: 
    print "Error opening wiimote connection" 
    #GPIO.output(PIN_LED, 0) 
    # Uncomment this line to shutdown the Pi if pairing fails 
    os.system("sudo reboot") 
    quit() 

print 'Wii Remote connected...\n' 
print 'Press some buttons!\n' 
print 'Press PLUS and MINUS together to disconnect and quit.\n' 


wii.rpt_mode = cwiid.RPT_BTN 


while True: 
    buttons = wii.state['buttons'] 

    # If Plus and Minus buttons pressed 
    # together then rumble and quit. 
    if (buttons - cwiid.BTN_PLUS - cwiid.BTN_MINUS == 0): 
     print '\nClosing connection ...' 
     wii.rumble = 1 
     #GPIO.output(PIN_LED, 1) 
     sleep(1) 
     wii.rumble = 0 
     #GPIO.output(PIN_LED, 0) 
     os.system("sudo reboot") 
     exit(wii) 


    # Button presses below work and print the correct lines. Just no leds :(

    if (buttons & cwiid.BTN_LEFT): 
     print 'Left pressed' 
     motor.left_forward(50) 
     sleep(button_delay) 

    elif (buttons & cwiid.BTN_RIGHT): 
     print 'Right pressed' 
     motor.right_forward(50) 
     sleep(button_delay) 

    elif (buttons & cwiid.BTN_UP): 
     print 'Up pressed' 
     motor.forward(100) 
     sleep(button_delay) 

    elif (buttons & cwiid.BTN_DOWN): 
     print 'Down pressed' 
     motor.backward(100) 
     sleep(button_delay) 

    elif (buttons & cwiid.BTN_A): 
     print 'A' 
     if startbool == False: 
      print 'start aan' 
      startbool = True 
      sleep(0.5) 
     else: 
      print 'start uit' 
      startbool = False 
      sleep(0.5) 

    elif (buttons & cwiid.BTN_1): 
     if running: 
      turn_on() 
      sleep(5) 
     print '1' 
     print 'Licht 5 sec aan' 

    elif (buttons & cwiid.BTN_2): 
     print '2' 
     print 'sirene 5 sec aan' 
     siren_loop() 
     sleep(5) 


    else: 
     GPIO.cleanup() 

Так, например, начальные значения включить светодиоды при запуске программы. Это происходит, светодиоды загораются. Но затем, после подключения Wi-Fi, они выключаются и их невозможно включить снова.

+0

Не могли бы вы добавить некоторые комментарии к вашим строк кода, чтобы сделать его легче понять, какой раздел сломана? Спасибо, –

+0

Обновлено с некоторыми комментариями. – Noralie

+0

Может быть, что первоначальное соединение не работает? Я вижу, что у вас есть условие исключений во время выполнения, которое перезагружает pi. Временно вы можете изменить это на инструкцию печати, чтобы сэкономить время. Просто попробуйте распечатать «Connection Failed» вместо возможной перезагрузки. Если вы видите этот текст, это означает, что ваш малиновый pi перезагружается, и поэтому программа останавливается. Пожалуйста, дайте мне знать, что произойдет, спасибо. –

ответ

0

После того как вы попробовали еще несколько часов, я, наконец, нашел проблему.

Последняя строка говорит:

else: 
    GPIO.cleanup() 

Какие сброшены все контакты, следовательно, они не работали. Удаление другого заставило все работать снова.

Теперь я знаю, проблема, кажется, так просто XD