2013-09-05 2 views
1

Я использую Arduino Uno для создания очень простого робота, который движется вперед и когда он воспринимает какой-либо предмет (используя датчик расстояния HC-SR04), он перестает двигаться. Основание робота - 4 колеса и двигатель постоянного тока, прикрепленный с каждым колесом. Я использую контакты 1, 2, 3, 4 для управления двигателями 1, 2, 3, 4 соответственно. Штыри 7, 8 используются для штырей Echo и Trig датчика расстояния HC-SR04.Arduino: Serial.begin() конфликтует с кодом для запуска двигателя постоянного тока

Для этого я написал следующий код

#define m1p1 1 
#define m1p2 2 
#define m2p1 3 
#define m2p2 4 

#define echoPin 7 // Echo Pin 
#define trigPin 8 // Trigger Pin 
#define LEDPin 13 // Onboard LED 

int maximumRange = 200; // Maximum range needed 
int minimumRange = 4; // Minimum range needed 
long duration, distance; // Duration used to calculate distance 

void setup() 
{ 
    Serial.begin(9600); 
    pinMode(m1p1, OUTPUT); 
    pinMode(m1p2, OUTPUT); 
    pinMode(m2p1, OUTPUT); 
    pinMode(m2p2, OUTPUT); 

    pinMode(trigPin, OUTPUT); 
    pinMode(echoPin, INPUT); 
    pinMode(LEDPin, OUTPUT); // Use LED indicator (if required) 

} 

void loop() 
{ 
//Code to run motors forward 
digitalWrite(m1p1, LOW); 
digitalWrite(m1p2, HIGH); 
digitalWrite(m2p1, HIGH); 
digitalWrite(m2p2, LOW); 

//Code of distance sensor 
digitalWrite(trigPin, LOW); 
delayMicroseconds(2); 

digitalWrite(trigPin, HIGH); 
delayMicroseconds(10); 

digitalWrite(trigPin, LOW); 
duration = pulseIn(echoPin, HIGH); 

//Calculate the distance (in cm) based on the speed of sound. 
distance = duration/58.2; 

if (distance >= maximumRange || distance <= minimumRange){ 
    Serial.println("-1"); 

    //Code to stop motors 
    digitalWrite(m1p1, LOW); 
    digitalWrite(m1p2, LOW); 
    digitalWrite(m2p1, LOW); 
    digitalWrite(m2p2, LOW); 
} 
else { 
/* Send the distance to the computer using Serial protocol, and 
    turn LED OFF to indicate successful reading. 
*/ 
Serial.println(distance); 
digitalWrite(LEDPin, LOW); 
} 

//Delay 50ms before next reading. 
delay(50); 

}

Проблема в том, я думаю, с линией, которая содержит Serial.begin(9600), потому что когда я удалить эту линию, то все двигатели работают правильно и робот работает в прямом направлении, но когда я пишу эту линию, то только 2 двигателя работают плавно, а 2 двигателя работают очень медленно (почти кажется, что они не работают), поэтому вместо того, чтобы двигаться вперед, робот непрерывно поворачивается.

Может ли кто-нибудь сказать, что может быть проблемой и как ее решить.

ответ

2

Последовательный порт использует выводы 0 и 1, как указано в первом абзаце серийных документов:

http://arduino.cc/en/reference/serial

Так для двигателей вы должны выбрать некоторые другие контакты.

+0

Большое спасибо. Это была проблема, и она решена. – swdeveloper

1

От http://arduino.cc/en/Main/arduinoBoardUno:

Кроме того, некоторые контакты имеют специализированные функции:

Серийный: 0 (RX) и 1 (TX). Используется для приема (RX) и передачи (TX) последовательных данных TTL. Эти контакты подключены к соответствующим контактам USB-to-TTL последовательного чипа ATmega8U2.

Serial использует контакты 0 и 1. Поэтому вы не можете использовать их в другом назначении в одно и то же время. Я предлагаю вам использовать другие контакты для управления двигателями (например, от 2 до 5).