Scratch + Arduino

From MuSA Wiki
Jump to: navigation, search

Contents

[edit] Arduino

ArduinoDuemilanove.jpg

[edit] O que é

arduinoSymbol.png

O Arduino é uma plataforma de prototipagem eletrônica open-source que se baseia em hardware e software flexíveis e fáceis de usar. É destinado a artistas, designers, hobbistas e qualquer pessoa interessada em criar objetos ou ambientes interativos.

[edit] Conhecendo a Interface

Interface_Arduino.png

A interface contêm:

  • Pinos digitais 2-13 (verde)
  • Pinos digitais (RX, TX) 0,1 (verde)
  • Reset (azul)
  • Pinos analógicos (azul)
  • Alimentação 5v e 9v (laranja)
  • Terra (verde e laranja)
  • Alimentação Externa 9v – 12v (rosa)
  • USB (amarelo)
  • Jumper para mudar alimentação do Diecimila (roxo)

Tudo bem. Quer dizer então que o Arduino possui entradas e saídas digitais e analógicas. Mas o que isso significa?

Quando usamos estes termos, estamos tratando da representação numérica de informação. No mundo que nos rodeia, no geral, a informação é analógica. Peguemos como exemplo a variação de temperatura, hora está 14 graus, hora 20, 35... Ou seja, temos muitos valores.

O Arduino trabalha muito bem com informações que variem de 0 até 1024, e são nos pinos analógicos que iremos ligar a maioria dos sensores.

Atualmente, os computadores usam o sistema de representação binária para realizar cálculos, ou seja, eles reconhecem apenas valores 0 (desligado, 0 volts) ou 1 (ligado, 5 volts). Por isso temos os pinos digitais, onde ligamos coisas como botões, que possuem apenas dois estados, ligado ou desligado.

Então se computadores conhecem apenas 0 e 1, como conseguimos jogar para a saída dele valores analógicos? Bem, existe uma técnica chamada PWM (Pulse Width Modulation) que nos ajuda nisso. Oscilando rapidamente uma saída digital, entre 0 e 1, tem-se a impressão de que a quantidade de energia enviada para o circuito é variável. Essa técnica pode ser utilizada para variar a intensidade luminosa de um led, a velocidade de um motor, etc. Por exemplo, deixando 100% do tempo a saída em 1, a energia no circuito será sempre total. Deixando 50% do tempo a saída em 1, teremos a impressão de que a energia no circuito será a metade. No Arduino, as portas 9, 10 e 11 podem ser usadas como PWM.

[edit] Ferramentas

Ferramentas.png

[edit] Protoboard

Uma matriz de contato, ou placa de ensaio (ou protoboard, ou breadboard em inglês) é uma placa com furos e conexões condutoras para montagem de circuitos elétricos experimentais. A grande vantagem do protoboard na montagem de circuitos eletrônicos é a facilidade de inserção de componentes, uma vez que não necessita soldar nenhum componente a ela.

Protoboard.jpg

[edit] Exemplo - Olá Mundo

Vamos abrir o programa do Arduino:

IDE_Arduino.png

Antes de escrever o código fonte, vamos montar o hardware, pegue um LED e coloque no pino 13, como mostra a figura:

Arduino_LED.png

Na IDE do Arduino, digite o código abaixo:

 void setup() {                
   pinMode(13, OUTPUT);     
 }
 
 void loop() {
   digitalWrite(13, HIGH);   
   delay(1000);              
   digitalWrite(13, LOW);    
   delay(1000);              
 }

Faça o upload do código para o Arduino.

[edit] Scratch for Arduino (S4A)

[edit] O que é Scratch

logoScratch.png

