Noorem Tarkvaraarendaja eriala
Компоненты:
- Arduino Nano
- Драйвер L9110S
- Аккумулятор 2x3000mAh
- DC Motor 2x (для Arduino)
- Колесо 4x (для Arduino)
- Micro servo (мотор) MG90S
- Переключатель
- Ultrasonic Sensor HC-SR04
- Провод ~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
}
}