import machine
import time
from machine import Pin, PWM
# Pin definitions
LED1_PIN = 2
LED2_PIN = 3
LED3_PIN = 4
SHCP_PIN = 5
STCP_PIN = 6
DS_PIN = 7
SERVO1_PIN = 8
SERVO2_PIN = 9
SERVO3_PIN = 10
# Initialize LEDs
led1 = Pin(LED1_PIN, Pin.OUT)
led2 = Pin(LED2_PIN, Pin.OUT)
led3 = Pin(LED3_PIN, Pin.OUT)
# Initialize shift register pins
shcp = Pin(SHCP_PIN, Pin.OUT)
stcp = Pin(STCP_PIN, Pin.OUT)
ds = Pin(DS_PIN, Pin.OUT)
# Initialize servos
servo1 = PWM(Pin(SERVO1_PIN))
servo2 = PWM(Pin(SERVO2_PIN))
servo3 = PWM(Pin(SERVO3_PIN))
# Configure servos with 50Hz frequency (standard for most servos)
servo1.freq(50)
servo2.freq(50)
servo3.freq(50)
# Define segment codes for 0-9 digits (common anode)
segment_codes = [
0b11000000, # 0
0b11111001, # 1
0b10100100, # 2
0b10110000, # 3
0b10011001, # 4
0b10010010, # 5
0b10000010, # 6
0b11111000, # 7
0b10000000, # 8
0b10010000 # 9
]
# Helper function to convert angle to duty cycle for servos
def angle_to_duty(angle):
# Map angle 0-180 to duty cycle range for servos
# Typically 0.5ms (min) to 2.5ms (max) in a 20ms period
# This translates to about 2.5% to 12.5% duty cycle
min_duty = 1638 # ~2.5% of 65535
max_duty = 8192 # ~12.5% of 65535
return int(min_duty + (max_duty - min_duty) * angle / 180)
# Function to shift out data to the 74HC595 shift registers (MSB first)
def shift_out(data_pin, clock_pin, byte_value):
for i in range(7, -1, -1): # Shift MSB first
data_pin.value((byte_value >> i) & 1)
clock_pin.value(0)
clock_pin.value(1) # Data shifts on rising edge
# Function to display a two-digit number on the 7-segment displays
def display_number(number):
tens = number // 10
ones = number % 10
tens_code = segment_codes[tens]
ones_code = segment_codes[ones]
# First shift out ones digit, then tens digit
shift_out(ds, shcp, ones_code)
shift_out(ds, shcp, tens_code)
# Latch the data to output pins
digitalWrite(stcp, 1)
digitalWrite(stcp, 0)
# Helper function to mimic Arduino's digitalWrite behavior
def digitalWrite(pin, value):
pin.value(value)
# Function to update LEDs based on number
def update_leds(number):
units_digit = number % 10
led1.value(1 if 0 <= units_digit <= 2 else 0)
led2.value(1 if 3 <= units_digit <= 5 else 0)
led3.value(1 if 6 <= units_digit <= 9 else 0)
# Function to update servos based on number
def update_servos(number):
tens_digit = number // 10
if 0 <= tens_digit <= 2:
servo1.duty_u16(angle_to_duty(30))
servo2.duty_u16(angle_to_duty(60))
servo3.duty_u16(angle_to_duty(90))
elif 3 <= tens_digit <= 5:
servo1.duty_u16(angle_to_duty(60))
servo2.duty_u16(angle_to_duty(90))
servo3.duty_u16(angle_to_duty(120))
elif 6 <= tens_digit <= 9:
servo1.duty_u16(angle_to_duty(90))
servo2.duty_u16(angle_to_duty(120))
servo3.duty_u16(angle_to_duty(150))
# Main program
current_number = 0
last_update_time = 0
# Initial setup
display_number(current_number)
update_leds(current_number)
update_servos(current_number)
# Main loop
while True:
current_time = time.ticks_ms()
if time.ticks_diff(current_time, last_update_time) >= 2000: # 2 seconds
current_number += 1
if current_number > 99:
current_number = 0
display_number(current_number)
update_leds(current_number)
update_servos(current_number)
last_update_time = current_time
pico:GP0
pico:GP1
pico:GND.1
pico:GP2
pico:GP3
pico:GP4
pico:GP5
pico:GND.2
pico:GP6
pico:GP7
pico:GP8
pico:GP9
pico:GND.3
pico:GP10
pico:GP11
pico:GP12
pico:GP13
pico:GND.4
pico:GP14
pico:GP15
pico:GP16
pico:GP17
pico:GND.5
pico:GP18
pico:GP19
pico:GP20
pico:GP21
pico:GND.6
pico:GP22
pico:RUN
pico:GP26
pico:GP27
pico:GND.7
pico:GP28
pico:ADC_VREF
pico:3V3
pico:3V3_EN
pico:GND.8
pico:VSYS
pico:VBUS
led1:A
led1:C
led2:A
led2:C
led3:A
led3:C
sevseg1:COM.1
sevseg1:COM.2
sevseg1:A
sevseg1:B
sevseg1:C
sevseg1:D
sevseg1:E
sevseg1:F
sevseg1:G
sevseg1:DP
sr1:Q1
sr1:Q2
sr1:Q3
sr1:Q4
sr1:Q5
sr1:Q6
sr1:Q7
sr1:GND
sr1:Q7S
sr1:MR
sr1:SHCP
sr1:STCP
sr1:OE
sr1:DS
sr1:Q0
sr1:VCC
sevseg2:COM.1
sevseg2:COM.2
sevseg2:A
sevseg2:B
sevseg2:C
sevseg2:D
sevseg2:E
sevseg2:F
sevseg2:G
sevseg2:DP
sr2:Q1
sr2:Q2
sr2:Q3
sr2:Q4
sr2:Q5
sr2:Q6
sr2:Q7
sr2:GND
sr2:Q7S
sr2:MR
sr2:SHCP
sr2:STCP
sr2:OE
sr2:DS
sr2:Q0
sr2:VCC
servo1:GND
servo1:V+
servo1:PWM
servo2:GND
servo2:V+
servo2:PWM
servo3:GND
servo3:V+
servo3:PWM