Slide 1

Slide 1 text

Luz, micro:bit, ação! Juliana Karoline de Sousa | @julianaklulo Ilumine seus projetos com MicroPython

Slide 2

Slide 2 text

★ Bacharel em Ciência da Computação | UFSCar ★ PyLadies São Carlos | co-fundadora e organizadora ★ Grupy-Sanca | co-fundadora e organizadora ★ Omnivector | software engineer ★ IoT, robótica, impressão 3D, MicroPython :3 Juliana Karoline de Sousa

Slide 3

Slide 3 text

Agenda MicroPython 01 BBC micro:bit 02 Editor Python 03 NeoPixels 04 Exercícios 05 Projeto final: Pacman 06

Slide 4

Slide 4 text

Repositório do Tutorial Exemplos, exercícios e slides disponíveis em: https://tinyurl.com/tutorial-neopixel

Slide 5

Slide 5 text

MicroPython 01 Python para microcontroladores

Slide 6

Slide 6 text

Microcontroladores?

Slide 7

Slide 7 text

O que é um microcontrolador? Circuito integrado Processador, memória e periféricos em um único chip Programável Pode armazenar código customizado na memória I/O Portas integradas de entrada e saída para interagir com sensores e atuadores Baixo consumo de energia Pode ser utilizado em projetos alimentados por baterias

Slide 8

Slide 8 text

O MicroPython é uma implementação enxuta e eficiente do Python 3 que inclui um pequeno subconjunto da biblioteca padrão e é otimizada para execução em microcontroladores e em ambientes restritos. O que é o MicroPython?

Slide 9

Slide 9 text

Por que usar o MicroPython? Alto nível Permite escrever código orientado a objetos Produtividade Sintaxe mais simples do que C/C++, poucas linhas já são o suficiente Abstração É possível abstrair a camada de hardware de acordo com a aplicação Python Segue a filosofia da linguagem Python

Slide 10

Slide 10 text

Requisitos: ★ 256k de espaço de código ★ 16k de memória RAM Features: ★ Prompt interativo (REPL) ★ List comprehensions e generators ★ Tratamento de exceções ★ Acesso aos protocolos GPIO, PWM, ADC, UART, SPI Características do MicroPython

Slide 11

Slide 11 text

Microcontroladores que rodam MicroPython PyBoard ESP8266/ESP32 BBC micro:bit Raspberry Pi Pico Arduino Nano RP2040

Slide 12

Slide 12 text

BBC micro:bit 02 Computador de bolso para computação física

Slide 13

Slide 13 text

A BBC micro:bit é um computador de bolso que ensina como o software e o hardware funcionam juntos. Baseia-se no conceito de computação física, onde utiliza-se código para interagir com o mundo físico. O que é a BBC micro:bit?

Slide 14

Slide 14 text

Componentes da BBC micro:bit

Slide 15

Slide 15 text

Componentes da BBC micro:bit

Slide 16

Slide 16 text

Editor Python 03 Programando a BBC micro:bit no navegador

Slide 17

Slide 17 text

https://python.microbit.org

Slide 18

Slide 18 text

Como utilizar a BBC micro:bit? Coloque o cabo na placa e no computador Escreva código .py no editor online Clique em “send to micro:bit” e selecione o dispositivo O arquivo .hex é salvo automaticamente na micro:bit Coloque o cabo na placa e no computador Escreva código .py no editor online Clique em “send to micro:bit” e baixe o arquivo .hex no computador Copie o arquivo .hex para o dispositivo da micro:bit Navegadores suportados (Google Chrome) Outros navegadores (Firefox)

Slide 19

Slide 19 text

Hello,World! Execute o código de exemplo na placa

Slide 20

Slide 20 text

Como usar display da BBC micro:bit?

Slide 21

Slide 21 text

NeoPixels 04 Controlando LEDs endereçáveis

Slide 22

Slide 22 text

NeoPixels são sequências de LEDs endereçáveis que podem ser controlados individualmente utilizando somente um fio para comunicação. O que são NeoPixels?

Slide 23

Slide 23 text

Conectando o anel de LED na micro:bit

Slide 24

Slide 24 text

Exercícios 05 Controlando os LEDs com os sensores da micro:bit

Slide 25

Slide 25 text

Exercício #0 Usando os exemplos da documentação

Slide 26

Slide 26 text

Exemplo #1 - Acender um LED

Slide 27

Slide 27 text

Exemplo #2 - Acender todos os LEDs

Slide 28

