Sistema de Controlo de Acessos por GSM do eLab Hackerspace

door handle mechanism 4.JPG

Boas! 🙂

Como alguns de vocês já sabem, sou um dos fundadores do eLab Hackerspace, em Faro, Portugal. Caso não tenham lido, fiz anteriormente um post sobre o nascimento do eLab Hackerspace, que se localiza dentro do Instituto Superior de Engenharia da Universidade do Algarve e cujos membros são maioritariamente estudantes de engenharia electrónica e informática, desde a Licenciatura ao Doutoramento. Contudo, tal como habitual nos hackerspaces, qualquer pessoa é bem vinda no espaço 🙂 Uma vez que se localiza dentro do campus, temos alguns benefícios tal como não pagar aluguer do espaço, Internet, electricidade ou água. De maneira a permitir a todos os membros a entrada no hackerspace a qualquer hora e a manter um registo de quem entrou e quando foi feita a entrada, decidimos conceber um sistema de controlo de acessos. O registo de entradas pode ser útil no caso de alguma coisa aparecer estragada, de haver algum roubo, ou simplesmente para dar algum prémio aos membros que passem mais tempo no hackerspace 😛 Vejam o vídeo abaixo para verem o sistema de controlo de acessos em acção! :


A reutilização de equipamentos electrónicos em fim de vida é uma constante nos projectos desenvolvidos no eLab Hackerspace, de maneira a poupar dinheiro e a ajudar na protecção do ambiente ao estender o tempo de vida de alguns equipamentos, ou peças dos mesmos. Além disso, o dinheiro que temos disponível não era muito na altura em que começámos a desenvolvê-lo. Na verdade, a situação financeira não se alterou uma vez que temos mantido a quota mensal baixa (2€ por mês) para tentar atrair mais membros. Tendo tudo isto em conta, demos uma vista de olhos nos nossos caixotes de “lixo” para ver o que tínhamos que pudesse ser usado para fazer um sistema de controlo de acessos para o hackerspace. Poderíamos simplesmente deixar um computador a correr um servidor web que pudesse ser acedido via Wi-Fi utilizando o telemóvel, mas nem toda a gente tem um smartphone. Também poderíamos fazer o mesmo tipo de sistema utilizando Bluetooth, mas mais uma vez, nem toda a gente tem um telemóvel com Bluetooth. Além disso, seria simples demais! Onde está a diversão de fazer as coisas de forma tão simples? Não é muito mais divertido fazer um projecto de engenharia completamente exagerado desnecessariamente? 😛 Um autêntico desafio à McGyver não é mais interessante? 😛 Deste modo, depois de vasculharmos os nossos caixotes de “lixo”, tínhamos algo com que podíamos trabalhar: um telemóvel Siemens C55 funcional, um computador velho, uma fonte de alimentação ATX e um motor DC  com caixa redutora retirado de uma máquina de venda de tabaco antiga.

access control system 1.JPG

Tendo em conta as peças que tínhamos, decidimos fazer um sistema de controlo de acessos por GSM! A ideia consistia em fazer um sistema que permitisse a qualquer pessoa abrir a porta do hackerspace, bastando para isso dar um toque para um número de telemóvel! Pareceu-nos uma ideia “fixe”! 😛 Qualquer pessoa poderia até ser capaz de abrir a porta com um velho mítico Nokia 3310! 😛 Poderíamos ainda ligar um computador ao sistema para manter um registo das entradas, enviando-o também para uma página Web de maneira a que pudéssemos ver que membros estavam no hackerspace em tempo real! 🙂 Com a ideia do projecto definida, estava na altura de começar a trabalhar nela. Uma vez que os outros membros do eLab Hackerspace estavam ocupados com outros projectos, eu  e o Gonçalo Pereira ficámos encarregados de desenvolver o sistema de controlo de acessos. Irei agora descrever todas as partes do processo, passo a passo.

1 – Mecanismo de abertura da porta

door handle mechanism 2.JPG

