使用Android Things控制步进电机

时间:2018-03-19 14:03:59

标签: android android-things

我对步进电机全新,我正在努力用Android Things控制步进电机。我有一个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 Things,我在这里苦苦挣扎。我尝试了两种不同的方式 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();

我真的无法弄清楚如何控制可快速移动的步进电机?这只是一个延迟问题吗?我怎么能给出一微秒的延迟?

我提前感谢你们在这里帮助我。

3 个答案:

答案 0 :(得分:0)

步进电机通常需要高频信号。我没有检查过,但我真的怀疑AndroidOS能够生成10kHz甚至周期之一(也许你会使用Android NDK ......但仍然怀疑它)。

我想说的是Android设备并不是步进电机的驱动器。它旨在为实际的步进电机驱动器提供参数。为什么不使用Arduino构建propper驱动程序并将其与Android应用程序进行通信?

这就是专业生产解决方案的工作方式。有某种用户界面设备(HMI面板或PC)将用户请求发送到驱动程序层。

答案 1 :(得分:0)

正如muminers所提到的,高频率切换不是通常直接使用Linux类设备(如Android Things或Raspberry Pi)完成的。更高级别的抽象可能导致微控制器上的时序不准确。

但是,在您的情况下,您可以利用PWM发送更高频率的脉冲,而无需手动切换GPIO。

查看I/O for a Raspberry Pi,您需要连接到BCM18BCM13才能使用PWM。

之后,您可以设置频率和占空比。通过调整占空比,您可以获得或多或少的电机信号。这是一段代码:

pwm.setPwmFrequencyHz(120);
pwm.setPwmDutyCycle(25);

// Enable the PWM signal
pwm.setEnabled(true);

您可以将频率调整为更接近10KHz的频率,看看它是否适合您。

答案 2 :(得分:0)

首先制作一个简单的python脚本来处理stepper moter。 https://circuitdigest.com/microcontroller-projects/controlling-stepper-motor-with-raspberry-pi 然后安装blueterm mobile app并传递命令。 也改变了一些python脚本。