Usei no exemplo o modelo SN754410, mais conhecido como ponte H ou H bridge. Este chip que serve para controlar até dois motores com o limite de 1000mA e 36v.
O datasheet pode ser encontrado aqui na sparkfun.com.
O código abaixo também está disponível (talvez em versão mais recente no github.)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
boolean
switchOutputAllow = true;
int
switchAction = LOW,
valueButtonSwitch = LOW,
valueButtonTurn = 0;
const int
turnPin = A0, //
switchPin = 2, // button
motor1Pin1 = 3, // motor 1 direction 1
motor1Pin2 = 4, // motor 1 direction 2
motor1Enga = 6, // motor 1 on/off
motor2Pin1 = 9, // motor 2 direction 1
motor2Pin2 = 10, // motor 2 direction 2
motor2Enga = 12, // motor 2 on/off
switchOutputLed = 13; // motor on/off led
void setup() {
Serial.begin(9600);
pinMode(turnPin, INPUT);
pinMode(switchPin, INPUT);
pinMode(motor1Pin1, OUTPUT);
pinMode(motor1Pin2, OUTPUT);
pinMode(motor1Enga, OUTPUT);
pinMode(motor2Pin1, OUTPUT);
pinMode(motor2Pin2, OUTPUT);
pinMode(motor2Enga, OUTPUT);
pinMode(switchOutputLed, OUTPUT);
// rodar motor 1 em sentido horario
digitalWrite(motor1Pin1, LOW);
digitalWrite(motor1Pin2, HIGH);
digitalWrite(motor1Enga, LOW);
// rodar motor 2 em sentido anti-horario
digitalWrite(motor2Pin1, HIGH);
digitalWrite(motor2Pin2, LOW);
digitalWrite(motor2Enga, LOW);
// led smd desligado
digitalWrite(switchOutputLed, LOW);
}
void loop() {
// read what is needed
valueButtonSwitch = digitalRead(switchPin);
valueButtonTurn = map(analogRead(turnPin), 0, 1023, 0, 255);
///////////////////////////////////////
// check if button was pressed
if(valueButtonSwitch == LOW && switchOutputAllow == true)
{
switchOutputAllow = false;
if(switchAction == LOW)
{
switchAction = HIGH;
}
else
{
switchAction = LOW;
}
}
// check if button was released
if(valueButtonSwitch == HIGH && switchOutputAllow == false)
{
switchOutputAllow = true;
}
// set values from switch
digitalWrite(motor1Enga, switchAction);
digitalWrite(motor2Enga, switchAction);
digitalWrite(switchOutputLed, switchAction);
///////////////////////////////////////
// check position of turn button to set motor rotation
if(valueButtonTurn > 170)
{
digitalWrite(motor1Pin1, LOW);
digitalWrite(motor1Pin2, HIGH);
digitalWrite(motor2Pin1, LOW);
digitalWrite(motor2Pin2, HIGH);
}
else if(valueButtonTurn < 85)
{
digitalWrite(motor1Pin1, HIGH);
digitalWrite(motor1Pin2, LOW);
digitalWrite(motor2Pin1, HIGH);
digitalWrite(motor2Pin2, LOW);
}
else
{
//digitalWrite(motor1Enga, LOW);
//digitalWrite(motor2Enga, LOW);
digitalWrite(motor1Pin1, LOW);
digitalWrite(motor1Pin2, HIGH);
digitalWrite(motor2Pin1, HIGH);
digitalWrite(motor2Pin2, LOW);
}
///////////////////////////////////////
// set output
Serial.print("Status: ");
Serial.print((switchAction == 1 ? "ON " : "OFF"));
Serial.print(" | Turn: ");
Serial.print(valueButtonTurn);
Serial.print("\n");
}
Dessa forma é possível controlar a direção dos motores e ligar/desligar quando quiser apenas pelo código passando sinal para o chip nos pontos certos.

Olá,
Primeiro deixa eu dizer, eu adorei o blog ele é bem bolado!!! meus parabens!!
Deixa agora eu pedir um help, srsrsrs
Estou tendo uma dificuldade em montar a estrutura eletrônica de um robô de sumo, para complementação de uma nota da faculdade, não pretendo neste momento montar fisicamente o robô, apenas a parte de controle (que pode ser através de arduino) e a parte de potência (a ponte H com o PWM para 02 motores).
O que necessito fazer é:
Montar um circuito no proteus e depois programar na placa de circuito, o sistema devera funcionar assim: liga o robô ele fica 5 segundos parado e depois sair à meia velocidade um sensor vai verificando se ele ainda está na arena e outro vai tentando localizar o inimigo, se ele chegar próximo de sair da área ele deve parar e der a ré e depois mudar o sentido e continuar a meia velocidade, ao localizar o inimigo ele deve atingir a velocidade máxima e tentar derrubar da arena.
Você pode me ajudar?
Obrigado!!!
Obrigado! Quem bom que gostou.
Adoraria ajudar, mas saindo do arduino realmente não sei muito, nunca tentei usar PIC ou o PROTEUS acho que é mais complicado e diferente.
Trabalhar com arduino é bastante facilitado e a programação é simples e ele é bastante resistente a erros, e é sempre fácil encontrar código pela internet que vá te ajudar ou até resolver o seu problema.
Para a detecção dos seus “inimigos” eu recomendo sensores de distância como esse da seeedstudio. Sobre você sair da arena talvez fosse interessante você ver como funcionam os robos seguidores de linha, dá para fazer algo bem legal, mas depende do ambiente. Se esse for o caso eu recomendo você primeiro programar ele a não sair da arena e depois tentar empurrar o adversário para fora.
Boa sorte e ajudo como puder!