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/

terça-feira, 20 de abril de 2010

Interruptor web para o Tomad@


No último Hacking Class - Controle de Tomada via Web, na Globalcode, o Vinicius e o José Luiz apresentaram o Tomad@. Uma placa com relês que poderíamos utilizar como tomadas e controlá-la pelo Program-me.

Eles fizeram uma passagem teórica, apresentaram a placa e o Vinícius complementou que você poderia controlá-las pela Web se você tivesse um computador ligado à web.

Fizemos o lab, controlamos a placa enviando sinais pela porta serial. Fiquei muito contente. Minha primeira experiência com robótica foi um sucesso. Meu filho e sobrinho estavam juntos e eles se divertiram também. Mas ficou aquela vontade de dar um passo a mais.



Os meninos junto com o Zé Luiz após a aula

Como muitos não têm uma hospedagem web resolvemos ajudar, desenvolvemos um serviço web em PHP, na verdade um interruptor virtual.

Como funciona?
Você acessa o site http://www.novatrix.com.br/tomadaphp/, se cadastra e depois de confirmar seu cadastro por e-mail você irá ganhar um interruptor virtual.
Ele é gratuito. Você poderá utilizá-lo à vontade nos seus testes.

Na sua máquina você deverá baixar o cliente Java :
http://www.novatrix.com.br/tomadaphp/interruptor.zip
Depois edite o script interruptor.sh (ou .bat para windows) para enviar três informações:
email e senha utilizados para capturar o status do interruptor virtual e a porta onde está instalado o Program-me para o cliente enviar os comandos ao relê.

Você não precisará de IP fixo e o cliente irá consumir o Webservice a cada 1 segundo.

Os fontes do webservice, do programa C e do cliente Java estão no zip que você pode obter a partir da página: http://www.novatrix.com.br/tomadaphp/

Agora você poderá ligar/desligar a sua tomad@ de qualquer lugar.

segunda-feira, 19 de abril de 2010

Program-Me Diet Police

Está precisando perder peso mas não consegue? Chegou o Program-Me Diet Police.




Ele monitora e denuncia (via Twitter) os seus ataques à geladeira para seus amigos, familiares e até para o seu médico se o caso for mais grave! Dessa forma a turma toda te dá uma ajuda para controlar o peso. :)

Como funciona:

O circuito é bem simples, basta um Arduino, um shield ethernet ou Wi-Fi e um sensor reed desses utilizados em alarmes residenciais.



O sensor reed é um interruptor magnético formado por dois contatos metálicos montados dentro de uma cápsula de vidro preenchida com um gás inerte.









Quando submetido a um campo magnético os contatos se encostam estabelecendo um curto circuito entre os terminais do componente.





O campo magnético neste caso é gerado por um bloquinho que contém um imã permanente (lado direito da figura) que normalmente é fixado no batente da porta ou janela que queremos monitorar.






No nosso circuito vamos conectar o sensor reed entre a porta digital 3 (INT1) do Program-Me e o terra (GND) conforme diagrama abaixo:



Montamos então o sensor na porta da geladeira conforme imagem abaixo.



Toda vez que a porta for aberta, o bloco com o imã permanente se afastará do sensor reed que abrirá seu circuito e então será gerada uma interrupção (INT1) para o Arduino. No tratamento da interrupção programamos para que seja enviado um tweet para a conta que criamos para esta finalidade. Ai é só divulgar a conta no Twitter para os amigos.

A seguir temos o sketch (programa) completo para esta aplicação utilizando um shield Wi-Fi.



// Simples programa que envia um TWEET toda vez que recebe uma interrupção na porta 3 (INT1).

#include
#define WIRELESS_MODE_INFRA 1
#define WIRELESS_MODE_ADHOC 2

// Parametros de configuracao do shield WI_FI ----------------------------------------
unsigned char local_ip[] = {192,168,10,190}; // Endereco IP do Shield Wi-Fi
unsigned char gateway_ip[] = {192,168,10,1}; // Endereco IP do roteador ou gateway
unsigned char subnet_mask[] = {255,255,255,0}; // mascara de rede local
const prog_char ssid[] PROGMEM = {"GLOBALCODE"}; //identificador da rede
unsigned char security_type = 1; // 0 - open; 1 - WEP; 2 - WPA; 3 - WPA2

// WPA/WPA2 passphrase
const prog_char security_passphrase[] PROGMEM = {"**********"}; // maximo 64 caracteres

