Для школьного проекта нам нужно заставить платформу двигаться вверх и вниз, используя шаговый двигатель, связанный с потенциометром, и отображать некоторые значения (расстояние до платформы и потенциометр значений) на экране 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()