Projekt 5 Alalisvoolumootor ja selle kiirus

Antud projekt eeldab, et kasutatakse juba kokku pandud kahe mootoriga roboti komplekti. Mootorite juhtmooduli ühendamisel tuleb jälgida, et sisendsignaalid oleks ühendatud õigetesse Arduino plaadi viikudesse. Vastasel juhul juhtmoodul ei toimi korrektselt. Mootorite juhtmed ühendada juhtmooduli kruviklemmide külge. Juhtsignaalide juhtmed ühendada Arduino plaadiga järgnevalt:

  • Juhtmoodul A-1A → Arduino D10
  • Juhtmoodul A-1B → Arduino D12
  • Juhtmoodul B-1A → Arduino D11
  • Juhtmoodul B-1B → Arduino D13

NB! Jälgida ühendamisel juhtmooduli toite polaarsust.

Näide #5.1 Alalisvoolumootor ja H-sild

Mootori juhtimiseks on soovitav eelnevalt uurida H-silla tööpõhimõtet. Tööpõhimõtte tundmine lihtsustab näidetest arusaamist. Kui mõni mootor peaks juhtumisi pöörlema vastupidiselt programmis määratud suunale, siis vahetada omavahel selle mootori juhtmed juhtmooduli küljes.
Programmis alustame ühendusviikude määramisega ning seejärel määrame vastavad viigud ka väljundiks. Mootorite juhtimiseks tekitame juurde funktsiooni mootorid(vasak, parem). Funktsiooni sisendiks on 2 parameetrit, milleks on vasaku ja parema mootori pöörlemise suunad. Vastavalt suunale muudetakse väljundite olekuid madalaks või kõrgeks. Väljundite muutmise loogika tuleneb mootori juhtmooduli andmelehest. Katsetada peatsüklis mootorite juhtimise käsu kombinatsioone erinevate manöövrite sooritamiseks.

/* Nimetus: Näide #5.1
Kirjeldus: Alalisvoolumootor ja H-sild
*/
// Mootori viikude määramine juhtmooduli juhtimiseks.
// Mootori liikumissuund sõltub ka mootori ühendamise polaarsusest.
const int vasak_A = 10; // juhtmooduli viik A-1A
const int vasak_B = 12; // juhtmooduli viik A-1B
const int parem_A = 11; // juhtmooduli viik B-1A
const int parem_B = 13; // juhtmooduli viik B-2A
 
void setup() 
{
  // Mootori juhtviikude väljundiks seadistamine
  pinMode(vasak_A,OUTPUT);
  pinMode(vasak_B,OUTPUT);
  pinMode(parem_A,OUTPUT);
  pinMode(parem_B,OUTPUT);
 
  mootorid(0,0); // Mootori algne peatamine
  delay(2000); // Viide, et robot laua pealt kohe plehku ei paneks
}
 
void loop() 
{
 
  mootorid(1,1); // Robot sõidab otse
  delay(2000); // Viide - robot säilitab viite pikkuse liikumise
 
  mootorid(-1,1); // Robot keerab vasakule
  delay(500);  // Viide - robot säilitab viite pikkuse liikumise
}
 
// Funktsioon mootori liikumissuundade määramiseks
void mootorid(int vasak, int parem)
{
  // Vasak mootor
  if(vasak == 1)
  { // Vasak mootor edasi
    digitalWrite(vasak_A,HIGH);
    digitalWrite(vasak_B,LOW);
  }
  else if(vasak == -1)
  { // Vasak mootor tagasi
    digitalWrite(vasak_A,LOW);
    digitalWrite(vasak_B,HIGH);
  }
  else
  { // Vasak mootor seisma
    digitalWrite(vasak_A,LOW);
    digitalWrite(vasak_B,LOW);
  }
 
  // Parem mootor
  if(parem == 1)
  { // Parem mootor edasi
    digitalWrite(parem_A,HIGH);
    digitalWrite(parem_B,LOW);
  }
  else if(parem == -1)
  { // Parem mootor tagasi
    digitalWrite(parem_A,LOW);
    digitalWrite(parem_B,HIGH);
  }
  else
  { // Parem mootor seisma
    digitalWrite(parem_A,LOW);
    digitalWrite(parem_B,LOW);
  }
}

Näide #5.2 Alalisvoolumootori kiirus