A porta do hackerspace é feita de alumínio e tem uma alavanca de saída de emergência. Como não tínhamos autorização para furar ou modificar a porta de qualquer maneira, tivemos de arranjar uma maneira de usar a alavanca para abrir a porta. O Gonçalo arranjou uma maneira de usar o motor DC com caixa redutora para puxar a alavanca para abrir a porta e também arranjou uma maneira de prender o motor à porta sem ter de furar a porta e sem ter de usar cola. Depois de prender o motor a uma chapa de metal, usou a moldura de silicone da porta de alumínio para mantê-la fixa no local desejado. Tornou-se, assim, surpreendentemente fácil de fixar o motor. Para puxar a alavanca ele colocou um pino numa engrenagem que estava agarrada ao eixo do motor e depois usou um pequeno bocado de correia tirado de uma impressora velha para prender esse pino à alavanca. É basicamente o mesmo tipo de mecanismo usado nos pistões dos carros.

p.gif

Ele também adicionou um interruptor que seria activado pela engrenagem quando a alavanca estava na posição de “porta aberta”.  Depois da mecânica do sistema estar pronta, desenhou uma placa simples com um microcontrolador PIC16F88 (mais detalhes acerca da placa na secção 4) baseada numa outra placa de desenvolvimento com o PIC16F88 que eu tinha desenhado para usarmos no hackerspace. Depois de desenhar a placa, programou o PIC16F88 para fazer o funcionamento básico da abertura da porta: quando um botão fosse pressionado, o motor iria ser ligado até que o interruptor de abertura da porta fosse activado, esperando de seguida três segundos e depois ligando o motor novamente até que o mesmo interruptor deixasse de estar activado, o que significava que a alavanca estava novamente na posição de “porta fechada”. Contudo, deparámo-nos com o primeiro problema: o motor provocava tanto ruído que gerava picos de tensão no pino que deveria fazer a leitura do interruptor de abertura da porta. Tentámos colocar condensadores nos pinos do motor para filtrar o ruído, tentámos também usar uma fonte de alimentação mais estável mas não estávamos a conseguir filtrar os picos por hardware. Depois de algum tempo a tentar corrigir o problema, lembrei-me de uma solução simples para resolver o problema que se revelou bastante eficiente: implementar um mecanismo por software que ignorasse picos de voltagem isolados. Implementei um simples contador e defini um valor limite de contagem: o PIC16F88 iria incrementar o contador sempre que o pino fizesse a leitura de um nível lógico “1” mas iria apenas considerar que o interruptor estaria activado quando o valor limite fosse atingido. O contador iria incrementar o seu valor com os picos de tensão, mas quando o interruptor fosse verdadeiramente activado, o valor de contagem iria incrementar muito depressa, atingindo o valor limite. Tendo o sistema de abertura e fecho da porta pronto, estava na altura de começar a trabalhar na parte GSM do sistema.

2 – Siemens C55 como modem GSM

Caso não saibam, alguns telemóveis velhos, tais como os Siemens, Nokias e Samsungs, são bastante interessantes para projectos de electrónica. Alguns deles podem até ser usados como modems GSM, tendo uma ligação série muito simples e um protocolo de comunicação baseado em comandos AT. A quantidade de comandos AT suportados depende do modelo do telemóvel e do fabricante. O telemóvel Siemens C55 parece ser dos melhores telemóveis para uso em projectos de electrónica uma vez que suporta uma lista de comandos AT bastante completa.

access control system siemens c55 2.JPG

