Manual
do
Maker
.
com
Vamos iniciar a série de projetos DIY com a construção de um fliperama, também conhecido como pinball. Mesmo quem nunca jogou, conhece essa máquina.
Ele é o precursor do video-game, funcionando no estilo "James West" com uma mistura mecânica e eletrônica. E é nessa parte que vamos tentar caprichar, uma vez que hoje temos recursos muito mais avançados e de fácil acesso. Mas prezaremos pelo baixo custo.
Surgido no século XVII, chamava-se bagatelle, um jogo rústico de madeira com pinos para desviar a bola. Na minha infância faziamos esse tipo de mesa para brincar. Aqui vamos repertir a brincadeira, trocando pinos e elásticos por 'componentes mais avançados'!
Em 1947 um engenheiro Mecânico chamado Harry Mabs da empresa Gottlieb desenvolveu estímulos elétrico ao contato com a bola para contabilizar pontos. Desse principio houve a evolução reativa dos componentes da mesa, inicialmente dada pela iluminação (limitação dada ao fato da ausência de inteligência eletrônica). A eletrônica digital foi implementada em torno de 1970, mas ainda com modestos recursos.
A intenção desse projeto é uma mesa com no máximo a metade do tamanho de uma mesa original, de forma que ela possa ser montada dentro de casa sem que sua mãe ou esposa jogue você pra fora.
A mesa possui uma inclinação específica. Da base, uma esfera de aço é disparada através de um dispositivo de alavanca com mola. Na disposição da mesa pode-se ter além da caçapa da base, uma caçapa lateral e até caçapas centrais com ou sem abertura temporizada. A soma dos pontos é feita através de contatos disparados através de componentes do jogo, por exemplo os bumpers - 'cogumelos' que repelem a bola ao contato.
Algumas mesas possuem como trilhos, outras possuem corredores com contatos para diferentes pontuações conforme o corredor.
Normalmente a mesa é temática, podendo ser de super herói, carros etc.
A mesa possui som, mas nessa mini-mesa que vamos fazer utilizaremos apenas alguns buzzers para criar alguns efeitos.
A iluminação é feita por LEDs e hoje temos LEDs RGB, sendo essa uma das coisas que podem dar um diferencial ao nosso projeto, em relação à iluminação, porém ainda nesse quisito haverá uma surpresa.
De frente com a mesa, tem-se o display onde exibem-se as pontuações dos recordes e do jogo atual. Poderiamos facilmente colocar um monitor de video, mas perderiamos no brilhantismo da união de tecnologia com visual antigo, portanto, os displays serão displays de 7 segmentos, de vários tipos. A mesa também será feita por nós, incluindo a pintura temática.
Vamos iniciar pelas provas de conceito, partindo do display frontal da mesa. Para contagem de pontos, utilizaremos displays de 7 segmentos, considerando que teremos pontuação com base em multiplicação, exemplificada em desenho mais adiante.
O tema será definido depois de concluir os testes da composição da mesa, como o display, os buzzers, os flippers e caçapas.
Pronto para iniciar? Então siga para a próxima linha.
Neste outro post vimos como exibir números em um display de 7 segmentos, porém agora aumentará um pouco a complexidade, uma vez que deveremos multiplexar para distribuir os dígitos no display apresentado. Além do mais, teremos também o display multiplicador que vai de 01 a 99, formado por um par de displays de 1 digito.
No datasheet desse modelo comprado na SparkFun está bem claro o quão simples é controlar esse display:
Se ainda assim tem dúvida, não se preocupe, pois na próxima imagem você poderá ver a conexão com um Arduino.
Olhando o display com os pontos na base, da esquerda para a direita da base temos o pino 1. No canto superior esquerdo, o pino 16.
O interessante é o quão explicito está a multiplexação, sendo o acendimento feito através dos pinos 1,2,6 e 8 para os digitos 1,2,3 e 4 respectivamente.
No post sobre acendimento de display de 7 segmentos, exemplifiquei com display de cathodo comum. Já para esse display, o anodo é comum, de forma que podemos reaproveitar o código dado no exemplo sobre display de 7 segmentos, porém devemos inverter a lógica no array dos números.
Considere também que agora o driver 74HC595 não atuará mais só; teremos que utilizar também 4 pinos da controladora para multiplexar. Claro, pode-se utilizar outro driver, mas nesse momento o melhor a fazer é sacrificar um pino da controladora.
Ao custo desse driver valeria a pena utilizar um driver extra só pelo prazer, mas na implementação do projeto realmente teremos que controlar mais alguns displays.Esse primeiro kit será montado com digitos individuais porque os patrocinadores não tem displays de 4 digitos em suas lojas, mas isso implica somente em um pouco mais de mão-de-obra e um pouco mais de diversão para montar a matriz. Como teremos também um multiplicador de 2 digitos, exemplificarei como fazer.
No vídeo, o teste do display, utilizando os pinos 3,5,9 e 10 (PWM) do Arduino Uno.
O código utilizado para o teste é esse:
int dig1 = 3;
int dig2 = 5;
int dig3 = 9;
int dig4 = 10;
int i;
void setup(){
pinMode(dig1,OUTPUT);
pinMode(dig2,OUTPUT);
pinMode(dig3,OUTPUT);
pinMode(dig4,OUTPUT);
}
void loop(){
for (i=0;i<128;i++){
analogWrite(dig1,i);
delay(500);
analogWrite(dig1,0);
analogWrite(dig2,i);
delay(500);
analogWrite(dig2,0);
analogWrite(dig3,i);
delay(500);
analogWrite(dig3,0);
analogWrite(dig4,i);
delay(500);
analogWrite(dig4,0);
}
}
Liguei todos os pinos referente aos segmentos em um barramento terra único. Essa ligação dos pinos ao terra fiz colocando um resistor de 330ohms em cada um deles. Depois, basta alimentar os pinos referentes a cada digito.
Comprovado o funcionamento do display, vamos agora adaptar o código desse post. Vale lembrar que o código não está otimizado, uma vez que não será utilizado dessa forma no projeto:
int um[] = {1,0,0,1,1,1,1,1};
int dois[] = {0,0,1,0,0,1,0,1};
int tres[] = {0,0,0,0,1,1,0,1};
int quatro[] = {1,0,0,1,1,0,0,1};
int cinco[] = {0,1,0,0,1,0,0,1};
int seis[] = {0,1,0,0,0,0,0,1};
int sete[] = {0,0,0,1,1,1,1,1};
int oito[] = {0,0,0,0,0,0,0,1};
int nove[] = {0,0,0,0,1,0,0,1};
int zero[] = {0,0,0,0,0,0,1,1};
int d1 = 3; //1
int d2 = 5; //2
int d3 = 6; //6
int d4 = 11; //8
int digits[] = {3,5,6,11};
int count = 0;
int duplo = 0;
int unidade,dezena,centena,milhar = 0;
//array dos numeros
int *number[] = {zero,um,dois,tres,quatro,cinco,seis,sete,oito,nove};
//Define os pinos de saida
int SER = 8;
int RCLK = 9;
int SRCLK = 10;
void contador(){
unidade+=1;
if (unidade > 9){
unidade = 0;
dezena += 1;
if (dezena > 9){
dezena = 0;
centena+=1;
if (centena > 9){
centena = 0;
milhar +=1;
if (milhar > 9){
milhar = 0;
}
}
}
}
}
void changeValues(int *val[],int digito, int num){
duplo += 2;
if (duplo >=200){
count = count >9 ? 0 : count+=1;
duplo = 0;
contador();
}
for(int i=7; i > -1; i--){
//SRCLK deslocamento
digitalWrite(SRCLK, LOW); //LOW
//HIGH logo apos deslocar, setar o clock
digitalWrite(RCLK, HIGH); //HIGH
int PIN = val[num][i];
//pino a deslocar
digitalWrite(SER, PIN);
//HIGH para ativar
digitalWrite(SRCLK, HIGH); //HIGH
}
digitalWrite(RCLK, LOW);
delay(0.9);
analogWrite(digito, 100);
delay(2);
analogWrite(digito, 0);
}
void setup(){
//configurando pinos como saida
pinMode(SER,OUTPUT);
pinMode(RCLK,OUTPUT);
pinMode(SRCLK,OUTPUT);
pinMode(d1,OUTPUT);
pinMode(d2,OUTPUT);
pinMode(d3,OUTPUT);
pinMode(d4,OUTPUT);
}
void loop(){
changeValues(number,d1,centena);
changeValues(number,d2,dezena);
changeValues(number,d3,unidade);
changeValues(number,d4,milhar);
}
As conexões podem ser vistas abaixo:
O video mostrando até a casa da centena.
A história do pinball é bem legal, se estiver com tempo para uma leitura, aproveite.
A parte 2 do artigo está aqui.
Se gostou, não deixe de compartilhar; dê seu like no video e inscreva-se no nosso canal Manual do Maker Brasil no YouTube.
Próximo post a caminho!
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.