Hallo liebe Leute, ich habe vor längere Zeit mal einen Snackautomaten für meinen Dart/Hobbyraum gemacht.
Nicht dolles, paar Spindeln mit Snacks für die Jungs. Über das DisplayTouch vom Raspberry kann mann im Programm das jeweilige Bild anklicken und ein Snack kommt.
Funktioniert alles Super. Zwar langsam aber es geht.
Da es alle so toll finden und andauernd einfach drauf drücken und die Snacks immer raus kommen. ( Freunde und Kinder finde besonders toll
)
Wollte ich es so machen, dass man den Snack auswählen kann, aber der Motor sich erst dreht, wenn die Rfid Karte an den Leser gehalten wurde.
Dazu habe ich einem Freund den Leser mit einer Karte abgekauft für 5 Euro.
Jetzt aber zu meinem Problem.
Ich habe aus dem Internet eine Anleitung gefunden, diese auch angewandt. Wenn ich diese einzeln Starte, kommt ein kleines Fenster, dann kann ich die Karte dranhalten und auf dem Display steht Karte funktioniert bla bla bla. Das hat der Youtuber gemacht, damit man sehen kann, ob die Karte Funktioniert.
Ich weiß aber nicht, wie ich es machen muss, damit der Motor kurz wartet auf Eingabe oder dran halten der Karte.
Ich suche seit paar Wochen im Internet und habe so oft versucht einige Sachen zu ändern oder selber zu schreiben. Leide bin ich kein Profi wie der ein oder andere hier.
Ich hoffe ihr lacht mich nicht aus, oder schreibt such weiter.
vielleicht ist ja einer dabei, der mir helfen kann, oder sagen kann, was ich schreiben muss.
Im weiteren Hänge ich euch folgendes an, da ich nicht ganz verstehe was dort passiert. Ihr es aber seht.
1. Programm vom Youtube um Karte zu prüfen
2 Den Programmtext vom Import MFCR522.py
3 Das Programm von meinem kleinen Snackautomat
Hier der Programmcode zu 1:
#!/usr/bin/env python[/color]# -*- coding: utf8 -*-import RPi.GPIO as GPIOimport MFRC522import signalimport timecontinue_reading = True # Capture SIGINT for cleanup when the script is aborteddef end_read(signal,frame): global continue_reading print "Ctrl+C captured, ending read." continue_reading = False GPIO.cleanup()# Hook the SIGINTsignal.signal(signal.SIGINT, end_read)# Create an object of the class MFRC522MIFAREReader = MFRC522.MFRC522()# Welcome messageprint "Bitte Produktauswahl bezahlen"while continue_reading: # Scan for cards (status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL) # If a card is found if status == MIFAREReader.MI_OK: print "Bitte warten" time.sleep(5) print "Zahlung wird geprüft" time.sleep(5) print "Zahlung genehmigt" time.sleep(5) print "Ihr Produkt wird ausgeworfen" print "Vielen Danke für ihren Kauf" # Get the UID of the card (status,uid) = MIFAREReader.MFRC522_Anticoll() # If we have the UID, continue if status == MIFAREReader.MI_OK: # Print UID print "Zahlungsprüfung: "+str(uid[0])+","+str(uid[1])+","+str(uid[2])+","+str(uid[3]) # This is the default key for authentication key = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] # Select the scanned tag MIFAREReader.MFRC522_SelectTag(uid) # Authenticate status = MIFAREReader.MFRC522_Auth(MIFAREReader.PICC_AUTHENT1A, 8, key, uid) # Check if authenticated if status == MIFAREReader.MI_OK: MIFAREReader.MFRC522_Read(8) MIFAREReader.MFRC522_StopCrypto1() else: print "Zahlungsfehler"[color=#333333]
[/color]
Hier der Programmcode zu 2:
#!/usr/bin/env python# -*- coding: utf8 -*-import RPi.GPIO as GPIOimport spiimport signalimport time class MFRC522: NRSTPD = 22 MAX_LEN = 16 PCD_IDLE = 0x00 PCD_AUTHENT = 0x0E PCD_RECEIVE = 0x08 PCD_TRANSMIT = 0x04 PCD_TRANSCEIVE = 0x0C PCD_RESETPHASE = 0x0F PCD_CALCCRC = 0x03 PICC_REQIDL = 0x26 PICC_REQALL = 0x52 PICC_ANTICOLL = 0x93 PICC_SElECTTAG = 0x93 PICC_AUTHENT1A = 0x60 PICC_AUTHENT1B = 0x61 PICC_READ = 0x30 PICC_WRITE = 0xA0 PICC_DECREMENT = 0xC0 PICC_INCREMENT = 0xC1 PICC_RESTORE = 0xC2 PICC_TRANSFER = 0xB0 PICC_HALT = 0x50 MI_OK = 0 MI_NOTAGERR = 1 MI_ERR = 2 Reserved00 = 0x00 CommandReg = 0x01 CommIEnReg = 0x02 DivlEnReg = 0x03 CommIrqReg = 0x04 DivIrqReg = 0x05 ErrorReg = 0x06 Status1Reg = 0x07 Status2Reg = 0x08 FIFODataReg = 0x09 FIFOLevelReg = 0x0A WaterLevelReg = 0x0B ControlReg = 0x0C BitFramingReg = 0x0D CollReg = 0x0E Reserved01 = 0x0F Reserved10 = 0x10 ModeReg = 0x11 TxModeReg = 0x12 RxModeReg = 0x13 TxControlReg = 0x14 TxAutoReg = 0x15 TxSelReg = 0x16 RxSelReg = 0x17 RxThresholdReg = 0x18 DemodReg = 0x19 Reserved11 = 0x1A Reserved12 = 0x1B MifareReg = 0x1C Reserved13 = 0x1D Reserved14 = 0x1E SerialSpeedReg = 0x1F Reserved20 = 0x20 CRCResultRegM = 0x21 CRCResultRegL = 0x22 Reserved21 = 0x23 ModWidthReg = 0x24 Reserved22 = 0x25 RFCfgReg = 0x26 GsNReg = 0x27 CWGsPReg = 0x28 ModGsPReg = 0x29 TModeReg = 0x2A TPrescalerReg = 0x2B TReloadRegH = 0x2C TReloadRegL = 0x2D TCounterValueRegH = 0x2E TCounterValueRegL = 0x2F Reserved30 = 0x30 TestSel1Reg = 0x31 TestSel2Reg = 0x32 TestPinEnReg = 0x33 TestPinValueReg = 0x34 TestBusReg = 0x35 AutoTestReg = 0x36 VersionReg = 0x37 AnalogTestReg = 0x38 TestDAC1Reg = 0x39 TestDAC2Reg = 0x3A TestADCReg = 0x3B Reserved31 = 0x3C Reserved32 = 0x3D Reserved33 = 0x3E Reserved34 = 0x3F serNum = [] def __init__(self, dev='/dev/spidev0.0', spd=1000000): spi.openSPI(device=dev,speed=spd) GPIO.setmode(GPIO.BOARD) GPIO.setup(22, GPIO.OUT) GPIO.output(self.NRSTPD, 1) self.MFRC522_Init() def MFRC522_Reset(self): self.Write_MFRC522(self.CommandReg, self.PCD_RESETPHASE) def Write_MFRC522(self, addr, val): spi.transfer(((addr<<1)&0x7E,val)) def Read_MFRC522(self, addr): val = spi.transfer((((addr<<1)&0x7E) | 0x80,0)) return val[1] def SetBitMask(self, reg, mask): tmp = self.Read_MFRC522(reg) self.Write_MFRC522(reg, tmp | mask) def ClearBitMask(self, reg, mask): tmp = self.Read_MFRC522(reg); self.Write_MFRC522(reg, tmp & (~mask)) def AntennaOn(self): temp = self.Read_MFRC522(self.TxControlReg) if(~(temp & 0x03)): self.SetBitMask(self.TxControlReg, 0x03) def AntennaOff(self): self.ClearBitMask(self.TxControlReg, 0x03) def MFRC522_ToCard(self,command,sendData): backData = [] backLen = 0 status = self.MI_ERR irqEn = 0x00 waitIRq = 0x00 lastBits = None n = 0 i = 0 if command == self.PCD_AUTHENT: irqEn = 0x12 waitIRq = 0x10 if command == self.PCD_TRANSCEIVE: irqEn = 0x77 waitIRq = 0x30 self.Write_MFRC522(self.CommIEnReg, irqEn|0x80) self.ClearBitMask(self.CommIrqReg, 0x80) self.SetBitMask(self.FIFOLevelReg, 0x80) self.Write_MFRC522(self.CommandReg, self.PCD_IDLE); while(i<len(sendData)): self.Write_MFRC522(self.FIFODataReg, sendData[i]) i = i+1 self.Write_MFRC522(self.CommandReg, command) if command == self.PCD_TRANSCEIVE: self.SetBitMask(self.BitFramingReg, 0x80) i = 2000 while True: n = self.Read_MFRC522(self.CommIrqReg) i = i - 1 if ~((i!=0) and ~(n&0x01) and ~(n&waitIRq)): break self.ClearBitMask(self.BitFramingReg, 0x80) if i != 0: if (self.Read_MFRC522(self.ErrorReg) & 0x1B)==0x00: status = self.MI_OK if n & irqEn & 0x01: status = self.MI_NOTAGERR if command == self.PCD_TRANSCEIVE: n = self.Read_MFRC522(self.FIFOLevelReg) lastBits = self.Read_MFRC522(self.ControlReg) & 0x07 if lastBits != 0: backLen = (n-1)*8 + lastBits else: backLen = n*8 if n == 0: n = 1 if n > self.MAX_LEN: n = self.MAX_LEN i = 0 while i<n: backData.append(self.Read_MFRC522(self.FIFODataReg)) i = i + 1; else: status = self.MI_ERR return (status,backData,backLen) def MFRC522_Request(self, reqMode): status = None backBits = None TagType = [] self.Write_MFRC522(self.BitFramingReg, 0x07) TagType.append(reqMode); (status,backData,backBits) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, TagType) if ((status != self.MI_OK) | (backBits != 0x10)): status = self.MI_ERR return (status,backBits) def MFRC522_Anticoll(self): backData = [] serNumCheck = 0 serNum = [] self.Write_MFRC522(self.BitFramingReg, 0x00) serNum.append(self.PICC_ANTICOLL) serNum.append(0x20) (status,backData,backBits) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE,serNum) if(status == self.MI_OK): i = 0 if len(backData)==5: while i<4: serNumCheck = serNumCheck ^ backData[i] i = i + 1 if serNumCheck != backData[i]: status = self.MI_ERR else: status = self.MI_ERR return (status,backData) def CalulateCRC(self, pIndata): self.ClearBitMask(self.DivIrqReg, 0x04) self.SetBitMask(self.FIFOLevelReg, 0x80); i = 0 while i<len(pIndata): self.Write_MFRC522(self.FIFODataReg, pIndata[i]) i = i + 1 self.Write_MFRC522(self.CommandReg, self.PCD_CALCCRC) i = 0xFF while True: n = self.Read_MFRC522(self.DivIrqReg) i = i - 1 if not ((i != 0) and not (n&0x04)): break pOutData = [] pOutData.append(self.Read_MFRC522(self.CRCResultRegL)) pOutData.append(self.Read_MFRC522(self.CRCResultRegM)) return pOutData def MFRC522_SelectTag(self, serNum): backData = [] buf = [] buf.append(self.PICC_SElECTTAG) buf.append(0x70) i = 0 while i<5: buf.append(serNum[i]) i = i + 1 pOut = self.CalulateCRC(buf) buf.append(pOut[0]) buf.append(pOut[1]) (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buf) if (status == self.MI_OK) and (backLen == 0x18): print "Size: " + str(backData[0]) return backData[0] else: return 0 def MFRC522_Auth(self, authMode, BlockAddr, Sectorkey, serNum): buff = [] # First byte should be the authMode (A or B) buff.append(authMode) # Second byte is the trailerBlock (usually 7) buff.append(BlockAddr) # Now we need to append the authKey which usually is 6 bytes of 0xFF i = 0 while(i < len(Sectorkey)): buff.append(Sectorkey[i]) i = i + 1 i = 0 # Next we append the first 4 bytes of the UID while(i < 4): buff.append(serNum[i]) i = i +1 # Now we start the authentication itself (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_AUTHENT,buff) # Check if an error occurred if not(status == self.MI_OK): print "AUTH ERROR!!" if not (self.Read_MFRC522(self.Status2Reg) & 0x08) != 0: print "AUTH ERROR(status2reg & 0x08) != 0" # Return the status return status def MFRC522_StopCrypto1(self): self.ClearBitMask(self.Status2Reg, 0x08) def MFRC522_Read(self, blockAddr): recvData = [] recvData.append(self.PICC_READ) recvData.append(blockAddr) pOut = self.CalulateCRC(recvData) recvData.append(pOut[0]) recvData.append(pOut[1]) (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, recvData) if not(status == self.MI_OK): print "Error while reading!" i = 0 if len(backData) == 16: print "Sector "+str(blockAddr)+" "+str(backData) def MFRC522_Write(self, blockAddr, writeData): buff = [] buff.append(self.PICC_WRITE) buff.append(blockAddr) crc = self.CalulateCRC(buff) buff.append(crc[0]) buff.append(crc[1]) (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buff) if not(status == self.MI_OK) or not(backLen == 4) or not((backData[0] & 0x0F) == 0x0A): status = self.MI_ERR print str(backLen)+" backdata &0x0F == 0x0A "+str(backData[0]&0x0F) if status == self.MI_OK: i = 0 buf = [] while i < 16: buf.append(writeData[i]) i = i + 1 crc = self.CalulateCRC(buf) buf.append(crc[0]) buf.append(crc[1]) (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE,buf) if not(status == self.MI_OK) or not(backLen == 4) or not((backData[0] & 0x0F) == 0x0A): print "Error while writing" if status == self.MI_OK: print "Data written" def MFRC522_DumpClassic1K(self, key, uid): i = 0 while i < 64: status = self.MFRC522_Auth(self.PICC_AUTHENT1A, i, key, uid) # Check if authenticated if status == self.MI_OK: self.MFRC522_Read(i) else: print "Authentication error" i = i+1 def MFRC522_Init(self): GPIO.output(self.NRSTPD, 1) self.MFRC522_Reset(); self.Write_MFRC522(self.TModeReg, 0x8D) self.Write_MFRC522(self.TPrescalerReg, 0x3E) self.Write_MFRC522(self.TReloadRegL, 30) self.Write_MFRC522(self.TReloadRegH, 0) self.Write_MFRC522(self.TxAutoReg, 0x40) self.Write_MFRC522(self.ModeReg, 0x3D) self.AntennaOn()
Hier der Programmcode zu 3
# -*- coding: utf-8 -*-from Tkinter import * #Benutzeroberflächeimport tkFontimport globimport smbus #I2C Busimport time #Wartezeit/Verzögerungimport sysimport RPi.GPIO as gpio, signal #Input/Output Schnittstelleimport smtplib#Email Bib.import MFRC522import signal #_______________________________________________________________________________from email.mime.text import MIMETextfrom email.header import Headerfrm = 'Hobbyraum>'to = 'Empfänger<extra weggemacht da privat>'subj = 'Übertemperatur'subj2= 'Ware Nachfuellen'#_______________________________________________________________________________# 1-Wire Temperatursensor wird ausgelesengpio.setmode(gpio.BCM)gpio.setwarnings(False)gpio.setup(4, gpio.IN, pull_up_down=gpio.PUD_UP)print'Warte auf Initialisierung TempSensor'base_dir ='/sys/bus/w1/devices/'WIRE='/sys/devices/w1_bus_master1/28-80000003aa6d/w1_slave'#_______________________________________________________________________________# Temperatur alle 30 s auslesen und anzeigendef temp(): with open(WIRE) as f: f.readline() # Erste Zeile ignorieren s=f.readline() # zweite Zeile n=s.find('t=') # dort 't=' finden if(n>0): t= float(s[n+2:])/1000 lbl2.configure(text='Temperatur: %6.1f°C' %t) root.after(30000, temp) # Messung neustarten nach 30 Sekunden # Bei mehr als 30°C - Automatische Email an den Betreiber time.sleep(10.0) if(t>30): #Bedingung try: mime = MIMEText(msg,'plain','utf-8') mime['From']= frm mime['To']= to mime['Subject']= Header(subj,'utf-8') server=smtplib.SMTP('smtp.gmail.com') #Einwählen auf Website server.starttls() #Verschlüsselung #Verschlüsselung server.login('weggemacht da privat') #Benutzername - Passwort server.sendmail(frm, [to],mime.as_string()) server.quit() print'Email Temp gesendet' except: print("Email konnte nicht gesendet werden.",sys.exc_info()) #_______________________________________________________________________________ #Initialisierung und Adressierung SMBus - MCP23017 b = smbus.SMBus(1) # System Management Bus 1address = 0x20 # I2C Adresse Portexpander MCP23017def set(row,data): b.write_byte_data(0x20,0x00,0x00) # MCP23017 Bank A Ausgang b.write_byte_data(0x20,0x01,0x00) # MCP23017 Bank B Ausgang write = b.write_byte_data(address,row,data)#_______________________________________________________________________________#Ansteuerung und Freigabe Motor1 - Twix AusgabecounterTwix=0def MotorTwix(): # Funktion Motor Twix global counterTwix counterTwix +=1 print counterTwix if counterTwix < 9: print'Ausgabe Twix' # Ausgabe Text in Konsole row=0x14 # Bank A wird ausgewählt i = 0 # Hilfsvariable while i < 513: # 512 Schritte - 360 Grad i += 1 # Variable i +1 pro durschlauf set(row,0x80) # Ansteuerung Motorspulen (1000 000) time.sleep(0.001) # Zeitverzoegerung - 1ms set(row,0xC0) # (1100 0000) time.sleep(0.001) set(row,0x40) # (0100 0000) time.sleep(0.001) set(row,0x60) # (0110 0000) time.sleep(0.001) set(row,0x20) # (0010 0000) time.sleep(0.001) set(row,0x30) # (0011 0000) time.sleep(0.001) set(row,0x10) # (0001 0000) time.sleep(0.001) set(row,0x90) # (1001 0000) time.sleep(0.001) set(row,0x00) if counterTwix == 7: mime = MIMEText(msg2,'plain','utf-8') mime['From']= frm mime['To']= to mime['Subject']= Header(subj2,'utf-8') server=smtplib.SMTP('smtp.gmail.com') #Einwählen auf Website server.starttls() #Verschlüsselung #Verschlüsselung server.login('weggemacht da privat') #Benutzername - Passwort server.sendmail(frm, [to],mime.as_string()) server.quit() print'Email Gesendet' return#_______________________________________________________________________________#Ansteuerung und Freigabe Motor2 - Snickers AusgabecounterSnickers=0def MotorSnickers(): global counterSnickers counterSnickers += 1 if counterSnickers < 9: print'Ausgabe Snickers' row=0x14 i = 0 while i < 513: # 512 Schritte - 360 Grad i += 1 set(row,0x08) time.sleep(0.001) set(row,0x0C) time.sleep(0.001) set(row,0x04) time.sleep(0.001) set(row,0x06) time.sleep(0.001) set(row,0x02) time.sleep(0.001) set(row,0x03) time.sleep(0.001) set(row,0x01) time.sleep(0.001) set(row,0x09) time.sleep(0.005) set(row,0x00) if counterSnickers == 7: mime = MIMEText(msg2,'plain','utf-8') mime['From']= frm mime['To']= to mime['Subject']= Header(subj2,'utf-8') server=smtplib.SMTP('smtp.gmail.com') #Einwählen auf Website server.starttls() #Verschlüsselung #Verschlüsselung server.login('weggemacht da privat') #Benutzername - Passwort server.sendmail(frm, [to],mime.as_string()) server.quit() return#_______________________________________________________________________________#Ansteuerung und Freigabe Motor3 - Mars AusgabecounterMars=0def MotorMars(): global counterMars counterMars +=1 if counterMars < 9: print'Ausgabe Mars' row=0x15 # Bank B wird ausgewählt i = 0 while i < 513: # 512 Schritte - 360 Grad i += 1 set(row,0x80) time.sleep(0.001) # Zeitverzoegerung - 1ms set(row,0xC0) time.sleep(0.001) set(row,0x40) time.sleep(0.001) set(row,0x60) time.sleep(0.001) set(row,0x20) time.sleep(0.001) set(row,0x30) time.sleep(0.001) set(row,0x10) time.sleep(0.001) set(row,0x90) time.sleep(0.001) set(row,0x00) if counterMars == 7: mime = MIMEText(msg2,'plain','utf-8') mime['From']= frm mime['To']= to mime['Subject']= Header(subj2,'utf-8') server=smtplib.SMTP('smtp.gmail.com') #Einwählen auf Website server.starttls() #Verschlüsselung #Verschlüsselung server.login('weggemacht da privat') #Benutzername - Passwort server.sendmail(frm, [to],mime.as_string()) server.quit() return#_______________________________________________________________________________#Ansteuerung und Freigabe Motor4 - Kinderriegel AusgabecounterKinderriegel=0def MotorKinderriegel(): global counterKinderriegel counterKinderriegel += 1 if counterKinderriegel < 9: print'Ausgabe Kinderriegel' row=0x15 i = 0 while i < 513: # 512 Schritte - 360 Grad i += 1 set(row,0x08) time.sleep(0.001) set(row,0x0C) time.sleep(0.001) set(row,0x04) time.sleep(0.001) set(row,0x06) time.sleep(0.001) set(row,0x02) time.sleep(0.001) set(row,0x03) time.sleep(0.001) set(row,0x01) time.sleep(0.001) set(row,0x09) time.sleep(0.001) set(row,0x00) if counterKinderriegel == 7: mime = MIMEText(msg2,'plain','utf-8') mime['From']= frm mime['To']= to mime['Subject']= Header(subj2,'utf-8') server=smtplib.SMTP('smtp.gmail.com') #Einwählen auf Website server.starttls() #Verschlüsselung #Verschlüsselung server.login('') #Benutzername - Passwort server.sendmail(frm, [to],mime.as_string()) server.quit() return#_______________________________________________________________________________# Benutzeroberflächeroot = Tk()#root.attributes("-fullscreen", True) #Automatische Erstellung eines Fullscreen#root.wm_overrideredirect(True) #Titelleiste und Fensterahmen ausblendenroot.title("PS") #Fenster Überschriftroot.geometry('1200x750') #Fenster Größeroot.configure(bg="white") #Hintergrundfarbe Weißlbl1 = Label (root, bg="white", text="Hey Jungs, sucht euch etwas aus.")lbl2 = Label (root, bg="white") image1 = PhotoImage(file="/home/pi/Desktop/Images - Touch/Kinderriegel.png") image2 = PhotoImage(file="/home/pi/Desktop/Images - Touch/twix.png") image3 = PhotoImage(file="/home/pi/Desktop/Images - Touch/mars.png") image4 = PhotoImage(file="/home/pi/Desktop/Images - Touch/snickers.png")pw = Entry(root,)temp() #Temperatur auslesen, lbl2-Text einstellenc = Button(root, bd="0p", bg="white", image=image1, command=MotorKinderriegel)d = Button(root, bd="0p", bg="white", image=image2, command=MotorTwix)e = Button(root, bd="0p", bg="white", image=image3, command=MotorMars)f = Button(root, bd="0p", bg="white", image=image4, command=MotorSnickers)lbl1.pack() # Platzierung mit pack = zentriertlbl2.place(x=350, y=350) # Platzierung Temperaturausgabec.place(x=60, y=40) # Koordinaten Twix-Button auf dem Screend.place(x=500,y=40) # Koordinaten Snickers-Button auf dem Screene.place(x=60,y=200) # Koordinaten Mars-Button auf dem Screenf.place(x=500,y=200) # Koordinaten Kinderriegel-Button auf dem Screeng.place(x=400,y=200)root.mainloop()