Envoyer code radio Arduino/PIC/ATMEL

Bonjour,

J'expose mon cas. J'ai récupéré via un analyseur logique mon code de porte de garage pour pouvoir faire un doublon pour mettre dans ma voiture.
Jusqu'à là ok, pas de soucis. C'est un PIC 16F676 qui ce charge d'envoyer le code de ma télécommande actuelle.

J'ai essayer de lire le PIC pas de bol protégé. Bus pirate... pas d'interfaçage avec ce PIC. J'ai donc analysé le signal en sortie avec mon analyseur logique.
Je trouve cela.

J'ai analysé le code. J'ai trouvé le temps de pulsation, les bits envoyé etc...

Le problème maintenant c'est pour l'envoyer avec l'Arduino. Ou tout autre microcontrôleur. Les impulsions sont en microsecondes. Es ce que l'Arduino gère cela ?

J'ai testé plusieurs code via RC-Switch que j'ai ensuite soumis à mon analyseur logique je trouve des trucs incohérents.

Avez vous une solution ?

Merci.

SI ça marche avec un PIC16F676 y’a pas de raison de pas y arriver avec un atmega :wink:

C’est des impulsions de combien ? la µs ça se gère mais tout dépend l’exigence … car digitalWrite() c’est pas hyper optimisé mais rien n’empêche de manipuler directement les ports et la c’est quelques cycles seulement donc <1µs.

Autre option : utilisé un modem pour générer le code. Car des impulsions c’est ok mais faut les passer en radio … Quelle fréquence, quelle modulation …

Une impulsion c’est 403 µs. La fréquence c’est du 433 MHz.

Je ne m’y connais pas beaucoup en Arduino et encore pire en RF.

Il n’y a pas de solution pour passe outre les librairies ? Ou alors je sais pas les utiliser.

Cocop4ps:
Bonjour,

J'expose mon cas. J'ai récupéré via un analyseur logique mon code de porte de garage pour pouvoir faire un doublon pour mettre dans ma voiture.
Jusqu'à là ok, pas de soucis. C'est un PIC 16F676 qui ce charge d'envoyer le code de ma télécommande actuelle.

J'ai essayer de lire le PIC pas de bol protégé. Bus pirate... pas d'interfaçage avec ce PIC. J'ai donc analysé le signal en sortie avec mon analyseur logique.
Je trouve cela.

J'ai analysé le code. J'ai trouvé le temps de pulsation, les bits envoyé etc...

Le problème maintenant c'est pour l'envoyer avec l'Arduino. Ou tout autre microcontrôleur. Les impulsions sont en microsecondes. Es ce que l'Arduino gère cela ?

J'ai testé plusieurs code via RC-Switch que j'ai ensuite soumis à mon analyseur logique je trouve des trucs incohérents.

Avez vous une solution ?

Merci.

si tu t'es assuré à l'analyseur logique qu'il s'agit bien de trames identiques (pas de rolling, ni de hopping code)
tu peux faire ça en stockant la trame en dure

Oui il ne change pas.
Comment je peux le stocker en dur ?

Cocop4ps:
Oui il ne change pas.
Comment je peux le stocker en dur ?

si c'est juste pour cloner cette telco, comme tu semble avoir un peu de materiel et que la trame ne semble pas trop longue

  • soit rentrer ,"à la mimine" :grin: la durées des etats (hauts/bas) dans un tableau
  • soit prevoir une etape d'apprentissage (utilisation des interruptions ) sur l'arduino

attention il semble y avoir un preambule dans la trame (surement pour un calage de l'agc du recepteur)

Mon analyseur logique m'exporte les trames sous excel j'ai l'état et le temps en microsecondes je pourrais prendre ça ?
Oui il y a un header avant.

Merci

Cocop4ps:
Mon analyseur logique m’exporte les trames sous excel j’ai l’état et le temps en microsecondes je pourrais prendre ça ?
Oui il y a un header avant.

Merci

alors tu es plutot en bonne position pour resoudre ton probleme :grin:
mets donc ton fichier tableur ici , histoire de … voir 8)

J'ai déjà réussi à choper le code binaire avec les impulsions.
Le problème c'est pour le code Arduino en fait.

Je post le tableur ce soir.

Merci

Je l'ai mis en format bloc note.

Donc là je trouve ça. Et juste cette partie c'est pour une impulsion et encore j'ai pas tout mis...