É um ambiente de aprendizagem de desenvolvimento feito por Lifelong Kindergarten Group no MIT Media Lab. É 100% software livre, e tem por objetivo ensinar programação para crianças a partir dos 8 anos. Permite criar estórias interativas, animações, jogos, musica e arte e compartilhar na web (http://scratch.mit.edu).

Na criação dos projetos, as crianças aprendem importantes ideias matemáticas e computacionais, além de aprender a pensar criativamente e trabalhar coletivamente.

http://info.scratch.mit.edu/About_Scratch

[edit] O que é S4A

s4aSymbol.png

S4A é um software baseado no Scratch que suporta programação simples da plataforma de hardware livre Arduino. Disponibilizar novos blocos para gerenciar sensores e atuadores conectados no Arduino.

Foi criado para atrair pessoas para o mundo da programação. Tem por objetivo prover um interface de alto nível para os programadores de Arduino com funcionalidades bem como interagir com um conjunto de placas.

S4A foi desenvolvido por Marina Conde, Victor Casado, Joan Güell, Jose García and Jordi Delgado com a ajuda do grupo de programação de Smalltak do Citilab.

[edit] Conhecendo a Interface

s4aInterface.png

Os controles ficam do lado superior esquerdo

s4aControles.png

Foram criados controles adicionais no S4A, são eles:

s4aControlesMovimento.png

Onde:

  • Digital Read: pinos digitais 2 e 3
  • Digital Write: pinos digital 10, 11 e 13
  • Analog Read: pinos analógico 0-5
  • Analog Write: pinos digitais 5,6 e 9
  • Servo control:
    • Rotação continua: pinos 4,7
    • Padrão: pinos 8 e 12

Na aba controle de Sensores, foi adicionado:

s4aControlesSensores.png

Onde:

  • Valor do Sensor seletor deslisante | luz | som | resistências | virar | distância -> retorna o valor do sensor
  • Sensor botão apertado | A conectado | B conectado | C conectado | D conectado ? -> verifica se o botão está apertado ou conectado.

Os outros controles que estão no S4A foram herdados do Scratch.

Download firmware http://seaside.citilab.eu/S4AFirmware14.pde

[edit] Exemplo - Olá Mundo

Como foi descrito anteriormente vamos repetir o exemplo de piscar o LED, mas agora sem digitar um linha de código, vamos utilizar o S4A para realizar essa tarefa. Mas espere, antes de fechar a IDE do Arduino, precisamos realizar mais uma tarefa, precisamos realizar o download do firmware, que é o conjunto de instruções operacionais programadas diretamente no hardware, faça o download do arquivo aqui.

Abra o arquivo e copie para a IDE do Arduino e faça o upload do código.

Pronto, agora podemos fechar o Arduino e focar no S4A! Uhuuu!

Abra o Scratch e monte o seguinte script com os blocos relacionados:

s4aola.png

Fácil né?

[edit] Comparando

s4ahello.png

[edit] Mão na Massa

Chega de blablabla, vamos aos exemplos!

[edit] Leds

Já desenvolvemos um script para piscar um LED, mas o que é um LED? Como funciona? Bom, os LEDs (ou Light Emitting Diode, ou Diodo Emissor de Luz) têm polaridade, isto é, eles apenas acendem se você orientar as suas perninhas (terminais) corretamente.

LEDs.jpg

A perna mais longa é normalmente o positivo (+) que vai conectado ao pino 13. A perna mais curta conecta-se ao GND (TERRA); o corpo do LED normalmente terá um pequeno chanfro achatado indicando essa perna. Se o LED não acender, tente inverter os terminais (você não danificará o LED se ligá-lo invertido por um curto período... não tenha medo...).

Bom agora sabemos o que é, e já criamos um exemplo do led piscando, como exercicio, tente criar um semáforo, utilize os leds com cores em vermelho, amarelo e verde para ficar mais bonitinho! :-)

[edit] Botões

O interruptor momentâneo (popular botão) é um componente que conecta dois pontos de um circuito ao pressioná-lo. O exemplo a seguir liga um LED Quando precionamos o botão.

botao.png

Quando o botão está livre (não pressionado), não há conexão entre as suas duas pernas, de forma que o pino do Arduino está conectado aos 5V e ao ler o pino, obtemos HIGH.

Quando o botão é fechado (pressionado), ocorre a conexão entre suas pernas, de forma que o pino do Arduino é ligado e obtemos LOW (O pino ainda se mantém conectado aos 5 volts, mas o resistor de pull-up faz com que o pino esteja mais próximo do GND).

Se o pino digital for desconectado da montagem, o LED poderá piscar de forma irregular. Isto porque dizemos que a entrada está flutuando – isto é, estará entre valores de tensão elétrica aleatórios entre HIGH e LOW. É por isso que utiliza-se um resistor de pull-up ou pull-down no circuito.

Legal, né? Mas, vamos a prática, monte o circuito abaixo no Arduino

button_led.png

Agora vamos montar o script no S4A:

s4abotaoled.png

[edit] Potenciômetros

Um potenciômentro é um simples botão giratório que fornece uma resistência variável e que pode ser lida pelo Arduino como um valor analógico. No exemplo a seguir, esse valor é usado para controlar a taxa que o LED estará piscando.

http://pt.wikipedia.org/wiki/Ficheiro:Potentiometer.jpg

Conectamos três fios à placa Arduino. O primeiro vai no GND (terra) do Arduino a partir da perna esquerda do potenciômetro (ele possui geralmente três pernas). O segundo fio será Para 5 volts do Arduino à perna direita. O terceiro e último fio será colocado na entrada Analógica 0 à perna central do potenciômetro.

