🚚 Besplatna dostava za narudžbe veće od 35EUR

DASDUINO KAO SERVO DRIVER

CRODUINO KAO SERVO DRIVER-Uncategorized @hr

Autor projekta: Domagoj Perković, domagoj.perkovic@donicep.hr

UVOD

Ovaj mini-projekt pokazuje Dasduino Core u ulozi servo drivera, a povezan je preko USB-a na Rasberry Pi koji mu šalje informacije kako upravljati motorima spojenima na Dasduino. Na taj način je istovremeno osigurano napajanje Dasduina preko Raspberry-a kao i komunikacija između njih. Svi digitalni izlazi Dasduina 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 Dasduino 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 Dasduino 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 Dasduino te Python skripta za Raspberry Pi.

Dasduino:

// 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 Dasduino +5V, crna žica na Dasduino GND i bijela žica (signal) na Dasduino izlaz 2.
Kada se Dasduino 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 Dasduina 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 Dasduinu putuju serijskom vezom u ASCII formatu što komunikaciju čini primjenjivom na različitim platformama. Čak je moguće povezati se direktno na Dasduinove pinove za serijsku komunikaciju te na taj način davati naredbe – ne mora se koristiti USB kabel i USB-UART konverter na pločici Dasduina. 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 Dasduino 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 Dasduino/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 Dasduina kao servo drivera: naime, Dasduino Core je skoro dvostruko jeftiniji od modula za upravljanje servo motorima slične namjene i načina korištenja.