Show last authors
1 = Commutation d'antenne via raspberry - py =
2
3 Ce commutateur va permettre via internet de modifier l' antenne reliée au TX de la station EM.
4
5 Ce travail a été confié à un apprenant de 4ème année (M// Loris Gilliand//) .
6
7
8 = [[Fabrication>>doc:fabricationSwitch]] =
9
10
11 = Interface Homme - Machine =
12
13 Pour commuter le TX sur une autre antenne, il suffit de taper la lettre (//canal désiré) au clavier.//
14
15 L'image se modifie selon votre choix pour valider sa commutation.
16
17 Vous pouvez via la "souris" obtenir le même résultat !
18
19
20
21 [[image:PremFenetre.jpg]]
22
23
24
25 [[image:ZoneAide.jpg]]
26
27
28
29 [[image:BoutonIndication.jpg]]
30
31
32 [[image:ClassGpio.jpg]]
33
34
35 On a ajouté un LCD fournit par //HB9FOX //qui permet de commuter directement sur le module la bonne Antenne.
36
37 **IMPORTANT !!** Pour ce faire le raspberry - py doit fonctionné et le programme lancé !
38
39
40 Voici le détail :
41
42
43 [[image:lcdVue.jpg]]
44
45
46 [[image:lcdCommande.jpg]]
47
48
49 == Câblage du module ==
50
51 Le raspberry - py travaille avec 8 GPIO qui pour des raisons de protection transite via des opto - coupleurs.
52
53 Une carte dédiée à cette protection a été développée.
54
55 Le rasbberry - py est directement relié aux entrée de ces optos et la photo montre comment relié les sorties
56
57 des optos à la carte relais. Une carte relais possède 4 relais de commutation. C'est pourquoi le module
58
59 possède 2 cartes relais.
60
61
62
63 [[image:OptoRelais.jpg]]
64
65
66
67 Depuis les sorties relais on installe le câble de la boite de commutation.
68
69
70 [[image:RelaiCommutateur.jpg]]
71
72
73 Les fils rouge sont l'arrivée du 12 Vdc depuis l'autre côté de la carte relais.
74
75 **Ne pas oublier de les relier au 12Vdc !**
76
77 == Câble ==
78
79
80 [[image:cableCommAnt.jpg]]
81
82
83
84 = Programmation Python =
85
86 Voici le code source, vous pouvez le copier directement dans un IDLE Python 2.7.
87
88 Si vous ne l'avez pas, vous pouvez le télécharger sur le site Python [[https:~~/~~/www.python.org/downloads/>>url:https://www.python.org/downloads/]].
89
90 Pour linux c'est plus simple il suffit d' ouvrir l'IDLE 2.7 déjà présent
91
92 sur votre carte raspberry - py.
93
94 **Important !! **je suis parti du principe que le port **//I2C//** est fonctionnel sur votre raspberry - py.
95
96 **Si ce n'est pas le cas, seul la distribution sans le LCD fonctionnera !**
97
98
99
100 == Source : ==
101
102
103
104 {{{# auteur : Gilliand Loris
105 # date : 02.06.14
106 # version 0.8
107 #
108 # amelioration depuis 0.7 : integre un lcd qui peut commander les changements
109
110 # importation bibilotheques
111 import pygame, sys, time
112 from pygame.locals import *
113 import RPi.GPIO as GPIO
114 from Adafruit_CharLCDPlate import *
115
116 # initialisation fenetre et gpio
117 pygame.init()
118 GPIO.setmode(GPIO.BCM)
119
120 # fonction qui change LA sortie active
121 def change_sortie(ligne):
122 BP1.etat = 0
123 BP2.etat = 0
124 BP3.etat = 0
125 BP4.etat = 0
126 BP1.affiche_etat(inactif)
127 BP2.affiche_etat(inactif)
128 BP3.affiche_etat(inactif)
129 BP4.affiche_etat(inactif)
130 time.sleep(0.25)
131 if ligne == 'a':
132 BP1.etat = 1
133 BP1.affiche_etat(actif)
134 elif ligne == 'b':
135 BP2.etat = 1
136 BP2.affiche_etat(actif)
137 elif ligne == 'c':
138 BP3.etat = 1
139 BP3.affiche_etat(actif)
140 elif ligne == 'd':
141 BP4.etat = 1
142 BP4.affiche_etat(actif)
143
144 # classe de creation de cases
145 class Cases:
146 def init(self,image,pos,port,init):
147 self.image = pygame.image.load(image).convert()
148 self.pos = pos
149 self.port = port
150 self.etat = init
151 self.rect = self.image.get_rect().move(self.pos)
152 GPIO.setup(self.port,GPIO.OUT)
153 GPIO.output(self.port,GPIO.LOW)
154
155 def affiche_etat(self,indicateur):
156 indicateur = pygame.image.load(indicateur).convert()
157 indi_rect = indicateur.get_rect()
158 indi_rect.centerx = self.rect.centerx - self.pos[0]
159 indi_rect.centery = self.rect.centery - self.pos[1]
160 if self.etat == 0:
161 GPIO.output(self.port,GPIO.LOW)
162 elif self.etat == 1:
163 GPIO.output(self.port,GPIO.HIGH)
164 self.image.blit(indicateur,indi_rect)
165
166 # initialisation de la fenetre
167 screen = pygame.display.set_mode((600,600))
168 clock = pygame.time.Clock()
169 # initialisation des couleurs
170 rouge = (255,0,0)
171 noir = (0,0,0)
172 blanc = (255,255,255)
173 vert = (0,255,0)
174 bleu = (0,0,255)
175
176 # initialisation des variables
177 startline = (183,149)
178 endline = (293,75)
179
180 flag_canal = 0
181
182 canal = [4,17,18,22,23,24,25,27]
183
184 # definitions des zones
185 zone1 = pygame.Surface((600,150))
186 zone1.fill(bleu)
187
188 zone2 = pygame.Surface((400,300))
189 zone2.fill(bleu)
190
191 zone3 = pygame.Surface((600,150))
192 zone3.fill(bleu)
193
194 zone4 = pygame.Surface((200,300))
195 zone4.fill(bleu)
196
197 # definitions des objets a afficher dans les zones
198 # zone 1
199 font = pygame.font.Font(None,60)
200 titre1 = font.render("HB9EM",1,noir)
201 titre2 = font.render("Commutateur d'antennes",1,noir)
202 zone1.blit(titre1,(230,30))
203 zone1.blit(titre2,(50,70))
204
205 # zone 2
206 commu = pygame.image.load("commu_antenne.bmp").convert()
207 zone2.blit(commu,(50,50))
208
209 # zone 3
210 actif = "actif_commu.bmp"
211 inactif = "inactif_commu.bmp"
212
213 BP1 = Cases("bouton_commu.bmp",(125,50),canal[1],1)
214 BP2 = Cases("bouton_commu.bmp",(225,50),canal[2],0)
215 BP3 = Cases("bouton_commu.bmp",(325,50),canal[3],0)
216 BP4 = Cases("bouton_commu.bmp",(425,50),canal[4],0)
217 grp_cases = [BP1,BP2,BP3,BP4]
218 BP1.affiche_etat(actif)
219 BP2.affiche_etat(inactif)
220 BP3.affiche_etat(inactif)
221 BP4.affiche_etat(inactif)
222
223 zone3.blit(BP1.image,BP1.rect)
224 zone3.blit(BP2.image,BP2.rect)
225 zone3.blit(BP3.image,BP3.rect)
226 zone3.blit(BP4.image,BP4.rect)
227
228 font = pygame.font.Font(None,20)
229 canal_a = font.render("canal A",1,noir)
230 canal_b = font.render("canal B",1,noir)
231 canal_c = font.render("canal C",1,noir)
232 canal_d = font.render("canal D",1,noir)
233 zone3.blit(canal_a,(125,35))
234 zone3.blit(canal_b,(225,35))
235 zone3.blit(canal_c,(325,35))
236 zone3.blit(canal_d,(425,35))
237
238 # zone 4
239 commande = font.render("Commandes :",1,noir)
240 touche_a = font.render("Selection canal A : touche a",1,noir)
241 touche_b = font.render("Selection canal B : touche b",1,noir)
242 touche_c = font.render("Selection canal C : touche c",1,noir)
243 touche_d = font.render("Selection canal D : touche d",1,noir)
244 quitter = font.render("Quitter : touche q",1,noir)
245 zone4.blit(commande,(10,20))
246 zone4.blit(touche_a,(10,60))
247 zone4.blit(touche_b,(10,80))
248 zone4.blit(touche_c,(10,100))
249 zone4.blit(touche_d,(10,120))
250 zone4.blit(quitter,(10,200))
251
252 # affichage des zones
253 screen.blit(zone1,(0,0))
254 screen.blit(zone2,(0,150))
255 screen.blit(zone3,(0,450))
256 screen.blit(zone4,(400,150))
257
258 lcd = Adafruit_CharLCDPlate()
259 lcd.begin(16,2)
260 btn = ((lcd.SELECT, '', lcd.ON),
261 (lcd.LEFT , 'Antenne 1' , lcd.ON),
262 (lcd.UP , 'Antenne 2' , lcd.ON),
263 (lcd.DOWN , 'Antenne 4' , lcd.ON),
264 (lcd.RIGHT , 'Antenne 3' , lcd.ON))
265 prev = -1
266 temp = ''
267 active = 'Antenne 1'
268 act = ' active'
269 lcd.message((active + act))
270 while 1:
271 clock.tick(30)
272 for b in btn:
273 if lcd.buttonPressed(lcd.SELECT):
274 lcd.clear()
275 lcd.message((active + act))
276 time.sleep(0.25)
277 if temp != '':
278 active = temp
279 temp = ''
280 if active == 'Antenne 1':
281 change_sortie('a')
282 endline = (293,75)
283 if active == 'Antenne 2':
284 change_sortie('b')
285 endline = (293,125)
286 if active == 'Antenne 3':
287 change_sortie('c')
288 endline = (293,175)
289 if active == 'Antenne 4':
290 change_sortie('d')
291 endline = (293,225)
292 lcd.setCursor(0,0)
293 lcd.message((active + act))
294 lcd.setCursor(0,1)
295 lcd.message(' ')
296 if lcd.buttonPressed(lcd.RIGHT):
297 temp = 'Antenne 3'
298 lcd.setCursor(0,1)
299 lcd.message(temp)
300 if lcd.buttonPressed(lcd.DOWN):
301 temp = 'Antenne 4'
302 lcd.setCursor(0,1)
303 lcd.message(temp)
304 if lcd.buttonPressed(lcd.UP):
305 temp = 'Antenne 2'
306 lcd.setCursor(0,1)
307 lcd.message(temp)
308 if lcd.buttonPressed(lcd.LEFT):
309 temp = 'Antenne 1'
310 lcd.setCursor(0,1)
311 lcd.message(temp)
312
313 for event in pygame.event.get():
314 lcd.setCursor(0,0)
315 if event.type == pygame.QUIT:
316 GPIO.cleanup()
317 sys.exit()
318 if event.type == pygame.KEYDOWN:
319 if event.key == pygame.K_q:
320 GPIO.cleanup()
321 sys.exit()
322 if event.key == pygame.K_a:
323 active = 'Antenne 1'
324 lcd.message((active + act))
325 change_sortie('a')
326 endline = (293,75)
327 if event.key == pygame.K_b:
328 active = 'Antenne 2'
329 lcd.message((active + act))
330 change_sortie('b')
331 endline = (293,125)
332 if event.key == pygame.K_c:
333 active = 'Antenne 3'
334 lcd.message((active + act))
335 change_sortie('c')
336 endline = (293,175)
337 if event.key == pygame.K_d:
338 active = 'Antenne 4'
339 lcd.message((active + act))
340 change_sortie('d')
341 endline = (293,225)
342
343 souris = pygame.mouse.get_pos()
344 souris_rect = souris[0],souris[1,[5,5]]
345 souris_rect = pygame.Rect(souris_rect)
346
347 for i in grp_cases:
348 lcd.setCursor(0,0)
349 if souris_rect.colliderect(i.rect.move((0,450))):
350 if pygame.mouse.get_pressed() == (1,0,0):
351 if i.port == canal[1]:
352 active = 'Antenne 1'
353 lcd.message((active + act))
354 change_sortie('a')
355 endline = (293,75)
356 if i.port == canal[2]:
357 active = 'Antenne 2'
358 lcd.message((active + act))
359 change_sortie('b')
360 endline = (293,125)
361 if i.port == canal[3]:
362 active = 'Antenne 3'
363 lcd.message((active + act))
364 change_sortie('c')
365 endline = (293,175)
366 if i.port == canal[4]:
367 active = 'Antenne 4'
368 lcd.message((active + act))
369 change_sortie('d')
370 endline = (293,225)
371
372 zone3.blit(BP1.image,BP1.rect)
373 zone3.blit(BP2.image,BP2.rect)
374 zone3.blit(BP3.image,BP3.rect)
375 zone3.blit(BP4.image,BP4.rect)
376 screen.blit(zone3,(0,450))
377 zone2.blit(commu,(50,50))
378 pygame.draw.line(zone2,noir,startline,endline,2)
379 screen.blit(zone2,(0,150))
380 pygame.display.update()
381 }}}
382
383
384 [[Fichier Py>>attach:commu08.py]]
385
386
387 === Distributions 'source' sans et avec LCD ===
388
389 [[Distribution_sans_LCD.rar>>attach:Distribution.rar]]
390
391
392 [[Distribution_lcd.rar>>attach:Distribution_lcd.rar]]