Робот-компаньон ASI (Ананси) на Arduino Nano с LED-дисплеем
Компоненты и материалы
| Arduino Nano R3 | 1 |
| Микро-сервопривод SG90 | 1 |
| Модуль LED-матрицы MAX7219 (красный) | 1 |
| Короб для 4х АА батареек (или Li-ion 3.7В 200мАч) | 1 |
| Саморезы | 1 |
| Прозрачные пластиковые формы для ванн-бомб (для головы) | 1 |
| Adafruit Trinket 5V | 1 |
Необходимые инструменты и станки
- 3D-принтер
- Клеевой пистолет
О проекте
История создания
Изначально проект был основан на Xpider с Thingiverse. Но потом я увидел Archimedes от Алекс Глоу (Alex Glow) — это взорвало мой мозг. Я очень хотел такого. Начал работать над своим роботом-компаньеном. Я не типа «сова», и хотел, чтобы мой фамильяр был особенным. Тогда вспомнил африканскую сказку об Ананси — пауке-плуте и боге историй. Решил спроектировать бота с идеей истории, и так родился ASI (на самом деле ASI_v4, v1–v3 были прототипами).
Сборка
Базовый дизайн — Xpider, но я сильно переработал многое, выбросил лишнее и поэкспериментировал. На фото — большинство деталей для печати.
Сборка довольно интуитивна, но вот фото для наглядности.
Для электроники: платы можно разместить в верхней или нижней части головы (на ваш выбор), но сервопривод должен быть закреплен именно так. Убедитесь, что шестеренка надета на вал.
ASI управляется двумя микроконтроллерами: Trinket и Arduino Nano. Trinket управляет движением глаза — сервопривод поворачивает его туда-сюда в случайные интервалы. Arduino Nano управляет «глазом» (LED-матрицей). Он тоже работает случайно — смотрит вокруг, и людям кажется, что он смотрит на них.
Платы установлены на двух маленьких макетных платах, соединенных цепочкой с 4х АА батарейками. (Можно использовать литий-ионный аккумулятор 3.7В 200мАч. Но с ним иногда были проблемы — не запускалось, поэтому лучше использовать два отдельных литий-ионных аккумулятора и подключить их к одному выключателе, чтобы всё включалось одновременно.)
Голова — это рождественский шар, купленный на праздниках. Я отступил назад и слегка распылил его черной краской из баллона. Затем горячим клеем приклеил к детали шеи ASI — и голова готова!
Наконец, как я его ношу. Я просто взял алюминиевую проволоку, прошел её через отверстия в нижней части ASI и закрепил на плечевом ремне рюкзака.
Код
ASI Eye (Arduino Nano)
#include <LedControl.h>
#include "LedControl.h"
#define PIN_EYES_DIN 12
#define PIN_EYES_CS 11
#define PIN_EYES_CLK 10
LedControl lc = LedControl(PIN_EYES_DIN, PIN_EYES_CLK, PIN_EYES_CS, 2);
bool rotateMatrix0 = false;
bool rotateMatrix1 = false;
byte eyeBall[8] = {
B00111100, B01111110, B11111111, B11111111,
B11111111, B11111111, B01111110, B00111100
};
byte eyePupil = B11100111;
byte eyeCurrent[8];
int currentX, currentY;
int cntLoop = 0, cntEffect = 0;
#define MIN -2
#define MAX 2
#define DELAY_BLINK 40
#define EFFECT_ITERATION 4
void setup() {
lc.shutdown(0,false); lc.shutdown(1,false);
lc.setIntensity(0,1); lc.setIntensity(1,1);
lc.clearDisplay(0); lc.clearDisplay(1);
// LED test
byte b = B10000000;
for (int c=0; c<=7; c++) {
for (int r=0; r<=7; r++) { setRow(0,r,b); setRow(1,r,b); }
b >>= 1; delay(50);
}
b = B11111111;
for (int r=0; r<=7; r++) { setRow(0,r,b); setRow(1,r,b); }
delay(500);
lc.clearDisplay(0); lc.clearDisplay(1); delay(500);
randomSeed(analogRead(0));
displayEyes(0, 0); delay(2000);
blinkEyes(true, false); blinkEyes(false, true); delay(1000);
}
void loop() {
moveEyes(random(MIN, MAX+1), random(MIN, MAX+1), 50);
delay(random(5,7) * 500);
if (random(0,5) == 0) { delay(500); blinkEyes(); delay(500); }
if (EFFECT_ITERATION > 0) {
cntLoop++;
if (cntLoop == EFFECT_ITERATION) {
cntLoop = 0;
if (cntEffect > 6) cntEffect = 0;
switch(cntEffect) {
case 0: crossEyes(); delay(1000); break;
case 1: roundSpin(2); delay(1000); break;
case 2: crazySpin(2); delay(1000); break;
case 3: methEyes(); delay(1000); break;
case 4: lazyEye(); delay(1000); break;
case 5: blinkEyes(true,false); blinkEyes(false,true); delay(1000); break;
case 6: glowEyes(3); delay(1000); break;
}
cntEffect++;
}
}
}
// ... (остальные функции: blinkEyes, crazySpin, crossEyes, displayEyes,
// getValidValue, glowEyes, methEyes, moveEyes, lazyEye, roundSpin, setRow, bitswap)
// Полный код доступен в оригинальном проекте.
ASI Neck with Trinket (шея)
#define SERVO_PIN 4
#define SERVO_MIN 4
#define SERVO_MAX 26
Adafruit_TiCoServo servo;
void setup(void) {
#if (F_CPU == 16000000L)
clock_prescale_set(clock_div_1);
#endif
servo.attach(SERVO_PIN);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, HIGH);
}
uint32_t lastLookTime = 0;
void loop(void) {
unsigned long t = millis();
if ((t - lastLookTime) > 500) {
if (random(10) == 0) {
servo.write(random(SERVO_MIN, SERVO_MAX));
lastLookTime = t;
}
}
if (random(10) == 0) {
digitalWrite(LED_PIN, LOW);
delay(random(50, 250));
digitalWrite(LED_PIN, HIGH);
}
delay(100);
}
Детали для 3D-печати
Все STL-файлы для печати деталей робота (ноги, корпус, шея, шестеренки, крепления и т.д.) доступны в разделе Custom parts оригинального проекта.
Схемы
Схемы подключения для шеи ASI и питания обеих плат прилагаются в разделе Schematics.
Производственный процесс
- Создание робота на Arduino и Raspberry Pi: пошаговое руководство
- DIY робот в стиле Wall‑E на Raspberry Pi из коробки от CD
- PiCy: Создайте своего компактного робота на Raspberry Pi
- Робот-будильник на колесах: умная мобильная система пробуждения на Raspberry Pi и Google Calendar
- Создание моторизированного робота-крипера Minecraft на Arduino
- Archimedes: Робот-совица с ИИ для распознавания эмоций
- Создание робота с компьютерным зрением и голосовым управлением на Windows 10 IoT Core
- ROS-робот: Управление навигацией из терминала на Raspberry Pi
- Simple Pi Robot — Сборка 2WD автономного ровера на Raspberry Pi
- Напитки-роботы: технологии, автоматизация и роль в напиточной индустрии