A primeira coisa que precisámos foi de um cartão SIM. Felizmente tínhamos um cartão SIM da Vodafone que foi dado a um dos membros do eLab numa promoção qualquer. O cartão tinha ainda um plano pré-pago sem carregamentos obrigatórios. A única obrigação para manter o número activo é fazer uma chamada de 6 em 6 meses. O cartão ainda veio com um bónus de 5€, que devem durar para bastante tempo a fazer uma chamada de 1 segundo duas vezes por ano 🙂 A segunda coisa que precisámos foi um cabo série para o Siemens C55, que não tínhamos 🙁 Tentei encontrar um cabo barato no ebay, mas não tive sorte. Contudo, tinha dois carregadores da Siemens com o conector certo mas tinham apenas os pinos de VCC e GND. Não tive outra opção a não ser alterar um dos conectores para adicionar os pinos de Tx e Rx e funcionou na perfeição! 🙂 Assim que o conector ficou pronto procurei online pela baud rate predefinida do Siemens C55 e encontrei alguns sites a dizer 9600bps e outros a dizer 38400bps. Depois de procurar pelas baud rates liguei os pinos Tx e Rx às linhas Rx e Tx de um cabo LVTTL Série para USB e usei o putty para estabelecer uma ligação com o telemóvel. Decidi tentar primeiro com a baud rate de 9600bps. Assim que a ligação estava estabelecida, escrevi “AT” e vi as letras a aparecer no terminal, o que era um sinal de que o modem GSM do telemóvel estava a fazer o eco dos caracteres que estava a enviar e também um sinal de que a baud rate de 9600bps era a correcta. 🙂 Depois de carregar no <Enter>, o telemóvel respondeu com “OK”, o que mais uma vez era um sinal de que o modem GSM do telemóvel estava a responder aos comandos AT. Depois usei o comando “AT+CPIN=xxxx”, em que <xxxx> é o PIN do cartão SIM, seguido de <Enter> e mais uma vez o telemóvel respondeu com “OK”. 🙂

Quando alguém faz um telefonema para o número de telemóvel do cartão inserido no modem GSM do telemóvel, este geralmente responde apenas com “RING” sempre que se ouve o tom de chamamento. De maneira a activar a função de identificação do número chamador, tive de enviar o comando “AT+CLIP=1”. Depois de enviar este comando e fazer nova chamada para o número do cartão inserido no Siemens C55, este respondeu com:

RING

+CLIP: "911234567",161,,,,0

Agora tinha a confirmação de que o telemóvel poderia fornecer toda a informação necessária para continuar o desenvolvimento do sistema de controlo de acessos. 🙂

Já agora, se tentarem enviar comandos AT para um telemóvel pode acontecer que este não responda aos caracteres que lhe enviarem. Alguns telemóveis vêm com a função de eco desligada. Pode acontecer que escrevam “AT” seguido de <Enter> e o telemóvel apenas responda “OK”. Para activar a função de eco, podem enviar o comando “ATE1”. Para desactivá-la, podem enviar o comando “ATE0”. Se desejarem saber mais sobre os comandos AT para o Siemens C55, vejam este documento.

3 – Placa de comunicações série RS232, TTL e LVTTL

rs232 lvttl ttl communications board.JPG

O próximo passo foi estabelecer uma ligação série entre a placa do PIC16F88, o telemóvel Siemens C55 e um computador velho através da ligação RS232. Uma vez mais deparei-me com alguns problemas: o PIC16F88 estava a ser alimentado com 5V e, portanto, a funcionar em níveis de tensão TTL, o telemóvel Siemens C55 funciona com níveis LVTTL e não é tolerante a TTL (o telemóvel auto-desligava-se quando os seus pinos eram expostos a níveis de tensão TTL), e ainda tinha de estabelecer a ligação com o computador utilizando níveis de tensão RS232. Além disso, ainda tinha de criar uma comunicação UART com um Master (a placa do PIC16F88) e dois Slaves (o Siemens C55 e o computador) que é algo que necessita de um pequeno truque para funcionar. O truque consiste em colocar um díodo nas linhas Tx de todos os dispositivos Slave, com o cátodo do lado do dispositivo. Porque é que o díodo é necessário? Bem, porque de acordo com as especificações das UARTs, quando um dispositivo está em estado inactivo (em espera), o seu pino Tx deve estar em nível lógico “1”. Quando ocorre uma comunicação de dados, é a responsabilidade do Slave colocar a sua linha Tx num nível lógico “0”, de maneira a absorver a corrente vinda da linha de Rx do Master. Utilizando os díodos, quando num estado inactivo, os Slaves podem manter os seus próprios Tx em nível lógico “1” independentemente do valor lógico do pino “Rx” do Master. Um dispositivo Slave pode, assim, transmitir puxando a sua linha Tx para o nível lógico “0” sem afectar as linhas Tx dos outros Slaves. Depois deste truque dos Master/Slaves estar resolvido, foi altura de tratar da conversão de níveis de tensão. Para converter os sinais de 5V TTL do pino Tx do PIC16F88 para um nível LVTTL, utilizei um divisor de tensão feito com duas resistências. Para converter os sinais 3.3V TTL do pino Tx dos Siemens C55 para 5V TTL, utilizei um ampop MCP6002 como comparador, colocando a tensão de saída a 5V sempre que o sinal de Tx do telemóvel passasse do valor limite de 2.5V, definido com um divisor de tensão feito com duas resistências. A conversão entre níveis TTL e RS232 foi bastante mais simples e bastou utilizar um único circuito integrado MAX232.  Abaixo podem ver a PCB e o esquema electrónico onde podem identificar todas as partes do circuito que descrevi.

