Advertisement
Guest User

Sipeed Maixシリーズ用 PWMコントローラPCA9685デモプログラム

a guest
Nov 14th, 2020
277
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.52 KB | None | 0 0
  1. #
  2. #     このライブラリが必要です
  3. #     https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library
  4. #
  5. #include <Arduino.h>
  6. #include <Adafruit_PWMServoDriver.h>
  7.  
  8.  
  9. uint8_t DEVICE_ADDRESS_PCA9685 = 0x40;
  10.  
  11.  
  12. Adafruit_PWMServoDriver       pca9685_01;
  13.  
  14. uint8_t _i2caddr = DEVICE_ADDRESS_PCA9685;
  15. TwoWire *_i2c;
  16. int32_t set_duty(int32_t index, int32_t value_1, int32_t invert);
  17. int32_t getPWM(int32_t index, int32_t *result1, int32_t *result2);
  18. int32_t get_duty(int32_t index, int32_t invert);
  19.  
  20. double func01(int num);
  21.  
  22. void setup() {
  23.     Serial.begin(115200);
  24.     _i2c = &Wire;
  25.     _i2c->begin((uint8_t) SDA, (uint8_t) SCL, 400000);
  26.     pca9685_01 = Adafruit_PWMServoDriver(_i2caddr, *_i2c);
  27.     pca9685_01.reset();
  28.     pca9685_01.setPWMFreq(250);
  29.     pca9685_01.setOscillatorFrequency(FREQUENCY_OSCILLATOR);
  30. }
  31.  
  32. void loop() {
  33.     int val01;
  34.     double f01;
  35.  
  36.     for (int k = 0; k < 8; k++) {
  37.         for (int j = 0; j < 160; j+=10) {
  38.             for (int i = 0; i < 16; i++) {
  39.                 f01 = func01(int(320.0 / 16.0 * i + j));
  40.                 val01 = int(f01 * 4095.0);
  41.                 val01 = 4095 - val01;
  42.                 set_duty(i, val01, 0);
  43.             }
  44.             delay(100);
  45.         }
  46.     }
  47.     val01 = 4095;
  48.     for (int i = 0; i < 16; i++) {
  49.         set_duty(i, val01, 0);
  50.     }
  51.     delay(500);
  52.  
  53.     val01 = 0;
  54.     for (int i = 0; i < 16; i++) {
  55.         set_duty(i, val01, 0);
  56.     }
  57.     delay(1000);
  58.  
  59.     val01 = 4095;
  60.     for (int i = 0; i < 16; i++) {
  61.         set_duty(i, val01, 0);
  62.     }
  63.     delay(1000);
  64.  
  65.     val01 = 0;
  66.     for (int i = 0; i < 16; i++) {
  67.         set_duty(i, val01, 0);
  68.     }
  69.     delay(1000);
  70.  
  71.     val01 = 4095;
  72.     for (int i = 0; i < 16; i++) {
  73.         set_duty(i, val01, 0);
  74.     }
  75.     delay(1000);    
  76. }
  77.  
  78. double func01(int num) {
  79.     double a01, a02;
  80.     a01 = num % 160;
  81.     if (a01 < 80.0) a02 = (1.0 / 80.0 * a01);
  82.     else            a02 = (1.0 / 80.0 * (160.0 - a01));
  83.     return a02 * a02 * a02;
  84. }
  85.  
  86. int32_t set_duty(int32_t index, int32_t value_1, int32_t invert) {
  87.     int32_t value;
  88.     value = value_1;
  89.  
  90.     if ((value < 0) | (value > 4095)) {
  91.         return 1;
  92.     }
  93.     if ((int)invert != 0) {
  94.         value = 4095 - value;
  95.     }
  96.     if (value == 0) {
  97.         pca9685_01.setPWM(index, 0, 4096);
  98.     } else if (value == 4095) {
  99.         pca9685_01.setPWM(index, 4096, 0);
  100.     } else {
  101.         pca9685_01.setPWM(index, 0, value);
  102.     }
  103.     return 0;
  104. }
  105.  
  106. int32_t getPWM(int32_t index, int32_t *result1, int32_t *result2) {
  107.     uint8_t val[4];
  108.     int i = 0;
  109.  
  110.     _i2c->beginTransmission((uint8_t)_i2caddr);
  111.     _i2c->write((uint8_t)PCA9685_LED0_ON_L + 4 * index);
  112.     _i2c->endTransmission();
  113.     _i2c->requestFrom((uint8_t)_i2caddr, (uint8_t)4);
  114.     while (Wire.available() && i < 4) {
  115.         val[i] = Wire.read();
  116.         ++i;
  117.     }
  118.     if (i < 4) {
  119.         *result1 = 0;
  120.         *result2 = 0;
  121.         return 1;
  122.     }
  123.     *result1 = (uint32_t)val[1] << 8 | (uint32_t)val[0];
  124.     *result2 = (uint32_t)val[3] << 8 | (uint32_t)val[2];
  125.  
  126.     return 0;
  127. }
  128.  
  129. int32_t get_duty(int32_t index, int32_t invert){
  130.     int32_t result;
  131.     int32_t pwm01, pwm02, value;
  132.     result = getPWM(index, &pwm01, &pwm02);
  133.     if (result != 0) {
  134.         return -1;
  135.     }
  136.     if (pwm01 == 0 && pwm02 == 4096) {
  137.         value = 0;
  138.     } else if (pwm01 == 4096 && pwm02 == 0) {
  139.         value = 4095;
  140.     } else {
  141.         value = pwm02;
  142.     }
  143.  
  144.     if ((int)invert != 0) {
  145.         value = 4095 - value;
  146.     }
  147.     return value;
  148. }
  149.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement