Device 12C508 Config INTRC_OSC, MCLRE_OFF, WDT_OFF, CP_OFF ' set config fuses OPTION_REG.5 = 0 ' clock source internal 'Pin8 = Ground 'Pin7 = GPIO.0 - i/o - LED left - tie pin 7 to high side (anode) of led, tie led low side (cathode) through resistor to ground 'Pin6 = GPIO.1 - i/o - LED right - tie pin 6 to high side (anode) of led, tie led low side (cathode) through resistor to ground 'Pin5 = GPIO.2 - i/o - PWM left - pulseout 1 to 2 ms - connect to left drag rudder 'Pin4 = GPIO.3 - input only - RC PWM signal - tie to RC signal via 4.7k ohm resistor 'Pin3 = GPIO.4 - i/o - PWM right - pulseout 1 to 2 ms - connect to right drag rudder 'Pin2 = GPIO.5 - i/o 'Pin1 = Vcc Dim Pulselen As Byte ' Pulselen can be 0 - 255, 100 = 1 ms, 200 = 2 ms Dim LeftOff As Byte ' left offset (from 1.5 ms center) Dim RightOff As Byte ' right offset (from 1.5 ms center) Dim Init As Byte ' used to blink LED 3 times Clear ' set all variables = 0 Blink: For Init = 1 To 3 ' blink led 3 times High GPIO.0 ' pin 7 - turn LED left on High GPIO.1 ' pin 6 - turn LED right on DelayMS 200 ' wait 0.2 seconds Low GPIO.0 ' pin 7 - turn LED left off Low GPIO.1 ' pin 6 - turn LED right off DelayMS 200 ' wait 0.2 seconds Next ReadPWM: Pulselen = PulsIn GPIO.3, High ' pin 4 - read high pulse length, times out after .65535 seconds If Pulselen < 50 Then GoTo Blink ' no signal -> blink led again ' input for 11 ft wing and 16 ft wing: ' 100 to 150 (1.00 to 1.50 ms) = right rudder command; goes to nosewheel servo (100 = full right rudder, 150 = center rudder) ' 150 to 200 (1.50 to 2.00 ms) = left rudder command; goes to nosewheel servo (150 = center rudder, 200 = full left rudder) ' 147 to 153 (1.47 to 1.53 ms) = no command - deadband LeftOff = 0 ' default to no left rudder command RightOff = 0 ' default to no right rudder command If Pulselen < 147 And Pulselen > 75 Then ' right rudder commanded RightOff = 147 - Pulselen ' relative to 1.5 ms ; results in rightoff of 1 to 71; (147-146=1) (147-76=71) High GPIO.1 ' turn on right LED else Low GPIO.1 ' turn off right LED endif If Pulselen > 153 And Pulselen < 225 Then ' left rudder commanded LeftOff = Pulselen - 153 ' relative to 1.5 ms ; results in leftoff of 1 to 71; (154-153=1) (224-153=71) High GPIO.0 ' turn on left LED else Low GPIO.0 ' turn off left LED endif ' 11 ft wing used full servo deflection for drag rudders (50 * 2) ' 16 ft wing uses 90% deflection for drag rudders (45 * 2) If LeftOff > 45 Then LeftOff = 45 ' final output is scaled * 2, restrict final throw to 90 (= 45 * 2) If RightOff > 45 Then RightOff = 45 ' final output is scaled * 2, restrict rinal throw to 90 (= 45 * 2) ' set both PWM outputs low Low GPIO.2 ' set left output state to low Low GPIO.4 ' set right output state to low ' need to map left rudder command --> left drag rudder output ' need to map right rudder command --> right drag rudder output ' output for 11 ft wing: ' 100 to 200 (1.00 to 2.00 ms) = left drag rudder output (100 = closed, 200 = fully open) ' 100 to 200 (1.00 to 2.00 ms) = right drag rudder output (200 = closed, 100 = fully open) ' PulsOut GPIO.2, 100 + (LeftOff * 2) ' output the left drag rudder PWM, toggle the state for 100 + (0 to 100) ' PulsOut GPIO.4, 200 - (RightOff * 2) ' output the right drag rudder PWM, toggle the state for 200 - (0 to 100) ' output for 16 ft wing ' left drag rudder (200 to 100), 1.97 = closed, 1.07 = fully open ' right drag rudder (100 to 200), 1.03 = closed, 1.93 = fully open PulsOut GPIO.2, 197 - (LeftOff * 2) PulsOut GPIO.4, 103 + (RightOff * 2) Goto ReadPWM