Как-то дали задание — сделать поделку в садик. При чем не банальную, на подобие рисунка или ракеты, а что-то такое, чего нет.
Решено было сделать простенького робота из того, что есть под рукой. Данная модель может ходит туда-сюда и обходить препятствия.
Для сборки понадобится:
- Arduino Nano
- Датчик расстояния
- Модуль расширения (для удобства)
- Сервомоторы — 4шт.
- Немного проводов
- Элемент питания
Первое что необходимо сделать — это напечатать на 3D-принтере детали корпуса робота. Печатать можно из ABS или PLA пластика, соплом 0.4 и высотой слоя 0.2. Плотность заполнения — 70% и выше, так как уголки могут поломаться при первой же игре с ним.
Сборку начинаем с, так скажем, лап нашегоробота. С помощью двухстороннего скотча приклеиваем к ним сервомоторы SG90.
С помощью маленьких болтиков устанавливаем сервомоторы в тело робота.
Так же собираем крепление для датчика препятствий
Все тем же скотчем приклеиваем датчик расстояния HC-SR04.
После того, как закончили сборку рамы и установку электроники, переходим к схеме подключения сервомоторов.
Сервомоторы sg90 подключаем так как на схеме, смотря на робота спереди.
Модуль расширения для Arduino Nano к раме так же приклеиваем с помощью двухстороннего скотча.
После завершения сборки подключаем робота к компьютеру и с помощью Arduino IDE загружаем приведенный ниже скетч.
#include <Servo.h>
#include <NewPing.h>
#define IRsensorPin 13
#define TRIGGER_PIN 12
#define ECHO_PIN 11
#define LEFTLEG 7
#define RIGHTLEG 10
#define LEFTFOOT 8
#define RIGHTFOOT 9
#define HEAD 6
#define MAX_DISTANCE 200
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
Servo Lleg;
Servo Rleg;
Servo Lfoot;
Servo Rfoot;
Servo Head;
int Hcenter = 70;
int RLcenter = 100;
int RFcenter = 65;
int LLcenter = 90;
int LFcenter = 75;
int tAngle = 30;
int uAngle = 35;
int sAngle = 35;
int hAngle = Hcenter;
void setup() {
Serial.begin(19200);
Serial.println("Bipedino setup is running.");
Lleg.attach(LEFTLEG);
Rleg.attach(RIGHTLEG);
Lfoot.attach(LEFTFOOT);
Rfoot.attach(RIGHTFOOT);
Head.attach(HEAD);
CenterServos();
delay(500);
for (int i = 0; i < 5; ++i) {
GetSonar();
delay(1000);
}
Serial.println("Bipedino is ready.");
} // setup()
void loop() {
unsigned int cmCenter = MAX_DISTANCE;
unsigned int cmLeft = MAX_DISTANCE;
unsigned int cmRight = MAX_DISTANCE;
HeadCenter();
cmCenter = GetSonar();
if (cmCenter < 20) {
HeadRight();
cmRight = GetSonar();
HeadCenter();
if (cmRight > 20) {
TurnRight(1, 30);
} else {
HeadLeft();
cmLeft = GetSonar();
HeadCenter();
if (cmLeft > 20) {
TurnLeft(1, 30);
}
}
} else {
int nSteps = cmCenter / 5;
if (nSteps > 5) {
nSteps = 5;
}
else {
nSteps = 1;
}
Serial.print("Steps <");
Serial.print(nSteps);
Serial.println(">");
for (int n = 0; n < nSteps; n++) {
Forward(1, 30);
}
}
}
int GetSonar() {
unsigned int uS = sonar.ping();
Serial.print("Ping: ");
Serial.print(uS / US_ROUNDTRIP_CM);
Serial.println("cm");
return uS / US_ROUNDTRIP_CM;
}
void CenterServos() {
Lleg.write(LLcenter);
Rleg.write(RLcenter);
Lfoot.write(LFcenter);
Rfoot.write(RFcenter);
Head.write(Hcenter);
delay(1000);
} // CenterServos()
После загрузки скетча, робот сразу начинает работать (при условии что все правильно собрано и подключено).
В общем, воспитатели и дети в садике довольны!
К сожалению код программа не рабочая, выдает кучу ошибок, есть специалисты для отладки?
Добрый день. Какого рода ошибки ?
На что ругается ?
Проверил у себя и все работает.