Stap 5: Code
SOFTWARE:Om de PIC18F2445 te treden als een geïntegreerde schakeling, creëerde we een project MPLab met een zogenaamde python script aan de controlefuncties van de klep.
Origineel voorgesteld functie:
Onze oorspronkelijke bedoeling met dit project was om afbeeldingen lezen en vertalen deze in water tegenhangers. We probeerden te vinden afbeeldingen met lage pixelation zodat zij waren opnieuw kunnen worden gemaakt. Om te uploaden en de afbeelding in te stellen als een 8 X 8 raster (sinds onze apparaat acht kleppen) hebben we de python imaging library (PIL) gebruikt om onze dambord jpeg-afbeelding te uploaden.
De Code van de steekproef:
Image importeren def loadPic (filename ='checkerboard.jpeg ', drempel = 3, grootte = (50,50)): klasse TestTable(): def GetNumberRows(self): def GetNumberCols(self): def IsEmptyCell (zelf, rij, col): def GetValue (zelf, rij, col): def WaardeInstellen (zelf, rij, col, waarde): def GetColLabelValue (self, col): def GetRowLabelValue (self, rij):
importeren
im =Image.open('checkerboard.jpeg').show()
x_length, y_length = im.size
afdrukken [x_length, y_length]
x2_length = 2# gaf een willekeurige waarde hier, gewoon zodat dit werkt
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"]
terug van 10
terug van 10
False retourneren
retourneren 0
Pass
terug self.colLabels[col]
terug self.rowLabels[row]
We konden de afbeelding te verdelen in dergelijke een raster terwijl de rijen en kolom tekens toe te wijzen zodat zij kunnen worden verwezen. Dit bepaald dat of een spot(row,column) leeg was (wit) toegewezen we een get.color toewijzing aan te wijzen van de nummer 1 voor zwart en 0 voor wit. Elke vlek zou moeten gaan door middel van een if else-statement te maken van dergelijke toewijzingen.
Een voorbeeld-instructie voor de plek A1. Merk op dat na de toewijzing ook de opdracht is toegewezen. In dit geval de controle over de pin RB0.
De Code van de steekproef:
Als A1==(1,0):
cell_value = 1
afdrukken "white"
SET_RBO = 1
set_rb0_callback()
Elif A1==(0,1):
cell_value = 1
afdrukken "white"
SET_RBO = 1
set_rb0_callback()
Elif A1==(1,1):
cell_value = 1
afdrukken "white"
SET_RB0 = 1
set_rb0_callback()
Elif A1==(0,0):
cell_value = 0
afdrukken "zwart"
clr_rb0_callback()
Deze opdrachten Herhaal voor deze plek en de resterende pinnen RB0-RB7.
Na het verzamelen van de informatie uit de afbeelding hadden we te sturen via de usb naar onze MPLab code. We deden dit met het initialiseren van de USB- en elke opdracht.
De Code van de steekproef:
van Tkinter importeren * SET_RB0 = 1#self.col_grid[0(cell_value=1)] = ctypes.cdll.LoadLibrary('usb.dll') buffer = ctypes.c_buffer(8) root = 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):
importeren van 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 ("Water gordijn")
FM = Frame(root)
USB.control_transfer (dev, 0xC0, SET_RA8, 0, 0, 1, buffer)
status.configure (tekst = % ord(buffer[0])) 'rb7 is op dit moment % overleden'
root.After (50, update_status)
USB.control_transfer (dev, 0x40, SET_RB0, 0, 0, 0, buffer)
USB.control_transfer (dev, 0x40, CLR_RB0, 0, 0, 0, buffer)
USB.control_transfer (dev, 0x40, SET_RB1, 0, 0, 0, buffer)
USB.control_transfer (dev, 0x40, CLR_RB1, 0, 0, 0, buffer)
USB.control_transfer (dev, 0x40, SET_RB2, 0, 0, 0, buffer)
USB.control_transfer (dev, 0x40, CLR_RB2, 0, 0, 0, buffer)
USB.control_transfer (dev, 0x40, SET_RB3, 0, 0, 0, buffer)
USB.control_transfer (dev, 0x40, CLR_RB3, 0, 0, 0, buffer)
USB.control_transfer (dev, 0x40, SET_RB4, 0, 0, 0, buffer)
USB.control_transfer (dev, 0x40, CLR_RB4, 0, 0, 0, buffer)
USB.control_transfer (dev, 0x40, SET_RB5, 0, 0, 0, buffer)
USB.control_transfer (dev, 0x40, CLR_RB5, 0, 0, 0, buffer)
USB.control_transfer (dev, 0x40, SET_RB6, 0, 0, 0, buffer)
USB.control_transfer (dev, 0x40, CLR_RB6, 0, 0, 0, buffer)
USB.control_transfer (dev, 0x40, SET_RB7, 0, 0, 0, buffer)
USB.control_transfer (dev, 0x40, CLR_RB7, 0, 0, 0, buffer)
USB.control_transfer (dev, 0x40, SET_DUTY, int(value), 0, 0, buffer)
Nu was het probleem dat wij vanaf dit punt op dat we niet konden Bel een complexe verzameling pinnen met een timer-verzoek dat niet cyclisch. We waren in staat om onze eigen eenvoudige afbeeldingen gebruikt fundamentele herhaalde vertragingen die draaide van kleppen, in- en uitschakelen, maar niemand die kan deelnemen aan de ingangen van het raster te maken. Daarom hebben wij niet in staat om complexe beelden te compileren. Dus veranderd we cursus om te maken eenvoudige beelden die kunnen worden omgezet in functie van de klep.
Nieuwe Software doel
De nieuwe missie van onze software moest nemen eenvoudige beelden dat kunnen worden gecontroleerd met de cyclus van een vertraging.
Importeren de juiste python bibliotheken en waarde moeten worden gelezen in MPLab toewijzen.
De Code van de steekproef:
van Tkinter importeren * ##TEXTBOX_VAL = 17 Initialiseren USB. USB = ctypes.cdll.LoadLibrary('usb.dll') buffer = ctypes.c_buffer(8) Define wilde beelden die wordt uitgevoerd onder de timer-cyclus. def dot_callback(): def line_callback(): def checkerboard_callback(): def halfhalf_callback():
importeren van ctypes
##CLR_LED = 18
SET_DUTY = 17
STIP = 18
LIJN = 19
DAMBORD = 20
HALF_HALF = 21
USB.initialize()
USB.control_transfer (dev, 0x40, DOT, 0, 0, 0, buffer)
USB.control_transfer (dev, 0x40, lijn, 0, 0, 0, buffer)
USB.control_transfer (dev, 0x40, DAMBORD, 0, 0, 0, buffer)
USB.control_transfer (dev, 0x40, HALF_HALF, 0, 0, 0, buffer)
def set_duty_callback(value):
USB.control_transfer (dev, 0x40, SET_DUTY, int(value), 0, 0, buffer)
def update_status():
root.After (50, update_status)
Maak een knop tekst vak zodat we kunnen bepalen welke afbeeldingen kunnen weergegeven op welk tijdstip (aka de knop te drukken!)
De Code van de steekproef:
root = 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 (zijde = LEFT)
## Button(fm, text = 'CLR', command = CLR_display).pack (zijde = rechts)
Button(FM, Text = 'DOT', Command = dot_callback).Pack (zijde = rechts)
Button(FM, Text = 'LINE', Command = line_callback).Pack (zijde = rechts)
Button(FM, Text = 'CHECKERBOARD', Command = checkerboard_callback).Pack (zijde = rechts)
Button(FM, Text = 'HALF and HALF', Command = halfhalf_callback).Pack (zijde = rechts)
FM.Pack(Side = Top)
dutyslider = schalen (root, from_ = 0, to = 255, oriënteren = horizontaal, showvalue = onwaar, opdracht = set_duty_callback)
dutyslider.set(128)
dutyslider.Pack(Side = Top)
Schrijf in een fout als het USB-apparaat is niet gevonden.
De Code van de steekproef:
dev = usb.open_device (0x6666, 0x0003, 0)
als dev < 0:
afdrukken "Geen overeenkomende apparaat found...\n"
anders:
RET = usb.control_transfer (dev, 0x00, 0x09, 1, 0, 0, buffer)
Als ret < 0:
Print "Unable to Stuur SET_CONFIGURATION standaard verzoek. \n"
root.After (50, update_status)
root.mainLoop()
USB.close_device(dev)
Nu aan de MPLab code. We gebruiken een standaard USB-leverancier verzoekprogramma, maar we moeten alle opdrachten in het begin definiëren.
#define SET_RB0 0x01 / / leverancier-specifieke vragen te stellen (dat wil zeggen, zorg hoog) RA0
#define CLEAR_RB0 0x02 / / leverancier-specifieke vragen te stellen (dat wil zeggen, maken; lage) RA0
#define SET_RB1 0x03 / / leverancier-specifieke vragen te stellen (dat wil zeggen, zorg hoog) RA1
#define CLEAR_RB1 0x04 / / leverancier-specifieke vragen te stellen (dat wil zeggen, zorg lage) RA1
#define SET_RB2 0x05 / / leverancier-specifieke vragen te stellen (dat wil zeggen, zorg hoog) RA2
#define CLEAR_RB2 0x06 / / leverancier-specifieke vragen te stellen (dat wil zeggen, zorg lage) RA2
#define SET_RB3 0x07 / / leverancier-specifieke vragen te stellen (dat wil zeggen, zorg hoog) RA3
#define CLEAR_RB3 0x08 / / leverancier-specifieke vragen te stellen (dat wil zeggen, zorg lage) RA3
#define SET_RB4 0x09 / / leverancier-specifieke vragen te stellen (dat wil zeggen, zorg hoog) RB4
#define CLEAR_RB4 0x0A / / leverancier-specifieke vragen te stellen (dat wil zeggen, zorg lage) RB4
#define SET_RB5 0x0B / / leverancier-specifieke vragen te stellen (dat wil zeggen, zorg hoog) RB5
#define CLEAR_RB5 0x0C / / leverancier-specifieke vragen te stellen (dat wil zeggen, zorg lage) RB5
#define SET_RB6 0x0D / / leverancier-specifieke vragen te stellen (dat wil zeggen, zorg hoog) RB6
#define CLEAR_RB6 0x0E / / leverancier-specifieke vragen te stellen (dat wil zeggen, zorg lage) RB6
#define SET_RB7 0x0F / / leverancier-specifieke vragen te stellen (dat wil zeggen, zorg hoog) RB7
#define CLEAR_RB7 0x10 / / leverancier-specifieke vragen te stellen (dat wil zeggen, make-l0w) RB7
#define TEXTBOX_VAL 0x11 / / leverancier-specifieke verzoek om in te stellen van de 7 segment LED
#define CLR_LED 0x12 / / leverancier-specifieke verzoek om 7 segment LED
#define SET_DUTY 0x11
#define DOT 0x12
#define lijn 0x13
#define DAMBORD 0x14
#define HALF_HALF 0x15
Vervolgens kunnen wij door onze leverancier schrijfaanvragen voor de USB. Het volgende is een verzoek voor RB0 met de start van de gehele functie.
VOID VendorRequests(void) {}
schakelaar (USB_buffer_data[bRequest]) {}
Case SET_RB0:
PORTBbits.RB0 = 1; RA0 hoog instellen
BD0I.byteCount = 0x00; EP0 IN byte graaf ingesteld op 0
BD0I.status = 0xC8; verzenden van pakket als gegevens1, instellen UOWN bit
breken;
We deden dit voor elke pin RB0-RB7 om ons te kunnen testen en de middelen voor het opsporen van fouten vergemakkelijken.
In het creëren van beelden zoals het dambord begonnen we op dezelfde manier als een specifieke pin-vragen, maar wij de op en off van de kleppen met 0 en 1 (elk getal naar een van de acht pennen) toegewezen. Hierdoor het meervoudig gebruik van gelijktijdige pin operaties.
De Code van de steekproef:
Case SET_DUTY: PLICHT = USB_buffer_data [wValue]; Case DAMBORD: PORTB = 0b11001100; terwijl (1) {} Temp = TMR0L; klink de hooggeplaatste byte van de teller van Timer0 in TMR0H door het lezen van TMR0L
BD0I.byteCount = 0x00; EP0 IN byte graaf ingesteld op 0
BD0I.status = 0xC8; verzenden van pakket als gegevens1, instellen UOWN bit
Delay10KTCYx(10);
PORTB = 0b00000000;
Bij deze script wijzigingen we voor detail uit een programma dat vertalen raster beelden konden kan tot water weergegeven.
* Zie hieronder voor de feitelijke code.