[Решен] вопрос I2C

Robo_pi
Пн, сентябрь 03, 2018, 17:43
Я использую Arduino IDE для управления сервоприводами с использованием платы Servo Controller PCA9685.

Я установил все это на arduino uno, и он работает просто отлично. Это небольшая программа, которая использует последовательный монитор для команд ввода для управления сервоприводом.

После того, как я сделал это, я попытался использовать ту же программу на плате STM32F103C8. Программа работает очень хорошо с точки зрения ввода и распечатки команд сервоприводов. Тем не менее, это не перемещает сервоприводы. Я подозреваю, что это как -то связано с тем, что I2C не настроен должным образом.

В ООН все, что я сделал, это включил проволоку.H Библиотека вместе с библиотекой Adafruit для доски 9685, и все работает. Но это, похоже, не работает на доске STM32.

Нужно ли мне сделать что -то большее, чтобы настроить автобус I2C на плате STM32? Я использую Pins PB6 и PB7 для SCL и SDA соответственно.

Вот код. Он включает в себя много серийных.печатные операторы, чтобы я мог видеть, что происходит на серийном мониторе. Это много работает отлично. Но сервоприводы не отвечают на систему STM32. Но программа работает отлично на Arduino uno.

Вот код:
/* PCA9685 PWM Servo Driver My Version using Kayboard input and Serial COM. using four servos */ // Include Wire Library for I2C Communications #include // Include Adafruit PWM Library #include // Variables used for Serial monitor String servo_position_string; char sps_array[4]; int servo_position_integer; String message = "Input R, L, or M for Right, Left, Middle Servo Position: (4 servos)"; bool serial_msg_flag = true; // Variables for the PCA9685 board #define MIN_PULSE_WIDTH 650 #define MAX_PULSE_WIDTH 2350 #define FREQUENCY 50 // The PCA9685 board address begins at 0x40, Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40); // Serial input value int servo_input_Val; // This will be my keyboard input value for the servo position. // Define Motor Outputs on PCA9685 board // int motorA = 0; int motor_pointer = 0; int pos_variable = 0; // Begin SETUP void setup() { // Set up to communicate via laptop USB connection. Serial.begin(9600); // Not much here all we do is begin the pwm Adafruit object and set the frequency to 50 Hz. pwm.begin(); pwm.setPWMFreq(FREQUENCY); } void loop() { if (serial_msg_flag) { Serial.println(message); serial_msg_flag = false; // message has been printed. } while (Serial.available()) { servo_position_string = Serial.readString(); // get the input string Serial.println(servo_position_string); // print the input string Serial.println(servo_position_string.length()); // ------------ test the input for correct values -------------- if (servo_position_string.length() > 0 && servo_position_string.length() < 7) { servo_position_string.toCharArray(sps_array, 5); motor_pointer = 0; Serial.print("Motor Pointer Before Loop = "); for (int i=0; i<4; i++) { Serial.print(sps_array[i]); //Serial.println("_"); } Serial.println(motor_pointer); for (int i=0; i <4; i++) { Serial.print("sps_array Character = "); Serial.println(sps_array[i]); // set the pos-variable to the correct value if (sps_array[i] == 'R' || sps_array[i] == 'r') {pos_variable = 0;} else if (sps_array[i] == 'M' || sps_array[i] == 'm') {pos_variable = 500;} else if (sps_array[i] == 'L' || sps_array[i] == 'l') {pos_variable = 1000;} else {pos_variable = 0;} // print out results to the serial monitor Serial.print("Motor_pointer = "); Serial.println(motor_pointer); Serial.print("pos_variable = "); Serial.println(pos_variable); // call the moveMotor routine for each servo moveMotor (pos_variable, motor_pointer); motor_pointer = motor_pointer + 4; } } else { Serial.println("out of range error"); } serial_msg_flag = true; // ok to print message again. } } // This is the subroutine or Method named moveMotor // it requires two integers // controlIn is the analog input --- This comes from the serial input. // motorOut is the servo pin number of the PCA9685 board. void moveMotor(int potVal, int motorOut) { int pulse_wide, pulse_width; pulse_wide = map(potVal, 0, 1023, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH); // the actual pulse_width is then caculated using the value of pulse-wide. pulse_width = int(float(pulse_wide) / 1000000 * FREQUENCY * 4096); //Send information to PC9684 Board via I2C pwm.setPWM(motorOut, 0, pulse_width); }

Стивестронг
Вторник 04 сентября 2018 г. 9:15 утра
Поиск по использованной библиотеке для места, где определены контакты I2C, и измените определение в соответствии с вашей настройкой.

