gobot.io/x/gobot/v2@v2.1.0/examples/raspi_pca9533.go (about) 1 //go:build example 2 // +build example 3 4 // 5 // Do not build by default. 6 7 package main 8 9 import ( 10 "fmt" 11 "time" 12 13 "gobot.io/x/gobot/v2" 14 "gobot.io/x/gobot/v2/drivers/i2c" 15 "gobot.io/x/gobot/v2/platforms/raspi" 16 ) 17 18 // Wiring 19 // PWR Raspi: 1 (+3.3V, VCC), 6, 9, 14, 20 (GND) 20 // I2C1 Raspi: 3 (SDA), 5 (SCL) 21 // PCA9533: 8 (VDD, +2.3..5.5V), 4 (VSS, GND), 7 (SDA), 6 (SCL) 22 // LED pins: 1 (LED0), 2 (LED1), 3 (LED2), 5 (LED3) 23 // LED's directly driven with pull-up resistors to VDD, e.g. 180 Ohm 24 // I2C addresses: 0x62 (PCA9533/01), 0x63 (PCA9533/02) 25 func main() { 26 board := raspi.NewAdaptor() 27 pca := i2c.NewPCA953xDriver(board, i2c.WithAddress(0x63)) 28 29 led := uint8(0) // index of LED 30 wVal := uint8(1) // start with LED is "off" 31 rVal := uint8(0) 32 33 work := func() { 34 // LED 2 with 5 Hz 1:1, LED 3 with 1 Hz 1:10 35 initialize(pca, 5, 1) 36 37 gobot.Every(2000*time.Millisecond, func() { 38 fmt.Printf("set LED%d output to %d", led, wVal) 39 err := pca.WriteGPIO(led, wVal) 40 if err != nil { 41 fmt.Println("errW:", err) 42 } 43 44 rVal, err = pca.ReadGPIO(led) 45 if err != nil { 46 fmt.Println("errR:", err) 47 } 48 if rVal == 0 { 49 fmt.Printf(" - LED%d is ON\n", led) 50 } else { 51 fmt.Printf(" - LED%d is OFF\n", led) 52 } 53 54 led = led + 1 55 if led > 1 { 56 led = 0 57 if wVal == 1 { 58 wVal = 0 59 } else { 60 wVal = 1 61 } 62 } 63 }) 64 } 65 66 robot := gobot.NewRobot("ledI2c", 67 []gobot.Connection{board}, 68 []gobot.Device{pca}, 69 work, 70 ) 71 72 err := robot.Start() 73 if err != nil { 74 fmt.Println(err) 75 } 76 } 77 78 func initialize(pca *i2c.PCA953xDriver, led2FrequHz float32, led3FrequHz float32) { 79 // prepare PWM0 80 err := pca.WriteFrequency(0, led2FrequHz) 81 if err != nil { 82 fmt.Println("errWF0:", err) 83 } 84 frq, err := pca.ReadFrequency(0) 85 if err != nil { 86 fmt.Println("errRF0:", err) 87 } 88 fmt.Println("get Frq0:", frq) 89 90 err = pca.WriteDutyCyclePercent(0, 50) 91 if err != nil { 92 fmt.Println("errWD0:", err) 93 } 94 dc, err := pca.ReadDutyCyclePercent(0) 95 if err != nil { 96 fmt.Println("errRD0:", err) 97 } 98 fmt.Println("get dc0:", dc) 99 100 // prepare PWM1 101 err = pca.WriteFrequency(1, led3FrequHz) 102 if err != nil { 103 fmt.Println("errWF1:", err) 104 } 105 frq, err = pca.ReadFrequency(1) 106 if err != nil { 107 fmt.Println("errRF1:", err) 108 } 109 fmt.Println("get Frq1:", frq) 110 111 err = pca.WriteDutyCyclePercent(1, 10) 112 if err != nil { 113 fmt.Println("errWD1:", err) 114 } 115 dc, err = pca.ReadDutyCyclePercent(1) 116 if err != nil { 117 fmt.Println("errRD1:", err) 118 } 119 fmt.Println("get dc1:", dc) 120 121 // LED 2 122 fmt.Println("set LED: 2 to: pwm0") 123 err = pca.SetLED(2, i2c.PCA953xModePwm0) 124 if err != nil { 125 fmt.Println("errW:", err) 126 } 127 fmt.Println("set LED: 3 to: pwm1") 128 err = pca.SetLED(3, i2c.PCA953xModePwm1) 129 if err != nil { 130 fmt.Println("errW:", err) 131 } 132 133 }