Time,0,1,2,3,4,5,6,7
0.076490583,1,1,1,1,1,1,1,1
0.076490625,1,1,1,1,1,1,1,1
0.076490667,1,1,1,1,1,1,1,1
0.076490708,1,1,1,1,1,1,1,1
0.076490750,1,1,1,1,1,1,1,1
0.076490792,1,1,1,1,1,1,1,1
0.076490833,1,1,1,1,1,1,1,1
0.076490875,1,1,1,1,1,1,1,1
0.076490917,1,1,1,1,1,1,1,1
0.076490958,1,1,1,1,1,1,1,1
0.076491000,1,1,1,1,1,1,1,1
0.076491042,1,1,1,1,1,1,1,1
0.076491083,1,1,1,1,1,1,1,1
0.076491125,1,1,1,1,1,1,1,1
0.076491167,1,1,1,1,1,1,1,1
0.076491208,1,1,1,1,1,1,1,1
0.076491250,1,1,1,1,1,1,1,1
0.076491292,1,1,1,1,1,1,1,1
0.076491333,1,1,1,1,1,1,1,1
0.076491375,1,1,1,1,1,1,1,1
0.076491417,1,1,1,1,1,1,1,1
0.076491458,1,1,1,1,1,1,1,1
0.076491500,1,1,1,1,1,1,1,1
0.076491542,1,1,1,1,1,1,1,1
0.076491583,1,1,1,1,1,1,1,1
0.076491625,1,1,1,1,1,1,1,1
0.076491667,1,1,1,1,1,1,1,1
0.076491708,1,1,1,1,1,1,1,1
0.076491750,1,1,1,1,1,1,1,1
0.076491792,1,1,1,1,1,1,1,1
0.076491833,1,1,1,1,1,1,1,1
0.076491875,1,1,1,1,1,1,1,1
0.076491917,1,1,1,1,1,1,1,1
0.076491958,1,1,1,1,1,1,1,1
0.076492000,1,1,1,1,1,1,1,1
0.076492042,1,1,1,1,1,1,1,1
0.076492083,1,1,1,1,1,1,1,1
0.076492125,1,1,1,1,1,1,1,1
0.076492167,1,1,1,1,1,1,1,1
0.076492208,1,1,1,1,1,1,1,1
0.076492250,1,1,1,1,1,1,1,1
0.076492292,1,1,1,1,1,1,1,1
0.076492333,1,1,1,1,1,1,1,1
0.076492375,1,1,1,1,1,1,1,1
0.076492417,1,1,1,1,1,1,1,1
0.076492458,1,1,1,1,1,1,1,1
0.076492500,1,1,1,1,1,1,1,1
0.076492542,1,1,1,1,1,1,1,1
0.076492583,1,1,1,1,1,1,1,1
0.076492625,1,1,1,1,1,1,1,1
0.076492667,1,1,1,1,1,1,1,1
0.076492708,1,1,1,1,1,1,1,1
0.076492750,1,1,1,1,1,1,1,1
0.076492792,1,1,1,1,1,1,1,1
0.076492833,1,1,1,1,1,1,1,1
0.076492875,1,1,1,1,1,1,1,1
0.076492917,1,1,1,1,1,1,1,1
0.076492958,1,1,1,1,1,1,1,1
0.076493000,1,1,1,1,1,1,1,1
0.076493042,1,1,1,1,1,1,1,1
0.076493083,1,1,1,1,1,1,1,1
0.076493125,1,1,1,1,1,1,1,1
0.076493167,1,1,1,1,1,1,1,1
0.076493208,1,1,1,1,1,1,1,1
0.076493250,1,1,1,1,1,1,1,1
0.076493292,1,1,1,1,1,1,1,1
0.076493333,1,1,1,1,1,1,1,1
0.076493375,1,1,1,1,1,1,1,1
0.076493417,1,1,1,1,1,1,1,1
0.076493458,1,1,1,1,1,1,1,1
0.076493500,1,1,1,1,1,1,1,1
0.076493542,1,1,1,1,1,1,1,1
0.076493583,1,1,1,1,1,1,1,1
0.076493625,1,1,1,1,1,1,1,1
0.076493667,1,1,1,1,1,1,1,1
0.076493708,1,1,1,1,1,1,1,1
0.076493750,1,1,1,1,1,1,1,1
0.076493792,1,1,1,1,1,1,1,1
0.076493833,1,1,1,1,1,1,1,1
0.076493875,1,1,1,1,1,1,1,1
0.076493917,1,1,1,1,1,1,1,1
0.076493958,1,1,1,1,1,1,1,1
0.076494000,1,1,1,1,1,1,1,1
0.076494042,1,1,1,1,1,1,1,1
0.076494083,1,1,1,1,1,1,1,1
0.076494125,1,1,1,1,1,1,1,1
0.076494167,1,1,1,1,1,1,1,1
0.076494208,1,1,1,1,1,1,1,1
0.076494250,1,1,1,1,1,1,1,1
0.076494292,1,1,1,1,1,1,1,1
0.076494333,1,1,1,1,1,1,1,1
0.076494375,1,1,1,1,1,1,1,1
0.076494417,1,1,1,1,1,1,1,1
0.076494458,1,1,1,1,1,1,1,1
0.076494500,1,1,1,1,1,1,1,1
0.076494542,1,1,1,1,1,1,1,1
0.076494583,1,1,1,1,1,1,1,1
0.076494625,1,1,1,1,1,1,1,1
0.076494667,1,1,1,1,1,1,1,1
0.076494708,1,1,1,1,1,1,1,1
0.076494750,1,1,1,1,1,1,1,1
0.076494792,1,1,1,1,1,1,1,1
0.076494833,1,1,1,1,1,1,1,1
0.076494875,1,1,1,1,1,1,1,1
0.076494917,1,1,1,1,1,1,1,1
0.076494958,1,1,1,1,1,1,1,1
0.076495000,1,1,1,1,1,1,1,1
0.076495042,1,1,1,1,1,1,1,1
0.076495083,1,1,1,1,1,1,1,1
0.076495125,1,1,1,1,1,1,1,1
0.076495167,1,1,1,1,1,1,1,1
0.076495208,1,1,1,1,1,1,1,1
0.076495250,1,1,1,1,1,1,1,1
0.076495292,1,1,1,1,1,1,1,1
0.076495333,1,1,1,1,1,1,1,1
0.076495375,1,1,1,1,1,1,1,1
0.076495417,1,1,1,1,1,1,1,1
0.076495458,1,1,1,1,1,1,1,1
0.076495500,1,1,1,1,1,1,1,1
0.076495542,1,1,1,1,1,1,1,1
0.076495583,1,1,1,1,1,1,1,1
0.076495625,1,1,1,1,1,1,1,1
0.076495667,1,1,1,1,1,1,1,1
0.076495708,1,1,1,1,1,1,1,1
0.076495750,1,1,1,1,1,1,1,1
0.076495792,1,1,1,1,1,1,1,1
0.076495833,1,1,1,1,1,1,1,1
0.076495875,1,1,1,1,1,1,1,1
0.076495917,1,1,1,1,1,1,1,1
0.076495958,1,1,1,1,1,1,1,1
0.076496000,1,1,1,1,1,1,1,1
0.076496042,1,1,1,1,1,1,1,1
0.076496083,1,1,1,1,1,1,1,1
0.076496125,1,1,1,1,1,1,1,1
0.076496167,1,1,1,1,1,1,1,1
0.076496208,1,1,1,1,1,1,1,1
0.076496250,1,1,1,1,1,1,1,1
0.076496292,1,1,1,1,1,1,1,1
0.076496333,1,1,1,1,1,1,1,1
0.076496375,1,1,1,1,1,1,1,1
0.076496417,1,1,1,1,1,1,1,1
0.076496458,1,1,1,1,1,1,1,1
0.076496500,1,1,1,1,1,1,1,1
0.076496542,1,1,1,1,1,1,1,1
0.076496583,1,1,1,1,1,1,1,1
0.076496625,1,1,1,1,1,1,1,1

