Tal kontrollerade Quadropod (5 / 6 steg)
Steg 5: kodning
Arduino:
Lansera Arduino och öppna en ny skiss. Jag har tyvärr inte tillräcklig tid att lära dig grunderna i Arduino. Du kan slå upp några tutorials om du känner för. Så detta är vad vi ska göra, när du öppnat en ny skiss: filen >> ny eller Ctrl + N.
Kopiera klistra in följande kod (eller bara ladda ner den bifogade filen). Jag är skyldig Oddbot igen för att hjälpa mig med den rörelse delen av koden looooong lååång tillbaka.
Koden:
/ * Titel: tal kontrollerade Quadropod
Författare: Björn Johan Désirées
Kommentarer: Denna kod är gratis för dig att använda, modifiera eller bara stirra på när du är riktigt uttråkad.
*/
#include < Servo.h > / / Servo bibliotek
Utgångspunkter för servon
#define FLHcenter 1500
#define FRHcenter 1500
#define RLHcenter 1520
#define RRHcenter 1450
#define FLKcenter 1150
#define FRKcenter 1220
#define RLKcenter 1220
#define RRKcenter 1210
Här kan du ändra servo pin nummer motsvarande
till din specifika anslutningar
#define FLHpin 46 / / främre vänster höft servo pin
#define FRHpin 52 / / främre höger höft servo pin
#define RLHpin 28 / / bakre vänster höft servo pin
#define RRHpin 13 / / bakre höger höft servo pin
#define FLKpin 47 / / främre vänster knä servo pin
#define FRKpin 53 / / främre höger knä servo pin
#define RLKpin 29 / / bakre vänster knä servo pin
#define RRKpin 12 / / bakre höger knä servo pin
Buffert för tal meddelandet
char INBYTE;
Lysdioder! Om du väljer att använda 'em
int led1 = 27.
int led2 = 11;
int led3 = 45;
int led4 = 26.
Vissa konstanter för den bot motioner, ja du kan
spela med dem för att få bästa prestanda
int tid = 90.
int LShift = 280;
int RShift = 280;
int höjning = 550;
Definiera servon
Servo FLHservo;
Servo FRHservo;
Servo RLHservo;
Servo RRHservo;
Servo FLKservo;
Servo FRKservo;
Servo RLKservo;
Servo RRKservo;
void setup()
{
Bifoga servon (digitalt)
FLHservo.attach(FLHpin);
FRHservo.attach(FRHpin);
RLHservo.attach(RLHpin);
RRHservo.attach(RRHpin);
FLKservo.attach(FLKpin);
FRKservo.attach(FRKpin);
RLKservo.attach(RLKpin);
RRKservo.attach(RRKpin);
Koppla lysdioder (digitalt)
pinMode (led1, produktionen);
pinMode (led2, produktionen);
pinMode (led3, produktionen);
pinMode (led4, produktionen);
Serial.BEGIN(9600);
Center servon
FLHservo.writeMicroseconds(FLHcenter);
FRHservo.writeMicroseconds(FRHcenter);
RLHservo.writeMicroseconds(RLHcenter);
RRHservo.writeMicroseconds(RRHcenter);
FLKservo.writeMicroseconds(FLKcenter+700);
FRKservo.writeMicroseconds(FRKcenter+700);
RLKservo.writeMicroseconds(RLKcenter+700);
RRKservo.writeMicroseconds(RRKcenter+700);
Delay(500);
Skriver ut kontrollerna mappas till olika bokstäver
Serial.println ("wasd - rörelse");
Serial.println ("z - sömn");
Serial.println ("x - play dead");
Serial.println ("i - sitta");
Serial.println ("u - stå");
Serial.println ("q - vakna upp");
}
void loop() {
Serial.println ("redo att acceptera kommandot");
tag (!. Serial.available()); bo här så länge COM-porten är tom
INBYTE = Serial.read(); läsa nästa tillgängliga byte
Delay(50);
om (INBYTE == "q") / / vaknar - blinkar lysdioderna om du använt dem
{
digitalWrite (led1, låg);
digitalWrite (led2, låg);
digitalWrite (led3, låg);
digitalWrite (led4, låg);
Delay(200);
digitalWrite (led1, hög);
digitalWrite (led2, hög);
digitalWrite (led3, hög);
digitalWrite (led4, hög);
Delay(200);
digitalWrite (led1, låg);
digitalWrite (led2, låg);
digitalWrite (led3, låg);
digitalWrite (led4, låg);
Delay(200);
digitalWrite (led1, hög);
digitalWrite (led2, hög);
digitalWrite (led3, hög);
digitalWrite (led4, hög);
Delay(200);
digitalWrite (led1, låg);
digitalWrite (led2, låg);
digitalWrite (led3, låg);
digitalWrite (led4, låg);
Delay(200);
digitalWrite (led1, hög);
digitalWrite (led2, hög);
digitalWrite (led3, hög);
digitalWrite (led4, hög);
Delay(200);
digitalWrite (led1, låg);
digitalWrite (led2, låg);
digitalWrite (led3, låg);
digitalWrite (led4, låg);
Delay(200);
digitalWrite (led1, hög);
digitalWrite (led2, hög);
digitalWrite (led3, hög);
digitalWrite (led4, hög);
}
annars om (INBYTE == "z") //Sleeps
{
FLHservo.writeMicroseconds(FLHcenter);
FRHservo.writeMicroseconds(FRHcenter);
RLHservo.writeMicroseconds(RLHcenter);
RRHservo.writeMicroseconds(RRHcenter);
FLKservo.writeMicroseconds(FLKcenter+700);
FRKservo.writeMicroseconds(FRKcenter+700);
RLKservo.writeMicroseconds(RLKcenter+700);
RRKservo.writeMicroseconds(RRKcenter+700);
Delay(1000);
digitalWrite (led1, hög);
digitalWrite (led2, hög);
digitalWrite (led3, hög);
digitalWrite (led4, hög);
Delay(200);
digitalWrite (led1, låg);
digitalWrite (led2, låg);
digitalWrite (led3, låg);
digitalWrite (led4, låg);
Delay(200);
digitalWrite (led1, hög);
digitalWrite (led2, hög);
digitalWrite (led3, hög);
digitalWrite (led4, hög);
Delay(200);
digitalWrite (led1, låg);
digitalWrite (led2, låg);
digitalWrite (led3, låg);
digitalWrite (led4, låg);
Delay(200);
digitalWrite (led1, hög);
digitalWrite (led2, hög);
digitalWrite (led3, hög);
digitalWrite (led4, hög);
Delay(200);
digitalWrite (led1, låg);
digitalWrite (led2, låg);
digitalWrite (led3, låg);
digitalWrite (led4, låg);
Delay(200);
}
annars om (INBYTE == "u") / / stå upp
{
Center servon
FLHservo.writeMicroseconds(FLHcenter);
FRHservo.writeMicroseconds(FRHcenter);
RLHservo.writeMicroseconds(RLHcenter);
RRHservo.writeMicroseconds(RRHcenter);
FLKservo.writeMicroseconds(FLKcenter);
FRKservo.writeMicroseconds(FRKcenter);
RLKservo.writeMicroseconds(RLKcenter);
RRKservo.writeMicroseconds(RRKcenter);
Delay(1000);
}
annars om (INBYTE == "x") / / spelar döda X
{
FLHservo.writeMicroseconds(FLHcenter);
FRHservo.writeMicroseconds(FRHcenter);
RLHservo.writeMicroseconds(RLHcenter);
RRHservo.writeMicroseconds(RRHcenter);
FLKservo.writeMicroseconds(FLKcenter+700);
FRKservo.writeMicroseconds(FRKcenter+700);
RLKservo.writeMicroseconds(RLKcenter+700);
RRKservo.writeMicroseconds(RRKcenter+700);
Delay(1000);
}
annars om (INBYTE == 'i') //sits
{
FLHservo.writeMicroseconds(FLHcenter);
FRHservo.writeMicroseconds(FRHcenter);
RLHservo.writeMicroseconds(RLHcenter-600);
RRHservo.writeMicroseconds(RRHcenter+600);
FLKservo.writeMicroseconds(FLKcenter);
FRKservo.writeMicroseconds(FRKcenter);
RLKservo.writeMicroseconds(RLKcenter+700);
RRKservo.writeMicroseconds(RRKcenter+700);
}
annars om (INBYTE == "h") //shake händer
{
FLHservo.writeMicroseconds(FLHcenter-600);
FRHservo.writeMicroseconds(FRHcenter);
RLHservo.writeMicroseconds(RLHcenter-600);
RRHservo.writeMicroseconds(RRHcenter+600);
FLKservo.writeMicroseconds(FLKcenter+600);
FRKservo.writeMicroseconds(FRKcenter);
RLKservo.writeMicroseconds(RLKcenter-700);
RRKservo.writeMicroseconds(RRKcenter+700);
Delay(1000);
FLKservo.writeMicroseconds(FLKcenter+300);
Delay(200);
FLKservo.writeMicroseconds(FLKcenter+600);
Delay(200);
FLKservo.writeMicroseconds(FLKcenter+300);
Delay(200);
FLKservo.writeMicroseconds(FLKcenter+600);
Delay(200);
}
annars om (INBYTE == "w") / / kör fram
{
LShift = 300;
RShift = 300;
för (int jag = 0; jag < 5; i ++)
{
Run();
}
}
annars om (INBYTE == "a") / / sväng vänster
{
LShift =-300;
RShift = 300;
för (int jag = 0; jag < 3; i ++)
{
Run();
}
}
annars om (INBYTE == hade ") / / sväng höger
{
LShift = 300;
RShift =-300;
för (int jag = 0; jag < 3; i ++)
{
Run();
}
}
annars om (INBYTE == 's ") / / kör tillbaka
{
LShift =-300;
RShift =-300;
för (int jag = 0; jag < 5; i ++)
{
Run();
}
}
}
void Run()
{
FRKservo.writeMicroseconds(FRKcenter+Raise); höja främre höger ben
RLKservo.writeMicroseconds(RLKcenter+Raise-10); höja bak vänster ben
FLHservo.writeMicroseconds(FLHcenter+LShift); flytta vänster framben bakåt
RRHservo.writeMicroseconds(RRHcenter-RShift); flytta bak höger ben bakåt
Delay(Time/2);
FRHservo.writeMicroseconds(FRHcenter+RShift); Gå höger framben framåt
RLHservo.writeMicroseconds(RLHcenter-LShift); flytta bak vänster ben fram
Delay(Time);
FRKservo.writeMicroseconds(FRKcenter); nedre höger framben
RLKservo.writeMicroseconds(RLKcenter); bakre vänstra underbenet
Delay(Time);
FLKservo.writeMicroseconds(FLKcenter+Raise); höja vänster framben
RRKservo.writeMicroseconds(RRKcenter+Raise); höja bakre höger ben
FRHservo.writeMicroseconds(FRHcenter-RShift); flytta höger framben bakåt
RLHservo.writeMicroseconds(RLHcenter+LShift); flytta bak vänster benet bakåt
Delay(Time/2);
FLHservo.writeMicroseconds(FLHcenter-LShift); gå vänster framben framåt
RRHservo.writeMicroseconds(RRHcenter+RShift); flytta bak höger ben fram
Delay(Time);
FLKservo.writeMicroseconds(FLKcenter); nedre vänstra framben
RRKservo.writeMicroseconds(RRKcenter); Bakre höger underben
Delay(Time);
}
Precis innan du kan ladda upp koden, gör följande:
Öppna Enhetshanteraren och leta upp portar (COM & LPT).
Verktyg >> styrelsen >> Arduino Mega eller Mega 2560 (bild 2)
Tools >> processorn >> ATMega 1280 (bild 3)
Verktyg >> Port >> COM3 (3 i mitt fall bara!) (bild 4)
Nu kan du slå på upload-knappen och om allt går smidigt, bör ladda framgångsrikt och roboten ska vara på dess mage med fyra ben utsträckt symmetriskt med en stadig LED blinkar från HC-06.
Om du får detta fel medan uppladdning:
avrdude: stk500_getsync(): inte i synk: resp = 0xe0
Bara koppla bort HC06-modulen, ladda upp koden och ansluta den igen.
OK insåg jag något medan jag testar och skriver den här guiden. Du behöver inte både BitVoicer och Python, du behöver bara någon av dem. BitVoicer gör allt för dig och dess taligenkänningsverktyg är ganska mäktig men det kostar $5 medan python's taligenkänning använder Google Speech API så det kan ibland ge några riktigt konstiga resultat och har några fler kodning, så valet är ditt.
Bluetooth
Okej bara innan vi går vidare till tal erkännande lite via BitVoicer eller Python, kan koppla bluetooth i din dator till HC 06 av din bot. Kontrollera att bluetooth på datorn fungerar innan du fortsätter eftersom det tog mig 5 timmar att inse att min laptop inte kom med en inbyggd bluetooth och jag var tvungen att beställa en modul.
Nu driva upp din bot antingen via USB eller batteriet. OMG när gör denna tutorial slutet!!! Tålamod! Du är nästan där.
- Högerklicka på Bluetooth-enheter-ikonen i tray baren och klicka på Lägg till ny enhet.
- Låt det Sök och Sök och Sök fram till HC - 06 dyker upp
Om det inte visas efter någon gång försöka kontrollera om du kan hitta enheten med din mobiltelefon (varje telefon förutom Apple telefoner bör kunna upptäcka det). Om du inte du vet att det är något fel med din HC-06 och måste du åtgärda det genom att kontrollera anslutningarna.
BitVoicer (alternativ 1)
Du kan hämta BitVoicer från här.
Första saker först, om du inte är en amerikansk engelska högtalare kanske du vill ändra språk/accent som BitVoicer kommer att försöka känna igen. För att göra detta gå till fil >> ytterligare språk och gå på installera din föredragna språk/dialekt.
Nu är vi redo att lägga till vissa kommandon. För förrätter vi kommer att lägga till bara två kommandon nämligen stå upp och sitta ner. Du kan redigera dem eller lägga till fler kommandon senare. Stegen är följande:
- Skapa ett nytt Schema vid går till arkivera >> New.
- Ändra standarddatatyp kommando till röding.
- Klicka på Lägg till ny mening
- Skriv i "stå upp" (inga citationstecken)
- Klicka på Lägg till ny mening
- Skriv i "sitta" (återigen utan citationstecken)
- Nu nedan i meningen anagram, ändra datatyperna för båda befallningen till röding om dess inte redan char.
- För stå upp typ kommandot som du och för sitta typ jag.
- Skärmen ska se ut bild 5.
- Spara ditt schema i en katalog som är bekvämt för dig.
- Nu öppna inställningar av filen >> Inställningar och fyll i saker med. Bara tre saker som kommer att vara annorlunda för dig kommer att vara standard Output mappen, tal tolkningsspråk och portnamnet.
- COM-porten som din Bluetooth använder att du fick reda på i steg 6 i Bluetooth motsvarar din portnamn. Prova det lägre nummer först.
- Tryck spara.
- Gå till nästa steg.
Python (alternativ 2)
Först hämta Python (för denna tutorial jag ska använda version 3.4) som kan laddas ner från https://www.python.org/download/releases/3.4.1/ varför 3.4 och inte den 2,7 versionen? Bra tal erkännande som vi använder fungerar endast på 3,4 version av python (ya jag vet som suger men hey 3.4 > 2,7 rätt?)
Installera den in i C:\Python34 för bekvämlighet skull. Nästa sak du behöver göra är att hämta och installera eclipse som är ett gränssnitt för att skriva din kod via Python. Du kan hämta den från http://www.eclipse.org/downloads/ installera den in i C:\eclipse
Om du får detta felmeddelande när du kör det...
En Java Runtime Environment (JRE) eller Java Development Kit (JDK) måste vara tillgänglig för att köra Eclipse. Ingen virtuell Javamaskin hittades efter en sökning på följande platser:
C:\eclipse\jre\bin\javaw.exe
javaw.exe i din nuvarande väg
Gå till det första svaret i http://stackoverflow.com/questions/2030434/eclipse-no-java-jre-jdk-no-virtual-machine
www.StackOverflow.com är den bästa platsen att hitta hjälp för problem i python
Använd den här självstudien installera python i eclipse utom i stället för python 2.6 bör du välja python 3.4. Alternativt använda denna tutorial att installera python till Geany om du valde att använda Geany som jag hör är mycket trevligare än eclipse men jag har inte haft tillräckligt med tid att migrera till det. Det finns något som kallas "bibliotek" som du kommer att behöva komma åt de olika funktionerna för python. Nu kan gå vidare och installera några bibliotek som vi behöver för detta projekt. För dig som redan vet hur man installerar gå bibliotek bara framåt installera de lista dem och gå vidare till koden.
Bibliotek som krävs:
- PyBluez 0,20 - Bluetooth (setup)
- PyAudio 0.2.8 - ger bindningar för taligenkänning (setup)
- SpeechRecognition 1.1.0 - taligenkänning (Hämta)
PyBluez och PyAudio kan installeras genom att ladda ner den "... win32-py3.4.exe" versioner från länken och helt enkelt köra den körbara (setup) fil.
SpeechRecognition bibliotek är lite knepigt om du är ny med python. Öppna "download" länken ovan och klickar på hämtningsbara filer. Ladda ner "SpeechRecognition-1.1.0.tar.gz (md5)". Extrahera alla innehållet (inte mappen som säger SpeechRecognition-1.1.0 men whats i det) av den nedladdade mappen (via winRAR eller någon du känner med extractor) till katalogen python 3.4 (C:\Python34). En dialogruta öppnas och du tillfrågas om du vill ersätta befintliga filer, klicka på Ja till alla. Nu navigera till C: driva och medan du håller SKIFT, högerklicka på den mapp som säger Python34 och klicka på "öppen befalla fönster här". Skriv i "installera python setup.py" utan citattecken och tryck Enter. Nu bör du ha alla nödvändiga bibliotek installerat. Yay!
Öppen eclipse.
Skapa en ny fil som heter Speech_Controlled_Quadrapod.py liknar hur du skapade pytest.py filen som du skapade i handledningen under mappen PythonTest från handledning. Nu klistra in eller ladda ner...
Koden:
# Namn: Tal kontrollerade Quadrapod
# Författare: Björn Johan
# Beskrivning: Använder Googles tal erkännande API och python bluetooth-bibliotek för att kontrollera en quadrapod
# Hur man: säga "stå upp" att göra bot stå upp och säga "sitta" för att göra det sitta.
# Säger "sluta lyssna för att avsluta programmet"
importera bluetooth
importera speech_recognition som sr
port = 1
BD_ADDR = "xx"
Sock = bluetooth. BluetoothSocket (bluetooth. RFCOMM)
Sock.connect ((bd_addr, port))
r = sr. Recognizer()
r.pause_threshold = 0,6
r.energy_threshold = 400
MEDDELANDE = "Fortsätt"
skriva ut ("redo att acceptera command...\n")
medan (meddelande! = "sluta lyssna"):
medan (meddelande == "fortsätta"):
försök:
# Använd standard mikrofonen som ljudkälla
med sr. Microphone() som källa:
# lyssna på den första meningen och extrahera den till ljuddata
ljud = r.listen (källa, timeout = ingen)
# känna igen tal med hjälp av Google taligenkänning
skriva ut ("mig:" + r.recognize(audio))
MEDDELANDE = str(r.recognize(audio))
Förutom LookupError:
# tal är obegripligt
MEDDELANDE = "Fortsätt"
skriva ut ("kunde inte förstå ljud")
om (meddelande == "sitta"):
Sock.send("i")
Elif (meddelande == "stand up"):
Sock.send("u")
Elif (meddelande == "sluta lyssna"):
bryta;
MEDDELANDE = "Fortsätt"
Sock.Close()
skriva ut ("\nProgram avslutade.")
Den enda ändring som du behöver göra är i raden:
BD_ADDR = "xx"
Högerklicka på bluetooth-ikonen i facket och klicka på "Visa Bluetooth-enheter". Högerklicka på HC-06 och klicka på egenskaper. Gå till fliken Bluetooth och kopiera den unika ID-nummer och klistra som i stället xx.
Du är bra att gå provning.