comm_board_brd.3.png

comm_board_sch.3.png

A placa foi desenhada no Kicad. Podem fazer o download dos ficheiros da PCB clicando aqui.

4 – Placa com PIC16F88

pic16f88 control board 2.JPG

Como referido, esta placa foi desenhada pelo Gonçalo Pereira. Deve ser alimentada com 12V e tem um regulador linear de 5V para alimentar o microcontrolador PIC.  Também tem um MOSFET de canal N a funcionar como interruptor controlado pelo MCU para ligar e desligar o motor. Além disso, contém ainda todos os conectores necessários para alimentação, motor, interruptor do motor e comunicações UART. A placa foi desenhada no Eagle e podem fazer download dos ficheiros do Eagle aqui. O firmware para o PIC16F88 será descrito e pode ser descarregado na próxima secção. Abaixo podem ver o esquema e a PCB da placa.

pic16f88_control_board_brd.png

pic16f88_control_board_sch.png

5 – Programação do PIC16F88

Todo o código de programação foi escrito em C utilizando o Piklab e compilado com o SDCC (vejam aqui como configurar um ambiente de desenvolvimento  para microcontroladores PIC utilizando o Piklab e o SDCC). Deverão poder compilar o código com outros compiladores com algumas pequenas modificações. Podem também usar o ficheiro .hex incluído no caso de não quererem alterar nada. Quando estava a desenvolver o código, decidimos que os números de telefone dos membros ficariam guardados na EEPROM do PIC. Desta forma, se a ligação à Internet falhasse por alguma razão, a porta poderia ainda ser aberta por um membro autorizado, embora o registo da entrada não seja feito no histórico de entradas. O PIC16F88 tem 256 bytes de EEPROM. Tendo em conta que todos os números de telemóvel portugueses têm 9 digitos e que o primeiro é sempre um 9, é necessário guardar 8 digitos para cada número de telemóvel, podendo-se, assim, armazenar 32 números na EEPROM do microcontrolador PIC. Pode parecer que 32 é um número pequeno, mas o eLab Hackerspace também é um Hackerspace pequeno e ainda tem poucos membros. Se chegar o dia em que tenhamos mais de 32 membros, ficaremos contentes em substituir o PIC por outro ou até mesmo substituir todo o sistema de controlo de acessos por uma Raspberry Pi ou algo parecido 😛 Tendo o armazenamento de dados definido, passei à criação de um protocolo de comunicação semelhante aos comandos AT usados em telemóveis e modems GSM que permitisse adicionar, apagar e ver os números de telemóvel armazenados na EEPROM interna do PIC. Todos os comandos começam com “ELAB+”. Aqui está a lista de comandos que foram implementados:

  • ELAB+P=<PALAVRA-PASSE> – Inserir a palavra-passe de administrador para aceder ao modo de administração. O campo <PALAVRA-PASSE> deve ser substituído pela password real, incluída no firmware do PIC. No caso de a password ser aceite, o PIC responde com uma mensagem “AUTH OK”. Caso contrário, responde com “NO AUTH”.
  • ELAB+A#XX=<NÚMERO> – Adicionar um número à posição XX (de 01 a 32) onde o campo <NÚMERO> deve ser substituído com o número de telemóvel com 9 dígitos a adicionar. Este comando só funciona quando o modo de administração está activo. Caso contrário receberá a mensagem “NO AUTH”. Se o comando for aceite, deverá aparecer a resposta “OK”. Caso o comando não seja correctamente inserido o PIC irá responder com a mensagem”ERROR”;
  • ELAB+D#XX – Apagar o número localizado na posição XX (de 01 a 32). Este comando só funciona quando o modo de administração está activo. Caso contrário receberá a mensagem “NO AUTH”. Se o comando for aceite, deverá aparecer a resposta “OK”. Caso o comando não seja correctamente inserido o PIC irá responder com a mensagem”ERROR”;
  • ELAB+V – Visualizar a lista completa de números armazenados na EEPROM interna. Este comando só funciona quando o modo de administração está activo. Caso contrário receberá a mensagem “NO AUTH”. Se o comando for aceite, deverá aparecer a resposta “OK”. Caso o comando não seja correctamente inserido o PIC irá responder com a mensagem”ERROR”;

