#include "Arduino.h" void setup () { Serial . begin (9600) ; // 122Hz @ 50% on pin 3 using T/C0 pinMode ( 3 , OUTPUT ) ; // 0C0B is connected to pin 3 TCCR0A = 0 << COM0A1 | 0 << COM0A0 | 1 << COM0B1 | 0 << COM0B0 | 1 << WGM01 | 1 << WGM00 ; TCCR0B = 1 << WGM02 | 1 << CS02 | 0 << CS01 | 1 << CS00 ; OCR0A = 127 ; OCR0B = 63 ; // 25kHz @ variable duty cycle on pins 9 and 10 using T/C1 pinMode ( 9 , OUTPUT ) ; // 0C1A is connected to pin 9 pinMode ( 10 , OUTPUT ) ; // 0C1B is connected to pin 10 TCCR1A = 1 << COM1A1 | 0 << COM1A0 | 1 << COM1B1 | 0 << COM1B0 | 0 << COM1C1 | 0 << COM1C0 | 1 << WGM11 | 0 << WGM10 ; TCCR1B = 1 << WGM13 | 1 << WGM12 | 0 << CS12 | 1 << CS11 | 0 << CS10 ; ICR1H = 0 ; ICR1L = 79 ; OCR1AH = 0 ; OCR1AL = 39 ; OCR1BH = 0 ; OCR1BL = 39 ; } // Sequence is 188 92 136 14 154 39 154 139 {duty-cycle} int seqPos = 0 ; void loop () { if ( Serial . available () ) { int input = Serial . read () ; // In order to avoid serial writes by software other than kulifuli-host messing things up, // we check for a specific sequence of 8 bytes before the byte that contains the new duty cycle if ( seqPos == 0 && input == 188 || seqPos == 1 && input == 92 || seqPos == 2 && input == 136 || seqPos == 3 && input == 14 || seqPos == 4 && input == 154 || seqPos == 5 && input == 39 || seqPos == 6 && input == 154 || seqPos == 7 && input == 139 ) { // Advance in the sequence seqPos ++ ; } else if ( seqPos == 8 ) { // Sequence completed, `input` is the new duty cycle OCR1AL = input ; OCR1BL = input ; Serial . write (input) ; seqPos = 0 ; } else { // Reset sequence progress seqPos = 0 ; } } }