Paso 5: código
SOFTWARE:Para el PIC18F2445 actuar como un circuito integrado, hemos creado un proyecto de MPLab con un script en python llamado para controlar las funciones de la válvula.
Original propuesta de función:
Nuestra intención original de este proyecto era leer imágenes y traducirlos a sus homólogos de agua. Hemos intentado encontrar imágenes con la pixelación baja por lo que se podrían recrear. Para subir y establecer la imagen como una cuadrícula de 8 X 8 (puesto que nuestro aparato tenía ocho válvulas) utilizamos python imaging library (PIL) para subir nuestra imagen jpeg de tablero de ajedrez.
Código de ejemplo:
importar imagen DEF loadPic (filename ='checkerboard.jpeg ', umbral = 3, tamaño = (50,50)): clase TestTable(): DEF GetNumberRows(self): DEF GetNumberCols(self): DEF IsEmptyCell (self, fila, col): GetValue (self, fila, col) Def: DEF SetValue (self, fila, columna, valor): DEF GetColLabelValue (self, col): DEF GetRowLabelValue (self, fila):
tiempo de importación
im =Image.open('checkerboard.jpeg').show()
x_length, y_length = im.size
imprimir [x_length y_length]
x2_length = 2# dio un valor arbitrario, por lo que esto funciona
y2_length = 2
x1_length = x1_length-x2_length
y1_length = y_length-y2_length
DEF __init__:
self.rowLabels = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
self.colLabels = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"]
retorno 10
retorno 10
devolverá False
return 0
pasar
volver self.colLabels[col]
volver self.rowLabels[row]
Hemos sido capaces de dividir la imagen en una cuadrícula de tal al asignar las filas y caracteres de la columna por lo que podría hacer referencia. Esto determina que si una spot(row,column) estaba vacía (blanca) nos asigna una asignación de get.color para designar el número 1 por 0 para el blanco y negro. Cada punto tendría que pasar a través de un if otra declaración para hacer tales tareas.
Una declaración de ejemplo para el punto A1. Observe que después de la asignación del comando también está asignado. En este caso controla el pin RB0.
Código de ejemplo:
Si A1==(1,0):
cell_value = 1
Imprimir "blanco"
SET_RBO = 1
set_rb0_callback()
Elif A1==(0,1):
cell_value = 1
Imprimir "blanco"
SET_RBO = 1
set_rb0_callback()
Elif A1==(1,1):
cell_value = 1
Imprimir "blanco"
SET_RB0 = 1
set_rb0_callback()
Elif A1==(0,0):
cell_value = 0
Imprimir "negro"
clr_rb0_callback()
Estos comandos repiten para este punto y para los restantes pines RB0-RB7.
Después de recoger la información de la imagen tenemos que enviar a través del usb a nuestro código de MPLab. Hicimos esto inicializando el usb y cada comando.
Código de ejemplo:
de import Tkinter * SET_RB0 = 1#self.col_grid[0(cell_value=1)] = ctypes.cdll.LoadLibrary('usb.dll') buffer = ctypes.c_buffer(8) raíz = 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):
ctypes de importación
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 ('cortina de agua')
FM = Frame(root)
USB.control_transfer (dev, 0xC0, SET_RA8, 0, 0, 1, buffer)
status.Configure (texto = ord(buffer[0])) % rb7 actualmente es % d.
root.After (50, update_status)
USB.control_transfer (dev, 0 x 40, SET_RB0, 0, 0, 0, buffer)
USB.control_transfer (dev, 0 x 40, CLR_RB0, 0, 0, 0, buffer)
USB.control_transfer (dev, 0 x 40, SET_RB1, 0, 0, 0, buffer)
USB.control_transfer (dev, 0 x 40, CLR_RB1, 0, 0, 0, buffer)
USB.control_transfer (dev, 0 x 40, SET_RB2, 0, 0, 0, buffer)
USB.control_transfer (dev, 0 x 40, CLR_RB2, 0, 0, 0, buffer)
USB.control_transfer (dev, 0 x 40, SET_RB3, 0, 0, 0, buffer)
USB.control_transfer (dev, 0 x 40, CLR_RB3, 0, 0, 0, buffer)
USB.control_transfer (dev, 0 x 40, SET_RB4, 0, 0, 0, buffer)
USB.control_transfer (dev, 0 x 40, CLR_RB4, 0, 0, 0, buffer)
USB.control_transfer (dev, 0 x 40, SET_RB5, 0, 0, 0, buffer)
USB.control_transfer (dev, 0 x 40, CLR_RB5, 0, 0, 0, buffer)
USB.control_transfer (dev, 0 x 40, SET_RB6, 0, 0, 0, buffer)
USB.control_transfer (dev, 0 x 40, CLR_RB6, 0, 0, 0, buffer)
USB.control_transfer (dev, 0 x 40, SET_RB7, 0, 0, 0, buffer)
USB.control_transfer (dev, 0 x 40, CLR_RB7, 0, 0, 0, buffer)
USB.control_transfer (dev, 0 x 40, SET_DUTY, int(value), 0, 0, buffer)
Ahora el problema que nos enfrentamos a partir de este momento en fue que no pudimos llamar a una compleja colección de pins con una solicitud de contador de tiempo que no era cíclico. Hemos sido capaces de crear nuestras propias imágenes simples que utilizan básicas retrasos repetidos que las válvulas de encendido y apagado, pero ninguno que pudiera tener en las entradas de la red. Por lo tanto, que no ha podido compilar imágenes complejas. Por lo tanto, nos cambió el rumbo para crear imágenes simples que podrían traducirse en función de la válvula.
Nuevo objetivo de Software
La nueva misión de nuestro software fue tomar imágenes simples que podrían ser controlados con un ciclo de retraso.
Importar las bibliotecas de python apropiados y asignar valor a leerse en MPLab.
Código de ejemplo:
de import Tkinter * ##TEXTBOX_VAL = 17 Inicializa el USB. USB = ctypes.cdll.LoadLibrary('usb.dll') buffer = ctypes.c_buffer(8) Definir imágenes quería que se ejecutarán en el ciclo de reloj. DEF dot_callback(): DEF line_callback(): DEF checkerboard_callback(): DEF halfhalf_callback():
ctypes de importación
##CLR_LED = 18
SET_DUTY = 17
DOT = 18
LINEA = 19
TABLERO DE AJEDREZ = 20
HALF_HALF = 21
USB.Initialize()
USB.control_transfer (dev, 0 x 40, punto, 0, 0, 0, buffer)
USB.control_transfer (dev, 0 x 40, línea, 0, 0, 0, buffer)
USB.control_transfer (dev, 0 x 40, damero, 0, 0, 0, buffer)
USB.control_transfer (dev, 0 x 40, HALF_HALF, 0, 0, 0, buffer)
DEF set_duty_callback(value):
USB.control_transfer (dev, 0 x 40, SET_DUTY, int(value), 0, 0, buffer)
DEF update_status():
root.After (50, update_status)
Hacer un botón de cuadro de texto así que podemos controlar qué imágenes muestran en qué tiempo (aka el botón!)
Código de ejemplo:
raíz = 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 (lado = izquierda)
## Button(fm, text = 'CLR', command = CLR_display).pack (lado = a la derecha)
Button(FM, Text = 'DOT', Command = dot_callback).Pack (lado = a la derecha)
Button(FM, Text = 'LINE', Command = line_callback).Pack (lado = a la derecha)
Button(FM, Text = 'CHECKERBOARD', Command = checkerboard_callback).Pack (lado = a la derecha)
Button(FM, Text = 'HALF and HALF', Command = halfhalf_callback).Pack (lado = a la derecha)
FM.Pack(Side = Top)
dutyslider = escala (raíz, from_ = 0, a = 255, Oriente = HORIZONTAL, showvalue = FALSE, comando = set_duty_callback)
dutyslider.set(128)
dutyslider.Pack(Side = Top)
Escriba en un error si el dispositivo USB no se encuentra.
Código de ejemplo:
dev = usb.open_device (0x6666, 0x0003, 0)
Si dev < 0:
no imprimir "emparejar dispositivo found...\n"
otra cosa:
RET = usb.control_transfer (dev, 0 x 00, 0 x 09, 1, 0, 0, buffer)
Si ret < 0:
Imprimir "No se puede enviar la solicitud estándar de SET_CONFIGURATION. \n"
root.After (50, update_status)
root.mainloop()
USB.close_device(dev)
Ahora en el código de MPLab. Utilizamos un programa de solicitud proveedor USB estándar, sin embargo tenemos que definir todos los comandos al principio.
#define SET_RB0 0 x 01 / / solicitud de específicos del proveedor para configurar (es decir, hacer alto) RA0
#define CLEAR_RB0 0 x 02 / / solicitud de específicos del proveedor para configurar (es decir, hacer; baja) RA0
#define SET_RB1 0 x 03 / / solicitud de específicos del proveedor para configurar (es decir, hacer alto) RA1
#define CLEAR_RB1 0 x 04 / / solicitud de específicos del proveedor para configurar (es decir, hacer baja) RA1
#define SET_RB2 0 x 05 / / solicitud de específicos del proveedor para configurar (es decir, hacer alto) RA2
#define CLEAR_RB2 0 x 06 / / solicitud de específicos del proveedor para configurar (es decir, hacer baja) RA2
#define SET_RB3 0x07 / / solicitud de específicos del proveedor para configurar (es decir, hacer alto) RA3
#define CLEAR_RB3 0x08 / / solicitud de específicos del proveedor para configurar (es decir, hacer baja) RA3
#define SET_RB4 0 x 09 / / solicitud de específicos del proveedor para configurar (es decir, hacer alto) RB4
#define CLEAR_RB4 0x0A / / solicitud de específicos del proveedor para configurar (es decir, hacer baja) RB4
#define SET_RB5 0x0B / / solicitud de específicos del proveedor para configurar (es decir, hacer alto) RB5
#define CLEAR_RB5 0x0C / / solicitud de específicos del proveedor para configurar (es decir, hacer baja) RB5
#define SET_RB6 0x0D / / solicitud de específicos del proveedor para configurar (es decir, hacer alto) RB6
#define CLEAR_RB6 0x0E / / solicitud de específicos del proveedor para configurar (es decir, hacer baja) RB6
#define SET_RB7 0x0F / / solicitud de específicos del proveedor para configurar (es decir, hacer alto) RB7
#define CLEAR_RB7 0 x 10 / / solicitud de específicos del proveedor para configurar (es decir, hacer l0w) RB7
#define TEXTBOX_VAL 0x11 / / petición de específicos del proveedor para al 7 segmentos LED
#define CLR_LED 0x12 / / solicitud de específicos del proveedor para borrar 7 segmento LED
#define SET_DUTY 0x11
#define punto 0x12
#define línea 0 x 13
#define tablero 0x14
#define HALF_HALF 0x15
Luego podemos seguir escribiendo nuestras peticiones de proveedor para el USB. La siguiente es una petición para RB0 con el comienzo de la función entero.
void VendorRequests(void) {}
interruptor (USB_buffer_data[bRequest]) {}
caso SET_RB0:
PORTBbits.RB0 = 1; configurar RA0 alta
BD0I.byteCount = 0 x 00; Conde de EP0 en bytes el valor 0
BD0I.status = 0xC8; envíe paquetes como DATA1, conjunto UOWN bit
rotura;
Hicimos esto para cada pin RB0-RB7 que nos permita ser capaces de probar y facilitar los medios de depuración.
En la creación de imágenes como el damero empezamos de la misma manera como una solicitud de pin específico, pero nos asignaron el encendido y apagado de las válvulas con 0 y 1 (cada número va a uno de los ocho pines). Esto permitirá el uso múltiple de las operaciones simultáneas de pin.
Código de ejemplo:
caso SET_DUTY: DEBER = USB_buffer_data [wValue]; caja tablero de ajedrez: PORTB = 0b11001100; mientras que {} (1) Temp = TMR0L; enganchar el byte de orden alto del contador Timer0 en TMR0H leyendo TMR0L
BD0I.byteCount = 0 x 00; Conde de EP0 en bytes el valor 0
BD0I.status = 0xC8; envíe paquetes como DATA1, conjunto UOWN bit
Delay10KTCYx(10);
PORTB = 0b00000000;
Con estas modificaciones de la escritura que hemos podido detalle un programa que puede traducir a imágenes de la red al agua muestra.
* vea abajo para el código real.