Stap 4: Schetsmatig details
Gewoon knippen en plakken als het uploaden van een bestand op ibles de bestandsnaam niet kan behouden en zal verwarrend.
=== begin van schets ===
/*
Dit programma is gebaseerde Arduino schets voorbeelden en de volgende:
ADXL345_Example.pde - voorbeeld schets voor integratie met een ADXL345 triple as versnellingsmeter.
Copyright (C) 2011 liefde elektronica (loveelectronics.co.uk)
Dit programma is vrije software: je kunt het herdistribueren en/of wijzigen
het onder de voorwaarden van de versie 3 GNU algemene publieke licentie als
gepubliceerd door de Free Software Foundation.
Dit programma is gedistribueerd in de hoop dat het bruikbaar,
maar zonder enige garantie; zelfs zonder de impliciete garantie van
VERKOOPBAARHEID of geschiktheid voor een bepaald doel. Zie de
GNU General Public License voor meer details.
U moet hebt ontvangen een kopie van de GNU General Public License
samen met dit programma. Zo niet, zie < http://www.gnu.org/licenses/>.
*/
Omvatten de draad bibliotheek zodat we kunnen beginnen met behulp van I2C.
#include < Wire.h >
Omvatten de liefde elektronica ADXL345 bibliotheek zodat we kunnen het gebruiken van de versnellingsmeter.
#include < ADXL345.h >
de servo-bibliotheek om te controleren de servo
#include < Servo.h >
Servo myservoA; maken van servo-object om te bepalen van een servo
maximaal acht servo-objecten kan worden gemaakt
Servo myservoB; maken van servo-object om te bepalen van een servo
maximaal acht servo-objecten kan worden gemaakt
int posA = 0; variabele op te slaan van de servo positie
int posB = 0;
Verklaar een globale exemplaar van de versnellingsmeter.
ADXL345 accel;
Instellen van een pin die we gaan gebruiken om aan te geven van onze status met behulp van een LED.
int statusPin = 2; Ik ben met behulp van digitale pin 2.
//------------------------------------------------------
VOID Setup
{
myservoA.attach(7); hecht de servo op pin 6 aan de servo-object
myservoB.attach(6); de servo op pin 7 hecht aan de servo-object
Beginnen met het opzetten van de seriële poort is, zodat we onze resultaten kunt uitvoeren.
Serial.begin(9600);
Start de I2C draad bibliotheek zodat we I2C gebruiken kunnen om te praten met de versnellingsmeter.
Wire.begin();
Een LED om aan te geven van onze status klaar.
pinMode (statusPin, OUTPUT);
Maak een exemplaar van de versnellingsmeter op het adres van de standaard (0x1D)
accel = ADXL345();
Controleer of de versnellingsmeter infact aangesloten is.
if(accel. EnsureConnected())
{
Serial.println ("verbonden met ADXL345.");
digitalWrite (statusPin, hoge); Als we zijn verbonden, het licht van onze status-LED.
}
anders
{
Serial.println kon ("niet verbinden met ADXL345.");
digitalWrite (statusPin, laag); Als wij niet zijn aangesloten, de onze LED uitschakelen.
}
De reeks van de versnellingsmeter in te stellen tot een maximum van 2G.
accel. SetRange (2, true);
Het vertellen van de versnellingsmeter om te beginnen met metingen.
accel. EnableMeasurements();
}
//----------------------------------
void loop
{
if(accel. IsConnected) / / als we zijn met de versnellingsmeter verbonden.
{
Lees de ruwe gegevens van de versnellingsmeter.
AccelerometerRaw ruwe = accel. ReadRawAxis();
Deze gegevens toegankelijk zijn als volgt:
int xAxisRawData = raw. XAxis;
Lees de * schaal * gegevens uit de versnellingsmeter (dit doet zijn eigen lezen van de versnellingsmeter
zodat u niet hoeft te ReadRawAxis voordat u deze methode gebruikt).
Deze nuttige methode geeft u de waarde in G dankzij de liefde elektronica-bibliotheek.
AccelerometerScaled geschaald = accel. ReadScaledAxis();
Deze gegevens toegankelijk zijn als volgt:
zweven xAxisGs = geschaald. XAxis;
We uitvoeren onze ontvangen gegevens.
Uitgang (rauw, schaal);
}
}
Uitvoer van de gegevens van de seriële poort.
VOID Output (AccelerometerRaw rauw, AccelerometerScaled geschaald)
{
Initialiseer de LED-pin als uitgang:
pinMode (8, OUTPUT);
pinMode (9, OUTPUT);
pinMode (11, OUTPUT);
pinMode (12, OUTPUT);
Vertel ons over de ruwe waarden afkomstig van de versnellingsmeter.
Serial.Print("RAW:\t");
Serial.Print (rauw. XAxis);
Serial.Print("");
Serial.Print (rauw. YAxis);
Serial.Print("");
Serial.Print (rauw. ZAxis);
Vertel ons over deze gegevens, maar schalen in nuttige eenheden (G).
Serial.Print ("\tScaled:\t");
Serial.Print (geschaald. XAxis);
Serial.Print ("G");
Serial.Print (geschaald. YAxis);
Serial.Print ("G");
Serial.Print (geschaald. ZAxis);
Serial.println("G");
led voor as weergeven
Als (geschaald. XAxis > 0) {}
digitalWrite (8, hoge); de LED aangezet
}
anders
{
digitalWrite (8, laag); verrekening van de LED
}
//
Als (geschaald. YAxis > 0) {}
digitalWrite (9, hoge); de LED aangezet
}
anders
{
digitalWrite (9, laag); verrekening van de LED
}
//
Als (geschaald. ZAxis > 0.8) {}
digitalWrite (11, hoge); de LED aangezet
}
anders
{
digitalWrite (11, laag); verrekening van de LED
}
servo verplaatsen volgens voorwaarden voelde---maken
Als (geschaald. ZAxis < 0.8) {}
Serial.println ("*** verhogen lager---Raise lager");
RaiseLower();
delay(265);
}
//
Als (geschaald. YAxis < 0) {}
Serial.println ("*** Twitch midden---Twitch midden");
twitchMiddle();
delay(400);
}
//
Als (geschaald. XAxis < 0 en geschaald. YAxis > 0 en geschaald. ZAxis > 0) {}
Serial.println ("*** rechts---Wink Wink rechts");
winkRight();
delay(265);
}
}
//-------------------------------
subroutine voor verhogen en lagere
VOID RaiseLower()
{
twitchshort();
twitch();
voor (posA = 0; posA < 135; posA += 1) / / gaat van 0 graden tot 135 graden
{/ / in stappen van 1 graad
myservoA.write(posA); servo naar positie in de variabele 'pos' vertellen
myservoB.write(180-posA);
delay(12); wacht 15ms voor de servo te bereiken de positie
}
voor (posA = 135; posA > = 1; posA-= 1) / / gaat van 135 graden tot 0 graden
{
myservoA.write(posA); servo naar positie in de variabele 'pos' vertellen
myservoB.write(180-posA);
delay(12); wacht 15ms voor de servo te bereiken de positie
}
}
subroutine voor kramp---
VOID twitch()
{
voor (posA = 0; posA < 45; posA += 1) / / gaat van 0 graden tot 45 graden
{/ / in stappen van 1 graad
myservoA.write(posA); servo naar positie in de variabele 'pos' vertellen
myservoB.write(180-posA);
delay(8); wacht 15ms voor de servo te bereiken de positie
}
voor (posA = 45; posA > = 1; posA-= 1) / / gaat van 45 graden naar 0 graden
{
myservoA.write(posA); servo naar positie in de variabele 'pos' vertellen
myservoB.write(180-posA);
delay(8); wacht 15ms voor de servo te bereiken de positie
}
}
subroutine voor korte kramp---
VOID twitchshort()
{
voor (posA = 0; posA < 25; posA += 1) / / gaat van 0 graden tot 25 graden
{/ / in stappen van 1 graad
myservoA.write(posA); servo naar positie in de variabele 'pos' vertellen
myservoB.write(180-posA);
delay(5); wacht 15ms voor de servo te bereiken de positie
}
voor (posA = 25; posA > = 1; posA-= 1) / / gaat van 25 graden naar 0 graden
{
myservoA.write(posA); servo naar positie in de variabele 'pos' vertellen
myservoB.write(180-posA);
delay(5); wacht 15ms voor de servo te bereiken de positie
}
}
subroutine voor kramp midden---
VOID twitchMiddle()
{
voor (posA posA < 100, 0; posA += 1 =) / / gaat van 100 graden naar 0 graden
{/ / in stappen van 1 graad
myservoA.write(posA); servo naar positie in de variabele 'pos' vertellen
myservoB.write(180-posA);
delay(10); wacht 15ms voor de servo te bereiken de positie
}
voor (posA = 100; posA > = 1; posA-= 1) / / gaat van 100 graden naar 0 graden
{
myservoA.write(posA); servo naar positie in de variabele 'pos' vertellen
myservoB.write(180-posA);
delay(10); wacht 15ms voor de servo te bereiken de positie
}
delay(250);
voor (posA posA < 120, 0; posA += 1 =) / / gaat van 100 graden naar 0 graden
{/ / in stappen van 1 graad
myservoA.write(posA); servo naar positie in de variabele 'pos' vertellen
myservoB.write(180-posA);
delay(10); wacht 15ms voor de servo te bereiken de positie
}
}
subroutine voor knipoog juiste---
VOID winkRight()
{
voor (posA posA < 120, 0; posA += 1 =) / / gaat van 0 graden tot 120 graden
{/ / in stappen van 1 graad
myservoA.write(posA); servo naar positie in de variabele 'pos' vertellen
myservoB.write(180-posA);
delay(10); wacht 15ms voor de servo te bereiken de positie
}
voor (posA = 120; posA > = 1; posA-= 1) / / gaat van 180 graden tot 0 graden
{
myservoA.write(posA); servo naar positie in de variabele 'pos' vertellen
myservoB.write(180-posA);
delay(10); wacht 15ms voor de servo te bereiken de positie
}
myservoB.write(180); andere oor verhogen als rusten zodat deze overeenkomen met rechtop
}
=== ultimo schets ===
Als u uw hoofd naar voren kantelen, moeten de oren doen een volledige omhoog en omlaag.
Als u uw hoofd naar rechts overhelt, moet het linker oor op en neer gaan.
Er zou een lichte wiggle als een lichte tilt. De oren dalen tot een down positie.
Speel met de vertragingswaarden en servo timing loops voor levensecht spelplezier.
Vergeet niet, u wellicht om erachter te komen waar uw servo's zijn geplaatst aan 0 graden begin en welke manier ze draaien. Dan moet u geschikt voor het verkeer met de opdrachten van de servo in de schets.
X, Y, Z en servo beweging in mijn prototype mag niet overeenkomen met uw etiketten.