// n3dohms0815.c - Criado pelo studio UNO 2.3
// 15 August 2016 7:32:15 pm
#include <uno.h>
// Defines
#define VariaGarra 5
#define tempo 10
// Declaracao das Variaveis
unsigned char AceX;
unsigned char AceY;
unsigned char AceZ;
unsigned char BtC;
unsigned char BtZ;
int EncDir;
int EncEsq;
unsigned char Garra;
unsigned int Graus;
unsigned char Ir1Limite;
unsigned char Ir5Limite;
unsigned char JoyX;
unsigned char JoyY;
int Motor_D;
int Motor_E;
unsigned int ObjetoDir;
unsigned int ObjetoEsq;
unsigned int Pulsos;
int eixo_x;
int eixo_y;
// Prototipos
void ControleMotores(void);
void RetoFrente(void);
void ControleJoy(void);
void AjusteLimites(void);
void Freio(void);
void LeEncoders(void);
void GiraEsquerda(void);
void LeRF(void);
void ControleRF(void);
void GiraDireita(void);
void Sumo(void);
void ZeraEncoders(void);
//Funcoes do Usuario
void ControleMotores(void)
{
__motor(1, Motor_E);
__motor(2, Motor_D);
if (((BtC == 1) && (Garra < 180))) {
Garra += VariaGarra;
}
if (((BtZ == 1) && (Garra > 0))) {
Garra -= VariaGarra;
}
__PWM1 = Garra;
}
void RetoFrente(void)
{
LeEncoders();
if ((EncEsq > EncDir)) {
__motor_curso(__LEFT_TURN);
}
if ((EncEsq < EncDir)) {
__motor_curso(__RIGHT_TURN);
}
if ((EncEsq == EncDir)) {
__motor_curso(__FORWARD);
}
}
void ControleJoy(void)
{
if ((JoyX < 126)) {
Graus = 5;
GiraEsquerda();
}
if ((JoyX > 130)) {
Graus = 5;
GiraDireita();
}
if ((JoyY < 126)) {
__motor_curso(__BACKWARD);
}
if ((JoyY > 130)) {
if (((__SeguidorGetAnalog(1, 2) > 20) || (__SeguidorGetAnalog(1, 4) > 20))) {
__motor_curso(__FORWARD);
}
else {
Freio();
}
}
if (((JoyX == 128) && (JoyY == 128))) {
__motor_curso(__STOP);
}
if ((BtC == 1)) {
__PWM1 = 180;
}
if ((BtZ == 1)) {
__PWM1 = 40;
}
}
void AjusteLimites(void)
{
if ((Motor_E < -1023)) {
Motor_E = -1023;
}
if ((Motor_E > 1023)) {
Motor_E = 1023;
}
if ((Motor_D < -1023)) {
Motor_D = -1023;
}
if ((Motor_D > 1023)) {
Motor_D = 1023;
}
}
void Freio(void)
{
__motor_curso(__REVERSE);
__delay(30);
__motor_curso(__STOP);
}
void LeEncoders(void)
{
EncEsq = __EncoderGetValue(1);
__delay(tempo);
EncDir = __EncoderGetValue(2);
__delay(tempo);
}
void GiraEsquerda(void)
{
ZeraEncoders();
Pulsos = (Graus / 4.9);
__motor_curso(__LEFT_ROTATE);
while((__EncoderGetValue(2) < Pulsos)) {
while(!(__EncoderGetValue(2) >= Pulsos)) { __delay(10); }
__lcd_goto(0xbf, 1);
__lcd_puts("%d", __EncoderGetValue(2));
__delay(tempo);
}
}
void LeRF(void)
{
JoyX = __ControllerGetJoystick_X(1);
__delay(tempo);
JoyY = __ControllerGetJoystick_Y(1);
__delay(tempo);
AceX = __ControllerGetAccelerometer_X(1);
__delay(tempo);
AceY = __ControllerGetAccelerometer_Y(1);
__delay(tempo);
AceZ = __ControllerGetAccelerometer_Z(1);
__delay(tempo);
BtC = __ControllerGetButton_C(1);
__delay(tempo);
BtZ = __ControllerGetButton_Z(1);
__delay(tempo);
}
void ControleRF(void)
{
eixo_x = ((JoyX - 128) * 8);
eixo_y = ((JoyY - 128) * 8);
Motor_E = (eixo_x + eixo_y);
Motor_D = (eixo_y - eixo_x);
AjusteLimites();
ControleMotores();
}
void GiraDireita(void)
{
ZeraEncoders();
Pulsos = (Graus / 4.9);
__motor_curso(__RIGHT_ROTATE);
while((__EncoderGetValue(1) < Pulsos)) {
while(!(__EncoderGetValue(1) >= Pulsos)) { __delay(10); }
__lcd_goto(0xbf, 9);
__lcd_puts("%d", __EncoderGetValue(1));
__delay(tempo);
}
}
void Sumo(void)
{
Garra = 180;
Graus = 90;
Ir1Limite = (__SeguidorGetAnalog(1, 1) - 18);
Ir5Limite = (__SeguidorGetAnalog(1, 5) - 18);
while(TRUE) {
__motor_curso(__FORWARD);
if ((__SeguidorGetAnalog(1, 1) < Ir1Limite)) {
__motor_curso(__BACKWARD);
__delay(400);
Freio();
__delay(400);
GiraDireita();
}
if ((__SeguidorGetAnalog(1, 5) < Ir5Limite)) {
__motor_curso(__BACKWARD);
__delay(400);
Freio();
__delay(400);
GiraEsquerda();
}
}
}
void ZeraEncoders(void)
{
__SmartSensorCmd(1, 1, 9, 0);
__delay(tempo);
__SmartSensorCmd(1, 2, 9, 0);
__delay(tempo);
}
//Funcao Principal
void main(void)
{
__inicializa;
__SmartSensorCmd(1, 1, 8, 0);
bitset(__TRIS_PWM, __DIGITAL2);
bitset(__TRIS_PWM, __DIGITAL3);
__PWM2 = 90;
__PWM3 = 20;
ZeraEncoders();
Graus = 90;
while(TRUE) {
RetoFrente();
if ((__UltrasonicGetValueMM(1) < 300)) {
Freio();
// Olho pra direita
__PWM2 = 0;
__delay(1000);
ObjetoDir = __UltrasonicGetValueMM(1);
// Olho pra esquerda
__PWM2 = 180;
__delay(1000);
ObjetoEsq = __UltrasonicGetValueMM(1);
// Olho pra frente
__PWM2 = 90;
__delay(1000);
if ((ObjetoEsq > ObjetoDir)) {
GiraEsquerda();
}
else {
GiraDireita();
}
ZeraEncoders();
}
}
while(TRUE) { }
}