ADS1015 adresace dvou modulů

Odpovědět
daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

ADS1015 adresace dvou modulů

Příspěvek od daton »

Ahoj všem
potřeboval bych poradit, jak adresovat dva moduly ADC převodníku připojené přes I2C na arduino.
S jedním modulem není problém. Adresace na modulech je upravena tak aby první modul měl adresu 0x48 a druhý pak 0x49.
Problém začal když jsem to chtěl naadresovat v programu. Na googlu jsem toho moc nezjistil a tedy se obracím na vás zda by mi s tím někdo nepomohl. Myslím že idea spočívá v tom zapsat při načítání vstupu z modulu i tu adresu. Ale dle codu co je přiložen to nefunguje i když podle té knihovny by to snad jít mělo. Prosím zkuste na to někdo mrknout a poradit jak by to mělo být. Zde je ten můj kod co le nefunguje. Knihovna je z Adafruitu co je v repozitaži IDE.

Kód: Vybrat vše

#include <Wire.h>
#include <Adafruit_ADS1015.h>

// Adafruit_ADS1115 ads;  /* Use this for the 16-bit version */
Adafruit_ADS1015 ads1015(0x49);     /* Use thi for the 12-bit version */
//Adafruit_ADS1015 ads1015;
void setup(void) 
{
  Serial.begin(9600);
  Serial.println("Hello!");
  
  Serial.println("Getting single-ended readings from AIN0..3");
  Serial.println("ADC Range: +/- 6.144V (1 bit = 3mV/ADS1015, 0.1875mV/ADS1115)");
  
  // The ADC input range (or gain) can be changed via the following
  // functions, but be careful never to exceed VDD +0.3V max, or to
  // exceed the upper and lower limits if you adjust the input range!
  // Setting these values incorrectly may destroy your ADC!
  //                                                                ADS1015  ADS1115
  //                                                                -------  -------
  // ads.setGain(GAIN_TWOTHIRDS);  // 2/3x gain +/- 6.144V  1 bit = 3mV      0.1875mV (default)
  // ads.setGain(GAIN_ONE);        // 1x gain   +/- 4.096V  1 bit = 2mV      0.125mV
  // ads.setGain(GAIN_TWO);        // 2x gain   +/- 2.048V  1 bit = 1mV      0.0625mV
  // ads.setGain(GAIN_FOUR);       // 4x gain   +/- 1.024V  1 bit = 0.5mV    0.03125mV
  // ads.setGain(GAIN_EIGHT);      // 8x gain   +/- 0.512V  1 bit = 0.25mV   0.015625mV
  // ads.setGain(GAIN_SIXTEEN);    // 16x gain  +/- 0.256V  1 bit = 0.125mV  0.0078125mV
  
  ads1015(0x48).begin();
  ads1015(0x49).begin();
}

void loop(void) 
{
  int16_t adc0, adc1, adc2, adc3, adc4, adc5, adc6, adc7;

 // adc0 = ads1015(0x48).readADC_SingleEnded(0);
//  adc1 = ads1015.readADC_SingleEnded(1);
 // adc2 = ads1015.readADC_SingleEnded(2);
 // adc3 = ads1015.readADC_SingleEnded(3);
  adc4 = ads1015(0x49).readADC_SingleEnded(0);
  adc5 = ads1015(0x49).readADC_SingleEnded(1);
  adc6 = ads1015(0x49).readADC_SingleEnded(2);
  adc7 = ads1015(0x49).readADC_SingleEnded(3);
  Serial.print("AIN0: "); Serial.println(adc0);
  Serial.print("AIN1: "); Serial.println(adc1);
  Serial.print("AIN2: "); Serial.println(adc2);
  Serial.print("AIN3: "); Serial.println(adc3);
  Serial.println(" ");
  
  delay(1000);
}
Uživatelský avatar
Dex
Administrátor
Příspěvky: 1519
Registrován: 16 úno 2013, 14:26

Re: ADS1015 adresace dvou modulů

Příspěvek od Dex »

Dva moduly = dva objekty :)

Tam nahoře jak definuješ "ads objekt" musíš vyrobit ještě jeden pro druhý modul. Jeden pak "nastartuješ" s jednou adresou a druhý s druhou.
"all your robots are belong to us"
robodoupe.cz
daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

Re: ADS1015 adresace dvou modulů

Příspěvek od daton »

Jo to byl taky jeden z pokusů co jsem dělal ale ono to nepřipouští dva objekty s různou adresou jen jeden proto tam zbyl jen ten s adresou 0X49 s tou druhou jsem to na zkoušku smazal . Chyba se táhne asi již otamtud - nelze to nakonfigurovat na dvě adresy. Ale pak jsem zkusil jen tu jednu a chyba se objevila dole v řádku čtení, kde to prostě tu adresu taky nechce. Netuším jak to udělat. V chybovém kodu je toto při zadání dvou objektů s ruznými adresami nahoře

Kód: Vybrat vše

vstupy1:6: error: redefinition of 'Adafruit_ADS1015 ads1015'

 Adafruit_ADS1015 ads1015(0x49);     /* Use thi for the 12-bit version */

                         ^

