ページ

2012年2月28日火曜日

自分なりにWindows端末からサーボを制御




まずはArduinoのスケッチを適当に書く
#include <Servo.h>

Servo s1;
int sp = 9;
int f_rate = 1000;
int is_add = 0;

void setup(){
  Serial.begin(9600);
  s1.attach(sp);
}

void loop(){
  if(Serial.available() > 0){
   is_add = Serial.read();
   Serial.print("Received serial echo... f_rate::");
   Serial.println(f_rate);
  }
  

//SerialPort経由でASCII文字"a","b"がきたときにサーボを動かしっぱなしにする。
   if(is_add == 'a') {
         f_rate++;
   }else if(is_add == 'd'){
         f_rate--;
   }
   
   if (f_rate == 2400){
     f_rate = 2399;
   }else if (f_rate == 544){
     f_rate = 545;  
   }
 
//サーボに角度を設定   
   s1.writeMicroseconds(f_rate);
   delay(1);
}




"a","b"以外の値が送られてくるとf_ rateの変化がなくなる。

これによりシリアル経由でa,bを送信することでサーボを制御する。


Windows側のプログラム

AキーとDキーでFPSみたいに動かせるようにする。
適当にC#と.NETFrameworkで書く。
こんなかんじにコントロールを配置してする。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports; 

namespace webCamCtr1
{
    public partial class Form1 : Form
    {
        int x = 0;
        string is_opened = "";
        SerialPort myPort;
        int is_pressing = 0;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            
        }

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            //button1.Visible = true;
            //label1.Text = e.KeyValue.ToString();
            if (is_pressing != 1){
                if (e.KeyCode == Keys.A)
                {
                    myPort.Write("a");
                    label1.Text = "<-";
                    is_pressing = 1;
                }
                if (e.KeyCode == Keys.D)
                {
                    myPort.Write("d");
                    label1.Text = "->";
                    is_pressing = 1;
                }
            }
            x++;
            label2.Text = x.ToString();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //foreach (String p in SerialPort.GetPortNames()) {
            //    String p_name = p;
            //    com_lists.Items.Add(p_name);
            //}
            //com_lists.Items.Add("a");
            String[] comName = SerialPort.GetPortNames();
            com_lists.Items.AddRange(comName);
            this.KeyPreview = true;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            int i = com_lists.SelectedIndex;
            if (i != -1)
            {
                button1.Text = com_lists.Text;
                string sp_name = com_lists.Text;
                int BaudRate = 9600;
                Parity Parity = Parity.None;
                int DataBits = 8;
                StopBits StopBits = StopBits.One;

                if (!(is_opened.Equals(sp_name))){
                    myPort = new SerialPort(sp_name, BaudRate, Parity, DataBits, StopBits);
                    myPort.Open();
                    is_opened = sp_name;
                    button1.Visible = false;
                    this.Text = sp_name;
                }
            }
            else {
                button1.Text = "SelectCOM";
            }

        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {

        }

        private void Form1_KeyUp(object sender, KeyEventArgs e)
        {
                myPort.Write("s");
                label1.Text = "-||-";
                is_pressing = 0;
        }
    }
}


もうつかれた。また今度。~~~