我正在开发一个用于控制双电机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
}
}
答案 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表示电机在每个度数上移动皮带的距离。