S2A, Scratch

BBC micro:bit – Programação em Python

Escrito por: ­ 27 de abr de 2018 ­ 4.501 views

O que é um micro:bit?

É um pequeno computador que pode ser utilizado para vários tipos de projetos, como robôs, carrinhos, instrumentos musicais, letreiros, etc…
Ele pode ser programado com Java, Python, C++, inclusive usando a própria IDE do Arduino, por meio de um computador (cabo + USB), ou um celular, por meio do bluetooth — BLE.

Para que seja possível fazer os projetos, o micro:bit conta com os seguintes componentes:

  • 25 LEDs vermelhos e endereçáveis, ou seja, você pode ligar e desligar qualquer um.
  • 2 botões programáveis, A e B.
  • 25 conectores externos que são programáveis que podem ser utilizados para conectar diversos componentes, como motores, LEDs, LDRs, servo motor, etc…
    • 3 desses conectores podem ser acessados com uso de jacarés e ele pode ser acessado como Entrada, Saída e Toque (como um makey makey).
  • Um sensor de temperatura em Celsius, disponível no chip da placa (não é exatamente a temperatura externa, mas serve como base.
  • Sensor de luminosidade para medir mudanças na luz ambiente (utilizado os 25 LEDs para esse propósito) – programação disponível somente com Java.
  • Acelerômetro (mede a aceleração do componente, mostrando como ele se encontra nos eixos X, Y e Z)
  • Bússola
  • Bluetooth BLE (Bluetooth Low Energy) – somente acessado quando programado em Java – necessita que o computador possua BLE. O Bluetooth comum não é compatível.
  • Rádio
  • Conector USB
  • Conector JST 2.0 PH 2-pinos para carregador externo de 3v.

Vamos conhecer algumas funcionalidades, para programação em Python:

Neste artigo veremos:

Primeiros Passos

Depois de ter o micro:bit em mãos, será necessário um editor de códigos como por exemplo: https://python.microbit.org

Estamos trabalhando em um editor offline que será disponibilizado em breve – acompanhem….

Estamos também finalizando uma extensão, desenvolvida pelo HackEduca, para funcionamento no Scratch 2.0 offline – em breve

Importar bibliotecas:

Normalmente pode se usar a opção from microbit import * que já traz várias funcionalidades padrão da placa, mas é possível importar grupos de funcionalidades também, como por exemplo: from microbit import display, Image, button_a, sleep , caso haja restrição de memória, causada pelo tamanho do programa.
Há também outras que são específicas, como por exemplo:
import music
import random
import radio

Comandos e sintaxes Básicas

  • While True:

Essa sintax é utilizada para fazer um loop infinito. Basicamente ela executa até que a condição seja verdadeira.
É possível sair do loop com o comando break 

  • If, elif, else  são comandos básicos para qualquer linguagem se programação, veja abaixo como ela funciona:

If (Se) alguma condição tiver resultado True: (Verdadeiro)
Execute o que estiver logo na sequencia
elif (Se senão), verifique se o comando tiver resultado True:
Execute o que estiver logo na sequencia
else: (senão)
Se nada acima for verdadeiro, execute o que estiver aqui

  • display.clear() 

Apaga todos os LEDs

  • running_time()

Tempo de execução, desde que o micro:bit foi ligado. Este comando é executado quando se quer executar uma ação após um determinado número de tempo que ele está ligado.

'''
This example was created by Edson Sidnei Sobreira for
https://www.hackeduca.com.br
It's a public domain

Este exemplo foi criado por Edson Sidnei Sobreira para
https://www.hackeduca.com.br
Domínio público
-------------------------------------------------------
'''

from microbit import *

while running_time() < 5000:
    display.show(Image.HAPPY)
display.clear()
  • def()

Cria uma função que pode ser chamada fora do loop

  • sleep()

Deixa o micro:bit dormindo por alguns milisegundos (cria uma pausa no sistema)

'''
This example was created by Edson Sidnei Sobreira for
https://www.hackeduca.com.br
It's a public domain

Este exemplo foi criado por Edson Sidnei Sobreira para
https://www.hackeduca.com.br
Domínio público
-------------------------------------------------------
'''

from microbit import *

def iniciar():
#    while running_time() < 5000:
        display.show(Image.HAPPY)
        sleep(1000)
        display.clear()
        sleep(1000)
        display.show(Image.HAPPY)
        sleep(1000)
        display.clear()
        
while True:
    if button_a.was_pressed():
        iniciar()
  • print

Mostra resultado na saída serial (semelhante ao Arduino, inclusive pode se utilizar a serial da IDE do Arduino para obter essa saída)
A comunicação do micro:bit ocorre a 115.200 bauds.

'''
This example was created by Edson Sidnei Sobreira for
https://www.hackeduca.com.br
It's a public domain

Este exemplo foi criado por Edson Sidnei Sobreira para
https://www.hackeduca.com.br
Domínio público
-------------------------------------------------------
'''
from microbit import *  
while True:  
    print(temperature())
    sleep(2000)

Imagens

O micro:bit, possui um banco de imagens pré-gravadas que podem ser acessadas através do seguinte comando:
from microbit import *
display.show(Image.HAPPY)

O que estiver dentro dos parênteses indica o grupo de imagens. Atualmente existem as seguintes imagens:

Image.HEART, Image.HEART_SMALL, Image.HAPPY, Image.SMILE, Image.SAD, Image.CONFUSED, Image.ANGRY, Image.ASLEEP, Image.SURPRISED, Image.SILLY, Image.FABULOUS, Image.MEH, Image.YES, Image.NO, Image.CLOCK12, Image.CLOCK11, Image.CLOCK10, Image.CLOCK9, Image.CLOCK8, Image.CLOCK7, Image.CLOCK6, Image.CLOCK5, Image.CLOCK4, Image.CLOCK3, Image.CLOCK2, Image.CLOCK1, Image.ARROW_N, Image.ARROW_NE, Image.ARROW_E, Image.ARROW_SE, Image.ARROW_S, Image.ARROW_SW, Image.ARROW_W, Image.ARROW_NW, Image.TRIANGLE, Image.TRIANGLE_LEFT, Image.CHESSBOARD, Image.DIAMOND, Image.DIAMOND_SMALL, Image.SQUARE, Image.SQUARE_SMALL, Image.RABBIT, Image.COW, Image.MUSIC_CROTCHET, Image.MUSIC_QUAVER, Image.MUSIC_QUAVERS, Image.PITCHFORK, Image.XMAS, Image.PACMAN, Image.TARGET, Image.TSHIRT, Image.ROLLERSKATE, Image.DUCK, Image.HOUSE, Image.TORTOISE, Image.BUTTERFLY, Image.STICKFIGURE, Image.GHOST, Image.SWORD, Image.GIRAFFE, Image.SKULL, Image.UMBRELLA, Image.SNAKE

Você também poderá fazer sua própria imagem da seguinte forma:

from microbit import *
barco = Image("05050:"
"05050:"
"05050:"
"99999:"
"09990")

display.show(barco)

Cada linha representa os 5 LEDs, onde 0 é desligado e de 1 a 9, significa ligado, com intensidade luminosa diferente (1 = menos intenso; 9 = mais intenso).
Pode ser representado também da seguinte forma:
barco = Image("05050:05050:05050:99999:09990")

Botões

O microbit possui 2 botões que podem ser programados. Há 3 eventos relacionados a esses botões:

is_pressed():
Retorna True  quando estiver apertado e False no estado normal

was_pressed():
Retorna True quando ele ele foi apertado desde que o micro:bit foi ligado ou desde a última vez que ele foi apertado

get_presses(): 
Retorna quantas vezes o botão foi pressionado, depois retorna para zero, até que seja chamado novamente:

'''
This example was created by Edson Sidnei Sobreira for
https://www.hackeduca.com.br
It's a public domain

Este exemplo foi criado por Edson Sidnei Sobreira para
https://www.hackeduca.com.br
Domínio público
-------------------------------------------------------
'''

from microbit import *

while True:
    if button_a.is_pressed() and button_b.is_pressed():
        sleep(10000)
        display.scroll(str(button_a.get_presses()))
    elif button_a.is_pressed():
        display.show(Image.HAPPY)
    elif button_b.is_pressed():
        display.show(Image.SAD)
    else:
        display.clear()

Pinos Entradas e Saídas – I/O

 

São 25 pinos disponíveis, mas somente 5 são facilmente utilizados por meio de jacarés, Pino 0, Pino 1, Pino 2, 3v e Gnd.

Os pinos digitais podem ser manipulados com os seguintes comandos:

  • read_digital()

Pino digital configurado como entrada, a leitura poderá ser 1 ou 0.

  • write_digital(value)

Pino configurado como saída: 1 é ligado (pino com 3v) e 0 é desligado.

  • read_analog() 

Pino analógico configurado como entrada, a leitura poderá ser 0 ou 1023

  • write_analog(value)

Pino analógico configurado como saída, poderá ser 0 ou 1023 – usar função PWM.

  • is_touched()

Retorna valor true ou (Verdadeiro) quando se toca no Gnd e no pino selecionado (0, 1 ou 2) ou false (falso) quando não há contato.

'''
This example was created by Edson Sidnei Sobreira for
https://www.hackeduca.com.br
It's a public domain

Este exemplo foi criado por Edson Sidnei Sobreira para
https://www.hackeduca.com.br
Domínio público
-------------------------------------------------------
'''

from microbit import *

while True:
    if pin0.is_touched():
        display.show(Image.HAPPY)
    elif button_a.is_pressed():
        display.show(Image.SAD)
    elif button_b.is_pressed():
        display.show(Image.HEART)
    else:
        display.clear()

Música

O micro:bit vem com uma biblioteca grande com música pré-definidas.
Para uso é necessário conectar um alto falante entre os pinos 0 e Gnd e importar a biblioteca music.

'''
This example was created by Edson Sidnei Sobreira for
https://www.hackeduca.com.br
It's a public domain

Este exemplo foi criado por Edson Sidnei Sobreira para
https://www.hackeduca.com.br
Domínio público
-------------------------------------------------------
'''

from microbit import *
import music

while True:
    if button_a.is_pressed():
        display.show(Image.HEART)
        music.play(music.BIRTHDAY)

As seguintes músicas estão disponíveis:

music.DADADADUM, music.ENTERTAINER, music.PRELUDE, music.ODE, music.NYAN, music.RINGTONE, music.FUNK, music.BLUES, music.BIRTHDAY, music.WEDDING, music.FUNERAL, music.PUNCHLINE, music.PYTHON, music.BADDY, music.CHASE, music.BA_DING, music.WAWAWAWAA, music.JUMP_UP, music.JUMP_DOWN, music.POWER_UP,

Randômico

A função pode ser utilizada para deixar que o microbit escolha algo dentre algumas opções indicadas.
É importante considerar que para mostrar no display através da função display.show()ou display.scroll() é necessario tranformar números em String usando a função srt()

  • random.choice() 

Seleciona valores que estão em uma lista específica:amigos = ["Leticia", "Julia", "Elaine", "Edson", "Veronica"]

  • random.randint(x, y)

Retorna valores inteiros entre dois argumentos informados: display.show(str(random.randint(50, 100)))

  • random.randrange(x)

Retorna valores entre 0 e o número especificado: display.show(str(random.randrange(100)))

  • random.random()

Retorna valores decimais entre 0,0 e 1,0

'''
This example was created by Edson Sidnei Sobreira for
https://www.hackeduca.com.br
It's a public domain

Este exemplo foi criado por Edson Sidnei Sobreira para
https://www.hackeduca.com.br
Domínio público
-------------------------------------------------------
'''

from microbit import *
import random

while True:    
    if button_a.is_pressed():
        amigos = ["Leticia", "Julia", "Elaine", "Edson", "Veronica"]
        display.scroll(random.choice(amigos))
    elif button_b.is_pressed():
        display.show(str(random.randint(1, 6)))
    elif pin0.is_touched():
        decimal = random.randrange(100) + random.random()
        display.scroll(str(decimal))

Movimento

O micro:bit possui um acelerômetro que indica o movimento nos 3 eixos:

  • X – inclinação para direita e esquerda: accelerometer.get_x()
  • Y – inclinação para frente e para traz:  accelerometer.get_y()
  • Z – movimento para cima e para baixo:  accelerometer.get_z()
'''
This example was created by Edson Sidnei Sobreira for
https://www.hackeduca.com.br
It's a public domain

Este exemplo foi criado por Edson Sidnei Sobreira para
https://www.hackeduca.com.br
Domínio público
-------------------------------------------------------
'''

from microbit import *

while True:
    reading = accelerometer.get_x()
    if reading > 20:
        display.show("D")
    elif reading < -20:
        display.show("E")
    else:
        display.show("o")
'''
This example was created by Edson Sidnei Sobreira for
https://www.hackeduca.com.br
It's a public domain

Este exemplo foi criado por Edson Sidnei Sobreira para
https://www.hackeduca.com.br
Domínio público
-------------------------------------------------------
'''

from microbit import *

while True:
    reading = accelerometer.get_y()
    if reading > 20:
        display.show("T")
    elif reading < -20:
        display.show("F")
    else:
        display.show("o")
'''
This example was created by Edson Sidnei Sobreira for
https://www.hackeduca.com.br
It's a public domain

Este exemplo foi criado por Edson Sidnei Sobreira para
https://www.hackeduca.com.br
Domínio público
-------------------------------------------------------
'''

from microbit import *

while True:
    reading = accelerometer.get_z()
    if reading > 20:
        display.show("B")
    elif reading < -20:
        display.show("C")

A função accelerometer.get_values() retorna uma lista ordenada com informações do eixo X, Y e Z respectivamente.

Gestos

Assim como nas funções de movimentos, o acelerômetro do micro:bit possui uma biblioteca de gestos pré definidos. Os gestos são expressos em String e possuem os seguintes nomes:
**** Para explicar os gestos, vamos usar como referencia o painel de LEDs (local onde os botôes são visíveis.

accelerometer.current_gesture()
accelerometer.was_gesture("gesture")

  • up – cima

Esse gesto é retornado quando o micro:bit está na posição vertical, com o conector USB para cima

  • down – baixo

Esse gesto é retornado quando o micro:bit está na posição vertical, com o conector USB para baixo

  • left – esquerda

Esse gesto é retornado quando o micro:bit está inclinado para esquerda, com o botão A em direção ao chão

  • right – direita

Esse gesto é retornado quando o micro:bit está na posição horizontal, com o botão B em direção ao chão

  • face up – face para cima

Esse gesto é retornado quando o micro:bit está na posição horizontal, com o painel de LEDs para cima

  • face down – face para baixo

Esse gesto é retornado quando o micro:bit está na posição horizontal, com o painel de LEDs para baixo

  • freefall – queda livre

Esse gesto é retornado quando o micro:bit está na posição vertical, com o conector USB para cima e ele cai em direção ao chão, nesta direção.

  • shake – chacoalhar

Esse gesto é retornado quando o micro:bit está chacolhando a placa. (Muito cuidado, é necessário segurar a placa e bateria) 

  • 3g, 6g, 8g 

Esse gesto é retornado quando o micro:bit excede em qualquer direção a gravidade em um determinado número de vezes: 3g (3x), 6g (6x) e 9g (9x), se você for para o espaço ou pilotar um carro de fórmula 1 (chegará até 6,5 g)  ou um caça de guerra (chegará até 9g),  poderá testar essa funcionalidade. Eu não consegui obter resultado.

'''
This example was created by Edson Sidnei Sobreira for
https://www.hackeduca.com.br
It's a public domain

Este exemplo foi criado por Edson Sidnei Sobreira para
https://www.hackeduca.com.br
Domínio público
-------------------------------------------------------
'''

from microbit import *

while True:
    gesture = accelerometer.current_gesture()
    print(gesture)
    sleep(1000)

Bússola

Essa função faz com que o micro:bit, após calibração, mostre a posição Norte, após calibração.

  • compass.calibrate()

Função utilizada para calibrar o micro:bit, quando ela é chamada ela irá mostrar a seguinte mensagem: DRAW A CIRCULE em português significa desenhe um círculo.
Você terá que fazer um movimento circular com o micro:bit, se tudo deu certo, você verá um rosto feliz. (Image.HAPPY).

  • compass.heading()

Essa função retorna valores entre 0° (Norte) e 360° (Noroeste)

'''
This example was created by Edson Sidnei Sobreira for
https://www.hackeduca.com.br
It's a public domain

Este exemplo foi criado por Edson Sidnei Sobreira para
https://www.hackeduca.com.br
Domínio público
-------------------------------------------------------
'''

from microbit import *

compass.calibrate()

while True:
    posicao = (compass.heading())
    if posicao < 45:
        display.show("N")
    elif posicao < 135:
        display.show("L")
    elif posicao < 225:
        display.show("S")
    elif posicao < 315:
        display.show("O")

O Exemplo abaixo simula a agulha da bússola:

# Original Example from https://microbit-micropython.readthedocs.io/en/latest/tutorials/direction.html 

from microbit import *
compass.calibrate()

while True:
    needle = ((15 - compass.heading()) // 30) % 12
    display.show(Image.ALL_CLOCKS[needle])

Rádio

Infelizmente, até o momento não é possível utilizar o módulo Bluetooth BLE incorporado na placa do micro:bit, por uma restrição de memória quando ele for programado em Python. Mas não impede que um micro:bit se comunique com outro.

Para que isso seja possível temos o módulo de rádio NRF24L01 que pode ser acessado da seguinte forma:

  • import radio

Importa a biblioteca necessária para que a função rádio funcione.

  • radio.on()

Liga a função rádio

  • radio.off()

Desliga a função rádio – muito importante, caso a placa esteja sendo energizada via pilhas, pois esse procedimento economiza energia e memória.
Importante considerar que todas as sintaxes relacionas ao rádio se tornam inválidas, apresentando falha no programa.

  • radio.config(channel="83")

Define o canal de comunicação entre os micro:bit. Pode ser selecionado de 0 até 83. O padrão é 7, quando não for informado nada.
O uso desse argumento faz com que um  micro:bit envie mensagens para até 84 micro:bits diferentes.

  • radio.send("xyz")

Envia uma mensagem para ser recebida por outro micro:bit

  • radio.receive()

Recebe uma mensagem enviada por  outro micro:bit

  • radio.reset()

Retorna a configuração padrão dos argumentos, por exemplo radio.config(channel="7")

'''
This example was created by Edson Sidnei Sobreira for
https://www.hackeduca.com.br
It's a public domain

Este exemplo foi criado por Edson Sidnei Sobreira para
https://www.hackeduca.com.br
Domínio público
-------------------------------------------------------
'''
from microbit import *
import radio

radio.on()
radio.config(channel=83) 

while True:
    
    mensagem = radio.receive()   
    # Button A sends a "hackeduca" message.
    if button_a.was_pressed():
        radio.send('hackeduca')
        
    # Button B change channel for standard - 7 and while is pressed can receive message in the standard channel.
    if button_b.is_pressed():
        radio.config(channel=7) 
        if mensagem is not None:
            display.scroll(mensagem)
    else:
        radio.config(channel=83) 

    # If "hackeduca" is received happy face shows up and keeps for 1s, display is cleared and a message is sent            
    if mensagem == 'hackeduca':
        display.show(Image.HAPPY)
        sleep(1000)
        display.clear()
        radio.send('hackeduca') 

    # If "10" is received they will scroll the same income data and will transmit 
    if mensagem == '10':
        display.scroll(mensagem)
        radio.send(mensagem) 

    # If "20" is received they will scroll the same income data 
    if mensagem == '20':
        display.scroll(mensagem)
        radio.send(mensagem)

Caso seja necessário programar o Python em blocos, há disponível uma extensão no para Scratch que pode ser encontrado aqui em nosso website.

Usamos como inspiração a seguinte referência: http://microbit-micropython.readthedocs.io/en/latest/#

print
Previous Post Next Post

Você também pode gostar / You Might Also Like

No Comments

Leave a Reply

Show Buttons
Siga-nos no Facebook
Siga-nos no Twitter
Siga-nos no Google Plus
Siga-nos no Pintrest
Siga-nos no Youtube
Siga-nos no Scratch
Hide Buttons
Top
HackEduca