Using the Beaglebone Black's PWM
Bonescript also includes an analogWrite function which utilizes the 8 PWM pins of the Beaglebone Black. As you might already know, PWM allows us to control a servo motor. The analogWrite function accepts the pin name, duty cycle, frequency and callback function as parameters. The duty cycle value can be between 0 and 1 while the frequency is in Hertz. Here’s an example:
1 2 3 4 5 6 | var b = require('bonescript'); b.pinMode('P9_14', b.OUTPUT); b.analogWrite('P9_14', 0.7, 2000.0, printStatus); function printStatus(x) { console.log('value = ' + x.value); } |
Here, the PWM pin used is P9_14, the duty cycle is 0.7 or 70% and the frequency is 2 kHz. The analogWrite function returns true if successful and false on failure. In the example above, x.value would have a value of “1” if the call to analogWrite is successful.
A servomotor needs a 1.5 millisecond pulsewidth for its arm to be on the center position. A 1.5 ms pulse width on a 500 Hz frequency is around 75% of duty cycle. Thus, this script will position the arm in the center position:
1 2 3 4 5 6 | var b = require('bonescript'); b.pinMode('P9_14', b.OUTPUT); b.analogWrite('P9_14', 0.75, 500.0, printStatus); function printStatus(x) { console.log('x.value = ' + x.value) } |

Here's a script that "sweeps" the servomotor arm to and from its two extreme positions:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | var b = require('bonescript'); var increment = 0.1; b.pinMode("P9_14", b.OUTPUT); updatePos(); function loop() { b.analogWrite("P9_14", duty_cycle, 500, updatePos); } function updatePos() { duty_cycle = duty_cycle + increment; if(duty_cycle < 0.5) { duty_cycle = 0.5; increment = -increment; } else if(duty_cycle > 1) { duty_cycle = 1; increment = -increment; } // loop every 200ms setTimeout(loop, 200); } |