Vatten gardin (5 / 6 steg)
Steg 5: kod
Programvara:För att PIC18F2445 ska fungera som en integrerad krets, skapade vi ett MPLab projekt med ett kallas python skript till att styra ventilen.
Original föreslog funktion:
Vår ursprungliga avsikt med detta projekt var att läsa bilder och översätta dem till vatten motsvarigheter. Vi försökte hitta bilder med låg pixelering så att de kunde återskapas. För att ladda upp och ställa in bilden som ett 8 X 8 rutnät (eftersom våra apparater hade åtta ventiler) använde vi python imaging library (PIL) att ladda upp våra schackrutiga jpeg bild.
Exempelkod:
importera bild def loadPic (filnamn ='checkerboard.jpeg ', tröskel = 3, storlek = (50,50)): klass TestTable(): def GetNumberRows(self): def GetNumberCols(self): def IsEmptyCell (själv, rader, col): def GetValue (själv, rader, col): def SättVärde (själv, rader, col, värde): def GetColLabelValue (self, col): def GetRowLabelValue (self, rad):
Importera tid
im =Image.open('checkerboard.jpeg').show()
x_length, y_length = im.size
Skriv ut [x_length, y_length]
x2_length = # 2 gav godtyckliga värden här, bara så att detta fungerar
y2_length = 2
x1_length = x1_length-x2_length
y1_length = y_length-y2_length
def __init__(self):
self.rowLabels = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
self.colLabels = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"]
returnera 10
returnera 10
returnera False
returnera 0
passera
återgå self.colLabels[col]
återgå self.rowLabels[row]
Vi har kunnat dela in bilden i ett rutnät medan tilldela de rader och kolumner tecken så de kunde refereras. Detta bestäms om en spot(row,column) var tom (vit) vi tilldelats ett get.color uppdrag att utse nummer 1 för svart och 0 för vit. Varje plats måste gå genom en om else-sats att göra sådana uppdrag.
En exempel-sats plats A1. Observera att efter tilldelningen av kommandot tilldelas också. I det här fallet kontrollerar den PIN-kod RB0.
Exempelkod:
om A1==(1,0):
cell_value = 1
skriva ut "vit"
SET_RBO = 1
set_rb0_callback()
Elif A1==(0,1):
cell_value = 1
skriva ut "vit"
SET_RBO = 1
set_rb0_callback()
Elif A1==(1,1):
cell_value = 1
skriva ut "vit"
SET_RB0 = 1
set_rb0_callback()
Elif A1==(0,0):
cell_value = 0
skriva ut "svart"
clr_rb0_callback()
Dessa kommandon upprepa för denna plats och de återstående stift RB0-RB7.
Efter att samla in information från bilden hade vi att skicka den via usb till vår MPLab kod. Vi gjorde detta genom att initiera usb och varje kommando.
Exempelkod:
från Tkinter import * SET_RB0 = 1#self.col_grid[0(cell_value=1)] = ctypes.cdll.LoadLibrary('usb.dll') buffert = ctypes.c_buffer(8) rot = Tk() def update_status(): def set_rb0_callback(): def clr_rb0_callback(): def set_rb1_callback(): def clr_rb1_callback(): def set_rb2_callback(): def clr_rb2_callback(): def set_rb3_callback(): def clr_rb3_callback(): def set_rb4_callback(): def clr_rb4_callback(): def set_rb5_callback(): def clr_rb5_callback(): def set_rb6_callback(): def clr_rb6_callback(): def set_rb7_callback(): def clr_rb7_callback(): def set_duty_callback(value):
importera ctypes
CLR_RB0 = 2#self.col_grid[0(cell_value=0)]
SET_RB1 = 3#self.col_grid[1(cell_value=1)]
CLR_RB1 = 4#self.col_grid[1(cell_value=0)]
SET_RB2 = 5#self.col_grid[2(cell_value=1)]
CLR_RB2 = 6#self.col_grid[2(cell_value=0)]
SET_RB3 = 7#self.col_grid[3(cell_value=1)]
CLR_RB3 = 8#self.col_grid[3(cell_value=0)]
SET_RB4 = 9#self.col_grid[4(cell_value=1)]
CLR_RB4 = 10#self.col_grid[4(cell_value=0)]
SET_RB5 = 11#self.col_grid[5(cell_value=1)]
CLR_RB5 = 12#self.col_grid[5(cell_value=0)]
SET_RB6 = 13#self.col_grid[6(cell_value=1)]
CLR_RB6 = 14#self.col_grid[6(cell_value=0)]
SET_RB7 = 15#self.col_grid[7(cell_value=1)]
CLR_RB7 = 16#self.col_grid[7(cell_value=0)]
SET_DUTY = 17
USB.Initialize()
root.title ("vatten gardin")
FM = Frame(root)
USB.control_transfer (dev, 0xC0, SET_RA8, 0, 0, 1, buffert)
status.configure (text = 'rb7 är för närvarande % d.' % ord(buffer[0]))
root.after (50, update_status)
USB.control_transfer (dev, 0x40, SET_RB0, 0, 0, 0, buffert)
USB.control_transfer (dev, 0x40, CLR_RB0, 0, 0, 0, buffert)
USB.control_transfer (dev, 0x40, SET_RB1, 0, 0, 0, buffert)
USB.control_transfer (dev, 0x40, CLR_RB1, 0, 0, 0, buffert)
USB.control_transfer (dev, 0x40, SET_RB2, 0, 0, 0, buffert)
USB.control_transfer (dev, 0x40, CLR_RB2, 0, 0, 0, buffert)
USB.control_transfer (dev, 0x40, SET_RB3, 0, 0, 0, buffert)
USB.control_transfer (dev, 0x40, CLR_RB3, 0, 0, 0, buffert)
USB.control_transfer (dev, 0x40, SET_RB4, 0, 0, 0, buffert)
USB.control_transfer (dev, 0x40, CLR_RB4, 0, 0, 0, buffert)
USB.control_transfer (dev, 0x40, SET_RB5, 0, 0, 0, buffert)
USB.control_transfer (dev, 0x40, CLR_RB5, 0, 0, 0, buffert)
USB.control_transfer (dev, 0x40, SET_RB6, 0, 0, 0, buffert)
USB.control_transfer (dev, 0x40, CLR_RB6, 0, 0, 0, buffert)
USB.control_transfer (dev, 0x40, SET_RB7, 0, 0, 0, buffert)
USB.control_transfer (dev, 0x40, CLR_RB7, 0, 0, 0, buffert)
USB.control_transfer (dev, 0x40, SET_DUTY, int(value), 0, 0, buffert)
Nu var det problem som vi möter från denna punkt på att vi inte kunde kalla en komplex samling av stiften med en timer-begäran som inte var cykliska. Vi har kunnat skapa våra egna enkla bilder som används för grundläggande upprepade förseningar som visade ventiler på och av, men ingen som kunde ta i insatsvaror från nätet. Därför vi inte kan sammanställa komplicerade bilder. Därför, vi ändrade kurs för att skapa enkla bilder som skulle kunna översättas till ventilens funktion.
Ny programvara mål
Vår programvara nya uppdrag var att ta enkla bilder som kan styras med en försening cykel.
Importera de lämpliga python bibliotek och tilldela värdet skall läsas i MPLab.
Exempelkod:
från Tkinter import * ##TEXTBOX_VAL = 17 Initiera USB. USB = ctypes.cdll.LoadLibrary('usb.dll') buffert = ctypes.c_buffer(8) Definiera önskade bilder som kommer att löpa under timer cykeln. def dot_callback(): def line_callback(): def checkerboard_callback(): def halfhalf_callback(): def set_duty_callback(value):
importera ctypes
##CLR_LED = 18
SET_DUTY = 17
DOT = 18
LINJE = 19
SCHACKRUTIGA = 20
HALF_HALF = 21
USB.Initialize()
USB.control_transfer (dev, 0x40, DOT, 0, 0, 0, buffert)
USB.control_transfer (dev, 0x40, linje, 0, 0, 0, buffert)
USB.control_transfer (dev, 0x40, SCHACKRUTOR, 0, 0, 0, buffert)
USB.control_transfer (dev, 0x40, HALF_HALF, 0, 0, 0, buffert)
USB.control_transfer (dev, 0x40, SET_DUTY, int(value), 0, 0, buffert)
def update_status():
root.after (50, update_status)
Göra en text rutan knapp så vi kan kontrollera vilka bilder kan visas vilken tid (aka genom att trycka på knappen!)
Exempelkod:
rot = Tk()
root.title('ProjectButtons')
FM = Frame(root)
##my_textbox = Entry(fm)
##my_textbox.pack(side = LEFT)
## Button(fm, text = 'GO!', command = send_textbox_val).pack (sida = vänster)
## Button(fm, text = 'CLR', command = CLR_display).pack (sida = höger)
Button(FM, text = 'DOT', Command = dot_callback).Pack (sida = höger)
Button(FM, text = 'LINE', Command = line_callback).Pack (sida = höger)
Button(FM, text = 'CHECKERBOARD', Command = checkerboard_callback).Pack (sida = höger)
Button(FM, text = 'HALF and HALF', Command = halfhalf_callback).Pack (sida = höger)
FM.Pack(Side = Top)
dutyslider = skala (rot, from_ = 0 och = 255, orientera = horisontell, showvalue = falskt, kommando = set_duty_callback)
dutyslider.set(128)
dutyslider.Pack(Side = Top)
Skriv ett fel om USB-enheten inte finns.
Exempelkod:
dev = usb.open_device (0x6666, 0x0003, 0)
om dev < 0:
skriva ut "Ingen matchande enhet found...\n"
annat:
ret = usb.control_transfer (dev, 0x00, 0x09, 1, 0, 0, buffert)
om ret < 0:
skriva ut "Kan inte skicka SET_CONFIGURATION standard begäran. \n"
root.after (50, update_status)
root.mainloop()
USB.close_device(dev)
Nu till MPLab koden. Vi använder en standard USB-leverantörens begäran program, men vi måste definiera alla kommandon i början.
#define SET_RB0 0x01 / / leverantörsspecifika förfrågan ange (dvs göra hög) RA0
#define CLEAR_RB0 0x02 / / leverantörsspecifika förfrågan ange (dvs göra, låg) RA0
#define SET_RB1 0x03 / / leverantörsspecifika förfrågan ange (dvs göra hög) RA1
#define CLEAR_RB1 0x04 / / leverantörsspecifika förfrågan ange (dvs göra lågt) RA1
#define SET_RB2 0x05 / / leverantörsspecifika förfrågan ange (dvs göra hög) RA2
#define CLEAR_RB2 0x06 / / leverantörsspecifika förfrågan ange (dvs göra lågt) RA2
#define SET_RB3 0x07 / / leverantörsspecifika förfrågan ange (dvs göra hög) RA3
#define CLEAR_RB3 0x08 / / leverantörsspecifika förfrågan ange (dvs göra lågt) RA3
#define SET_RB4 0x09 / / leverantörsspecifika förfrågan ange (dvs göra hög) RB4
#define CLEAR_RB4 0x0A / / leverantörsspecifika förfrågan ange (dvs göra lågt) RB4
#define SET_RB5 0x0B / / leverantörsspecifika förfrågan ange (dvs göra hög) RB5
#define CLEAR_RB5 0x0C / / leverantörsspecifika förfrågan ange (dvs göra lågt) RB5
#define SET_RB6 0x0D / / leverantörsspecifika förfrågan ange (dvs göra hög) RB6
#define CLEAR_RB6 0x0E / / leverantörsspecifika förfrågan ange (dvs göra lågt) RB6
#define SET_RB7 0x0F / / leverantörsspecifika förfrågan ange (dvs göra hög) RB7
#define CLEAR_RB7 0x10 / / leverantörsspecifika förfrågan ange (dvs göra l0w) RB7
#define TEXTBOX_VAL 0x11 / / leverantörsspecifika förfrågan om att ange 7 segment LED
#define CLR_LED 0x12 / / leverantörsspecifika begäran att rensa 7 segment LED
#define SET_DUTY 0x11
#define DOT 0x12
#define linje 0x13
#define SCHACKRUTIGA 0x14
#define HALF_HALF 0x15
Vi kan sedan fortsätta genom att skriva våra leverantörsförfrågningar för USB. Följande är en begäran om RB0 med starten av hela funktionen.
void VendorRequests(void) {
Switch (USB_buffer_data[bRequest]) {
fall SET_RB0:
PORTBbits.RB0 = 1; ställa in RA0 hög
BD0I.ByteCount = 0x00; Ange antal EP0 IN byte till 0
BD0I.status = 0xC8; Skicka paket som DATA1, som UOWN lite
bryta;
Vi gjorde detta för varje stift RB0-RB7 som gör det möjligt att kunna testa och underlätta för felsökning.
Skapa bilder som schackrutigt startade vi på samma sätt som en särskild pin begäran, men vi tilldelat på och bort av ventilerna med 0 och 1 (varje nummer går till en av de åtta stift). Detta aktivera flera samtidiga pin operationer.
Exempelkod:
fall SET_DUTY: SKYLDIGHET = USB_buffer_data [wValue]; fall SCHACKRUTOR: PORTB = 0b11001100; samtidigt (1) { Temp = TMR0L; spärren kick beställer byte av räknaren Timer0 in i TMR0H genom att läsa TMR0L
BD0I.ByteCount = 0x00; Ange antal EP0 IN byte till 0
BD0I.status = 0xC8; Skicka paket som DATA1, som UOWN lite
Delay10KTCYx(10);
PORTB = 0b00000000;
Med dessa skript ändringar vi kunde detalj ett program som kan översätta rutnät bilder till vatten visar.
* se nedan för själva koden.