sábado, 14 de dezembro de 2013

CODIGO ARDUINO 4WD

   #include <Servo.h>

//  pinos do Arduino para o registrador de deslocamento

#define MOTORLATCH 12
#define MOTORCLK 4
#define MOTORENABLE 7
#define MOTORDATA 8


// Estes são usados ​​para definir a direção do motorista ponte.
#define MOTOR1_A 2
#define MOTOR1_B 3
#define MOTOR2_A 1
#define MOTOR2_B 4
#define MOTOR3_A 5
#define MOTOR3_B 7
#define MOTOR4_A 0
#define MOTOR4_B 6

// pinos do Arduino para os sinais PWM.
#define MOTOR1_PWM 11
#define MOTOR2_PWM 3
#define MOTOR3_PWM 6
#define MOTOR4_PWM 5

// Códigos para a função de motor.
#define FORWARD 1
#define BACKWARD 2
#define BRAKE 3
#define RELEASE 4


const byte PIN_BUTTON_RIGHT = 10;
const byte PIN_BUTTON_UP = 9;
const byte PIN_BUTTON_DOWN = 2;
const byte PIN_BUTTON_LEFT = 13;

void setup()
{
  Serial.begin(9600);
  Serial.println("Simple Adafruit Motor Shield sketch");

  pinMode(PIN_BUTTON_RIGHT, INPUT);
  digitalWrite(PIN_BUTTON_RIGHT, HIGH);

  pinMode(PIN_BUTTON_LEFT, INPUT);
  digitalWrite(PIN_BUTTON_LEFT, HIGH);

  pinMode(PIN_BUTTON_UP, INPUT);
  digitalWrite(PIN_BUTTON_UP, HIGH);

  pinMode(PIN_BUTTON_DOWN, INPUT);
  digitalWrite(PIN_BUTTON_DOWN, HIGH);

}



void loop()
{


if (digitalRead(PIN_BUTTON_LEFT) == LOW) {  //ESQUERDA
    // Button is pressed
   
  motor(1, BACKWARD, 250);
  delay(1);
  motor(2, FORWARD, 250);
  delay(1);
  motor(3, BACKWARD, 250);
  delay(1);
  motor(4, FORWARD, 250);
  delay(1);
 //else
   // Button is not pressed
}
if (digitalRead(PIN_BUTTON_RIGHT) == LOW) {  //DIREITA
    // Button is pressed
   
  motor(1, FORWARD, 250);
  delay(1);
  motor(2, BACKWARD, 250);
  delay(1);
  motor(3, FORWARD, 250);
  delay(1);
  motor(4, BACKWARD, 250);
  delay(1);
 
} else {
   // Button is not pressed
}
if (digitalRead(PIN_BUTTON_UP) == LOW) {
  // Button is pressed
  motor(1, FORWARD, 250);
  delay(1);
  motor(2, FORWARD, 250);
  delay(1);
  motor(3, FORWARD, 250);
  delay(1);
  motor(4, FORWARD, 250);
  delay(1);
} else {
   // Button is not pressed
}
if (digitalRead(PIN_BUTTON_DOWN) == LOW) {
  // Button is pressed
  motor(1, BACKWARD, 250);
  delay(1);
  motor(2, BACKWARD, 250);
  delay(1);
  motor(3, BACKWARD, 250);
  delay(1);
  motor(4, BACKWARD, 250);
  delay(1);
//else {
   // Button is not pressed
//}
}
  Serial.println();
/*
  motor(1, BACKWARD, 250);
  delay(1);
  motor(2, BACKWARD, 250);
  delay(1);
  motor(3, BACKWARD, 250);
  delay(1);
  motor(4, BACKWARD, 250);
  delay(1); */
}

