Code source wiki de Commutateur d' antenne
Version 14.3 par Jean-Yves Dupertuis le 18-07-2014, 14:26
Afficher les derniers auteurs
| author | version | line-number | content |
|---|---|---|---|
| 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 transit 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 | |||
| 78 | == Câble == | ||
| 79 | |||
| 80 | |||
| 81 | [[image:cableCommAnt.jpg]] | ||
| 82 | |||
| 83 | |||
| 84 | |||
| 85 | = Programmation Python = | ||
| 86 | |||
| 87 | Voici le code source, vous pouvez le copier directement dans un IDLE Python 2.7. | ||
| 88 | |||
| 89 | 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/]]. | ||
| 90 | |||
| 91 | Pour linux c'est plus simple il suffit d' ouvrir l'IDLE 2.7 déjà présent | ||
| 92 | |||
| 93 | sur votre carte raspberry - py. | ||
| 94 | |||
| 95 | **Important !! **je suis parti du principe que le port **//I2C//** est fonctionnel sur votre raspberry - py. | ||
| 96 | |||
| 97 | **Si ce n'est pas le cas, seul la distribution sans le LCD fonctionnera !** | ||
| 98 | |||
| 99 | |||
| 100 | |||
| 101 | == Source : == | ||
| 102 | |||
| 103 | |||
| 104 | |||
| 105 | {{{# auteur : Gilliand Loris | ||
| 106 | # date : 02.06.14 | ||
| 107 | # version 0.8 | ||
| 108 | # | ||
| 109 | # amelioration depuis 0.7 : integre un lcd qui peut commander les changements | ||
| 110 | |||
| 111 | # importation bibilotheques | ||
| 112 | import pygame, sys, time | ||
| 113 | from pygame.locals import * | ||
| 114 | import RPi.GPIO as GPIO | ||
| 115 | from Adafruit_CharLCDPlate import * | ||
| 116 | |||
| 117 | # initialisation fenetre et gpio | ||
| 118 | pygame.init() | ||
| 119 | GPIO.setmode(GPIO.BCM) | ||
| 120 | |||
| 121 | # fonction qui change LA sortie active | ||
| 122 | def change_sortie(ligne): | ||
| 123 | BP1.etat = 0 | ||
| 124 | BP2.etat = 0 | ||
| 125 | BP3.etat = 0 | ||
| 126 | BP4.etat = 0 | ||
| 127 | BP1.affiche_etat(inactif) | ||
| 128 | BP2.affiche_etat(inactif) | ||
| 129 | BP3.affiche_etat(inactif) | ||
| 130 | BP4.affiche_etat(inactif) | ||
| 131 | time.sleep(0.25) | ||
| 132 | if ligne == 'a': | ||
| 133 | BP1.etat = 1 | ||
| 134 | BP1.affiche_etat(actif) | ||
| 135 | elif ligne == 'b': | ||
| 136 | BP2.etat = 1 | ||
| 137 | BP2.affiche_etat(actif) | ||
| 138 | elif ligne == 'c': | ||
| 139 | BP3.etat = 1 | ||
| 140 | BP3.affiche_etat(actif) | ||
| 141 | elif ligne == 'd': | ||
| 142 | BP4.etat = 1 | ||
| 143 | BP4.affiche_etat(actif) | ||
| 144 | |||
| 145 | # classe de creation de cases | ||
| 146 | class Cases: | ||
| 147 | def init(self,image,pos,port,init): | ||
| 148 | self.image = pygame.image.load(image).convert() | ||
| 149 | self.pos = pos | ||
| 150 | self.port = port | ||
| 151 | self.etat = init | ||
| 152 | self.rect = self.image.get_rect().move(self.pos) | ||
| 153 | GPIO.setup(self.port,GPIO.OUT) | ||
| 154 | GPIO.output(self.port,GPIO.LOW) | ||
| 155 | |||
| 156 | def affiche_etat(self,indicateur): | ||
| 157 | indicateur = pygame.image.load(indicateur).convert() | ||
| 158 | indi_rect = indicateur.get_rect() | ||
| 159 | indi_rect.centerx = self.rect.centerx - self.pos[0] | ||
| 160 | indi_rect.centery = self.rect.centery - self.pos[1] | ||
| 161 | if self.etat == 0: | ||
| 162 | GPIO.output(self.port,GPIO.LOW) | ||
| 163 | elif self.etat == 1: | ||
| 164 | GPIO.output(self.port,GPIO.HIGH) | ||
| 165 | self.image.blit(indicateur,indi_rect) | ||
| 166 | |||
| 167 | # initialisation de la fenetre | ||
| 168 | screen = pygame.display.set_mode((600,600)) | ||
| 169 | clock = pygame.time.Clock() | ||
| 170 | # initialisation des couleurs | ||
| 171 | rouge = (255,0,0) | ||
| 172 | noir = (0,0,0) | ||
| 173 | blanc = (255,255,255) | ||
| 174 | vert = (0,255,0) | ||
| 175 | bleu = (0,0,255) | ||
| 176 | |||
| 177 | # initialisation des variables | ||
| 178 | startline = (183,149) | ||
| 179 | endline = (293,75) | ||
| 180 | |||
| 181 | flag_canal = 0 | ||
| 182 | |||
| 183 | canal = [4,17,18,22,23,24,25,27] | ||
| 184 | |||
| 185 | # definitions des zones | ||
| 186 | zone1 = pygame.Surface((600,150)) | ||
| 187 | zone1.fill(bleu) | ||
| 188 | |||
| 189 | zone2 = pygame.Surface((400,300)) | ||
| 190 | zone2.fill(bleu) | ||
| 191 | |||
| 192 | zone3 = pygame.Surface((600,150)) | ||
| 193 | zone3.fill(bleu) | ||
| 194 | |||
| 195 | zone4 = pygame.Surface((200,300)) | ||
| 196 | zone4.fill(bleu) | ||
| 197 | |||
| 198 | # definitions des objets a afficher dans les zones | ||
| 199 | # zone 1 | ||
| 200 | font = pygame.font.Font(None,60) | ||
| 201 | titre1 = font.render("HB9EM",1,noir) | ||
| 202 | titre2 = font.render("Commutateur d'antennes",1,noir) | ||
| 203 | zone1.blit(titre1,(230,30)) | ||
| 204 | zone1.blit(titre2,(50,70)) | ||
| 205 | |||
| 206 | # zone 2 | ||
| 207 | commu = pygame.image.load("commu_antenne.bmp").convert() | ||
| 208 | zone2.blit(commu,(50,50)) | ||
| 209 | |||
| 210 | # zone 3 | ||
| 211 | actif = "actif_commu.bmp" | ||
| 212 | inactif = "inactif_commu.bmp" | ||
| 213 | |||
| 214 | BP1 = Cases("bouton_commu.bmp",(125,50),canal[1],1) | ||
| 215 | BP2 = Cases("bouton_commu.bmp",(225,50),canal[2],0) | ||
| 216 | BP3 = Cases("bouton_commu.bmp",(325,50),canal[3],0) | ||
| 217 | BP4 = Cases("bouton_commu.bmp",(425,50),canal[4],0) | ||
| 218 | grp_cases = [BP1,BP2,BP3,BP4] | ||
| 219 | BP1.affiche_etat(actif) | ||
| 220 | BP2.affiche_etat(inactif) | ||
| 221 | BP3.affiche_etat(inactif) | ||
| 222 | BP4.affiche_etat(inactif) | ||
| 223 | |||
| 224 | zone3.blit(BP1.image,BP1.rect) | ||
| 225 | zone3.blit(BP2.image,BP2.rect) | ||
| 226 | zone3.blit(BP3.image,BP3.rect) | ||
| 227 | zone3.blit(BP4.image,BP4.rect) | ||
| 228 | |||
| 229 | font = pygame.font.Font(None,20) | ||
| 230 | canal_a = font.render("canal A",1,noir) | ||
| 231 | canal_b = font.render("canal B",1,noir) | ||
| 232 | canal_c = font.render("canal C",1,noir) | ||
| 233 | canal_d = font.render("canal D",1,noir) | ||
| 234 | zone3.blit(canal_a,(125,35)) | ||
| 235 | zone3.blit(canal_b,(225,35)) | ||
| 236 | zone3.blit(canal_c,(325,35)) | ||
| 237 | zone3.blit(canal_d,(425,35)) | ||
| 238 | |||
| 239 | # zone 4 | ||
| 240 | commande = font.render("Commandes :",1,noir) | ||
| 241 | touche_a = font.render("Selection canal A : touche a",1,noir) | ||
| 242 | touche_b = font.render("Selection canal B : touche b",1,noir) | ||
| 243 | touche_c = font.render("Selection canal C : touche c",1,noir) | ||
| 244 | touche_d = font.render("Selection canal D : touche d",1,noir) | ||
| 245 | quitter = font.render("Quitter : touche q",1,noir) | ||
| 246 | zone4.blit(commande,(10,20)) | ||
| 247 | zone4.blit(touche_a,(10,60)) | ||
| 248 | zone4.blit(touche_b,(10,80)) | ||
| 249 | zone4.blit(touche_c,(10,100)) | ||
| 250 | zone4.blit(touche_d,(10,120)) | ||
| 251 | zone4.blit(quitter,(10,200)) | ||
| 252 | |||
| 253 | # affichage des zones | ||
| 254 | screen.blit(zone1,(0,0)) | ||
| 255 | screen.blit(zone2,(0,150)) | ||
| 256 | screen.blit(zone3,(0,450)) | ||
| 257 | screen.blit(zone4,(400,150)) | ||
| 258 | |||
| 259 | lcd = Adafruit_CharLCDPlate() | ||
| 260 | lcd.begin(16,2) | ||
| 261 | btn = ((lcd.SELECT, '', lcd.ON), | ||
| 262 | (lcd.LEFT , 'Antenne 1' , lcd.ON), | ||
| 263 | (lcd.UP , 'Antenne 2' , lcd.ON), | ||
| 264 | (lcd.DOWN , 'Antenne 4' , lcd.ON), | ||
| 265 | (lcd.RIGHT , 'Antenne 3' , lcd.ON)) | ||
| 266 | prev = -1 | ||
| 267 | temp = '' | ||
| 268 | active = 'Antenne 1' | ||
| 269 | act = ' active' | ||
| 270 | lcd.message((active + act)) | ||
| 271 | while 1: | ||
| 272 | clock.tick(30) | ||
| 273 | for b in btn: | ||
| 274 | if lcd.buttonPressed(lcd.SELECT): | ||
| 275 | lcd.clear() | ||
| 276 | lcd.message((active + act)) | ||
| 277 | time.sleep(0.25) | ||
| 278 | if temp != '': | ||
| 279 | active = temp | ||
| 280 | temp = '' | ||
| 281 | if active == 'Antenne 1': | ||
| 282 | change_sortie('a') | ||
| 283 | endline = (293,75) | ||
| 284 | if active == 'Antenne 2': | ||
| 285 | change_sortie('b') | ||
| 286 | endline = (293,125) | ||
| 287 | if active == 'Antenne 3': | ||
| 288 | change_sortie('c') | ||
| 289 | endline = (293,175) | ||
| 290 | if active == 'Antenne 4': | ||
| 291 | change_sortie('d') | ||
| 292 | endline = (293,225) | ||
| 293 | lcd.setCursor(0,0) | ||
| 294 | lcd.message((active + act)) | ||
| 295 | lcd.setCursor(0,1) | ||
| 296 | lcd.message(' ') | ||
| 297 | if lcd.buttonPressed(lcd.RIGHT): | ||
| 298 | temp = 'Antenne 3' | ||
| 299 | lcd.setCursor(0,1) | ||
| 300 | lcd.message(temp) | ||
| 301 | if lcd.buttonPressed(lcd.DOWN): | ||
| 302 | temp = 'Antenne 4' | ||
| 303 | lcd.setCursor(0,1) | ||
| 304 | lcd.message(temp) | ||
| 305 | if lcd.buttonPressed(lcd.UP): | ||
| 306 | temp = 'Antenne 2' | ||
| 307 | lcd.setCursor(0,1) | ||
| 308 | lcd.message(temp) | ||
| 309 | if lcd.buttonPressed(lcd.LEFT): | ||
| 310 | temp = 'Antenne 1' | ||
| 311 | lcd.setCursor(0,1) | ||
| 312 | lcd.message(temp) | ||
| 313 | |||
| 314 | for event in pygame.event.get(): | ||
| 315 | lcd.setCursor(0,0) | ||
| 316 | if event.type == pygame.QUIT: | ||
| 317 | GPIO.cleanup() | ||
| 318 | sys.exit() | ||
| 319 | if event.type == pygame.KEYDOWN: | ||
| 320 | if event.key == pygame.K_q: | ||
| 321 | GPIO.cleanup() | ||
| 322 | sys.exit() | ||
| 323 | if event.key == pygame.K_a: | ||
| 324 | active = 'Antenne 1' | ||
| 325 | lcd.message((active + act)) | ||
| 326 | change_sortie('a') | ||
| 327 | endline = (293,75) | ||
| 328 | if event.key == pygame.K_b: | ||
| 329 | active = 'Antenne 2' | ||
| 330 | lcd.message((active + act)) | ||
| 331 | change_sortie('b') | ||
| 332 | endline = (293,125) | ||
| 333 | if event.key == pygame.K_c: | ||
| 334 | active = 'Antenne 3' | ||
| 335 | lcd.message((active + act)) | ||
| 336 | change_sortie('c') | ||
| 337 | endline = (293,175) | ||
| 338 | if event.key == pygame.K_d: | ||
| 339 | active = 'Antenne 4' | ||
| 340 | lcd.message((active + act)) | ||
| 341 | change_sortie('d') | ||
| 342 | endline = (293,225) | ||
| 343 | |||
| 344 | souris = pygame.mouse.get_pos() | ||
| 345 | souris_rect = souris[0],souris[1,[5,5]] | ||
| 346 | souris_rect = pygame.Rect(souris_rect) | ||
| 347 | |||
| 348 | for i in grp_cases: | ||
| 349 | lcd.setCursor(0,0) | ||
| 350 | if souris_rect.colliderect(i.rect.move((0,450))): | ||
| 351 | if pygame.mouse.get_pressed() == (1,0,0): | ||
| 352 | if i.port == canal[1]: | ||
| 353 | active = 'Antenne 1' | ||
| 354 | lcd.message((active + act)) | ||
| 355 | change_sortie('a') | ||
| 356 | endline = (293,75) | ||
| 357 | if i.port == canal[2]: | ||
| 358 | active = 'Antenne 2' | ||
| 359 | lcd.message((active + act)) | ||
| 360 | change_sortie('b') | ||
| 361 | endline = (293,125) | ||
| 362 | if i.port == canal[3]: | ||
| 363 | active = 'Antenne 3' | ||
| 364 | lcd.message((active + act)) | ||
| 365 | change_sortie('c') | ||
| 366 | endline = (293,175) | ||
| 367 | if i.port == canal[4]: | ||
| 368 | active = 'Antenne 4' | ||
| 369 | lcd.message((active + act)) | ||
| 370 | change_sortie('d') | ||
| 371 | endline = (293,225) | ||
| 372 | |||
| 373 | zone3.blit(BP1.image,BP1.rect) | ||
| 374 | zone3.blit(BP2.image,BP2.rect) | ||
| 375 | zone3.blit(BP3.image,BP3.rect) | ||
| 376 | zone3.blit(BP4.image,BP4.rect) | ||
| 377 | screen.blit(zone3,(0,450)) | ||
| 378 | zone2.blit(commu,(50,50)) | ||
| 379 | pygame.draw.line(zone2,noir,startline,endline,2) | ||
| 380 | screen.blit(zone2,(0,150)) | ||
| 381 | pygame.display.update() | ||
| 382 | }}} | ||
| 383 | |||
| 384 | |||
| 385 | [[Fichier Py>>attach:commu08.py]] | ||
| 386 | |||
| 387 | |||
| 388 | === Distributions sans et avec LCD === | ||
| 389 | |||
| 390 | [[Distribution_sans_LCD.rar>>attach:Distribution.rar]] | ||
| 391 | |||
| 392 | |||
| 393 | [[Distribution_lcd.rar>>attach:Distribution_lcd.rar]] |