#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