PuttDuino putt-putt hål med arduino (11 / 11 steg)
Steg 11: Kodgranskning
Eftersom jag inte hade foto-transistorer som producerar digitala signal antingen på eller av, kunde jag inte använda avbrott i programvaran. Avbryter skulle tillåta mig att köra torkarna hela tiden och när som helst det var en boll som rullar förbi en sändare/detector sensor par, vissa åtgärder skulle kunna vidtas.
Eftersom det är jag använde fotodioder som producerar en analog snarare än digital/på signal så jag var tvungen att kontrollera status för sensorer samtidigt också skicka värden till servon kör torkarna.
Detta är vad jag gjorde.
Torkarna kör hela tiden. Jag gjorde denna åtgärd sin egen funktion
funktionen kallas "MoveServo" och tar 3 ingångar.
-vilken servo att flytta (slumpmässigt)
-Hur långt du vill flytta den torkar (slumpmässigt)
-Hur länge ska pausa innan han återvände till "hem" position
I funktionen satte jag kod som kontrollerar status på sensorerna mellan allt.
Dröjsmål slingan är jag tror där kontrollerar den mest.
Normalt en försening skulle vara ett kommando: delay();
i mitt fall jag gjorde dröjsmål kommando bara en millisekund och slinga antalet millisekunder över denna en millisekunden försening så att varje millisekund jag kunde säga arduino för att kontrollera status för sensorerna.
Jag tror det är närmast ett avbrott som jag kunde komma med denna typ av setup.
Resultatet är att arduino reagerar nästan direkt när en klumpa ihop sig korsar en sensor som är vad jag ville.
Här är funktionen MoveServo med några kommentarer till
void MoveServo (int servoNum, lång pos, int paus)
{
/ / före allt annat jag läste sensorer
ReadandReport(); / / detta samtal till en annan funktion som läser status för sensorer och skriver värdena till följetong för felsökning av
om (analogRead(impSensorPin) < 90) {StartMotor();} / / detta läser pumphjulet sensorn och hoppar till funktionen StartMotor om bollen är det
ReadNailPin(); / / detta läser nailgun stiftet och hoppar ut till funktionen om bollen är det
om (servoNum > = 50) / / slumptal skickas är mellan 1 och 100
{
wiper1.write(POS); / / tala servo #1 hur långt för att flytta
ReadandReport(); / / debug utmatning
om (analogRead(impSensorPin) < 90) {StartMotor();} / / som ovan kontrollera impellern sensor
ReadNailPin(); / / Kontrollera nail gun sensor
} annat { / / blir här om slumpmässiga torkar valet var mindre än 50 så flytta servo #2 och kontrollera sensorer
wiper2.write(POS);
ReadandReport();
om (analogRead(impSensorPin) < 90) {StartMotor();}
ReadNailPin();
}
Detta är en slinga som kontrollerar sensorer varje millisekund
för (jag = 0; jag / / denna paus är att vänta för servo att flytta och även för att pausa i slutet innan han återvände "hem"
{
ReadandReport();
om (analogRead(impSensorPin) < 90) {StartMotor();} / / samma som ovan
ReadNailPin(); / / samma som ovan
fördröjning (1). / / Detta är faktiska förseningen
}
}
NEDAN HÄR ÄR HELA KÄLLKODEN
#include
int nailPin = 0; Detta är den PIN-kod används för att aktivera spik pistolen
int LEDpin = 13. LED indikatorn visar att maskinen är igång
int fogPin = 20; Detta stift aktiverar dimma maskin
int nailSensorPin = 17; Detta är ansluten till IR-detektorn framför spik pistolen
int impSensorPin = 16. Detta är ansluten till IR-detektorn framför bollen pumphjulet
lång rndSrvoPos; variabel att lagra servo position
lång rndPause; Random paus tid
lång whichServo; Välj vilken servo att flytta
int jag = 0; generiska heltalsvariabel
int nailTriggerValue; värdet läsa från IR-LED trigger för nailGun
int pos; servo position variabel
Servo wiper1; första servo torkar objekt
Servo wiper2; andra servo torkar objektet
Servo impellerServo; servo för impeller-knappen pusher
void setup()
{
randomSeed(analogRead(3)); utsäde slumptalsgeneratorn
Serial.BEGIN(9600); setup följetong
pinMode (LEDpin, OUTPUT); ställa in pin lägen
pinMode(fogPin,OUTPUT);
pinMode(nailPin,OUTPUT);
pinMode(nailSensorPin,INPUT);
pinMode(impSensorPin,INPUT);
wiper1.attach(14); tillmäter det första objektet i torkar servo servo på stift 14
wiper2.attach(15); tillmäter det andra objektet torkar servo servo på stift 15
impellerServo.attach(12); Koppla till servo på stift 12 för impeller-knappen pusher
Blink3x(); blinka 3 gånger att ange start - typ av en makt på självtest
}
void loop()
{
sopa servon ett slumpmässigt belopp upp till 80 grader
pausa en slumpmässig tidsperiod från mellan 10 och 250 ms
rndSrvoPos = random(0,22);
rndPause = random(250,500);
whichServo = random(100);
ReadandReport();
om (analogRead(impSensorPin) < 90) {StartMotor();}
ReadNailPin();
MoveServo(whichServo,0,rndPause);
MoveServo(whichServo,80,rndPause);
}
void StartMotor()
{
Starta dimma
digitalWrite(fogPin,HIGH);
Delay(750);
impellerServo.write(112);
Delay(450);
impellerServo.write(90);
digitalWrite(fogPin,LOW);
för (jag = 0; jag < 2000; i ++) / / denna försening är ett försök att hålla motorn körs alltför ofta asp när bollen studsar ut
{
ReadandReport();
ReadNailPin();
Delay(1);
}
ReadandReport();
}
void FireNailGun()
{
ReadandReport();
Serial.println ("bränning cykel");
Delay(250);
digitalWrite(nailPin,HIGH);
Delay(10);
digitalWrite(nailPin,LOW);
}
void MoveServo (int servoNum, lång pos, int paus)
{
ReadandReport();
om (analogRead(impSensorPin) < 90) {StartMotor();}
ReadNailPin();
om (servoNum > = 50)
{
wiper1.write(POS);
ReadandReport();
om (analogRead(impSensorPin) < 90) {StartMotor();}
ReadNailPin();
} annat {
wiper2.write(POS);
ReadandReport();
om (analogRead(impSensorPin) < 90) {StartMotor();}
ReadNailPin();
}
för (jag = 0; jag {
ReadandReport();
om (analogRead(impSensorPin) < 90) {StartMotor();}
ReadNailPin();
fördröjning (1).
}
}
void ReadNailPin()
{
Läs stift och svara - bara spik pin...
Detta är ett försök till en manuell brytaren
om (analogRead(nailSensorPin) < 60) {FireNailGun();}
}
void Blink3x()
{
Power On Self Test cykel
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));
}