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