Ožinis kranas Pastatytas iš "LEGO", valdomas pasitelkus "Arduino"

lego
lego-technics
bluetooth
arduino

#1


Šis, ožinio tipo kranas yra valdomas mano sukurta valdymo sistema, nuo kurios šį aprašymą ir norėčiau pradėti. Ši sistema yra mano pirmas bandymas susidraugauti su atviro kodo elektronika. Prieš pradėdamas ją kurti neturėjau jokios patirties nei elektronikoje, nei programavime nenaudojant grafinės aplinkos. Sistemą kurti sugalvojau dėl to, kad turėjau pigų ir nenaudojamą žaidimų pultą, ir norėjau jį perdaryti taip, kad jis galėtų valdyti mano LEGO kūrinius. Pasidomėjęs internete kokių elementų reikia ir kaip viskas galėtų veikti, viską susipirkau, tačiau vietoje HC-05 nusipirkau SPP-C “bluetooth” modulius, taip manydamas sutaupyti, tačiau jie nepritaikyti komunikuoti tarpusavyje ir aš to nežinodamas pragaišau mėnesį spręsdamas neišsprendžiamą problemą. Laimė, susisiekiau su patyrusiu žmogumi ir jis padėjo tai išsiaiškinti.
Visa sistema yra sukurta atviro kodo elektronikos pagrindu. Pulte įmontuotas “Arduino pro mini 3.3V” mikroprocesorius, HC-05 bluetooth modulis komunikuojantis su kitu įdentišku moduliu krane ir 3.7V akumuliatorius padarantis pultą bevieliu. Taip pat du “joystick” jutikliai. Krane energija paimama iš LEGO power functions baterijos bloko. Ji nukreipiama į “Arduino pro mini 5V” mikroprocesorių su “Bluetooth” moduliu, apšvietimą ir du “H-Bridge” variklių valdiklius kurių kiekvienas valdo po du variklius. Du varikliai valdomi tik krypingai, tačiau kiti turi ir greičio valdymo galimybę.
Programa iš esmės manipuliuoja skaičiumi iki 200. Nežinau ar taip žmonės daro, bet aš padariau taip, kad vienas motoras turi skaičių - 0-49, kitas motoras, - 50-99 ir t.t. Pultas kas keliasdešimt milisekundžių išsiunčia vis kitam motorui priklausančią reikšmę, o krane esantis mikroprocesorius perskaitęs kiekvieną reikšmę ją priskiria prie tam tikro motoro, suformuoja reikšmę reikalingą išėjimui ir paleidžia atitinkamą elektros srovę į motoro lizdą. Pačioje apačioje galite rasti pulto ir krano programas.