A password predefinida pode ser visualizada no ficheiro password.txt contido no ficheiro “PIC16F88 Control Board Firmware.zip”. Podem alterá-la no código fonte e recompilá-lo se desejarem modificá-la.

Para usar o interface por comandos AT, o administrador do sistema só tem de abrir a ligação série com o microcontrolador PIC (baud rate de 9600bps) e enviar os comandos AT descritos acima para adicionar, remover ou visualizar os números de telefone presentes na EEPROM interna do PIC. Quando todas as operações forem feitas, deve carregar-se no botão de Reset da placa para reactivar a protecção por password. Muitas melhorias poderiam ser feitas no código, tais como adicionar um comando para reactivar a protecção por password ou adicionar um comando para abrir a porta, entre muitas outras possibilidades.

Sempre que o PIC recebe uma mensagem CLIP do telemóvel, ele verifica se o número recebido existe na EEPROM interna. Caso exista, envia uma mensagem “A:<NÚMERO_DE_9_DÍGITOS>” para o computador. Caso o número não exista, ele envia uma mensagem  “R:<NÚMERO_DE _9_DÍGITOS>” para o computador.

No que diz respeito ao mecanismo de abertura da porta, sempre que uma mensagem é recebida com um número de telefone válido, o motor é activado até que o interruptor localizado junto ao motor seja activado T vezes (para ignorar os picos de tensão gerados pelo motor). Depois o PIC espera 3 segundos e activa novamente o motor até que o interruptor seja libertado.

Podem fazer o download do firmware clicando aqui.

6 – Aplicação em Python para enviar dados para as Google Spreadsheets

Como referido, para criar um histórico de entradas e criar um registo diário e público das entradas, usámos um computador velho para enviar os dados para uma folha de cálculo localizada na Google Drive. É claro que preferíamos usar uma Raspberry Pi para este propósito,  mas não conseguimos encontrar nem uma Raspberry Pi nos nossos caixotes de “lixo” nem 40€ para comprar uma 😛 Além disso, para provar o funcionamento do conceito, um computador velho serve perfeitamente. O computador está a correr uma versão leve de Linux: Lubuntu 12.04. Todo o código para enviar os dados para a folha de cálculo foi desenvolvido em Python e faço já o aviso de que, neste momento, o código não está bonito e não está comentado, uma vez que foi escrito à pressa apenas para ter o sistema a funcionar. De maneira a poder enviar e receber dados das folhas de cálculo existentes na Google Drive, primeiro tivemos de instalar a Google Data API. Para instalá-la, cliquem aqui, façam download da última versão, extraiam os ficheiros para uma pasta e depois corram o script setup.py localizado no interior da pasta inserindo o seguinte comando no terminal:

./setup.py install

Antes de começar a programar, tivemos de preparar duas folhas de cálculo: uma para guardar a lista de membros do eLab, com colunas para os nomes, números de telefone e outras informações de contacto; e outra para o Histórico de entradas do eLab, contendo colunas para a data, horas, números de telefone, nome do membro, e se a entrada foi aceite ou rejeitada. A segunda folha de cálculo contém também duas outras páginas, sendo uma delas apenas usada para efectuar operações sobre os dados para visualização e a outra para mostrar apenas as entradas diárias, sendo as entradas do dia corrente extraídas da primeira folha de cálculo. Aqui podem fazer o download de duas folhas de cálculo de amostra:

