Project Self-propelled car

Noorem Tarkvaraarendaja eriala

Компоненты:

  1. Arduino Nano
  2. Драйвер L9110S
  3. Аккумулятор 2x3000mAh
  4. DC Motor 2x (для Arduino)
  5. Колесо 4x (для Arduino)
  6. Micro servo (мотор) MG90S
  7. Переключатель
  8. Ultrasonic Sensor HC-SR04
  9. Провод ~30x

Галерея:

Схема:

На схеме другой драйвер, поэтому он не подключен.

Рабочий процесс:

В самом начале мы договорились на том что-бы сделать сначала машинку, и только потом думать что добавить. Так и действовали, используя уже имеющиеся компоненты Arduino. Когда встала проблема с тем что сенсор недостаточно далеко видит, мы сделали держатель используя 3D-ручку и отвёртку. На уроке решили что поставим ещё один сенсор так как возникли проблемы с тем что он поворачивает в одну сторону, к чемпионату не успели доделать.

Старый код (который на машинке был на чемпионате):

#include <Servo.h>
#include <NewPing.h>
 
const int LeftMotorForward = 8;
const int LeftMotorBackward = 7;
const int RightMotorForward = 5;
const int RightMotorBackward = 6;
 
#define trig_pin 3
#define echo_pin 4
 
#define maximum_distance 200
boolean goesForward = false;
int distance = 100;
 
NewPing sonar(trig_pin, echo_pin, maximum_distance);
Servo servo_motor;
 
void setup(){
  pinMode(RightMotorForward, OUTPUT);
  pinMode(LeftMotorForward, OUTPUT);
  pinMode(LeftMotorBackward, OUTPUT);
  pinMode(RightMotorBackward, OUTPUT);
  servo_motor.attach(2); //Пин подключения сервомотора
  servo_motor.write(115);
  delay(2000);
  distance = readPing();
  delay(100);
  distance = readPing();
  delay(100);
  distance = readPing();
  delay(100);
  distance = readPing();
  delay(100);
}
 
void loop(){
  int distanceRight = 0;
  int distanceLeft = 0;
  delay(50);
 
  if (distance <= 20){
    moveStop();
    delay(300);
    moveBackward();
    delay(400);
    moveStop();
    delay(300);
    distanceRight = lookRight();
    delay(300);
    distanceLeft = lookLeft();
    delay(300);
 
    if (distance > distanceLeft){
      turnRight();
      turnRight();
    } else if (distance < distanceLeft){
      turnLeft();
      turnLeft();
    } else if (distance = distanceLeft) {
      turnLeft();
      turnRight();
    }
  }
  else{
    moveForward(); 
  }
    distance = readPing();
}
 
int lookRight(){  
  servo_motor.write(50);
  delay(200);
  int distance = readPing();
  delay(100);
  servo_motor.write(115);
  return distance;
}
 
int lookLeft(){
  servo_motor.write(170);
  delay(200);
  int distance = readPing();
  delay(100);
  servo_motor.write(115);
  return distance;
  delay(100);
}
 
int readPing(){
  delay(70);
  int cm = sonar.ping_cm();
  if (cm==0){
    cm=250;
  }
  return cm;
}
 
void moveStop(){  
  digitalWrite(RightMotorForward, LOW);
  digitalWrite(LeftMotorForward, LOW);
  digitalWrite(RightMotorBackward, LOW);
  digitalWrite(LeftMotorBackward, LOW);
}
 
void moveForward(){
  if(!goesForward){
 
    goesForward=true;
     
    digitalWrite(LeftMotorForward, HIGH);
    digitalWrite(RightMotorForward, HIGH);
   
    digitalWrite(LeftMotorBackward, LOW);
    digitalWrite(RightMotorBackward, LOW); 
  }
}
 
void moveBackward(){
  goesForward=false;
 
  digitalWrite(LeftMotorBackward, HIGH);
  digitalWrite(RightMotorBackward, HIGH);
   
  digitalWrite(LeftMotorForward, LOW);
  digitalWrite(RightMotorForward, LOW);  
}
 
void turnRight(){
  digitalWrite(LeftMotorForward, HIGH);
  digitalWrite(RightMotorBackward, HIGH);
   
  digitalWrite(LeftMotorBackward, LOW);
  digitalWrite(RightMotorForward, LOW);
   
  delay(500);
   
  digitalWrite(LeftMotorForward, HIGH);
  digitalWrite(RightMotorForward, HIGH);
   
  digitalWrite(LeftMotorBackward, LOW);
  digitalWrite(RightMotorBackward, LOW);  
}
 
void turnLeft(){
  digitalWrite(LeftMotorBackward, HIGH);
  digitalWrite(RightMotorForward, HIGH);
   
  digitalWrite(LeftMotorForward, LOW);
  digitalWrite(RightMotorBackward, LOW);
 
  delay(500);
   
  digitalWrite(LeftMotorForward, HIGH);
  digitalWrite(RightMotorForward, HIGH);
   
  digitalWrite(LeftMotorBackward, LOW);
  digitalWrite(RightMotorBackward, LOW);
}

