terça-feira, 27 de abril de 2010

Dojo de Programação com o Program-ME

No ultimo dia 16 realizamos na Globalcode em Campinas um dojo de programação com o Program-ME em formato de mini-curso gratuito. Este mini-curso foi dividido em duas partes. Na primeira, apresentamos os slides a seguir para explicar para os participantes o conceito de dojo, o que é Arduino, o que é Program-ME, a diferença entre Arduino e Program-ME, como programar e sobre os projetos da Globalcode com o Program-me e eletrônica. A segunda parte foi o dojo propriamente dito, onde os participantes puderam por a mão na massa.

Dojo com Arduino e Program-ME
Para download destes slides visite a página do MC65.

O que é dojo?

Segundo o http://codingdojo.org/: "Um Coding Dojo é um encontro onde um grupo de programadores se reúne para trabalhar em conjunto em um desafio de programação. Eles estão lá para se divertir, e, através de uma metodologia pragmática, melhorar suas habilidades de programação e de trabalho em grupo.".

O Coding Dojo tem algumas regras básicas:

  • Desenvolvimento guiado por testes: Antes de fazer qualquer implementação, deve ser escrito um teste, que ao passar indica que a implementação está correta.
  • "Passos de bebê": Se um teste não está passando, você deve escrever o código mais simples possível que faça o teste passar. Quando for escrever um novo teste para o mesmo método, escreva um teste que teste só um pouquinho a mais da funcionalidade desejada.
  • Pair programming: A programação é feita em duplas. Cada dupla tem um piloto e um co-piloto. Ambos pensam em como passar no teste atual, mas só o piloto digita. Cada par tem por volta de 5 a 10 minutos no seu turno. Quando esse tempo acaba:
  1. O piloto volta para a platéia
  2. O co-piloto assume o lugar do piloto
  3. Um novo co-piloto vem da platéia
  • Todos devem entender: O piloto e o co-piloto devem sempre explicar em voz alta o que estão tentando fazer para solucionar o problema. Qualquer um na platéia pode pedir explicações se não entender algum raciocínio.
  • Três fases: Um Coding Dojo sempre está em alguma dessas 3 fases, dependendo do estado dos testes:
  1. Vermelha: Pelo menos um teste não está passando. A dupla da vez deve se concentrar em fazer o teste passar. A platéia não deve falar nessa fase, para não atrapalhar piloto e co-piloto.
  2. Verde: Os testes acabaram de ser rodados e todos estão passando. Essa é a hora de quem está na platéia dar sugestões para melhorar o código.
  3. Cinza: O código foi modificado de acordo com as sugestões, mas a bateria de testes ainda não foi rodada. Deve-se evitar fazer grandes modificações no código nessa fase.

Durante a realização deste dojo algumas das regras acima não foram aplicadas para permitir o exercício dos participantes com o Program-ME. Assim, poderam realizar a dinâmica do pair-programming para completar o desafio de escrever um código em C para rodar dentro do microcontrolador do Program-ME e simular o brinquedo Genius. Durante uma hora e meia do mini-curso, os participantes desenvolveram os seguinte código:

int leds[] = {11, 9, 3, 5};
int botoes[] = {12, 10, 4, 6};
int bip = 13;

char state = 'S'; // S = Start, P = Play, B = Read button, ...
int sequencia[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int currentRound = 0;
int currentPosition = 0;
int tamanho = 4;

void setup() {
for (int i = 0; i < 4; i++) {
pinMode(leds[i], OUTPUT);
pinMode(botoes[i], INPUT);
}
pinMode(bip, OUTPUT);
Serial.begin(9600);
}
int botaoAtual = -1 ;
void loop() {
int botao = botaoPressionado();


if (currentRound == 0) {
if (botao >= 0) {
sequencia[currentRound] = botao;
currentRound++;
state = 'P';

}
} else if (currentRound <= tamanho) {

if (state == 'P') {
beep();
for (int i = 0; i < currentRound; i++) {
digitalWrite(leds[sequencia[i]], HIGH);
delay(1000);
//beep();
digitalWrite(leds[sequencia[i]], LOW);
delay(100);
}
currentPosition = 0;
state = 'B';
} else {
if (botao >= 0) {
if (botao == sequencia[currentPosition]) {
currentPosition ++;
if (currentPosition == currentRound) {
beep();
sequencia[currentRound] = (int)random(0, 4);
currentRound++;
state='P';
}
}
else {
beep();
for (int i = 0; i < 4; i++) {
for (int i = 0; i < 4; i++) {
digitalWrite(leds[i], HIGH);
delay(100);
digitalWrite(leds[i], LOW);
}
}
currentRound = 0;
}
}
}

}
else{
currentRound = 0;
for (int i = 0; i < 4; i++) {
digitalWrite(leds[i], HIGH);
}
delay(1000);
for (int i = 0; i < 4; i++) {
digitalWrite(leds[i], LOW);
}
}
// digitalWrite(leds[0],HIGH);
// beep() ;
// digitalWrite(leds[0],LOW);

}

int botaoPressionado() {
for (int i = 0; i < 4; i++) {
if (i != botaoAtual && digitalRead(botoes[i]) == HIGH) {
botaoAtual = i ;
digitalWrite(leds[i], HIGH);
delay(500);
digitalWrite(leds[i], LOW);
return i;
}
}
botaoAtual = -1 ;
return -1;
}

void beep() {
digitalWrite(bip, HIGH);
delay(1000);
digitalWrite(bip, LOW);
}

void inicio() {
randomSeed(analogRead(0));
for (int i = 0; i < tamanho; i++) {
sequencia[i] = (int) random(0, 4);
}
}

O que é Genius-ME?

Foto do Genius-MEO objetivo do dojo era que os participantes implementassem uma aplicação que simulasse o antigo brinquedo eletrônico conhecido como Genius. A simulação deveria gerar as sequências de cores usando LEDs para um jogador interagir fisicamente com aplicação através de botões para repetir a sequencia aleatória apresentada. O algorítimo deveria então captar essas ações e identificar se a sequência realizada pelo jogador está correta ou não.
Os parcipantes chegaram ao código funcional apresentado acima.

O que é Arduino?

O Arduino é um projeto criado na Itália pelo Mássimo Banzi no Interaction Design Institute Ivrea; com as características:
  • Baixo custo de produção e alta aplicabilidade;
  • Nasceu para complementar o aprendizado de programação, computação física e gráfica;
  • Nasceu do Processing;
  • Processing é um ambiente e linguagem de programação para criar imagens, animação e interação;
  • Baixo custo de desenvolvimento:
  1. Microcontrolador custa R$ 8;
  2. Arduino completo a partir de R$ 80,00;
  3. Várias versões de Arduino: Mega, nano, lilypad e outros;

O que é Program-ME?

O Program-ME é o Arduino da Globalcode turbinado com mais recursos para torná-lo atrativo e útil já com componentes embutidos. O Program-ME tem alma da Arduino mas possui uma armadura brazuca para ser plug'n play para projetos básicos e fundamentais.

Veja o Genius original e o Genius-ME em ação através do Youtube:
Definitivamente este último dojo foi muito divertido!

[]s
Spock
http://blog.spock.com.br/
http://twitter.spock.com.br/
http://www.springbrasil.com.br/

Um comentário: