Croduino kao servo driver

Autor projekta: Domagoj Perković, [email protected]

UVOD

Ovaj mini-projekt pokazuje Croduino Basic2 u ulozi servo drivera, a povezan je preko USB-a na Rasberry Pi koji mu šalje informacije kako upravljati motorima spojenima na Croduino. Na taj način je istovremeno osigurano napajanje Croduina preko Raspberry-a kao i komunikacija između njih. Svi digitalni izlazi Croduina se mogu iskoristiti za servo motor, osim pinova 0 i 1 jer se oni koriste za serijsku komunikaciju. Dakle, zanimljivo je da digitalni izlaz ne mora imati mogućnost PWM moduliranja signala. Na taj način Croduino može upravljati s 12 servo motora. Jedna stvar o kojoj treba voditi računa je da servo motor standardne izvedbe povuče oko 250mA, pa bi njih 12 povuklo 3A što Croduino nikako ne može dati. U tom slučaju treba osigurati vanjsko 5V napajanje servo motora.

PROGRAMSKI KODOVI

U nastavku se nalaze programski kod za Croduino te Python skripta za Raspberry Pi.
 
Croduino:

// 2018  e-radionica.com
// code by Domagoj Perkovic 

#include 

int servo_kut;
String tmp,servo_motor;
Servo myServo2,myServo3,myServo4,myServo5,myServo6,myServo7,myServo8,myServo9,myServo10,myServo11,myServo12,myServo13;

void setup() {
  myServo2.attach(2); // servo pin, ne mora biti PWM
  myServo3.attach(3); // servo pin, ne mora biti PWM
  myServo4.attach(4); // servo pin, ne mora biti PWM
  myServo5.attach(5); // servo pin, ne mora biti PWM
  myServo6.attach(6); // servo pin, ne mora biti PWM
  myServo7.attach(7); // servo pin, ne mora biti PWM
  myServo8.attach(8); // servo pin, ne mora biti PWM
  myServo9.attach(9); // servo pin, ne mora biti PWM
  myServo10.attach(10); // servo pin, ne mora biti PWM
  myServo11.attach(11); // servo pin, ne mora biti PWM
  myServo12.attach(12); // servo pin, ne mora biti PWM
  myServo13.attach(13); // servo pin, ne mora biti PWM
  Serial.begin(9600); // open a serial connection to your computer
}

void loop() {
  servo_motor="";
  if(Serial.available()>0)
  {
    tmp=Serial.readString();
    Parser(tmp);
    Serial.print("["); Serial.print(tmp); Serial.println("]");
    Serial.print("["); Serial.print(servo_motor); Serial.println("]");
    Serial.print("["); Serial.print(servo_kut); Serial.println("]");
  }
  if(servo_motor.equals("S2"))
  {
    myServo2.write(servo_kut);
    Serial.println("S2");
  }
  else if(servo_motor.equals("S3"))
  {
    myServo3.write(servo_kut);
    Serial.println("S3");
  }
  else if(servo_motor.equals("S4"))
  {
    myServo4.write(servo_kut);
    Serial.println("S4");
  }
  else if(servo_motor.equals("S5"))
  {
    myServo5.write(servo_kut);
    Serial.println("S5");
  }
  else if(servo_motor.equals("S6"))
  {
    myServo6.write(servo_kut);
    Serial.println("S6");
  }
  else if(servo_motor.equals("S7"))
  {
    myServo7.write(servo_kut);
    Serial.println("S7");
  }
  else if(servo_motor.equals("S8"))
  {
    myServo8.write(servo_kut);
    Serial.println("S8");
  }
  else if(servo_motor.equals("S9"))
  {
    myServo9.write(servo_kut);
    Serial.println("S9");
  }
  else if(servo_motor.equals("S10"))
  {
    myServo10.write(servo_kut);
    Serial.println("S10");
  }
  else if(servo_motor.equals("S11"))
  {
    myServo11.write(servo_kut);
    Serial.println("S11");
  }
  else if(servo_motor.equals("S12"))
  {
    myServo12.write(servo_kut);
    Serial.println("S12");
  }
  else if(servo_motor.equals("S13"))
  {
    myServo13.write(servo_kut);
    Serial.println("S13");
  }
    
  delay(100);
}//end loop

