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.
Les signaux transmis sur les cables sont ici des signaux électriques.
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.
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.
Il suffit de sélectionner l'onglet REPL de Mu puis de réinitialiser la carte. C'est aussi simple que cela.
Lancer le logiciel puis :
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 !
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 :
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
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.
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
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
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()
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