Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Eigenen KI-Assistenten-Roboter mit Arduino & Python bauen

Komponenten und Materialien

Komponente Menge Hinweise
Arduino Nano R3 1
SG90 Mikro-Servomotor 3
Ultraschallsensor HC-SR04 1
PCBWay Custom PCB 1 Projektlink

Apps und Online-Dienste

Über dieses Projekt

Einführung

Wir alle kennen „Jarvis“, den KI-Assistenten-Roboter aus den „Iron Man“-Filmen und der Marvel-Serie. Es war schon immer der Traum von Programmierern, so etwas selbst zu bauen. Ich zeige heute einen einfachen Weg, einen solchen Assistenten mit Python-Programmierung zu erstellen. Zudem werde ich einen physischen Avatar dieses Roboters bauen, damit er bei Gesprächen Bewegungen ausführen kann. Das ist beeindruckender als ein reiner Software-Roboter. Denn wenn er einen Körper hat, ist er cool. Heute lernen wir, sowohl Arduino als auch Python zu nutzen, um einen KI-Roboter zu bauen, der Ihren Computer steuern und sich ein wenig mit Ihnen unterhalten kann. Los geht's!

Warum ich den Roboter „Jaundice“ (Gelbsucht) nannte? Weil ich ihn gelb angemalt habe, sehr, sehr gelb!

Teile

Elektronik:

Gehäuse:

Werkzeuge:

Software:

Prinzip

Bevor wir mit dem eigentlichen Bau beginnen, ist es gut, eine Vorstellung davon zu haben, was wir tun werden.

Der Hauptcode bzw. der KI-Teil des Codes läuft auf dem Computer. Warum? Weil er Python unterstützt und mehr Rechenleistung hat als der kleine Arduino. Außerdem muss der KI-Bot, da er einige Aufgaben meines PCs steuern/automatisieren soll, auf meinem PC laufen. Das Arduino-Board ist über das USB-Kabel mit meinem Computer verbunden.

Die Idee ist, ein Python-Programm auszuführen, das den Speech-to-Text-Teil übernimmt, den Text verarbeitet und auch Text-to-Speech macht. Der Roboter wird also zuhören, verstehen und zurücksprechen. Für Körperbewegungen habe ich einige Bewegungen (in Funktionen gekapselt) auf dem Arduino-Board gespeichert. Die Funktion für jede Bewegung wird vom Python-Code ausgeführt.

Als Beispiel: Wenn der Roboter „Hi/Hallo“ sagen soll, sendet der Python-Code ein Byte „h“, woraufhin der Arduino die hi()-Funktion ausführt. So einfach ist das.

Nun, da Sie eine Vorstellung haben, gehen wir zum nächsten Schritt über.

Schaltungen und Elektronik

Eigenen KI-Assistenten-Roboter mit Arduino & Python bauen
Eigenen KI-Assistenten-Roboter mit Arduino & Python bauen

Schaltungen sind das, was die meisten Maker ärgert. Wenn etwas schiefgeht, können Sie teure Teile verbrennen. Deshalb habe ich eine PCB-Platine entworfen, die für zahlreiche Projekte verwendet werden kann. Sie verfügt über einen microSD-Kartensteckplatz, einen Bluetooth-Modul-Steckplatz, eine 5V externe Stromquelle und das Ganze wird vom Arduino Nano gespeist.

Ich habe die PCB mit EasyEDA entworfen und über den PCBWay-Online-Service fertigen lassen. Ihr Service ist erstaunlich. Ich bestellte über PCB Instant Quote und ihr System erledigte alles automatisch für mich. Innerhalb von 3 Tagen erhielt ich die Platine aus China nach Bangladesch. Die Qualität ist fantastisch, die Lötmaske ist perfekt und die Leiterbahnen/Traces sind so gut wie möglich.

Ich verwendete 300 mm Spuren, da diese 1A Strom tragen können.

Sie können die PCB-Dateien hier herunterladen.

Bauteile löten und Schaltung testen

Eigenen KI-Assistenten-Roboter mit Arduino & Python bauen