void Parser(String cmd_line)
{
  int x;
  String kut;
  cmd_line.trim(); cmd_line.toUpperCase();
  x=cmd_line.indexOf(" ");
  if(x<0) 
  {
    Serial.println("Kriva naredba...");
    return; //nema niti jednog razmaka, to je greška
  }
  else
  {
    servo_motor=cmd_line.substring(0,x);
    kut=cmd_line.substring(x); kut.trim();
    servo_kut=kut.toInt();
  }
}//end Parser
  

  

 
Python:

import serial
com_port=input("COM PORT:")
brzina=input("Baud rate [9600]:")
if(len(brzina)==0):
    brzina=9600
croduinoSerial = serial.Serial(com_port, brzina)

while True: #beskonacni loop
    servo=input("Unesi naredbu (Sx kut):")
    servo=servo.encode()
    croduinoSerial.write(servo)

PRIMJER KORIŠTENJA

 
Na primjeru ćemo pokazati korištenje servo motora povezanoga na pin broj 2, koji nije PWM pin. Konekcija motora s pločicom se vidi na slici.

 
Servo motor se spaja na sijedeći način: crvena žica na Croduino +5V, crna žica na Croduino GND i bijela žica (signal) na Croduino izlaz 2.
Kada se Croduino spoji s Raspberry-em treba saznati koji mu je komunikacijski kanal dodijeljen. To se vidi ako se u konzolnom prozoru otipka naredba ls /dev/tty* što se vidi iz slijedeće slike:

 
Kada se pokrene Python program na Raspberry-u kod COM porta treba upisati odgovarajući tty kao što pokazuje slijedeća slika (ne zaboravite puni naziv):

 
Pod Baud rate se upiše brzina serijske komunikacije koja je definirana kod Croduina ili, ako je 9600 - što je uobičajena vrijednost, samo se stisne Enter. Nakon toga program traži unos naredbe koja se sastoji od oznake servo motora i apsolutne pozicije glave u stupnjevima s razmakom između ta dva parametra. Sx označava broj servo motora te može biti između S2 i S13, dok je kut između 0 i 180. S2 ako je servo motor spojen na digitalni izlaz 2, S3 na izlaz 3 itd.

ZAKLJUČAK

Ovaj primjer osmišljen je da se pokretanje servo motora ostvari putem serijske veze što osigurava primjenu na različitim uređajima. U programskom smislu naredbe prema Croduinu putuju serijskom vezom u ASCII formatu što komunikaciju čini primjenjivom na različitim platformama. Čak je moguće povezati se direktno na Croduinove pinove za serijsku komunikaciju te na taj način davati naredbe - ne mora se koristiti USB kabel i USB-UART konverter na pločici Croduina. U ovom primjeru je korišten Raspberry Pi, ali isto tako se može koristiti PC, Mac, Microbit ili obični terminal. Modifikacijom Python programa mogu se dobiti različite primjene servo motora, a da se Croduino program ne mijenja, tj. praktično ga možemo doživljavati kao „crnu kutiju“ koja prima naredbe i izvršava ih. Na taj način se omogućilo korisnicima koji nemaju razvojnu Croduino/Arduino okolinu ili koji se ne znaju njome služiti, da mogu koristiti servo motore s drugim uređajima i drugim programskim jezicima. Postoji i drugi razlog korištenja Croduina kao servo drivera: naime, Croduino Basic2 je skoro dvostruko jeftiniji od modula za upravljanje servo motorima slične namjene i načina korištenja.

Leave a Reply