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
- Arduino IDE
Ü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:
- Arduino Nano – 1x
- Mikro-Servo SG90 – 3x
- Ultraschallsensor HC-SR04 – 1x
Gehäuse:
- PVC-Platte (bevorzugt weiß, besser zum Bemalen; ich verwendete eine blaue)
- Servo-Rad (für den Ständer)
Werkzeuge:
- Cuttermesser
- Schere
- Heißkleber
- Sprühfarbe
Software:
- Python 3
- Arduino IDE
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
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
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
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)
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
Schaltpläne
Herstellungsprozess
- Roboter mit Raspberry Pi und Python bauen: Komplette Anleitung
- Internet-gesteuerter Video-Streaming-Roboter mit Arduino & Raspberry Pi bauen
- type() und isinstance() in Python verstehen: Praktische Beispiele
- RFID-Anwesenheitssystem mit Arduino & Python – Daten direkt in phpMyAdmin (XAMPP) speichern
- Servogesteuerter Hindernisvermeidungs-Roboter: Bauen mit Arduino & HC-SR04
- Roomba Create 2 per Arduino & Android steuern – Schritt-für-Schritt
- Arduino & MPU6050: Präzise Servomotor-Steuerung mit SG90 & MG996R
- u-blox LEA-6H 02 GPS-Modul: Arduino & Python Integrationsanleitung
- Spracherkennung & Sprachsynthese auf Arduino Due meistern
- Autonomer Hausassistent-Roboter bauen: Komplette Teileliste & Setup-Anleitung