Tehtävä
Laadi allaolevan ohjelmarungon pohjalta testiohjelma. Käytä testiohjelmaa apuna, kun rakennat hissin rungon seuraavan sivun ohjeiden mukaan.
Edellisessä harjoituksessa opettelit käyttämään moottoreita Arduinon kanssa ja rakensit Maker kitissä olevien levyjen avulla liikkuvan robotin, joka kykeni kulkemaan lattialla tai muilla tasaisilla pinnoilla. Mutta mitä, jos haluaisit liikuttaa asioita pystysuunnassa?
Tässä harjoituksessa rakennetaan minihissi, jossa matkustaja liikkuu ylös tai alas. Aluksi hissiä käytetään kahden napin avulla. Tämän jälkeen pääset kutsumaan hissiä napeilla kerroksesta toiseen. Tällöin hissin täytyy muistaa aina se, missä kerroksessa se on viimeksi ollut.
Alla on video eräästä hissiprojektista. Vaikka käytössäsi ei ole esimerkiksi stepper-moottoria, voit käytännössä toteuttaa samanlaisen projektin ajastamalla Maker kitin moottoreita.
Mehackit boardin (tai Arduinon), USB-johdon, koekytkentälevyn ja johtimien lisäksi tarvitset seuraavat komponentit.
Osa | Kuva | Kuvaus |
---|---|---|
Vaihdemoottori tai Pyörivä servomoottori | Maker kitissäsi on joko kaksi mustaa vaihteistettua moottoria tai kaksi sinistä pyörivää servomoottoria. Vaihdemoottorit ovat tavallisia DC-moottoreita, joissa on sisällä hammasrattailla toteutettu vaihteisto. Servomoottorin sisällä on moottorin ja vaihteiston lisäksi hieman ohjauselektroniikkaa. | |
Painonappi x 3 | Mehackit Maker Kitin painonappi on valkoinen, ei ruskea. | |
Ohutta narua tai lankaa | ||
3 kynää tai tikkua, teippiä yms. askartelutarvikkeita hissiä varten. |
Tarvitset hissiin yhden vaihteistetun DC-moottorin tai pyörivän servomoottorin. Jos olet jo valmiiksi kytkenyt kaksi moottoria, älä turhaan irroita toista. Jos olet rakentanut liikkuvan robotin rungon harjoituksessa Pyörillä ajeleva robotti, sinun ei myöskään kannata purkaa sitä - voit rakentaa hissin pitämällä moottorin kiinni rungossa.
Ensimmäinen vaihe: Kun porttiin 5 kiinnitettyä nappia pidetään pohjassa, moottori pyörii tasaisella vauhdilla (hissi nousee). Kun porttiin 6 kiinnitettyä nappia pidetään pohjassa, hissi pyörii vastakkaiseen suuntaan (hissi laskee).
Toinen vaihe: Kun porttiin 5 kiinnitettyä nappia painetaan, hissi tulee kerrokseen 1. Kun porttiin 6 kiinnitettyä nappia painetaan, hissi tulee kerrokseen 2. Kun porttiin 7 kiinnitettyä nappia painetaan, hissi tulee kerrokseen 3.
Tuttujen komentojen lisäksi pääset kirjoittamaan omia funktioita.
void setup() {
//Aseta portti 5 tilaan INPUT_PULLUP
//Aseta portti 6 tilaan INPUT_PULLUP
//Tee moottoreita varten tarvitsemasi määrittelyt.
}
void loop() {
if(digitalRead(5) == LOW){
//Pyöritä moottoria täydellä teholla.
}
if(digitalRead(6) == LOW){
//Pyöritä moottoria täydellä teholla vastakkaiseen suuntaan.
}
}
Olet luultavasti edellisissä harjoituksissa kiinnittänyt moottorit liikkuvan robotin runkoon. Tämä ei haittaa, sillä hissin voi rakentaa hyvin siten, että moottorit on kiinnitetty levyihin.
Ota kuitenkin pyörät irti moottorin navoista. Aseta tämän jälkeen moottoreista ja levyistä tehty pakettisi tukevalle alustalle.
Ota sitten naru ja kiinnitä se toisen moottorin napaan silmukalla. Kun moottori pyörii, se suunnasta riippuen joko kerii narua ympärilleen tai sitten vapauttaa narua ympäriltään. Sido narun toiseen päähän jokin pieni paino.
Roikota painoa pöydän ulkoreunan ylitse ja kokeile, toimiiko hissisi ensimmäinen prototyyppi. Anna moottoreille napeilla käskyjä pyöriä kumpaankin suuntaan.
Tee lopuksi hissistäsi hissin näköinen. Alla on esimerkkinä muutamista legoista rakennettu hissitorni.
Seuraavaksi tehdään ohjelma, joka kutsuu hissiä hiukan ylöspäin aina nappia klikattaessa. Napin klikkauksen rekisteröivä ohjelma on tuttu kolmannen luvun harjoituksesta Kytkimet ja tilan vaihto.
int buttonState5;
int lastButtonState5;
void setup() {
pinMode(7, INPUT_PULLUP);
//Tee moottoreita varten tarvitsemasi määrittelyt.
}
void loop() {
buttonState5 = digitalRead(5);
if(buttonState5 != lastButtonState5){
if(buttonState5 == LOW){
//Jos nappia on klikattu, kutsutaan funktiota floorUp
floorUp();
}
lastButtonState5 = buttonState5;
}
}
void floorUp(){
//Kirjoita tähän komennot, jotka pyörittävät moottoria
//ja nostavat hissiä ylöspäin sekunnin ajan.
}
Edellisen sivun ohjelmassa kutsuttiin funktiota floorUp, jolloin hissi nousi nappia klikattaessa aina sekunnin ajan ylöspäin. Ohjelmoitaessa omien funktioiden luominen usein selkiyttää kokonaisuutta - kaikkea ei tarvitse ohjelmoida rivi kerrallaan, vaan pelkkä muualla määritellyn funktion kutsuminen riittää.
Funktio määritellään kuten alla. floorUp on tässä funktion nimi ja void viittaa siihen, että funktio ei palauta mitään arvoa (myös setup- ja loop-funktiot ovat tyyppiä void).
void floorUp() {
//Kirjoita tähän komennot, jotka pyörittävät moottoria
//ja nostavat hissiä ylöspäin sekunnin ajan.
}
Funktiota voidaan kutsua muualla, esimerkiksi loopin sisällä, yksinkertaisesti kirjoittamalla funktion nimi. Tällöin funktio suoritetaan kerran, minkä jälkeen jatketaan siitä mihin loop-osassa jäätiin.
void setup(){
//Tee moottoreita varten tarvitsemasi määrittelyt.
}
void loop(){
floorUp();
delay(5000);
}
void floorUp() {
//Kirjoita tähän komennot, jotka pyörittävät moottoria
//ja nostavat hissiä ylöspäin sekunnin ajan.
}
//Alla luodaan jokaisen napin käyttöä varten kaksi muuttujaa,
//joiden avulla voidaan havaitaan, jos nappeja on klikattu.
int buttonState5;
int lastButtonState5;
int buttonState6;
int lastButtonState6;
int buttonState7;
int lastButtonState7;
int lastFloor; //Muuttuja lastFloor pitää kirjaa siitä, missä kerroksessa hissi on.
void setup(){
pinMode(5, INPUT_PULLUP);
pinMode(6, INPUT_PULLUP);
pinMode(7, INPUT_PULLUP);
//Tee moottoreita varten tarvitsemasi määrittelyt.
}
void loop() {
buttonState5 = digitalRead(5);
buttonState6 = digitalRead(6);
buttonState7 = digitalRead(7);
if(buttonState5 != lastButtonState5){
if(buttonState5 == LOW){
if(lastFloor == 1){
//Tässä tapauksessa mitään ei tapahdu,
//koska hissi on jo kerroksessa 1.
//Voit poistaa tämän if-lauseen ohjelmastasi.
}
if(lastFloor == 2){
//Kutsu kerran komentoa floorDown,
//jotta hissi laskeutuu yhden kerroksen
}
if(lastFloor == 3){
//Kutsu kaksi kertaa komentoa floorDown,
//jotta hissi laskeutuu kaksi kerrosta
}
}
lastButtonState5 = buttonState5;
lastFloor = 1;
}
//Tee sama rakenne portin 6 napille, jolla kutsutaan hissi kerrokseen 2
//Tee sama rakenne portin 7 napille, jolla kutsutaan hissi kerrokseen 3.
}
void floorUp(){
//Kirjoita tähän komennot, jotka pyörittävät moottoria
//ja nostavat hissiä ylöspäin sekunnin ajan.
}
void floorDown(){
//Kirjoita tähän komennot, jotka pyörittävät moottoria
//ja laskevat hissiä alaspäin sekunnin ajan.
}
Etäisyyssensorin liittäminen hissin pohjaan
Jos liität etäisyyssensorin hissin pohjaan, voit mitata sen avulla hissin korkeutta eikä sinun näin ollen tarvitse hankalasti ajastaa moottoreita.
Kerrosvalojen liittäminen
Oikeassa hississä syttyy aina valo tietyn kerroksen napin kohdalle merkkinä siitä, että hissi on tilattu kyseiseen kerrokseen. Voit liittää erivärisiä ledejä projektiisi tämän merkiksi.