In diesem Schritt habe ich alles verlötet. Seien Sie sehr vorsichtig, die Dämpfe nicht einzuatmen, sie können Krebs erregen.

Ich verwende weder Bluetooth-Modul noch TF-Modul, daher ließ ich diese unbestückt. Das Gute ist: Ich verwendete 3 Servomotoren und einen Sonarsensor, alle werden problemlos über das USB-Kabel gespeist, das wir zum Programmieren des Arduino anschließen. Das ist großartig, da wir nicht an eine weitere Stromquelle denken müssen.

Falls Sie dennoch externe Batterien verwenden möchten, greifen Sie zu LiPo 2S (7,4V) Batterien. Mehr Spannung verbrennt die Servos.

Gehäuse bauen

Eigenen KI-Assistenten-Roboter mit Arduino & Python bauen
Eigenen KI-Assistenten-Roboter mit Arduino & Python bauen
Eigenen KI-Assistenten-Roboter mit Arduino & Python bauen
Eigenen KI-Assistenten-Roboter mit Arduino & Python bauen
Eigenen KI-Assistenten-Roboter mit Arduino & Python bauen
Eigenen KI-Assistenten-Roboter mit Arduino & Python bauen
Eigenen KI-Assistenten-Roboter mit Arduino & Python bauen
Eigenen KI-Assistenten-Roboter mit Arduino & Python bauen
Eigenen KI-Assistenten-Roboter mit Arduino & Python bauen
Eigenen KI-Assistenten-Roboter mit Arduino & Python bauen
Eigenen KI-Assistenten-Roboter mit Arduino & Python bauen
Eigenen KI-Assistenten-Roboter mit Arduino & Python bauen
Eigenen KI-Assistenten-Roboter mit Arduino & Python bauen

Ich verwendete PVC-Platten für den Körper, Sie können auch Pappe nutzen. Zuerst baute ich einen Kasten für den Hauptteil, in den die Hauptplatine und die Servomotoren kommen. Es ist wie das Bauen von Kisten. Den Kopf baute ich同样, mit zwei Löchern für den Sensor (als Augen). Ich fügte alle benötigten Bilder hinzu. Ich machte eine Hand wie einen Schraubenschlüssel und die andere wie einen Stecker. Ich verwendete tatsächlich einen Stecker und klebte ihn mit Heißkleber an einen Arm.

Abmessungen? Eigentlich gibt es keine, denn es ist Ihr Roboter. Sie können ihn mit einfachen Werkzeugen bauen, also machen Sie ihn so, wie Sie wollen, in jeder Form und Größe.

Seien Sie extrem vorsichtig, alle Elektronik einzubauen, bevor Sie den Körper schließen. Ich lackierte den Körper, nachdem ich Sensoren und Elektronik eingebaut hatte. Machen Sie das nicht, ich habe meinen Arduino bereits gelb gefärbt.

Also: Erst den Körper fertigstellen und lackieren, dann die gesamte Elektronik einbauen.

Programmierung 1 (Python)

Eigenen KI-Assistenten-Roboter mit Arduino & Python bauen

Laden Sie Python von dieser Seite herunter und achten Sie darauf, Python während der Installation in Ihren PATH aufzunehmen.

Nach der Installation von Python müssen Sie einige Befehle in der Eingabeaufforderung/Terminal ausführen, um Bibliotheken für Spracherkennung, Audio-Unterstützung, Text-to-Speech, Browser-Automatisierung und serielle Kommunikation zu installieren. Führen Sie diese Befehle aus:

pip install speechrecognition
pip install pyaudio
pip install pyttsx3
pip install pywhatkit
pip install pyserial

Laden Sie dann den Python-Code hier herunter oder kopieren Sie ihn unten. Weiter zu Programmierung 2.

""" 
JAUNDICE: KI-Assistent-Roboter mit Arduino und Python
author: ashraf minhaj
mail: ashraf_minhaj@yahoo.com
Last Edit: Nov 2020
License: Copyright (C) Ashraf Minhaj. General Public License (GPL3+)
"""
import speech_recognition as sr  # Spracherkennungsbibliothek
import random  # für zufällige Wörter aus Liste
import pyttsx3  # Offline Text-to-Speech
import datetime  # für Datum und Uhrzeit
import webbrowser  # für Web-Aufgaben
import serial  # für serielle Kommunikation
import pywhatkit  # für weitere Web-Automatisierung

