Comunicação Serial - Arduino e Game Maker Versão de 15maio2012, por Fabrício Silva Esse tutorial tem como objetivo a implementação e teste da comunicação serial entre o Game Maker e a placa Arduino. Para a elaboração deste tutorial foi usada a placa Arduino Diecimila e o Game Maker versão 8.1.135 Standard. Esse tutorial não funciona na versão Lite. COMPONENTES NECESSÁRIOS ■ RS232.dll - Fundamental para o funcionamento da comunicação serial. Esse arquivo deve estar no mesmo diretório dos arquivos do Game Maker; ■ Arduino Software - Programa para escrever código e gravar na placa. Ele pode ser adquirido em http://arduino.cc. A versão utilizada aqui é a 1.0; ■ Software Game Maker e os arquivos de teste (Teste_ArduinoGM.gm81 e Teste_ArduinoGM.gb1); ■ GMBlink.ino - Programa que será gravado na Arduino. PROCEDIMENTOS 1. Instalando, configurando e programando a Arduino a. Conecte a Arduino no computador via USB. Verifique se o led PWR está ligado, ele indica que a placa está alimentada. Caso contrário há algum problema com a sua placa ou o cabo. b. No Gerenciador de Dispositivos, em Portas, verificar em qual porta USB está conectado a placa. Nesse caso a placa está na porta COM20. Foi fácil de identificar por ser o único componente ligado numa porta USB. Talvez seja um pouco mais trabalhoso identificar qual é a porta da placa enquanto outros dispositivos estão ligado à USB Serial Port. c. Para esse projeto, a dll exige que a Arduino esteja na porta 1, 2, 3 ou 4. Por isso acesse o menu propriedades clicando com o botão esquerdo do mouse na porta da placa. Em Definições de porta, acesse as opções avançadas e escolha outra porta entre COM1 e COM4. A figura abaixo mostra que posso escolher entre a porta COM1 e COM2, visto que as outras estão sendo utilizadas. Caso nenhuma das quatro estiverem disponíveis, será necessário descobrir qual dispositivo está em uma das quatro e modificar a sua porta. d. Agora abra o projeto arquivo do programa que será gravado no Arduino, dentro da pasta GMBlink. No menu Tools, verifique em Board se a versão da placa selecionada é a que você está utilizando. Verifique também em Serial Port se a porta utilizada está selecionada. Na parte inferior da janela é possível conferir a placa e porta selecionada. e. Em File, clique em Upload (Ctrl + U). Na parte inferior da janela deve ser verificado a mensagem “Done uploading” que indica que o programa já foi transferido para a placa. Agora a Arduino já está configurada corretamente e programada. 2. Usando o programa teste do Game Maker a. Abra o arquivo Teste_ArduinoGM.gm81. b. No objeto obj_control, abra o código do evento Create e edite a variável “com” para o número da porta que está usando. Na figura abaixo a variável recebeu o valor 2, que é o número da porta que está sendo usado nesse tutorial. c. Confirme a alteração clicando na seta verde, primeiro item do menu superior da janela do código. d. Na no menu Run, clique em Run normally, ou aperte F5 (atalho). FUNCIONAMENTO DOS PROGRAMAS A comunicação entre o Arduino e o Game Maker ocorre devido a algumas funções específicas, dependendo do sentido da comunicação. Na Arduino, as funções Serial.read() e Serial.print() recebe (lê) e envia (imprime) dados. No GM, as funções para envio e leitura de dados são, respectivamente, RS232_WriteByte e RS232_ReadByte. Os parâmetros dessas últimas não são muito conhecidos, visto que a biblioteca de scripts da comunicação foi retirado de um fórum do Game Maker, e o autor não explicou essas funções. Link do tópico: http://gmc.yoyogames.com/index.php?showtopic=530696. Através da interface do “jogo” no GM, é possível entendermos o funcionamento do teste. O Game Maker envia dados sobre o estado do led e a velocidade que ele deve piscar para a Arduino, que interpreta e executa o comando com o led da própria placa. Dessa forma estamos testando a comunicação GM para Arduino. Em resposta, o Arduino envia uma informação para o GM falando em qual estado está. Por exemplo, quando o programa do GM inicia, ele inicializa o estado em 1 (desligado), e a velocidade 1. Ao apertar espaço, o estado passa para 2 e é enviado para a Arduino que liga o led e envia para o GM que agora ela está no estado 2. O GM então atualiza o estado que o led está, e dá próxima vez que a tecla espaço for pressionada, ele vai saber que estava no estado 2 e deve passar para o 3. E na próxima, do estado 3 para o estado 1, e assim segue. Esses dados são enviados num pacote inteiro de dois algarismos, onde o primeiro representa a velocidade e o segundo o estado. Para concatenar os dados para envio usa-se a formula concat = estado+10*(6-velocidade). Assim, 11 representa desligado e velocidade 5, 53 piscando com velocidade 1, e assim por diante. Essa inversão na velocidade foi feita porque no programa da Arduino, a velocidade é tratada como atraso (delay, em milisegundos) entre led ligado e desligado, logo quanto maior a velocidade, menor deve ser esse delay. Depois a velocidade é convertida para milisegundos no programa da placa, pela fórmula vel=5*(auxmode), onde aux-mode é o primeiro dígito do pacote multiplicado por 10. Exemplificando com um pacote: Supondo que queremos o led piscando com velocidade 4, logo enviamos o pacote 23. No programa da Arduino, a variável aux recebe o número 23. A variável mode, que representa o estado do led, recebe 3, o digito mais a direita (mode=aux%10). A variável vel, que representa o delay, recebe 20, o digito da velocidade multiplicado por 10 (aux-mode = 23-3). Depois ele é multiplicado por 5, ficando vel = 200, (vel = 5*(aux-mode)). Ou seja, o led vai acender, ficar 200 ms ligado, desligar por mais 200 ms, e retornar o ciclo. A tabela abaixo mostra a relação entre a velocidade, pacote e o delay, tomando o estado 3 como fixo. Velocidade Pacote Delay (ms) 1 2 53 43 250 200 3 4 33 23 150 100 5 13 50 INTERFACE DO PROGRAMA TESTE OBSERVAÇÕES 1. Se trocar muito rápido de estados, apertando espaço, é possível que o programa não interprete devido aos delays.