Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
RELATRIO FINAL
PIBIC/PIBITI/CNPq/IFSP
Ttulo do Projeto: Criaa o de Interface para Parametrizaa o de Sistema de Controle Auto nomo
Microcontrolado de Motores de Corrente Contnua
INTRODUO
Conectando os perifricos:
Como ligaa o adotada entre os perife ricos e o microcontrolador MSP430, o
display LCD foi conectado da seguinte forma:
15 BL+ +5V
16 BL- GND
01 Up Pino 14 (P1.6)
O sensor ultrasso nico que possui tre s terminais tambe m foi conectado
conforme a tabela:
Sensor
Ultrasso nico Conexa o
(MSP430)
Pino Descria o
01 Vcc +3,3v
04 GND GND
Encoder Conexa o
01 GND GND
03 Vcc +3,3v
A ponte H, que servira de driver para o motor (em pesquisa) sera conectada
aos pinos 9 e 10 (P2.1 e P2.2) do MSP430, pois sa o pinos que o microcontrolador
possui com sada PWM.
Com o conhecimento da disposia o de todos os perife ricos ligados ao
microcontrolador, comeou-se o desenvolvimento do programa que fornecera as
perguntas para parametrizaa o e configuraa o do motor e sensores.
Iniciou-se, tambe m, um estudo pre vio da ponte H que sera utilizada como
driver de potencia para o motor, foi levado em conta a sugesta o do antigo bolsista
de utilizar o circuito integrado L289, mas pelas mudanas no projeto e utilizaa o
de apenas um motor, outros modelos de drivers foram pesquisado.
8. Para o usua rio reconfigurar o motor com novos para metros, basta
alternar para a opa o de Reconfigurar e confirmar.
O tempo que o sinal do eco fica em alta varia conforme a dista ncia do objeto
e e esse tempo que o microcontrolador usa para definir a dista ncia do objeto,
conforme pode ser visto no programa anexo D.
#include <LiquidCrystal.h>
void setup() {
lcd.begin(16, 2);
}
void loop() {
lcd.print("Escolha Sensores");
delay(1000);
lcd.setCursor(0,1);
lcd.print("1-Fim de curso; 2-Velocidade; 3-Distanci");
delay(500);
int x = 1;
while(x < 25){
lcd.setCursor(x,0); // Mantem a linha 1 parada
lcd.print("Escolha Sensores");
lcd.scrollDisplayLeft();
delay(350);
x++;}
lcd.clear();
lcd.print("Escolha Sensores");
lcd.setCursor(0,1);
lcd.print("dade; 3-Distancia; 4-Posia o;");
x=1;
while(x < 25){
lcd.setCursor(x,0); // Mantem a linha 1 parada
lcd.print("Escolha Sensores");
lcd.scrollDisplayLeft();
// wait a bit:
delay(350);
x++;}
int troca = 0;
int velocidade;
void setup()
{
lcd.begin(16, 2);
pinMode(P2_1, OUTPUT);
pinMode(P2_2, OUTPUT);
pinMode(P1_5, INPUT_PULLUP);
pinMode(P1_0, INPUT);
attachInterrupt(P1_0, time, RISING);
}
void loop()
{
analogWrite(P2_1, troca);
while (digitalRead(P1_5) == LOW){
troca += 10;
delay(500);
}
if(troca > 255){
troca = 0;
}
if(x >= 2){
velocidade = 60000 / (tempo2 - tempo1);
x = 0;
if (velocidade < 1000){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Velocidade");
lcd.setCursor(11,0);
lcd.print(troca^255, DEC);
lcd.setCursor(0,1);
lcd.print(velocidade);
}
}
}
void time()
{
if (x == 0){
tempo1 = millis();
}
if (x ==1){
tempo2 = millis();
}
x++;
}
Anexo D - Programa para leitura de distancia.
#include <LiquidCrystal.h>
#define trigPin 6
#define echoPin 5
void setup() {
lcd.begin(16, 2);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
void loop() {
int duration, distance;
digitalWrite(trigPin, HIGH);
delayMicroseconds(1000);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration/2) / 29.1;
if (distance >= 200 || distance <= 0){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Distancia");
lcd.setCursor(0,1);
lcd.print("Out of range");
}
else {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Distancia");
lcd.setCursor(0,1);
lcd.print(distance);
lcd.print(" cm");
}
delay(500);
}
Anexo E - Programa de controle.
#include <LiquidCrystal.h> if (controle < 0){
controle = 0;
volatile unsigned long tempo1, tempo2, tempo3, }
tempo4; }
volatile int x = 0; if (Speed < mostra){
controle++;
LiquidCrystal lcd(P2_0, P1_1, P1_2, P2_3, P2_4, delay (controle + 100);
P2_5); if (controle > 255){
controle = 255;
int Speed = 800; }
int controle = 0; }
int mostra; if(x >= 2){
int velocidade; velocidade = 60000 / (tempo2 - tempo1);
x = 0;
void setup() if (velocidade < 1000){
mostra = velocidade;
{ tempo3 = millis();
lcd.begin(16, 2); lcd.clear();
pinMode(P2_1, OUTPUT); lcd.setCursor(0,0);
pinMode(P2_2, OUTPUT); lcd.print("Velocidade");
pinMode(P1_5, INPUT_PULLUP); lcd.setCursor(11,0);
pinMode(P1_0, INPUT); lcd.print(Speed, DEC);
attachInterrupt(P1_0, time, RISING); lcd.setCursor(0,1);
} lcd.print(mostra);
}
void loop() }
{ }
analogWrite(P2_1, controle);
while (digitalRead(P1_5) == LOW){ void time()
Speed -= 100; {
delay(500); if (x == 0){
} tempo1 = millis();
if (Speed < 0){ }
Speed = 800; if (x ==1){
} tempo2 = millis();
if (Speed > mostra){ }
controle--; x++;
delay (controle + 100); }
Anexo F - Programa final.
/* int left = P2_2; //sentido anti-horario.
The Display circuit: int sent; //Sentido de setpoint.
================================= String nome1;
LCD pin Connect to String nome2;
--------------------------------- unsigned long time;
01 - GND GND unsigned long tempo1;
02 - VCC +3.3v unsigned long tempo2;
03 - Contrast GND long int intmax = 1000000;
04 - RS Pin8 (P2.0) int vfalse = 0; //Velocidade falsa descartada.
05 - R/W GND int intmin = 0;
06 - EN Pin3 (P1.1)
07 - DB0 GND int nv = 0; //|Numero de velocidades desejadas no
08 - DB1 GND //|modo fixo.
09 - DB2 GND int num = 0; //|Numero da velocidade desejada no
10 - DB3 GND //|modo fixo.
11 - DB4 Pin04 (P1.2) int vel[10]; //|Array para armazenar valores de
12 - DB5 Pin11 (P2.3) // |velocidade no modo fixo.
13 - DB6 Pin12 (P2.4) int dis[10]; //|Array para armazenar valores de
14 - DB7 Pin13 (P2.5) //|distancia no modo fixo.
15 - BL+ +5V int bv = 0; //Velocidade anterior para o modo fixo
16 - BL- GND int bd = 3; //Distancia anterior para o modo fixo.
=================================
int dmaxp = 0; //|Distancia maxima no modo
The Push Buttons circuit: //|proporcional.
================================= int dminp = 0; //|Distancia minima no modo
Push Button Connect to //|proporcional.
--------------------------------- int vmaxp = 0; //|Velocidade maxima no modo
01 - Up Pin14 (P1.6) //|proporcional.
02 - Down Pin15 (P1.7) int vminp = 0; //|Velocidade minima no modo
03 - Enter Pin7 (P1.5) //|proporcional.
================================= int di, df; //|Distancias inicial e final pra o modo
//|proporcional.
The Ultrasonic circuit: int vi, vf; //|Velocidades inicial e final pra o modo
================================= //|proporcional.
Ultrasonic Connect to
--------------------------------- int vmax = 0;
01 - Vcc +3.3V int ctrl = 0; //PWM de Controle da velocidade.
02 - Trig Pin6 (P1.4) int vsp = 0; //Velocidade de setpoint.
03 - Echo Pin5 (P1.3) int dsp = 0; //Distancia de setpoint.
04 - GND GND
================================= int op = 0; //|Operaa o - Velocidade, Distancia,
//|Rotaa o, Configuraa o.
The Sensor Speed circuit: int v = 0; //Variavel de Velocidade.
================================= int x = 0;
01 - GND GND int y = 0;
02 - Out Pin2 (P1.0) int z = 0;
03 - Vcc +3.3V
================================= //Variaveis do Menu Central.
*/ int Visor = 0;
int Modo [3] = {1, 0, 0};
// Inclui a biblioteca do Display /*
#include <LiquidCrystal.h> modo[0] = 1 -> Config
modo[0] = 2 -> ReConfig??
//Define pinos do sensor ultrassonico
#define echoPin 5 //P1.3 - Echo (input). modo[1] = 1 -> Velocidade (fixas)
#define trigPin 6 //P1.4 - Trig (output). modo[1] = 2 -> Velocidade (proporcionais)
modo[1] = 3 -> Velocidade unica (sem HC-SR04)
//|Inicializa a biblioteca do display com os numeros
dos //|depinos da inteface. modo[2] = 1 -> Distancias (fixas)
modo[2] = 2 -> Distancias (proporcionais)
LiquidCrystal lcd(P2_0, P1_1, P1_2, P2_3, P2_4, P2_5);
modo[3] = 1 -> Rotaa o Horaria
//|Define os pinos dos bottons e as variaveis do //| modo[3] = 2 -> Rotaa o Anti-horaria
programa. */
const int stop = P1_0; //interrupa o.
const int enter = P1_5; void setup() {
const int up = P1_6; // Define o numero de colunas e linhas do LCD.
const int down = P1_7; lcd.begin(16, 2);
int duration, distance; //|variaveis para media o da
//|distancia. //Define os pinos dos boto es com entrada.
int right = P2_1; //sentido horario. pinMode(up, INPUT_PULLUP);
pinMode(down, INPUT_PULLUP); lcd.print(nome2);
pinMode(enter, INPUT_PULLUP); lcd.print(")");
pinMode(right, OUTPUT); lcd.setCursor(0,1);
pinMode(left, OUTPUT); lcd.print("Carregando...");
pinMode(trigPin, OUTPUT); while (x == 0){
pinMode(echoPin, INPUT); controle();
pinMode(stop, INPUT); if (digitalRead(up) == LOW || digitalRead(down) ==
//Define o pino de interrupa o. LOW){
attachInterrupt(stop, tempo, RISING); x = 1;
mudavisor();
// Mensagem de boas vindas. }
lcd.print(" Ola, bem-vindo "); }
lcd.setCursor(4,1); }
lcd.print("ao IPSCA ");
delay(3000); //Visor em Distancia.
if (Visor == 2){
// Mensagem de instruo es. noInterrupts();
lcd.clear(); while(digitalRead(up) == HIGH && digitalRead(down)
lcd.setCursor(3,0); == HIGH){
lcd.print("Utilize os"); if (Modo[2] == 1){ disfixas(); }
lcd.setCursor(0,1); if (Modo[2] == 2){ disprop(); }
lcd.print("botoes up e down"); }
delay(3000); mudavisor();
lcd.clear(); }
lcd.setCursor(2,0);
lcd.print("para navegar"); //Visor em Sentido.
lcd.setCursor(0,1); if (Visor == 3){
lcd.print("entre as opcoes"); noInterrupts();
delay(3000); while(digitalRead(up) == HIGH && digitalRead(down)
lcd.clear(); == HIGH){
lcd.setCursor(2,0); lcd.clear();
lcd.print("e enter para"); lcd.setCursor(4,0);
lcd.setCursor(3,1); lcd.print("Sentido");
lcd.print("confirmar."); if (sent == right){
delay(3000); lcd.setCursor(4,1);
lcd.print("Horario");
//Primeira configuraa o. }
config(); if (sent == left){
} lcd.setCursor(2,1);
lcd.print("Anti-horario");
void loop() { }
//Visor em Config. delay(500);
if (Visor == 0){ }
x = 0; mudavisor();
noInterrupts(); }
lcd.clear(); }//Fecha void loop.
lcd.setCursor(0,0);
lcd.print("Pressione enter"); void mudavisor() {
lcd.setCursor(0,1); if (digitalRead(up) == LOW){
lcd.print("p/ reconfigurar."); Visor--;
while(x == 0){ if (Visor < 0){
if (digitalRead(up) == LOW || digitalRead(down) == Visor = 3;
LOW){ }
x = 1; if (Visor == 2 && Modo [2] == 0){
mudavisor(); Visor = 1;
} }
if (digitalRead(enter) == LOW){ delay(500);
config(); }
x = 1; if (digitalRead(down) == LOW){
} Visor++;
} if (Visor > 3){
} Visor = 0;
}
//Visor em Velocidade. if (Visor == 2 && Modo [2] == 0){
if (Visor == 1){ Visor = 3;
x = 0; }
interrupts(); delay(500);
if (Modo[1] == 1){ velfixas(); } }
if (Modo[1] == 2){ velprop(); } }//Fecha void mudavisor.
nome1 = "Velocidade (";
nome2 = String(vsp); void config() {
lcd.clear(); noInterrupts();
lcd.setCursor(0,0); analogWrite(P2_1, 255);
lcd.print(nome1); analogWrite(P2_2, 255);
lcd.clear();
//Parametrizaa o da velocidade. lcd.setCursor(1,0);
lcd.clear(); lcd.print("Auto detectar?");
lcd.setCursor(1,0); lcd.setCursor(5,1);
lcd.print("Parametrizacao"); lcd.print("1- Sim");
lcd.setCursor(1,1); x=0;
lcd.print("da velocidade:"); nome1 = " 1- Sim ";
delay(3000); nome2 = " 2- Nao ";
lcd.clear(); var_binario();
lcd.setCursor(1,0);
lcd.print("Auto detectar"); if (x == 0){ //Deteca o sem o sensor.
lcd.setCursor(1,1); lcd.clear();
lcd.print("veloc. maxima?"); lcd.setCursor(3,0);
delay(3000); lcd.print("Sensor nao");
lcd.setCursor(3,1);
lcd.clear(); lcd.print("encontrado");
lcd.setCursor(1,0); delay(3000);
lcd.print("Auto detectar?"); x = 1;
lcd.setCursor(5,1); }
lcd.print("1- Sim"); if (x == 1){
nome1 = " 1- Sim "; analogWrite(right, 200); //|aciona rotaa o em baixa
nome2 = " 2- Nao "; //| velocidade.
x = 0; lcd.clear();
var_binario(); lcd.setCursor(1,0);
lcd.print("Qual o sentido");
if (x == 0){ //Deteca o automatica de Vmax. lcd.setCursor(3,1);
ctrl = 255; lcd.print("de rotacao");
x = 0; delay(3000);
v = 0; analogWrite(right, 215);
nome1 = "Velocidade ("; lcd.clear();
nome2 = "Max"; lcd.setCursor(0,0);
interrupts(); lcd.print("atual do motor?");
vmaxima(); delay(3000);
noInterrupts(); analogWrite(right, 230);
vmax = v;
x = 0; lcd.clear();
} //Fecha Deteca o automatica de Vmax. lcd.setCursor(1,0);
if (x == 1){ //Deteca o manual de Vmax. lcd.print("Rotacao atual:");
lcd.clear(); lcd.setCursor(3,1);
lcd.setCursor(2,0); lcd.print("1- Horaria");
lcd.print("Entre com a"); x=0;
lcd.setCursor(3,1); nome1 = " 1- Horaria ";
lcd.print("velocidade"); nome2 = "2- Anti-horaria ";
delay(3000); var_binario();
lcd.clear(); analogWrite(right, 255);
lcd.setCursor(0,0); if (x == 1){
lcd.print("maxima do motor"); right = P2_2;
lcd.setCursor(4,1); left = P2_1;
lcd.print("(em rpm)"); }
delay(3000); }
DATA 30/12/2013