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