Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Bouw uw eigen AI-assistent robot met Arduino & Python

Onderdelen en benodigdheden

Onderdeel Aantal
Arduino Nano R3 1
SG90 Micro-servo motor 1
Ultrasonische Sensor - HC-SR04 (Generic) 1
PCBWay Custom PCB 1

Apps en online diensten

  • Arduino IDE

Over dit project

Introductie

We kennen allemaal 'Jarvis', de AI-assistent robot uit de "Iron Man" films en Marvel-series. Het is altijd een droom van programmeurs geweest om zo iets zelf te maken. Ik laat vandaag een eenvoudige manier zien om zo'n assistent te maken met Python-programmering. Bovendien maak ik ook een fysieke avatar van die robot, zodat de robot bij het praten bewegingen kan maken. Dat is nog cooler dan alleen een software-robot. Omdat als het een lichaam heeft, is het cool. Vandaag leren we zowel Arduino als Python-programmering gebruiken om een AI-robot te maken die uw computer kan controleren en een beetje kan kletsen. Laten we beginnen!

Waarom ik de robot 'Jaundice' noemde? Omdat ik het geel verfde, heel erg geel!

Onderdelen

Elektronica -

  • Arduino Nano – 1x
  • Micro Servo SG90 – 3x
  • Ultrageluidssensor HC-SR04 – 1x

Lichaam –

  • PVC-vel (wit preferred, beter voor kleuren, ik gebruikte blauwe)
  • Servo-wiel (voor de stand)

Tools:

  • Stanleymes
  • Schaar
  • Lijm pistool
  • Sprayverf

Software -

  • Python 3
  • Arduino IDE

Principe

Voordat we in de daadwerkelijke bouwen stappen, is het goed om een idee te hebben van wat we gaan doen.

De hoofdcode of AI-deel van de code draait op de computer, waarom? Omdat het Python ondersteunt en meer verwerkingskracht heeft dan de kleine Arduino, en omdat de AI-bot sommige taken van mijn PC zal controleren/automatiseren, moet het op mijn PC draaien. Dus het Arduino-bord is verbonden met mijn computer via de USB-kabel.

Het idee is om een Python-programma te draaien dat de Speech-to-text zal doen, de tekst verwerkt en ook Text-to-speech zal doen. Dus de robot luistert, begrijpt en praat terug. Voor lichaamsbewegingen heb ik enkele bewegingen opgeslagen (ingekapseld in functies) in het Arduino-bord. De functie voor elke beweging wordt uitgevoerd door de Python-code.

Als voorbeeld – als de robot 'Hoi/hallo' moet zeggen, stuurt de Python-code een byte 'h', Arduino voert dan de hi()-functie uit. Zo simpel is dat.

Nu u een idee hebt, laten we doorgaan naar het volgende proces.

Circuits en elektronica

Circuits zijn de dingen die de meeste makers irriteren. Als er iets misgaat, kunt u dure onderdelen verbranden. Daarvoor heb ik een PCB-bord ontworpen dat gebruikt kan worden voor talloze projecten. Het heeft een micro SD-kaart slot, Bluetooth-module slot, 5V externe voedingsbron en het hele ding wordt gevoed door de Arduino Nano.

Ik ontwierp een PCB met EasyEDA en liet het printen via de PCBWay online service. Hun service is geweldig. Ik bestelde met PCB instant quote en hun systeem deed alles automatisch voor me. Binnen 3 dagen had ik het bord uit China naar Bangladesh. De kwaliteit is fantastisch, soldeermaskering is perfect en de lijnen/sporen, finish is zo goed als het kan zijn.

Ik gebruikte 0,3mm sporen omdat ze 1 Ampère stroom kunnen dragen.

U kunt de PCB-bestanden hier downloaden.

Dingen solderen en circuit testen

In deze stap solderde ik alles. Wees heel voorzichtig om de rook niet in te ademen, het kan kanker veroorzaken.

Ik gebruik geen Bluetooth-module noch TF-module, dus die laat ik ongesoldeerd. Het goede is dat ik 3 servomotoren en één sonarsensor gebruik, alle dingen krijgen makkelijk stroom van de USB-kabel die we aansluiten om de Arduino te programmeren. Dit is geweldig omdat we niet hoeven te denken over een andere voedingsbron.

Als u toch externe batterijen wilt gebruiken, ga dan voor lipo 2s (7,4V) batterijen, meer dan dat en de servo brandt.

Het lichaam maken

Ik gebruikte PVC-vel om het lichaam te maken, u kunt ook karton gebruiken. Eerst maakte ik een doos voor het hoofdgedeelte, daar gaat de hoofdbord en servomotoren. Het is net als dozen maken. Ik maakte de hoofd op dezelfde manier, maakte twee gaten voor de sensor (als ogen). Ik heb alle benodigde foto's toegevoegd. Ik maakte één hand als een sleutel en een andere als een stekker. Ik gebruikte eigenlijk een stekker en plakte die aan één arm met hete lijm.

Afmetingen? Eigenlijk zijn er geen, want het is jouw robot, je kunt het maken met enkele eenvoudige tools, dus maak het zoals je wilt, maak het van elke vorm en grootte.

Wees super voorzichtig om alle elektronica toe te voegen voordat u het lichaam sluit. Ik schilderde het lichaam na het plaatsen van sensoren en alle elektronica. Doe dat niet, ik heb al mijn Arduino geel gekleurd.

