C#根据Picturebox上的Mouseclicks控制两个电机

时间:2017-03-27 07:55:50

标签: c#

我正在开发一个用于控制双电机XY平台的C#win形式GUI。我在一个图片框上绘制了一个100 x 100的正方形网格图案,其中每个正方形在单击时表示两个电机必须移动到的坐标。我研究了这个链接 PictureBox Grid and selecting individual cells when clicked on和此PictureBox- Grids and Filling in squares (Game of Life)用于绘制网格并标记点击的位置。

现在我必须将一系列随机点击的点转换为两个电机的实际运动。

如何以编程方式转换点击坐标以提供控制电机的命令?

我知道如何在不参考屏幕坐标的情况下移动和控制电机,即使用眼睛。

非常感谢您的帮助。

UPDATE1: 你好......我想尽管塞巴斯蒂安提供了很大的帮助,我仍然想以一种令人困惑的方式将电机从一个点移动到另一个点。我想尝试下面的一些逻辑,但我很感激,如果有人能告诉我如何最好地实现这一点。

    private void pictureBoxGrid_MouseClick(object sender, MouseEventArgs e)
    {
        //int x = e.X;
        int x = cellSize * (e.X / cellSize);
        int y = cellSize * (e.Y / cellSize);
        int i = x / 8; // To limit the value to below 100
        int j = y / 8;

        // Reverse the value of fill_in[i, j] - if it was false, change to true,
        // and if true change to false
        fill_in[i, j] = !fill_in[i, j];

        if (fill_in[i, j])
        {
            //Save the coordinate in a list
            filledSq.Add(new Point(i, j));

            using (Graphics g = Graphics.FromImage(buffer))
            {
                g.FillRectangle(Brushes.Black, x + 1, y + 1, 7, 7);
            }

        }
        else
        {
            //Delete the coordinate in a list
            filledSq.Remove(new Point(i, j));
            Color customColor = SystemColors.ControlLightLight;

            using (Graphics g = Graphics.FromImage(buffer))
            using (SolidBrush shadowBrush = new SolidBrush(customColor))
            {
                g.FillRectangle(shadowBrush, x + 1, y + 1, 7, 7);
            }

        }
        //pictureBoxGrid.BackgroundImage = buffer;
        pictureBoxGrid.Invalidate();
    }

    private void buttonSavePoints_Click(object sender, EventArgs e)
    {
        // to be implemented...
    }

    private void buttonRun_Click(object sender, EventArgs e)
    {

        var noOfDots = filledSq.Count;
        filledSq = filledSq.OrderBy(p => p.X).ThenBy(p => p.Y).ToList();
        var motor = new Motor();
        for (var i = 0; i < noOfDots; i++)
        {
          motor.Move(filledSq[i].X, filledSq[i].Y); //call the motor to move to X,Y here?
         //do sth at each position
        }
    }

1 个答案:

答案 0 :(得分:0)

既然你写了,你知道如何以编程方式移动电机,这个答案将更具理论性:

每个步进电动机每步具有预定的角度宽度(例如1.8°)。 如果你知道你的马达在哪里(例如在限制开关(0 | 0)的预定义起点),你可以计算它们需要的位置。

对于精度,有多种因素,如使用腰带或螺纹杆。

示例方法可能如下所示:

private static float stepwidth = 1.8;
private static beltConverionPerDegree = 0.2; // Or rod
private float currentPositionX = 0;
private float currentPositionY = 0;

public Tuple<int, int> GetSteps(float x, float y) {
    // calculate the position relative to the actual position (Vector between two points)
    float relativeX = x - currentPositionX;
    float relativeY = y - currentPositionY;

    return new Tuple<int, int> (relativeX / (stepwidth * beltConverionPerDegree), relativeY / (stepwidth * beltConverionPerDegree));
}

beltConverionPerDegree表示电机在每个度数上移动皮带的距离。