Создание ИИ-ассистента-робота на Arduino и Python
Компоненты и расходные материалы
| Arduino Nano R3 | × | 1 |
| Микросервопривод SG90 | × | 3 |
| Ультразвуковой датчик HC-SR04 | × | 1 |
| Пользовательская PCB от PCBWay | × | 1 |
Приложения и онлайн-сервисы
Arduino IDE
О проекте
Введение
Все знают Джарвиса — ИИ-ассистента из «Железного человека». Многие программисты мечтают создать своего. Сегодня покажу простой способ сделать такого ассистента на Python. А также сделаю физическое тело робота, чтобы он двигался при разговоре — это круче, чем просто софт. Научимся использовать Arduino и Python вместе для ИИ-робота, который управляет компьютером и общается с вами.
Почему робота зовут «Желтуха» (Jaundice)? Потому что я покрасил его в жёлтый, очень жёлтый!
Детали
Электроника:
- Arduino Nano — 1 шт.
- Микросерво SG90 — 3 шт.
- Ультразвуковой датчик HC-SR04 — 1 шт.
Корпус:
- ПВХ-лист (лучше белый для покраски, я использовал синий)
- Колесо сервопривода (для стойки)
Инструменты:
- Канцелярский нож
- Ножницы
- Клейкий пистолет
- Спрей-краска
Софт:
- Python 3
- Arduino IDE
Принцип работы
Основной ИИ-код запускается на компьютере — он поддерживает Python и имеет больше вычислительной мощности, чем Arduino. К тому же, раз бот управляет задачами ПК, он должен работать на ПК. Arduino подключен к компьютеру по USB.
Идея: Python-программа делает речь→текст, обрабатывает текст, делает текст→речь. Робот слушает, понимает, отвечает. Для движений тела на Arduino заранее сохранены функции-движения. Python посылает байт-команду — Arduino выполняет соответствующую функцию.
Пример: если робот должен поздороваться, Python шлёт байт 'h', Arduino выполняет функцию hi(). Всё просто.
Схемы и электроника


Схемы — главная головная боль мейкеров. Ошибка может сжечь дорогие детали. Я спроектировал универсальную PCB в EasyEDA и заказал в PCBWay. Сервис отличный: заказал через Instant Quote, всё сделали автоматически. За 3 дня плата приехала из Китая в Бангладеш. Качество фантастическое: идеальная паяльная маска, трассы, финиш.
На плате: слот microSD, слот Bluetooth-модуля, внешнее питание 5В, всё питается от Arduino Nano. Толщина трасс 300 мкм — выдерживает 1 А.
Файлы PCB можно скачать здесь.
Пайка и тест схемы

Припаял всё. Будьте осторожны — не вдыхайте дымы, они канцерогенны. Bluetooth и TF-модуль не использовал — оставил несобранными. 3 сервопривода и сонар отлично питаются от USB-кабеля — отдельное питание не нужно. Если хотите батареи — только 2S LiPo (7,4 В), больше — сгорят сервы.
Изготовление корпуса

Корпус из ПВХ-листа (можно картон). Сделал коробку для основной части — плата и сервы. Голова — тоже коробка, два отверстия под датчик (глаза). Руки: одна как гаечный ключ, другая — вилка (настоящая вилка, приклеена термоклеем).
Размеров нет — это ваш робот, делайте любой формы и размера с простыми инструментами.
Важно: установите всю электронику ПЕРЕД закрытием корпуса. Я красил после установки датчиков — не повторяйте, у меня Arduino пожелтел. Сначала покрасьте корпус, потом ставьте электронику.
Кодирование 1: Python

