Робот на основе ультразвукового дальномера SR-04 и платформы Arduino
Совместимый с Arduino блок двигателя, который может работать с 2 сервоприводами и 2 шаговыми или 4 постоянного тока. Блок использует ИС регистры сдвига. Соединение выглядит следующим образом.
Совет по смене регистра-
- Цифровой контакт 8 - Штырь данных
- Цифровой контакт 12 - Защелка
- Цифровой контакт 4 - Clock Pin
- Цифровой контакт 7 - контактный контакт
Регистр сдвига в Motors
- Q0 - M3 A
- Q1 - M2 A
- Q2 - M1 A
- Q3 - M1 B
- Q4 - M2 B
- Q5 - M4 A
- Q6 - M3 B
- Q7 - M4 B
Вот библиотека, чтобы использовать этот датчик. Вы можете скачать его здесь .
Как только вы загрузите эту библиотеку. Извлеките это и скопируйте папку в Мои документы / Arduino / Libraries или другие аналогичные местоположения. После сборки робота сделайте соединение, как показано на следующей диаграмме. Перемычка питания на защитном кожухе двигателя работает как «Переключение на двигатель», она будет полезна при отладке.
После сборки робот будет выглядеть
Трудно найти GND и положительный вывод питания двигателя. Передайте следующий код в Совет Arduino. Робот должен двигаться в прямом направлении, если он этого не делает, замените провод двигателя. например, если левый двигатель вращается в обратном направлении, а правый двигатель вращается в прямом направлении, тогда вам необходимо поменять провода на клемме M3.
//Robo India Robotic Motion Tutorial
// This codes runs robot in the forward direction.
// Shield Pins Declaration
int dataPin = 8;
int latchPin = 12;
int clockPin = 4;
int en = 7;
void setup()
{
pinMode(dataPin, OUTPUT); // Setting up the motor shield.
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(en, OUTPUT);
digitalWrite(en, LOW);
forward(); // This funtion for forward robot motion
}
void loop()
{
}
void forward(void){
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, 3);
digitalWrite(latchPin, HIGH);
}
void backward(void){
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, 164);
digitalWrite(latchPin, HIGH);
}
void turn_left(void){
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, 161);
digitalWrite(latchPin, HIGH);
}
void turn_right(void){
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, 38);
digitalWrite(latchPin, HIGH);
}
void halt(void){
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, 32);
digitalWrite(latchPin, HIGH);
}
До этого шага вы сделали все соединение, и ваши двигатели подключены к правильным клеммам. Следующая программа основана на следующем алгоритме.
Это очень простой алгоритм для предотвращения препятствий роботу. Мы сохранили это просто, чтобы новички могли понять концепцию. Вы можете улучшить программу, улучшив алгоритм.
Он имеет следующую предопределенную функцию для движения робота -
1. forward (): движение вперед робота.
2. назад (): назад движение робота.
3. turn_left (): для поворота влево.
4. turn_right (): для поворота направо.
5. halt (): для остановки робота.
// Tutorial Obstacle avoiding robot
// Prepared by Robo India
// www.roboindia.com
#include <Servo.h> // Includes servo library.
#include // Includes SR-04 Sensor Library.
Ultrasonic ultrasonic(A0,A1); // (Trig PIN,Echo PIN)
Servo servo_1; // Creating Servo object.
// declaring Motor Shield
int dataPin = 8;
int latchPin = 12;
int clockPin = 4;
int en = 7;
// Variable to store distance
int left_d = 0;
int right_d = 0;
int front_d = 0;
int max_d = 50; // Max distance to obastacle
void setup()
{
// setting up shield.
pinMode(dataPin, OUTPUT);
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(en, OUTPUT);
digitalWrite(en, LOW);
servo_1.attach(10); // Attaching servo to Pin No.10
servo_1.write(90); // Initial position
delay(350);
}
void loop()
{
front_d = ultrasonic.Ranging(CM); // measuring fornt distance
if (front_d < max_d)
{
halt();
get_d();
if(right_d > max_d)
{
turn_right();
delay(400);
forward();
}
else if ( left_d > max_d)
{
turn_left();
delay(400);
forward();
}
else {
backward();
delay (500);
halt();
}
}
else{
forward();
}
}
void forward(void){ // function for forward movement.
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, 3);
digitalWrite(latchPin, HIGH);
}
void backward(void){ // function for forward movement.
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, 164);
digitalWrite(latchPin, HIGH);
}
void turn_left(void){ // function for left turn.
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, 161);
digitalWrite(latchPin, HIGH);
}
void turn_right(void){ // function for Right turn.
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, 38);
digitalWrite(latchPin, HIGH);
}
void halt(void){ // function for stopping robot.
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, 32);
digitalWrite(latchPin, HIGH);
}
void get_d(void) // Fuction to get distances.
{
servo_1.write(0); // Right Position
delay(500);
right_d = ultrasonic.Ranging(CM);
servo_1.write(90); // Front Positon
delay(500);
front_d = ultrasonic.Ranging(CM);
servo_1.write(180); // Left position of servo
delay(500);
left_d = ultrasonic.Ranging(CM);
servo_1.write(90); // back to front
delay(250);
}