Crónicas do Engenheiro Maluco por Tartes de Framboesa e Lego: Introdução

Objectivo:

Disponibilizar uma plataforma para que crianças de todas as idades se divertam enquanto desenvolvem aptidões nas áreas da Ciência e Engenharia (sobretudo Robótica).

Os blocos Lego não são apenas um brinquedo, são excelentes ferramentas pedagógicas. E além dos blocos básicos, com os quais já se pode construir quase tudo que vier à imaginação, os conjuntos Technic, Power Functions e Mindstorms permitem-nos acrescentar movimento e autonomia às nossas criações.

Nos Estados Unidos (e não só) existem várias organizações que pretendem incutir nas crianças e adolescentes o gosto pelas ciências (STEM – science, technology, engineering and mathematics). Muitas delas fazem-no justamente com Lego:

Dentro do mesmo espírito mas limitado apenas ao ramo das ciências da computação, dois projectos captaram muito recentemente a minha atenção:

A Raspberry Pi Foundation surgiu da preocupação de quatro docentes do Computer Laboratory na University of Cambridge com a falta de preparação dos candidatos a cursos de ciências da computação no Reino Unido. Decidiram por isso difundir entre o público juvenil a versão moderna dos micro-computadores baratos e fáceis de programar que abundaram nos anos 80/90 (a ideia parece-me pertinente já que eu tive um ZX Spectrum 128 aos 14 anos e vejam no que deu).

Tal como no Spectrum havia uma ligação muito directa à linguagem Basic, a Raspberry Pi Foundation decidiu apostar na linguagem Python (daí o Pi que surge no nome) e ainda na linguagem Scratch desenvolvida no Lifelong Kindergarten Group do Media Lab (MIT, Massachussets Institute of Technology) especificamente para estudantes dos 8 aos 16. Esta última é uma linguagem visual que permite desenvolver programas ou animações sem ser necessário escrever código, bastando apenas juntar blocos (como no Lego) e ajustá-los às nossas necessidades.

Como o Media Lab autoriza e até incentiva o desenvolvimento de extensões ao Scratch surgiram muitos outros projectos dele derivados, incluindo alguns que permitem interagir com blocos Lego Mindstorms como o Enchanting do Southern Alberta Robotics Enthusiasts e o Snap! (anteriormente chamado BYOB – Bring Your Own Blocks) da University of California em Berkeley.

Juntando tudo (Snap! + Raspberry Pi + algumas peças Lego Technic e Mindstorms) podemos criar pequenos robots relativamente fáceis de programar, sem o preço nem o peso de um computador portátil nem a complexidade de um microcontrolador dedicado (como um PIC ou um ARM, apesar de neste campo projectos como o Arduíno terem permitido diminuir significativamente a componente complexidade).

Depois é só dar asas à criativade e ao engenho dos engenheiros e cientistas de todas as idades que possam pegar nisto.

Legoficação de um Raspberry Pi

Material necessário (aconselho consultar a wiki RPi VerifiedPeripherals):

  • 1 Raspberry Pi (à venda na PTRobotics e na Portugal-Didáctico)
  • 1 Cartão SD 4GB (à venda em todo o lado)
  • 1 bateria com ficha USB (PNY PowerPack 5200mAh, à venda na FNAC)
  • 1 cabo USB-MicroUSB (vem com a bateria)
  • 1 adaptador WiFi USB, preferencialmente mini (D-Link DWA-131 à venda na FNAC)
  • 1 cabo USB A-B o mais curto possível (arranjei um cabo «prolongador» USB extremamente curto numa loja chinesa e juntei um adaptador A-B mas há cabos à venda no eBay)

Poderá ser conveniente, mas não indispensável:

  • 1 hub USB 2.0* (à venda na Worten)
  • 1 teclado USB (à venda em todo o lado, na Mediamarkt há uns muito pequenos)
  • 1 rato USB (à venda em todo o lado)
  • 1 monitor/TV com ligação HDMI ou DVI (neste caso é também necessário um adaptador HDMI-DVI)
  • 1 caixa para Raspberry Pi

* infelizmente nem todos servem, há alguns como o Targus ACH114EV que não seguem devidamente as normas e apesar de funcionarem num PC normal não funcionam no Raspberry Pi. Os modelos KUNFT H-088 e Mitsai H-092 funcionam (este último tem inclusive uma ficha para alimentação externa que poderá dar jeito se quisermos ligar dispositivos USB que consumam mais corrente do que o Raspberry Pi consegue fornecer)

É necessário ligar as duas peças mais volumosas (o Raspberry Pi e a bateria) às restantes peças Lego de um modo prático mas sólido. Optei por colar duas vigas Technic a cada uma de modo a poder tratá-las como se fossem blocos Lego normais.

