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  }