logo
carte BBC micro:bit
Communication par liaison série.

Nous allons présenter ici l'échange d'informations avec la carte micro:bit via une liaison série.

Une liaison série nécéssite l'utilsation de 2 fils (3 avec la masse) entre les deux équipements qui doivent communiquer.

serail

Les signaux transmis sur les cables sont ici des signaux électriques.

Communication Unidirectionnelle : micro:bit ->>

Nous allons étudier ici la communication dans le sens carte micro:bit vers (au choix) :

Nous allons prendre comme exemple l'envoi par la micro:bit de l'information de pitch grâce au programme suivant à charger sur la carte :

from microbit import *
while True:
    print("angle : "+str(accelerometer.get_x()))
    sleep(200)

Dans ce programme, l'instruction print envoie directement sur la liaison série.

Raccordement de la micro:bit et port série

La liaison série va se faire au travers du cable USB. Il vous faut donc raccorder votre carte micro:bit au PC via un cable USB

Sous Windows votre carte va être raccordée via un port série. Windows nomme ces ports avec un nom du type COM1,COM2,COM3,etc. Il vous faut savoir sous quel port votre carte micro:bit est raccordée. Pour cela le plus simple est d'ouvrir une console Windows (cmd) puis de taper la commande mode Vous devriez voir apparaître le nom de votre port COM et son numéro.


Communication micro:bit --> Mu editor

Il suffit de sélectionner l'onglet REPL de Mu puis de réinitialiser la carte. C'est aussi simple que cela.


Communication micro:bit --> TeratermPro ou putty

Lancer le logiciel puis :

  1. Sélectionner le mode serial communication.
  2. Indiquez le port COM utilisé (le port indiqué par défaut doit être le bon ;))
  3. Aller dans le menu setup/serial et mettre la vitesse 115200 bauds.

Si tout est ok vous devez voir apparaître sur la console de TeraTerm la valeur du pitch de la carte. Bougez la carte pour voir les variations !

teraTerm

Communication Microbit micro:bit --> Ordinateur (Python)

Il faut vérifier que le module pyserial est bien installé.

Voici un exemple de programme : (Pensez à modifier le nom du port COM !)


import time
import serial

print(serial.VERSION)
ser = serial.Serial(
    port='COM4',\
    baudrate=115200,\
    parity=serial.PARITY_NONE,\
    stopbits=serial.STOPBITS_ONE,\
    bytesize=serial.EIGHTBITS,\
        timeout=0)

print("connected to: " + ser.portstr)
count = 0

while True:
    ser.flushInput()
    time.sleep(0.1)
    line = ser.readline().rstrip().decode()
    tokens = line.split(':')
    if len(tokens)==2:
        print(str(count)+":"+tokens[0]+"-->"+tokens[1]+"["+line+"]")
    count +=1

ser.close()

Pour info l'instruction ser.flushInput() permet de vider le buffer pour récupérer la valeur la plus récente reçue sur le port série. Cette instruction est biensûr optionnelle et dépend de la gestion du flux que vous souhaitez réaliser.

Remarque :

In Python 3.x the strings are Unicode by default. When sending data, they sometimes have to be converted to bytes. This can be done by prefixing the string with b:

ser.write(b'5') # prefix b is required for Python 3.x

Or when receiving data you have to do the opposite using decode()

line = ser.readline().rstrip().decode()

Voici le résultat de l'execution de notre programme sur la console Python :

pythonconsole


Communication micro:bit --> Ordinateur (node.js/javascript)

Voici la procédure à suivre pour l'installation :

N'hésitez pas à consulter p5jsServer sur un serveur node en local pour plus de détail sur node.js

  1. Décompresser l'archive serialNode dans le répertoire de votre choix.
  2. Ouvrez l'interpréteur de commande windows(cmd).
  3. Placez vous dans le répertoire serialNode (cd cheminserialNode)
  4. Installer les packages nécessaires :
    1. npm install serialport.
    2. npm install express
    3. npm install socket.io
  5. Modifiez si nécessaire le nom du port COM au début du programme server.js
  6. Vous n'avez plus qu'à lancer le serveur node avec la commande node server.js
  7. Puis lancer la page web associée en lançant votre navigateur avec l'adresse 127.0.0.1:3000
  8. La balle se déplace de gauche à droite suivant que vous inclinez la carte micro:bit d'avant en arrière.

Je vous laisse étudier le code associé : server.js pour le serveur node et sketch.js dans le répertoire public pour la page web sous p5js.


Communication --> Ordinateur (webUSB)

Il s'agit d'une fonctionnalité béta

N'hésitez pas à consulter web USB ticket from microbit pour plus de détails. ou encore microbit Web USB

Communication Bi-directionnel <-->

Communication micro:bit <--> Ordinateur (Python)

La solution présentée ici permet la communication dans les 2 sens !

Elle utilise pour cela le module uart de la micro:bit.

Remarque :sous Windows7, if faudra installer un driver supplémentaire pour communiquer en direct avec la carte micro:bit depuis un PC.

Voir pour cela le lien how-do-i-connect-the-micro-bit-to-my-computer

Programme de la carte microBit :

from microbit import *

uart.init(baudrate=115200)

display.scroll('Pret')

while True:
    if uart.any():
        #display.scroll('Recu')
        msg_bytes=uart.read()
        if msg_bytes==b'temperature':
            temp=temperature()
            print(temp)
            display.scroll(temp)
        elif msg_bytes==b'coucou':
            display.scroll('coucou')
    sleep(1000)

Programme de l'ordinateur :

# coding: utf-8
import serial, time
from guizero import App, PushButton, Text

def demande_temperature():
    s.write(b'temperature')
    data = s.readline()
    data = int(data[0:4])
    print(data)
    texte_temperature.value = str(data)+" degrés"
    
def envoie_message():
    message_bytes = bytes("coucou", 'utf-8')
    s.write(message_bytes)
    
port = "COM6"         # A modifier (voir commande mode )
baud = 115200
s = serial.Serial(port)
s.baudrate = baud    
    
app = App(title="Traffic Manager 1.0",layout="grid") 
# Création d'un bouton pour recuperer la temperature
button_temperature = PushButton(app,text="Temperature", command=demande_temperature,grid=[0,1])

# Creation d'un label pour afficher la temperature
texte_temperature = Text(app, text="?? degrés",grid=[1,1])

# Création d'un bouton pour envoyer un message
button_coucou = PushButton(app,text="send coucou", command=envoie_message,grid=[0,2])

app.display()

Communication micro:bit <--> micro:bit

bit2bit

Voici un exemple de programme à charger sur les 2 cartes.

from microbit import *

sleep(5000)
uart.init(baudrate=9600, bits=8, parity=None, stop=1, tx=pin0, rx=pin1)

def Send(m):
    b = []
    for c in m:
        b.append(ord(c))
    d = bytes(b)
    uart.write(d)

def Receive():
    if uart.any():
        m = uart.readall()
        s = ""
        for b in m:
            s = s + chr(b)
        display.scroll(s)
        
while True:
    Receive()
    if button_a.is_pressed():
        Send("HELLO")
        sleep(500)
    sleep(20)

Le délai de 500 ms peut sembler assez long. Cette valeur est pour le mode test. Vous pouvez la diminuer si besoin.

Vous pouvez consulter d'autres solutions ici : pybit2bit sur multiwingspan

( Christophe Béasse - octobre 2018 )