Cocop4ps:
Je l'ai mis en format bloc note.

Donc là je trouve ça. Et juste cette partie c'est pour une impulsion et encore j'ai pas tout mis...

Time,0,1,2,3,4,5,6,7
0.076490583,1,1,1,1,1,1,1,1
0.076490625,1,1,1,1,1,1,1,1
0.076490667,1,1,1,1,1,1,1,1
...

ok , mais ce n'est pas exploitable directement
ce qui serait interessant c'est de connaitre la durée des etat haut et bas , là ton fichier semble representer l'etat logique des voies à chaque acquisition pour un echantillonage de 0.4µs

Oui, inexploitable ou faut être sacrement rigoureux.

Ce que je connais pour le moment c'est le code ( en bits 0,1... ) et la durée des états ( 403 µS ).

Merci :slight_smile:

Cocop4ps:
Oui, inexploitable ou faut être sacrement rigoureux.

Ce que je connais pour le moment c'est le code ( en bits 0,1... ) et la durée des états ( 403 µS ).

Merci :slight_smile:

Alors le mieux est que tu determine le nombre d'etats d'une trame pour déjà dimensionner un tableau
c'est quoi ton analyseur logique ?
la relecture off des acquisitions est possible avec un soft ?

J’ai déjà fait un tableau papier. Je peux en faire un sous excel.
Mon analyseur c’est un USBee AX Pro.
J’ai la sauvegarde mais je ne pense pas que je pourrais avoir un truc plus précis.

