Necomimi Arduino katt öron (4 / 8 steg)
Steg 4: Skissartade Detaljer
Klippa bara och klistra in som du laddar upp en fil på ibles får inte behålla filnamnet och kommer att vara förvirrande.
=== starta skiss ===
/*
Detta program är baserade Arduino skiss exempel och följande:
ADXL345_Example.pde - exemplet skiss för integration med en ADXL345 triple axlig accelerometer.
Copyright (C) 2011 kärlek elektronik (loveelectronics.co.uk)
Detta program är fri programvara: du kan vidaredistribuera det och/eller ändra
det enligt villkoren i version 3 GNU General allmänhet licens som
Publicerad av Free Software Foundation.
Detta program är distribuerat i hopp om att det kommer att vara användbar,
men utan garantier; utan att ens underförstådd garanti om
SÄLJBARHET eller lämplighet för ett visst ändamål. Se den
GNU General Public License för mer detaljer.
Du bör ha fått en kopia av GNU General Public License
tillsammans med detta program. Om inte, se < http://www.gnu.org/licenses/>.
*/
Inkludera Wire biblioteket så vi kan börja använda I2C.
#include < Wire.h >
Inkludera kärlek elektronik ADXL345 biblioteket så att vi kan använda accelerometern.
#include < ADXL345.h >
inkludera servo biblioteket för att styra servo
#include < Servo.h >
Servo myservoA; skapa objekt för att styra en servo servo
maximalt åtta servo objekt kan skapas
Servo myservoB; skapa objekt för att styra en servo servo
maximalt åtta servo objekt kan skapas
int posA = 0; variabel att lagra servo position
int posB = 0;
Deklarera en global instans av accelerometern.
ADXL345 accel;
Ställa in en PIN-kod vi använder för att ange vår status med hjälp av en LED.
int statusPin = 2; Jag använder digital stift 2.
//------------------------------------------------------
void setup()
{
myservoA.attach(7); tillmäter objektet servo servo på stift 6
myservoB.attach(6); tillmäter objektet servo servo på stift 7
Börja med att ställa in serieporten så vi kan mata våra resultat.
Serial.BEGIN(9600);
Starta I2C tråd biblioteket så att vi kan använda I2C för att prata med accelerometern.
Wire.BEGIN();
Redo en LED att ange vår status.
pinMode (statusPin, produktionen);
Skapa en instans av accelerometern på standardadressen (0x1D)
accel = ADXL345();
Kontrollera att accelerometern är infact ansluten.
IF(Accel. EnsureConnected())
{
Serial.println ("ansluten till ADXL345.");
digitalWrite (statusPin, hög); Om vi är anslutna, ljus vår status LED.
}
annat
{
Serial.println kunde ("inte ansluta till ADXL345.");
digitalWrite (statusPin, låg); Om vi inte är ansluten, stänga våra LED.
}
Ange de accelerometern till högst 2G.
Accel. SetRange (2, true);
Berätta accelerometern för att börja ta mätningar.
Accel. EnableMeasurements();
}
//----------------------------------
void loop()
{
IF(Accel. IsConnected) / / om vi är anslutna till accelerometern.
{
Läsa rådata från accelerometern.
AccelerometerRaw rå = accel. ReadRawAxis();
Dessa data kan nås som så:
int xAxisRawData = rå. XAxis;
Läs den * skalade * data från accelerometern (detta har egen Läs från accelerometern
så du behöver inte ReadRawAxis innan du använder denna metod).
Detta användbar metod ger du värdet i G tack vare kärlek elektronik biblioteket.
AccelerometerScaled skalas = accel. ReadScaledAxis();
Dessa data kan nås som så:
flyta xAxisGs = skalas. XAxis;
Vi ut våra mottagna data.
Utgång (rå, skalad);
}
}
Spara data ner den seriella porten.
void utgång (AccelerometerRaw raw, AccelerometerScaled skalas)
{
initiera LED stift som en utgång:
pinMode (8, OUTPUT);
pinMode (9, OUTPUT);
pinMode (11, OUTPUT);
pinMode (12, OUTPUT);
Berätta om raw värdena kommer från accelerometern.
Serial.Print("RAW:\t");
Serial.Print (rå. XAxis);
Serial.Print("");
Serial.Print (rå. YAxis);
Serial.Print("");
Serial.Print (rå. ZAxis);
Berätta om denna data, men skala den till användbara enheter (G).
Serial.Print ("\tScaled:\t");
Serial.Print (skalas. XAxis);
Serial.Print ("G");
Serial.Print (skalas. YAxis);
Serial.Print ("G");
Serial.Print (skalas. ZAxis);
Serial.println("G");
Visa led för axel
om (skalas. XAxis > 0) {
digitalWrite 8, hög. ställa in lysdioden på
}
annat
{
digitalWrite 8, låg. iväg för LED
}
//
om (skalas. YAxis > 0) {
digitalWrite (9, hög). ställa in lysdioden på
}
annat
{
digitalWrite (9, låg). iväg för LED
}
//
om (skalas. ZAxis > 0,8) {
digitalWrite (11, hög). ställa in lysdioden på
}
annat
{
digitalWrite (11, låg). iväg för LED
}
gör servo flytta villkor anat---
om (skalas. ZAxis < 0,8) {
Serial.println ("*** ta upp lägre---höja lägre");
RaiseLower();
Delay(265);
}
//
om (skalas. YAxis < 0) {
Serial.println ("*** rycka mitten---rycka mitten");
twitchMiddle();
Delay(400);
}
//
om (skalas. XAxis < 0 och skalas. YAxis > 0 och skalas. ZAxis > 0) {
Serial.println ("*** rätt---Wink Wink rätt");
winkRight();
Delay(265);
}
}
//-------------------------------
subrutin för höjning och lägre
void RaiseLower()
{
twitchshort();
Twitch();
för (posA = 0; posA < 135; posA += 1) / / går från 0 grader till 135 grader
{/ / i steg om 1 grad
myservoA.write(posA); berätta servo gå för att placera i variabel "pos"
myservoB.write(180-posA);
Delay(12); Waits 15 MS för servo att nå ställning
}
för (posA = 135; posA > = 1; posA-= 1) / / går från 135 grader till 0 grader
{
myservoA.write(posA); berätta servo gå för att placera i variabel "pos"
myservoB.write(180-posA);
Delay(12); Waits 15 MS för servo att nå ställning
}
}
subrutin för rycka---
void twitch()
{
för (posA = 0, posA < 45, posA += 1) / / går från 0 grader till 45 grader
{/ / i steg om 1 grad
myservoA.write(posA); berätta servo gå för att placera i variabel "pos"
myservoB.write(180-posA);
Delay(8); Waits 15 MS för servo att nå ställning
}
för (posA = 45, posA > = 1; posA-= 1) / / går från 45 grader till 0 grader
{
myservoA.write(posA); berätta servo gå för att placera i variabel "pos"
myservoB.write(180-posA);
Delay(8); Waits 15 MS för servo att nå ställning
}
}
subrutin för kort rycka---
void twitchshort()
{
för (posA = 0; posA < 25; posA += 1) / / går från 0 grader till 25 grader
{/ / i steg om 1 grad
myservoA.write(posA); berätta servo gå för att placera i variabel "pos"
myservoB.write(180-posA);
Delay(5); Waits 15 MS för servo att nå ställning
}
för (posA = 25; posA > = 1; posA-= 1) / / går från 25 grader till 0 grader
{
myservoA.write(posA); berätta servo gå för att placera i variabel "pos"
myservoB.write(180-posA);
Delay(5); Waits 15 MS för servo att nå ställning
}
}
subrutin för rycka mellersta---
void twitchMiddle()
{
för (posA = 0; posA < 100; posA += 1) / / går från 100 grader till 0 grader
{/ / i steg om 1 grad
myservoA.write(posA); berätta servo gå för att placera i variabel "pos"
myservoB.write(180-posA);
Delay(10); Waits 15 MS för servo att nå ställning
}
för (posA = 100; posA > = 1; posA-= 1) / / går från 100 grader till 0 grader
{
myservoA.write(posA); berätta servo gå för att placera i variabel "pos"
myservoB.write(180-posA);
Delay(10); Waits 15 MS för servo att nå ställning
}
Delay(250);
för (posA = 0, posA < 120, posA += 1) / / går från 100 grader till 0 grader
{/ / i steg om 1 grad
myservoA.write(posA); berätta servo gå för att placera i variabel "pos"
myservoB.write(180-posA);
Delay(10); Waits 15 MS för servo att nå ställning
}
}
subrutin för wink rätt---
void winkRight()
{
för (posA = 0, posA < 120, posA += 1) / / går från 0 grader till 120 grader
{/ / i steg om 1 grad
myservoA.write(posA); berätta servo gå för att placera i variabel "pos"
myservoB.write(180-posA);
Delay(10); Waits 15 MS för servo att nå ställning
}
för (posA = 120, posA > = 1; posA-= 1) / / går från 180 grader till 0 grader
{
myservoA.write(posA); berätta servo gå för att placera i variabel "pos"
myservoB.write(180-posA);
Delay(10); Waits 15 MS för servo att nå ställning
}
myservoB.write(180); upp andra örat om vila för att matcha upprätt
}
=== slutet av skiss ===
Om du lutar huvudet framåt, ska öronen göra en full upp och ner.
Om du luta huvudet åt höger, ska vänster örat gå upp och ner.
Det bör finnas en liten wiggle om en liten lutning. Öronen sjunka till ett nedfällt.
Leka med förseningen värden och servo timing öglor för realistisk action.
Kom ihåg, du kan behöva räkna ut där din servon är placerade vid 0 grader början och vilket sätt de rotera. Du har då att rymma rörelsen med servo kommandon i skissen.
X, Y, Z och servo rörelse i min prototyp kanske inte matchar din.