Dra System för att minska (4 / 5 steg)
Steg 4: Komponera en Arduino skiss
Nedan är den kod som jag använde för att kontrollera mitt system.
Jag använder flera bibliotek för att möjliggöra användning av IR-mottagaren, LCD-skärm över I2C och servo.
De flesta av mina variabler definieras inom de funktioner som använder dem men vi behöver definiera ta emot PIN-koden för IR mottagaren så att vi kan initiera objektet IR-mottagare. Vi behöver också att instansiera resultaten av IR-mottagaren och servo och LCD-display.
Setup-funktionen börjar genom att starta den seriella monitorn och initiera LCD och slå på bakgrundsbelysningen. Under installationen måste vi även börja IR-mottagaren koppla servo för att pin-nummer 9 och definiera stift 6 och 7 som utgångar för motor och relä.
Stora slingan synar bara tre funktioner som beskrivs nedan
/***************************************************************************************
Control System Program för en enkel Arduino baserade dra Reduction System
Av Korey Prince
Det här programmet förvandlar ett relä på och av med hjälp av en IR fjärrkontroll och upptäcker hastigheten på en
motor att avgöra när ansätta en vinge baserat på tillförsel av en potentiometer
***************************************************************************************/
inkludera alla biblioteken i detta program
#include < irremote.h >
#include < liquidcrystal_i2c.h >
#include < wire.h >
#include < servo.h >
int RECV_PIN = 11. //define IR få som stift 11
IRrecv irrecv (RECV_PIN), //instantiate en IR-mottagare objekt
decode_results resultat; //instantiate ett decode_results-objekt.
Detta objekt är separat från IR-mottagaren.
Servo myservo; //instantiate ett servo objekt att styra vingen
LiquidCrystal_I2C lcd (0x27, 16, 2); //instantiate en 16 x 2 I2C LCD display med adress 0x27
void setup()
{
Serial.BEGIN (9600); //Start seriell bildskärmen
LCD.init(); / / initiera lcd
irrecv.enableIRIn(); Starta mottagaren
myservo.attach (9, 544, 1200); / / tillmäter objektet servo servo på pin 9
pinMode (6, OUTPUT); //define stift 6 som en utgång för motorn
pinMode (7, OUTPUT); //define stift 7 som en utgång för reläet
pinMode (8, OUTPUT); //define stift 8 som en utgång för den gröna lysdioden
pinMode (12, OUTPUT); //define stift 12 som en utgång för den röda lysdioden
}
void loop()
{
få kommandon från funktionen recvIR för att slå strömmen med fjärrkontroll
recvIR();
kontrollera hastigheten på motorerna och aktivera servo om tröskelvärdet
activateDRS();
få varv per milli-sekund från revPerMilli funktion
revPerMilli();
}
Idén om activateDRS funktion är att vända ett servo till en specifik position när ett villkor uppfylls. Villkoret är i detta fall motorSpeed. Om motoriska hastighet är större än av lika med 200 servo kommer att flytta till 60 grader position. Om servo är mindre som 200 som servo återgår till ursprungsläget.
int activateDRS() {< br > int pos = 0; //define variabeln pos för position
servo
int motorSpeed; //define en annan variabel och uppsättningen det lika till funktionen
motorController()
motorSpeed = motorController();
flytta servo till dess aktiva plats när hastigheten på motorerna når 200
om (motorSpeed > = 200) {
för (pos = 60; pos > = 0; pos-= 1) / / går från 0 grader till 60 grader
{/ / i steg om 1 grad
myservo.write(POS); / / tala servo gå för att placera i variabel "pos"
digitalWrite 8, hög.
digitalWrite 12, låg.
Delay(15); / / väntar 15 MS för servo att nå ställning
lcd.setCursor(0,1);
LCD.Print ("DRS: ON");
bryta; / / tillåta programmet att avsluta när servo positionen nås
}
tala om för användaren att DRS systemet är på
Serial.println ("DRS: på");
}
om (motorSpeed < 200) {
för (pos = 0; pos < = 60; pos + = 1) / / går från 900 grader till 0 grader
{
myservo.write(POS); / / tala servo gå för att placera i variabel "pos"
digitalWrite 8, låg.
digitalWrite 12, hög.
Delay(15); / / väntar 15 MS för servo att nå ställning
lcd.setCursor(0,1);
LCD.Print ("DRS: OFF");
bryta; / / tillåta programmet att avsluta när servo positionen nås
}
}
återvända motorSpeed;
}
Den motor controller funktionen helt enkelt definierar en potentiometer som en analog ingång och kartor motor värdet till digitala utbud som används i funktionen activateDRS
int motorController() {< br > //define variabler
int potPin = A0;
int motorPin = 6;
int potValue = 0;
int motorValue = 0;
definiera potPin som en analog ingång
potValue = analogRead(potPin);
karta analoga värdet av potten klämmer fast motorn
motorValue = karta (potValue, 0, 1023, 0, 255);
skriva det analoga värdet av motorn till PWM motor stift 6
analogWrite (motorPin, motorValue);
Serial.println(motorValue);
återvända motorValue;
}
Vi kontrollera här om ett visst kommando har tagits emot. om det har aktivera vi reläet. om ett annat kommando skickas reläet kommer vända bort som skär makt till motor och servo.
void recvIR() {< br > //has en överföring har fått?
om (irrecv.decode (& resultat))
{
Serial.println (results.value), //If ja: tolka de mottagna kommandona...
om (results.value == 12419199) {//Power buttom på AOC fjärrkontroll
LCD.Clear();
lcd.noBacklight (); //turn på bakgrundsbelysningen
Delay(100);
}
om (results.value == 12398799) {//Vol upp buttom på AOC fjärrkontroll
Delay(100);
LCD.Clear();
LCD.backlight (); //turn på bakgrundsbelysningen
LCD.Print ("System Ready");
digitalWrite (7, hög). Aktivera reläet (HIGH är spänningsnivån)
Delay(100);
}
om (results.value == 12392679) {//Channel upp buttom på AOC fjärrkontroll
LCD.Clear();
LCD.Print ("System av");
Delay(500);
lcd.noBacklight (); //turn av bakgrundsbelysning
digitalWrite (7, låg). Inaktivera reläet genom att spänningen låg
digitalWrite 12, låg.
Delay(100);
}
irrecv.Resume(); Ta emot nästa värde
}
}
Funktionen revsPerMilli beräknar rotationerna av hjulet per millisekund av första väntar avbrott värdet att öka till över 100. När revolutionerna når 100 beräknas den omkrets och hastighet av hjulet. denna funktion använder en inbyggd i Arduino funktionen anropas millis för att få tid i millisekunder.
Obs: Jag har inte kunnat få kodare ska fungera så denna funktion inte är nödvändiga för att koden ska fungera. Jag la den främst som en förbättring för senare.
flyta revPerMilli() {< br > //define variabler
unsigned int rpmilli;
float hastighet;
osignerade långa timeold;
beräkna varv per milli(second)
rpmilli = revolutions/(millis()-timeold);
om (rotationer > = 100) {
Uppdatera RPM varje 100 räknas, öka detta för bättre RPM upplösning,
minskningen för snabbare uppdatering
Delay(100);
lagra förra gången i en variabel
timeold = millis();
varv = 0;
beräkna omkretsen av hjulet
flyta WHEELCIRC = 2 * PI * 0.065;
ange hastigheten av hjulet
hastighet = rpmilli * WHEELCIRC * 3600;
Serial.Print ("RPM:");
Serial.Print(rpmilli);
Delay(100);
}
återvända rpmilli;
}