Agora que já temos o carrinho funcionando, vamos adicionar um módulo para permitir o controle por meio de Bluetooth.
Para isso, precisamos ligar o módulo. Como estamos utilizando um módulo shield de controle de motores (veja _aqui_ como está a ligação), e já utilizamos algumas das portas disponÃveis, vamos usar agora a porta digital 2 e a porta analógica 3 para a ligação do módulo. Vai ficar assim:

Não foram apresentadas as ligações anteriores (do sensor de ultrassom e do controle remoto, para a imagem ficar mais limpa. O módulo de controle de motores utiliza quase todas as conexões, ele só não utiliza os pinos digitais 2 e 13 e os pinos analógicos A0 até A5; mas, já usamos os pinos A0, A1 e A2, e reservamos os pinos A4 e A5 para conexões do tipo I2C. Assim, sobraram os pinos digitais 2 e 13 e o pino analógico A3; foi feita a escolha pelos pinos digital 2 e analógico 3, por isso a ligação ficou como apresentada.
A seguir, uma visão do cabo de conexão do modem bluetooth:

O motivo de utilizarmos um diodo Zener é que o módulo bluetooth possui, em sua conexão de recepção de dados, Rx, uma tensão máxima de 3,3V, enquanto o Arduino entrega 5V (uma configuração comum é a utilização de divisores de tensão utilizando resistores, mas preferi colocar um diodo pois ele estabiliza realmente a tensão).
E o código?
Agora o código será composto de duas partes: a parte de controle do Arduino e a parte do App. Vamos ver cada uma delas.
1 – Código no Arduino
#include <AFMotor.h> //biblioteca ‘Adafruit Motor Shield library’ para controle dos motores #include <SoftwareSerial.h> //biblioteca de comunicação serial #define RX 2 //pino 2 (será usado como RX pelo software - deve ser ligado no Tx do modem) #define TX A3 //pino 3 (será usado como TX pelo software - deve ser ligado no Rx do modem) SoftwareSerial bluetooth(RX, TX); //cria um objeto de comunicação serial char controle = '0'; //para armazenar o caractere recebido AF_DCMotor mEsq(3); //AF_DCMotor é o objeto; mEsq o nome da variável; '3' foi a porta escolhida AF_DCMotor mDir(4); //motor 'mDir' ligado na porta 4 void setup() { bluetooth.begin(9600); //inicializa o objeto bluetooth a 9600bps pinMode(LED_BUILTIN, OUTPUT); //este é o LED da placa, porta digital 13 digitalWrite(LED_BUILTIN, LOW); //inicia com o LED desligado //velocidade inicial - vai de 0 até 255 mEsq.setSpeed(150); mDir.setSpeed(150); //parar os motores mEsq.run(RELEASE); //'run' controla o motor e o parâmetro 'RELEASE' desliga o motor mDir.run(RELEASE); controle = 0; } void loop() { if(bluetooth.available()) { //se houver dados na interface serial na qual está o bluetooth controle = bluetooth.read(); //lê os dados vindos do bluetooth e coloca na variável 'controle' switch (controle){ case 0: //este valor ser enviado pelo App, você pode trocar mEsq.run(RELEASE); //'RELEASE' desliga o motor mDir.run(RELEASE); break; case 1: mEsq.run(BACKWARD); //motor no sentido 'para frente' mDir.run(BACKWARD); break; case 2: mEsq.run(FORWARD); //motor no sentido 'para trás' mDir.run(FORWARD); break; case 3: mEsq.run(FORWARD); //esquerda mDir.run(RELEASE); break; case 4: mEsq.run(BACKWARD); //direita mDir.run(RELEASE); break; } } }
(se você comparar com o código utilizado para o controle remoto _aqui_ verá que a estrutura é a mesma).
2 – Código do App

Baixe ( controleCarrinhoBluetoothSenhorinha ) o conjunto de códigos.