Tekstitykset
Syventävä: Infrapunaa etsivä auto
Johdanto
Tämä harjoitus on jatkoa neljännen luvun harjoitukselle Syventävä: Infrapunalähetin ja viidennen luvun harjoitukselle Pyörillä ajeleva robotti.
Liikkuva robotti voi liikkua ennalta määritettyä rataa, tai sitten reagoida ulkopuoliseen maailmaan. Tässä harjoituksessa robotti etsii infrapunaa kahden sensorin avulla! Tällainen etsintä tapahtuu haarukoimalla. Jos infrapunaa tulee enemmän oikealta, täytyy auton kääntyä oikealle.
Infrapunaa hyödyntävät esimerkiksi kaukosäätimet. Voit siis ohjata periaatteessa robottiasi vaikka kaukosäätimellä siten, että robotti tulee kaukosäätimen signaalia kohti!
Alla olevassa videossa näytetään, miten kaikenlaisia sähkölaitteita voi käynnistää kaukosäätimestä tulevan infrapunavalon avulla, kun ne on ensin kytketty Arduinoon.
Dejan Nedelkovski: Control any Electronics with a TV Remote | Arduino IR Tutorial
Tarvikkeet
Mehackit boardin (tai Arduinon), USB-johdon, koekytkentälevyn ja johtimien lisäksi tarvitset seuraavat komponentit.
Osa | Kuva | Kuvaus |
---|---|---|
Pyörillä ajeleva robotti | Katso ohjeet robotin kokoamiseen tämän luvun harjoituksesta Pyörillä ajeleva robotti. | |
Infrapunalähetin | Infrapunasäteilyn lähetin. Voit käyttää tämän sijaan myös infrapunasäteilyä lähettävää kaukosäädintä. | |
Infrapunavastaanotin x 2 | Infrapunasäteilyn vastaanotin (phototransistor) | |
Vastus 10 kΩ x 2 | Vastus vastustaa sähkövirran kulkua. Vastuksen arvo mitataan ohmeissa (Ω) ja ilmoitetaan komponentissa eri värisinä raitoina (tässä ruskea, musta, punainen ja kulta). | |
Kaukosäädin | Useimmat kaukosäätimet lähettävät infrapunapulsseista koostuvia sarjoja, jotka vastaanotin (esim. televisio) osaa tulkita ja toimia niiden mukaan. |
Virtapiiri
Katso moottoreiden kytkentäohjeet tämän luvun aiemmasta harjoituksesta Pyörillä ajeleva robotti. Alla olevissa virtapiirikaavioissa neuvotaan vain infrapunavastaanottimien kytkentä.
- Liitä kaksi infrapunavastaanotinta koekytkentälevyn eri päihin kaavion osoittamalla tavalla. Huomaa, että infrapunavastaanottimien pidemmät jalat on kytketty sekä analogiseen porttiin että 10 kilo-ohmin vastuksen kautta maahan. Kaavion alla on valokuva valmiista autosta!
- Varmista, että et kytke vastaanottimia 6V ulkoiseen jännitteeseen, johon olet kytkenyt moottorit.
Ohjelman tavoite
Robotin kaksi infrapunavastaanotinta lukevat infrapuna-arvoja. Jos arvojen välinen ero on yli 60, tämä tarkoittaa, että infrapunalähetin lähestyy, mutta on joko vasemmalla tai oikealla puolella autoa. Tällöin kokeillaan, kumman anturin havaitsema arvo on suurempi, ja käännetään autoa kyseiseen suuntaan. Jos arvojen välinen ero on alle 60, jatketaan suoraan.
Tarvitset moottoreiden ohjaamiseen käytettävien komentojen lisäksi yhtä uutta komentoa.
Uudet komennot
- abs(arvo) Palauttaa parametrina annetun arvon itseisarvon, eli etäisyyden nollasta. Käytännössä komento siis muuttaa kaikki negatiiviset luvut positiivisiksi
- funktioiden luominen ja käyttäminen: Voit luoda omia funktioita, jotka esimerkiksi kääntävät robottia vasemmalle tai oikealle hetken ajan.
Ohjelmointi 1/2
int rightVal;
int leftVal;
int dif;
void setup() {
Serial.begin(9600);
}
void loop() {
rightVal = analogRead(0);
leftVal = analogRead(1);
dif = abs(rightVal - leftVal);
Serial.print("Left Sensor = ");
Serial.print(leftVal);
Serial.print("\t");
Serial.print("Right Sensor = ");
Serial.print(rightVal);
Serial.print("\t");
Serial.print("Difference = ");
Serial.print(dif);
Serial.print("\n");
}
Mitä muuttujaan "dif" tallennetaan loop-osassa?
Ohjelmointi 2/2
int rightVal;
int leftVal;
int dif;
void setup() {
// Tähän tarvittavat moottoriporttien määrittelyt.
Serial.begin(9600);
}
void loop() {
rightVal = analogRead(0);
leftVal = analogRead(1);
dif = abs(rightVal - leftVal);
Serial.print("Left Sensor = ");
Serial.print(leftVal);
Serial.print("\t");
Serial.print("Right Sensor = ");
Serial.print(rightVal);
Serial.print("\t");
Serial.print("Difference = ");
Serial.print(dif);
Serial.print("\n");
if(dif > 60){
// Jos rightVal > leftVal, käänny oikealle (kutsu komentoa turnRight).
// Jos rightVal < leftVal, käänny vasemmalle (kutsu komentoa turnLeft).
}
else{
// Jatka infrapunan etsimistä
}
}
void turnRight(){
//Tähän komennot, jotka kääntävät robottia hiukan oikealle.
}
void turnLeftt(){
//Tähän komennot, jotka kääntävät robottia hiukan vasemmalle.
}