# Roboter-Name (Weckwort) deklarieren
robot_name = 'jaundice'

# Zufällige Wortlisten
hi_words = ['hi', 'hello', 'yo baby', 'salam']
bye_words = ['bye', 'tata', 'hasta la vista']
r_u_there = ['are you there', 'you there']

# Initialisierung
engine = pyttsx3.init()  # Text-to-Speech Engine initialisieren
# voices = engine.getProperty('voices')  # Stimmen prüfen
# engine.setProperty('voice', voices[1].id)  # weibliche Stimme
listener = sr.Recognizer()  # Spracherkennungs-API initialisieren

# Verbindung mit NiNi Motortreiber-Platine über serielle Kommunikation
try:
    port = serial.Serial("COM15", 9600)
    print("Phycial body, connected.")
except:
    print("Unable to connect to my physical body")

def listen():
    """Hören, was der Benutzer sagt"""
    try:
        with sr.Microphone() as source:  # Eingabe vom Mikrofon
            print("Talk>>")
            voice = listener.listen(source)  # Vom Mikrofon hören
            command = listener.recognize_google(voice).lower()  # Google API nutzen
            # Alle Wörter klein - für einfache Verarbeitung
            print(command)
            
            # Nach Weckwort am Anfang suchen
            if (command.split(' ')[0] == robot_name):
                print("[wake-up word found]")
                process(command)  # Prozess-Funktion aufrufen für Aktion
    except:
        pass

def process(words):
    """Verarbeiten, was der Benutzer sagt, und Aktionen ausführen"""
    print(words)
    
    # Prüfen, ob Befehl empfangen wurde
    # Wörter in Liste aufteilen
    word_list = words.split(' ')[1:]  # Leerzeichen trennen und Weckwort ignorieren
    
    if (len(word_list) == 1):
        if (word_list[0] == robot_name):
            talk("How Can I help you?")
            return
    
    if word_list[0] == 'play':
        """Wenn Befehl zum Abspielen, von YouTube abspielen"""
        talk("Okay boss, playing")
        extension = ' '.join(word_list[1:])  # Suchen ohne Befehlswort
        port.write(b'u')
        pywhatkit.playonyt(extension)
        port.write(b'l')
        return
    elif word_list[0] == 'search':
        """Wenn Befehl für Google-Suche"""
        port.write(b'u')
        talk("Okay boss, searching")
        port.write(b'l')
        extension = ' '.join(word_list[1:])
        pywhatkit.search(extension)
        return
    
    if (word_list[0] == 'get') and (word_list[1] == 'info'):
        """Wenn Befehl für Info-Abfrage"""
        port.write(b'u')
        talk("Okay, I am right on it")
        port.write(b'u')
        extension = ' '.join(word_list[2:])  # Suchen ohne Befehlswörter
        inf = pywhatkit.info(extension)
        talk(inf)  # Ergebnis vorlesen
        return
    elif word_list[0] == 'open':
        """Wenn Befehl zum Öffnen von URLs"""
        port.write(b'l')
        talk("Opening, sir")
        url = f"https://{''.join(word_list[1:])}"  # URL erstellen
        webbrowser.open(url)
        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')
    
    # Jetzt auf Übereinstimmungen prüfen
    for word in word_list:
        if word in hi_words:
            """Wenn Benutzer Hi/Hallo sagt, entsprechend begrüßen"""
            port.write(b'h')  # Befehl zum Winken senden
            talk(random.choice(hi_words))
        elif word in bye_words:
            """Wenn Benutzer Bye etc. sagt"""
            talk(random.choice(bye_words))

def talk(sentence):
    """Antworten / mit dem Benutzer sprechen"""
    engine.say(sentence)
    engine.runAndWait()

# Hauptschleife
while True:
    listen()  # listen einmal ausführen

Programmierung 2 (Arduino)