Robo_pi
Вторник 04 сентября 2018 г. 10:42 утра
Хорошо, я связался с Adafruit, и они подтвердили, что их библиотека не покрывает микроконтроллер STM32F103C8. Но они предположили, что я должен быть в состоянии довольно легко изменить их библиотечный код, внеся изменения в код «обернутый» в функциях с именем read8 () и записи (8). Единственная проблема заключается в том, что в настоящее время я не достаточно свободно свободно.

Кто -нибудь может дать мне несколько предложений о том, что нужно изменить? Я опубликую код библиотеки ниже. Отнесее отметить, что это также использует провод Arduino.h Библиотека Адафрут Сервоат -библиотека ниже четко указывает, что это указывает на объект «совместимый с проводной» I2C. Так что я предполагаю, что STM32F103C8 совместим с проводом? Означает ли это, что он должен быть совместимы с проводом.H Библиотека?

В любом случае, вот код библиотеки Adafruit Servo.

Adafruit_pwmservodriver.час
/*************************************************** This is a library for our Adafruit 16-channel PWM & Servo driver Pick one up today in the adafruit shop! ------> http://www.adafruit.com/products/815 These displays use I2C to communicate, 2 pins are required to interface. For Arduino UNOs, thats SCL -> Analog 5, SDA -> Analog 4 Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit! Written by Limor Fried/Ladyada for Adafruit Industries. BSD license, all text above must be included in any redistribution ****************************************************/ #ifndef _ADAFRUIT_PWMServoDriver_H #define _ADAFRUIT_PWMServoDriver_H #if ARDUINO >= 100 #include "Arduino.h" #else #include "WProgram.h" #endif #include "Wire.h" #define PCA9685_SUBADR1 0x2 #define PCA9685_SUBADR2 0x3 #define PCA9685_SUBADR3 0x4 #define PCA9685_MODE1 0x0 #define PCA9685_PRESCALE 0xFE #define LED0_ON_L 0x6 #define LED0_ON_H 0x7 #define LED0_OFF_L 0x8 #define LED0_OFF_H 0x9 #define ALLLED_ON_L 0xFA #define ALLLED_ON_H 0xFB #define ALLLED_OFF_L 0xFC #define ALLLED_OFF_H 0xFD /**************************************************************************/ /*! @brief Class that stores state and functions for interacting with PCA9685 PWM chip */ /**************************************************************************/ class Adafruit_PWMServoDriver { public: Adafruit_PWMServoDriver(uint8_t addr = 0x40); Adafruit_PWMServoDriver(TwoWire *I2C, uint8_t addr = 0x40); void begin(void); void reset(void); void setPWMFreq(float freq); void setPWM(uint8_t num, uint16_t on, uint16_t off); void setPin(uint8_t num, uint16_t val, bool invert=false); private: uint8_t _i2caddr; TwoWire *_i2c; uint8_t read8(uint8_t addr); void write8(uint8_t addr, uint8_t d); }; #endif

Стивестронг
Вторник 04 сентября 2018 12:34
Пожалуйста, опубликуйте здесь полное сообщение Arduino IDE при создании и загрузке проекта.
Как вы питаете доски?
У вас есть подтягивающие резисторы для линий I2C?

