Tableaux Maths
Slogan du site

Des cours, des exercices et des vidéos réalisées par des élèves.
Outils numériques en classe et découverte de la programmation.

Arduino, Python, Kivy

Connexions Arduino USB et BluetoothLE en utilisant Python et Kivy.

Article mis en ligne le 21 novembre 2015
dernière modification le 5 juin 2019

Installation et outils

1) Installation IDE et Arduino

Vous aurez besoin de l’IDE Arduino pour éditer et transférer vos programmes vers le micro-contrôleur :

Sous linux :

  • Depuis les dépôts officiels :

Avec un Mint13 ou un Ubuntu 12.04, je vous conseille de :

  • La version 1.0.5 autonome ici :

https://code.google.com/p/arduino/downloads/list

  • Décompressez le fichier
  • Aller dans le fichier décompressé puis rendez exécutable le fichier arduino :

Pour le lancer, ouvrez un terminal, allez dans le dossier où se trouve le fichier précédent puis tapez en lignes de commandes :

Une fois installée :

  • Branchez votre carte Arduino en USB.
  • Lancez l’application, cochez "Add" puis redémarrez le PC pour enregistrer les permissions.

2) Composants Arduino utilisés :

Une carte standard arduino-uno, une base shield et un Grove-LCD RGB Blacklight pour l’instant

Plutard, un kit de connexion Bluetooth et un panneau à LED.

3) Installez une librairie supplémentaire : Grove_LCD_RGB_Backlight

Si vous souhaitez coder exclusivement avec ArduBlock passez directement à la section suivante (la 4).

La doc est ici : https://github.com/Seeed-Studio/Grove_LCD_RGB_Backlight

Téléchargez le zip ici : https://github.com/Seeed-Studio/Grove_LCD_RGB_Backlight/archive/master.zip

Décompressez le fichier, renommez-le Grove_LCD_RGB_Backlight.

Cas général : Voir ici : https://www.arduino.cc/en/Guide/Libraries

Installation manuelle sous Linux :

Il est aussi possible de coller vos librairies dans /home/nom_d_utilisateur/sketchbook/librairies/ ou, si vous voulez forcer l’installation :

Collez-le dans votre librairie avec les droits nécessaires :

Sous Linux : (Ici on ne s’embête pas trop avec les droits...)

4) ArduBlock et DUINO Edu :

Une version simple mais peu complète d’ArduBlock :

Regardez ici : http://blog.ardublock.com/2011/10/25/install-ardublock-arduino-ide/.

Pour une version plus complète, vous pouvez installer de nombreuses librairies complémentaires fonctionnant avec ArduBlock. Les méthodes appliquées semblent fonctionner en français et en anglais. Ce qui peut permettre des retouches finales dans le code source.

Le site : http://duinoedu.com

Sous Windows :

Voici les liens : http://duinoedu.com/dl/logiciels/arduino/arduino_augmente/version_duinoedu/

Il y a un exécutable arduino.exe une fois le dossier décompressé. Cela devrait aller. S’il vous manque des blocks, vous pouvez télécharger un autre fichier ardublock-all.jar ici : (version 49.3 aujourd’hui le 24/11/2015)
http://duinoedu.com/dl/logiciels/ardublock/ardublock_augmente/

N’oubliez pas d’installer les librairies complémentaires dans votre dossier sketchbook. Vous pouvez les télécharger ici : (version 49.2 aujourd’hui le 24/11/2015)
http://duinoedu.com/dl/lib/toutes_les_librairies_augmentees/

Sous Linux :

  • Allez dans votre_nom_d’utilisateur/sketchbook et créez un chemin de dossiers : tools/ArduBlockTool/tool
  • Collez le fichier ardublock-all.jar dans votre_nom_d’utilisateur/sketchbook/tools/ArduBlockTool/tool
  • Décompressez le fichier.
  • Copiez/coller l’ensemble des dossiers contenus dans ce dossier dans scketchbook/librairies

Relancez l’IDE Arduino.

5) Communication USB Python : PySerial

Téléchargement ici : https://pypi.python.org/pypi/pyserial

Sous Linux :

Décompressez le fichier puis lancez le setup.py (avec kivy.bat par exemple sous Windows ou en ligne de commandes sous Linux :

Si problème de permissions, passez en "sudo" les commandes

Sous Windows :

Si vous utilisez le kivy.bat pour vos programmes :

  • Téléchargez le fichier .tar.gz dans le lien précédent.
  • Décompressez le dossier pyserial-2.7 (avec 7zip par exemple, ce dossier est situé dans le sous dossier dist)
  • Collez le dossier pyserial-2.7 dans votre dossier Kivy-1....x86/Python34
  • Lancez kivy.bat (Double clic)
  • En lignes de commandes, allez dans le dossier pyserial-2.7 et installez setup.py :

Remarque :
Si vous utilisez Pyzo pour compiler, lancez

 conda install pyserial 

.

5) Pour installer Kivy :

