RELATRIO FINAL
PIBIC/PIBITI/CNPq/IFSP
Nome do Bolsista inicial: Hugo Bernardino da Silva
Nome do Bolsista Substituto: Caio Nunes Bustamante Reis
Nome do Orientador: Ricardo Pires
Ttulo do Projeto: Criao de Interface para Parametrizao de Sistema de Controle
Autnomo Microcontrolado de Motores de Corrente Contnua
Vigncia da Bolsa: 01/09/2012 31/07/2013
INTRODUO
PROPOSIO
RESULTADOS OBTIDOS
Descri
o
Conexo
(MSP430)
01
GND
GND
02
VCC
+3,3v
03
Contrast
04
Rs
05
R/W
GND
06
EM
Pino
(P1.1)
07
DB0
GND
08
DB1
GND
09
DB2
GND
10
DB3
GND
11
DB4
Pino
(P1.2)
04
12
DB5
Pino
(P2.3)
11
GND
Pino
(P2.0)
08
03
13
DB6
Pin12 (P2.4)
14
DB7
Pin13 (P2.5)
15
BL+
+5V
16
BL-
GND
Conexo
Pino
Descri
o
01
Up
Pino
(P1.6)
14
02
Down
Pino
(P1.7)
15
03
Enter
Pino
(P1.5)
07
(MSP430)
Conexo
(MSP430)
Pino
Descri
o
01
Vcc
+3,3v
02
Trig
Pino 6 (P1.4)
03
Echo
Pino 5 (P1.3)
04
GND
GND
Conexo
Pino
Descri
o
01
GND
GND
02
Out
Pino 2 (P1.0)
03
Vcc
+3,3v
(MSP430)
Como
cada
sensor
ultrassnico
pode
apresentar
caractersticas diferentes para leitura mxima e mnima da
distncia, o usurio dever selecionar qual modelo est
utilizando para que o programa busque nas suas bibliotecas as
configuraes correspondentes ao sensor.
Parametrizao da distncia:
Qual sensor ultrassnico est utilizando?
Modelo do sensor
HC-SR04 ou Nenhum
Pelo fato do projeto apresentar um estudo simplificado
aparecer a opo para o modelo de sensor que utilizado ou
para no utilizar tal sensor.
Caso o usurio escolha o modelo utilizado, uma mensagem
informar no display as caractersticas especficas do sensor.
Sensor HC-SR04 Ultrassnico funciona com alcance mximo
de 200 cm e alcance mnimo de 3 cm.
Aps a mensagem aparecer por completo, o programa
passar para a prxima etapa de parametrizao.
Escolha o modo de configurao: 1- Velocidades e rotao
especficas
para
distancias
fixas.
2Velocidades
proporcionais para uma faixa de distancias
Modo?
1- Fixas ou 2- Proporcionais
Se o usurio optar pela primeira opo, o programa
perguntar quantas velocidades diferentes deseja configurar e
esperar que o usurio insira os valores desejados.
Quantas velocidades deseja configurar?
N de velocidades
__ (O cursor aguardar at que o usurio escolha o valor e
pressione enter)
Velocidade 1
__
Distancia 1
__
Rotao?
1- Horriaou 2- Anti-Horria
Essas mensagens podero ser repetidas conforme o nmero
de velocidades diferentes escolhidas, respeitando um limite
mximo dentro da programao.
i++;
Speed = 800;
controle = 0;
mostra;
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, controle);
while (digitalRead(P1_5) == LOW){
Speed -= 100;
delay(500);
}
if (Speed < 0){
Speed = 800;
}
if (Speed > mostra){
controle--;
delay (controle + 100);
if (controle < 0){
controle = 0;
}
}
if (Speed < mostra){
controle++;
delay (controle + 100);
if (controle > 255){
controle = 255;
}
}
if(x >= 2){
velocidade = 60000 / (tempo2 tempo1);
x = 0;
if (velocidade < 1000){
mostra = velocidade;
tempo3 = millis();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Velocidade");
lcd.setCursor(11,0);
lcd.print(Speed, DEC);
lcd.setCursor(0,1);
lcd.print(mostra);
}
}
}
void time()
{
if (x == 0){
tempo1 = millis();
}
if (x ==1){
tempo2 = millis();
}
x++;
}
vmax = 0;
ctrl = 0;
vsp = 0;
dsp = 0;
int op = 0;
Distancia,
int
int
int
int
v = 0;
x = 0;
y = 0;
z = 0;
if (digitalRead(enter) == LOW){
config();
x = 1;
}
}
void loop() {
//Visor em Config.
if (Visor == 0){
x = 0;
noInterrupts();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Pressione enter");
lcd.setCursor(0,1);
lcd.print("p/ reconfigurar.");
while(x == 0){
if (digitalRead(up) == LOW ||
digitalRead(down) == LOW){
x = 1;
mudavisor();
}
}
//Visor em Velocidade.
if (Visor == 1){
x = 0;
interrupts();
if (Modo[1] == 1){ velfixas(); }
if (Modo[1] == 2){ velprop(); }
nome1 = "Velocidade (";
nome2 = String(vsp);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(nome1);
lcd.print(nome2);
lcd.print(")");
lcd.setCursor(0,1);
lcd.print("Carregando...");
while (x == 0){
controle();
if (digitalRead(up) ==
digitalRead(down) == LOW){
x = 1;
mudavisor();
}
}
}
//Visor em Distancia.
if (Visor == 2){
noInterrupts();
while(digitalRead(up) ==
digitalRead(down) == HIGH){
if (Modo[2] == 1){ disfixas(); }
if (Modo[2] == 2){ disprop(); }
}
mudavisor();
}
//Visor em Sentido.
if (Visor == 3){
noInterrupts();
while(digitalRead(up)
digitalRead(down) == HIGH){
lcd.clear();
lcd.setCursor(4,0);
lcd.print("Sentido");
if (sent == right){
lcd.setCursor(4,1);
lcd.print("Horario");
}
if (sent == left){
lcd.setCursor(2,1);
lcd.print("Anti-horario");
}
delay(500);
}
mudavisor();
}
}//Fecha void loop.
==
void mudavisor() {
if (digitalRead(up) == LOW){
Visor--;
if (Visor < 0){
Visor = 3;
}
if (Visor == 2 && Modo [2] == 0){
Visor = 1;
}
LOW
||
HIGH
&&
HIGH
&&
delay(500);
}
if (digitalRead(down) == LOW){
Visor++;
if (Visor > 3){
Visor = 0;
}
if (Visor == 2 && Modo [2] == 0){
Visor = 3;
}
delay(500);
}
}//Fecha void mudavisor.
void config() {
noInterrupts();
analogWrite(P2_1, 255);
analogWrite(P2_2, 255);
//Parametrizao da velocidade.
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Parametrizacao");
lcd.setCursor(1,1);
lcd.print("da velocidade:");
delay(3000);
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Auto detectar");
lcd.setCursor(1,1);
lcd.print("veloc. maxima?");
delay(3000);
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Auto detectar?");
lcd.setCursor(5,1);
lcd.print("1- Sim");
nome1 = "
1- Sim
";
nome2 = "
2- Nao
";
x = 0;
var_binario();
if (x == 0){ //Deteco automatica de Vmax.
ctrl = 255;
x = 0;
v = 0;
nome1 = "Velocidade (";
nome2 = "Max";
interrupts();
vmaxima();
noInterrupts();
vmax = v;
x = 0;
} //Fecha Deteco automatica de Vmax.
if (x == 1){ //Deteco manual de Vmax.
lcd.clear();
lcd.setCursor(2,0);
lcd.print("Entre com a");
lcd.setCursor(3,1);
lcd.print("velocidade");
delay(3000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("maxima do motor");
lcd.setCursor(4,1);
lcd.print("(em rpm)");
delay(3000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Velocidade (Max)");
lcd.setCursor(0,1);
lcd.cursor();
lcd.setCursor(2,1);
lcd.print("da distancia:");
delay(3000);
lcd.clear();
lcd.setCursor(2,0);
lcd.print("Qual sensor");
lcd.setCursor(2,1);
lcd.print("Ultrassonico");
delay(3000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("esta utilizando?");
delay(3000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Modelo do sensor");
lcd.setCursor(3,1);
lcd.print("1- HC-SR04");
x=0;
nome1 = " 1- HC-SR04 ";
nome2 = " 2- Nenhum ";
var_binario();
if (x == 0){ //Sensor HC-SR04.
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Sensor HC-SR04");
lcd.setCursor(2,1);
lcd.print("Ultrassonico");
delay(3000);
lcd.clear();
lcd.setCursor(2,0);
lcd.print("funciona com");
lcd.setCursor(1,1);
lcd.print("alcance maximo");
delay(3000);
lcd.clear();
lcd.setCursor(2,0);
lcd.print("de 200 cm e");
lcd.setCursor(1,1);
lcd.print("alcance minimo");
delay(3000);
lcd.clear();
lcd.setCursor(3,0);
lcd.print("de 3 cm.");
delay(3000);
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Escolha o modo");
lcd.setCursor(1,1);
lcd.print("de configuracao:");
delay(3000);
lcd.clear();
lcd.setCursor(1,0);
lcd.print("1. Velocidades");
lcd.setCursor(2,1);
lcd.print("e rotacao");
delay(3000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("especificas para");
lcd.setCursor(0,1);
lcd.print("distancias fixas");
delay(3000);
lcd.clear();
lcd.setCursor(1,0);
lcd.print("2. Velocidades");
lcd.setCursor(1,1);
lcd.print("proporcionais");
delay(3000);
lcd.clear();
lcd.setCursor(1,0);
var_inteiro();
dis[i] = v;
bd = v;
}// fecha o for
lcd.clear();
//fixando o sentido.
lcd.setCursor(4,0);
lcd.print("Rotacao? ");
lcd.setCursor(9,0);
lcd.setCursor(3,1);
lcd.print("1- Horaria");
x=0;
nome1 = " 1- Horaria ";
nome2 = "2- Anti-horaria ";
var_binario();
if (x == 0){ sent = right; }
if (x == 1){ sent = left; }
x = 0;
}// fecha o Modo Fixos.
if (x == 1){ // Modo Proporcional.
Modo[1] = 2;
Modo[2] = 2;
x = 16;
v = 0;
lcd.clear();
//fixando a distancia
inicial.
lcd.setCursor(0,0);
lcd.print("Dist. Inicial");
lcd.setCursor(0,1);
lcd.cursor();
nome1 = "Dist. Inicial";
intmax = 200;
intmin = 3;
v = 3;
var_inteiro();
di = v;
lcd.clear();
//fixando a velocidade
inicial.
lcd.setCursor(0,0);
lcd.print("Veloc. Inicial");
lcd.setCursor(0,1);
lcd.cursor();
nome1 = "Veloc. Inicial";
intmax = vmax;
intmin = 0;
v = 0;
var_inteiro();
vi = v;
lcd.clear();
//fixando a distancia final.
lcd.setCursor(0,0);
lcd.print("Dist. Final");
lcd.setCursor(0,1);
lcd.cursor();
nome1 = "Dist. Final";
intmax = 200;
intmin = 3;
v = di;
var_inteiro();
df = v;
lcd.clear();
//fixando a velocidade
final.
lcd.setCursor(0,0);
lcd.print("Veloc. Final");
lcd.setCursor(0,1);
lcd.cursor();
nome1 = "Veloc. Final";
intmax = vmax;
intmin = 0;
v = vi;
var_inteiro();
vf = v;
lcd.clear();
//fixando o sentido.
lcd.setCursor(4,0);
lcd.print("Rotacao? ");
lcd.setCursor(9,0);
lcd.setCursor(3,1);
lcd.print("1- Horaria");
x=0;
nome1 = " 1- Horaria ";
nome2 = "2- Anti-horaria ";
var_binario();
if (x == 0){ sent = right; }
if (x == 1){ sent = left; }
x = 0;
}// fecha o Modo Proporcional.
Visor = 2;
v = 0;
}// fecha Sensor HC-SR04 (x == 0)
if (x == 1){ //Sem Sensor de distancia.
Modo[1] = 0;
Modo[2] = 0;
lcd.clear();
lcd.setCursor(2,0);
lcd.print("Escolha uma");
lcd.setCursor(0,1);
lcd.print("velocidade unica");
delay(3000);
lcd.clear();
lcd.setCursor(2,0);
lcd.print("de trabalho.");
delay(3000);
lcd.clear();
//fixando velociade nica.
lcd.setCursor(0,0);
lcd.print("Velocidade (rpm)");
lcd.setCursor(0,1);
lcd.cursor();
nome1 = "Velocidade (rpm)";
intmax = vmax;
intmin = 0;
x = 16;
v = 0;
var_inteiro();
vsp = v;
lcd.clear();
//fixando o sentido.
lcd.setCursor(4,0);
lcd.print("Rotacao? ");
lcd.setCursor(9,0);
lcd.setCursor(3,1);
lcd.print("1- Horaria");
x=0;
nome1 = " 1- Horaria ";
nome2 = "2- Anti-horaria ";
var_binario();
if (x == 0){ sent = right; }
if (x == 1){ sent = left; }
x = 1;
Visor = 1;
v = 0;
} // Fecha Sem Sensor de distancia (x == 1)
v = 0;
} //Fecha void config.
//Seleo
e
--------------------------------------------void var_inteiro() {
while (digitalRead(enter) != LOW){
time = millis();
Botes
analogWrite(right, ctrl);
ctrl += 5;
delay(100);
}
ctrl = 255;
}//Fecha vmaxima.
//============================
=============//
void var_binario() {
while(digitalRead(enter) == HIGH){
if
(digitalRead(up)
==
LOW
||
digitalRead(down) == LOW){
x = !x;
if (x == 0){
lcd.setCursor(0,1);
lcd.print(nome1);
delay(500);
}
if (x == 1){
lcd.setCursor(0,1);
lcd.println(nome2);
delay(500);
}
}
}// fecha botao enter
delay(500);
}//fecha var_binario.
//============================
============//
//Mostra
velocidade
do
motor----------------------------------void displaiv()
{
if(z >= 2){
vfalse = 60000 / (tempo2 - tempo1);
z = 0;
if (vfalse < 1000 && vfalse >= 0){
v = vfalse;
lcd.clear();
lcd.setCursor(0,0);
lcd.print(nome1);
lcd.print(nome2);
lcd.print(")");
lcd.setCursor(0,1);
lcd.print(v);
lcd.print(" rpm");
}
}
} //Fecha displaiv.
//============================
=============//
//Deteco
Vmax---------------------------------------------void vmaxima() {
while (ctrl >= 0){
displaiv();
analogWrite(right, ctrl);
ctrl -= 5;
delay(100);
}
ctrl = 0;
analogWrite(right, 0);
delay (3000);
displaiv;
lcd.clear();
delay(500);
lcd.setCursor(0,0);
lcd.print("Velocidade (Max)");
lcd.setCursor(0,1);
lcd.print(v);
lcd.print(" rpm");
while (ctrl <= 255){
de
//Controle
da
velocidade--------------------------------------//
void controle(){
analogWrite(sent, ctrl);
delay (ctrl + 100);
if (vsp > v){
ctrl--;
if (ctrl < 0){
ctrl = 0;
}
}
if (vsp < v){
ctrl++;
if (ctrl > 255){
ctrl = 255;
}
}
displaiv();
} //Fecha controle.
//============================
=============//
//Interrupo-------------------------------------------------void tempo()
{
if (z == 0){
tempo1 = millis();
}
if (z == 1){
tempo2 = millis();
}
z++;
} //ficha tempo.
//============================
=============//
//Velocidade
proporcional-----------------------------------void velprop(){
if (di < df && vi < vf){
dmaxp = df;
dminp = di;
vmaxp = vf;
vminp = vi;
vsp = vminp + (((vmaxp - vminp)*(dsp dminp))/(dmaxp - dminp));
}
if (di > df && vi > vf){
dmaxp = di;
dminp = df;
vmaxp = vi;
vminp = vf;
vsp = vminp + (((vmaxp - vminp)*(dsp dminp))/(dmaxp - dminp));
}
if (di < df && vi > vf){
dmaxp = df;
dminp = di;
vmaxp = vi;
vminp = vf;
vsp = vmaxp - (((vmaxp - vminp)*(dsp dminp))/(dmaxp - dminp));
}
if (di > df && vi < vf){
dmaxp = di;
dminp = df;
vmaxp = vf;
vminp = vi;
vsp = vmaxp - (((vmaxp - vminp)*(dsp dminp))/(dmaxp - dminp));
}
//y = (vsp*255)/vmax;
//ctrl = y^255;
z = 0;
} //Fecha void veloprop .
//============================
=============//
//Distancias
proporcionais------------------------------------void disprop(){
if (di > df){
dmaxp = di;
dminp = df;
}
if (di < df){
dmaxp = df;
dminp = di;
}
distmedida();
if (distance <= 200 || distance >= 0){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Distancia");
if (dmaxp >= distance && distance >=
dminp){
dsp = distance;
lcd.setCursor(0,1);
lcd.print(dsp);
lcd.print(" cm (!)");
}
if (dmaxp < distance || distance < dminp){
lcd.setCursor(0,1);
lcd.print(distance);
lcd.print(" cm ");
}
}
if (distance > 200 || distance <= 0){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Distancia");
lcd.setCursor(0,1);
lcd.print("Setada = ");
lcd.print(dsp);
lcd.print(" cm");
}
delay(500);
} //Fecha dis prop.
//============================
============//
//Velocidades
fixas-------------------------------------------void velfixas(){
for (int i = 0; i < nv; i++){
if (dsp == dis[i]){
vsp = vel[i];
}
}
z = 0;
}
//============================
=============//
//Distancias
fixas
--------------------------------------------void disfixas(){
x = 0;
distmedida();
if (distance <= 200 || distance >= 0){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Distancia");
for (int i = 0; i < nv; i++){
if (distance == dis[i]){
dsp = distance;
lcd.setCursor(0,1);
lcd.print(dsp);
lcd.print(" cm (!)");
x = 1;
}
if (x == 0) {
lcd.setCursor(0,1);
lcd.print(distance);
lcd.print(" cm ");
}
}
}
if (distance > 200 || distance <= 0){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Distancia");
lcd.setCursor(0,1);
lcd.print("Setada = ");
lcd.print(dsp);
lcd.print(" cm");
}
delay(500);
} //Fecha dis fixas.
//============================
=============//
//Medio
da
distancia-----------------------------------------void distmedida(){
digitalWrite(trigPin, HIGH);
delayMicroseconds(1000);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration/2) / 29.1;
}
//============================
=============//
CRONOGRAMA FINAL
REFERNCIAS
[1]
OGATA,K.; Engenharia de Controle Moderno, Prentice-Hall
Brasil, So Paulo, 2011
[2] Texas Instruments, A430.PDF, MSP430 Assembler, Linker, and
Librarian Programming Guide, 2003
[3] Texas Instruments, SLAU049C.PDF, MSP430x1xx Family Users
Guide, 2003.
[4]
GUSSOW,M.; Eletricidade Bsica, Prentice-Hall Brasil, So
Paulo, 2005
[5]
Texas
Instruments,
MSP430f149.PDF,
MSP430x13x,
MSP430x14x Mixed Signal Microcontroller, datasheet, 2003.
[6] PEREIRA,F., Microcontroladores MSP430 - Teoria e Prtica, rica,
So Paulo, 2010.
[7] McRoberts, M.; Arduino bsico. So Paulo: Novatec, , 2011.
[8] Thomazini, D. e Albuquerque, P. U. B., Sensores Industriais:
Fundamentos e Aplicaes, rica.
DATA 30/12/2013
ASSINATURA DO ORIENTADOR ______________________________
ASSINATURA DO BOLSISTA
______________________________