Robo_pi
Вторник 04 сентября 2018 г. 18:05
[Стивестронг - Вторник 04 сентября 2018 12:34] - Пожалуйста, опубликуйте здесь полное сообщение Arduino IDE при создании и загрузке проекта.
Вот сообщение о загрузке Arduino IDE:
Sketch uses 26084 bytes (39%) of program storage space. Maximum is 65536 bytes. Global variables use 3712 bytes (18%) of dynamic memory, leaving 16768 bytes for local variables. Maximum is 20480 bytes. stm32flash 0.4 http://stm32flash.googlecode.com/ Using Parser : Raw BINARY Interface serial_w32: 115200 8E1 Version : 0x22 Option 1 : 0x00 Option 2 : 0x00 Device ID : 0x0410 (Medium-density) - RAM : 20KiB (512b reserved by bootloader) - Flash : 128KiB (sector size: 4x1024) - Option RAM : 16b - System RAM : 2KiB Write to memory Erasing memory Wrote address 0x08000100 (0.98%) Wrote address 0x08000200 (1.96%) Wrote address 0x08000300 (2.94%) Wrote address 0x08000400 (3.93%) Wrote address 0x08000500 (4.91%) Wrote address 0x08000600 (5.89%) Wrote address 0x08000700 (6.87%) Wrote address 0x08000800 (7.85%) Wrote address 0x08000900 (8.83%) Wrote address 0x08000a00 (9.81%) Wrote address 0x08000b00 (10.80%) Wrote address 0x08000c00 (11.78%) Wrote address 0x08000d00 (12.76%) Wrote address 0x08000e00 (13.74%) Wrote address 0x08000f00 (14.72%) Wrote address 0x08001000 (15.70%) Wrote address 0x08001100 (16.68%) Wrote address 0x08001200 (17.67%) Wrote address 0x08001300 (18.65%) Wrote address 0x08001400 (19.63%) Wrote address 0x08001500 (20.61%) Wrote address 0x08001600 (21.59%) Wrote address 0x08001700 (22.57%) Wrote address 0x08001800 (23.55%) Wrote address 0x08001900 (24.54%) Wrote address 0x08001a00 (25.52%) Wrote address 0x08001b00 (26.50%) Wrote address 0x08001c00 (27.48%) Wrote address 0x08001d00 (28.46%) Wrote address 0x08001e00 (29.44%) Wrote address 0x08001f00 (30.42%) Wrote address 0x08002000 (31.41%) Wrote address 0x08002100 (32.39%) Wrote address 0x08002200 (33.37%) Wrote address 0x08002300 (34.35%) Wrote address 0x08002400 (35.33%) Wrote address 0x08002500 (36.31%) Wrote address 0x08002600 (37.29%) Wrote address 0x08002700 (38.28%) Wrote address 0x08002800 (39.26%) Wrote address 0x08002900 (40.24%) Wrote address 0x08002a00 (41.22%) Wrote address 0x08002b00 (42.20%) Wrote address 0x08002c00 (43.18%) Wrote address 0x08002d00 (44.17%) Wrote address 0x08002e00 (45.15%) Wrote address 0x08002f00 (46.13%) Wrote address 0x08003000 (47.11%) Wrote address 0x08003100 (48.09%) Wrote address 0x08003200 (49.07%) Wrote address 0x08003300 (50.05%) Wrote address 0x08003400 (51.04%) Wrote address 0x08003500 (52.02%) Wrote address 0x08003600 (53.00%) Wrote address 0x08003700 (53.98%) Wrote address 0x08003800 (54.96%) Wrote address 0x08003900 (55.94%) Wrote address 0x08003a00 (56.92%) Wrote address 0x08003b00 (57.91%) Wrote address 0x08003c00 (58.89%) Wrote address 0x08003d00 (59.87%) Wrote address 0x08003e00 (60.85%) Wrote address 0x08003f00 (61.83%) Wrote address 0x08004000 (62.81%) Wrote address 0x08004100 (63.79%) Wrote address 0x08004200 (64.78%) Wrote address 0x08004300 (65.76%) Wrote address 0x08004400 (66.74%) Wrote address 0x08004500 (67.72%) Wrote address 0x08004600 (68.70%) Wrote address 0x08004700 (69.68%) Wrote address 0x08004800 (70.66%) Wrote address 0x08004900 (71.65%) Wrote address 0x08004a00 (72.63%) Wrote address 0x08004b00 (73.61%) Wrote address 0x08004c00 (74.59%) Wrote address 0x08004d00 (75.57%) Wrote address 0x08004e00 (76.55%) Wrote address 0x08004f00 (77.53%) Wrote address 0x08005000 (78.52%) Wrote address 0x08005100 (79.50%) Wrote address 0x08005200 (80.48%) Wrote address 0x08005300 (81.46%) Wrote address 0x08005400 (82.44%) Wrote address 0x08005500 (83.42%) Wrote address 0x08005600 (84.40%) Wrote address 0x08005700 (85.39%) Wrote address 0x08005800 (86.37%) Wrote address 0x08005900 (87.35%) Wrote address 0x08005a00 (88.33%) Wrote address 0x08005b00 (89.31%) Wrote address 0x08005c00 (90.29%) Wrote address 0x08005d00 (91.27%) Wrote address 0x08005e00 (92.26%) Wrote address 0x08005f00 (93.24%) Wrote address 0x08006000 (94.22%) Wrote address 0x08006100 (95.20%) Wrote address 0x08006200 (96.18%) Wrote address 0x08006300 (97.16%) Wrote address 0x08006400 (98.14%) Wrote address 0x08006500 (99.13%) Wrote address 0x080065e4 (100.00%) Done. Starting execution at address 0x08000000... done.

Стивестронг
Вторник 04 сентября 2018 г., 19:01
Меня больше интересовало результат сборки (линии компилятора), а не в процентах подсчета загрузки...
Я вижу, что вы используете метод серийной загрузки. Какая ОС?