Rendez-vous ici : http://tableauxmaths.fr/spip/spip.php?article137

6) Premiers exemples : Onglet suivant

http://tableauxmaths.fr/spip/spip.php?article149#wrap2

++++

Utiliser l’écran LCD

Un simple Hello World :

Branchez le shield sur la carte primaire arduino-uno puis branchez le Grove_LCD sur le port I2C comme sur la photo.

Connectez votre carte en USB au PC et ouvrez l’IDE Arduino.

Voici le code à transférer à votre carte (source : https://github.com/)

Page suivante : Communications entre PC et Arduino en Python

++++

Dialoguer avec Arduino en Python

1) Depuis Arduino vers le PC :

Connectez votre carte Arduino sur le PC en USB

Sur le Arduino :

Transférez ce code sur votre carte Arduino : (On peut l’appeler envoi par exemple)

Sur le PC :

Après avoir installer la librairie Python PySerial

Il faut chercher le nom de la carte sur l’entrée (sortie) standard.

Sous Linux :

Vous obtiendrez sûrement un nom du style "ttyACM0 : USB ACM device"

Sous Windows, vous devez avoir un nom du style "COM1".

Voici le code Python correspondant à enregistrer sur votre PC (par exemple lire.py)

[’BAUDRATES’, ’BYTESIZES’, ’PARITIES’, ’STOPBITS’, ’_SETTINGS’,
’__abstractmethods__’, ’__class__’, ’__delattr__’, ’__dict__’, ’__doc__’, ’__enter__’,
’__exit__’, ’__format__’, ’__getattribute__’, ’__hash__’, ’__init__’, ’__iter__’,
’__metaclass__’, ’__module__’, ’__new__’, ’__reduce__’, ’__reduce_ex__’,
’__repr__’, ’__setattr__’, ’__sizeof__’, ’__str__’, ’__subclasshook__’, ’__weakref__’,
’_abc_cache’, ’_abc_negative_cache’, ’_abc_negative_cache_version’,
’_abc_registry’, ’_checkClosed’, ’_checkReadable’, ’_checkSeekable’,
’_checkWritable’, ’_reconfigurePort’, ’applySettingsDict’, ’baudrate’, ’bytesize’, ’close’,
’closed’, ’drainOutput’, ’dsrdtr’, ’fileno’, ’flowControl’, ’flush’, ’flushInput’, ’flushOutput’,
’getBaudrate’, ’getByteSize’, ’getCD’, ’getCTS’, ’getDSR’, ’getDsrDtr’,
’getInterCharTimeout’, ’getParity’, ’getPort’, ’getRI’, ’getRtsCts’, ’getSettingsDict’,
’getStopbits’, ’getSupportedBaudrates’, ’getSupportedByteSizes’,
’getSupportedParities’, ’getSupportedStopbits’, ’getTimeout’, ’getWriteTimeout’,
’getXonXoff’, ’inWaiting’, ’interCharTimeout’, ’isOpen’, ’isatty’, ’makeDeviceName’,
’next’, ’nonblocking’, ’open’, ’parity’, ’port’, ’read’, ’readable’, ’readall’, ’readinto’,
’readline’, ’readlines’, ’rtscts’, ’seek’, ’seekable’, ’sendBreak’, ’setBaudrate’, ’setBreak’,
’setByteSize’, ’setDTR’, ’setDsrDtr’, ’setInterCharTimeout’, ’setParity’, ’setPort’, ’setRTS’,
’setRtsCts’, ’setStopbits’, ’setTimeout’, ’setWriteTimeout’, ’setXonXoff’, ’stopbits’, ’tell’,
’timeout’, ’truncate’, ’writable’, ’write’, ’writeTimeout’, ’writelines’, ’xonxoff’]
METTE
CHAPEAU
MONSIEUR
CASQUETTE
CHAPEAU

2) Depuis le PC vers Arduino :

Connectez votre carte Arduino sur le PC en USB

Sur le Arduino :

Transférez ce code sur votre carte Arduino : (On peut l’appeler recevoir par exemple)

Sur le PC :

Après avoir installer la librairie Python PySerial (voir onglet précédent)

Voici le code Python correspondant à enregistrer sur votre PC (par exemple ecrire.py)

Attention, en Python 3.X il faut convertir le message envoyé en bytes !
Attention, en Python 3.X, raw_input n’existe pas, il faut écrire input

++++

Vers Android avec Kivy

On reprend le précédent programme de communication sur la carte :

Installez Kivy puis :

Une vidéo qui explique rapidement tout cela :

++++

Android-Kivy et Arduino en BluetoothLE

L’ensemble du projet :

