Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #
- # このライブラリが必要です
- # https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library
- #
- #include <Arduino.h>
- #include <Adafruit_PWMServoDriver.h>
- uint8_t DEVICE_ADDRESS_PCA9685 = 0x40;
- Adafruit_PWMServoDriver pca9685_01;
- uint8_t _i2caddr = DEVICE_ADDRESS_PCA9685;
- TwoWire *_i2c;
- int32_t set_duty(int32_t index, int32_t value_1, int32_t invert);
- int32_t getPWM(int32_t index, int32_t *result1, int32_t *result2);
- int32_t get_duty(int32_t index, int32_t invert);
- double func01(int num);
- void setup() {
- Serial.begin(115200);
- _i2c = &Wire;
- _i2c->begin((uint8_t) SDA, (uint8_t) SCL, 400000);
- pca9685_01 = Adafruit_PWMServoDriver(_i2caddr, *_i2c);
- pca9685_01.reset();
- pca9685_01.setPWMFreq(250);
- pca9685_01.setOscillatorFrequency(FREQUENCY_OSCILLATOR);
- }
- void loop() {
- int val01;
- double f01;
- for (int k = 0; k < 8; k++) {
- for (int j = 0; j < 160; j+=10) {
- for (int i = 0; i < 16; i++) {
- f01 = func01(int(320.0 / 16.0 * i + j));
- val01 = int(f01 * 4095.0);
- val01 = 4095 - val01;
- set_duty(i, val01, 0);
- }
- delay(100);
- }
- }
- val01 = 4095;
- for (int i = 0; i < 16; i++) {
- set_duty(i, val01, 0);
- }
- delay(500);
- val01 = 0;
- for (int i = 0; i < 16; i++) {
- set_duty(i, val01, 0);
- }
- delay(1000);
- val01 = 4095;
- for (int i = 0; i < 16; i++) {
- set_duty(i, val01, 0);
- }
- delay(1000);
- val01 = 0;
- for (int i = 0; i < 16; i++) {
- set_duty(i, val01, 0);
- }
- delay(1000);
- val01 = 4095;
- for (int i = 0; i < 16; i++) {
- set_duty(i, val01, 0);
- }
- delay(1000);
- }
- double func01(int num) {
- double a01, a02;
- a01 = num % 160;
- if (a01 < 80.0) a02 = (1.0 / 80.0 * a01);
- else a02 = (1.0 / 80.0 * (160.0 - a01));
- return a02 * a02 * a02;
- }
- int32_t set_duty(int32_t index, int32_t value_1, int32_t invert) {
- int32_t value;
- value = value_1;
- if ((value < 0) | (value > 4095)) {
- return 1;
- }
- if ((int)invert != 0) {
- value = 4095 - value;
- }
- if (value == 0) {
- pca9685_01.setPWM(index, 0, 4096);
- } else if (value == 4095) {
- pca9685_01.setPWM(index, 4096, 0);
- } else {
- pca9685_01.setPWM(index, 0, value);
- }
- return 0;
- }
- int32_t getPWM(int32_t index, int32_t *result1, int32_t *result2) {
- uint8_t val[4];
- int i = 0;
- _i2c->beginTransmission((uint8_t)_i2caddr);
- _i2c->write((uint8_t)PCA9685_LED0_ON_L + 4 * index);
- _i2c->endTransmission();
- _i2c->requestFrom((uint8_t)_i2caddr, (uint8_t)4);
- while (Wire.available() && i < 4) {
- val[i] = Wire.read();
- ++i;
- }
- if (i < 4) {
- *result1 = 0;
- *result2 = 0;
- return 1;
- }
- *result1 = (uint32_t)val[1] << 8 | (uint32_t)val[0];
- *result2 = (uint32_t)val[3] << 8 | (uint32_t)val[2];
- return 0;
- }
- int32_t get_duty(int32_t index, int32_t invert){
- int32_t result;
- int32_t pwm01, pwm02, value;
- result = getPWM(index, &pwm01, &pwm02);
- if (result != 0) {
- return -1;
- }
- if (pwm01 == 0 && pwm02 == 4096) {
- value = 0;
- } else if (pwm01 == 4096 && pwm02 == 0) {
- value = 4095;
- } else {
- value = pwm02;
- }
- if ((int)invert != 0) {
- value = 4095 - value;
- }
- return value;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement