Jump to content
F4HJH

Contrôle d'un périphérique en I2C (PA, LPF, ...)

Recommended Posts

F4HJH

Puis l’arrière :

HAMLAB_C25_ARRIERE.thumb.JPG.6b9a4d85bd3af1514bbb976540161fb2.JPG

Share this post


Link to post
F6EHJ

Christophe,
Bon...Les 7 filrtres LP sont sur le second 9555, reste à savoir à quoi sert le 1er avec ses relais K3 à K6 et ce que commutent les deux FET's Q6 et Q7.
Après je ne sais pas trop ce que tu veux faire globalement au niveau soft..
A suivre,
73
Gérard

Share this post


Link to post
F6EHJ

C'est ceci ?
 

Ham.JPG

Share this post


Link to post
F4HJH
il y a 25 minutes, F6EHJ a dit :

Bon...Les 7 filrtres LP sont sur le second 9555, reste à savoir à quoi sert le 1er avec ses relais K3 à K6 et ce que commutent les deux FET's Q6 et Q7.
Après je ne sais pas trop ce que tu veux faire globalement au niveau soft..

Bonsoir Gérard,

je pense que l'on a les principaux IO, le reste : Atténuateur, Pre-amp, relais Ant1/Ant2, puis le PA commandé par je suppose le PCA 9557A (0x1A) avec les eux IO.

Niveau soft ? Je veut sortir du carcan Charly25 fermé et pouvoir piloter ce PA/BPF en i2C avec un arduino le tout avec PowerSDR MRX (Open Source) et non la version spéciale C25 et bien sur non documentée...

Car pour mémoire, ce kit est vendu sous la formre d'un package : RedPitaya + PA/BPF et PowerSdr version C25.... 

Et puis apprendre, la tâche n'est pas facile mais intéressante : j'apprend grâce à toi et aux autres contributeurs  le bus I2C et d'autres choses.

Share this post


Link to post
F6EHJ

Christophe,
Je vois à peu près.
Par contre j'atteins vite mon seuil d'incompétence s'il faut interfacer l'Arduino avec PowerSDR ou autre logiciel..
Bonne soirée
73
Gérard

Share this post


Link to post
F4HJH
il y a 11 minutes, F6EHJ a dit :

s'il faut interfacer l'Arduino avec PowerSDR ou autre logiciel..

non, on ne s'interface pas ! c'est suffisamment compliqué déjà 😄 

Il s'agit juste de piloter ce module avec un arduino !

Share this post


Link to post
F6EHJ

OK. Il faut décrire le hard dans ce cas pour le changement de bande.
A suivre
Gérard

Share this post


Link to post
F4HJH

Bonjour,

c'est dommage que je ne puisse pas éditer le premier message de cette file pour mettre à jour le sujet, faire une synthèse. Je demanderai peut être la suppression de cette file et je pourrai créer un nouveau sujet.

En attendant, j'ai beaucoup avancé.

Voici une synthèse :

Citation

 

Pour mémoire, l'objectif est de piloter un module C25 Hamlab PA / Filtres via le bus I2C depuis un arduino,

Le module C25 Hamlab est "une boite noire" non documentée, vendue sous la forme d'un package Carte Red Pitaya + Module PA + Filtres,

Le package est piloté dans son ensemble par une version fermée de PowerSDR dédiée au module C25, il existe de la documentation pour aider les novices à démarrer mais les elements Hard/Soft ne sont malheureusement pas décrits.

La carte Red Pitaya est une carte de type "Digital Signal Processing" dotée de deux TX et deux RX, à échantillonnage direct,  (Il existe un sujet sur le SDR) le tout est contrôlé par un microcontrôleur.

L'OS de la carte Red Pitaya dans le package est aussi très fermé !! Bref, on ne sais pas comment cela fonctionne, c'est un comble pour du matériel réservé à des radioamateurs.

Il existe bien heureusement une alternative Open Source (Voir Red Pitaya Notes de Pavel DEMIN) très intéressante qui fonctionne à la perfection avec les cartes Red Pitaya 14 et 16 bits.