Voici l’ensemble du projet. Vous trouverez dans ce zip :

  • Le fichier .ino à transférer dans l’Arduino (Uno) ;
  • Le fichier .java permettant de surcharger la classe BluetoothGattCallback ;
  • Le fichier main.py contenant le code de l’application à compiler avec buildozer ;
  • Le fichier buildozer.spec contenant les informations de l’application Android, les droits BLUETOOTH et BLUETOOTH_ADMIN ainsi que le lien vers le fichier .java ;
Projet_complet

Je vous conseille de lire les remarques suivantes et l’ensemble des explications afin de comprendre un peu mieux le fonctionnement et les éventuelles modifications que vous pourriez avoir à faire.

Voici l’apk. C’est un zip donc il faut l’extraire et autoriser les sources inconnues sur votre Android.

Une vidéo de démonstration :

Remarques importantes :

  • Il existe deux types de Bluetooth (pour faire simple). Le Bluetooth classique (mode EDR) et le Low Energy (mode BLE) ;
  • Cette application n’est valable que sous Android (à partir de 4.4.... peut-être 4.3 ?). Pas besoin de rooter la tablette.
  • Nous avons acheté un Grove BLE v1 qui n’est pas dual-mode (il ne fait que BLE). Le service qui nous intéresse est le FFE0 qui contient la caractéristique FFE1 (Voir les UUID dans l’application Kivy) ;
  • Il faut ouvrir les connexions Bluetooth et appairer le Grove BLE avant de lancer l’application (Mot de passe : "000000") ;
  • Si vous partez en mode EDR, vous pouvez regarder ici : https://gist.github.com ;
  • Le fait que le mode EDR ne soit pas supporté par ce périphérique provoque des gels des applications qui tentent de se connecter dans ce mode (Applications AppInventor par exemple) ;
  • Je n’ai trouvé qu’une seule discussion concernant Kivy et le BLE : groups.google
  • Un site qui décrit bien les possibilités : http://developer.android.com ;
  • J’ai rencontré deux difficultés : implémenter une classe java abstraite et comprendre les valeurs que recevait le Arduino. (Un grand merci à Pierre et Yo !)

Commençons....

Adapter la class java BluetoothGattCallback pour pouvoir l’implémenter ensuite :

Créez un fichier que vous pouvez appelez BluetoothGattImplem.java :

BluetoothGattImplem.java

Application Python-Kivy :

Pour communiquer avec le Grove BLE il faut suivre un processus très précis :

  • Il faut ajouter le fichier java dans le dossier du projet (le même que celui où vous allez mettre le main.py suivant ;
  • Ajouter certains paramètres dans le fichier buildozer.spec à savoir, les autorisations Bluetooth et la prise en compte du fichier java pour pyjnius. Voici le fichier buildozer.spec :
buildozer.spec
  • Se connecter avec un ConnectGatt et attendre la connexion ;
  • Découvrir les services du BLE et attendre la fin de cette recherche ;
  • Attraper la Charactéristic qui permet d’envoyer des données au BLE ;
  • Mettre une valeur dans cette Charactéristic. La méthode utilisée est setValue(nombre, format, offset). Le format est à 17 ici pour Uint8.
  • Envoyer cette valeur au BLE ("writeCharacteristic").

Cette application comprend une interface utilisateur minimum :

  • Un bouton de connexion (qui recherche aussi la Charactéristic) ;
  • Un TextInput qui ne prend que des nombres (On envoye des chiffres !) ;
  • Un bouton Send pour envoyer le contenu du TextInput s’il est valable.

N’oubliez pas deux choses dans cette application :

  • Le Grove BLE doit être appairé et se nommer "HMSoft".
  • Il n’y a pas de LEscan dans cette application.... à faire...
  • Le nom du BLE doit être HMSoft. Changez ce nom dans l’application avant de compliler si vous n’avez pas le même nom.
main.py

Le code :

Côté Arduino :

  • Branchez le BLE sur les broches 2 et 3 (D2 sur le GroveShield) ;
  • Branchez le Grove_RGB_LCD sur un port I2C ;
  • Envoyez le code suivant ;
  • N’hésitez pas à débrancher puis rebrancher le ArduinoUno ;

Remarques :

  • La recherche du bon BaudRate fut difficile (nous sommes ici en 38400 pour le BLE) ;
  • Un problème de bit de poids fort qui nous a imposé d’enlever 80 (en hexa) à la valeur lue. (En effet, l’aspect signé ou non signé du nombre n’a rien changé... Si vous avez une idée ?)
  • L’application Kivy envoie un par un les chiffres qui composent le nombre. La raison étant qui la lecture sur le Arduino s’arrête à 63. On obtient 0 pour 64 puis 1 pour 65. De même, 0 pour 640 puis 1 pour 641... Si quelqu’un a une idée ?
  • Ce code affiche chaque chiffre envoyé seconde par seconde.
ble11_chiffres.ino

Documents
Kivy_BLE 5.4 ko / Zip