Tutorial de Computação Programação em Python para MEC1100 v2010.11 Linha de Equipamentos MEC Desenvolvidos por: Maxwell Bohr Instrumentação Eletrônica Ltda. Rua Porto Alegre, 212 Londrina PR Brasil http://www.maxwellbohr.com.br
1 Introdução Este tutorial tem como objetivo dar base para criar aplicações com o ambiente de desenvolvimento Eclipse, em Python, voltadas para o MEC1100. Não será ensinada a linguagem Python neste tutorial, porém será ensinado com manipulá-la utilizando-se o Eclipse juntamente ao MEC1100. Eclipse é uma IDE desenvolvida em Java, com código aberto para a construção de programas de computador. Com o uso de plugins, pode ser usado não só para desenvolver em Java, mas também em C/C++,PHP,ColdFusion e até mesmo Python. Para mais informações sobre este aplicativo, consulte o site http://www.eclipse.org/. O Python é uma linguagem de altíssimo nível (VHLL - Very High Level Language), de sintaxe moderna, orientada a objetos, interpretada via bytecode, com tipagem forte (não há conversões automáticas) e dinâmica (não há declaração de variáveis e elas podem conter diferentes objetos), modular, multiplataforma, de fácil aprendizado e de implementação livre. Para mais informações sobre a linguagem Python pode-se visitar o site http://www.async.com.br/projects/python/pnp/contents.html, que disponibiliza um vasto material sobre esta linguagem de programação. 2 A biblioteca de controle para Python Nesta seção, será apresentada a biblioteca de controle para MEC1100. Serão descritas suas principais funções, além de como utilizá-las. Além disso, será dada uma breve explicação sobre o que é esta biblioteca e sobre os parâmetros de cada método. 2.1 O que é a biblioteca O MEC1100 responde a comandos enviados a partir de uma porta USB. Para isso, é necessário abrir uma comunicação entre o computador e o MEC1100 e enviar bytes em um protocolo específico. Fazer isso diretamente pode ser complicado e demorado e criaria uma dificuldade desnecessária. Por isso, foi criada uma biblioteca de controle que cuida de todos os detalhes de comunicação e codificação dos comandos para envio ao MEC1100, facilitando muito a tarefa de programação do equipamento. Com o uso da biblioteca não é necessário saber os detalhes de codificação dos comandos e parâmetros para envio ao MEC1100, pois tudo isso é tratado automaticamente. 2.2 Lista simplificada dos métodos Para facilitar a compreensão dos métodos que são utilizados para o desenvolvimento de projetos com o MEC1100, através na biblioteca de controle, foi criada uma lista que os exemplifica, por meio de uma breve explicação. Abaixo, a lista simplificada destes métodos com suas respectivas descrições: Método Descrição open_communication Inicializa a comunicação com um MEC1100 através de uma porta serial. close_communication Finaliza a comunicação com um MEC1100. get_installed_serial_ports Detecta todas as portas seriais instaladas no sistema operacional. 1
is_connected nop device_status Verifica se existe algum MEC1100 conectado e ligado na porta USB. Envia um comando 'NOP'. Não realiza nenhuma operação. Retorna informações sobre o estado interno do equipamento. device_info Retorna informações sobre o dispositivo conectado, como o nome, versão do hardware e versão do firmware. sensor_read Lê uma entrada analógica. sensor_read_all Lê todas as entradas analógicas em uma única operação. digital_port_read Lê o valor da porta de entrada digital. digital_port_write Grava um valor na porta de saída digital. digital_pin_read Efetua a leitura de uma entrada digital individual. digital_pin_write Efetua a gravação de uma saída digital individual. servo_motor_on Liga um servomotor servo_motor_off Desliga um servomotor. pwm_on pwm_on_time Ativa um PWM utilizando um valor para o período, outro valor para o ciclo ativo e o divisor de clock como parâmetros. Ativa um PWM utilizando o período e tempo de ciclo ativo em milissegundos como parâmetros. pwm_on_freq pwm_off Ativa um PWM utilizando uma frequência e uma taxa de porcentagem de ciclo ativo como parâmetros. Desativa um PWM. 3 Instalação e configuração do ambiente de Desenvolvimento Python Nesta seção será mostrado como instalar e configurar um ambiente de programação para desenvolvimento de programas em Python. Veremos como instalar o modulo python-serial, o qual usaremos para fazer a comunicação com o dispositivo MEC1100. Veremos também como instalar o Eclipse e usá-lo para programar usando a linguagem Python. 3.1 Ubuntu Abaixo será mostrado como configurar o ambiente de desenvolvimento em python no sistema operacional Ubuntu. 2
3.1.1 Módulos complementares para o Python No Ubuntu, o Python já vem instalado por padrão, bastando apenas instalar alguns módulos complementares como o python-serial que usaremos para fazer a comunicação serial como dispositivo MEC1100. Para isso, utilize o Gerenciador de Pacotes Synaptic. Para fazer uso deste aplicativo, abrimos o menu Sistema / Administração / Gerenciador de Pacotes Synaptic, conforme a figura abaixo: Figura 1: Iniciando o Synaptic. Será solicitada a senha de usuário administrador do computador para executar o gerenciador de pacotes. Dentro do Synaptic, procure o programa python-serial, e marque o mesmo para instalação conforme a figura abaixo: Figura 2: Marque o pacote para instalação e clique em Aplicar. Aparecerá, então, um resumo das alterações a serem aplicadas. Clique novamente para aplicar as alterações. Figura 3: Confirmando o desejo de instalar os módulos para Python. Após esta etapa, aguarde a aplicação das alterações e, em seguida, o Python estará disponível para utilização. 3
3.1.2 Instalação do Eclipse Eclipse é uma IDE desenvolvida em Java, com código aberto, para a construção de programas de computador. Com o uso de plugins, o Eclipse pode ser usado não só para desenvolver em Java, mas também em Python. Para instalar o Eclipse basta entrar no site oficial do programa e, na área de downloads, baixar a versão Eclipse Classic (http://www.eclipse.org/downloads/). Após baixar o arquivo, extraia o conteúdo na área de trabalho. Com isso, abra a pasta que foi extraída e inicialize o Eclipse clicando no executável. 3.1.3 Integrando o Eclipse com o Python Neste tutorial usaremos o Eclipse como IDE; porém, o Eclipse com as configurações nativas não é capaz de compilar a linguagem Python. Assim, devemos integrá-lo com o Python através de um plugin chamado Pydev. Para fazer essa integração inicie o Eclipse, selecione o menu help / Softwares updates / find and install. Será aberta a seguinte janela: Figura 4: Instalando plugin do python. Clique em add e, em Name, coloque Pydev e, em URL, http://pydev.org/updates e dê OK. Selecione as caixas de seleção conforme a figura abaixo: Figura 5: Selecionando o plugin a ser instalado. 4
Clique em Next e a instalação do plugin será iniciada. Com o plugin instalado já podemos criar um projeto Pydev. Para isso, devemos mudar o ambiente de programação de Java para o Pydev clicando no ícone a sinalizado na figura abaixo: Figura 6: Mudando o ambiente de programação. Neste, clique em Others e, na janela aberta, selecione Pydev, conforme a figura abaixo: Figura 7: Mudando o ambiente de programação. Com isso, basta apenas colocar o arquivo gerado pelo Qt Creator dentro da pasta do projeto. 3.2 Windows Abaixo mostraremos como configurar o ambiente de programação em python no sistema operacional Windows. 3.2.1 Instalação do Python Para a instalação no Windows, faça o download dos instaladores, pois além do python em si, serão necessários os módulos complementares. Como este tutorial foi feito com base no python 2.6.5, recomendamos que seja feito download desta versão ou da versão 2.7, pois as versões a partir da 3.0 apresentam problemas de incompatibilidade com o códigos a serem implementados neste tutorial. 5
Seguem os links com os instaladores para Windows: Instalação do python para Windows: http://www.python.org/download/ Quanto a instalação dos módulos complementares se deve ter atenção, pois na sessão de downloads da porta serial (pyserial) há opções para vários sistemas operacionais e versões do python. Sendo assim, deve-se selecionar o sistema operacional correto, para que não haja problemas futuros, e a versão compatível com a versão do python baixada. Em nosso caso, selecione a opção pyserial 2.x referente ao Microsoft Windows (cujo nome é terminado por win32). Caso haja alguma dúvida quanto ao programa a ser baixado, utilize a imagem abaixo como referência dos arquivos. Figura 8: Ícones de instalação do Python para Windows. Módulos complementares: http://sourceforge.net/projects/pywin32/ http://sourceforge.net/projects/pyserial/files/ Para iniciar a instalação, clique 2 vezes sobre o ícone python-2.6.5 (nome pode variar dependendo da versão baixada). Nas próximas telas, podemos aceitar as opções padrões da instalação, sem nenhuma modificação dos valores padrões, conforme figuras a seguir: Figura 9: Escolha da pasta de instalação. Clique em Next. Figura 10: Finalizando a instalação. 6
Agora, vamos instalar os módulos complementares. Para tanto, clique 2 vezes sobre o ícone pywin32-214.win32-py2.6 (nome pode variar dependendo da versão baixada), que está sendo mostrado abaixo: Figura 11: Módulos complementares. Siga os passos de uma instalação normal para Windows, clicando sempre em avançar. Figura 13: A instalação deve encontrar automaticamente onde o Python para Windows está instalado. Figura 12: Concluir a instalação. Clique em concluir, para concluir a instalação. O arquivo pyserial-2.5-rc2.win32 (nome pode variar dependendo da versão baixada) deve ser instalado seguindo os mesmos passos do módulo anterior. 3.2.2 Integrando o Eclipse com o Python Veja tópico 3.1.3 deste tutorial. 4 Criação de Programas de Controle em Python O Python pode ser utilizado digitando seus códigos em um terminal e vendo os resultados imediatamente, ou através de IDEs. Python é uma linguagem interpretada, portanto ela é capaz de ler o arquivo e executar os comandos um a um. Também não há a necessidade de compilador, apenas o interpretador é suficiente. Esta seção mostrará os passos para a utilização do Python em Ubuntu e em Windows além de exibir como se carrega a biblioteca de controle em ambos. Para mais informações sobre a linguagem Python pode-se visitar o site http://www.async.com.br/projects/python/pnp/contents.html, que disponibiliza um vasto material sobre esta linguagem de programação. 7
4.1 Criando um Projeto Python no Eclipse Para criar uma aplicação em Python no Ubuntu ou no Windows devemos seguir os passo abaixo. Primeiro vamos abrir o Eclipse. Nele, devemos criar um novo projeto. Para isso, vá no menu file / new / Pydev Project. Ele abrirá a seguinte janela: Figura 14: Criando um novo projeto. Em Project Name devemos colocar o nome do nosso projeto e, em seguida, clicar em Finish. Na aba Package Explorer clique com o botão direito sobre a pasta src e vá em new / File, como mostra a figura abaixo: Figura 15: Criando novo arquivo. 8
Na janela que foi exibida, devemos configurar como mostra a figura abaixo. Lembrado que o File name deve sempre terminar com.py para identificar que aquele arquivo é um arquivo python. Figura 16: Criando um novo arquivo.py. Com isso, já temos um projeto com um arquivo. Mais adiante veremos como acessar o MEC1100 a partir do programa. 4.2 Como carregar a biblioteca de controle Para carregar a biblioteca temos que, primeiramente, copiar o arquivo da biblioteca do MEC1100 para a pasta do nosso projeto. Seria o arquivo mec1100.py. Figura 17: Pasta exibindo o arquivo mec1100.py que foi copiado e o arquivo Projeto.py que foi salvo anteriormente. 9
Após copiar o arquivo para a pasta do projeto, devemos incluí-lo ao nosso projeto. Para isso, devemos incluir a seguinte linha de código no inicio do documento de texto Projeto.py: A partir desse ponto, o programa está pronto para acessar o MEC1100. Lembre-se que linhas iniciadas com # são consideradas comentários e são descartadas durante o processo de interpretação do código. 5 Utilizando rotinas da biblioteca de controle Veremos, a seguir, alguns métodos utilizados para se manipular o MEC1100. Com isso, teremos uma visão geral do funcionamento deste equipamento e como funcionam os métodos que serão implementados. Lembre que talvez seja necessário fazer algumas mudanças no código como por exemplo deve-se adaptar a porta utilizada na hora de abrir uma conexão com o MEC1100. 5.1 Rotinas de suporte Veremos, a seguir, os comando básicos do MEC1100, como abrir e fechar uma conexão com o mesmo. Veremos também códigos exemplificando esses comandos. 5.1.1 GetInstalledSerialPorts Para se obter as portas Serial/USB instaladas no computador, é utilizado o comando GetInstalledSerialPorts, o qual está pré-definido na biblioteca de controle, bastando apenas chamá-lo dentro de nosso programa como será apresentado a seguir. Este comando retorna uma lista com as portas USBs e Seriais instaladas no computador. Para utilizá-lo, é necessário implementar as seguintes linhas de comando dentro do código fonte: # Capturando portas seriais e armazenando na variavel portas portas = mec.get_installed_serial_ports() # Exibindo as portas encontradas print portas Agora iremos executar nosso programa. Salve o arquivo clicando no botão Salvar. E dê um Ctrl + F11 para executar o programa. 5.1.2 OpenComunication O método open_communication é utilizado para se abrir a comunicação com o MEC1100. Para se fazer uso deste método, basta chamá-lo dentro do código fonte e, em seu parâmetro, colocar uma 10
String referente a porta em que o MEC1100 está conectado. Vamos aproveitar o código anterior e alterar para que conecte na porta serial /dev/ttys0, conforme o código a seguir: # Abrindo comunicação com o MEC1100 O nome da porta a ser conectado o MEC1100 pode mudar dependendo de onde se conecta o cabo, portanto caso não haja conexão no momento inicial ao teste do código citado, deve-se tentar utilizar nomes como /dev/ttys1, /dev/ttys2, etc. como parâmetro no comando, para se abrir a comunicação citada acima. Além disso, como o MEC1100 possui um conversor serial/usb, o nome da porta também pode variar devido ao cabo utilizado. Ou seja, quando se usa um cabo USB ao invés de um cabo SERIAL, deve-se alterar o nome da porta para /dev/ttyusb0, lembrando que o número da porta pode variar dependendo de onde o cabo for conectado (USB1, USB2, etc.). No caso, a linha de comando anterior ficaria da seguinte forma, utilizando-se o 0 como porta: # Abrindo comunicação com o MEC1100 mec.open_communication('/dev/ttyusb0') No Windows, tanto a porta Serial ou USB são identificadas pelo nome de COM devido a conversão interna do MEC citada acima. Portanto, a porta serial/usb 1 deve se chamar COM1, devendo ser substituído no código fonte apresentado para Ubuntu onde se lê /dev/ttys0 ou /dev/ttyusb0. Como a porta em que se conecta o MEC1100 varia, deve-se tentar colocar nomes como COM1, COM2, etc. até que se consiga efetuar a conexão com o dispositivo. No caso, a linha de código ficaria da seguinte forma utilizando-se a porta COM1: # Abrindo comunicação com O MEC1100 mec.open_communication('com1') 5.1.3 CloseComunication Para encerrar a comunicação entre o dispositivo e o computador, utiliza-se o método denominado close_communication. Para utilizá-lo, basta chamá-lo dentro do código fonte sem utilização de nenhum parâmetro e, automaticamente, a comunicação será finalizada. # Abrindo comunicacao com o MEC1100 # Fechando comunicacao com o MEC1100 11
5.2 Entradas Analógicas Veremos, a seguir, como manipular as entradas analógicas do MEC1100 de modo a obter um resultado esperado. Veremos também códigos exemplificando esses comandos. 5.2.1 SensorRead Para realizar a leitura de sensores conectados a porta de Entradas Analógicas, utiliza-se o comando sensor_read, passando como parâmetro neste método o número do sensor que se deseja ler. A seguir, um exemplo de código realizando a leitura do primeiro sensor do MEC1100: # Abrindo comunicacao com o MEC1100 # Lendo e exibindo valor do primeiro sensor sensor = mec.sensor_read(1) print 'Sensor Analogico: ', sensor # Fechando comunicacao com o MEC1100 5.3 Entradas e saídas digitais Veremos, a seguir, como manipular as entradas e saídas digitais do MEC1100 de modo a obter um resultado esperado. Veremos também códigos exemplificando esses comandos. 5.3.1 DigitalPinRead Através de um dos dos métodos da biblioteca de controle é possível ler, de forma singular, os pinos da porta de Entradas Digitais. Para isso, utiliza-se o método digital_pin_read. Este método retornará o valor da leitura que será dada por 0 ou 1, ou seja, caso o pino esteja em alta (com algo conectado a ele) o valor será 1, senão este será 0. No exemplo, está sendo realizada a leitura do pino 1. # Abrindo comunicação com o MEC1100 # Realizando a leitura do pino digital leitura = mec.digital_pin_read(1); print leitura # Fechando comunicação com o MEC1100 12
5.3.2 DigitalPortRead Para ler todas as entradas digitais, utiliza-se o comando digital_port_read. O resultado dessa função é um número binário codificado em decimal. Ou seja, essa função recebe um valor em binário e o retorna em decimal. Por exemplo: caso se deixe o pino 8 da porta 1 em nível lógico alto, o retorno será o valor 127. Para maiores informações sobre portas digitais e como elas funcionam, recomenda-se a leitura do manual de referências da biblioteca de controle e/ou manual do MEC1100. # Abrindo comunicação com o MEC1100 # Lendo e exibindo valor da Entrada Digital entdig = mec.digital_port_read(1) print 'Entrada Digital: ', entdig # Fechando comunicação com o MEC1100 5.3.3 DigitalPinWrite Para se ligar apenas um pino de uma das portas de Saídas Digitais, utiliza-se o método digital_pin_write. Esse método recebe como parâmetros, respectivamente, o número da porta e o valor correspondente ao pino que se deseja ligar. No exemplo abaixo, foi enviado um parâmetro que ligará o pino 3 da porta 1. # importar a biblioteca que sera usada para acessar o # MEC1100 e criando uma instancia do MEC1100 para uso # Abrindo comunicação com O MEC1100 # Realizando a gravação na porta digital mec.digital_pin_write(3,1) # Fechando comunicação com o MEC1100 5.3.4 DigitalPortWrite Para se ligar um pino de saída digital, utiliza-se o comando digital_port_write, conforme o código a seguir, passando um valor binário. Neste exemplo, foi enviado o valor 170, que ativa os canais 2,4,6,8 da porta de Saídas Digitais. 13
# Abrindo comunicação com o MEC1100 # Gravando dados na Saida Digital mec.digital_port_write(1,170) # Fechando comunicação com o MEC1100 Caso se deseje apagar/desligar a porta de Saídas Digitais, deve-se apenas trocar o parâmetro que representa o valor para 0. Quando se passa o valor 0 na porta, a mesma irá zerar qualquer valor que estava anteriormente escrito e fará com que esta entre no estado de desligada (sem valor). No caso, teríamos apenas que alterar o método para o seguinte: # Gravando dados na Saida Digital mec.digital_port_write(1,0) 5.4 Servomotores Veremos, a seguir, como manipular a entrada de Servomotores/PWM do MEC1100 de modo a obter um resultado esperado ao manipular um servomotor. Veremos também códigos exemplificando esses comandos. 5.4.1 ServoMotorOn Para se ligar um servomotor conectado ao MEC1100, utiliza-se o comando servo_motor_on, passando como parâmetro o número do servomotor que se deseja ligar e, respectivamente, a posição que em que o servomotor ficará. A porta de Servomotores/PWM possui 8 pinos, logo o número de servomotores irá de 0 a 8 e, por padrão, a posição irá de 0 a 255 (devido as limitações dos servomotores). No exemplo, estamos alterando o primeiro servomotor para a posição 0 e o oitavo servomotor para a posição 254. # Abrindo comunicação com o MEC1100 # Posicionando os Servomotores mec.servo_motor_on(1,0) # Fechando comunicação com o MEC1100 14
5.4.2 ServoMotorOff Para se desligar um servomotor, utiliza-se o método servo_motor_off. Este método recebe como parâmetro o número do servomotor que se deseja desligar (0 a 8). No exemplo, a seguir, foi desligado o servomotor de número 1, o qual havia sido ligado anteriormente. # Abrindo comunicação com o MEC1100 # Desligando os Servomotores mec.servo_motor_off(1) # Fechando comunicação com o MEC1100 5.5 PWMs Veremos, a seguir, como manipular a entrada de Servomotores/PWM do MEC1100 de modo a obter um resultado esperado ao manipular um servomotor. Veremos também códigos exemplificando esses comandos. 5.5.1 PwmOn O MEC1100 também permite a utilização de dispositivos PWMs (Pulse Width Modulation ou Modulação por Largura de Pulso). Para isso, utiliza-se o método pwm_on o qual recebe 5 parâmetros: o primeiro indica qual PWM deve ser utilizado (conta-se do número 1 ao número 8), o segundo indica o valor para período (de 0 a 65535), o terceiro indica o ciclo ativo (de 0 a 65535), o quarto indica o divisor de clock (de 0 a 7) e o último indica a polaridade do sinal (0 para negativo e 1 para positivo). No exemplo, foram definindo os parâmetros para que um servomotor (que é um tipo de equipamento acionado por PWM), ligado no pino 1, posicione seu eixo em -90 graus. Para maiores informações sobre PWM e seu funcionamento, consulte o manual do MEC1100 ou o documento de características dos PWM. # Abrindo comunicação com O MEC1100 # Passando os parâmetros ao PWM mec.pwm_on(1, 55300, 2765, 2, 1) # Fechando comunicação com o MEC1100 15
5.5.2 PwmOff Para desligar um PWM utiliza-se o método denominado pwm_off, o qual recebe como parâmetro apenas o pino do PWM que se deseja desligar. O código abaixo mostra como desligar o PWM de número 1: # Abrindo comunicacao com O MEC1100 # Desligando o PWM mec.pwm_off(1) # Fechando comunicacao com o MEC1100 16