Позвольте мне начать с того, что я был разочарован количеством роботов, которые я смог найти, использующих Arduino. С тех пор как у меня появился 3D-принтер, я всегда хотел это сделать. Я не инженер, и я научился создавать модели в программе 3D CAD (FreeCAD). Это то, чем я занимаюсь в свободное время, и ничего из того, что я сделал, не является и
Вся цель робота - бояться людей, и ему не нравится, когда на него смотрят, поэтому, когда вы приближаетесь к датчику звука, он ведёт себя "истерично", размахивая руками и отворачивая голову в сторону.
СПИСОК ДЕТАЛЕЙ -
1- Arduino Uno
1 - макетирующая доска среднего размера.
1 - Соник Сеньор.
1 - OLED 0,96 дюйма.
1 - Мини-динамик на 3 Ом.
3- Сервомоторы SG90
Куча мелких проводов / несколько крупных.
Код для бота - (на данный момент он заставляет работать только руки, голову и звуковой датчик)
----------------------------------------------------------------------------------------------------------
#include <Servo.h>
// Определения выводов
#define HEAD_SERVO_PIN 11 // Пина сервопривода головы.
#define LEFT_ARM_PIN 9 // Пина сервомотора левой руки.
#define RIGHT_ARM_PIN 10 // Пина сервомотора правой руки.
#define TRIG_PIN 12 // Пина триггера ультразвукового датчика.
#define ECHO_PIN 13 // Пина эхо ультразвукового датчика.
// Объекты-сервомоторы для головы и рук.
Сервоголовка; Серво;
Сервомотор левой руки;
Сервопривод правой руки;
// Переменные расстояния.
Длительная продолжительность;
Интегральное расстояние;
// Положения рук.
Интегральное значение armNeutral равно 90;
Интегральная переменная armUp равна 0;
Интегральная переменная armDown равна 180;
// Переменные для сканирования головы.
int scanCenter = 90; // Положение центра головы.
Интегральная переменная currentHeadPos равна координате центра сканирования.
// Скорость движения рук.
int armSpeed = 20; // Скорость движений руки.
void setup() {
// Подключите сервомоторы к их соответствующим контактам.
headServo.attach(HEAD_SERVO_PIN);
leftArmServo.attach(LEFT_ARM_PIN);
rightArmServo.attach(RIGHT_ARM_PIN);
// Инициализируем ультразвуковой датчик.
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// Начинаем с центрированной головы и рук.
headServo.write(scanCenter); // Центр головы.
leftArmServo.write(armNeutral); // Центрируем левую руку.
rightArmServo.write(armNeutral); // Центрируем правую руку.
delay(1000); // Ждать, пока сервоприводы стабилизируются.
randomSeed(analogRead(0)); // Засеять генератор случайных чисел.
)
void loop() {
// Измерьте расстояние с помощью ультразвукового датчика.
Расстояние = получитьРасстояние();
// Если объект обнаружен в пределах 5 см, двигайте как голову, так и руки.
если (расстояние <= 5) {
moveHeadAndArms("frantic"); // Двигать голову и руки в беспокойном ритме.
}
// Если объект обнаружен в пределах 20 см, двигайте как голову, так и руки.
Иначе, если расстояние меньше или равно 20:
moveHeadAndArms("frantic"); // Двигать голову и руки в беспокойном ритме.
} иначе {
// Продолжайте сканирование без перезапуска.
headServo.write(scanCenter); // Держите голову центрированной.
leftArmServo.write(armNeutral); // Держите руки в центрированном положении.
rightArmServo.write(armNeutral); // Держите руки в центральном положении.
}
delay(100); // Задержка для плавной работы.
)
// Функция для получения расстояния от ультразвукового датчика.
int getDistance() {
// Отправьте импульс, чтобы активировать датчик.
digitalWrite(TRIG_PIN, LOW);
DelayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Измерьте продолжительность пульса.
Длительность = pulseIn(ECHO_PIN, HIGH);
// Вычислите расстояние в см (скорость звука = 343 м/с, или 0,0343 см/мкс).
int distanceCm = duration * 0.0343 / 2;
Возвращаем расстояние в сантиметрах;
)
// Функция для перемещения как головы, так и рук в зависимости от типа действия.
void moveHeadAndArms(String actionType) {
если (тип действия == "отчаянный") {
// Дико двигайте головой и руками, когда объект обнаружен.
int franticMovement = случайное число от 1 до 4;
если (franticMovement == 1) {
headServo.write(30); // Переместить голову влево.
leftArmServo.write(armUp); // Левая рука вверху.
rightArmServo.write(armDown); // Правая рука опущена.
}
Иначе, если беспокойное движение равно 2:
headServo.write(150); // Переместить голову вправо.
leftArmServo.write(armDown); // Левая рука опущена.
rightArmServo.write(armUp); // Правая рука поднимается.
}
Иначе, если беспокойное движение равно 3, то:
headServo.write(180); // Переместить голову в полностью повернутое положение.
leftArmServo.write(random(0, 180)); // Случайное движение левой руки.
rightArmServo.write(random(0, 180)); // Случайное движение правой руки.
}
Иначе, если беспокойное движение равно 4, то:
headServo.write(60); // Переместить голову в умеренно левую позицию.
leftArmServo.write(armUp); // Левая рука вверху.
rightArmServo.write(armDown); // Правая рука опущена.
}
delay(500); // Короткая задержка перед изменением положения руки.
// Возвращаем руки в нейтральное положение после движения.
leftArmServo.write(armNeutral);
rightArmServo.write(armNeutral);
delay(200); // Короткая задержка перед следующим действием.
}
)
--------------------------------------------------------------------------------------------------------------
Большинство деталей идеально сочетаются друг с другом, а другие не так уж и хорошо. Опять же, я делаю это для удовольствия и чтобы учиться. Я давно хотел загрузить версию "черновик". Моя цель - чтобы другие единомышленники, возможно, взялись за этот проект со мной и сделали из этого робота, ориентированного на сообщество. Из
----------------------------------------------------------------------------------------------------------------
Некоторые детали потребуют клея, но не многие. Сервомоторы вставляются на место, так же как динамик и OLED. Единственная проблема заключается в том, что я сделал отверстия слишком идеально, и как динамик, так и OLED должны быть установлены идеально, иначе они не будут вписываться. Единственные детали, требующие клея, это соединители ножек
----------------------------------------------------------------------------------------------------------------
タグ
モデルソース
