ACESSE www.fisicarduino.com

Olá, o objetivo deste projeto é controlar dois servo motores conectados ao arduino. O controle será feito através de um programa em python usando a biblioteca tkinter ( para interface gráfica ) e fazendo o uso da biblioteca de acesso à porta serial do python.

Aqui está o código fonte do programa em python:

# -*- coding: cp1252 -*-
########################################################################
#                                                                      #
# Programa para controle de dois servo motores ( x_servo e y_servo )   #
# Autor: Marcelo Rocha                                                 #
# Se comunica com o arduino através da porta serial                    #
# Protocolo simples de comunicação: ( byte_servo + valor do slider )   #
# Exemplo x100 ( Envia o valor 100 para x_servo )                      #
#                                                                      #
########################################################################

from Tkinter import *
import serial
import time

# Configuração da porta serial

ser = serial.Serial("COM3",9600); # Define porta e velocidade de comunicação
print ser.portstr; # Imprime a porta em uso
print ('aguarde, incializando a porta...');
time.sleep(3); # Aguarda 3 segundos

def y_axis(valor): # Funcão que envia o valor do slide Y para a porta serial
   ser.write('y')
   ser.write(chr(int(valor))) # Converte a variável valor de str para int e de int para char ( byte )

def x_axis(valor): # Funcão que envia o valor do slide X para a porta serial
   ser.write('x')
   ser.write(chr(int(valor))) # Converte a variável valor de str para int e de int para char ( byte )

def sair(): # Função que destrói a Janela principal, antes fecha a porta serial
   ser.close() # Fecha a porta serial
   print('Fechando a porta serial...')
   time.sleep(1)
   print('Fechando a janela..')
   time.sleep(1)
   root.destroy() # Destrói a janela

# processo de criação da UI com TKinter

root = Tk() # Cria a janela
root.title('Servo Motor Arduino Control') # Define o títula da janela
root.geometry('280x280') # Define o tamanho

# Cria um objeto Scale que pode varia de 0 a 179, e associa-o à função y_axis

scale = Scale( root, from_=0, to=179, command = y_axis, width=9, length=179 )
scale.pack(anchor=CENTER) # Coloca o Scale na janela

# Cria um objeto Scale ( Horizontal ) que pode varia de 0 a 179, e associa-o à função x_axis

scale = Scale( root, from_=0, to=179, command = x_axis, width=9, length=179, orient=HORIZONTAL )
scale.pack(anchor=CENTER) # Coloca o Scale na janela

# Cria um objeto botão
b = Button(root, text ='Exit', command = sair)
b.pack() # Coloca o botão na janela

root.mainloop() # Coloca o programa em execução

Vamos ver agora o código do programa que roda dentro do arduino.

// Controle de dois servo motores usando Python e TK

#include <Servo.h>

Servo x_servo, y_servo; // Cria dois objetos do tipo Servo.
int eixo =0 , bytelido = 0; // Cria duas variaveis do tipo int.

void setup (){
  Serial.begin(9600); // Configura a velocidade da comunicação serial.
  x_servo.attach(9); // Anexa o objeto x_servo ao pino 9 do arduino.
  y_servo.attach(11); // Anexa o objeto y_servo ao pino 10 do arduino.
  x_servo.write(0); // posiciona x_servo no angulo zero grau.
  y_servo.write(0); // posiciona y_servo no angulo zero grau.
}

void loop(){
    while (Serial.available() > 0){ // Enquanto houver algum byte na entrada serial.
      eixo = Serial.read(); //Lê um byte e armazena na variável eixo.
      if ( eixo == 'x' ) { // Verifica se eixo é igual ao caractere x.
        delay(10); // Espera 10ms
        bytelido = Serial.read(); // Como eixo igual a 'x', bytelido recebe o valor do 'slider x' da UI em python.
        x_servo.write(bytelido); // Passa para o x_servo o valor de bytelido.
      }
      if ( eixo == 'y' ) { // Verifica se eixo é igual ao caractere y.
        delay(10); // Espera 10ms
        bytelido = Serial.read(); // Como eixo igual a 'y', bytelido recebe o valor do 'slider y' da UI em python.
        y_servo.write(bytelido); // Passa para o x_servo o valor de bytelido.
      }
    }
}

Captura da tela do pequeno aplicativo.

TK Servo Controller

Esquema em protoboard montado no software Fritzing.

Esquema montado usando o Fritzing – http://www.fritzing.org

Assista o vídeo do projeto em funcionamento.