Tiek apie valdymo sistemą. Dabar apie kraną, kuris yra pirmas rimtesnis projektas naudojantis šią valdymo sistemą. Iš pradžių sistemai išbandyti buvau pastatęs tokį kaladėlių manipuliatorių (jį galite pamatyti čia https://www.jaunasisinzinierius.lt/manipulator). Krane šią sistemą nusprendžiau naudoti dėl to, kad ji užima mažai vietos ir gali būti išdėstoma dalimis, taip sumažinant specialių erdvių reikmę. Taip pat valdymas yra daug malonesnis ir paprastesnis nei kitų mano turimų sistemų. Pagrindinė krano užduotis - palinksminti visus norinčius jį pavaldyti. Todėl nuo pat pradžių rūpinausi kuo malonesniu valdytojo potyriu ir ergonomika. Kiekviena krano laisvumo ašis turi mechaninius saugiklius kurie pasiekus laisvumo ašies eigos ribą, neleidžia sukimo momentui pažeisti silpnųjų mechaninės sistemos dalių ir pačio įrenginio struktūrinio vientisumo. Griebtuvo nusileidimas yra sureguliuotas taip, kad griebtuvas pasiekęs žemę daugiau siūlo nebevyniotų. Taip apsisaugoma nuo griebtuvo atsikabinimo, siųlo įsivėlimo į mechaninę sistemą ir svarbiausia - užtikrinamas tolygus griebtuvo kilojimas. Jei nebūčiau kreipęs dėmesio į ant ričių privynioto siūlo kiekį ir tik sureguliavęs griebtuvo horizontalią poziciją, skirtingų ričių siūlo vyniojimo greitis būtų skirtingas, nes privyniotas siūlas keistų ričių diametrą. Taip kilnojamas griebtuvas pasvirtų tai į vieną pusę, tai į kitą. Keletas mechanizmų.


Vienas neįprastas sprendimas buvo priimtas kuriant krano važiuoklę. Aš norėjau, kad kranas atrodytų kuo relistiškesnis ir lieknesnis, o krano bėgiai kuo smulkesni. Paprastai kranai ir jų modeliai yra varomi ratų kurie stovi horizontaliai. Tai užtikrina sukibimą su paviršiumi ir patikimą sistemos veikimą. Deja, LEGO® pasaulio sukimo momento perdavimo mechanizmai tokiame dydyje tampa griozdiški ir nuosekliai statant sistemą, (ratas, kreipiančioji, krano struktūra ir galios perdavimo mechanizmas) rezultatas būtų dvigubai platesnis nei dabar yra. Taigi nusprendžiau varančiuosius ratus dėti vertikaliai. Tai labai sumažina sistemos plotį tačiau visiškai dingsta svorio dėka veikiantis sukibimas su paviršiumi. Tai privertė mane pridėti dar vieną ratą kitoje bėgių pusėje. Jis nuolatos palaiko varančiojo rato kontaktą su paviršiumi.


Ši sistema turėjo netikėtą ir labai gerą šalutinį poveikį. Kadangi visas kranas stovi ant labai nedidelę trintį sukuriančių ratukų ir yra varomas lengvai prasisukančių ratų, man buvo labai paprasta pastatyti krano važinėjimo lauko ribotuvus. Beje, varymo sistema, nepaisant matomų istrižų jėgos perdavimo ašių, man atrodo sunkiai pastebima, todėl manau, kad sukūriau labai elegantišką sistemą. Pabaigoje dar sumąsčiau įdiegti šviesos diodų apšvietimą. Kadangi jų sudėjau nemažai, trūksta galios, kad apšvietimas būtų iš tikrųjų praktiškas, tačiau menkame apšvietime atrodo nuostabiai. Čia galite pamatyti trumpą krano filmuką

Statant panaudota:

  • LEGO technic, system detalės
  • LEGO power functions varikliai ir baterija
  • USB žaidimų pultas
  • Atviro kodo elektronika:
  • Arduino pro mini 3.3V ir 5V
  • 2x HC-05 moduliai
  • 2x L9110S H-bridge variklių valdikliai
  • LiPo 3.7V akumuliatorius
  • 2x joystick jutikliai
  • Akumuliatoriaus krovimo valdiklis
  • 12x baltų LED
  • Laidai, jungtys, jungikliai



Krano kodas

int val;int a;int b;int c=101;int d=102;
int B1A=2;int B1B=3;int A1A=4;int A1B=5;
int C1A=7;int C1B=6;int D1A=8;int D1B=9;
void setup() {Serial.begin(9600);
pinMode(B1A,OUTPUT);pinMode(B1B,OUTPUT);pinMode(A1A,OUTPUT);pinMode(A1B,OUTPUT);
pinMode(C1A,OUTPUT);pinMode(C1B,OUTPUT);pinMode(D1A,OUTPUT);pinMode(D1B,OUTPUT);
}
void loop() {
if (Serial.available() > 0)  
{val=Serial.read();
if(val<=21){a=(val);}
if(val>=50&&val<=99){b=(val);}

if(val==100){c=(101);}
else if(val==110){c=(102);}
else if (val ==200){c=(103);}
 
if(val==120){d=(104);}
else if(val==130){d=(105);}
else if (val==210){d=(106);}

}
//a motoro kodas
if (a<=9)
{analogWrite(A1B,(a-10)*-24);digitalWrite(A1A,LOW);}
else if  (a>=11)
{analogWrite(A1B,(a-11)*-24);digitalWrite(A1A,HIGH);}
else
{analogWrite(A1B,0);digitalWrite(A1A,LOW);}
//b motoro kodas      
if (b<=70)
{analogWrite(B1B,(b-71)*-12);digitalWrite(B1A,LOW);}
else if  (b>=79)
{analogWrite(B1B,(b-78)*-12);digitalWrite(B1A,HIGH);}
else
{analogWrite(B1B,0);digitalWrite(B1A,LOW);}
//c motoro kodas

if (c==101)
{digitalWrite(C1B,HIGH);digitalWrite(C1A,LOW);}
else if  (c==102)
{digitalWrite(C1B,LOW);digitalWrite(C1A,HIGH);}
else if (c==103)
{digitalWrite(C1B,LOW);digitalWrite(C1A,LOW);}
//d motoro kodas

if (d==104)
{digitalWrite(D1B,HIGH);digitalWrite(D1A,LOW);}
else if  (d==105)
{digitalWrite(D1B,LOW);digitalWrite(D1A,HIGH);}
else if (d==106)
{digitalWrite(D1B,LOW);digitalWrite(D1A,LOW);}
Serial.println(val);
}


Pulto kodas

int joy1;int joy2;int joy3;int joy4;int pirmas=105;int antras=115;
void setup() {Serial.begin(9600);}
void loop() {
joy1=analogRead(A0);joy2=analogRead(A1);joy3=analogRead(A2);joy4=analogRead(A3);
joy1=map(joy1,0,1023,0,21);joy2=map(joy2,0,1023,50,99);

if(joy3<=300){pirmas=(100);}
else if (joy3>=700){pirmas=(110);}
else if (joy3>=301&&joy3<=699) {pirmas=(200);}

if(joy4<=400){antras=(120);}
else if (joy4>=700){antras=(130);}
else if(joy4>=401&&joy3<=699){antras=(210);}

Serial.write(joy1);
delay(5);
Serial.write(joy2);
delay(5);
Serial.write(pirmas);
delay(5);
Serial.write(antras);
delay(5);

}

Konkursas #2019 - Mokyklos Maker Faire
Konkursas #2019 - Mokyklos Maker Faire