Pavel a écrit l'OS pour que la Red Pitaya soit compatible avec la liaison HPSDR/HERMES et la version Open Source de Power SDR (mRX)

 

 

Je souhaite donc suivre la voie de l'Open Source et continuer à utiliser le module C25 Hamlab car il fonctionne très bien et a pas mal d’intérêt. 

Initialement, j'ai voulu aller vite et j'ai fait pas mal d'impasses qui ont mené à pas grand choses, j'ai donc changé de méthode.

1/ Reverse-Engineering du module C25 Hamlab

Etape essentielle pour comprendre ce qui est câblé : Relevé avec deux pointes de touche, un multimètre sur les deux faces... Pas facile mais cette étape à permis de comprendre ce qui est cablé

image.thumb.png.aa65b9d635688492914cfcaa920bcf65.png

 

 2/ Établir la liaison entre la partie logique et les périphériques

J'ai repris les différents bouts de codes qui ont été écrits par le groupe Allemand Charly 25 (publié ici sur GitHub) pour comprendre la logique et établir les liaisons Logique <-> Physique. (cela m'a permis de vérifier ma compréhension même si l'on pouvais se douter que pour activer l'IO 0.0 à l'état haut il faut écrire 00000001 ) 

C'est intéressant car j'ai appris une syntaxe et des opérandes que je ne connaissait pas dans le code de l'arduino (^ | & ).

Les fonctions PTT, Att, ... fonctionnent façon switch : j'appuie : 1, j'appuie à nouveau : 0. Les fonction de commutation de filtre sont par contre cumulatives : c'est assez curieux..

J'en suis donc arrivé ici : le lien entre les valeurs à inscrire dans les registres du PCA9555D (16 IO) ou le PCA9557D (8 IO) sont décrites ci-dessous.

Il reste quelques zones d'ombre (à quoi servent les relais K3, K4, et les Mosfet Q6 et Q7) puis les deux IO du PCA9557D - mais l'essentiel est connu.

LIAISON LOGIQUE LIAISON PHYSIQUE
Peripherique Addresse peripherique Numéro IO port IO DEC IO : HEX IO : BIN Interface Peripheriques connectés Fonction  
U2 PCA 9555D 0x20 0 I/O 0_0 1 1 B00000001 U3 - ULN2803A -> OUT1 K3, K4    
U2 PCA 9555D 0x20 1 I/O 0_1 2 2 B00000010 U3 - ULN2803A -> OUT2 K5, K6    
U2 PCA 9555D 0x20 2 I/O 0_2 4 4 B00000100 U3 - ULN2803A -> OUT3 Q6 (F4905S)    
U2 PCA 9555D 0x20 3 I/O 0_3 8 8 B00001000 U3 - ULN2803A -> OUT4 Q7 (F4905S)    
U2 PCA 9555D 0x20 4 I/O 0_4 16 10 B00010000 U3 - ULN2803A -> OUT5      
U2 PCA 9555D 0x20 5 I/O 0_5 32 20 B00100000 U3 - ULN2803A -> OUT6      
U2 PCA 9555D 0x20 6 I/O 0_6 64 40 B01000000 U3 - ULN2803A -> OUT7      
U2 PCA 9555D 0x20 7 I/O 0_7 128 80 B10000000 U3 - ULN2803A -> OUT8      
U2 PCA 9555D 0x20 8 I/O 1_0 1 1 B00000001 U4 - ULN2803A -> OUT1 K23, K24 Relais filtre bande 6m  
U2 PCA 9555D 0x20 9 I/O 1_1 2 2 B00000010 U4 - ULN2803A -> OUT2 K22, K21 Relais filtre bande 10/12m  
U2 PCA 9555D 0x20 10 I/O 1_2 4 4 B00000100 U4 - ULN2803A -> OUT3 K19, K20 Relais filtre bande 15/17m  
U2 PCA 9555D 0x20 11 I/O 1_3 8 8 B00001000 U4 - ULN2803A -> OUT4 K17, K18 Relais filtre bande 20/30m  
U2 PCA 9555D 0x20 12 I/O 1_4 16 10 B00010000 U4 - ULN2803A -> OUT5 K15, K16 Relais filtre bande 40m  
U2 PCA 9555D 0x20 13 I/O 1_5 32 20 B00100000 U4 - ULN2803A -> OUT6 K13, K14 Relais filtre bande 80m  
U2 PCA 9555D 0x20 14 I/O 1_6 64 40 B01000000 U4 - ULN2803A -> OUT7 K11, K12 Relais filtre bande 160m  
U2 PCA 9555D 0x20 15 I/O 1_7 128 80 B10000000 U4 - ULN2803A -> OUT8      
U1 PCA 9557D 0x1a 0 I/O 0_0       - - DIRECT - - GND    
U1 PCA 9557D 0x1a 1 I/O 0_1 2 2 B00000010 - - DIRECT - - R4 -> ?    
U1 PCA 9557D 0x1a 2 I/O 0_2       - - DIRECT - - GND    
U1 PCA 9557D 0x1a 3 I/O 0_3       - - DIRECT - - GND    
U1 PCA 9557D 0x1a 4 I/O 0_4       - - DIRECT - - GND    
U1 PCA 9557D 0x1a 5 I/O 0_5       - - DIRECT - - GND    
U1 PCA 9557D 0x1a 6 I/O 0_6       - - DIRECT - - GND    
U1 PCA 9557D 0x1a 7 I/O 0_7 128 80 B10000000 - - DIRECT - - R17 -> ?    