// chaves WEP 128-bit
prog_uchar wep_keys[] PROGMEM = { 0x58, 0xCA, 0x25, 0xAB, 0xE5, 0x88, 0xD0, 0x21, 0xE1, 0x9B, 0x39, 0xEA, 0xD9, // Key 0
0x58, 0xCA, 0x25, 0xAB, 0xE5, 0x88, 0xD0, 0x21, 0xE1, 0x9B, 0x39, 0xEA, 0xD9, // Key 1
0x58, 0xCA, 0x25, 0xAB, 0xE5, 0x88, 0xD0, 0x21, 0xE1, 0x9B, 0x39, 0xEA, 0xD9, // Key 2
0x58, 0xCA, 0x25, 0xAB, 0xE5, 0x88, 0xD0, 0x21, 0xE1, 0x9B, 0x39, 0xEA, 0xD9 // Key 3
};

// configuracao do modo wireless
// infrastructure - conexao com AP
// adhoc - conexao com outro dispositivo WiFi
unsigned char wireless_mode = WIRELESS_MODE_INFRA;
int quantidadeAberturas =0;
unsigned char ssid_len;
unsigned char security_passphrase_len;
// Fim dos parametros de configuracao Wireless ----------------------------------------


// string de autenticacao da conta no TWITTER
char* auth = "YXJkdWlubzpkaWV0cG9saWNl"; // Base64 encoded USERNAME:PASSWORD
#define REED 3

// Esta funcao gera a mensagem que sera enviada no tweet

void currentTime() {
WiServer.print("A geladeira foi aberta mais uma vez ");
// WiServer.printTime(millis());
}

// Requisicao que envia o tweet usando a funcao currentTime
TWEETrequest sentMyTweet(auth, currentTime);


void setup() {
// Inicializa o WiServer (passamos NULL para a funcao de servidor de pagina pois nesta aplicacao nao necessitamos servir paginas web)
WiServer.init(NULL);

// habilitamos a serial para debug e solicitamos ao Wiserver para gerar mensagens de log (opcional)
Serial.begin(57600);
WiServer.enableVerboseMode(true);

pinMode(REED,INPUT); //configuramos a porta 3 do Program-Me como entrada para o sensor reed
digitalWrite(REED,HIGH); // habilitamos os resistores de pull-up da porta 3.
attachInterrupt(1, interrupcao, RISING); // associamos a interrupcao INT1 (borda de subida) com a funcao "interrupcao"
}

void loop(){
// executa o WiServer
WiServer.server_task();
delay(10);
attachInterrupt(1, interrupcao, RISING );
}

void interrupcao() {
quantidadeAberturas=quantidadeAberturas + 1; //atualiza informacao de quantidade de aberturas da porta
detachInterrupt(1); //desabilita interrupcao durante envio do tweet
Serial.println("send TWEET"); //coloca mensagem na serial indicando que um tweet esta sendo enviado.
sentMyTweet.submit(); // envia o tweet
}



Um detalhe importante no sketch é que as informações de login da conta no Twitter devem ser colocados no formato “Base64 encoded”.

Ex: para o login “arduino” e senha “dietpolice” teríamos o seguinte:


//USERNAME:PASSWORD
//arduino:dietpolice convertido para Base64 ficaria : YXJkdWlubzpkaWV0cG9saWNl

Então a linha do sketch referente ao login no Twitter ficaria da seguinte forma:

// string de autenticacao da conta no TWITTER
char* auth = "YXJkdWlubzpkaWV0cG9saWNl"; // Base64 encoded


Para codificar as credenciais de login do Twitter para o formato Base64 existem várias páginas na web que facilitam essa tarefa.

Exemplo:
http://www.motobit.com/util/base64-decoder-encoder.asp

A tela abaixo mostra um log de debug da serial do Program-Me no momento em que um tweet é enviado :




Bem pessoal é isso, a ideia do monitoramento da geladeira é apenas uma forma de chamar a atenção, mas na verdade existem aplicações bem mais interessantes que podem ser implementadas utilizando o mesmo circuito, como por exemplo, monitoramento de acesso a certas dependências de uma empresa, alarmes residenciais e comerciais, e até mesmo monitoramento de um veículo (neste caso um shield GSM seria necessário). Também podemos substituir o sensor reed por um sensor de temperatura e gerar um tweet quando a temperatura de um ambiente alcançar um determinado valor.

[ ]s

José Luiz

quarta-feira, 7 de abril de 2010

Hacking Class, Loja Virtual Elétron Livre e muito mais