Dieser Teil ist einfach, nichts zu installieren. Nutzen Sie die Arduino IDE, um das Board zu programmieren. Laden Sie sie hier herunter, falls Sie Arduino noch nie verwendet haben.

Wie bereits erwähnt, wartet das Arduino-Programm auf serielle Daten. Wenn es Daten empfängt, prüft es das Byte. Wenn die Daten einem vordefinierten Befehl entsprechen, führt es eine Anweisung aus. Wenn „u“ gesendet wird, hebt es beide Hände, usw.

Laden Sie den Code hier herunter oder kopieren Sie ihn unten.

/** 
 * JAUNDICE: KI-Assistent-Roboter mit Arduino und Python
 * 
 * author: ashraf minhaj
 * mail: ashraf_minhaj@yahoo.com
 * Last Edit: Nov 2020
 * 
 * License: Copyright (C) Ashraf Minhaj.
 * General Public License (GPL3+)
 */
#include 

Servo head;
Servo l_hand;
Servo r_hand;

// Sonar-Sensor Pins definieren
int trig = 4;
int echo = 5;

// Empfangene Daten
byte val = "";

void setup() {
  head.attach(2);
  l_hand.attach(3);
  r_hand.attach(4);
  Serial.begin(9600); // Für serielle Kommunikation mit Python
}

