Robot orm (3 / 16 steg)
Steg 3: Kombinera motorer och fotocell sensorer
BeskrivningI det här steget kommer vi ta tre fotocell sensorerna och använder dem för att köra motor rusar. I vår kod kommer vi att hänvisa motorerna till Motor A eller Motor B, baserat på var de är anslutna till den motoriska skölden, och sensorerna kommer att Sensor 3 Sensor 4 och Sensor 5, utifrån där de är knutna till de analoga avläsningarna. Sensor 3 och Sensor 4 kommer att vara riktad sensorerna och Sensor 5 blir sensorn för miljöbelysningen.
Algoritm
För att kontrollera motorerna, vi kommer att få en bas från alla tre sensorer första (lagras dessa i photocellReading #).
Vi sedan ta skillnaderna mellan Sensor 3 och Sensor 5 (och lagra den i photocellDifference1) samt skillnaden mellan Sensor 4 och Sensor 5 (och lagra den i photocellDifference2). Detta kommer att berätta hur mycket ljusare riktad sensorerna är från den omgivande sensoren. Eftersom ljuset kommer att shinning på dessa sensorer, bör skillnaden avläsningarna tala om för oss hur mycket ljus riktas mot varje sensor.
Vi subtrahera photocellDifference1 och photocellDifference2 från varandra och lagra den i lrValue. Genom att denna skillnad, kan vi tala om hur mycket mer ljus varje riktad sensor avkänning. Om talet är negativt än det innebär Sensor 4 har mindre ljus än Sensor 3 och mer fart bör vara inriktade på Motor B. Om lrValue är positivt än innebär det att Sensor 3 har mer ljus än Sensor 4 och högre hastighet bör riktas till Motor A.
Koden
/*
int photocellReading3; analog läsning från analoga resistor avdelare
int photocellReading4; analog läsning från analoga resistor avdelare
int photocellReading5; analog läsning från analoga resistor avdelare
int photocellDifference1;
int photocellDifference2;
int lrValue;
void setup(void) {
Serial.BEGIN(9600);
pinMode (12, OUTPUT); Initierar Motor kanal A stift
pinMode (9, OUTPUT); Initierar broms kanal A stift
pinMode (13, OUTPUT); Initierar Motor kanal B pin
pinMode (8, OUTPUT); Initierar broms kanal B pin
digitalWrite 13, låg. Upprättar riktning framåt av kanal A
digitalWrite 8, låg. Lossa bromsen för kanal A
digitalWrite 12, låg. Upprättar riktning framåt av kanal B
digitalWrite (9, låg). Lossa bromsen för kanal B
}
void loop(void) {
photocellReading3 = analogRead(3); basera ljus läsning
photocellReading4 = analogRead(4); basera ljus läsning
photocellReading5 = analogRead(5); basera ljus läsning
få skillnader mellan sensorer för motorer och sensor för omgivande ljus
photocellDifference1 = (photocellReading3 - photocellReading5);
photocellDifference2 = (photocellReading4 - photocellReading5);
få skillnaden mellan de två behandlingarna
lrValue = photocellDifference2 - photocellDifference1;
kontrollera hastigheten till varje motor baserat på lrValue
om (lrValue < = -120) {
analogWrite (11, 255);
analogWrite (3, 100);
} else om (lrValue < = -90) {
analogWrite (11, 224);
analogWrite (3, 100);
} else om (lrValue < =-60) {
analogWrite (11, 193);
analogWrite (3, 100);
} else om (lrValue < = -40) {
analogWrite (11, 162);
analogWrite (3, 100);
} else om (lrValue < = -25) {
analogWrite (11, 131);
analogWrite (3, 100);
} else om (lrValue < 25) {
analogWrite (11, 100);
analogWrite (3, 100);
} else om (lrValue < 40) {
analogWrite (11, 100);
analogWrite (3, 131);
} else om (lrValue < 60) {
analogWrite (11, 100);
analogWrite (3, 162);
} else om (lrValue < 90) {
analogWrite (11, 100);
analogWrite (3, 193);
} else om (lrValue < 120) {
analogWrite (11, 100);
analogWrite (3, 224);
} annat {
analogWrite (11, 100);
analogWrite (3, 255);
}
}
Video av ljussensorer kontrollera motorerna
Speed bryta ner
I koden, kan du se när vi har en lång lista av om else-satser kontrollera hastigheten för varje motor. Denna kod fungerar för våra orm och vår fotocell sensor/motor kombination. Om du har ändrat material för din orm eller upptäcker att dessa värden inte fungerar för dig, när gärna ändra värden tills du hittar varvtalsreglering som fungerar för dig. Vår orm är tänkt att fungera i svagt ljus och på ett ganska snabb hastighet. Om du vill din orm långsammare, till exempel, kan du bredda ditt utbud av lrValues i om else-satser, så att det kommer att ta en hög effekt ljus riktat mot en sensor innan motorerna når högsta hastighet.
Vi upptäckte också att varje motor behövs ett minsta värde av hastighet (vår var 100) för att kunna dra vikten på ormen. Det kan aldrig finnas hastighet värdet 0 kommer att en motor. Om en motor skulle helt sluta, skulle det då ta för mycket arbete för att få motorn igen.
Vi hittade det var lättast att planera hastighet kontroller ute i en tabell innan du skriver om else-satser. Detta var vårt bord:
Motor en Motor B
lrValue Analog 3 Analog 11
-∞ →-120 225 100
-119 →-90 224 100
-89 →-60 193 100
-59 →-40 162 100
-39 →-25 131 100
-24 → 24 100 100
25 → 39 100 131
40 → 59 100 162
60 → 89 100 193
90 → 119 100 224
120 → ∞ 100 225