É incrível como as coisas estão super aceleradas em 2010. E o grupo de pesquisa de eletrônica, Arduino e Robótica da Globalcode está cada vez mais maduro.

Foram vários projetos de sucesso:
E finalmente muitos novos resultados estão surgindo em 2010, resultado do investimento do núcleo técnico nos últimos anos, mas principalmente em 2009:
Parabéns a todos os envolvidos!

Lançamento da placa Tomad@

Na terça-feira chuvosa da semana passada comemoramos a chegada do primeiro lote da nova placa de Relés batizada como Tomad@, criada pelo engenheiro Paulo Santos, que tem participado de todas as inciativas de Robótica da Globalcode.



O José Luiz Sanchez Lorenzo, no mesmo dia que recebeu as placas, enviou a seguinte mensagem:

Ficaram muito boas, pequenas, com fusível de proteção para as cargas e ótimos pontos para fixação.
Não resisti e já montei uma. (envio em anexo a foto dela montada)
  

Lançamento da Loja Virtual Elétron Livre 

No auge da animação em relação às placas e aos novos Kits recém criados pelo Vinicius Senger com componentes de eletrônica, ferramentas, etc, e já conhecendo a complexidade no processo de vendas, envio, cobrança, entregamos uma missão complexa para nossa hacker Ana Abrantes, que reutilizando alguns componentes do PagSeguro fez uma implementação record, e em poucas horas configurou o carrinho de compras.

Mas, vale pedir: Paciência, é beta.

Não conhece a loja virtual ainda ? http://loja.eletronlivre.com.br/

Hacking Class

O Hacking Class foi outra ideia, que virou projeto, e está no site em tempo record.
Uma derivação do Casual Class, com objetivo de ensinar a utilizar a placa de relés para controlar tomadas da sua casa via internet.

Tudo isto de forma simples, informal, prática e divertida!

Quer saber mais porque a Globalcode está entrando de cabeça no mundo da Robótica ?
http://www.eletronlivre.com.br/2010/01/porque-globalcode-esta-entrando-de.html


[]s
Yara
http://twitter.com/yarasenger
http://twitter.com/open4education
http://twitter.com/globalcode

terça-feira, 6 de abril de 2010

Ponte H de relés com Program-Me e placa Tomad@

A ponte H é um circuito que permite controlarmos tanto a velocidade como a direção de motores DC a partir de microcontroladores como o Arduino. O controle da velocidade é feito através de sinal PWM e a direção é controlada utilizando-se uma lógica aplicada a um conjunto de transistores que trocam o sinal aplicado em cada um dos dois pontos de conexão do motor.

Esse circuito apesar de simples possui muitas conexões que tornam a montagem de uma ponte H em protoboard com circuitos discretos um pouco complexa exigindo então uma placa de circuito impresso própria. Existem circuitos integrados como o L292 e o L298 que contemplam toda a lógica de controle e potência para uma ponte H, porém o que propomos neste post é a utilização de simples relés em conjunto com o Program-Me para implementar uma ponte-H simples e 100% funcional.

Temos vários casos de implementações de Ponte-H com relés, porém na maioria dos casos elas apenas controlam a direção do motor não permitindo o controle de velocidade, ou seja, o motor gira para ambos os lados porém sempre a uma velocidade constante.

Como no Program-Me já temos dois transistores associados a portas PWM, fica fácil montar uma ponte H que permita o controle de direção e velocidade utilizando apenas dois relés.

O circuito abaixo mostra o diagrama básico de uma ponte-H com relés que permite o controle de velocidade e direção de um motor DC.



Utilizando uma placa TOMAD@ conectada ao Program-Me, podemos controlar a velocidade de um motor DC utilizando um dos transistores PẀM do Program-Me (Q2 ou Q3) e para controlar a direção utilizamos uma porta digital qualquer.

Caso a placa tomad@ utilizada não tenha os transistores equipados, basta utilizar um dos transistores (Q4 ou Q5) para acionar diretamente os relés.















Placa Tomad@


Utilizando duas placas TOMAD@ é possível controlar dois motores DC formando assim o sistema de controle de movimento de um robô.
Abaixo temos o diagrama de conexões para montagem de uma ponte-H com o Program-Me e uma placa Tomad@ . Nesse circuito o transistor Q3 controla a velocidade e a porta digital 14 controla a direção do motor.



A foto seguinte mostra a montagem da ponte H com a placa Tomad@.




Bem é isso pessoal, acredito que a ponte H não será mais obstáculo para se aventurar na construção de um robô utilizando motores DC.

[ ]s

José Luiz