Para utilizar as comunicações por porta série, também tivemos de instalar o pyserial utilizando o seguinte comando:

sudo apt-get install python-serial

Assim que o sistema ficou a funcionar, achei que seria engraçado se cada membro pudesse ter a sua própria música de entrada 🙂 Para tal, instalei a biblioteca pygame utilizando o comando

sudo apt-get install python-pygame

, adicionei uma coluna para o nome do ficheiro de música à folha de cálculo que contém a lista de membros do eLab Hackerspace e adicionei mais algumas linhas de código à aplicação em Python para tocar as músicas. É claro que no início tive de fazer umas brincadeiras e meter umas músicas menos apropriadas para as entradas de alguns membros do eLab Hackerspace 😛 Como exemplo, agora sempre que entro no eLab Hackerspace, toca a música épica dos Piratas das Caraíbas, mas tenho de mudá-la em breve uma vez que eu (e todos os outros membros) já se fartaram dela 😛

Irei agora descrever  o que é que o código em Python faz, de uma forma geral. Sempre que a aplicação em Python recebe uma  mensagem “A:<NÚMERO_DE_9_DIGITOS>”, vai buscar os dados contidos na folha de cálculo que contém a lista de membros do eLab Hackerspace e verifica que utilizador tem o número de telemóvel referido. Depois de fazer essa verificação, toca a respectiva música de entrada e envia a informação da entrada para a folha de cálculo que contém o histórico de entradas. Abaixo podem ver o código fonte da aplicação em Python. Se desejarem usá-lo não se esqueçam de alterar o email, password e a string “key=”.

import time
import gdata.spreadsheet.service
import pygame
import serial

pygame.init()
pygame.mixer.init()

#YOUR GOOGLE ACCOUNT EMAIL
email = 'user@gmail.com'
#YOUR GOOGLE ACCOUNT PASSWORD
password = 'password'

#TEST DATA
auth = 'granted'
number = '913564168'
#END OF TEST DATA

#SERIAL PORT SETUP
ser = serial.Serial("/dev/ttyS0",9600)
#END OF SERIAL PORT SETUP

var = 'X'
action = 'X'
phonenumber = 'X'

#START OF LOG ACCESS

# FIND THIS VALUE IN THE URL WITH 'key=XXX' AND COPY THE XXX BELOW
spreadsheet_key = 'XXX'
# ALL SPREADSHEETS HAVE WORKSHEETS. I THINK WORKSHEET #1 BY DEFAULT ALWAYS
# HAS A VALUE OF '0d6'
worksheet_id = 'od6'

spr_client = gdata.spreadsheet.service.SpreadsheetsService()
spr_client.email = email
spr_client.password = password
spr_client.source = 'Example Spreadsheet Writing Application'
spr_client.ProgrammaticLogin()
#END OF LOG LINE

# NECESSARY DATA TO PLAY MEMBER SOUND

#Query Members list
gd_client = gdata.spreadsheet.service.SpreadsheetsService()
gd_client.email = email
gd_client.password = password
gd_client.source = spr_client.source
gd_client.ProgrammaticLogin()

