用 Android 东西控制步进电机
Controlling a Stepper Motor with Android Things
我对步进电机完全陌生,我正在努力用 Android 东西来控制步进电机。我有一个 Arduino 程序来控制连接到 M542 驱动器的 Nema 23 步进电机。下面的 Arduino 程序工作得很好。
void loop() {
digitalWrite(dirPin,LOW); // Enables the motor to move in a particular direction
for(int x = 0; x < 1800; x++) {
digitalWrite(stepPin,HIGH);
delayMicroseconds(delayMS);
digitalWrite(stepPin,LOW);
delayMicroseconds(delayMS);
}
digitalWrite(dirPin,HIGH); //Changes the rotations direction
for(int x = 0; x < 1800; x++) {
digitalWrite(stepPin,HIGH);
delayMicroseconds(delayMS);
digitalWrite(stepPin,LOW);
delayMicroseconds(delayMS);
}
//delay(1000);
}
现在我正在尝试将这个程序转换为 Android 东西,我在这里很挣扎。我尝试了两种不同的方法。
1) 只需将代码替换为 Android
private Runnable moveRailRunnable = new Runnable() {
@Override
public void run() {
// Exit if the GPIO is already closed
if (dirPin == null || pulPin == null) {
mHandler.removeCallbacks(moveRailRunnable);
return;
}
try {
int i = 0;
while(i++<10000) {
pulPin.setValue(!pulPin.getValue());
mHandler.postDelayed(moveRailRunnable, 100);
}
} catch (IOException e) {
Log.e(TAG, "Error on PeripheralIO API", e);
}
}
};
当运行上述代码时,电机运行非常慢,因为有毫秒级的延迟。但是arduino代码有微秒。
2) 使用来自 https://github.com/Polidea/Polithings 的 A4988 模块
我也有同样的问题。如果我一步一步地执行,我最终会遇到同样的问题,它移动得非常慢。
// Motor moves very slow with this code.
A4988 sm = new A4988("BCM2","BCM3");
sm.open();
sm.setDirection(Direction.CLOCKWISE);
sm.setResolution(A4988Resolution.FULL);
sm.performStep(new StepDuration(50,0));
当我使用旋转方法时,我根本无法让电机移动。
// Motor doesnt move at all.
A4988StepperMotor asm = new A4988StepperMotor(800,"BCM2", "BCM3");
asm.rotate(360.0, Direction.COUNTERCLOCKWISE, A4988Resolution.FULL.getId(), 360);
asm.close();
我真的想不通如何控制可以快速移动的步进电机?这只是延迟的问题吗?那我怎么能延迟几微秒呢?
在此先感谢大家对我的帮助。
步进电机通常需要高频信号。我没有检查,但我真的怀疑 AndroidOS 是否能够生成 10kHz 甚至周期之一(也许如果你将使用 Android NDK...但仍然怀疑它)。
我想说的是 android 设备并不是用来驱动步进电机的。它旨在为实际步进电机驱动器提供参数。你为什么不使用 Arduino 构建 propper 驱动程序并将其与你的 Android 应用程序通信?
这就是专业制作解决方案的工作原理。有某种用户界面设备(HMI 面板或 PC)将用户请求发送到驱动层。
正如 muminers 提到的,高频切换通常不是直接使用 Linux class 设备(例如 Android Things 或 Raspberry Pi 来完成的事情。 higher-level 抽象可能导致微控制器上可能出现的不准确时序。
但是,在您的情况下,您可以利用 PWM 发送更高频率的脉冲,而无需连续手动切换 GPIO。
查看 I/O for a Raspberry Pi,您需要连接到 BCM18
或 BCM13
才能使用 PWM。
之后,您可以设置频率和占空比。通过调整占空比,您可以获得更多或更少的电机信号。这是一个代码片段:
pwm.setPwmFrequencyHz(120);
pwm.setPwmDutyCycle(25);
// Enable the PWM signal
pwm.setEnabled(true);
您可以将频率调整到 10KHz 左右,看看是否更适合您。
首先为手柄步进电机制作一个简单的python脚本。
https://circuitdigest.com/microcontroller-projects/controlling-stepper-motor-with-raspberry-pi
然后安装 blueterm 移动应用程序并传递命令。
还要更改一些 python 脚本。
我对步进电机完全陌生,我正在努力用 Android 东西来控制步进电机。我有一个 Arduino 程序来控制连接到 M542 驱动器的 Nema 23 步进电机。下面的 Arduino 程序工作得很好。
void loop() {
digitalWrite(dirPin,LOW); // Enables the motor to move in a particular direction
for(int x = 0; x < 1800; x++) {
digitalWrite(stepPin,HIGH);
delayMicroseconds(delayMS);
digitalWrite(stepPin,LOW);
delayMicroseconds(delayMS);
}
digitalWrite(dirPin,HIGH); //Changes the rotations direction
for(int x = 0; x < 1800; x++) {
digitalWrite(stepPin,HIGH);
delayMicroseconds(delayMS);
digitalWrite(stepPin,LOW);
delayMicroseconds(delayMS);
}
//delay(1000);
}
现在我正在尝试将这个程序转换为 Android 东西,我在这里很挣扎。我尝试了两种不同的方法。
1) 只需将代码替换为 Android
private Runnable moveRailRunnable = new Runnable() {
@Override
public void run() {
// Exit if the GPIO is already closed
if (dirPin == null || pulPin == null) {
mHandler.removeCallbacks(moveRailRunnable);
return;
}
try {
int i = 0;
while(i++<10000) {
pulPin.setValue(!pulPin.getValue());
mHandler.postDelayed(moveRailRunnable, 100);
}
} catch (IOException e) {
Log.e(TAG, "Error on PeripheralIO API", e);
}
}
};
当运行上述代码时,电机运行非常慢,因为有毫秒级的延迟。但是arduino代码有微秒。
2) 使用来自 https://github.com/Polidea/Polithings 的 A4988 模块 我也有同样的问题。如果我一步一步地执行,我最终会遇到同样的问题,它移动得非常慢。
// Motor moves very slow with this code.
A4988 sm = new A4988("BCM2","BCM3");
sm.open();
sm.setDirection(Direction.CLOCKWISE);
sm.setResolution(A4988Resolution.FULL);
sm.performStep(new StepDuration(50,0));
当我使用旋转方法时,我根本无法让电机移动。
// Motor doesnt move at all.
A4988StepperMotor asm = new A4988StepperMotor(800,"BCM2", "BCM3");
asm.rotate(360.0, Direction.COUNTERCLOCKWISE, A4988Resolution.FULL.getId(), 360);
asm.close();
我真的想不通如何控制可以快速移动的步进电机?这只是延迟的问题吗?那我怎么能延迟几微秒呢?
在此先感谢大家对我的帮助。
步进电机通常需要高频信号。我没有检查,但我真的怀疑 AndroidOS 是否能够生成 10kHz 甚至周期之一(也许如果你将使用 Android NDK...但仍然怀疑它)。
我想说的是 android 设备并不是用来驱动步进电机的。它旨在为实际步进电机驱动器提供参数。你为什么不使用 Arduino 构建 propper 驱动程序并将其与你的 Android 应用程序通信?
这就是专业制作解决方案的工作原理。有某种用户界面设备(HMI 面板或 PC)将用户请求发送到驱动层。
正如 muminers 提到的,高频切换通常不是直接使用 Linux class 设备(例如 Android Things 或 Raspberry Pi 来完成的事情。 higher-level 抽象可能导致微控制器上可能出现的不准确时序。
但是,在您的情况下,您可以利用 PWM 发送更高频率的脉冲,而无需连续手动切换 GPIO。
查看 I/O for a Raspberry Pi,您需要连接到 BCM18
或 BCM13
才能使用 PWM。
之后,您可以设置频率和占空比。通过调整占空比,您可以获得更多或更少的电机信号。这是一个代码片段:
pwm.setPwmFrequencyHz(120);
pwm.setPwmDutyCycle(25);
// Enable the PWM signal
pwm.setEnabled(true);
您可以将频率调整到 10KHz 左右,看看是否更适合您。
首先为手柄步进电机制作一个简单的python脚本。 https://circuitdigest.com/microcontroller-projects/controlling-stepper-motor-with-raspberry-pi 然后安装 blueterm 移动应用程序并传递命令。 还要更改一些 python 脚本。