2

我有一个我试图用 Node.js 控制的英特尔伽利略,但我遇到了一些问题。我使用的库有用于更改引脚的二进制和/或模拟值的示例,但没有关于控制伺服电机的具体内容。我目前拥有的代码如下。

var B = 3975;
var mraa = require("mraa");
var servo = new mraa.Aio(1);//connects to the servo

问题是,我不知道如何控制伺服,而且 MRAA 的文档几乎不存在。这里有没有人做过类似的事情并且能够提供帮助?

谢谢。

4

3 回答 3

0

伺服系统通常使用 PWM(脉冲宽度调制)控制。您应该将伺服控制线连接到标有“〜”符号的数字引脚之一。该标志表明该引脚将生成 PWM 数据。然后谷歌你的伺服类型以了解它接受的 PWM 参数。然后,您可以按照 mraa PWM 示例为 PWM 引脚设置合适的值。

于 2014-11-05T20:49:02.097 回答
0

要控制伺服,您向它发送一个脉冲宽度调制信号,这是一个周期性的信号,即重复自身。每个周期,即信号点与其重复之间的时间,由两部分组成:开和关。on 是高电压(例如等于偏置电压),off 是低电压(例如等于 0 伏)。周期有一个时间,即周期时间,它的倒数就是频率。开启时间与关闭时间的比值称为占空比,占空比的范围为 0.0 到 1.0。伺服电机仅旋转到与占空比对应的角度并停止。

在此之前是 mraa node.js 文档的链接: https ://iotdk.intel.com/docs/master/mraa/node/

并且要注意:mraa 是一个低级框架,所以如果这是您第一次使用伺服,我建议您推迟使用 mraa 并先使用 CylonJS,这是英特尔 Edison 上使用 CylonJS 控制伺服的教程与英特尔 Galileo 非常相似,位于: http ://slideplayer.com/slide/7959041/ 这是我之前在英特尔 Edison 套件上运行的一个非常好的示例。

也就是说,一旦你完成了本教程并想在 mraa node.js 中尝试伺服,这里有一个旋转伺服的教程,直到你按下 Ctrl-C 来结束程序。它从 0 开始占空比,将其递增到 1,然后递减到 0,然后再次循环。此代码是 https://navinbhaskar.wordpress.com/2016/02/21/cc-on-intel-edisongalileo-part3-pwm/上的 C 代码的翻译,我没有测试翻译。

/*translation of C++ code at
 https://navinbhaskar.wordpress.com/2016/02/21/cc-on-intel-edisongalileo-part3-pwm/
mraa node.js documentation at:
https://iotdk.intel.com/docs/master/mraa/node/
*/
"use strict";


const mraa = require("mraa");
const spawnSync = require('child_process').spawnSync;

const  PWM_PIN  =   5 ;       /**< The pin where the LED is connected */

var keepRunning= false;

///** Signal handler used to stop this application cleanly */
/* 
     * Associate ctrl+c with our handler that clears the 'keepRunning'
     * flag that allows us to stop the PWM when exiting 
     */
process.on('SIGINT', () => {
    keepRunning = false;
});

//Step 1: Initialize the mraa system

var result =mraa.init();
if(result == mraa.Result.SUCCESS)
    console.log("mraa initialization succeded.");
else
    console.log("mraa initializtion failed.")

/* Step2: Initialize D5 for PWM operation */
var pwm_interface = mraa.PWM;

var owner =true;
var chipid= 1;
pwm_interface.Pwm(PWM_PIN,owner,chipid);
 /*
     * Control the period with "mraa_pwm_period_us"
     *
     *       +----------------+                +----------------+                |
     *       |                |                |                |                |
     *       |                |                |                |                |
     *       |                |                |                |                |
     *       |                |                |                |                |
     *       |                |                |                |                |
     *       |                |                |                |                |
     *       |                |                |                |                |
     *       |                |                |                |                |
     *       +                +----------------+                +----------------+
     *       ^                                 ^
     *       |                                 |
     *       |<---------- Period ------------->|
     *       |               ^                 |
     *       |               |                 |
     *                       | 
     *      pwm_interface.period_us( 5000);
     */

   /* Step3: Set the period on the PWM pin */
   const PWM_Period_in_microseconds=5000;
    pwm_interface.period_us( PWM_Period_in_microseconds);      // Set the period as 5000 us or 5ms

    /* Step4: Enable the PWM pulse on the pin */
    var pwm_enabling_result= pwm_interface.enable(true);

    var delta = 0.05;   /* Variation on the duty cycle */
    var duty = 0.0;       /* 0% duty cycle */
    keepRunning = true;
    const sleep_duration_in_Microsecond=50000;

 while (keepRunning){
        if (duty >= 1)
        {
            duty = 1;          // Intensity of LED at highest 
            delta = -0.05;     // Need to decrease the duty cycle
        }
        else if (duty <= 0)
        {
            duty = 0;          // Intensity of LED at the lowest
            delta = +0.05;     // Need to increase the duty cycle 
        }
       /*
        *  Control the duty cycle with "write"
        *    +------+                            +------+                            
        *    |      |                            |      |                           
        *    |      |                            |      |                           
        *    |      |                            |      |                           
        *    |      |                            |      |                           
        *    |      |                            |      |                           
        *    |      |                            |      |                           
        *    |      |                            |      |                           
        *    |      |                            |      |                           
        *    +      +----------------------------+      +---------------------------+
        *    ^      ^
        *    |      |
        *    |<---->|
        *        ^
        *        |-----------------
        *                          |
        *  pwm_interface.write( 0.2);
        * 
        */

     /* Step5: Use the function 'mraa_pwm_write' to set the duty cycle */
    pwm_interface.write( duty);
    /* Wait for some time */
    var sleep = spawnSync('usleep', [sleep_duration_in_Microsecond]);

    duty = duty + delta;
}

    /* Step6: Stop the PWM when not required */
    pwm_interface.enable(false);
于 2017-06-12T06:55:51.613 回答
0

mraa on 的 PWM 示例(爱迪生,但将在伽利略上工作,但周期应为 62500)

mraa = require('mraa');
servo = new m.Pwm(3);//Pin 3
servo.enable(true);
servo.period_us(19000000) //PWM Period https://www.arduino.cc/en/Tutorial/SecretsOfArduinoPWM
servo.write(1);
sleep(1000);
servo.write(0);
sleep(1000);
servo.write(0.5);
于 2015-10-25T02:24:23.783 回答