Esteitä väistelevä itsestään ajava robotti.
Toteutimme prototyypin rakentaminen-kurssilla itsestään ajavan robotin, joka osaa väistää huomatessaan edessään esteen. Robotti itsessään ei onnistunut niin hyvin kuin olisimme toivoneet, mutta opimme virheistämme ja seuraavalla kerralla onnistumme paljon paremmin.
Tein robotin yhdessä Jori Laineen kanssa. Kurssin pitäjänä toimi Tero Karvinen, jonka verkkosivulta löytyy kurssimateriaali.
Robotti
Robotin testausta
Robotti kasassa ja liikkeellä
Käytetyt osat
- Arduino UNO
- HC-SR04 – ultraäänisensori
- 28BYJ-48 – askelmoottori x2
- ULN2003 – askelmoottorin hallintapiiri x2
- 5V virtalähde x2
- Kasa Legoja
- Hyppylankoja
- Koekytkentälevyjä
Ultraäänisensori
Arduino UNO
ULN2003
Virtalähteet
Virtalähteinä toimi kaksi kappaletta puhelimen 5V varavirtalähteitä
Katkaisimme USB-johdon ja otimme sen virtajohdoista virran
3D-tulostettu välikappale
Loimme Blenderillä välikappaleen ja laitoimme sen tulostumaan
Tulostetut kappaleet
Ensimmäinen kappale oli 10mm kokoinen, johon osat eivät mahtuneet. Seuraavan tulostimme 11mm kokoisena, joka oli vielä hieman liian pieni. Viimeisen teimme 12mm kokoisena ja osamme mahtuivat juuri sopivasti.
Mittojen mukaan moottori ja Legoakseli olivat juuri sopivat 10mm versioon, mutta tulostin ei ollut tarpeeksi tarkka näin pienellä kappaleella, joten jouduimme kasvattamaan tulosteen kokoa.
Välikappaleen .blend tiedosto löytyy Google Drivestä ja 3D-tulostukseen valmis .stl tiedosto myös Google Drivessä.
Koodi
#include <AccelStepper.h> #define HALFSTEP 8 // motor pins #define motorPin1 2 #define motorPin2 3 #define motorPin3 4 #define motorPin4 5 #define motorPin5 6 #define motorPin6 7 #define motorPin7 8 #define motorPin8 9 AccelStepper stepper1(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4); AccelStepper stepper2(HALFSTEP, motorPin5, motorPin7, motorPin6, motorPin8); // defines pins numbers const int trigPin = 10; const int echoPin = 11; // defines variables long duration; int distance; int pingTimer = 250; int getDistance() { digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance= duration*0.034/2; } void setup() { stepper1.setMaxSpeed(1000.0); stepper1.setSpeed(1000); stepper2.setMaxSpeed(1000.0); stepper2.setSpeed(-1000); pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output pinMode(echoPin, INPUT); // Sets the echoPin as an Input } void loop() { pingTimer = pingTimer - 1; if (pingTimer == 0) { getDistance(); pingTimer = 1000; } if (distance < 25) { stepper1.setSpeed(-1000); stepper1.runSpeed(); } stepper1.setSpeed(1000); stepper2.setSpeed(-1000); stepper1.runSpeed(); stepper2.runSpeed(); }
Pääsimme moottorien kanssa alkuun 42bots.com sivuston esimerkin avulla, käytimme lisäksi apuna AccelStepper kirjaston dokumentaatiota. Ultraäänisensoriin löysimme ohjeita howtomechatronics.com artikkelista. Valmis koodi lisensoitu GPLv2-lisenssillä.
Ongelmat
Moottorit
Käyttämämme askelmoottorit eivät sovellu auton tekemiseen. Moottorit vaativat jatkuvia pulsseja liikkuakseen, jolloin ultraäänisensoreiden käyttö pysäyttää moottorit hetkeksi. Päädyimme käyttämään vain yhtä ultraäänisensoria.
Tarvitsimme myös jotain moottorin ja Legoakselin väliin, jotta renkaat pyörisivät. Suunnittelimme välikappaleen Blenderillä ja 3D-tulostimme sen. Tulostus vaati muutaman yrityksen, mutta lopulta saimme sopivat kappaleen. Kappaleet olivat aluksi kuutioita, mutta hioimme niiden kulmat, jotta vältimme niiden osumisen Legoihin.
Moottori, välikappale, akseli ja rengas
Takarenkaat
Käytimme aluksi kahta vapaasti pyörivää Legorengasta takana. Robottimme kääntyy ajamalla eturenkaitaan eri suuntiin, mutta takarenkaat aiheuttivat liikaa kitkaa, jolloin robotti ei jaksanut kääntyä. Kokeilimme laittaa taakse vain yhden renkaan keskelle, mikä ei auttanut tilannetta yhtään. Lopulta laitoimme taakse ohuen tapin, jonka varassa robotin perä on. Pieni kitkapinta mahdollistaa robotin liikkumisen, vaikka takaosa laahaa maata pitkin.
Perätappi
Parannusideat
- Askelmoottoreiden sijasta olisi paljon parempi käyttää ympäripyöriviä servoja.
- Bluetooth-ohjaus
- Useampi ultaäänisensori toimintaan (servoja käyttäen)