Slide 28 text

Exemplo #3 - Acender vários LEDs

Slide 29

Slide 29 text

Exemplo #4 - Apagar LEDs

Slide 30

Slide 30 text

Botões Aprendendo o que iremos usar no próximo exercício

Slide 31

Slide 31 text

Como usar os botões da BBC micro:bit?

Slide 32

Slide 32 text

Exemplo #5: Lendo o estado dos botões

Slide 33

Slide 33 text

Exercício #1 Mover o LED aceso com os botões A e B

Slide 34

Slide 34 text

Exercício #1: Mover o LED aceso com os botões 01 Defina um index Será utilizado para indicar o LED aceso 02 While True Execute o código dentro de um loop, com um sleep no final 05 Acenda o index Escolha uma cor e use np.show() para acender o LED 04 Verifique os botões Aumente ou diminua o index de acordo com o botão apertado 03 Apague o index Coloque (0, 0, 0) na cor do LED para apagá-lo Dica: use % 12 ao ajustar o index para dar a volta no anel

Slide 35

Slide 35 text

Exercício #1: Mover o LED aceso com os botões

Slide 36

Slide 36 text

Acelerômetro Aprendendo o que iremos usar no próximo exercício

Slide 37

Slide 37 text

Como usar acelerômetro da BBC micro:bit?

Slide 38

Slide 38 text

Exemplo #6: Lendo os gestos do acelerômetro

Slide 39

Slide 39 text

Exercício #2 Acender um LED aleatório quando balança a placa

Slide 40

Slide 40 text

Exercício #2: Acender LED aleatório ao balançar 01 Defina um index Será utilizado para indicar o LED aceso 02 While True Execute o código dentro de um loop, com um sleep no final 05 Acenda o index Escolha uma cor e use np.show() para acender o LED 04 Verifique o gesto Verifique se a placa está sendo balançada e sorteie um index 03 Apague o index Coloque (0, 0, 0) na cor do LED para apagá-lo Dica: use pixels - 1 como intervalo do random

Slide 41

Slide 41 text

Exercício #2: Acender LED aleatório ao balançar

Slide 42

Slide 42 text

Rádio Aprendendo o que iremos usar no próximo exercício

Slide 43

Slide 43 text

Como usar rádio da BBC micro:bit?

Slide 44

Slide 44 text

Exemplo #7: Teleportando o pato

Slide 45

Slide 45 text

Exercício #3 Mover LED através de mensagens de rádio de outra placa

Slide 46

Slide 46 text

Exercício #3: Mover LED através do rádio 01 Defina um grupo Ambas as placas precisam estar no mesmo grupo para funcionar 02 Calcule o index Leia o x do acelerômetro e calcule o index de acordo 03 Acenda o LED indicado Apague o index antigo e acenda o novo index recebido pelo rádio 02 Receba a mensagem Verifique se uma mensagem foi recebida com radio.receive() 03 Envie a mensagem Use radio.send() para transmitir o index para a outra placa Sender Receiver

Slide 47

Slide 47 text

Exercício #3: Mover LED através do rádio Sender Receiver

Slide 48

Slide 48 text

Microfone Aprendendo o que iremos usar no próximo exercício

Slide 49

Slide 49 text

Como usar microfone da BBC micro:bit?

Slide 50

Slide 50 text

Exemplo #8: Lendo os valores do microfone

Slide 51

Slide 51 text

Exercício #4 Trocar a cor do anel de acordo com o som do microfone

Slide 52

Slide 52 text

Exercício #4: Trocando a cor de acordo com o som 01 Defina um limite Será utilizado para saber se o som é alto o suficiente 02 While True Execute o código dentro de um loop, com um sleep no final 05 Acenda o anel todo Use np.fill() e np.show() para acender o anel de LED 04 Sorteie uma cor Use o random para sortear um valor para cada canal RGB 03 Verifique o som Leia o sound_level() e verifique se é maior que o limite definido Dica: use 255 como intervalo do random

Slide 53

Slide 53 text

Exercício #4: Trocando a cor de acordo com o som

Slide 54

Slide 54 text

Projeto Final 06 Criando o jogo do Pacman

Slide 55

Slide 55 text

Projeto Final: Jogo do Pacman

Slide 56

Slide 56 text

Recursos novos Aprendendo a usar o alto-falante e o contador de tempo

Slide 57

Slide 57 text

Como usar alto-falante da BBC micro:bit?

Slide 58

Slide 58 text

