码迷,mamicode.com
首页 > 其他好文 > 详细

可通过网络远程操控的电动BB木仓,类似CF

时间:2015-02-07 17:09:49      阅读:356      评论:0      收藏:0      [点我收藏+]

标签:

1、图片

1)俯视图

 技术分享

2)侧视图

 技术分享

 

3)正视图

技术分享

 

4)远程操控界面

 技术分享

 

2、视频

 

 

 

3、关键点

(1)控制系统采用的是arduino,用到了舵机模块,以太网模块。

(2)摄像头是基于海思芯片的,可直接通过以太网访问。

(3)B B木仓是电动的,去掉把手之后,将它装在舵机构成的云台上。另外,由于电动机的电流较大,故而将B B木仓独立供电。

 

4、关键代码

(1)arduino源码:

#include <Servo.h> 
 
Servo myservo1;  
Servo myservo2;  
String comdata = ""; 

String cmd = 0;
int i = 0;
 

void setup() 
{ 
    Serial.begin(9600); 
    
    myservo1.attach(10);  // arm, Vertical
    myservo1.write(70);
    myservo2.attach(9);  // base, Horizontal
    myservo2.write(90);
    pinMode(8, OUTPUT);  // shoot
    digitalWrite(8, HIGH);
} 
 
 
void loop() 
{ 
   while (Serial.available() > 0)
   {
      comdata += char(Serial.read());
      delay(2);
   }
 
  if (comdata.length() > 0)
  {
      cmd = comdata.substring(0,1);
      i = comdata.substring(1,4).toInt();
     if(cmd == "V")
           myservo1.write(i);
      else if(cmd == "H")
          myservo2.write(i);
      else if(cmd == "S")
      {
          if(i == 1)
              digitalWrite(8, LOW); //on
          else
              digitalWrite(8, HIGH); //off
      }
      comdata = "";
   }
    delay(100);
} 


PC端源码

 public class GunController
    {

        // ***********************************************  全局字段 ******************************************************

        TcpClient tcp = new TcpClient();
        NetworkStream stream;


        System.Timers.Timer tmrConnecting = new System.Timers.Timer();    // 连线的周期。 若断线,在10秒后尝试建立连接 


        //****************************************************** 属 性 *************************************************************************** 
        /// <summary>
        /// 垂直值。对应上臂。
        /// 增加,则往上移
        /// </summary>
        public int VerticalValue
        {
            set;
            get;
        }



        /// <summary>
        /// 水平值。对应底盘。
        /// 增加,则往左移
        /// </summary>
        public int HorizontalValue
        {
            set;
            get;
        }



        /// <summary>
        ///  IP地址
        /// </summary>
        public string IP
        {
            get
            {
                return _IP;
            }
            set
            {
            }

        }
        string _IP;



        /// <summary>
        /// 是否在线
        /// </summary>
        public bool IsOnline
        {
            get
            {
                return _IsOnline;
            }
            set
            {
            }
        }
        bool _IsOnline = false;




        // ***********************************************  构造函数 ******************************************************
        /// <summary>
        /// 以IP地址为参数实例化一个对象
        /// </summary>
        /// <param name="ip"></param>
        public GunController( string ip )
        {
            _IP = ip;

            this.VerticalValue = 70;
            this.HorizontalValue = 90;

            // 计时器1
            tmrConnecting.Elapsed += new ElapsedEventHandler( tmrConnecting_Elapsed );
            tmrConnecting.Interval = 10000; // 每10秒种尝试连接一次 
            tmrConnecting.Enabled = true;

            // 首次连接
            Open();
        }



        // ***********************************************  公共方法 ******************************************************



 
 



        /// <summary>
        /// 向上移
        /// </summary>
        public void MoveUp()
        {
            VerticalValue++;
            Send( "V" + VerticalValue );
        }


        /// <summary>
        /// 向下移
        /// </summary>
        public void MoveDown()
        {
            VerticalValue--;
            Send( "V" + VerticalValue );
        }


        /// <summary>
        /// 向左移
        /// </summary>
        public void MoveLeft()
        {
            HorizontalValue++;
            Send( "H" + HorizontalValue );
        }


        /// <summary>
        /// 向右移
        /// </summary>
        public void MoveRight()
        {
            HorizontalValue--;
            Send( "H" + HorizontalValue );
        }


        /// <summary>
        /// 射击
        /// </summary>
        public void Shoot()
        {
            Send( "S001" );
            System.Threading.Thread.Sleep( 120 );
            Send( "S000" );
        }




        // ***********************************************  私有方法 ******************************************************
        /// <summary>
        /// 定时进行连接。
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void tmrConnecting_Elapsed( object sender, ElapsedEventArgs e )
        {
            Open();
        }


        /// <summary>
        /// 打开连接。
        /// </summary>
        /// <param name="ip"></param>
        /// <param name="port"></param>
        void Open()
        {
            try
            {
                if( tcp.Connected == false )  //若连线失败,则尝试进行连接
                {
                    // 若是连接断了,则先关闭当前的TCP client实例。然后再开启另一个TCP client实例
                    tcp.Close();
                    tcp = new TcpClientWithTimeout( _IP, 8000, 2000 ).Connect();
                    tcp.ReceiveTimeout = 1000;
                    tcp.SendTimeout = 1000; // timeout
                    stream = tcp.GetStream();

                    _IsOnline = true;

                    Console.WriteLine( _IP.PadRight( 20 ) + "连接成功!" + DateTime.Now.ToString( "yyyy-MM-dd hh:mm:ss" ) );
                }
            }
            catch
            {
                _IsOnline = false;
                Trace.WriteLine( _IP.PadRight( 20 ) + "连接失败!" + DateTime.Now.ToString( "yyyy-MM-dd hh:mm:ss" ) );
            }

        }




        /// <summary>
        /// 发送命令
        /// </summary>
        public void Send( string command )
        {
            try
            {
                if( tcp.Connected == true )
                {
                    // 发送
                    byte[] commandBytes = Encoding.ASCII.GetBytes( command );
                    stream.Write( commandBytes, 0, command.Length );      // 写入
                }
                else
                {
                }
            }
            catch
            {
                Trace.WriteLine( _IP.PadRight( 20 ) + "发送指令失败" + DateTime.Now.ToString( "yyyy-MM-dd hh:mm:ss" ) );
            }
        }


}

 

 

5、下载

下位机(arduino)源码

上位机(PC端)源码

 

 

可通过网络远程操控的电动BB木仓,类似CF

标签:

原文地址:http://www.cnblogs.com/dehai/p/4278950.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!