Подтягивания должны быть подключены к 5 В.

Попробуйте подключить PB6 или PB7 к PC13, таким образом, встроенный светодиод должен моргнуть, когда есть какая-то связь на шине I2C.
Это проверит, переключаются ли линии I2C или нет.

Robo_pi
Вторник 04 сентября 2018 г., 19:37
[Стивестронг - Вторник 04 сентября 2018 г. 19:01] - Меня больше интересовало результат сборки (линии компилятора), а не в процентах подсчета загрузки...
Я собираю это с использованием arduino ide ver 1.8.5

Компилятор только сообщает о следующем без ошибок.
Sketch использует 26084 байта (39%) пространства для хранения программ. Максимум составляет 65536 байтов.
Глобальные переменные используют 3712 байтов (18%) динамической памяти, оставляя 16768 байтов для локальных переменных. Максимум - 20480 байт.
[Стивестронг - Вторник 04 сентября 2018 г. 19:01] - Я вижу, что вы используете метод серийной загрузки. Какая ОС?
Я использую ноутбук Windows 10. И имейте в виду, что все это работало на доски Uno и Mega. Я также успешно использовал STM32F103C8 и для других проектов. У меня не было проблем до сих пор, когда я пытаюсь использовать I2C.
[Стивестронг - Вторник 04 сентября 2018 г. 19:01] - Подтягивания должны быть подключены к 5 В.
Это моя текущая конфигурация.
[Стивестронг - Вторник 04 сентября 2018 г. 19:01] - Попробуйте подключить PB6 или PB7 к PC13, таким образом, встроенный светодиод должен моргнуть, когда есть какая-то связь на шине I2C.
Это проверит, переключаются ли линии I2C или нет.
Да, я только сейчас попробовал это, и PC13 действительно мигает как на линии SCL, так и SDA, когда я отправляю эти сервоприводы.

Спасибо за этот совет, я бы никогда не подумал об этом.

Но давайте постараемся не упускать из виду тот факт, что даже Adafruit предложил мне изменить их библиотеку с открытым исходным кодом и что в настоящее время он не запрограммирован для STM32F103C8.

Мне также было интересно, является ли провод Arduino.H Библиотека, возможно, должна быть изменена вместо этого? Потому что библиотека Adafruit фактически использует #include.час.

В настоящее время я не уверен, где найти проволоку.H и проволока.Файлы CPP. Мне придется выполнить их поиск. Я бы хотел посмотреть, что в этих файлах тоже.

Наконец, у меня есть еще одно «угадание» относительно того, что может быть неправильно. Плата Arduino работает на гораздо более низкой частоте, чем плата STM32. Так что мне интересно, может ли проблема в частоте I2C, которая используется? Я не уверен, как или где это изменить. Я новичок в I2C, поэтому у меня нет опыта работы с тем, как программировать его в деталях.

Но да, линии I2C мигают, когда я подключаю их к светодиоду PC13. Так очевидно, что он отправляет данные по строкам. Может быть, это просто то, что его отправляют на неправильную частоту?

У меня нет масштаба. Я хотел бы сделать.

Пыль
Ср. 05 сентября 2018 г., 19:42
Я думаю о том, что 3v3/5v вы упомянули. В вашем случае я бы использовал резисторы 4K7 (значение для единого конфигурации Master-Slave I2C как то, что я видел), и я хотел бы связывать их до 5 В. Если у вас есть их на 3V3, у PCA9685 может быть недостаточно напряжения, чтобы распознать логику "1". Только что проверил таблицу данных, и в нем говорится, что логика высокая - 0.7*VCC (как USSUL), который 3.5 В, если вы питаете PCA9685 из 5 В.

Robo_pi
Ср. 05 сентября 2018 г. 22:01
Привет, пыль. В настоящее время у меня есть подтягивания, привязанные к 5-вольт рельса макета. Я попробовал 2.2K, а затем 10K, ни один из них не работал. Я только сейчас изменился на 4.7K, но все еще ничего.

Вот фото моей настройки. Я попытался объяснить часть проводки, используя PCPaint. В настоящее время у меня нет полной схемы моей настройки. Я планирую привлечь один, так как я хотел бы в конечном итоге снять видео на YouTube о том, как это настроить. Но сейчас я все еще пытаюсь заставить это работать.

Плата PCA9685 также оснащена 5 -вольтовой железной дорогой. Земля двух рельсов связана. STM32, очевидно, оснащен 3.3 В. И, конечно, STM32 запускает программу, потому что она возвращает всю правильную информацию на серийном терминале.