void motor(int nMotor, int command, int speed)
{
  int motorA, motorB;

  if (nMotor >= 1 && nMotor <= 4)
  {
    switch (nMotor)
    {
    case 1:
      motorA   = MOTOR1_A;
      motorB   = MOTOR1_B;
      break;
    case 2:
      motorA   = MOTOR2_A;
      motorB   = MOTOR2_B;
      break;
    case 3:
      motorA   = MOTOR3_A;
      motorB   = MOTOR3_B;
      break;
    case 4:
      motorA   = MOTOR4_A;
      motorB   = MOTOR4_B;
      break;
    default:
      break;
    }

    switch (command)
    {
    case FORWARD://(frente)
      motor_output (motorA, HIGH, speed);
      motor_output (motorB, LOW, -1);     // -1: no PWM set
      break;
    case BACKWARD:
      motor_output (motorA, LOW, speed);
      motor_output (motorB, HIGH, -1);    // -1: no PWM set
      break;
    case BRAKE:
      motor_output (motorA, LOW, 255); //255: totalmente em
      motor_output (motorB, LOW, -1);  // -1: no PWM set
      break;
    case RELEASE:
      motor_output (motorA, LOW, 0);  // 0: output floating(flutuante saida).
      motor_output (motorB, LOW, -1); // -1: no PWM set
      break;
    default:
      break;
    }
  }
}
void motor_output (int output, int high_low, int speed)
{
  int motorPWM;

  switch (output)
  {
  case MOTOR1_A:
  case MOTOR1_B:
    motorPWM = MOTOR1_PWM;
    break;
  case MOTOR2_A:
  case MOTOR2_B:
    motorPWM = MOTOR2_PWM;
    break;
  case MOTOR3_A:
  case MOTOR3_B:
    motorPWM = MOTOR3_PWM;
    break;
  case MOTOR4_A:
  case MOTOR4_B:
    motorPWM = MOTOR4_PWM;
    break;
  default:
    //Usar a velocidade como sinalizador de erro, -3333 = saída inválido.
    speed = -3333;
    break;
  }
 if (speed != -3333)
  {
    shiftWrite(output, high_low);
    // definir PWM somente se ela é válida se
    if (speed >= 0 && speed <= 255)  
    {
      analogWrite(motorPWM, speed);
    }
  }
}

void shiftWrite(int output, int high_low)
{
  static int latch_copy;
  static int shift_register_initialized = false;

 // Faz a inicialização em tempo real,
 // Na primeira vez que é utilizado.
  if (!shift_register_initialized)
  {
   // Definir pinos para registro de deslocamento para a saída
    pinMode(MOTORLATCH, OUTPUT);
    pinMode(MOTORENABLE, OUTPUT);
    pinMode(MOTORDATA, OUTPUT);
    pinMode(MOTORCLK, OUTPUT);

    // Definir pinos para registro de deslocamento para o valor padrão (baixo);
    digitalWrite(MOTORDATA, LOW);
    digitalWrite(MOTORLATCH, LOW);
    digitalWrite(MOTORCLK, LOW);
   // Ativar o registo de deslocamento, defina Ativar pin Baixo
    digitalWrite(MOTORENABLE, LOW);

    // Inicia com todas as saídas (da mudança de registo) baixa
    latch_copy = 0;

    shift_register_initialized = true;
  }

 // A define alta e baixa são 1 e 0.
 // Então, isso é válido.
  bitWrite(latch_copy, output, high_low);

  // Use o default 'shiftOut ()' Arduino função
  // Mudar os bits com o MOTORCLK como relógio de pulso.
  // O 74HC595 shiftregister quer o MSB primeiro.
  // Depois disso, gerar um pulso trava com MOTORLATCH.
  shiftOut(MOTORDATA, MOTORCLK, MSBFIRST, latch_copy);
  delayMicroseconds(5);   // Para sua segurança, não é realmente necessário.
  digitalWrite(MOTORLATCH, HIGH);
  delayMicroseconds(5);    // Para sua segurança, não é realmente necessário.
  digitalWrite(MOTORLATCH, LOW);
}

Nenhum comentário:

Postar um comentário