Подключение Nokia5510 с потенциометром, шаговым двигателем, ультразвуковым дальномером и Raspberry Pi - PullRequest
0 голосов
/ 23 апреля 2020

Для школьного проекта нам нужно заставить платформу двигаться вверх и вниз, используя шаговый двигатель, связанный с потенциометром, и отображать некоторые значения (расстояние до платформы и потенциометр значений) на экране NOKIA5510. Я просто подключил свой ЖК-дисплей к другим частям сборки, и когда я захотел проверить, правильно ли я подключил его, я получил следующую ошибку:

Traceback (последний вызов был последним): файл "Alles.py", строка 70, в disp = LCD.PCD8544 (D C, RST, spi = SPI.SpiDev (SPI_PORT, SPI_DEVICE, max_speed_hz = 4000000)) Файл "/usr/local/lib/python3.7/dist-packages /Adafruit_Nokia_LCD-0.2.0-py3.7.egg/Adafruit_Nokia_LCD/PCD8544.py ", строка 60, в init файле" /usr/local/lib/python3.7/dist-packages/ Adafruit_GPIO-1.0.4-py3.7.egg / Adafruit_GPIO / GPIO.py ", строка 418, в файле get_platform_gpio" /usr/local/lib/python3.7/dist-packages/Adafruit_GPIO-1.0.4-py3 .7.egg / Adafruit_GPIO / GPIO.py ", строка 172, в init ValueError: Другой режим уже установлен!

Мой код:

import RPi.GPIO as GPIO
import time
import spidev 
import PIL
import Adafruit_Nokia_LCD as LCD
import Adafruit_GPIO.SPI as SPI
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont

#motor input
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)

GPIO.setup(18, GPIO.OUT)
GPIO.setup(22, GPIO.OUT)
GPIO.setup(24, GPIO.OUT)
GPIO.setup(26, GPIO.OUT)

def draaienomhoog():
    full_step = {18:[1,0,0,1,1,0,0,1],
                22:[1,1,0,0,1,1,0,0],
                24:[0,1,1,0,0,1,1,0],
                26:[0,0,1,1,0,0,1,1]}

    for x in range(8):
        for k, i in full_step.items():
            GPIO.output(k, i[x])
            time.sleep(0.0004)


def draaienomlaag():
    full_step = {18:[0,0,1,1,0,0,1,1],
                22:[0,1,1,0,0,1,1,0],
                24:[1,1,0,0,1,1,0,0],
                26:[1,0,0,1,1,0,0,1]}

    for x in range(8):
        for k, i in full_step.items():
            GPIO.output(k, i[x])
            time.sleep(0.0004)


spi = spidev.SpiDev() # create spi object
spi.open(0,0) # open spi port 0, device CS0 pin 24
spi.max_speed_hz=(1000000) 

def readadc(adcnum): 
    if ((adcnum > 7) or (adcnum < 0)): 
        return -1 
    r = spi.xfer2([1,(8+adcnum)<<4,0]) 
    adcout = ((r[1]&3) << 8) + r[2] 
    return adcout 

TRIG = 11
ECHO = 12

GPIO.setup(TRIG, GPIO.OUT)
GPIO.setup(ECHO, GPIO.IN)



#hardware SPI config:
DC = 16 # data/control
RST = 18    # reset
SPI_PORT = 0     # SPI port 0   
SPI_DEVICE = 1  # CS1 pin26 

# Hardware SPI usage:
disp = LCD.PCD8544(DC, RST, spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE, max_speed_hz=4000000))
image = Image.new('1', (LCD.LCDWIDTH, LCD.LCDHEIGHT)) 
disp.begin(contrast=30)
font = ImageFont.load_default()
draw = ImageDraw.Draw(image)
# clear the image.
draw.rectangle((0,0,LCD.LCDWIDTH,LCD.LCDHEIGHT), outline=255, fill=255)
nummer=4
# Write some text.
draw.text((1,0), ' Thomasmore ', font=font)
draw.text((1,8), ' IT factory ', font=font)
draw.text((1,16), ' Kleinhoefstr. ', font=font)
draw.text((1,24), ' ' + (str(nummer)), font=font)
disp.image(image)
disp.display()


PotProcent = 0
tmp0 = 0
tmp1 = 0
while True:
    tmp0=readadc(0) #waarde potmeter
    if not tmp1-1 <= tmp0 <= tmp1+1:
        tmp1 = tmp0
    vorige = PotProcent
    PotProcent= (tmp1 * 100) / 1023 
    verschil = PotProcent - vorige
    verschilDraaien = verschil/100
    if verschil > 0 :
        hoeveelDraaien = verschilDraaien*256
        hoeveelDraaien = round(hoeveelDraaien, 2)
        for x in range(int(hoeveelDraaien)): # 256 is 1 keer 360°, 512 2 keer ...
            draaienomhoog()
    elif verschil < 0 :
        verschilDraaien*=-1
        hoeveelDraaien = verschilDraaien*256
        hoeveelDraaien = round(hoeveelDraaien, 2)
        for x in range(int(hoeveelDraaien)): # 256 is 1 keer 360°, 512 2 keer ...
            draaienomlaag()

    #afstand berekenen
    GPIO.output(TRIG, GPIO.LOW)
    time.sleep(2)

    GPIO.output(TRIG, GPIO.HIGH)
    time.sleep(0.00001)
    GPIO.output(TRIG, GPIO.LOW)
    while GPIO.input(ECHO)==0:
        pulse_start = time.time()    #laatste gekende moment dat pulse low was
    while GPIO.input(ECHO)==1:
        pulse_end = time.time()      #laatste gekende moment dat pulse hoog was
    pulse_duration = pulse_end - pulse_start   #tijdspanne van pulse
    afstand = pulse_duration *17150 #tijd omzetten naar afstand
    afstand = round(afstand, 2)  #afronden op 2 cijfers na kommen
    time.sleep(1)
GPIO.cleanup()
...