J'en suis donc ici, il reste à écrire le code depuis la trame proposée par Gérard @F6EHJ et adapter les valeurs à inscrire dans les registres.

Entre temps, je referais peut être une écoute plus méthodique des trames I2C afin de vérifier les valeurs que j'ai reportées dans le tableau et compléter le reste.

 

 

Share this post


Link to post
F4HJH

Mise à jour. (Cette fois ci : ça y est !! tout fonctionne :))

Le second CI PCA9557 (0x1A) ne peut être piloté directement, je passe par le PCA9555... Je vais me documenter.

Il existe un petit programme bien fait qui m'a aidé à vérifier les valeurs des registres https://www.pobot.org/Tutoriel-complet-sur-I2C.html

Il me reste à produire le code complet, maintenant ça va être facile. (Vive l'I2C :lol:)

LIAISON LOGIQUE LIAISON PHYSIQUE
Peripherique Addresse peripherique Numéro IO port IO PORT DEC IO : HEX IO : BIN Interface Peripheriques connectés Fonction
U2 PCA 9555D 0x20 0 I/O 0_0 Port 0 : 0x02 1 1 B00000001 U3 - ULN2803A -> OUT1 K3, K4 Attenuateur 12 dB
U2 PCA 9555D 0x20 1 I/O 0_1 Port 0 : 0x02 2 2 B00000010 U3 - ULN2803A -> OUT2 K5, K6 Attenuateur 24 dB
U2 PCA 9555D 0x20     Port 0 : 0x02 3 3 B00000011     Attenuateur 36 dB
U2 PCA 9555D 0x20 2 I/O 0_2 Port 0 : 0x02 4 4 B00000100 U3 - ULN2803A -> OUT3 Q6 (F4905S) - K7, K8 Pre Amp 18 dB
U2 PCA 9555D 0x20     Port 0 : 0x02 5 5 B00000101     Pre Amp 6 dB
U2 PCA 9555D 0x20     Port 0 : 0x02 6 6 B00000110     Attenuateur 6 dB
U2 PCA 9555D 0x20 3 I/O 0_3 Port 0 : 0x02 8 8 B00001000 U3 - ULN2803A -> OUT4 Q7 (F4905S) - K9, K10  
U2 PCA 9555D 0x20     Port 0 : 0x02 12 C B00001100     Pre Amp 36 dB
U2 PCA 9555D 0x20     Port 0 : 0x02 14 E B00001110     Pre Amp 12 dB
U2 PCA 9555D 0x20     Port 0 : 0x02 13 D B00001101     Pre Amp 24 dB
U2 PCA 9555D 0x20     Port 0 : 0x02 48 30 B00110000     PTT
U2 PCA 9555D 0x20 4 I/O 0_4 Port 0 : 0x02 16 10 B00010000 U3 - ULN2803A -> OUT5    
U2 PCA 9555D 0x20 5 I/O 0_5 Port 0 : 0x02 32 20 B00100000 U3 - ULN2803A -> OUT6    
U2 PCA 9555D 0x20 6 I/O 0_6 Port 0 : 0x02 64 40 B01000000 U3 - ULN2803A -> OUT7   Antenne 2
U2 PCA 9555D 0x20 7 I/O 0_7 Port 0 : 0x02 128 80 B10000000 U3 - ULN2803A -> OUT8    
U2 PCA 9555D 0x20 8 I/O 1_0 Port 1 : 0x03 1 1 B00000001 U4 - ULN2803A -> OUT1 K23, K24 Relais filtre bande 6m
U2 PCA 9555D 0x20 9 I/O 1_1 Port 1 : 0x03 2 2 B00000010 U4 - ULN2803A -> OUT2 K22, K21 Relais filtre bande 10/12m
U2 PCA 9555D 0x20 10 I/O 1_2 Port 1 : 0x03 4 4 B00000100 U4 - ULN2803A -> OUT3 K19, K20 Relais filtre bande 15/17m
U2 PCA 9555D 0x20 11 I/O 1_3 Port 1 : 0x03 8 8 B00001000 U4 - ULN2803A -> OUT4 K17, K18 Relais filtre bande 20/30m
U2 PCA 9555D 0x20 12 I/O 1_4 Port 1 : 0x03 16 10 B00010000 U4 - ULN2803A -> OUT5 K15, K16 Relais filtre bande 40m
U2 PCA 9555D 0x20 13 I/O 1_5 Port 1 : 0x03 32 20 B00100000 U4 - ULN2803A -> OUT6 K13, K14 Relais filtre bande 80m
U2 PCA 9555D 0x20 14 I/O 1_6 Port 1 : 0x03 64 40 B01000000 U4 - ULN2803A -> OUT7 K11, K12 Relais filtre bande 160m
U2 PCA 9555D 0x20 15 I/O 1_7 Port 1 : 0x03 128 80 B10000000 U4 - ULN2803A -> OUT8    

Un grand merci à Gérard @F6EHJ

Encore une victoire de l'homme sur la machine :P

 

Edited by F4HJH

Share this post


Link to post
F6EHJ

Christophe,
Ca avance....bravo...! Je ne comprends pas que le 9557 ne réponde pas...
Maintenant comment est commandé le changement de bande ? (au niveau hard)
A suivre
Gérard

 

Share this post


Link to post
F4HJH

Bonjour Gérard,

Il y a 6 heures, F6EHJ a dit :

Je ne comprends pas que le 9557 ne réponde pas...

Moi non plus car il est bien câblé sur le bus i2C, on le voit à l’adresse 0x1A. On passe par le port 0 du PCA9555. :huh:

Il y a 6 heures, F6EHJ a dit :

Maintenant comment est commandé le changement de bande ? (au niveau hard)

Via le port 1 et ses IO 0 à 7 : Chaque IO pilote deux relais par bande. (il y a un "pont" ULN2803A derriere les sorties du PCA9555 pour exciter les bobines des relais)

Côté code arduino, il va me rester à jouer avec les opérandes & ^ |  pour piloter les fonctions de type On/Off (Ptt, pre amp, commut antenne, ...) et les changements de bande.

Je pense que je vais écrire les valeurs de registre en binaire, c'est assez explicite.

 

Edited by F4HJH

Share this post


Link to post
F6EHJ
il y a une heure, F4HJH a dit :

Moi non plus car il est bien câblé sur le bus i2C, on le voit à l’adresse 0x1A. On passe par le port 0 du PCA9555

Que veux-tu dire par "on passe par le port 0 du 9555 ?
 

 

il y a une heure, F4HJH a dit :

Via le port 1 et ses IO 0 à 7 : Chaque IO pilote deux relais par bande. (il y a un "pont" ULN2803A derriere les sorties du PCA9555 pour exciter les bobines des relais)

Oui, ça c'est la commande des relais mais comment l'opérateur change de bande ? Poussoirs, tactile, autre interface ?

Gérard
 

Share this post


Link to post
F6EHJ

Christophe,

Pour le 9557, le setup est le suivant  :

  Wire.beginTransmission(0x1A);//adresse I2C réputée correcte 
    Wire.write (0x03);// adresse du registre de configuration de sens des ports
    Wire.write (0x00);// Chargement direction données port  tout en output
    Wire.endTransmission();

Ensuite on charge les data comme d'habitude :

//*******************************************************************************************

//S/P chargement PCA9557


  void load_9557()
  {
    Wire.beginTransmission(0x1A);//adresse I2C réputée correcte 
    Wire.write (0x01);// Adresse Output port
    Wire.write (data);// valeur a transmettre
    Wire.endTransmission();
  }

//*******************************************************************************************



Gérard

Share this post


Link to post
F4HJH
il y a 24 minutes, F6EHJ a dit :

Que veux-tu dire par "on passe par le port 0 du 9555 ?

Tous les contrôles hors commande de filtre : Attenuateur, Pre Amp, Selecteur d'antenne, PTT passent par le port 0 du PCA9555 

 

il y a 24 minutes, F6EHJ a dit :

Oui, ça c'est la commande des relais mais comment l'opérateur change de bande ? Poussoirs, tactile, autre interface ?

Je pense que je vais utiliser un codeur incrémental optique, et pour l'affichage, peut être un écran LCD ou un petit écran OLED ou simplement des diodes...

Merci pour le code, ;) je vais tester la communication avec le PCA9557 lorsque j'aurais terminé ce projet.

