Étape 5: Code
Logiciel :Afin que les PIC18F2445 d’agir comme un circuit intégré, nous avons créé un projet MPLab avec un script python appelé pour contrôler les fonctions de la vanne.
Original proposé fonction :
Notre intention initiale de ce projet était de lire les images et les traduire en équivalents d’eau. Nous avons essayé de trouver des images avec faible pixelisation alors qu’ils étaient peuvent être recréées. Afin de télécharger et de définir l’image comme une grille 8 X 8 (étant donné que notre appareil avait huit soupapes), nous avons utilisé le python imaging library (PIL) pour télécharger notre image jpeg de damier.
Exemple de Code :
importer Image def loadPic (filename ='checkerboard.jpeg ', seuil = 3, taille = (50,50)) : classe TestTable() : def GetNumberRows(self) : def GetNumberCols(self) : def IsEmptyCell (self, row, col) : DEF GetValue (Gites, row, col) : def SetValue (auto, ligne, col, valeur) : def GetColLabelValue (self, col) : def GetRowLabelValue (self, rangée) :
moment de l’importation
im =Image.open('checkerboard.jpeg').show()
x_length, y_length = im.size
imprimer [x_length, y_length]
x2_length = 2# a donné une valeur arbitraire ici, juste pour que cela fonctionne
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"]
retour 10
retour 10
renvoient la valeur False
retourne 0
Pass
retour self.colLabels[col]
retour self.rowLabels[row]
On peut diviser l’image en une telle grille tout en assignant les lignes et les caractères de la colonne, donc ils pourraient être référencés. Cela a déterminé que si un spot(row,column) était vide (blanc), nous avons attribué une affectation de get.color pour désigner le numéro 1 pour le noir et 0 pour les blancs. Chaque tache devra passer par un if instruction else pour rendre ces affectations.
Une déclaration d’exemple pour l’A1 spot. Notez que, après la cession, la commande est également affectée. Dans ce cas, il contrôle la broche RB0.
Exemple de Code :
si A1==(1,0) :
cell_value = 1
imprimer « blanc »
SET_RBO = 1
set_rb0_callback()
Elif A1==(0,1) :
cell_value = 1
imprimer « blanc »
SET_RBO = 1
set_rb0_callback()
Elif A1==(1,1) :
cell_value = 1
imprimer « blanc »
SET_RB0 = 1
set_rb0_callback()
Elif A1==(0,0) :
cell_value = 0
imprimer « noir »
clr_rb0_callback()
Ces commandes Répéter pour cet endroit et pour les autres broches RB0-RB7.
Après la collecte des données de l’image, nous avons eu à envoyer par l’intermédiaire de l’usb à notre code de MPLab. Nous l’avons fait en initialisant l’usb et chaque commande.
Exemple de Code :
de Tkinter import * SET_RB0 = 1#self.col_grid[0(cell_value=1)] = ctypes.cdll.LoadLibrary('usb.dll') tampon = ctypes.c_buffer(8) racine = 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) :
importer 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 ("rideau d’eau")
FM = Frame(root)
USB.control_transfer (dev, 0xC0, SET_RA8, 0, 0, 1, tampon)
Status.configure (text = « rb7 est actuellement de % d. » % ord(buffer[0]))
root.after (50, update_status)
USB.control_transfer (dev, 0 x 40, SET_RB0, 0, 0, 0, tampon)
USB.control_transfer (dev, 0 x 40, CLR_RB0, 0, 0, 0, tampon)
USB.control_transfer (dev, 0 x 40, SET_RB1, 0, 0, 0, tampon)
USB.control_transfer (dev, 0 x 40, CLR_RB1, 0, 0, 0, tampon)
USB.control_transfer (dev, 0 x 40, SET_RB2, 0, 0, 0, tampon)
USB.control_transfer (dev, 0 x 40, CLR_RB2, 0, 0, 0, tampon)
USB.control_transfer (dev, 0 x 40, SET_RB3, 0, 0, 0, tampon)
USB.control_transfer (dev, 0 x 40, CLR_RB3, 0, 0, 0, tampon)
USB.control_transfer (dev, 0 x 40, SET_RB4, 0, 0, 0, tampon)
USB.control_transfer (dev, 0 x 40, CLR_RB4, 0, 0, 0, tampon)
USB.control_transfer (dev, 0 x 40, SET_RB5, 0, 0, 0, tampon)
USB.control_transfer (dev, 0 x 40, CLR_RB5, 0, 0, 0, tampon)
USB.control_transfer (dev, 0 x 40, SET_RB6, 0, 0, 0, tampon)
USB.control_transfer (dev, 0 x 40, CLR_RB6, 0, 0, 0, tampon)
USB.control_transfer (dev, 0 x 40, SET_RB7, 0, 0, 0, tampon)
USB.control_transfer (dev, 0 x 40, CLR_RB7, 0, 0, 0, tampon)
USB.control_transfer (dev, 0 x 40, SET_DUTY, int(value), 0, 0, tampon)
Maintenant le problème que nous avons rencontrés de ce point sur était que nous n’étions pas en mesure d’appeler un ensemble complexe de pins avec une demande de minuterie qui n’est pas cyclique. Nous avons pu créer nos propres images simples utilisé base retards répétés qui a transformé les vannes sur et en dehors, mais aucun qui pourrait avoir dans les entrées de la grille. Par conséquent, nous pas capable de compiler les images complexes. Par conséquent, nous avons changé de Cap pour créer des images simples qui pourraient être traduits en fonction de la vanne.
Nouvel objectif du logiciel
La nouvelle mission de notre logiciel a été de prendre des images simples qui pourraient être contrôlés par un cycle de retard.
Importer les bibliothèques python approprié et attribuer la valeur à lire MPLab.
Exemple de Code :
de Tkinter import * ##TEXTBOX_VAL = 17 Initialiser le port USB. USB = ctypes.cdll.LoadLibrary('usb.dll') tampon = ctypes.c_buffer(8) Décrivez les images recherchées qui seront déroulera dans le cadre du cycle de minuterie. def dot_callback() : def line_callback() : def checkerboard_callback() : def halfhalf_callback() :
importer ctypes
##CLR_LED = 18
SET_DUTY = 17
DOT = 18
LIGNE = 19
DAMIER = 20
HALF_HALF = 21
USB.Initialize()
USB.control_transfer (dev, 0 x 40, DOT, 0, 0, 0, tampon)
USB.control_transfer (dev, 0 x 40, LINE, 0, 0, 0, tampon)
USB.control_transfer (dev, 0 x 40, damier, 0, 0, 0, tampon)
USB.control_transfer (dev, 0 x 40, HALF_HALF, 0, 0, 0, tampon)
def set_duty_callback(value) :
USB.control_transfer (dev, 0 x 40, SET_DUTY, int(value), 0, 0, tampon)
def update_status() :
root.after (50, update_status)
Faire un bouton zone de texte alors que nous pouvons contrôler Quelles images peuvent affiche à quelle heure (aka en appuyant sur le bouton!)
Exemple de Code :
racine = 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 (côté = gauche)
## Button(fm, text = 'CLR', command = CLR_display).pack (côté = droite)
Button(FM, text = 'DOT', Command = dot_callback).Pack (côté = droite)
Button(FM, text = 'LINE', Command = line_callback).Pack (côté = droite)
Button(FM, text = 'CHECKERBOARD', Command = checkerboard_callback).Pack (côté = droite)
Button(FM, text = 'HALF and HALF', Command = halfhalf_callback).Pack (côté = droite)
FM.Pack(Side = Top)
dutyslider = échelle (racine, from_ = 0, to = 255, orienter = HORIZONTAL, showvalue = FALSE, commande = set_duty_callback)
dutyslider.Set(128)
dutyslider.Pack(Side = Top)
Écrire une erreur si le périphérique USB n’est pas trouvé.
Exemple de Code :
dev = usb.open_device (0x6666, 0x0003, 0)
Si dev < 0 :
n’imprimer « Aucune correspondance dispositif found...\n »
autre chose :
RET = usb.control_transfer (dev, 0 x 00, 0 x 09, 1, 0, 0, tampon)
Si ret < 0 :
Print « impossible d’envoyer des SET_CONFIGURATION standard demande. \n »
root.after (50, update_status)
root.mainloop()
USB.close_device(dev)
Maintenant au code MPLab. Nous utilisons un programme de demande fournisseur USB standard, mais on doit définir toutes les commandes au début.
#define SET_RB0 0 x 01 / / spécifiques au fournisseur demande à définir (c'est-à-dire faire élevé) RA0
#define CLEAR_RB0 0 x 02 / / spécifiques au fournisseur demande à définir (c'est-à-dire faire ; faible) RA0
#define SET_RB1 0 x 03 / / spécifiques au fournisseur demande à définir (c'est-à-dire faire élevé) RA1
#define CLEAR_RB1 0 x 04 / / spécifiques au fournisseur demande à définir (c'est-à-dire, rendre faible) RA1
#define SET_RB2 0 x 05 / / spécifiques au fournisseur demande à définir (c'est-à-dire faire élevé) RA2
#define CLEAR_RB2 0 x 06 / / spécifiques au fournisseur demande à définir (c'est-à-dire, rendre faible) RA2
#define SET_RB3 0 x 07 / / spécifiques au fournisseur demande à définir (c'est-à-dire faire élevé) RA3
#define CLEAR_RB3 0 x 08 / / demande de spécifiques au fournisseur pour définir (c'est-à-dire, rendre faible) RA3
#define SET_RB4 0 x 09 / / spécifiques au fournisseur demande à définir (c'est-à-dire faire élevé) RB4
#define CLEAR_RB4 0x0A / / spécifiques au fournisseur demande à définir (c'est-à-dire, rendre faible) RB4
#define SET_RB5 0x0B / / spécifiques au fournisseur demande à définir (c'est-à-dire faire élevé) RB5
#define CLEAR_RB5 0x0C / / spécifiques au fournisseur demande à définir (c'est-à-dire, rendre faible) RB5
#define SET_RB6 0x0D / / spécifiques au fournisseur demande à définir (c'est-à-dire faire élevé) RB6
#define CLEAR_RB6 0x0E / / spécifiques au fournisseur demande à définir (c'est-à-dire, rendre faible) RB6
#define SET_RB7 0x0F / / spécifiques au fournisseur demande à définir (c'est-à-dire faire élevé) RB7
#define CLEAR_RB7 0 x 10 / / spécifiques au fournisseur demande à définir (c'est-à-dire faire l0w) RB7
#define TEXTBOX_VAL 0 x 11 / / demande spécifiques au fournisseur de mettre 7 segment LED
#define CLR_LED 0 x 12 / / demande spécifiques au fournisseur pour effacer 7 segment LED
#define SET_DUTY 0 x 11
#define DOT 0 x 12
#define ligne 0 x 13
#define damier 0 x 14
#define HALF_HALF 0 x 15
Nous pouvons alors procéder en écrivant nos demandes de fournisseur pour l’USB. Voici une demande pour RB0 avec le début de la fonction entière.
void VendorRequests(void) {}
commutateur (USB_buffer_data[bRequest]) {}
affaire SET_RB0 :
PORTBbits.RB0 = 1 ; la valeur de RA0 haute
BD0I.byteCount = 0 x 00 ; nombre d’octets EP0 IN la valeur 0
BD0I.Status = 0xC8 ; Envoyer le paquet comme DATA1, UOWN bit de la valeur
rupture ;
Nous l’avons fait pour chaque broche RB0-RB7 pour nous permettre de pouvoir tester et faciliter les moyens de débogage.
En créant des images comme le damier, nous avons commencé de la même manière comme une demande de code pin spécifique, mais nous avons attribué le sur et hors les vannes avec 0 et 1 (chaque numéro passe à l’un des huit broches). Ceci permettre l’usage multiple des opérations simultanées broche.
Exemple de Code :
affaire SET_DUTY : SERVICE = USB_buffer_data [wValue] ; cas de damier : PORTB = 0b11001100 ; tandis que (1) {} Temp = TMR0L ; verrou de l’octet de poids fort du compteur Timer0 dans TMR0H en lisant TMR0L
BD0I.byteCount = 0 x 00 ; nombre d’octets EP0 IN la valeur 0
BD0I.Status = 0xC8 ; Envoyer le paquet comme DATA1, UOWN bit de la valeur
Delay10KTCYx(10) ;
PORTB = 0b00000000 ;
Ces modifications de script, que nous avons pu en détail sur un programme qui peut se traduire par des images de grille à l’eau affiche.
* Voir ci-dessous pour le code réel.