Я не называл это на фото, но между модулем питания с макетом и STM32 есть небольшая красная доска и STM32. Это USB для последовательной доски. Это соединяется с PINS PA9 и PA10 STM32. И это последовательное соединение, очевидно, работает просто отлично, так как я могу загрузить программирование в STM32, а затем увидеть, как последовательные данные напечатаны мне обратно.

Таким образом, проблема, по -видимому, заключается в том, чтобы правильно доставить эти данные на плату PCA9685. И хитрость привязанности PB6 и PB7 с LED PC13 сработала, чтобы показать, что, по крайней мере, что -то происходит на линиях SCL и SDA, когда я говорю сервоприводам перемещать.

Таким образом, проблема, по -видимому, как -то связана исключительно с проблемой I2C.

Может ли это проблема с частотой?
STM32-Servo-Sm.jpg
STM32-Servo-Sm.JPG (22.81 киб) просмотрено 741 раза

Flyboy74
Чт, 06 сентября 2018 г. 2:05 утра
Я добавлю то, что знаю, и, возможно, это поможет.

Я лишь мало использую Ardunio, но немного использовал синюю таблетку на Ardunio, но более использовал его с общим C

STM32F103C8 PINOUT:
I2c1_sda = pb7
I2c1_scl = pb6
I2c2_sda = pb11
I2c2_scl = pb10

Я использовал PCA9685 довольно много по ряду различных проектов на ряде разных платформ, но все платформы (RPI, ESP8266, ESP32, STM32) были 3.3V Системы. Я всегда питал PCA9685 3.3V, как это находится в спецификациях в таблице данных. Питание PCA9685 на 3.3v означает, что линии данных будут такими же, как VCC, в линии данных Spec Data r Предположим, что находится в пределах 0.7 из VCC SO 3.3V немного вне характеристик, но я сомневаюсь, что это вызывает вашу проблему.

Я не использовал библиотеку Ardunio I2C, поэтому не уверен, как она работает, но использовал I2C с STM32 в C и только что использовал внутренние подтягивания на MCU, не добавляя никаких дополнительных внешних подтяжков вообще. Я должен признать, что я не написал свою собственную библиотеку для оборудования i2c на STM32, но просто использовал библиотеку HAL, предоставленную ST, так как библиотека HAL работала для меня первой попытки.

Первые 2 вещи, чтобы попробовать

1. Просто питание PCA9685 на 3.3В

2. Удалите внешние подтягивания, затем напишите эскиз, в котором говорится, что задержка 3 секунды, а затем просто настраивает i2c, а затем ничего не делает, кроме как обходить в цикле. Затем измерьте напряжение на штифтах i2c во время запуска, если они в основном близки к 0 во время запуска, но затем перейдите к 3.3V через 3 секунды, когда I2C настроен, это говорит вам, что внутренние подтягивания участвуют, когда библиотека Ardunio настраивает I2C, и вам не понадобятся внешние подтягивания

Robo_pi
Чт, 06 сентября 2018 г., 2:54 утра
[Flyboy74 - Чт, 06 сентября 2018 г. 2:05 утра] - 1. Просто питание PCA9685 на 3.3В

2. Удалите внешние подтягивания, затем напишите эскиз, в котором говорится, что задержка 3 секунды, а затем просто настраивает i2c, а затем ничего не делает, кроме как обходить в цикле. Затем измерьте напряжение на штифтах i2c во время запуска, если они в основном близки к 0 во время запуска, но затем перейдите к 3.3V через 3 секунды, когда I2C настроен, это говорит вам, что внутренние подтягивания участвуют, когда библиотека Ardunio настраивает I2C, и вам не понадобятся внешние подтягивания
Это на самом деле была моя оригинальная настройка. Я изначально работал в PCA9685, используя 3.3V, потому что в соответствии с листом спецификации он должен работать на чем -либо от 3 до 5 вольт. Итак, я подумал, что запустить его на 3.3V может быть лучшей идеей, так как STM32 - 3.3V MCU. Я попробовал этот метод как без подтягиваний, а затем снова с подтягиванием. Я не мог заставить его работать с помощью 3.3 В. Именно тогда я перешел к использованию 5V для PCA9685, но все еще нет.

Я все еще подозреваю проблему с библиотекой PCA9685, так как AdaFruit предложил, чтобы их библиотека, возможно, потребуется изменить для этого MCU. Но я понятия не имею, как это изменить. Если мне нужно научиться изменять эту библиотеку, я думаю, мне потребуется довольно много времени, чтобы научиться это сделать. Тем более, что я не работаю над этим проектом на полный рабочий день.

