Řízení serva z PC pomocí Arduina Duemilanove

Ačkoliv splnění takového požadavku se může zdát složité, opak je pravdou. Budeme k tomu potřebovat samozřejmě Arduino, zakoupit si ho můžete například na stránkách www.czechduino.cz. A jak tedy na to? Za prvé prostudujeme knihovnu servo na Arduino.cc. Polohu, do které chceme servo nastavit, budeme Arduinu posílat po sériové lince (nenechte se zmást, pořád máme na mysli USB kabel, kterým ho normálně připojujeme). K odeslání můžeme použít buď Serial monitor v IDE Arduina nebo vlastní aplikaci. Pro tvorbu takové jakou vidíte na videu jsem použil Microsoft Visual Studio Express s jazykem C++, lze jej zdarma stáhnout z internetu. Základní instrukce, jak aplikaci vytvořit, opět najdeme na Arduino.cc. Posledním bodem je už jen zapojení a použití LCD displeje. Důležité je pamatovat na to, že elektromotor v servu má zejména při rozjezdu nebo ve chvíli, kdy servo zatížíme, velkou spotřebu. Není tedy vhodné napájet ho přímo z Arduina, doporučuji zajistit mu samostatný zdroj 5V.

Program

Například takto může vypadat kód, který bude řídit servo podle přijatých dat po sériové lince. Na příjem písmen a, b, n, c, d reaguje nastavením příslušné polohy a jejím zobrazením na LCD displeji. Neutrálu při použití knihovny Servo.h odpovídá 90°, proto například v případě "a" nastavujeme polohu serva na 10°. Požadovanou výchylku musíme vždy přičíst nebo odečíst od 90°.

#include <Servo.h> 
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

Servo servo_1;  
char pozice;

void setup() 
{
lcd.begin(16, 2);
lcd.print("Rizeni serva");
servo_1.attach(9);  
Serial.begin(9600);
delay(250);
} 

void loop() 
{
if (Serial.available() > 0)
  {
  pozice = Serial.read();
  switch (pozice)
    {
    case 'a': 
    servo_1.write(10);
    lcd.setCursor(0,1); 
    lcd.print("Pozice: +80    ");
    delay(250);
    break;
  
    case 'b': 
    servo_1.write(45);
    lcd.setCursor(0,1);
    lcd.print("Pozice: +45    ");
    delay(250); 
    break;
  
    case 'n': 
    servo_1.write(90);
    lcd.setCursor(0,1);
    lcd.print("Pozice: neutral");
    delay(250); 
    break;
  
    case 'c': 
    servo_1.write(135);
    lcd.setCursor(0,1);
    lcd.print("Pozice: -45    ");
    delay(250); 
    break;
    
    case 'd': 
    servo_1.write(170);
    lcd.setCursor(0,1);
    lcd.print("Pozice: -80    ");
    delay(250); 
    break;
    }
  }  
} 

Takto řízené servo samozřejmě samo o sobě není k ničemu dobré, pokud nebudeme počítat možnost využití celého pokusu jako servotesteru. Nicméně bych si to dovolil považovat za dobrý odrazový můstek k větším projektům, vyzkoušeli jsme použití LCD displeje, ovládání serva a navíc i sériovou komunikaci.

- Stránka vytvořena 29. dubna 2010 -