Puslapiai

2012 m. gegužės 13 d., sekmadienis

Arduino + 2 DC varikliukai (schema ir kodas)

Sveiki,
Užbaigiau testavimus su DC varikliukais, todėl šiandien pasidalinsiu su jumis ir pridėsiu kodą testavimams. Viskas ganėtinai paprasta. Internetas pilnas schemų, bet tarp jų yra nemažai blogų, todėl nėra taip paprasta susirasti normalią schemą. Vienos schemos reikalauja atidaus programavimo, o kitos gali būti aplamai blogos. Abiem variantais gresia tas pats rezultatas - trumpas sujungimas, todėl naujokams, kurie nepilnai gaudosi elektronikoje tai gali tapti rimtu įšukiu.
Vis gi, nėra taip baisu, kaip kalbu, nes po šio straipsnio Jūs jausitės pilnaverčiais DC varikliukų naudotojais arba nebegaišite laiko ir įsigysite servo varikliukus ar motor shield'ą. Vieną visai neblogą rasite čia: http://www.ladyada.net/make/mshield/


Ką reikia žinoti prieš pradedant?

Pirmiausia tai noriu įspėti ir paraginti imtis realių veiksmų tik tada, kai viską suprasite nuo pradžių iki galo schemą. Suprasti kaip veikia tranzistoriai ir L293D mikroschema. L293D pasirinkau todėl, kad jis turi vidinius diodus, kurie suteiks mums daugiau saugumo. Yra ir analogiškų mikroschemų, bet rekomenduoju kitų nenaudoti, nes yra variantų, kur rašo jog yra diodai, bet labiau įsigilinus tenka nusivilti ir šiek tiek nusigąsti.. Todėl naujokams rekomenduoju net nežiūrėti schemų be L293D.


Ko mums prireiks?


  • ATmega328 ar pašaus mikrokontrolerio (naudojau Arduino UNO su ATmega328)
  • L293D
  • Keturių varžų
  • Dviejų vienetų 2N3904 (NPN) tranzistorių.
  • Breadboard
  • Keletos kondensatorių (nebūtina)
  • Jungiamųjų laidukų

Schema ir programinis kodas

Schemos aš nekūriau, o susiradau internete ir sėkmingai naudoju pats. Labiausiai patiko http://letsmakerobots.com/node/32462 schema. Rekomenduoju paskaityti ką autorius rašo. Ten yra aptariama apie blogas schema ir net pateikė blogos schemos pavyzdį.

Mano pasirinkta schema

Kuo ji tokia ypatinga? Tuo, kad programuoti galite nesukę galvos, kad užtrumpinsite. Yra kur kas daugiau gerų schemų, bet man ši patiko dėl to, kad galiu programuoti nesukdamas sau galvos, kad užtrumpinsiu.
Visas schemos kietumas, tai naudojimas EN1 ir input1 su EN2 ir input4 (EN = enagble = įjungti) + tranzistoriai. Realiai užtenka padaryti HIGH pin su EN1 ir EN2, kad varikliukai suktų ratukus į priekį, o norint sukti atgal, tai papildomai įjungiame input1 ir input4. Norint suktis į vieną pusę, tai įjungiame tik vienos pusės (pvz. EN1) varikliuką. Tiesa, tai priimtina tik robotams kurie yra su apvalia platforma ir turi tris ratukus, kai du iš jų su varikliukais. Kadangi aš naudojau RC mašinėlės korpusą, tai sukimo laipsnis pernelyg mažas, kad to pakaktų, todėl turėjau priversti vieną ratuką suktis į priekį, o kitą atgal (šis būdas tinka ir apvaliems su trimis ratukais). Robotas užuot važiavęs lėčiau į priekį ir mažu kampu bandydamas pasisukti, dabar suksis vietoje ratu.
Aš naudojau keletą kondensatorių. Vienas tarp baterijų šaltinio ir anodų, kurie sujungti į vieną vietą su baterijos anodu ir mikrokontrolerio anodu. Ir prie varikliukų keturis keramikinius kondensatorius. Neblogas pavyzdys čia: http://www.instructables.com/id/Control-your-motors-with-L293D-and-Arduino/

Kodas ganėtinai paprastas, todėl nematau reikalo jį aprašinėti, nes jau parašiau, kaip priversti suktis ratukus į tam tikrą pusę, kad robotas judėtų tam tikromis kryptimis. Iš esmės jis skirtas testavimams.

/*   Dvieju DC varikliuku valdymo testavimas
     http://arduinorobot.blogspot.com/
     Schematic:
     http://letsmakerobots.com/node/32462
*/

