Использование 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, чтобы знать, какими должны быть фактические команды. Спасибо за всю помощь!

, 👍1

Обсуждение

Итак, вы хотите использовать библиотеку 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


2 ответа


0

Неважно, ответил на мой собственный вопрос, приветствую всех!

// получаем значение стеклоочистителя для 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) ;
}

,

0

Вы заявляете: "Мы знаем, что A0 & A1 должен быть привязан к Vcc в разных конфигурациях, чтобы изменить адрес (например, привязка A0 к Vcc сделает адрес 0x29), мы просто не знаем, какие фактические строки кода должны быть для записи значения в этот потенциометр. ." Вы можете соединить контакты A0 и A1 по этому шаблону, вы получите 4 разных адреса при сканировании. 00, 01, 10, 11 Расположение перемычек, 0 = открыт и 1 = перемычка или наоборот, это не имеет значения, это повлияет только на адрес устройства. Каждому из них вы пишете одинаково, за исключением адреса. 0x29 будет записываться на одно устройство, остальные три будут иметь разные адреса: 0x28, 0x2A и 0X2B.

,