Mootori kiiruse juhtimiseks on vaja pulsilaiusmodulatsioon ehk PWM signaali. Tegemist on praktiliselt sama signaali tüübiga, mida kasutasime LED-i ereduse juhtimisel. PWM signaaliga lülitatakse viiku pidevalt kõrgesse ja madalasse olekusse, mis tekitab mootorile toitepingest madalama keskmise pinge. Näiteks toitepinge 5 V ja 50% töötsükliga PWM signaali puhul tekib mootori klemmidele keskmine pinge 2,5 V.
Programmi töö on sarnane näitele #5.1, kus mootoreid juhiti diskreetselt ehk liigub või ei liigu. Antud näites juhime lisaks mootori kiirust ning selleks on vaja kasutada käsku analogWrite, mis tekitab soovitud töötsükliga PWM signaali. Antud käsk toimib vaid kindlatel Arduino viikudel (UNO-l: D3, D5, D6, D9, D10 ja D11). Käsu sisendiks saab kasutada väärtusi 0-255 ehk 8 bitti. Sellest tulenevalt on ka mootorite juhtimise funktsiooni parameetrite vahemik -255 kuni 255, kus negatiivne arv näitab tagurpidi liikumist ja null seisma jäämist. Eksperimenteerida erinevate kiiruste ja suundadega.

/* Nimetus: Näide #5.2 Alalisvoolumootori kiiruse reguleerimine
   Kirjeldus: Programm demonstreerib alalisvoolumootori kiiruse juhtimist 
              L9110 mootori juhtmooduli näitel.
*/
// Mootori viikude määramine juhtmooduli juhtimiseks
// Mootori liikumissuund sõltub ka mootori ühendamise polaarsusest
const int vasak_A = 10; // juhtmooduli viik A-1A
const int vasak_B = 12; // juhtmooduli viik A-1B
const int parem_A = 11; // juhtmooduli viik B-1A
const int parem_B = 13; // juhtmooduli viik B-2B
 
void setup() 
{
  // Mootori juhtviikude väljundiks seadistamine
  pinMode(vasak_A,OUTPUT);
  pinMode(vasak_B,OUTPUT);
  pinMode(parem_A,OUTPUT);
  pinMode(parem_B,OUTPUT);
 
  mootorid(0,0); // Mootori algne peatamine
  delay(2000); // Viide, et robot laua pealt kohe plehku ei paneks
}
void loop()
 {
  mootorid(100,100); // Robot sõidab otse aeglaselt
  delay(2000); // Viide - robot säilitab viite pikkuse liikumise
  mootorid(100,255); // Robot keerab sujuvalt vasakule
  delay(2000); // Viide - robot säilitab viite pikkuse liikumise
  mootorid(-255,-255); // Robot tagurdab kiiresti
  delay(2000); // Viide - robot säilitab viite pikkuse liikumise
  mootorid(-255,-100); // Robot tagurdab sujuvalt paremale
  delay(2000); // Viide - robot säilitab viite pikkuse liikumise
  mootorid(150,-150); // Robot keerab kohapeal paremale
  delay(2000); // Viide - robot säilitab viite pikkuse liikumise
}
 
// Funktsioon mootori liikumissuuna ja kiiruse määramiseks
void mootorid(int vasak, int parem)
 {
  // Vasak mootor
  if(vasak > 0 && vasak <= 255)
  { // Vasak mootor otse
    analogWrite(vasak_A,vasak);
    digitalWrite(vasak_B,LOW);
  }
  else if(vasak < 0 && vasak >= -255)
  { // Vasak mootor tagurpidi
    analogWrite(vasak_A,255+vasak);
    digitalWrite(vasak_B,HIGH);
  }
  else
  { // Vasak mootor seisma
    digitalWrite(vasak_A,LOW);
    digitalWrite(vasak_B,LOW);
  }
 
  // Parem mootor
  if(parem > 0 && parem <= 255)
  { // Parem mootor otse
    analogWrite(parem_A,parem);
    digitalWrite(parem_B,LOW);
  }
  else if(parem < 0 && parem >= -255)
  { // Parem mootor tagurpidi
    analogWrite(parem_A,255+parem);
    digitalWrite(parem_B,HIGH);
  }
  else
  { // Parem mootor seisma
    digitalWrite(parem_A,LOW);
    digitalWrite(parem_B,LOW);
  }
}

Harjutused

Harjutus #5.1

Modifitseerida näiteprogrammi nii, et robot sõidab kaheksa kujulist trajektoori.

Harjutus #5.2

Modifitseerida näiteprogrammi nii, et robot teeb iseseisvalt paralleelparkimist ette määratud kohta.

et/arduino/motors/project1.txt · Last modified: 2020/07/20 09:00 by 127.0.0.1
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0