Edited by F4HJH

Share this post


Link to post
F4HJH

Voici le code HamlalC25Module_I2C_control_LED_V01.ino

Cette première version permet enfin d'utiliser le module C25 Hamlab librement avec un arduino, donc utiliser ce module (PA 10mW -> 10W, filtres, attenuateur, pre Amp) avec une RedPitaya et le socle logiciel Open Source mais aussi avec n'importe quel Emetteur/Recepteur dépourvu d'I2C. Pour savoir quelle bande est sélectionnée et dans quel état est le PTT, j'utilise des LED. Je ferais peut être une version avec écran.

Bon, .... je vais aller de l'autre côté du Rhin mettre le bazar dans le groupe C25 en postant le code sur leur forum :lol: Je leur avait dit ! je leur donnerai des news :P (on verra comment les concepteurs réagissent sur ce "hack")

[EDIT] : Je n'ai plus les droits de poster sur leur forum, :huh: tant pis je publie sur GitHub ;)

Edited by F4HJH
  • Message intéressant 1

Share this post


Link to post
F6EHJ

OK,
Pour simplifier le code de commande des LED, je crée une subroutine qui met tous les LED OFF avant de sélectionner la LED souhaitée.
Dans le module "case" on a donc seulement 2 lignes de code : une qui appelle le s/p de mise à off de tous les LED et la seconde qui actionne la bonne.
G

Share this post


Link to post
F4HJH
Il y a 1 heure, F6EHJ a dit :

Pour simplifier le code de commande des LED, je crée une subroutine qui met tous les LED OFF avant de sélectionner la LED souhaitée.
Dans le module "case" on a donc seulement 2 lignes de code : une qui appelle le s/p de mise à off de tous les LED et la seconde qui actionne la bonne.

Bien sur, il y a un peu d'organisation et d'optimisations à faire, mais je préfère laisser comme cela, c'est très simpliste mais je me dit que peut être que cela va faciliter la compréhension pour un novice.

Voila le "fritzing" :lol:

HamlalC25Module_I2C_control_LED_V01_bb.thumb.png.5eea15069d380f59519989013df05753.png

 

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...