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