void standby() {
  // Alle Motoren in diese Positionen
  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() {
  // Alle Motoren in diese Positionen
  head.write(90);
  int i = 0;
  for (i = 30; i <= 170; i++) {
    r_hand.write(i);
    delay(5);
  }
  for (i = 170; i >= 100; i--) {
    r_hand.write(i);
    delay(5);
  }
  for (i = 100; i <= 170; i++) {
    r_hand.write(i);
    delay(5);
  }
  for (i = 170; i >= 30; i--) {
    r_hand.write(i);
    delay(5);
  }
  standby();
}

void hands_up() {
  // Bei jedem Befehl ausführen (nur Hände etwas bewegen)
  int i = 0;
  for (i = 30; i <= 170; i++) {
    int r_pos = i;
    int l_pos = map(r_pos, 0, 180, 180, 0);
    l_hand.write(l_pos);
    r_hand.write(r_pos);
    delay(5);
  }
  delay(600);
  for (i = 170; i >= 30; i--) {
    int r_pos = i;
    int l_pos = map(r_pos, 0, 180, 180, 0);
    l_hand.write(l_pos);
    r_hand.write(r_pos);
    delay(5);
  }
}

void weight_lift() {
  // Gewicht mit beiden Händen heben
  int i = 0;
  for (i = 30; i <= 170; i++) {
    int r_pos = i;
    int l_pos = map(r_pos, 0, 180, 180, 0);
    l_hand.write(l_pos);
    r_hand.write(r_pos);
    delay(5);
  }
  for (int count = 0; count <= 4; count++) {
    for (i = 170; i >= 60; i--) {
      int r_pos = i;
      int l_pos = map(r_pos, 0, 180, 180, 0);
      l_hand.write(l_pos);
      r_hand.write(r_pos);
      delay(5);
    }
    for (i = 60; i <= 170; i++) {
      int r_pos = i;
      int l_pos = map(r_pos, 0, 180, 180, 0);
      l_hand.write(l_pos);
      r_hand.write(r_pos);
      delay(5);
    }
  }
  for (i = 170; i >= 30; i--) {
    int r_pos = i;
    int l_pos = map(r_pos, 0, 180, 180, 0);
    l_hand.write(l_pos);
    r_hand.write(r_pos);
    delay(5);
  }
}

void excited() {
  return;
}

void look_left() {
  // Kopf nach links drehen
  head.write(180);
}

void confused() {
  for (int count = 0; count <= 1; count++) {
    head.write(30);
    r_hand.write(170);
    delay(700);
    r_hand.write(30);
    head.write(120);
    l_hand.write(30);
    delay(700);
    l_hand.write(160);
  }
  standby();
}

void double_punch() {
  // Schlag ausführen
  int i = 0;
  for (i = 30; i >= 0; i--) {
    int r_pos = i;
    int l_pos = map(r_pos, 0, 180, 180, 0);
    l_hand.write(l_pos);
    r_hand.write(r_pos);
    delay(5);
  }
  delay(2000);
  int r_pos = 80;
  int l_pos = map(r_pos, 0, 180, 180, 0);
  l_hand.write(l_pos);
  r_hand.write(r_pos);
  delay(500);
  standby();
}

void r_upper_cut() {
  // Rechten Uppercut machen
  int i = 0;
  for (i = 30; i <= 170; i++) {
    int r_pos = i;
    int l_pos = map(r_pos, 0, 180, 180, 0);
    l_hand.write(l_pos);
    r_hand.write(r_pos);
    delay(5);
  }
  for (int count = 0; count <= 4; count++) {
    int i = 0;
    for (i = 170; i >= 60; i--) {
      r_hand.write(i);
      delay(1);
    }
    for (i = 60; i <= 170; i++) {
      r_hand.write(i);
      delay(1);
    }
  }
  standby();
  delay(100);
}

void smash() {
  // Dinge zerschlagen
  int i = 0;
  for (i = 30; i <= 170; i++) {
    int r_pos = i;
    int l_pos = map(r_pos, 0, 180, 180, 0);
    l_hand.write(l_pos);
    r_hand.write(r_pos);
    delay(5);
  }
  delay(2000);
  for (i = 170; i >= 0; i--) {
    int r_pos = i;
    int l_pos = map(r_pos, 0, 180, 180, 0);
    l_hand.write(l_pos);
    r_hand.write(r_pos);
    delay(1);
  }
  delay(300);
  int r_pos = 180;
  int l_pos = map(r_pos, 0, 180, 180, 0);
  l_hand.write(l_pos);
  r_hand.write(r_pos);
  delay(1000);
  standby();
}

void eye_detect() {
  // Etwas tun, wenn Augensensor Bewegung erkennt
  return;
}

void loop() {
  standby();
  while (Serial.available() > 0) { // Nach seriellen Daten suchen
    val = Serial.read(); // Seriellen Wert lesen
    if (val == 'h') { // Hi machen
      hi();
    }
    if (val == 'p') { // Doppelten Schlag
      double_punch();
    }
    if (val == 'u') {
      hands_up();
      delay(3000);
    }
    if (val == 'l') {
      standby();
      look_left();
      delay(2000);
    }
    if (val == 'U') { // Uppercut
      r_upper_cut();
      delay(2000);
    }
    if (val == 's') {
      smash();
      delay(2000);
    }
  }
}

Code hochladen.

Alles zusammenfügen und fertig

Nach Abschluss aller Schritte verband ich meinen Arduino über das USB-Kabel mit dem PC und startete das Python-Programm. Stellen Sie sicher, dass Sie im Python-Code den richtigen Arduino-Port eintragen. Wenn Sie alles wie beschrieben gemacht haben, sollte der Bot wie ein Zauber funktionieren.

Vielen Dank!

Code

Quellcode

GitHub Repository

Schaltpläne

Eigenen KI-Assistenten-Roboter mit Arduino & Python bauen

Herstellungsprozess

  1. Roboter mit Raspberry Pi und Python bauen: Komplette Anleitung
  2. Internet-gesteuerter Video-Streaming-Roboter mit Arduino & Raspberry Pi bauen
  3. type() und isinstance() in Python verstehen: Praktische Beispiele
  4. RFID-Anwesenheitssystem mit Arduino & Python – Daten direkt in phpMyAdmin (XAMPP) speichern
  5. Servogesteuerter Hindernisvermeidungs-Roboter: Bauen mit Arduino & HC-SR04
  6. Roomba Create 2 per Arduino & Android steuern – Schritt-für-Schritt
  7. Arduino & MPU6050: Präzise Servomotor-Steuerung mit SG90 & MG996R
  8. u-blox LEA-6H 02 GPS-Modul: Arduino & Python Integrationsanleitung
  9. Spracherkennung & Sprachsynthese auf Arduino Due meistern
  10. Autonomer Hausassistent-Roboter bauen: Komplette Teileliste & Setup-Anleitung