// —————————————————————————  Motors
int en1 = 9;     // Enable left motor pin for going forward left
int left_b = 10; // backward for left motor pin

int en2 = 5;     // Enable right motor pin for going forward right
int right_b = 6; // backward for right motor pin

int led = 13;    //for debuging

int time = 1000;

// ————————————————————————— Setup
void setup() {
Serial.begin(9600);

// Setup motors
pinMode(en1, OUTPUT);
pinMode(en2, OUTPUT);
pinMode(left_b, OUTPUT);
pinMode(right_b, OUTPUT);
// Setup  debug LED
pinMode(led, OUTPUT);
}

// ————————————————————————— Loop
void loop() {
motor_stop();
delay(5000);
digitalWrite(led, LOW);

drive_forward();
Serial.println("going forward");
delay(time);

drive_backward();
Serial.println("going backward");
delay(time);

turn_left();
Serial.println("going left");
delay(time);

turn_right();
Serial.println("going right");
delay(time);

motor_stop();
}

// ————————————————————————— Drive

void debug(){
  digitalWrite(led, HIGH);
  delay(500);
  digitalWrite(led, LOW);
}

void motor_stop(){
  digitalWrite(en1, LOW);
  digitalWrite(en2, LOW);
  
  digitalWrite(left_b, LOW);
  digitalWrite(right_b, LOW);
  delay(500);
}

void drive_forward(){
 motor_stop();
 digitalWrite(en1, HIGH);
 digitalWrite(en2, HIGH);
}

void drive_backward(){
  motor_stop();
  digitalWrite(en1, HIGH);
  digitalWrite(en2, HIGH);
  
  digitalWrite(left_b, HIGH);
  digitalWrite(right_b, HIGH);
}

void turn_left(){
  motor_stop();
  digitalWrite(en2, HIGH);
  digitalWrite(en1, HIGH);
  digitalWrite(left_b, HIGH);
}

void turn_right(){
  motor_stop();
  digitalWrite(en1, HIGH);
  digitalWrite(en2, HIGH);
  digitalWrite(right_b, HIGH);
}



Pastabos

Dėl baterijų, tai parašysiu straipsniuką vėliau. Realiai rekomenduoju AA baterijų pakus. Aš testavimams naudoju 8x1.5V AA baterijas. Kokias pakraunamas baterijas pasrinkti? Vienareikšmiškai Sanyo. Ličio baterijas naudoti gali tik tie, kas jau pažengę ir žino ką daro, ir kokie pavojai tyko, nes nemanau, kad norėtumėte sudeginti savo namus, o tai padaryti tikrai įmanoma, nes kai dega, tai jau reikės tikro gesintuvo, o ne pamindžiojimų su tapke.. :)
Jei lituosite schemą, tai patikrinkite su testeriu ar viską gerai sujungėte dar neįdėje L293D, tuomet pabandykite pradžioje įdėti L293D ir pajungti tik baterijas. Jei viskas gerai, tuomet jau galima pradėti žaisti su Arduino. Jei išgirsite čirškėjimą ar išvysite juodą dūmelį, tai atjunkite maitinimą ir pakeiskite L293D mikroschemą, nes tiką sudeginote. Lengviausias būdas išvysti dūmelius, tai sumaišyti baterijų pliusą su minusu. Todėl viską sujungę ir patikrinę ar gerai veikia nepagailime poros litų jungtims. Kurių pagalba nesumaišytumėte pliuso su minusu ateityje. Tai gali sutaupyti  Jūsų pinigus ateityje. Galite įmontuoti jungiklį, kuris išjungia baterijas. Dar galite naudoti varžą prie baterijų, kad nenaudotų maksimaliai baterijas, nes kaip pastebėsite, tai baterijos gan greitai senka ir tai vienas iš didesnių minusų, nes daugiau baterijų, daugiau svorio.

Sėkmės testuojant! ;)

4 komentarai:

  1. Atsakymai
    1. Dėkui, kad pranešėte, pataisiau. Greičiausiai autorius atnaujino schemą kažkiek, kad neberodė senosios. ;]

      Panaikinti
  2. Ačiū, įdomu.

    Tik labai erzina elementarios klaidos:
    "įšukiu" - iššūkiu
    "tiką" - tik ką

    AtsakytiPanaikinti
  3. Ačiū, įdomu.

    Tik labai erzina elementarios klaidos:
    "įšukiu" - iššūkiu
    "tiką" - tik ką

    AtsakytiPanaikinti