Exemplo #9: Tocar uma melodia

Slide 59

Slide 59 text

time.ticks_ms() e time.ticks_diff() time.ticks_ms() é uma função que gera um contador de tempo, em milisegundos, que começa no momento em que foi instanciado. time.ticks_diff() serve para calcular a diferença de tempo entre dois contadores criados com time.ticks_ms(). tempo_1 = time.ticks_ms() # começou às 10:00:00 tempo_2 = time.ticks_ms() # começou às 10:00:05 time.ticks_diff(tempo_2, tempo_1) # retorna 5000ms

Slide 60

Slide 60 text

Exemplo #10: time.ticks_ms() e time.ticks_diff()

Slide 61

Slide 61 text

Projeto Final: Jogo do Pacman Pacman Direção do movimento é definida pelos botões Fantasma Muda de cor quando o Pacman fica forte Fruta Dá força para o Pacman e permite captura Jogo Roda até o Pacman ser capturado pelo fantasma

Slide 62

Slide 62 text

Parte #1 Criando o Pacman

Slide 63

Slide 63 text

Projeto Final #1: Pacman 01 __init__(self, pixels) Configura a posição, a cor, velocidade, direção e força 02 next_position(self) Calcula a próxima posição baseado na direção 04 show() Atualiza o index com a nova posição calculada 03 move(self) Move a cada 1000ms, na direção definida pelos botões

Slide 64

Slide 64 text

Pacman.__init__()

Slide 65

Slide 65 text

Pacman.next_position() and Pacman.move()

Slide 66

Slide 66 text

Pacman.show()

Slide 67

Slide 67 text

Parte #2 Criando o Fantasma

Slide 68

Slide 68 text

Projeto Final #2: Ghost 01 __init__(self, pixels) Configura a posição, as cores, velocidade e direção 02 next_position(self) Calcula a próxima posição baseado na direção 04 randomize_position() Calcula uma nova posição aleatória quando é capturado 03 move(self) Move a cada 1500ms, seguindo no sentido horário 05 set_color() Decide se vai ficar azul ou verde de acordo com a força 06 show() Atualiza o index com a nova posição calculada

Slide 69

Slide 69 text

Ghost.__init__()

Slide 70

Slide 70 text

Ghost.next_position(), move() e randomize()

Slide 71

Slide 71 text

Ghost.set_color() e Ghost.show()

Slide 72

Slide 72 text

Parte #3 Criando a Fruta

Slide 73

Slide 73 text

Projeto Final #3: Fruit 01 __init__(self, pixels) Configura a posição, a cor, e o contador de tempo 02 hide(self) Esconde a fruta após o Pacman ter capturado e inicia contador 03 randomize_position() Calcula uma nova posição aleatória quando é capturado 04 show() Atualiza o index com a nova posição calculada

Slide 74

Slide 74 text

Fruit.__init__()

Slide 75

Slide 75 text

Fruit.hide(), randomize() e show()

Slide 76

Slide 76 text

Parte #4 Criando a Jogo

Slide 77

Slide 77 text

Projeto Final #4: Game 01 __init__(self, pixels) Configura os NeoPixels e instancia Pacman, Ghost e Fruit 02 check_fruit_collision(self ) Verifica se o Pacman capturou a fruta para ficar forte 04 check_ghost_collision(self) Verifica se o Pacman capturou um fanstama 03 check_strong(self) Verifica se já esgotou o tempo que o Pacman fica forte 05 got_ghost() e end() Fica feliz quando o Pacman estava forte e triste quando fraco 06 run() Implementa a lógica do jogo

Slide 78

Slide 78 text

Game.__init__()

Slide 79

Slide 79 text

Game.check_fruit_collision()

Slide 80

Slide 80 text

Game.check_strong()

Slide 81

Slide 81 text

Game.check_ghost_collision()

Slide 82

Slide 82 text

Game.got_ghost() e Game.end()

Slide 83

Slide 83 text

Game.run()

Slide 84

Slide 84 text

game = Game()

Slide 85

Slide 85 text

Testando o jogo Execute o código completo na placa e divirta-se!

Slide 86

Slide 86 text

Conclusão Com a biblioteca NeoPixel, é possível usar a mesma abordagem para controlar sequências de LED independente do tamanho delas. Ideias de projetos: ★ Acender luzes de escadas com sensor de presença ★ Acender luzes externas com sensor de luminosidade O que você implementaria?

Slide 87

Slide 87 text

Obrigada! Dúvidas? @julianaklulo