Скачайте Python отсюда, при установке поставьте галочку «Add to PATH».
Установите библиотеки через терминал:
pip install speechrecognition
pip install pyaudio
pip install pyttsx3
pip install pywhatkit
pip install pyserial
Скачайте Python-код здесь или скопируйте ниже.
""" JAUNDICE: AI Assistant robot with Arduino and Python
author: ashraf minhaj
mail: ashraf_minhaj@yahoo.com
Last Edit: Nov 2020
License: GPL3+
"""
import speech_recognition as sr
import random
import pyttsx3
import datetime
import webbrowser
import serial
import pywhatkit
robot_name = 'jaundice'
hi_words = ['hi', 'hello', 'yo baby', 'salam']
bye_words = ['bye', 'tata', 'hasta la vista']
r_u_there = ['are you there', 'you there']
engine = pyttsx3.init()
listener = sr.Recognizer()
try:
port = serial.Serial("COM15", 9600)
print("Physical body connected.")
except:
print("Unable to connect to physical body")
def listen():
try:
with sr.Microphone() as source:
print("Talk>>")
voice = listener.listen(source)
command = listener.recognize_google(voice).lower()
print(command)
if command.split(' ')[0] == robot_name:
print("[wake-up word found]")
process(command)
except:
pass
def process(words):
print(words)
word_list = words.split(' ')[1:] # без wake-word
if len(word_list) == 1 and word_list[0] == robot_name:
talk("How can I help you?")
return
if word_list[0] == 'play':
talk("Okay boss, playing")
port.write(b'u')
pywhatkit.playonyt(' '.join(word_list[1:]))
port.write(b'l')
return
elif word_list[0] == 'search':
port.write(b'u')
talk("Okay boss, searching")
port.write(b'l')
pywhatkit.search(' '.join(word_list[1:]))
return
elif word_list[0] == 'get' and word_list[1] == 'info':
port.write(b'u')
talk("Okay, I am right on it")
port.write(b'u')
inf = pywhatkit.info(' '.join(word_list[2:]))
talk(inf)
return
elif word_list[0] == 'open':
port.write(b'l')
talk("Opening, sir")
webbrowser.open(f"https://{''.join(word_list[1:])}")
return
elif word_list[0] == 'uppercut':
port.write(b'U')
elif word_list[0] == 'smash':
port.write(b's')
elif word_list[0] == 'punch':
port.write(b'p')
for word in word_list:
if word in hi_words:
port.write(b'h')
talk(random.choice(hi_words))
elif word in bye_words:
talk(random.choice(bye_words))
def talk(sentence):
engine.say(sentence)
engine.runAndWait()
while True:
listen()
Кодирование 2: Arduino
Просто загрузите в Arduino IDE. Arduino ждёт данные по Serial, проверяет байт, выполняет заданную функцию. 'u' — поднимает обе руки, и т.д.
Код на GitHub или ниже.
/** JAUNDICE: AI Assistant robot with Arduino and Python
* author: ashraf minhaj
* mail: ashraf_minhaj@yahoo.com
* Last Edit: Nov 2020
* License: GPL3+
*/
#include
Servo head, l_hand, r_hand;
int trig = 4, echo = 5;
byte val = 0;
void setup() {
head.attach(2); l_hand.attach(3); r_hand.attach(4);
Serial.begin(9600);
}
void standby() {
head.write(90);
int r_pos = 30;
int l_pos = map(r_pos, 0, 180, 180, 0);
l_hand.write(l_pos); r_hand.write(r_pos);
}
void hi() {
head.write(90);
for (int i=30; i<=170; i++) { r_hand.write(i); delay(5); }
for (int i=170; i>=100; i--) { r_hand.write(i); delay(5); }
for (int i=100; i<=170; i++) { r_hand.write(i); delay(5); }
for (int i=170; i>=30; i--) { r_hand.write(i); delay(5); }
standby();
}
void hands_up() {
for (int i=30; i<=170; i++) {
int r_pos = i, l_pos = map(r_pos, 0, 180, 180, 0);
l_hand.write(l_pos); r_hand.write(r_pos); delay(5);
}
delay(600);
for (int i=170; i>=30; i--) {
int r_pos = i, l_pos = map(r_pos, 0, 180, 180, 0);
l_hand.write(l_pos); r_hand.write(r_pos); delay(5);
}
}
// ... остальные функции: weight_lift, look_left, confused, double_punch, r_upper_cut, smash, eye_detect
void loop() {
standby();
while (Serial.available() > 0) {
val = Serial.read();
if (val == 'h') hi();
if (val == 'p') double_punch();
if (val == 'u') { hands_up(); delay(3000); }
if (val == 'l') { standby(); look_left(); delay(2000); }
if (val == 'U') { r_upper_cut(); delay(2000); }
if (val == 's') { smash(); delay(2000); }
}
}
Сборка и запуск
Подключил Arduino к ПК по USB, запустил Python-программу. Убедитесь, что в Python-коде указан правильный COM-порт Arduino. Если всё сделано по инструкции — бот работает как часы.
Спасибо!
Исходный код
Схемы

Производственный процесс
- Создание робота на Raspberry Pi и Python: полное руководство
- Создание интернет-управляемого видеostreaming-робота на Arduino и Raspberry Pi
- Понимание type() и isinstance() в Python: практические примеры
- Надежная система учета рабочего времени на Arduino с RFID и Python
- Робот-ускользатор на сервоприводе: сборка на Arduino и HC-SR04
- Управление Roomba Create 2 через Arduino и Android: пошаговое руководство
- Точное управление сервоприводом через MPU6050 (Arduino, SG90, MG996R)
- Модуль GPS u-blox LEA-6H 02: Интеграция с Arduino и Python
- Освоение распознавания и синтеза речи на Arduino Due
- Автономный домашний помощник-робот: полный список деталей и руководство по настройке (ROS, Alexa, MoveIt)