Projet

Général

Profil

Projet interface Python Usb à partir d'un module FT245 » Historique » Version 8

Anonyme, 29/06/2013 19:52

1 1 Jacques LAFFONT
h1. Projet interface Python Usb à partir d'un module FT245
2
3 7 Anonyme
_Statut du wiki : *En cours de rédaction...*_
4
5 4 Anonyme
{{>toc}}
6
7 2 Anonyme
h2. Introduction
8
9
L'objectif de ce projet est de réaliser une bibliothèque de fonctions multiplateforme en Python permettant de communiquer avec un périphérique en USB via la puce FTDI 245RL. Cette bibliothèque doit pouvoir être utilisée avec le même code Python sur les principaux systèmes d'exploitations du marché (Windows, Linux, Mac OS X et Android), en fournissant une couche d'abstraction des accès aux différents pilotes correspondants.
10
11
Ce projet a été réalisé durant le premier semestre 2013, dans le cadre de notre première année d'étude à l'ISIMA. Il a été suivi par M. Jacques Laffont et M. Clément Jacob, que nous souhaitons tous deux remercier de nous avoir proposé ce projet et de nous avoir aidé à le réaliser.
12
13
h2. Systèmes supportés
14
15
La bibliothèque que nous avons réalisée est conçue pour fonctionner sur les systèmes suivants :
16
17
* Windows XP, Vista, 7 et 8 (32 et 64 bits)
18
* Android (version 3.1 et ultérieures), sur les terminaux compatibles avec le mode USB Host (également appelé USB On The Go : permet l'utilisation de périphériques USB externes)
19
* Linux (32 et 64 bits)
20
* Mac OX X (version 10.5 et ultérieures)
21
22
Toutefois, en raison du matériel à notre disposition, nous n'avons pu tester la bibliothèque que sur Windows 7 (32 et 64 bits), Linux (32 bits), Android 4.1.2 et Mac OS X 10.8.
23
24
Les contraintes de support de cette bibliothèque sont directement liées à celles des pilotes FTDI sous-jacents. 
25
Ainsi, pour Android par exemple, l'"API USB Host":http://developer.android.com/guide/topics/connectivity/usb/host.html, permettant de gérer et d’accéder à des périphériques sur une tablette ou un smartphone Android sans privilèges adminitrateur, n'est présente qu'à partir de la version 3.1 de ce système. FTDI fournit un pilote utilisant cette API, ainsi qu'un autre pilote pour les versions précédentes. Toutefois, ce second pilote nécessite des privilèges administrateur (root), ce qui n'est pas possible par défaut sur les terminaux du marché. Nous avons donc choisi d'utiliser le pilote "moderne", utilisant l'API, ce qui restreint quelques peu la compatibilité de la bibliothèque.
26
De même, les versions de Mac OS supportées sont celles compatibles par le pilote FTDI associé.
27
28 1 Jacques LAFFONT
29 7 Anonyme
h2. Structure externe et documentation des fonctions de la bibliothèque
30 1 Jacques LAFFONT
31 7 Anonyme
Du point de vue de son utilisateur, la bibliothèque possède une structure très simple : toutes les méthodes utiles sont regroupées dans une seule et unique classe, portant le même nom que la bibliothèque elle-même (_Xftdi_). Une seconde classe existe toutefois : la classe _XftdiError_. Il s'agit d'une classe d'exception qui peut être levée par toutes les méthodes de la bibliothèque lorsque le code de retour d'une des fonctions du pilote FTDI indique une erreur. Cette exception possède un attribut _errorcode_ qui contient le code de retour de la fonction du pilote ayant échoué, ainsi qu'un attribut _message_ qui peut contenir une description textuelle de l'erreur.
32 1 Jacques LAFFONT
33 7 Anonyme
La structure de la bibliothèque, du point de vue d'un développeur l'utilisant, peut ainsi être résumé par le schéma suivant :
34 1 Jacques LAFFONT
35 7 Anonyme
p=. !xftdi-uml-externe.png!
36
37
La liste ci-dessous documente succinctement les méthodes publiques de la bibliothèque. Ces méthodes portent souvent le même nom que les fonctions du pilote qu'elles utilisent. Pour une documentation plus détaillée sur une de ces méthodes, nous vous recommandons de vous reporter à son code source (docstring), ainsi qu'à la "documentation des fonctions du pilote FTDI":http://www.ftdichip.com/Support/Documents/ProgramGuides/D2XX_Programmer%27s_Guide%28FT_000071%29.pdf.
38
39 2 Anonyme
* *deviceCount()* : Retourne le nombre de périphériques FTDI connectés
40
    
41
* *listDevices()* : Retourne la liste des numéros de série des périphériques FTDI connectés
42
43
* *isAvailable()* : Retourne Vrai si au moins un périphérique FTDI est connecté.
44
45
* *isOpen()* : Retourne Vrai si un périphérique FTDI est ouvert.
46
        
47
* *openByIndex(_index_)* : Ouvre un périphérique FTDI identifié par son index. Il est recommandé de vérifier que l'ouverture a fonctionné en appelant la méthode _isOpen()_ après un _open[...]()_
48
49
* *openBySerialNumber(_serialNumber_)* : Ouvre un périphérique FTDI identifié par son numéro de série.
50
        
51
* *write(_data_)* : Envoi de données vers le périphérique ouvert. Les données sont une chaînes de caractères non signés. La méthode retourne le nombre d'octets effectivement envoyés.
52
    
53
* *read(_size_)* : Reçoit un paquet de données de taille maximale indiquée en paramètre (_size_) depuis le périphérique précédemment ouvert. Les données sont retournées sous la forme d'une chaînes de caractères non signés. 
54
    
55
* *getQueueStatus()* : Retourne le nombre d'octets disponibles en lecture. Un appel à la méthode _read()_ demandant au plus ce nombre d'octets permet de retourner les données immédiatement (sans blocage).
56
57 1 Jacques LAFFONT
* *flush(_input=True_, _output=True_)* : Efface les données en attente dans les buffers de lecture (si input est Vrai) et/ou d'écriture (si output est Vrai). Retourne Vrai si l'opération a réussi, Faux sinon.
58
    
59 2 Anonyme
* *resetDevice()* : Envoi un ordre de réinitialisation du périphérique. Retourne Vrai si l'opération a réussi, Faux sinon.
60 1 Jacques LAFFONT
    
61 6 Anonyme
* *closeDevice()* : Ferme la communication avec un périphérique.
62
63
h2. Structure interne de la bibliothèque
64 7 Anonyme
65 8 Anonyme
p=. !xftdi-uml-interne-arbo.png!
66 2 Anonyme
67
h2. Utilisation de la bibliothèque
68
69
h3. Utilisation basique
70
71
Le script suivant montre un exemple d'utilisation basique de la bibliothèque Xftdi :
72
<pre><code class="python">
73 3 Anonyme
# Importation de la bibliothèque
74
from xftdi import Xftdi
75
76
# Instanciation de la classe
77
xftdi = Xftdi()
78
79
# Obtention de la liste des numéros de série
80
# des périphériques compatibles connectés
81
serials = xftdi.listDevices()
82
83
# Si il y a au moins un périphérique disponible
84
if len(serials) > 0:
85
    # Ouvre le premier périphérique trouvé
86
    # à partir de son numéro de série
87
    xftdi.openBySerialNumber(serials[0])
88
89
    # Vérifie que l'ouverture a fonctionné
90
    if xftdi.isOpen():
91
        # Envoi d'un message à ce périphérique
92
        xftdi.write("Hello World")
93
        # Lecture de sa réponse
94
        reponse = xftdi.read(50)
95
        # Fermeture du périphérique
96
        xftdi.closeDevice()
97
98 2 Anonyme
</code></pre>
99
Pour que ce script fonctionne, il est bien évidemment nécessaire de placer le dossier de la bibliothèque (xftdi) dans le même dossier que le script lui-même, ou de modifier le path (_sys.path_) de sorte à ce que la librairie soit contenue dans un des dossiers énumérés dans cette variable d'environnement.
100
101
h4. Suppression des éléments inutiles en fonction de la plateforme ciblée
102
103
La bibliothèque est conçu en deux blocs principaux : un premier destiné à fonctionner sur PC, un second pour les terminaux Android. Lors de la réalisation d'une application utilisant Xftdi et ciblant l'une ou l'autre de ces familles de plateforme, il est possible de supprimer la partie complémentaire de la bibliothèque dans un but d'optimisation de l'espace disque occupé.
104
105
Pour cela, il suffit de supprimer le sous-dossier _pc_ du dossier _xftdi_ si votre application est destinée à des terminaux Android, ou le sous-dossier _android_ si votre application est destinée à Windows, Linux ou Mac.
106
107
Il est également possible d'agir plus finement en supprimant les pilotes natifs non utilisés selon les systèmes d'exploitations PC ciblés.
108
109
h3. Création d'une application Kivy pour Android
110
111
Ce paragraphe détail uniquement les étapes de création d'une application Kivy pour Android utilisant la bibliothèque xftdi. Pour des information plus générales concernant la création d'une application Kivy pour Android, veuillez vous reportez sur la documentation de Kivy.
112
113
* Créez une distribution Kivy : ./distribute.sh -m "pyjnius kivy"
114
* Copiez le fichier d2xx.jar dans le sous-dossier libs de la distribution
115
* Dans le sous-dossier src, créer le chemin suivant : fr/isima/xftdi/android. Copiez y le fichier DriverAdaptor.java
116
* Astuce : modif pour non fullscreen
117
* build
118
* adb install
119
120
h3. Modification de l’emplacement des drivers natifs
121
122
h3. Génération du code
123
124
h2. Application de démonstration : FTDI Speed Test
125
126
127
128
h2. Limitations et problèmes connus
129
130
h3. Linux
131
132
+Conflit avec le module ftdi_sio :+ Si ce dernier est chargé, le périphérique ne peut plus être ouvert avec l'application. (cf. README http://www.ftdichip.com/Drivers/D2XX/Linux/ReadMe-linux.txt, http://www.tincantools.com/wiki/OpenOCD_Troubleshooting:_Device_Not_Opened_%28Linux%29). Une solution simple consiste à blacklister ce module en ajoutant dans /etc/modprobe.d/blacklist (créer la fichier s'il n'existe pas) la ligne suivante : blacklist ftdi_sio.
133
134
+Permissions d'accès au périphériques :+ Si vous ne parvenez pas à ouvrir le prériphérique (exception DEVICE_NOT_FOUND, éventuellement accompagné du message libusb couldn't open USB device /dev/bus/usb/001/015: Permission denied.
135
libusb requires write access to USB device nodes.
136
Vous devez modifiez les règles de udev afin que le périphériques soit accessible à tous les utilisateurs Unix de l'application.
137
Pour cela, lancer la commande suivante dans un terminal administrateur : 
138
<pre>
139
echo 'ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", MODE="0666"' >> /etc/udev/rules.d/80-ftdiusb.rules
140
</pre>
141
Ici, la ligne permet de donner les droits de lecture/écriture à tout le monde. D'autres options permettent de créer un groupe associé au périphérique par exemple. Pour plus d'informations, veuillez vous reporter sur le manuel de udev
142
143
+Application Android tuée quand on branche l'usb :+ vérifier la présence d'une fonction on_pause : http://kivy.org/docs/api-kivy.app.html#pause-mode
144
145
h2. Conclusion
146
147
h2. Ressources et liens utiles
148
149
* "Page de téléchargement des pilotes FTDI":http://www.ftdichip.com/Drivers/D2XX.htm
150
* "Documentation des pilotes FTDI pour les programmeurs":http://www.ftdichip.com/Support/Documents/ProgramGuides/D2XX_Programmer%27s_Guide%28FT_000071%29.pdf
151
* "Documentation de l'API USB Host d'Android":http://developer.android.com/guide/topics/connectivity/usb/host.html
152 5 Anonyme
* "Ticket de bug déposé sur le GitHub de Pyjnius concernant les paramètres de sortie":http://github.com/kivy/pyjnius/issues/58