用 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,您需要连接到 BCM18BCM13 才能使用 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 脚本。