极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 23407|回复: 9

C#控制Arduino操作舵机

[复制链接]
发表于 2013-8-8 14:06:41 | 显示全部楼层 |阅读模式
本文通过 USB控制Anduino


C#代码
[pre lang="C" line="1"]
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;
using System.Threading;

namespace ArduinoApp
{
    public partial class MainForm : Form
    {
        byte[] buffer = new byte[8];
        SerialPort serialPort;
        public MainForm()
        {
            InitializeComponent();
        }

        private void Send(byte[] buffer, int count)
        {
            if (serialPort.IsOpen)
            {
                serialPort.Write(buffer, 0, count);
            }
        }
        
        private void btnSend_Click(object sender, EventArgs e)
        {
            int i=int.Parse(txtSend.Text);
           
            if (serialPort.IsOpen)
            {
                serialPort.Write(buffer, 0, 1);
            }
        }

        private void CallThread()
        {
            Thread thread = new Thread(new ThreadStart(ReadFun));
            thread.IsBackground = true;
            thread.Start();
        }

        private void ReadFun()
        {
            while (serialPort.IsOpen)
            {
                string result = serialPort.ReadLine();
                this.Invoke(new MethodInvoker(() => {
                    txtRecive.Text += result + "\r\n";
                }));
            }
        }

        private void MainForm_Load(object sender, EventArgs e)
        {
            serialPort = new SerialPort("COM5", 9600);
            serialPort.Open();
            if (!serialPort.IsOpen)
            {
                txtRecive.Text = "无法连接";
                return;
            }
            CallThread();

        }

        private void btn1_Click(object sender, EventArgs e)
        {
            buffer[0] = 0x01; //2度
            Send(buffer, 1);
        }

        private void btn2_Click(object sender, EventArgs e)
        {
            buffer[0] = 0x02; //90度
            Send(buffer, 1);
        }

        private void btn3_Click(object sender, EventArgs e)
        {
            buffer[0] = 0x03; //179度
            Send(buffer, 1);
        }
    }
}
[/code]

C# DEMO



Anduino代码

  1. #include <Servo.h>
  2. Servo myservox;  //创建一个水平舵机控制对象
  3. int posx=0;
  4. byte b;
  5. void setup()
  6. {
  7.    Serial.begin(9600);
  8.    myservox.attach(9); //   shuiping 9jiao 0-179
  9. }
  10. void loop()
  11. {
  12.   if(Serial.available()>0)
  13.   {
  14.     b=Serial.read();
  15.     Serial.println(b);
  16.     int r=myservox.read();
  17.    
  18.     if(b==0x01 && r!=2)  //判断发送指令0x01 最小2度防止打齿
  19.     {
  20.       myservox.write(2);
  21.       Serial.println("0 Du");
  22.     }
  23.     else if(b==0x02 && r!=90)
  24.     {
  25.        myservox.write(90);
  26.        Serial.println("90 Du");
  27.     }else if(b==0x03 && r!=179)  //判断发送指令0x03 最大179度防止打齿
  28.     {
  29.        myservox.write(179);
  30.        Serial.println("179 DU");
  31.     }
  32.   }
  33. }
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2013-8-8 15:34:51 | 显示全部楼层
喜闻乐见 普大喜奔
回复 支持 反对

使用道具 举报

发表于 2013-8-8 15:36:45 | 显示全部楼层
大神 这个语句是干嘛的  什么用处?
private void CallThread()
        {
            Thread thread = new Thread(new ThreadStart(ReadFun));
            thread.IsBackground = true;
            thread.Start();
        }
回复 支持 反对

使用道具 举报

发表于 2013-8-8 16:39:45 | 显示全部楼层
我发现你的ARDUINO程序的setup只是拿来设置波特率。是因为上位机的串口程序没办法实现arduino ide中的setup 吧。有什么办法可以改进呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-8 16:44:48 | 显示全部楼层
罹凝寒冰 发表于 2013-8-8 15:36
大神 这个语句是干嘛的  什么用处?
private void CallThread()
        {

这个用C#的线程去接收Arduino发达来的信息,为了防止介面被卡死。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-8 16:48:41 | 显示全部楼层
Mr.Dante 发表于 2013-8-8 16:39
我发现你的ARDUINO程序的setup只是拿来设置波特率。是因为上位机的串口程序没办法实现arduino ide中的setup ...

上位机为什么要实现arduino ide中的setup 要通信Arduino必需要事先在第一次启动后设置波持率。
你的意思是要改进啥。。我只是个单片机初学者。。。
回复 支持 反对

使用道具 举报

发表于 2013-8-8 17:56:21 | 显示全部楼层
wyd1520 发表于 2013-8-8 16:44
这个用C#的线程去接收Arduino发达来的信息,为了防止介面被卡死。

哦哦 我的这个是arduino只接收不发送。可以不用考虑界面卡死的
回复 支持 反对

使用道具 举报

发表于 2013-8-9 08:33:04 | 显示全部楼层
wyd1520 发表于 2013-8-8 16:48
上位机为什么要实现arduino ide中的setup 要通信Arduino必需要事先在第一次启动后设置波持率。
你的意思 ...

内容转自http://tieba.baidu.com/p/2470799464
看文件 \Arduino-1.0.5\hardware\arduino\cores\arduino\main.cpp

这才是真正的主程序起始点。

#include <Arduino.h>
int main(void)
{
init();
#if defined(USBCON)
USBDevice.attach();
#endif
setup();
for (;;)

loop();
if (serialEventRun)
serialEventRun();
}
return 0;
}
楼主你做舵机控制所以没留意到。而我的颜色检测项目是在setup中是加了白平衡函数的,因为只需要做一次白平衡定标即可。但到了上位机通信时,setup里面的函数不执行,正在想办法解决。
回复 支持 反对

使用道具 举报

发表于 2015-8-19 15:05:23 | 显示全部楼层
好东西啊,找了好久了!
回复 支持 反对

使用道具 举报

发表于 2016-5-30 21:54:57 | 显示全部楼层
这个程序可不可以用来控制电调啊
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-8 23:31 , Processed in 0.045852 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表