Dus, verf na het afmaken van het lichaam, zet dan alle elektronica erin.

Coderen 1 (Python)

Download Python van deze site, zorg ervoor dat u Python toevoegt aan uw pad tijdens de installatie.

Na het installeren van Python moet u enkele commando's uitvoeren vanaf de opdrachtprompt/terminal om bibliotheken te installeren voor Spraakherkenning, Audio-ondersteuning, Tekst-naar-spraak, Browser-automatisering, Seriële communicatie. Voer deze commando's uit:

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

Download dan de Python-code van hier of kopieer hieronder. Ga naar coderen 2 stap.

""" JAUNDICE: AI Assistant robot met Arduino en Python
auteur: ashraf minhaj
mail: ashraf_minhaj@yahoo.com
Laatste bewerking: Nov 2020
Licentie: Copyright (C) Ashraf Minhaj. General Public 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("Fysiek lichaam, verbonden.")
except:
    print("Kan niet verbinden met mijn fysieke lichaam")

def listen():
    try:
        with sr.Microphone() as source:
            print("Praat>>")
            voice = listener.listen(source)
            command = listener.recognize_google(voice).lower()
            print(command)
            if (command.split(' ')[0] == robot_name):
                print("[wake-up word gevonden]")
                process(command)
    except:
        pass

def process(words):
    print(words)
    word_list = words.split(' ')[1:]
    if (len(word_list)==1):
        if (word_list[0] == robot_name):
            talk("Hoe kan ik u helpen?")
            return
    if word_list[0] == 'play':
        talk("Okay baas, aan het spelen")
        extension = ' '.join(word_list[1:])
        port.write(b'u')
        pywhatkit.playonyt(extension)
        port.write(b'l')
        return
    elif word_list[0] == 'search':
        port.write(b'u')
        talk("Okay baas, aan het zoeken")
        port.write(b'l')
        extension = ' '.join(word_list[1:])
        pywhatkit.search(extension)
        return
    if (word_list[0] == 'get') and (word_list[1] == 'info'):
        port.write(b'u')
        talk("Okay, ik ben er direct")
        port.write(b'u')
        extension = ' '.join(word_list[2:])
        inf = pywhatkit.info(extension)
        talk(inf)
        return
    elif word_list[0] == 'open':
        port.write(b'l')
        talk("Openen, meneer")
        url = f"https://{''.join(word_list[1:])}"
        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')
    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()

Coderen 2 (Arduino)

Deze deel is makkelijk, niets te installeren. Gebruik Arduino IDE om het bord te programmeren. Download hier als u Arduino nog nooit heeft gebruikt.

Zoals eerder vermeld, wacht het Arduino-programma op seriële data, als het enige data ontvangt, controleert het de bytedata. Als data overeenkomt met een vooraf gedefinieerd commando, voert het een statement uit. Als 'u' wordt gestuurd, laat het beide handen omhoog gaan, enzovoort.

/** JAUNDICE: AI Assistant robot met Arduino en Python
* auteur: ashraf minhaj
* mail: ashraf_minhaj@yahoo.com
* Laatste bewerking: Nov 2020
* Licentie: Copyright (C) Ashraf Minhaj. General Public License (GPL3+) */
#include 
Servo head;
Servo l_hand;
Servo r_hand;
int trig = 4;
int echo = 5;
byte val = "";
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;
        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(int 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() {
    for(int 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(int 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(int 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(int 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() { 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() {
    for(int 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() {
    for(int 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(int i=170; i>=60; i--){ r_hand.write(i); delay(1); }
        for(int i=60; i<=170; i++){ r_hand.write(i); delay(1); }
    }
    standby(); delay(100);
}
void smash() {
    for(int 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(int 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() { return; }
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); }
    }
}

Alles samenvoegen en klaar

Na het voltooien van al die stappen, verbond ik mijn Arduino met de pc via de USB-kabel en draaide het Python-programma. Zorg ervoor dat u de juiste poort van de Arduino in de Python-code invult. Als u alles gedaan heeft zoals ik beschreven, zou de bot net als een tierelier moeten werken.

Dank u!

Code

Broncode: https://github.com/ashraf-minhaj/JAUNDICE-AI-Assistant-Robot

Schema's

Schema-afbeelding beschikbaar in originele project.

Productieproces

  1. Een Robot Bouwen met Raspberry Pi en Python: Een Complete Gids
  2. Bouw een Internet-gecontroleerde Video-streamende Robot met Arduino & Raspberry Pi
  3. Betrouwbaar Arduino RFID Aanwezigheidssysteem Aangedreven door Python
  4. Servo-gestuurde obstakelvermijdende robot: Bouw met Arduino & HC-SR04
  5. Bestuur Je Roomba Create 2 Met Arduino En Android: Stapsgewijze Handleiding
  6. Arduino & MPU6050: Precieze Servomotor Besturing met SG90 & MG996R
  7. u-blox LEA‑6H GPS Module: Arduino & Python Integratie Handleiding
  8. Spraakherkenning & Synthese Meesteren op Arduino Due
  9. Bouw een Autonome Thuisassistent Robot: Complete Onderdelenlijst & Opzetgids
  10. Arduino robotarm besturen via speciale Android-app
  11. type() en isinstance() in Python begrijpen: praktische voorbeelden