Hi. This project is an experiment to realize control of DC motors through USB serial communication. I used Arduino and L298N motor shield.
Required Components: 1. Two 9V motors with reduction box and Three whells; 2. Motor shield L298N; 3. Arduino UNO; 4. Wires; 5. 12V DC font; Laptop; 6. Patient (a lot).
Setting Up Arduino IDE
Nothing special in this step.
Wiring
The idea is use first short leg’s led to join ground wiring, and put each other leg’s led with a resistor an Arduino pin.
Serial communication:
Source code based on:
https://niltonfelipe.wordpress.com/2015/05/03/arduino-conexao-a-internet-sem-ethernet-shield/
Modified by: Lucio Agostinho Rocha
Last update: 02/08/2016
--------------------------------------
1) Download RXTX API Java Serial to 64 bits platforms:
(a version is on 'bibliotecasJavaRXTX_64bits'):
http://fizzed.com/oss/rxtx-for-java
2) Unzip 'mfz-rxtx-2.2-20081207-win-x64.zip'.
Copy RXTXcomm.jar ---> <JAVA_HOME>\jre\lib\ext
Copy rxtxSerial.dll ---> <JAVA_HOME>\jre\bin
Copy rxtxParallel.dll ---> <JAVA_HOME>\jre\bin
3) Deploy 'ligarMotores.ino' in Arduino IDE, and close it.
4) Run Java aplication. Remember to close Arduino IDE before start Java application to avoid that both applications use the same USB serial port.
Known Bugs:
- Linux: this RXTX API Java serial not worked in Ubuntu 14.04. After copying files (see Linux install in the RXTX API zipped folder), serial port is not displayed any more in Arduino IDE (only returns when I remove the API Java RXTX).
Arduino sketch:
/*
Programa para ligar motores via porta serial do Arduino
Autor: Lucio Agostinho Rocha
Ultima atualizacao: 01/08/2016
*/
int LED = 13; //pino do led
int IN3 = 10; //IN3 motor = pino 10 no arduino
int IN4 = 11;
int ENB = 9; // ENB eh o pino de controle de velocidade no motor
int IN1 = 6; //IN1 motor = pino 6 no arduino
int IN2 = 5;
int ENA = 3; // ENA eh o pino de controle de velocidade no motor
int TEMPO = 300; //Tempo do movimento
void setup() {
Serial.begin(9600); //Inicializa comunicação Serial
pinMode(LED, OUTPUT);//Seta como saida
pinMode(ENA, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(ENB, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
}
void loop() {
//espera um char na serial
char c = Serial.read();
switch (c) {
//roda1 +
case '1':
//Acende o led
digitalWrite(LED, HIGH);
//Prepara a saida do motor
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
analogWrite(ENA, 255);
delay(TEMPO);
//Desliga o motor
analogWrite(ENA, 0);
//Acende o led
digitalWrite(LED, LOW);
break;
//roda1 -
case '2':
//Acende o led
digitalWrite(LED, HIGH);
//Prepara a saida do motor
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
analogWrite(ENA, 255);
delay(TEMPO);
//Desliga o motor
analogWrite(ENA, 0);
//Acende o led
digitalWrite(LED, LOW);
break;
//roda2 +
case '3':
//Acende o led
digitalWrite(LED, HIGH);
//Prepara a saida do motor
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
analogWrite(ENB, 255);
delay(TEMPO);
//Desliga o motor
analogWrite(ENB, 0);
//Acende o led
digitalWrite(LED, LOW);
break;
//roda2 -
case '4':
//Acende o led
digitalWrite(LED, HIGH);
//Prepara a saida do motor
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
analogWrite(ENB, 255);
delay(TEMPO);
//Desliga o motor
analogWrite(ENB, 0);
//Acende o led
digitalWrite(LED, LOW);
break;
//roda1 e roda2 +
case '5':
//Acende o led
digitalWrite(LED, HIGH);
//Prepara a saida do motor
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
analogWrite(ENA, 255);
//Prepara a saida do motor
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
analogWrite(ENB, 255);
delay(2*TEMPO);
//Desliga o motor
analogWrite(ENA, 0);
//Desliga o motor
analogWrite(ENB, 0);
//Acende o led
digitalWrite(LED, LOW);
break;
//roda1 e roda2 -
case '6':
//Acende o led
digitalWrite(LED, HIGH);
//Prepara a saida do motor
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
analogWrite(ENA, 255);
//Prepara a saida do motor
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
analogWrite(ENB, 255);
delay(2*TEMPO);
//Desliga o motor
analogWrite(ENA, 0);
//Desliga o motor
analogWrite(ENB, 0);
//Acende o led
digitalWrite(LED, LOW);
break;
default:
digitalWrite(LED, LOW);
//Desliga o motor
analogWrite(ENA, 0);
//Desliga o motor
analogWrite(ENB, 0);
}//fim switch
}
Java source code
- I put the java source code here https://sourceforge.net/projects/serialportjavaarduino.
Final remarks
I observed that send one movement to each wheel is better than give two at same time. Sometimes Arduino seems unable to move both wheels at same time, but works. I guess that is something about restrictions of L298N motor shield jointly with Arduino. I solved stuck movements as follow: send individual movements to each wheel, and then give a command to move both at same time. Thanks. Please, give me suggestions about this text.
Comments