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

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端)源码

时间: 2024-10-29 04:35:04

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

通常所说的网络远程监控系统是什么?

通常所说的远程监控系统是一款远程监控软件,是由一台主电脑控制端远程监控另一台被控电脑端,而所谓的远程一般是指通过局域网远程监控. 当操作者使用主控制端电脑监控被控端电脑时,就如同自己在使用被控端电脑一样,清晰看到被控端电脑当前屏幕操作,可以启动被控端电脑的程序.限制访问网址.限制聊天.上网.玩游戏.禁止U盘读取以及文件传输等操作,利用网络远程监控系统,被控端电脑操作行为皆掌握在自己手中.  有什么用途? 网络远程监控系统一般是用于正当用途,比如用于企业单位对上班员工电脑的管理.规范员工上班的不良

LWIP实现网络远程IAP下载更新

最近需要实现通过TCP/IP远程IAP在线更新功能,忙了2周终于在原有嵌入式服务器的基础上实现了该功能,这里就记录下实现的过程. IAP又称在应用编程,其实说简单点就是实现不需要jlink,仅通过芯片自带接口如CAN,USB,Ethernet即可实现下载功能.以我用过的stm32f207芯片为例,就有三种启动方式,SRAM启动,User boot(即flash地址启动,用户应用执行),System boot(即系统地址启动,用于串口下载),看到这是否明白点什么,System boot模式下载实现

java代码实现网络远程开机

http://my.oschina.net/kingfire/blog/156764 概述 远程开机(Wake onLAN)是指通过网络实现对服务器或者pc启动运行,现在很多网卡都支持的这个功能. 其原理简单来说是向目标主机发送特殊格式的数据包, 目标主机收到后,对系统进行启动. 具体方法. 设置bios开启Wake onLAN(WOL)功能 查看主机网卡的mac地址 将主机通过网卡连接到以太网上 发送开机编码,启动系统 其实就是通过socket向目标的机器发送MagicPacket(魔术包),

网络设备配置与管理---使用DDN专线实现两个企业网络远程网络互联

理论学习 问题1:使用DCE和DTE的广域网络物理构成是什么样的? 广域网连接中,像路由器.计算机都属于DTE端设备,而CSU/DSU.Modem等属于DCE端设备.通常由DCE端提供时钟频率,信号同步,信号控制.DCE设备和DTE设备通常采用串行线路连接. 题2:简述广域网的通信方式有哪些?分别有什么特点? (1)专线:代表是DDN专线,DDN专线使用同步串口进行连接,可以封装HDLC.PPP.Frame-Relay.SLIP 等二层协议. (2)分组交换网:不论X.25还是帧中继分组交换网都

网络设备配置与管理---使用帧中继实现总分公司网络远程网络互联

理论学习 问题1:简述虚电路交换的实现流程? 在源和目的主机之间的每个交换机上建立"连接通道",分组只需携带链路范围内有效的VCI决定途径路径可到达目的地网络. 问题2:描述FR(帧中继)网络的基本构成及通信机制? 帧中继是在数据链路层用简化的方法传送和交换数据单元的快速分组交换技术,是在简化X.25分组交换技术的基础上发展起来的.帧中继是一种统计复用协议,它在一条单一物理链路上能够提供多条虚电路,有效利用了骨干网的带宽,降低了网络成本. 问题3:介绍在FR网络中DCE.DTE.PVC

Linux下的网络远程安装

1.用RHEL6.5光盘安装第一台服务器 2.在第一台服务器上配置YUM服务器 先创建一个挂载 1 #mount 2 #umount /dev/cdrom 3 #mkdir /mnt/rhel-dvd 4 5 #vim /etc/fstab 6 /dev/sr0 /mnt/rhel-dvd iso9660 defaults,ro 0 0 7 8 #mount -a //挂载所有列出在/etc/fstab里面但当前还未挂载的文件系统 rpm需要手动处理包依赖关系 YUM能够自动处理包依赖关系,为此

关于app生成商品图片,取代网络远程获取商品图片的设想

当我在使用各种电子商务或者O2O等app时,app在不断的从远程服务器处获取各种商品图片.是否可以取消这种方式?仅仅通过app生成. app生成图片,服务器提供商品描述指令.比如,app需要显示一个苹果图片时,服务器提供一个简单的商品描述指令:apple.当app获取到apple这个指令时,就自动绘制出苹果图片.这样,在app与服务器之间的数据传输将只有简单的描述指令等一些简单的信息. 那么关键问题转移到了图片生成上.

4路开关量信号点对点网络远程传输报警联动模块

C2000-A2-SDD4040-BB9 是数字量网络输入输出模块,其具备良好的扩展性,可灵 活地通过自带的 RS485 总线级联康耐德同系列串口 I/O 联网设备,以实现各种数字量. 模拟量的组合.扩展采集的功能. 成对使用C2000-A2-SDD4040-BB9可以将4组输入输出信号轻松通过网络传输至网 络另一端的 PLC 或 DCS 控制系统.本产品采用标准 Modbus TCP 通讯协议,适合各类工业监控的现场应用.本产品支 持 C2000 设备管理监控软件,同时也可轻松地实现与第三方

Python3.4 远程操控电脑(开关机)

import poplib import sys import smtplib from email.mime.text import MIMEText import os from email.header import decode_header import email import time def check_email(): try: p = poplib.POP3('pop.163.com') p.user('*****@163.com') p.pass_('*******') r