Prispevki Arduino

Arduino robot

Arduino robot primer nakazuje uporabo in vodenje dveh enosmernih (angl. DC) motorjev v aplikaciji preprostega robota.

Za izdelavo robota potrebujete:

Na voljo je več različnih vrst ohišij (podvozij) za Arduino robote. Izbrali smo enega izmed najenostavnejših in cenovno dostopnih. Ponuja ogromno možnosti za kasnejšo nadgradnjo, saj je zagotovljenega veliko dodatnega prostora za namestitev senzorjev, Wireless modulov, kamer itd..

image 1

Vrednost toka na izhodnih sponkah krmilnika je omejena na določeno vrednost (20 – 40 mA), kar omejuje priklop določenih porabnikov (dovolj le za LED). Zato se v tem primeru poslužujemo uporabe dvojnega H-mostiča, s katerim zagotovimo nadzor nad hitrostjo in smerjo dveh motorja. Izdelan je na osnovi MOS-FET tehnologije, z vključenimi “flyback” diodami. Omogočajo krmiljenje motorjev v območju od 4,5 V do 13,5 V z zagotovljenim neprekinjenim tokom cca. 1 A (vršne vrednost cca. 3 A).

image 7

Poleg zgoraj navedenih komponent, potrebujemo tudi dodatno zunanje napajanje (4x AA baterija), s katerimi zagotovimo dovolj visok tok za vodenje dveh motorjev.

Sedaj prikažimo način priključitve DC motorja direktno preko baterije. Na spodnji sliki je vključena “flyback” dioda, ki preprečuje, da bi inducirana napetost ob izklopu motorja poškodovala kasnejše priključeno vezje.

image 4

Z uporabo H-mostiča, lahko spremenimo smer vrtenja motorja. Način priključitve z Arduinom Uno nam prikazuje spodnja slika.

image 5

H – mostič sestavljajo štirje MOS-FET tranzistorji, zato je k vsakemu dodana tudi “flyback” dioda. Ker imamo dvojni H-mostič je le teh osem. Diod v vezje ni potrebno vključiti, saj so že vključene na rdeči tiskani. Bodite pozorni na priključitev mostiča (glej sliko, rdeča tiskanina)!

KODA

OPOMBA! V kodi je uporabljen H-mostič proizvajalca SparkFun!

// Left motor
const int pinAIN1 = 5; //Direction
const int pinAIN2 = 4; //Direction
const int pinPWMA = 3; //Speed

// Right motor
const int pinBIN1 = 7;  //Direction
const int pinBIN2 = 8; //Direction
const int pinPWMB = 9;  //Speed

//H-Bridge Standby
const int pinSTBY = 6;

boolean leftMotor = 1;
boolean rightMotor = 0;

void setup() {
  pinMode(pinPWMA, OUTPUT);
  pinMode(pinAIN1, OUTPUT);
  pinMode(pinAIN2, OUTPUT);
  pinMode(pinPWMB, OUTPUT);
  pinMode(pinBIN1, OUTPUT);
  pinMode(pinBIN2, OUTPUT);
  pinMode(pinSTBY, OUTPUT);
}

void loop() {
  // acceleration 
  for (int i = 0; i <= 255; i += 5) {
    motorDrive(leftMotor, 1, i);
    motorDrive(rightMotor, 1, i);
    delay(50);
  }
  delay(1700);

  // turn right
  motorStop(rightMotor);
  delay(1500);

  // go ahead
  motorDrive(rightMotor, 1, 255);
  delay(1000);

  // stop
  motorStop(leftMotor);
  motorStop(rightMotor);
  delay(300);  

  // turn around in place
  motorDrive(leftMotor, 0, 255);
  motorDrive(rightMotor, 1, 255);
  delay(3600);

  // stop
  motorStop(leftMotor);
  motorStop(rightMotor);
  delay(300);  

  // turn left in a circle
  motorDrive(leftMotor, 1, 180);
  motorDrive(rightMotor, 1, 255);
  delay(4000);

  // slow down
  for (int i = 255; i >= 0; i -= 5) {
    motorDrive(leftMotor, 1, i);
    motorDrive(rightMotor, 1, i);
    delay(55);
  }

  // stop
  motorStop(leftMotor);
  motorStop(rightMotor);
  delay(10000);
}

/*
  Drive a motor:
    - motorNumber: 0 left motor, 1 right motor
    - moveForward: motor direction (0 reverse, 1 forward)
    - motorSpeed: 0 to 255 ---> 0 = stop / 255 = max speed
*/
void motorDrive(boolean motorNumber, boolean moveForward, 
int motorSpeed) {
  // Relates to AIN1 or BIN1 
  // (depending on the motor number specified)
  boolean pinIn1;  

  // direction to turn the motor
  //   clockwise: IN1 = HIGH and IN2 = LOW
  //   counter-clockwise: IN1 = LOW and IN2 = HIGH
  if (moveForward)
    pinIn1 = LOW;
  else
    pinIn1 = HIGH;

  // select the motor to turn, set the direction and the speed
  if (motorNumber == leftMotor) {
    digitalWrite(pinAIN1, pinIn1);
    digitalWrite(pinAIN2, !pinIn1);
    analogWrite(pinPWMA, motorSpeed);
  } else {
    digitalWrite(pinBIN1, pinIn1);
    digitalWrite(pinBIN2, !pinIn1);
    analogWrite(pinPWMB, motorSpeed);
  }

  // STBY must be high to enable motors
  digitalWrite(pinSTBY, HIGH);
}

// Stop the specified motor
void motorStop(boolean motorNumber) {
  if (motorNumber == leftMotor) {
    digitalWrite(pinAIN1, LOW);
    digitalWrite(pinAIN2, LOW);
  } else {
    digitalWrite(pinBIN1, LOW);
    digitalWrite(pinBIN2, LOW);
  }
}

DODATNA POJASNILA GLEDE KODE in delovanja (VIDEO na spodnji povezavi).

Related Posts

Dodaj odgovor

Vaš e-naslov ne bo objavljen. * označuje zahtevana polja