Raspberry Pi + Bateria USB
Raspberry Pi + Bateria USB antes de serem legoficados

Usei uma cola de contacto própria para plásticos ABS tendo apenas o cuidado adicional de espaçar as vigas a colar com outras peças lego de modo a assegurar que a distância entre as duas respeita os padrões Lego.

Para a bateria usei duas vigas 1×9 (40490):

IMG_2519-2 IMG_2520-2

Para o Raspberry Pi (com caixa) usei duas vigas 1×11 (32525):

IMG_2521-2 IMG_2512-2

Como o espaço entre as vigas da bateria é duas unidades inferior ao espaço entre as vigas do Raspberry Pi podemos ligar os dois num só módulo:

IMG_2527-2

Montagem do Rover

Para montar o Rover resta agora:

  • ligar os blocos maiores entre si (o conjunto bateria + Raspberry PI e o Mindstorms NXT) tendo o cuidado de não dificultar a troca de pilhas do NXT nem o acesso aos vários botões e fichas do conjunto:

IMG_2531-2IMG_2535-2IMG_2537-2IMG_2539-2IMG_2540-2IMG_2543-2IMG_2544-2IMG_2546-2

  • depois ligar os dois motores e as três rodas (uma roda por motor e uma terceira roda livre que serve apenas para sustentar o Rover e facilitar as curvas à esquerda ou à direita):

IMG_2547-2

  • e finalmente os cabos, o cartão SD e o adaptador WiFi USB:

IMG_2558-2IMG_2559-2

Esta foi a primeira versão, serviu para o primeiro video de demonstração mas o comportamento deixava muito a desejar (sobretudo devido ao centro de gravidade muito alto e à roda livre instável. Mais à frente mostrarei versões melhoradas, inclusive com sensores (um Rover para poder ser um robot autónomo precisa de algum tipo de sensor para entender o mundo à sua volta).

Roda livre

Não gostei da roda livre baseada num «pneu», os  movimentos curvos do Rover não me pareciam consistentes.

Tinha encontrado recentemente um artigo de uma roda livre com base numa bola de um conjunto Mindstorms que eu não tenho mas a ideia pareceu-me boa e experimentei primeiro com a bola da minha trackball e depois decidi usar um «abafador» (um berlinde de vidro grande, cerca do dobro do diâmetro de um berlinde normal).

DSC_0183-2 DSC_0185-2A forma como a roda livre está montada no chassis ainda é deficiente (ocorre alguma torção devido ao peso do Rover) mas os movimentos curvos são muito mais fluidos já que o eixo de rotação do Rover passou a ser a bola em vez de uma roda com o seu próprio eixo de rotação.

Entretanto ainda hei-de experimentar outra ideia bastante interessante, usar a bola de um desodorizante roll-on, requer bastante menos peças. O autor (Philippe “Philo”Hurbain) é bastante conhecido no mundo Lego Technic e Mindstorms, com análises tecnicamente muito detalhadas aos motores e baterias da Lego. Também tem no seu site diagramas para montagem de um Rover em Lego que  usa uma bola como roda livre (Spy Camera Rover).

 

Primeiras linhas de código

Com um Rover já em condições de andar, faltava o video de demonstração da praxe (o que está no artigo de abertura desta série).

Antes de me meter à aventura com o Snap! limitei-me a transferir para o Raspberry Pi um script muito básico em python que faz o Rover por 4 vezes andar um troço a direito seguido de uma curva à esquerda (idealmente voltando ao ponto de partida mas como não usei nenhum tipo de sensores a única forma de o conseguir foi afinando os tempos à mão) e no final uma rotação em torno de si mesmo várias vezes para a direita:

import nxt
import nxt
import nxt.locator
from nxt.sensor import *
from nxt.motor import *
from time import sleep

brick = nxt.locator.find_one_brick()
left = Motor(brick, PORT_B)
right = Motor(brick, PORT_C)
both = nxt.SynchronizedMotors(left, right, 0)
leftboth = nxt.SynchronizedMotors(left, right, 100)
rightboth = nxt.SynchronizedMotors(right, left, 100)

for n in range(0,4):
 both.run(100)
 sleep(1.25)
 both.idle()
 sleep(0.25)
 leftboth.run(100)
 sleep(0.48)
 leftboth.idle()
 sleep(0.25)

rightboth.run(100)
sleep(4)
rightboth.idle()

A execução do script foi comandada manualmente (essencialmente acedi de modo wireless a partir do meu portátil por SSH e invoquei o script a partir da shell).