Я полон решимости заставить это работать. Конечно, должен быть способ. Я удивлен, что нет никакой информации о том, как использовать эту «синюю таблетку» с платой PCA9685. Я видел видео о том, как использовать модуль GY521 с этой платой "синей таблетки". Это также использует i2c. У меня здесь есть несколько модулей GY521. Итак, так как у меня есть эта видео инструкция, я могу сначала попробовать эту доску. Эта проблема может быть уникальной для библиотеки PCA9685.

Я надеялся, что смогу опубликовать здесь и получить быстрое решение. : D

Но я думаю, что мне придется прибегнуть к старомодному способу, чтобы просто потратить много времени, чтобы узнать больше, попробовав некоторые другие проекты I2C в первую очередь.

Если я когда -нибудь заработаю эту работу, я вернусь и отправлю решение. Я предполагаю, что библиотека Adafruit должна быть каким -то образом изменена для MCU STM32F103C8. Я просто еще не знаю, как это сделать.

Кстати, у меня также есть несколько «черных» досок таблеток здесь. Они тоже STM32F103C8. Я тоже не смог заставить их работать с PCA9685. После того, как я найду решение, он, вероятно, будет работать для обеих этих плат STM32.

~~~~~

Примечание: я только начинаю с STM32. Мне нужно было перейти на меньшую общую плату, чтобы я мог установить ее в поезда G-масштаба, которые я собираюсь настроить на компьютерный контроль. Я полон решимости выучить эти MCU внутри и снаружи. Так что это просто вопрос времени. И когда я это сделаю, я также надеюсь сделать несколько видео на YouTube, чтобы поделиться тем, что я узнал.

Flyboy74
Чт, 06 сентября 2018 г., 3:11
Я только что прочитал справочное руководство как для STM32F103, так и для руководства для STM32F407.

Это был STM32F407, на котором я использовал I2C и не нуждался в внешних подтягиваниях, но глядя на руководство для STM32F103

Это из руководства STM32F103
i2c.jpg
i2c.JPG (40.38 киб) просмотрено 358 раз

Flyboy74
Чт, 06 сентября 2018 г., 3:19
Написать свою собственную библиотеку для работы PCA9685 довольно просто.

Здесь Либиар https: // github.com/outofthebots/esp32_p ... PCA9685.пирог что я написал. Как видите, это не так много кода, он написан на микропитоне, поэтому нужно будет переносить в Ardunio STM32, но с просмотром этого кода и чтением листа данных он не должен быть слишком сложно.

Это библиотека, которую я использовал для сервопривода на этом роботе https: // www.YouTube.com/watch?v = -myodfhwftu И этот робот https: // www.YouTube.com/watch?v = 9fhb7vb73dg

Robo_pi
Чт, 06 сентября 2018 г., 3:42
[Flyboy74 - Четверг 06, 2018 3:19 утра] - Написать свою собственную библиотеку для работы PCA9685 довольно просто.

Здесь Либиар https: // github.com/outofthebots/esp32_p ... PCA9685.пирог что я написал. Как видите, это не так много кода, он написан на микропитоне, поэтому нужно будет переносить в Ardunio STM32, но с просмотром этого кода и чтением листа данных он не должен быть слишком сложно.

Это библиотека, которую я использовал для сервопривода на этом роботе https: // www.YouTube.com/watch?v = -myodfhwftu И этот робот https: // www.YouTube.com/watch?v = 9fhb7vb73dg
Спасибо, что поделились кодом библиотеки. Я знаком с Python, так что ваш код легко мне прочитать. Мне нужно выяснить, как преобразовать это в то, что может использовать Arduino IDE. Но это выглядит достаточно просто. Я бы все равно предпочел бы написать свою собственную библиотеку. Так что это будет хороший опыт обучения для меня. Мне нравится, когда библиотеки действительно просты. Часто библиотеки включают много дополнительного кода для устройств, которые я никогда не буду использовать. Так что приятно иметь возможность понизить их только до того, что мне нужно.

Стивестронг
Чт, 06 сентября 2018 г. 8:30 утра
Самый простой способ определить проблему - сравнить сигналы I2C при использовании UNO с этим при использовании STM32F1.

Но вы также можете попробовать последователи:
1. Запустите эскиз сканера I2C - чтобы увидеть, обнаруживается ли ваша плата (устройство I2C) вообще
2. Замените TwoWire By Softwire (используйте программное обеспечение i2c вместо аппаратного обеспечения).
Были проблемы с симптомом, что программное обеспечение I2C работало, но HW i2c не. Один из них был решен здесь: https: // github.com/rogerclarkmelbourne/ ... 2/pull/508