Se girarmos o potenciômetro, alteramos a resistência em cada lado do contato elétrico que vai conectada à sua perna central. Isso provoca a mudança na proximidade da perna central aos 5 votls ou ao GND (terra), o que implica numa mudança no valor analógico de entrada. Quando o potenciômetro for levado até o final da escala, teremos por exemplo zero volts a ser fornecido ao pino de entrada da escala, haverá 5 volts a ser fornecido ao pino do Arduino e, ao lê-lo, teremos 1023. Em qualquer posição intermediária do potenciômetro, teremos um valor entre 0 e 1023, que será proporcional à tensão elétrica sendo aplicada Ao pino do Arduino.

Monte o circuito abaixo no Arduino:

potenciometro.png

Agora vamos montar o script no S4A:

s4apot.png

[edit] LDR

LDR – Ligh Dependent Diode faz o inverso que o LED. Ambos são diodos, mas ao invés de emitr luz como fazem os LEDs, o LDR a recebe!

http://en.wikipedia.org/wiki/File:LDR.jpg

Seu comportamento é muito parecido com o potênciomentro, conforme a intensidade da luz aumentar/diminuir também irá aumentar/diminuir a sua resistência, alterando a tensão do circuito e, por conseguinte, permitindo que tenhamos 1024 valores diferentes. Nada melhor do que testar seu comportamento! Replique o circuito abaixo:

photoresistor_led.png

Monte o script no S4A:

s4aldr.png

[edit] Piezos

Potenciômetros variam sua resistência quando giramos seu botão. LDRs variam a resistência conforme a intensidade de luz. Piezoelétricos são cristais geram uma tensão conforme a pressão incidida sobre eles.

http://en.wikipedia.org/wiki/File:2007-07-24_Piezoelectric_buzzer.jpg

[edit] Entrada

Podemos usá-los para capturar vibrações no ambiente. São também úteis como saída: fazendo-os vibrar em uma determinada frequência, podemos produzir sons! Mas vamos primeiramente usá-los como entrada, para isso, replique o circuito:

piezo_entrada.png

[edit] Saída

Agora sim vamos usar o piezoelétrico como saída. Replique o circuito e o código em seu mundo real e abstrato. Gere som. Utilize um copo plástico para amplificar o som!

piezo_saida.png

[edit] Referências

[edit] Scratch + Mundo Externo

[edit] Tutorial rápido para envio de mensagens de Python <-> Scratch

  1. Tenha o Scratch instalado. Baixe em http://scratch.mit.edu
  2. Execute o Scratch e vá para o grupo de blocos "SENSORES" (canto superior esquerdo)
  3. Clique e arraste o bloco "VALOR DO SENSOR ..." para o espaço de programa, à direita
  4. Clique com o botão direito e depois "HABILITAR CONEXÕES DO SENSOR REMOTO". Esse é o segredo... o Scratch abre uma porta (42001) e fica escutando o que for enviado para ela!
  5. Agora rode o script Python:
   from array import array
   import socket
   import time
   
   HOST = '127.0.0.1'
   PORT = 42001
   
   def sendScratchCommand(cmd):
       n = len(cmd)
       a = array('c')
       a.append(chr((n >> 24) & 0xFF))
       a.append(chr((n >> 16) & 0xFF))
       a.append(chr((n >>  8) & 0xFF))
       a.append(chr(n & 0xFF))
       scratchSock.send(a.tostring() + cmd)
   
   print("connecting...")
   scratchSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   scratchSock.connect((HOST, PORT))
   print("connected")
   
   for i in xrange(1000):
       sendScratchCommand('sensor-update note ' + str(60 + (2 * i)) + ' beats ' + str(i))
       sendScratchCommand('broadcast "beat"')
       print("beat!")
       time.sleep(0.5)
       
   print("closing socket...")
   scratchSock.close()
   print("done")

Para enviar do Scratch para outros programas:

   from array import array
   import socket
   import time
   
   HOST = '127.0.0.1'
   PORT = 42001
   
   print("connecting...")
   scratchSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   scratchSock.connect((HOST, PORT))
   print("connected! waiting for data...")
   
   # print incoming data forever
   while 1:
       time.sleep(0.01)
       data = scratchSock.recv(1024)
       if not data: break
       print(data)

Crie uma variável e modifique seu valor em Scratch. A cada mudança, seu valor será enviado por socket para qualquer cliente conectado na porta 42001.

Mais em http://scratch.mit.edu/forums/viewtopic.php?id=9458

Personal tools
Namespaces

Variants
Actions
coletivo
projetos
oficinas
ref. eletrônica
synth/music/interfaces
incubados
pessoal
navegação
Toolbox