Использование I2C для управления одним из трех цифровых потенциометров DS3502 Adafruit на одной шине I2C
Мой товарищ по команде и я недавно приобрели несколько цифровых потенциометров DS3502 (https://learn.adafruit.com/ds3502-i2c-potentiometer/pinouts) от Adafruit, и мы хотели бы иметь возможность управлять ими по одному с Arduino, пока все они подключены к одной шине I2C. В то время как Adafruit предоставляет пример кода для управления этим устройством, когда не используются входы A0 и A1, они, к сожалению, не предоставляют код для индивидуального обращения к одному потенциометру, расположенному на той же шине I2C, что и другие цифровые pot.
Мы с моим товарищем по команде задавались вопросом, как мы будем использовать Arduino для управления каждым банком по очереди, если все они находятся в одном автобусе. Мы знаем, что A0 и A1 должны быть привязаны к Vcc в разных конфигурациях, чтобы изменить адрес (например, привязка A0 к Vcc приведет к получению адреса 0x29), мы просто не знаем, какими должны быть фактические строки кода для записи значения в этот потенциометр.
Мы также знаем, что нам нужно использовать библиотеку wire, у нас просто недостаточно опыта использования I2C, чтобы знать, какими должны быть фактические команды. Спасибо за всю помощь!
@Matthew, 👍1
Обсуждение2 ответа
Неважно, ответил на мой собственный вопрос, приветствую всех!
// получаем значение стеклоочистителя для 2 Adafruit DS3502 на одной шине I2C
// они адресованы 0x28 (без изменений для платы) и 0x29 (от 0 до высокого)
// для потомков также изменены значения для проверки
#include <SoftwareSerial.h>
#include <Adafruit_DS3502.h>
Adafruit_DS3502 ds3502_0 = Adafruit_DS3502();
Adafruit_DS3502 ds3502_1 = Adafruit_DS3502();
void setup() {
Serial.begin(9600);
if (!ds3502_0.begin(0x28)) {
Serial.println("Couldn't find DS3502_0 chip");
Serial.println("-END-");
while (1);
}
Serial.print("Found DS3502 chip 0 - getting current wiper value... ");
Serial.println(ds3502_0.getWiper());
//ds3502_0.Установщик (70);
if (!ds3502_1.begin(0x29)) {
Serial.println("Couldn't find DS3502_1 chip");
Serial.println("-END-");
while (1);
}
Serial.print("Found DS3502 chip 1 - getting current wiper value... ");
Serial.println(ds3502_1.getWiper());
ds3502_1.setWiper(80);
}
void loop() {
delay(100) ;
}
Вы заявляете: "Мы знаем, что A0 & A1 должен быть привязан к Vcc в разных конфигурациях, чтобы изменить адрес (например, привязка A0 к Vcc сделает адрес 0x29), мы просто не знаем, какие фактические строки кода должны быть для записи значения в этот потенциометр. ." Вы можете соединить контакты A0 и A1 по этому шаблону, вы получите 4 разных адреса при сканировании. 00, 01, 10, 11 Расположение перемычек, 0 = открыт и 1 = перемычка или наоборот, это не имеет значения, это повлияет только на адрес устройства. Каждому из них вы пишете одинаково, за исключением адреса. 0x29 будет записываться на одно устройство, остальные три будут иметь разные адреса: 0x28, 0x2A и 0X2B.
- Как изменить скорость нескольких сервоприводов, работающих одновременно с модулем PCA9685?
- Одновременное использование SDA и SCL с аналоговыми входами
- Как подключить несколько акселерометров MMA8451 (протокол I2C) с помощью одного Arduino Mega
- Настроить Trinket M0 в качестве периферийного устройства I2C
- Одинаковый вывод на дисплеях с разными I2C-адресами (библиотека AdaFruit, ESP32)
- Когда я проверяю скетч, я получаю несколько ошибок
- у меня возникают странные проблемы при попытке прочитать форму последовательного соединения gps
- как подключить вторую плату Adafruit TMP117 к моему Adafruit Metro по I2C?
Итак, вы хотите использовать библиотеку Adafruit для связи с DS3502 или вы хотите запрограммировать это самостоятельно, используя библиотеку Wear напрямую? С помощью библиотеки adafruit вы можете просто предоставить каждому объекту
Adafruit_DS3502
соответствующий адрес в качестве параметра его функцииbegin()
, @chrislСтроки A0 и A1 определяют адрес банка. Допускается одно устройство с заданным адресом на шине I2C. Контакты A0 / A1 устанавливают два нижних бита адреса I2C. На плате есть понижающие резисторы, поэтому подключите их к VDD, чтобы установить биты на '1'. Они считываются только при включении питания, поэтому выполните цикл включения, чтобы сбросить адрес. Адрес по умолчанию - 0x28. Например, если только A0 привязан к VDD, адрес равен 0x28 + 1 = 0x29 Если к VDD привязан только A1, адрес равен 0x28 + 2 = 0x2A Если A1 привязан к VDD, а A0 привязан к VDD, адрес равен 0x28 + 2 + 1 = 0x2B. Попробуйте найти их с помощью сканера I2C., @Gil
можете ли вы контролировать хотя бы один банк?, @jsotola
Управляйте входами A0 горшков с помощью gpio., так что вы можете переключать адреса отдельных горшков между 0x2b и 0x2a. Затем вы всегда записываете только в 0x2b и выбираете нужное ведомое устройство, вводя значение A0 high ., @Sim Son