Stap 11: Code Review
Want ik had geen foto-transistors die produceren digitaal signaal in of uit, kon ik niet gebruik van interrupts in de software. Interrupts zou ik wil het uitvoeren van de ruitenwissers voortdurend en op elk gewenst moment was er een bal aan het rollen voorbij een paar van de sensor emitter/detector, sommige actie kan worden ondernomen.
Als ik gebruikte fotodiodes die een analoge produceren in plaats van digitale aan/uit signaal dus moest ik de status van de sensoren waarbij waarden ook worden verzonden naar de servo's uitgevoerd van de ruitenwissers.
Dit is wat ik deed.
De ruitenwissers lopen voortdurend. Ik maakte deze actie een eigen functie
de functie "MoveServo" wordt genoemd en duurt van 3 ingangen.
-welke servo naar (willekeurig gegenereerde)
-Hoe ver moet verplaatsen van de Wisser (willekeurig gegenereerd)
-Hoe lang te onderbreken voordat u terugkeert naar 'thuis' positie
Binnenkant van de functie plaats ik code die de status van de sensoren tussen alles controleert.
De lus van de vertraging is ik denk dat waar het het meest controleert.
Normaal gesproken een vertraging zou één commando: delay();
in mijn geval ik maakte de vertraging opdracht slechts één milliseconde en het aantal milliseconden lus over die ene milliseconde vertraging zodat elke milliseconde ik de arduino vertellen kon en controleert u de status van de sensoren.
Ik denk thats het dichtst bij een interrupt die ik met dit soort van setup komen kon.
Het resultaat is dat de arduino reageert bijna direct wanneer een bal kruist een sensor, dat is wat ik wilde.
Hier is de functie van de MoveServo met enkele opmerkingen toegevoegd
VOID MoveServo (int servoNum, lange pos, int pauze)
{
/ / voordat er iets anders lees ik de sensoren
ReadandReport(); / / Dit roept naar een andere functie die leest de status van de sensoren en schrijft de waarden aan voor foutopsporing seriële
Als (analogRead(impSensorPin) < 90) {StartMotor();} / / dit leest de sensor waaier en springt naar de StartMotor functie als de bal er is
ReadNailPin(); / / dit leest de nailgun pin en springt naar deze functie als de bal er is
Als (servoNum > = 50) / / het nummer van de willekeurige verzonden is tussen 1 en 100
{
wiper1.write(POS); / / de servo #1 Hoe ver vertellen om te verplaatsen
ReadandReport(); / / debug output
Als (analogRead(impSensorPin) < 90) {StartMotor();} / / als hierboven check de waaier sensor
ReadNailPin(); / / check de nagel pistool sensor
} else { / / hier krijgt als de willekeurige wisser keuze was minder dan 50 zo verplaatsen de servo #2 en controleren van de sensoren
wiper2.write(POS);
ReadandReport();
Als (analogRead(impSensorPin) < 90) {StartMotor();}
ReadNailPin();
}
Dit is de loop die de sensoren elke milliseconde controleert
voor (ik = 0; ik / / deze pauze is te wachten voor de servo te verplaatsen, en ook om te pauzeren aan het einde vóór terugkeer naar "huis"
{
ReadandReport();
Als (analogRead(impSensorPin) < 90) {StartMotor();} / / zelfde als hierboven
ReadNailPin(); / / zelfde als hierboven
vertraging (1); / / Dit is de werkelijke vertraging
}
}
HIERONDER HIER IS DE HELE BRONCODE
#include
int nailPin = 0; Dit is de pin gebruikt voor het activeren van de nagel pistool
int LEDpin = 13; indicator LED geeft aan dat de machine draait
int fogPin = 20; deze pincode activeert de mist machine
int nailSensorPin = 17; Dit is verbonden met de IR-Detector voor de nagel pistool
int impSensorPin = 16; Dit is verbonden met de IR-detector voor de waaier van de bal
lange rndSrvoPos; variabele op te slaan van de servo positie
lange rndPause; willekeurige pauze tijd
lange whichServo; Kies welke servo te verplaatsen
int i = 0; generieke integer-variabele
int nailTriggerValue; waarde gelezen van ir LED trigger voor nailGun
int pos; Servo positie variabele
Servo wiper1; eerste servo wisser-object
Servo wiper2; tweede servo wisser-object
Servo impellerServo; Servo voor Opdringer van de knop van de waaier
VOID Setup
{
randomSeed(analogRead(3)); zaden de random number generator
Serial.begin(9600); Setup seriële
pinMode (LEDpin, uitvoer); instellen van de pin-modi
pinMode(fogPin,OUTPUT);
pinMode(nailPin,OUTPUT);
pinMode(nailSensorPin,INPUT);
pinMode(impSensorPin,INPUT);
wiper1.attach(14); de servo op pin 14 hecht aan het eerste wisser servo-object
wiper2.attach(15); de servo op pin 15 hecht aan het tweede wisser servo-object
impellerServo.attach(12); hechten aan de servo op pin 12 voor de Opdringer van de knop van de waaier
Blink3x(); knipperen 3 keer aan opstarten - soort van een macht op zelftest
}
void loop
{
de servo's een willekeurige vegen oplopen tot 80 graden
onderbreken van een willekeurige tijdsduur tussen 10 en 250 ms
rndSrvoPos = random(0,22);
rndPause = random(250,500);
whichServo = random(100);
ReadandReport();
Als (analogRead(impSensorPin) < 90) {StartMotor();}
ReadNailPin();
MoveServo(whichServo,0,rndPause);
MoveServo(whichServo,80,rndPause);
}
VOID StartMotor()
{
Start mist
digitalWrite(fogPin,HIGH);
delay(750);
impellerServo.write(112);
delay(450);
impellerServo.write(90);
digitalWrite(fogPin,LOW);
voor (ik = 0; ik < 2000; i ++) / / deze vertraging is een poging om te voorkomen dat de motor vaak asp uitgevoerd wanneer de bal stuitert uit
{
ReadandReport();
ReadNailPin();
delay(1);
}
ReadandReport();
}
VOID FireNailGun()
{
ReadandReport();
Serial.println ("afvuren cyclus");
delay(250);
digitalWrite(nailPin,HIGH);
delay(10);
digitalWrite(nailPin,LOW);
}
VOID MoveServo (int servoNum, lange pos, int pauze)
{
ReadandReport();
Als (analogRead(impSensorPin) < 90) {StartMotor();}
ReadNailPin();
Als (servoNum > = 50)
{
wiper1.write(POS);
ReadandReport();
Als (analogRead(impSensorPin) < 90) {StartMotor();}
ReadNailPin();
} else {}
wiper2.write(POS);
ReadandReport();
Als (analogRead(impSensorPin) < 90) {StartMotor();}
ReadNailPin();
}
voor (ik = 0; ik {}
ReadandReport();
Als (analogRead(impSensorPin) < 90) {StartMotor();}
ReadNailPin();
vertraging (1);
}
}
VOID ReadNailPin()
{
Lees pinnen en reageren - net de nagel pin...
Dit is een poging om een handmatige onderbreker
Als (analogRead(nailSensorPin) < 60) {FireNailGun();}
}
VOID Blink3x()
{
Cyclus van de Power On Self Test
ReadandReport();
digitalWrite(nailPin,HIGH);
delay(250);
digitalWrite(nailPin,LOW);
digitalWrite(fogPin,HIGH);
digitalWrite(LEDpin,HIGH);
delay(250);
digitalWrite(LEDpin,LOW);
delay(250);
digitalWrite(LEDpin,HIGH);
delay(250);
digitalWrite(LEDpin,LOW);
delay(250);
digitalWrite(LEDpin,HIGH);
delay(250);
digitalWrite(LEDpin,LOW);
digitalWrite(fogPin,LOW);
wiper1.write(80);
wiper2.write(80);
impellerServo.write(90);
impellerServo.write(112);
delay(250);
impellerServo.write(90);
}
VOID ReadandReport()
{
Serial.Print ("impSensorPin:");
Serial.println(analogRead(impSensorPin));
Serial.Print ("nailSensorPin:");
Serial.println(analogRead(nailSensorPin));
}