C:\Users\Jarmil\Documents\Arduino\SOLSERVII\vstupy1\vstupy1.ino:5:18: note: 'Adafruit_ADS1015 ads1015' previously declared here

 Adafruit_ADS1015 ads1015(0x48); 

                  ^

C:\Users\Jarmil\Documents\Arduino\SOLSERVII\vstupy1\vstupy1.ino: In function 'void setup()':

vstupy1:29: error: no match for call to '(Adafruit_ADS1015) (int)'

   ads1015(0x48).begin();

               ^

vstupy1:30: error: no match for call to '(Adafruit_ADS1015) (int)'
A toto při chybě v řádku čtení s adresou:

Kód: Vybrat vše

vstupy1:43: error: no match for call to '(Adafruit_ADS1015) (int)'

   adc6 = ads1015(0x49).readADC_SingleEnded(2);

                      ^

vstupy1:44: error: no match for call to '(Adafruit_ADS1015) (int)'

   adc7 = ads1015(0x49).readADC_SingleEnded(3);

                      ^

exit status 1
no match for call to '(Adafruit_ADS1015) (int)'
Uživatelský avatar
Dex
Administrátor
Příspěvky: 1519
Registrován: 16 úno 2013, 14:26

Re: ADS1015 adresace dvou modulů

Příspěvek od Dex »

Každý objekt potřebuje svoje vlastní jméno. Když budeš na jeden volat "Pavle" a na druhý taky "Pavle", tak jak má ten první vědět, že voláš na něj a ne na toho druhého (a naopak) :)

Takže musíš vyrobit třeba ads1015A a ads1015B a pak může každý dostat svoji adresu.
"all your robots are belong to us"
robodoupe.cz
daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

Re: ADS1015 adresace dvou modulů

Příspěvek od daton »

Super Dexi díky povedlo se kod má být takto:

Kód: Vybrat vše

#include <Wire.h>
#include <Adafruit_ADS1015.h>

// Adafruit_ADS1115 ads;  /* Use this for the 16-bit version */
Adafruit_ADS1015 ads1015A(0x48); 
Adafruit_ADS1015 ads1015B(0x49);     /* Use thi for the 12-bit version */
//Adafruit_ADS1015 ads1015;
void setup(void) 
{
  Serial.begin(9600);
  Serial.println("Hello!");
  
  Serial.println("Getting single-ended readings from AIN0..3");
  Serial.println("ADC Range: +/- 6.144V (1 bit = 3mV/ADS1015, 0.1875mV/ADS1115)");
  
  // The ADC input range (or gain) can be changed via the following
  // functions, but be careful never to exceed VDD +0.3V max, or to
  // exceed the upper and lower limits if you adjust the input range!
  // Setting these values incorrectly may destroy your ADC!
  //                                                                ADS1015  ADS1115
  //                                                                -------  -------
  // ads.setGain(GAIN_TWOTHIRDS);  // 2/3x gain +/- 6.144V  1 bit = 3mV      0.1875mV (default)
  // ads.setGain(GAIN_ONE);        // 1x gain   +/- 4.096V  1 bit = 2mV      0.125mV
  // ads.setGain(GAIN_TWO);        // 2x gain   +/- 2.048V  1 bit = 1mV      0.0625mV
  // ads.setGain(GAIN_FOUR);       // 4x gain   +/- 1.024V  1 bit = 0.5mV    0.03125mV
  // ads.setGain(GAIN_EIGHT);      // 8x gain   +/- 0.512V  1 bit = 0.25mV   0.015625mV
  // ads.setGain(GAIN_SIXTEEN);    // 16x gain  +/- 0.256V  1 bit = 0.125mV  0.0078125mV
  
  ads1015A.begin();
  ads1015B.begin();
}

void loop(void) 
{
  int16_t adc0, adc1, adc2, adc3, adc4, adc5, adc6, adc7;

  adc0 = ads1015A.readADC_SingleEnded(0);
  adc1 = ads1015A.readADC_SingleEnded(1);
  adc2 = ads1015A.readADC_SingleEnded(2);
  adc3 = ads1015A.readADC_SingleEnded(3);
  adc4 = ads1015B.readADC_SingleEnded(0);
  adc5 = ads1015B.readADC_SingleEnded(1);
  adc6 = ads1015B.readADC_SingleEnded(2);
  adc7 = ads1015B.readADC_SingleEnded(3);
  Serial.print("AIN0: "); Serial.println(adc0);
  Serial.print("AIN1: "); Serial.println(adc1);
  Serial.print("AIN2: "); Serial.println(adc2);
  Serial.print("AIN3: "); Serial.println(adc3);
  Serial.print("AIN4: "); Serial.println(adc4);
  Serial.print("AIN5: "); Serial.println(adc5);
  Serial.print("AIN6: "); Serial.println(adc6);
  Serial.print("AIN7: "); Serial.println(adc7);
  Serial.println(" ");
  
  delay(1000);
}
Kdyby náhodou někdo potřeboval a nevěděl tak too je funkční :D
Uživatelský avatar
Dex
Administrátor
Příspěvky: 1519
Registrován: 16 úno 2013, 14:26

Re: ADS1015 adresace dvou modulů

Příspěvek od Dex »

Rádo se stalo :D
"all your robots are belong to us"
robodoupe.cz
Odpovědět