Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Создание ИИ-ассистента-робота на Arduino и Python

Компоненты и расходные материалы

Arduino Nano R3 × 1
Микросервопривод SG90 × 3
Ультразвуковой датчик HC-SR04 × 1
Пользовательская PCB от PCBWay × 1

Приложения и онлайн-сервисы

Arduino IDE

О проекте

Введение

Все знают Джарвиса — ИИ-ассистента из «Железного человека». Многие программисты мечтают создать своего. Сегодня покажу простой способ сделать такого ассистента на Python. А также сделаю физическое тело робота, чтобы он двигался при разговоре — это круче, чем просто софт. Научимся использовать Arduino и Python вместе для ИИ-робота, который управляет компьютером и общается с вами.

Почему робота зовут «Желтуха» (Jaundice)? Потому что я покрасил его в жёлтый, очень жёлтый!

Детали

Электроника:

Корпус:

Инструменты:

Софт:

Принцип работы

Основной ИИ-код запускается на компьютере — он поддерживает Python и имеет больше вычислительной мощности, чем Arduino. К тому же, раз бот управляет задачами ПК, он должен работать на ПК. Arduino подключен к компьютеру по USB.

Идея: Python-программа делает речь→текст, обрабатывает текст, делает текст→речь. Робот слушает, понимает, отвечает. Для движений тела на Arduino заранее сохранены функции-движения. Python посылает байт-команду — Arduino выполняет соответствующую функцию.

Пример: если робот должен поздороваться, Python шлёт байт 'h', Arduino выполняет функцию hi(). Всё просто.

Схемы и электроника

Создание ИИ-ассистента-робота на Arduino и Python
Создание ИИ-ассистента-робота на Arduino и Python

Схемы — главная головная боль мейкеров. Ошибка может сжечь дорогие детали. Я спроектировал универсальную PCB в EasyEDA и заказал в PCBWay. Сервис отличный: заказал через Instant Quote, всё сделали автоматически. За 3 дня плата приехала из Китая в Бангладеш. Качество фантастическое: идеальная паяльная маска, трассы, финиш.

На плате: слот microSD, слот Bluetooth-модуля, внешнее питание 5В, всё питается от Arduino Nano. Толщина трасс 300 мкм — выдерживает 1 А.

Файлы PCB можно скачать здесь.

Пайка и тест схемы

Создание ИИ-ассистента-робота на Arduino и Python

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

Изготовление корпуса

Создание ИИ-ассистента-робота на Arduino и Python

Корпус из ПВХ-листа (можно картон). Сделал коробку для основной части — плата и сервы. Голова — тоже коробка, два отверстия под датчик (глаза). Руки: одна как гаечный ключ, другая — вилка (настоящая вилка, приклеена термоклеем).

Размеров нет — это ваш робот, делайте любой формы и размера с простыми инструментами.

Важно: установите всю электронику ПЕРЕД закрытием корпуса. Я красил после установки датчиков — не повторяйте, у меня Arduino пожелтел. Сначала покрасьте корпус, потом ставьте электронику.

Кодирование 1: Python

Создание ИИ-ассистента-робота на Arduino и 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. Если всё сделано по инструкции — бот работает как часы.

Спасибо!

Исходный код

GitHub репозиторий

Схемы

Создание ИИ-ассистента-робота на Arduino и Python

Производственный процесс

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