Merci.

Cocop4ps:
J'ai déjà fait un tableau papier. Je peux en faire un sous excel.
Mon analyseur c'est un USBee AX Pro.
J'ai la sauvegarde mais je ne pense pas que je pourrais avoir un truc plus précis.

Merci.

a priori le soft permet de relire les acquisitions sauvegardées
poste en piece jointe ton fichier d'acquisitions (capture) *.usbeexxxxx

Bonjour,

Ton tableau c'est du CSV ultra classique, t'as de la chance ça aurait pu être du "value change dump" standard mais ultra chiant à parser.

Allez cadeau, en plus tu pourras t'initier à la programmation Python en même temps que tu convertiras tes exports en C :wink:

# Export data
CSV_DATA = """0.076490583,1,1,1,1,1,1,1,1
0.076490625,1,1,1,1,1,1,1,1
0.076490667,1,1,1,1,1,1,1,1
0.076490708,1,1,1,1,1,1,1,1
0.076495417,1,1,1,1,1,1,1,1
0.076495458,1,1,1,1,1,1,1,1
0.076495500,1,1,1,1,1,1,1,1
0.076495542,1,1,1,1,1,1,1,1
0.076495583,1,1,1,1,1,1,1,1
0.076495625,1,1,1,1,1,1,1,1
0.076495667,1,1,1,1,1,1,1,1
0.076495708,1,1,1,1,1,1,1,1
0.076495750,1,1,1,1,1,1,1,1
0.076495792,0,1,1,1,1,1,1,1
0.076495833,0,1,1,1,1,1,1,1
0.076495875,0,1,1,1,1,1,1,1
0.076495917,0,1,1,1,1,1,1,1
0.076495958,1,1,1,1,1,1,1,1
0.076496000,1,1,1,1,1,1,1,1
0.076496042,1,1,1,1,1,1,1,1
0.076496083,1,1,1,1,1,1,1,1
0.076496125,1,1,1,1,1,1,1,1
0.076496167,1,1,1,1,1,1,1,1
0.076496208,1,1,1,1,1,1,1,1
0.076496250,1,1,1,1,1,1,1,1
0.076496292,1,1,1,1,1,1,1,1
0.076496333,1,1,1,1,1,1,1,1
0.076496375,1,1,1,1,1,1,1,1
0.076496417,1,1,1,1,1,1,1,1
0.076496458,1,1,1,1,1,1,1,1
0.076496500,1,1,1,1,1,1,1,1
0.076496542,1,1,1,1,1,1,1,1
0.076496583,1,1,1,1,1,1,1,1
0.076496625,1,1,1,1,1,1,1,1"""

# Channel to convert from plain-time-data to RLE-data
CHANNEL_TO_CONVERT = 0

# Working variables
oldTime = 0  # Old timestamp
oldState = 0 # Old state
firstLine = True # True only for the first CSV line

# Print C header struct
print """typedef struct {
  long duration;
  byte level;
} RfEvent_t;

static const RfEvent_t RF_SIGNAL[] = {"""

# For each line of CSV 
for line in CSV_DATA.split('\n'):

    # Get all CSV fields
    time, channels = line.split(',', 1)
    channels = channels.split(',')

    # Turn string into numeric values
    time = float(time)
    state = int(channels[CHANNEL_TO_CONVERT])

    # First line special case
    if firstLine:

        # Init the RLE engine with the current time and state
        oldState = state
        oldTime = time

        # Do nothing for later lines
        firstLine = False

    # If the state has change from the previous line
    if state is not oldState:

        # Dump the RLE line
        print '  {', "%dL" % int((time - oldTime) * 1000000), ',',  str(oldState), '}'

        # Save the current timestamp and state for next RLE iteration
        oldTime = time
        oldState = state

# Terminate the last RLE iteration
print '  {', "%dL" % int((time - oldTime) * 1000000), ',',  str(oldState), '}'

# Print the C footer
print """};

// Python POWAAA!"""

Après etude, le code change selon un algo et qui ne permet pas d'exécuté le code que nous avons trouvé, sauf une fois tous les 256 fois.

Encore un défi :stuck_out_tongue:

Bonjour, bon ben petit problème comme on vous la déjà dis.

Il s'agit à mon avis du Keeloq. Typique avec ses 400µS, microchip et surtout l'µC utilisé un 16F676.

Quelqu'un aurait des infos sur cet algorithme ?

Merci.