while(1):
	var = ser.read()
	pnumber = 0
	if var == "A" or var == "R":
		if var == "A":
			auth = "granted"
		else:
			auth = "rejected"
		var = ser.read()
		if var == ":":
			pnumber = ser.read(9)
			number = str(pnumber)
			print auth
			print number
			q = gdata.spreadsheet.service.DocumentQuery()
			#Below relace with the name of the member list spreadsheet
			q['title'] = 'eLab Members'
			q['title-exact'] = 'true'
			feed = gd_client.GetSpreadsheetsFeed(query=q)
			spreadsheet_id = feed.entry[0].id.text.rsplit('/',1)[1]
			feed = gd_client.GetWorksheetsFeed(spreadsheet_id)
			worksheet_id = feed.entry[0].id.text.rsplit('/',1)[1]

			rows = gd_client.GetListFeed(spreadsheet_id, worksheet_id).entry

			telefone = ''
			som = ''
			nome = "Desconhecido"
			done = False
			for row in rows:
				if done == True:
					done = False
					break
			#	print " %s %s" % (row.custom['telefone'], row.custom['nome'].text)
				for key in row.custom:
					if key == 'nome':
						nome = row.custom[key].text
						print nome
					if key == 'som':
						som = row.custom[key].text
						print som
					if key == 'telefone':
						telefone = row.custom[key].text
						print telefone
				if telefone == number or nome == "Desconhecido":
					# Prepare the dictionary to write
					dict = {}
					dict['date'] = time.strftime('%d/%m/%Y')
					dict['time'] = time.strftime('%H:%M:%S')
					dict['number'] = number
					dict['auth'] = auth
					dict['nome'] = nome
					print dict

					entry = spr_client.InsertRow(dict, spreadsheet_key, worksheet_id)
					if isinstance(entry, gdata.spreadsheet.SpreadsheetsList):
						print "Insert row succeeded."
					else:
						print "Insert row failed."
					if not isinstance(som, basestring):
						break
					pygame.mixer.music.load(som)
					pygame.mixer.music.set_volume(1)
					pygame.mixer.music.play()
					print "Playing song!"
					done = True
					while True:
						#for event in pygame.event:
							while pygame.mixer.music.get_busy(): 
								pygame.time.Clock().tick(10)
							break	
					print "End of song!"
			print
			
#END OF MEMBER SOUND

Para publicar o histórico de entradas diário numa página web, basta abrirem a folha de cálculo na Google Drive, clicar em Ficheiro -> Publicar na Web e depois escolham qual das folhas pretendem publicar e cliquem no botão para começar a publicar. Depois, na parte inferior da janela de popup, escolham HTML para embeber numa página web e copiem o código HTML e colem-no na vossa página web.

Aqui ficam mais algumas imagens do sistema:

p.gifDSCF6068.JPGaccess control system 1.JPGaccess control system 2.JPGaccess control system computer.JPGaccess control system hard drive.JPGaccess control system mounting board 2.JPGaccess control system mounting board.JPGaccess control system siemens c55 2.JPGaccess control system siemens c55.JPGatx power supply painted black.JPGblack spray paint atx power supply.JPGdoor handle mechanism 1.JPGdoor handle mechanism 2.JPGdoor handle mechanism 3.JPGdoor handle mechanism 4.JPGdoor handle mechanism leds 2.JPGdoor handle mechanism leds.JPGpic16f88 control board 1.JPGpic16f88 control board 2.JPGcomm_board_brd.3.pngcomm_board_sch.3.pngpic16f88_control_board_brd.pngpic16f88_control_board_sch.pngrs232 lvttl ttl communications board.JPGelab hackerspace gsm access control system atx power supply.JPGelab hackerspace gsm access control system left side view 2.JPGelab hackerspace gsm access control system left side view.JPGelab hackerspace gsm access control system right side view 2.JPGelab hackerspace gsm access control system right side view.JPGelab hackerspace gsm access control system.JPG

E penso que é tudo o que precisam de saber para fazer um sistema de controlo de acessos semelhante para o vosso hackerspace/garagem/casa/quarto/etc. 🙂 No caso de eu me ter esquecido de mencionar alguma coisa que seja importante, digam qualquer coisa na secção dos comentários abaixo! 🙂

Espero que tenham gostado deste projecto. Ainda tem muito espaço para melhorias tanto a nível de software como de hardware.

Este projecto está também disponível no site instructables.com: eLab Hackerspace GSM Access Control System

Até à próxima! 🙂

Actualização (05/12/13): Este projecto está em destaque no Instructables! 🙂 Vejam aqui.

Actualização (12/12/13): Este projecto está em destaque no Hack a Day! 🙂 Vejam aqui.


Achou esta publicação útil? Deseja contribuir para outros projectos envolvendo ciências computacionais, electrónica, robótica ou mecatrónica que serão publicados neste blog? Se sim, pode fazer uma doação utilizando o botão do Paypal abaixo. Obrigado! 🙂

Donate