Новый код (для недоделанной машики с двумя сенсорами):

#include <Servo.h>
#include <NewPing.h>
 
#define LeftMotorForward = 8;
#define LeftMotorBackward = 7;
#define RightMotorForward = 5;
#define RightMotorBackward = 6;
 
#define ServoMotorLeftPin = 2;
#define ServoMotorRightPin = 11;
 
#define trigLeftPin 3
#define echoLeftPin 4
 
#define trigRightPin 13
#define echoRightPin 12
 
#define maximum_distance 200
boolean goesForward = false;
int distanceLeftForward = 100;
int distanceRightForward = 100;
 
int distanceLeftLeft = 0;
int distanceRightRight = 0;
 
int cm = 0;
 
Servo servoMotorLeft;
Servo servoMotorRight;
 
NewPing sonar(trigLeftPin, echoLeftPin, maximum_distance);
NewPing sonar(trigRightPin, echoRightPin, maximum_distance);
 
 
int positionLeft = 115
int positionRight = 115
 
void setup(){
 
  pinMode(RightMotorForward, OUTPUT);
  pinMode(LeftMotorForward, OUTPUT);
  pinMode(LeftMotorBackward, OUTPUT);
  pinMode(RightMotorBackward, OUTPUT);
   
  ServoMotorLeft.attach(ServoMotorLeftPin);
  servoMotorRight.attach(ServoMotorRightPin);
   
  servoMotorLeft.write(115);
  positionLeft = 115;
  servoMotorRight.write(115);
  positionRight = 115;
  delay(2000);
  distanceLeft = readPing();
  distanceRight = readPing();
  delay(100);
  distanceLeft = readPing();
  distanceRight = readPing();
  delay(100);
  distanceLeft = readPing();
  distanceRight = readPing();
  delay(100);
  distanceLeft = readPing();
  distanceRight = readPing();
  delay(100);
}
 
void loop(){
  moveForward();
  servoMotorLeft.write(115);
  positionLeft = 115;
  delay(200);
   
  servoMotorLeft.write(75);
  positionLeft = 75;
   
  servoMotorRight.write(115);
  positionRight = 115;
  delay(200);
   
  servoMotorRight.write(190);
  positionRight = 190;
   
  distanceRightForward = 0;
  distanceLeftForward = 0;
  delay(50);
   
  distanceLeftForward = readPing();
  distanceRightForward = readPing();
   
  if (distanceLeftLeft < distanceLeftForward) {
    turnRight();
    turnRight();
  } 
  else if (distanceRightRight < distanceRightForward) {
    turnLeft();
    turnLeft();
  }
  else { // if (distanceLeftForward < distanceLeftLeft) or (distanceRightForward < distanceRightRight) 
    scan();
  }
}
 
int readPing() {
  delay(70);
  cm = sonar.ping_cm();
  if (cm == 0){
    cm = 250;
  }
  return cm;
}
 
void moveStop() {
   
  digitalWrite(RightMotorForward, LOW);
  digitalWrite(LeftMotorForward, LOW);
  digitalWrite(RightMotorBackward, LOW);
  digitalWrite(LeftMotorBackward, LOW);
}
 
void moveForward() {
 
  if(!goesForward) {
 
    goesForward=true;
     
    digitalWrite(LeftMotorForward, HIGH);
    digitalWrite(RightMotorForward, HIGH);
   
    digitalWrite(LeftMotorBackward, LOW);
    digitalWrite(RightMotorBackward, LOW); 
  }
}
 
void moveBackward() {
 
  goesForward=false;
 
  digitalWrite(LeftMotorBackward, HIGH);
  digitalWrite(RightMotorBackward, HIGH);
   
  digitalWrite(LeftMotorForward, LOW);
  digitalWrite(RightMotorForward, LOW);
   
}
void turnRight() {
  digitalWrite(LeftMotorForward, HIGH);
  digitalWrite(RightMotorBackward, HIGH);
   
  digitalWrite(LeftMotorBackward, LOW);
  digitalWrite(RightMotorForward, LOW);
   
  delay(500);
   
  digitalWrite(LeftMotorForward, HIGH);
  digitalWrite(RightMotorForward, HIGH);
   
  digitalWrite(LeftMotorBackward, LOW);
  digitalWrite(RightMotorBackward, LOW);
}
 
void turnLeft() {
  digitalWrite(LeftMotorBackward, HIGH);
  digitalWrite(RightMotorForward, HIGH);
   
  digitalWrite(LeftMotorForward, LOW);
  digitalWrite(RightMotorBackward, LOW);
 
  delay(500);
   
  digitalWrite(LeftMotorForward, HIGH);
  digitalWrite(RightMotorForward, HIGH);
   
  digitalWrite(LeftMotorBackward, LOW);
  digitalWrite(RightMotorBackward, LOW);
}
 
void scan() {
  moveBackward();
   
  if (positionLeft = 75) {
    SevoMotorLeft.write(50);
    if
     
  }
}