まずは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;
        }
    }
}
もうつかれた。また今度。~~~

0 件のコメント:
コメントを投稿