Robo_pi
Чт, 06 сентября 2018 г. 14:23
[Стивестронг - Чт, 06 сентября 2018 г., 8:30 утра] - Самый простой способ определить проблему - сравнить сигналы I2C при использовании UNO с этим при использовании STM32F1.

Но вы также можете попробовать последователи:
1. Запустите эскиз сканера I2C - чтобы увидеть, обнаруживается ли ваша плата (устройство I2C) вообще
Спасибо, Стив! Я даже не знал, что был эскиз сканера i2c. Это сейчас в моем наборе инструментов!

Сканер сообщает: Сканирование...
Устройство I2C найдено на адресе 0x40 !
Устройство I2C найдено на адресе 0x70 !
сделанный
У меня подключено только одно устройство i2c, и я вызовет его как 0x40. Я не знаю, что такое адрес 0x70? Может быть, мне следует попробовать вызвать адрес в моем эскизе как 0x70 и посмотреть, поможет ли это.

Но, по крайней мере, это признает, что плата PCA9685 подключена. Приятно знать.
[Стивестронг - Чт, 06 сентября 2018 г., 8:30 утра] - 2. Замените TwoWire By Softwire (используйте программное обеспечение i2c вместо аппаратного обеспечения).
Были проблемы с симптомом, что программное обеспечение I2C работало, но HW i2c не. Один из них был решен здесь: https: // github.com/rogerclarkmelbourne/ ... 2/pull/508
Я смотрю в ваше предложение по софтоводу. Может это сработать.

Стивестронг
Чт, 06 сентября 2018 г. 15:27
Согласно техническим деталям совета: Эта плата/чип использует 7-битный адрес I2C между 0x40-0x7F, выбираемый с прыгунами. Вы уверены, что конфигурация вашего адреса в порядке?

Странно, что чип отвечает на два разных адреса.
Вы обязательно должны попробовать версию I2C Software (сначала сканер).

Flyboy74
Чт, 06 сентября 2018 г., 20:42
Сканирование...
Устройство I2C найдено на адресе 0x40 !
Устройство I2C найдено на адресе 0x70 !
Это нормально с PCA9685, он всегда отвечает на сканирование как на 0x40 (или выбранном адресе с прыгунами), так и 0x70, просто используйте 0x40

Robo_pi
Пт, сентябрь 07, 2018, 2:30
Проблема найдена и решена

Хорошо, я буду маркировкой как крупнейший в мире идиот с этого дня вперед.

Очевидно, при использовании процессора STM32 мне нужно использовать uint16_t для всех моих целых чисел, а не просто.

Использование просто просто "int" для чисел работает отлично на Arduino uno. Но по какой -то причине STM32 должен иметь все цифры, вызванные не знаменными 16 -битными целыми числами.

Так что это было.

Теперь все работает отлично.

Очевидно, библиотека Adafruit работает тоже хорошо с STM32F103C8.

Просто должен убедиться, что использовать значения uint16_t вместо просто.

Человек, мне потребовалось пару недель, чтобы обнаружить это. Но у меня есть оправдание, что просто просто работает на Uno. Так кто бы догадался, что это не сработает на STM32?

Flyboy74
Пт, сентябрь 07, 2018, 6:00
:)

Стивестронг
Пт, сентябрь 07, 2018 7:31
[Robo_pi - Пт, сентябрь 07, 2018 2:30] - Человек, мне потребовалось пару недель, чтобы обнаружить это. Но у меня есть оправдание, что просто просто работает на Uno. Так кто бы догадался, что это не сработает на STM32?
Эта проблема была вызвана на этот раз с помощью плохой техники кодирования.
Поскольку «int» имеет разные размеры на разных архитектурах, всегда рекомендуется использовать Int8/Int16/Int32 в коде, который предназначен для работы на нескольких архитектурах.
Это должен быть хороший урок для всех нас.

