Programuojamas Arduino robotas suderinamas su Lego Technics

3d-spausdinimas
lego-technics
makeblock
arduino

#1

<img src="/uploads/default/original/1X/6666d2cdf15b1bdd805971b9dd64cad307a73b29.jpg" aligncenter" width=“375” height=“500”>

Mintis pagaminti šį robotą kilo tada kai sūnus paprašė prie lego technics kaip nors primontuoti varikliuką. Kadangi turiu Makeblock 3D spausdintuvą jau po valandos sūnus galėjo džiaugtis nauju lego priedėliu. Bet aš pagautas azarto užsimaniau nuveikti daugiau - taip ir “gimė” šis robotas.

Roboto privalumai:

  • Visos detalės suderinamos su Lego technics
  • Naudojama Arduino Uno plokštė (tinka ir kitos, bet dėžutė suprojektuota būten Uno)
  • Naudojami perdaryti servo varikliai (nereikia papildomų variklių priedėlių ar kitų plokščių)
  • Daugumą detalių galima atsispausdinti su 3D spausdintuvu
    Kitas detales galima nusipirkti “Diedukų” prekybos centre.

Reikalingos detalės:

  • Arduino mikro kontroleris
  • Servo varikliai 2 vnt.
  • Ultra garso sensorius.
  • Jungikliai 2 vnt.
  • 4 mm. skersmens varžtai ir veržlės. (parduodami pakeliais - užteks po vieną)
  • 110mm. santechninio vamzdžio tarpinės (gumos ratams) parduodamos atskirai be vamzdžio.
  • Išscenruotos ašies ratukas baldams.

Sevo Variklio perdarymas
Pradėkime nuo servo variklio perdarymo - turime priversti servo variklį be perstojo suktis abiem kryptim, trumpai tariant panaikinti stabdžius.
Teorija - servo variklis viduje turi potensiometrą, viduje esantis variklis sukasi tol kol potensiomentro parodymai sutampa su kontrolerio užduota verte (varža). Mes pašalinsime potensiometrą ir vietoj jo įlituosime varžas. Taip servo variklis bandydamas pasukti potensiometrą kurio jau nebėra - suksi be perstojo.

Žinksniai nuoraukose kuriuos reikia atlikti:

  1. Išardžius servo variklį išlituoti potensiometrą.
  2. Pamatuoti potensiometro bendrą varžą
  3. Vietoj potensiometro pagal pateiktą schemą įlituoti dvi varžas kurių kiekviena lygi puse potenciometro varžos. (potesiometro varža / 2 )
  4. Pagrindinis dantratis (tas kuris išlenda iš korpuso) turi mechaninį stabdį (apibrėžtas raudonu apskritimu). Jį reikia pašalinti.
  5. Surenkam viską atgal.

Na štai dabar galime džiaugtis varikliu kurį galime jungti prie Arduino be jokių papildomų modulių ar tranzistorių.

Servo variklio sukimosi kryptis ir stabdymas
Servo varikliai sukurti pasisukti tam tikru kampu nuo 0 iki 180 laipsnių. Pasisukimo kampą nustato potensiometro vertė, bet mūsų servo variklis jau nebeturi potensimometro todėl sukasi be perstojimo viena ar kita kryptimi. Klausimas kaip jį sustabdyti? Teoriškai servo variklis turi sustoti nurodžius 90 laipsnių (180 / 2)
Tačiau relybė kita. Čia padės nedidelis Arduino programos kodas:

#include <Servo.h

Servo myservo;

int pos = 0;

void setup()
{
myservo.attach(9);
Serial.begin(9600);
}

void loop()
{
for(pos = 0; pos <= 180; pos += 1)
{
myservo.write(pos);
Serial.println(pos);
delay(200);
}

}

Programa kas 200 mili sekunžių pridės po vieną laipsnį. “Paleidus” programą reikia stebėti serial monitor ir paty servo. Pradžioje servo variklis suksis viena kryptimi ir po truputį lėtės, poto sustos ir pradės suktis kita kryptimi. Kai tik servo variklis sustos reikia įsidėmėti serial monitoriuje pateiktą skaičių (mano atveju buvo 66, nors kaip ir minėjau teoriškai turėjo būti 90) čia ir bus servo variklio stop pozicija.

Atkreipkite dėmesį !!! Kuo didesnis kampas nurodomas tuo greičiau sukasi pats variklis. Taip kad dabar galima nurodyti ne tik sukimosi kryptį, bet ir greitį.

Ultra garso sensorius
Naudoju paprastą ultra garso sensorių nustatyti atstumui iki objekto. Čia neišsiplėsiu, apie šiuos žaisliukus pilna info.

Jungikliai
Galima naudoti betkokius jungiklius. Taip kaip sensorius “mato” tik tiesiai, robotas neišvengia šoninių kliūčių - čia į pagalba ateina jungikliai. Prie arduino jungiklius dažniausiai jungiam naudojan varžas. Bet aš žinau jog arduino turi vidines varžas ir biblioteka keypad.h jas aktyvuoja, beto jungiklius galima jungti matricos principu - bet apie tai kita karta.

"Griaučiai"
Nebūtina turėti 3D spausdintuvą, galima ir tiesiog ant tarkim faneros dirželiais laidams pritvirtinti sensorius, servo variklius ant kurių klijų pagalba priklijuoti kokius nors ratukus.
Tačiau mintis ateityje pasinaudojus Lego Technics gerokai patobulinti šį robotą, galbūt “užaugint” ranką - na kaip fantazija leis.

Jungimo schema

Programos kodas

.# include <Keypad.h
.#include <Servo.h

const byte ROWS = 1;
const byte COLS = 2;

char hexaKeys[ROWS][COLS] = {
{‘1’,‘2’},
// kaire 1, desine 2
};
byte rowPins[ROWS] = {4}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {6, 5}; //connect to the column pinouts of the keypad

//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

Servo leftservo;
Servo rightservo;

int sstop = 66; // stop pozicija
int fwd = 70;
int bwd = 62;
int turntime = 2000;
int led = 13;
int atstumas = 14;

int TrigPin = 12;
int EchoPin = 11;
int prg = ‘1’;

void setup()
{
Serial.begin(9600);
leftservo.attach(9); // prijungiam kairy servo prie 9 pin
rightservo.attach(7); // prijungiam desiny servo prie 7 pin
leftservo.write(sstop); // sustabdom servus
rightservo.write(sstop);
pinMode(led, OUTPUT);

pinMode(TrigPin,OUTPUT);
pinMode(EchoPin,INPUT);
}

void loop()
{
roboAtstumas ();

roboSensorsvitch ();

}

void roboPirmyn ()
{
leftservo.write (fwd);
rightservo.write (bwd);
}

void roboStop ()
{
leftservo.write (sstop);
rightservo.write (sstop);
}

void roboAtgal ()
{
leftservo.write (bwd);
rightservo.write (fwd);
}

void roboKairen ()
{
leftservo.write (bwd);
rightservo.write (bwd);
delay (turntime);
leftservo.write (sstop);
rightservo.write (sstop);
}

void roboDesinen ()
{
leftservo.write (fwd);
rightservo.write (fwd);
delay (turntime);
leftservo.write (sstop);
rightservo.write (sstop);
}

void roboAtstumas ()
{

int distance,duration;
digitalWrite(TrigPin,HIGH);
delayMicroseconds(11);
digitalWrite(TrigPin,LOW);
duration = pulseIn(EchoPin, HIGH);
duration = duration/29/2;//Skaičiuojame atstumą centimetrais, Garso greitis 340 metrų per sekundę arba 1 cm per 29 mikro sekundes
Serial.print(duration);//Ekrane parodomas atstumas
Serial.print(“cm”);
Serial.println();
delay(100);
if (duration < 10 ) {
roboAtgal ();
delay ( turntime);
roboDesinen () ;
delay (turntime);
}
if (duration > 10 ) {

  delay (10);
  roboPirmyn ();
  
 
}

}

void roboSensorsvitch ()
{
char customKey = customKeypad.getKey();

if (customKey){
if (customKey == ‘1’ ) {
roboAtgal ();
delay ( turntime);
roboDesinen () ;
delay (turntime);
}
if (customKey == ‘2’ ) {
roboAtgal ();
delay ( turntime);
roboKairen () ;
delay (turntime);
}
}
customKey = ‘0’;
}


Konkursas #2018_PAVASARIS [BALSAVIMAS]
Konkursas #1 - Olab.lt įkurtuvių proga [baigėsi]
#2

As ir stengiuos visaip itraukti sunu…Dabar baiginejam cnc is sedu cd-rom…viska darom dviese…:slight_smile:


#3

@Ernestoks Lauksime forume progreso nuotraukų su įspūdžiais :wink: