サーボを制御するには、パルス幅変調信号をサーボに送信します。これは、周期的な、つまり繰り返される信号です。各周期、つまり信号のポイントとその繰り返しの間の時間は、オンとオフの 2 つの部分で構成されます。オンは高電圧 (たとえばバイアス電圧に等しい) で、オフは低電圧 (たとえば 0 ボルトに等しい) です。周期には周期時間という時間があり、その逆数は周波数です。オン時間とオフ時間の比率はデューティ サイクルと呼ばれ、デューティ サイクルの範囲は 0.0 ~ 1.0 です。サーボモーターは、デューティサイクルに対応する角度に達するまで回転して停止します。
ここに何かがある前に、mraa node.js ドキュメントへのリンクがあります:
https://iotdk.intel.com/docs/master/mraa/node/
また、メモ: mraa は低レベルのフレームワークであるため、初めてサーボを使用する場合は、mraa の使用を遅らせて、CylonJS を最初に使用することをお勧めします。これは、Intel Edison で CylonJS を使用してサーボを制御するためのチュートリアルです。これは Intel Galileo にかなり似ています:
http://slideplayer.com/slide/7959041/
これは、Intel 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);