Mise en pratique : Programmation Python

En cours de rédaction (brouillon)

Nous allons donc maintenant écrire un programme simple permettant de demander un relevé de tension à une XBee. Ce programme sera fait dans un premier temps sans la librarie XBee Python afin de mieux comprendre l'envoie des trames.

Nous allons donc brancher le XBee Coordinateur a la Raspberry via les ports RX/TX, il sera donc nécessaire de procéder a l'activation de ses ports (voir Activation Port Série page 1). Une fois ceci fait on calculera grâce a XCTU le checksum de notre trame (celui ci changera en fonction de l'adresse !) Essayer de simuler votre trame sur XCTU afin de pouvoir paramétrer la longueur ainsi que le checksum qui seront différent !

J'ai donc écrit un petit programme permettant de demander un simple relévé de tension, attention a bien paramétrer votre XBee!

circle-info

On aura pour le moment uniquement besoin de la librairie PySerial :

sudo pip install pyserial

La documentation est par ailleurs disponible ici : https://pyserial.readthedocs.io/en/latestarrow-up-right

# -*- coding: utf-8 -*-
"""
Utilisation du XBee Coord vers ED
à l'adresse suivante : 00 13 A2 00 41 BF 3D 0D 
Si changement d'adresse ou tout autre modif dans la trame le cheksum
est a revoir et il faudra modifer la valeur de depart lenght et checksum!
"""

import serial
import time
ser = serial.Serial('/dev/ttyAMA0', baudrate=9600, timeout = 8)

def calcChecksum(frame):
    checksum = 0
    temp_sum = 0
    for i in range (3, len(frame)):
        temp_sum = temp_sum + ord(frame[i])
    
    temp_sum = temp_sum & 0xFF
    checksum = 0xFF - temp_sum

    return checksum

delim = b'\x7E' #start delimiter

lenght_1 = b'\x00' #1st length byte
lenght_2 = b'\x0F' 
frame_type = b'\x17' #Pour une commande AT ! 
frame_ID = b'\x0A'
addr_1 = '\x00'
addr_2 = '\x13'
addr_3 = '\xA2'
addr_4 = '\x00'
addr_5 = '\x41'
addr_6 = '\xBF'
addr_7 = '\x3D'
addr_8 = '\x0D'
rmt_opt ='\x00'
is_1 = '\x49'
is_2 = '\x53'

frame = b'\x7E' + lenght_1 + lenght_2 + frame_type + frame_ID + addr_1 + addr_2 + addr_3 + addr_4 + addr_5 + addr_6 + addr_7 + addr_8 + b'\xFF' + b'\xFE' + rmt_opt + is_1 + is_2




while True :

    checksum = calcChecksum(frame)

    frame_e = frame + chr(checksum)
    frame_convert_h = frame_e.encode('hex')
    print("Checksum =" + str(hex(checksum)))
    print(frame_convert_h)
    ser.write(frame_e)
    time.sleep(2)
    trame_recept = ser.read()
    trame_convert = trame_recept.encode('hex')
    print("La trame reçue est :\n" + trame_convert)
    print("Sa longueur est de : " + str(len(trame_convert)))
    val_adapt = trame_convert[(len(trame_convert)) - 6:]
    val_adapt = val_adapt[:(len(val_adapt) - 2)]
    time.sleep(2)
    print("On isole la valeur de l'ADC:\n" + val_adapt)
    time.sleep(2)
    val_num = int(val_adapt, 16)
    val_num_adapt = ((val_num * 1.2) / 1023)
    val_num_str = str(val_num)
    print("Ce qui donne une valeur numérique de: \n" + val_num_str)
   
    print("%.2f" % val_num_adapt)
    time.sleep(2)

Last updated