13
static int channels_[ NUM_MOTORS ];
19
for( int pin = FIRST_PIN; pin < FIRST_PIN + NUM_MOTORS; pin++ ) {
20
pinMode( pin, OUTPUT );
21
digitalWrite( pin, LOW );
24
// reset channel values
25
for( int a = 0; a < NUM_MOTORS; a++ )
30
void Motors::set_values( int channel_values[] )
32
for( int a = 0; a < NUM_MOTORS; a++ )
33
channels_[ a ] = channel_values[ a ];
39
static int event = NUM_MOTORS * 2;
40
unsigned long now = micros();
41
static unsigned long frame_start = now - FRAME_DURATION;
42
static unsigned long next_event_at = 0;
44
if( now >= next_event_at )
47
if( event < NUM_MOTORS * 2 )
48
digitalWrite( FIRST_PIN + ( event / 2 ),
49
( event & 1 )? LOW : HIGH );
52
if( ++event >= NUM_MOTORS * 2 ) {
54
frame_start += FRAME_DURATION;
57
// calculate the time that the next event will occur
58
next_event_at = frame_start + ( event / 2 ) * CHANNEL_INTERVAL;
60
next_event_at += MIN_PULSE_WIDTH + channels_[ event / 2 ] *
61
( MAX_PULSE_WIDTH - MIN_PULSE_WIDTH ) / MAX_CHANNEL_VALUE;
63
// Serial.print( event / 2 );
64
// Serial.print( ( event & 1 )? 'v' : '^' );
65
// Serial.print( " " );
66
// Serial.println( next_event_at );
69
// unsigned long width = MIN_PULSE_WIDTH +
70
// (unsigned long)channels_[ event / 2 ] *
71
// ( MAX_PULSE_WIDTH - MIN_PULSE_WIDTH ) / MAX_CHANNEL_VALUE;
72
// Serial.print( channels_[ event / 2 ] );
73
// Serial.print( " " );
74
// Serial.println( width );
78
// else, if an event is coming up soon, sleep and service the event to make
79
// sure that no other code runs and blocks us!
82
long delay = calculate_duration( now, next_event_at );
86
delayMicroseconds( delay - 20 );