Robo_pi
Пт, сентябрь 07, 2018 13:54
[Стивестронг - Пт - Это должен быть хороший урок для всех нас.
Да, это, безусловно, ценный урок для меня. Я хотел бы, чтобы мой код был настолько портативным, насколько это возможно, по крайней мере между Uno, Mega, Blue Pill и Black Pill, так как это MCU, которые я сейчас разрабатываю вокруг. Конечно, из -за разницы в номерах PIN -код и их функциях не всегда возможно писать код, который он полностью переносительен без, по крайней мере, некоторых изменений номера PIN -кода. Тем не менее, приятно иметь код максимально портативным.

Мой оригинальный код был изменен из примера канала YouTube с использованием сервопривода PCA9685 и Arduino Uno. Это действительно хороший канал на YouTube под названием "Семинар Dronebot". Мне очень нравится внимание, которое он уделяет деталям в его видео. Но он использовал «int» в своих эскизах, которые, очевидно, отлично работают на Uno. Мне придется отправить ему электронное письмо и рассказать ему об этом, потому что я уверен, что он хотел бы знать. Он наклеитель для деталей. На самом деле, он обычно указывает на такие вещи. Видимо он тоже не знает об этом. Я уверен, что он упомянул об этом, если бы. Обычно он предлагает советы, такие как использование различных номеров PIN -кода на разных устройствах, но он не упомянул о необходимости вызов более точных целочисленных значений для разных MCU. Я пришлю ему электронное письмо, я уверен, что он будет признателен за информацию.

Кстати, вот ссылка на конкретное видео, где он описывает, как использовать PCA9685 сервопривод. В своем примере он использует 4 скользящих потенциометра, подключенные к аналоговым входным контактам ООН, и использует это для управления «Me Arm». Просто будьте осторожны, чтобы использовать это на STM32, вам нужно изменить int на uint16_t. Это действительно хорошо сделанное видео. Мне очень нравятся детали, в которые входит этот человек в своих видео.

Robo_pi
Пт, сентябрь 07, 2018, 14:54
Дополнительный вопрос I2C?

Если кто -то все еще читает эту ветку, у меня есть дополнительный вопрос.

Теперь, когда я получил i2c1 работать над Pins PB6, PB7 Я хотел бы посмотреть, смогу ли я также заставить это работать на I2C2 на PINS PB10, PB11.

Что мне нужно сделать для конкретной линии этой второй линии i2c?

Насколько я знаю, я ничего не сделал, чтобы сказать, чтобы использовать i2c1 или pb6, pb6. Так что я предполагаю, что i2c1 по умолчанию?

Как мне сказать, чтобы использовать вторые линии i2c?

Стивестронг
Пт, сентябрь 07, 2018, 15:31
1. Откройте adafruit_pwmservodriver.CPP
2. объявить вне какой -либо функции: TwoWire Wire2(2); // instead of HardWire Wire2(2);

Robo_pi
Пт
Я только что попробовал это и получил следующее сообщение об ошибке, когда пытаюсь скомпилироваться:
C: \ users \ james \ documents \ arduino \ библиотеки \ adafruit_pwm_servo_driver_library \ adafruit_pwmservoriver.CPP: 32: 1: ошибка: «Hardwire» не называет тип

Hardwire Wire2 (2);

^

C: \ users \ james \ documents \ arduino \ библиотеки \ adafruit_pwm_servo_driver_library \ adafruit_pwmservoriver.CPP: в конструкторе 'adafruit_pwmservoriver :: adafruit_pwmservoriver (uint8_t)':

C: \ users \ james \ documents \ arduino \ библиотеки \ adafruit_pwm_servo_driver_library \ adafruit_pwmservoriver.CPP: 40: 11: ошибка: 'Wire2' не был объявлен в этой области

_i2c = &Wire2;

^

Было найдено несколько библиотек для «Провода.час"
Используется: C: \ Program Files (x86) \ arduino \ ardware \ arduino_stm32-master \ stm32f1 \ libraries \
Не используется: C: \ Program Files (x86) \ arduino \ ardware \ arduino_stm32-master \ stm32f1 \ libraries \ Wireslave
Статус выхода 1
Компиляция ошибок для платы Generic STM32F103C Series.

Стивестронг
Сб 08 сентября 2018 г. 12:43
извините, это должно быть TwoWire Wire2(2);

Robo_pi
Сб 08 сентября 2018 г., 3:20 утра
[Стивестронг - SAT 08, 2018 12:43 AM] - извините, это должно быть TwoWire Wire2(2);

Моду
Пн 15 октября 2018 г., 11:40
[Стивестронг - Пт - Эта проблема была вызвана на этот раз с помощью плохой техники кодирования.
Поскольку «int» имеет разные размеры на разных архитектурах, всегда рекомендуется использовать Int8/Int16/Int32 в коде, который предназначен для работы на нескольких архитектурах.
Согласованный. Я должен добавить это из моего списка проблем с типичной библиотекой Arduino. Укажите свою битовую ширину, пожалуйста.

DHT22 Библиотека