16-Bit-ADC an Elektor-Linux-Board(Gnublin)

16-Bit-ADC an Elektor-Linux-Board(Gnublin)

Postby RoKo66 » Mon Oct 27, 2014 7:28 am

Ich habe mir das 16-bit Datenlogger-Modul aus dem September 2014-Heft gebaut und möchte dieses an mein Elektor-Linux-Board (8MB) anschließen. Von der Hardware-Seite aus betrachtet gibt es da keine Probleme, jedoch habe ich es bisher nicht geschafft, die Software-Library aus 130485-11.zip entsprechend anzupassen. Diese enthält zwar ein Beispielprogramm für Arduino-Boards, aber die Verbindung zum Elektor-Board fehlt mir irgendwie :?:
Ich benutze ELDK 5.5 als Entwicklungsumgebung für Programme auf dem Elektor-Linux-Board (unter Ubuntu).

Viele Grüße
RoKo66
RoKo66
 
Posts: 8
Joined: Sun Oct 26, 2014 6:51 pm

Re: 16-Bit-ADC an Elektor-Linux-Board(Gnublin)

Postby ag » Sat Nov 01, 2014 3:16 pm

Hallo RoKo66,

ich habe heute mein 16-bit Datenlogger-Modul erstmal zum laufen gebracht, und stehe auch so ziemlich am Anfang. Vielleicht können wir uns gegenseitig unterstützen um weiter zu kommen ;)

Hast du schon dein Modul mit dem Arduino Sketch getestet? Mir hat es nicht gefallen, dass der gelbe ALERT/RDY LED standig leuchtet. Ich habe deshalb im ADS1115 Datenblatt nachgesehen und anschließend in ads1x1x.c COMPARATOR_POLARITY_ACTIVE_LO durch COMPARATOR_POLARITY_ACTIVE_HI ersetzt.

Es gibt 2 Sketches. Im Heft wird Bezug genommen auf den in Verzeichnis ads1115. Im Heft wird die Initialisierung mit PGA_2048 beschrieben, aber im Sketch (nur die im Verzeichnis ads1115) wird mit PGA_4096 initialisiert. Ich habe das auch angepasst.

Da ich alle Lötarbeiten genau überprüft habe, scheint bei mir AIN1 defekt zu sein. Aber AIN0, AIN2 und AIN3 funktionieren alle, zumindest in "Single-ended" Modus, sodas das nicht weiter schlimm ist. Außerdem werde ich noch ein zweites Modul fertigstellen.

Um das Modul nun auf dem Elektor-Board zu benutzen, muss ein entsprechendes C oder C++ Programm erstellt werden. Da bin ich noch Anfänger. Ich werde damit beginnen zu versuchen, den Sketch auf C umzuschreiben. Dazu habe ich vor, Eclipse zu verwenden, so wie es im November 2013 Heft beschrieben ist.

Hast du schon mit dein C bzw. C++ Programmierung begonnen?

Viele Grüße,
Ag
ag
 
Posts: 531
Joined: Thu Jan 02, 2014 10:37 am

Re: 16-Bit-ADC an Elektor-Linux-Board(Gnublin)

Postby ag » Sun Nov 02, 2014 6:55 pm

Hallo RoKo66,

ich habe ein Projekt mit Eclipse erstellt und den Arduino Sketch in folgende C++ Code umgesetzt:

Code: Select all
/*
 * ads1115Test.cpp
 *
 *  Created on: Nov 2, 2014
 *      Author: elektor
 */

#include "gnublin.h"

// Include the bit-banged I2C driver.
#include "soft_i2c.h"

// Include the driver definition file.
#include "ads1x1x.h"

// Create an ADC object.
ADS1x1x_config_t my_adc;

gnublin_gpio sda_pin;
gnublin_gpio scl_pin;

void soft_i2c_delay(void)
{
   sleep(5);
}

void soft_i2c_sda_mode(uint8_t value)
{
   if (value==0) sda_pin.pinMode(01,INPUT); // use pull-ups on bus
   else sda_pin.pinMode(01,OUTPUT);
}

void soft_i2c_sda_write(uint8_t value)
{
   sda_pin.digitalWrite(01,value);
}

uint8_t soft_i2c_sda_read(void)
{
   return sda_pin.digitalRead(01);
}

void soft_i2c_scl_write(uint8_t value)
{
   scl_pin.digitalWrite(02,value);
}

// uint8_t ADS1x1x_i2c_start_write(uint8_t i2c_address)
// {
//    return soft_i2c_start_write(i2c_address);
// }

// uint8_t ADS1x1x_i2c_write(uint8_t x)
// {
//    return soft_i2c_write(x);
// }

// uint8_t ADS1x1x_i2c_start_read(uint8_t i2c_address, uint16_t bytes_to_read)
// {
//    return soft_i2c_start_read(i2c_address,bytes_to_read);
// }

// uint8_t ADS1x1x_i2c_read(void)
// {
//    return soft_i2c_read();
// }

// uint8_t ADS1x1x_i2c_stop(void)
// {
//    soft_i2c_stop();
//    return 0;
// }

// void setup(void)
// {
//      Serial.begin(115200);
//       Serial.println("13048 ADS1115 ADC borad");
//      Serial.println("(c) Elektor, 29/04/2014");
//      Serial.println("");
//
//       sda_pin.pinMode(01,OUTPUT);
//       scl_pin.pinMode(02,OUTPUT);
//       if (ADS1x1x_init(&my_adc, ADS1115, ADS1x1x_I2C_ADDRESS_ADDR_TO_GND, MUX_SINGLE_0, PGA_2048)==0)
//       {
//          Serial.println("Could not initialize ADC structure.");
//       }
// }

int main(void)
{
   // Loop over all possible input combinations.
   for (unsigned int input=0; input<0x8000; input+=0x1000)
      {
         // ADS1x1x_set_multiplexer(&my_adc,(ADS1x1x_mux_t)input);
         // ADS1x1x_start_conversion(&my_adc);

          // Default sample rate is 128 samples/s i.e. one sample every 7.8 ms.
         sleep(8);

         // Display result as voltage (remember, the PGA was set to 2.048 V)
         //Serial.println(ADS1x1x_read(&my_adc)*2.048/32767.0);
      }
   // Serial.println("---");
   sleep(500);
}



Die auskommentierte Zeilen habe ich noch nicht geschafft fehlerfrei zu übersetzten. Jegliche hilfreiche Hinweise dazu sind willkommen ;)

Viele grüße,
Ag
ag
 
Posts: 531
Joined: Thu Jan 02, 2014 10:37 am

Re: 16-Bit-ADC an Elektor-Linux-Board(Gnublin)

Postby ag » Mon Nov 03, 2014 7:41 pm

Hallo RoKo66,

nachdem ich ads1x1x.c und soft_i2c.c ins Projekt importierte, war es möglich alle vorher auskommentierte Funktionen ohne Fehlermeldungen zu kompilieren. Außerdem habe ich einige Korrekturen vorgenommen wegen SDA und SCL Pins, sowie die Wartezeiten. Hier meine aktuelle Coding:

Code: Select all
/*
 * ads1115Test.cpp
 *
 *  Created on: Nov 2, 2014
 *      Author: elektor
 */

#include "gnublin.h"

// Include the bit-banged I2C driver.
#include "soft_i2c.h"

// Include the driver definition file.
#include "ads1x1x.h"

// Create an ADC object.
ADS1x1x_config_t my_adc;

gnublin_gpio sda_pin;
gnublin_gpio scl_pin;

void soft_i2c_delay(void)
{
   sleep(0.005);
}

void soft_i2c_sda_mode(uint8_t value)
{
   if (value==0) sda_pin.pinMode(10,INPUT); // use pull-ups on bus
   else sda_pin.pinMode(00,OUTPUT);
}

void soft_i2c_sda_write(uint8_t value)
{
   sda_pin.digitalWrite(00,value);
}

uint8_t soft_i2c_sda_read(void)
{
   return sda_pin.digitalRead(00);
}

void soft_i2c_scl_write(uint8_t value)
{
   scl_pin.digitalWrite(02,value);
}

 uint8_t ADS1x1x_i2c_start_write(uint8_t i2c_address)
 {
    return soft_i2c_start_write(i2c_address);
 }

 uint8_t ADS1x1x_i2c_write(uint8_t x)
 {
    return soft_i2c_write(x);
 }

 uint8_t ADS1x1x_i2c_start_read(uint8_t i2c_address, uint16_t bytes_to_read)
 {
    return soft_i2c_start_read(i2c_address,bytes_to_read);
 }

 uint8_t ADS1x1x_i2c_read(void)
 {
    return soft_i2c_read();
 }

 uint8_t ADS1x1x_i2c_stop(void)
 {
    soft_i2c_stop();
    return 0;
 }

 void setup(void)
 {
//      Serial.begin(115200);
//       Serial.println("13048 ADS1115 ADC borad");
//      Serial.println("(c) Elektor, 29/04/2014");
//      Serial.println("");
//
       sda_pin.pinMode(00,OUTPUT);
       scl_pin.pinMode(02,OUTPUT);
       if (ADS1x1x_init(&my_adc, ADS1115, ADS1x1x_I2C_ADDRESS_ADDR_TO_GND, MUX_SINGLE_0, PGA_2048)==0)
       {
//          Serial.println("Could not initialize ADC structure.");
       }
 }

int main(void)
{
   // Loop over all possible input combinations.
   for (unsigned int input=0; input<0x8000; input+=0x1000)
      {
          ADS1x1x_set_multiplexer(&my_adc,(ADS1x1x_mux_t)input);
          ADS1x1x_start_conversion(&my_adc);

          // Default sample rate is 128 samples/s i.e. one sample every 7.8 ms.
         sleep(0.008);

         // Display result as voltage (remember, the PGA was set to 2.048 V)
         //Serial.println(ADS1x1x_read(&my_adc)*2.048/32767.0);
      }
   // Serial.println("---");
   sleep(0.5);
}



Ich denke dass ich kommende Wochenende schon auf dem Gnublin testen kann. Ich muss nur noch die serielle Ausgabe noch hinbekommen.

Vielleicht kannst du schon mit dem Code etwas anfangen.

Gruß,
Ag
ag
 
Posts: 531
Joined: Thu Jan 02, 2014 10:37 am

Re: 16-Bit-ADC an Elektor-Linux-Board(Gnublin)

Postby RoKo66 » Wed Nov 05, 2014 9:07 am

Hallo ag,

Du hast mir mit dem Code und Deinen Hinweisen schon sehr weiter geholfen :) - inzwischen habe ich auch die Ausgabe realisiert. Allerdings werden vom Board noch keine vernünftigen Werte geliefert (-6.25019e-05 in allen 8 Konfigurationen). Ich war mir nicht sicher, ob die sleep-Funktion in Deinem Code richtig funktioniert, da sie als Parameter einen Integer-Wert erwartet. Ich habe sie dann durch usleep ersetzt, was allerdings auch zu keiner Veränderung führte. :(

Viele Grüße
RoKo66
Attachments
ADS1115_Test3.cpp
(2.61 KiB) Downloaded 44 times
RoKo66
 
Posts: 8
Joined: Sun Oct 26, 2014 6:51 pm

Re: 16-Bit-ADC an Elektor-Linux-Board(Gnublin)

Postby ag » Wed Nov 05, 2014 3:29 pm

Hallo RoKo66,

ich vermute dass die i2c Verbindung noch nicht zustande kommt, weil ich 2 GPIO Pins für SDA und SCL definiert hatte anstatt die dafür vorgesehene und vorhandene Pins auf den Gnublin Connector. Wenn du das Modul mit dem Gnublin Connector verbindest besteht keine Verbindung zu GPIO 00 und GPIO 02 - und so kann es nicht funktionieren. Ich muss erst durch die Gnublin Wiki über die i2c Schnittstelle lesen, bevor ich weiß wie das im Programm richtig einzustellen ist. Möglicherweise würde es so funktionieren, wenn man die Pin Verbindungen nicht mit den Steckern sondern mit einzelne Drähte herstellen würde, aber vermutlich nicht. Da muss ich noch ein bisschen Grübeln. Aber vielleicht weißt du da schon was zu tun ist.

Viele Grüße
Ag
ag
 
Posts: 531
Joined: Thu Jan 02, 2014 10:37 am

Re: 16-Bit-ADC an Elektor-Linux-Board(Gnublin)

Postby ag » Sat Nov 08, 2014 7:32 pm

Hallo RoKo66,

ich habe heute mein Board auf dem Gnublin getestet, und konnte nach ein Paar Korrekturen das Programm zum laufen bringen.

Mein derzeitige Kenntnisstand ist folgende: obwohl der Arduino ein I2C Schnittstelle hat, ist diese durch das fehlende #include "wire.h" nicht aktiviert. Dementsprechend ist der ads1115 Sketch für "bit-banging" ausgelegt (durch Software emuliertes I2S Schnittstelle via GPIO Pins). Die von mir portiertes C++ Programm ist deshalb auch auf "bit-banging" ausgelegt. Um eine einfache Anschluß via 14-Polige Flachband zu ermöglichen, wollte ich die auf dem Gnublin vorhanden Hardware I2C Schnittstelle (Pins 5 und 6)verwenden. Dazu gibt es genügende Info im Web, aber ich habe noch nicht herausgefunden, wie der ads1115 ohne "bit-banging" angesteuert werden kann. Deshalb habe ich zunächst das Programm auf "bit-banging" belassen, und dafür die am Anschluß X4 vorhandene GPIO Pins GPIO11 und GPIO15 als SCL bzw. SDA definiert. Dann habe ich die Verbindung mit dem Board entsprechend mit einzelne Drähte hergestellt (siehe Anhang).

Beim 1. Test viel mir auf, dass keine SCL Signal vorlag, und der Textausgabe in Routine "Setup()" erschien nicht, nur 8 mal -6.25019e-05, wie bei dir.

Ich habe deshalb als 1. Zeile in MAIN den Aufruf von Setup(); eingesetzt. Nun wird der Setup durchgeführt, und ich bekomme "richtige" Werte zurück anstatt immer -6.25019e-05. Ich habe eine fast leere AA Zelle, die nur noch 0,5 Volt am Multimeter zeigt, zwischen AIN0 und GND angeklemmt. Leider zeigt das Board eine Ganz ander Wert, aber es zeigt zumindest ein Wert. Da muss ich noch weiter experimentieren, aber es geht weiter.

Hier ist meine aktuelle Coding:

Code: Select all
/*
 * ads1115Test.cpp
 *
 *  Created on: Nov 2, 2014
 *      Author: elektor
 */

#include "gnublin.h"
#include <iostream>

// Include the bit-banged I2C driver.
#include "soft_i2c.h"

// Include the driver definition file.
#include "ads1x1x.h"

// Create an ADC object.
ADS1x1x_config_t my_adc;

gnublin_gpio sda_pin;
gnublin_gpio scl_pin;

void soft_i2c_delay(void)
{
   usleep(5);
}

void soft_i2c_sda_mode(uint8_t value)
{
   if (value==0) sda_pin.pinMode(15,INPUT); // use pull-ups on bus
   else sda_pin.pinMode(15,OUTPUT);
}

void soft_i2c_sda_write(uint8_t value)
{
   sda_pin.digitalWrite(15,value);
}

uint8_t soft_i2c_sda_read(void)
{
   return sda_pin.digitalRead(15);
}

void soft_i2c_scl_write(uint8_t value)
{
   scl_pin.digitalWrite(11,value);
}

 uint8_t ADS1x1x_i2c_start_write(uint8_t i2c_address)
 {
    return soft_i2c_start_write(i2c_address);
 }

 uint8_t ADS1x1x_i2c_write(uint8_t x)
 {
    return soft_i2c_write(x);
 }

 uint8_t ADS1x1x_i2c_start_read(uint8_t i2c_address, uint16_t bytes_to_read)
 {
    return soft_i2c_start_read(i2c_address,bytes_to_read);
 }

 uint8_t ADS1x1x_i2c_read(void)
 {
    return soft_i2c_read();
 }

 uint8_t ADS1x1x_i2c_stop(void)
 {
    soft_i2c_stop();
    return 0;
 }

 void setup(void)
 {
//      Serial.begin(115200);
//       Serial.println("13048 ADS1115 ADC board");
//        printf("13048 ADS1115 ADC board");
        cout << "13048 ADS1115 ADC board" << endl;
//      Serial.println("(c) Elektor, 29/04/2014");
        cout << "(c) Elektor, 29/04/2014" << endl;
//      Serial.println("");
//
       sda_pin.pinMode(15,OUTPUT);
       scl_pin.pinMode(11,OUTPUT);
       if (ADS1x1x_init(&my_adc, ADS1115, ADS1x1x_I2C_ADDRESS_ADDR_TO_GND, MUX_SINGLE_0, PGA_2048)==0)
       {
//          Serial.println("Could not initialize ADC structure.");
          cout << "Could not initialize ADC structure" << endl;
       }
 }

int main(void)
{
   setup();
   unsigned int i = 1;
   while (i <= 3)
   {
      // Loop over all possible input combinations.
      for (unsigned int input=0; input<0x8000; input+=0x1000)
         {
             ADS1x1x_set_multiplexer(&my_adc,(ADS1x1x_mux_t)input);
             ADS1x1x_start_conversion(&my_adc);

            // Default sample rate is 128 samples/s i.e. one sample every 7.8 ms.
            usleep(7813);

            // Display result as voltage (remember, the PGA was set to 2.048 V)
            //Serial.println(ADS1x1x_read(&my_adc)*2.048/32767.0);
            //printf(ADS1x1x_read(&my_adc)*2.048/32767.0);
            //printf("some value");
            cout << ADS1x1x_read(&my_adc)*2.048/32767.0 << endl;
         }
      // Serial.println("---");
      cout << "---" << endl;
      usleep(500000);
      i++;
   }
}



Hier die Ausgabe beim Test auf dem Gnublin:
/
Last login: Sat Nov 8 19:28:58 2014 from elektor-virtualbox.fritz.box
root@gnublin:~# ./ADS1115
13048 ADS1115 ADC board
-0.0367511
-0.0390637
-0.0390637
1.02397
-0.195568
1.02397
1.02397
1.02397
---
-0.0368136
-0.0355636
1.02397
1.02397
-0.197131
1.02397
1.02397
1.02397
---
-0.0388137
-0.0390637
1.02397
1.02397
-0.196443
2.048
1.02397
1.02397
---
root@gnublin:



Viele Grüße,
Attachments
20141108_193155.jpg
Anschluss an Gnublin
Ag
ag
 
Posts: 531
Joined: Thu Jan 02, 2014 10:37 am

Re: 16-Bit-ADC an Elektor-Linux-Board(Gnublin)

Postby RoKo66 » Sun Nov 09, 2014 4:34 pm

Hallo Ag,

ich habe mir heute einmal die Signale auf den Leitungen SDA und SCL mit dem Analyzer angeschaut. Das Ganze sieht schon sehr nach einer beginnenden I2C-Kommunikation aus, soll heissen Ruhelage, Start-Bedingung, Senden der Adresse funktioniert soweit schon gut, allerdings habe ich den Eindruck, dass der ADS1115 nicht richtig antwortet. Ich muss jetzt mal genau schauen, wie die Verbindung denn Byte für Byte ablaufen soll...

Konntest Du denn Dein ADC-Board mit der vorhandenen Library an einem Arduino testen? Es wäre ja gut zu wissen, dass sie damit funktioniert.

Ich denke, dass wir schon ziemlich weit gekommen sind und es nur an irgendeiner Kleinigkeit hängt...

Viele Grüße
RoKo66
RoKo66
 
Posts: 8
Joined: Sun Oct 26, 2014 6:51 pm

Re: 16-Bit-ADC an Elektor-Linux-Board(Gnublin)

Postby ag » Sun Nov 09, 2014 4:58 pm

Hallo RoKo66,

ich habe heute den ganzen Tag versucht herauszubekommen, wie die Werte zustande kommen wenn das Board zusammen mit dem Gnublin läuft. Leider ohne Erfolg. Ich habe die Ausgabe umgestellt, sodass nur die Integerwert ausgegeben wird (cout << ADS1x1x_read(&my_adc) << endl;), und dann eine neue AA Batterie über eine 1 MegOhm Poti zwischen AIN3 und GND angeschlossen. Wenn ich dann der Schleifer langsam von 0 Volt in Richtung 1,5 Volt hoch drehe, gibt der Board immer kleiner werdende minus Intergerwerte aus, solange bis auf es von Minus bis über die Null läuft (bei ca. 0,8 Volt laut meine DVM), und dann gibt der Board plötzlich positive Intergerwert 16383 aus. Es bleibt dann auch weiter bei 16383 auch wenn ich weiter bis nach 1,5 Volt drehe. Erst wenn ich wieder zurück drehe unter ca. 0,8 Volt springt die Ausgabe weider auf kleine, dann immer grosser werdende Minuswerte. Ich dachte schon, ich hätte den ADS1115 irgendwie kaput gemacht, also habe ich den wieder am Arduino angeschlossen. Da funktioniert es aber nach wie vor ohne Probleme, und zwar mit dem gleichen Libraries wie im Gnublin Programm verwendet. Also mir scheint als würde die Libraries, entgegen die Aussagen im Heft, nicht für den Gnublin geeignet sind. Jedenfalls bin ich nun mit mein Latein am Ende, und muss wohl auf dem nächsten vorangekündigten Projekt vom Elektor warten, wo es um den Demo-Programm für den Embedded Firmware Library geht, es sei denn, du schaffst es, irgendwie Durchblick in das Ganze zu finden.

Viele Grüße,
Ag
ag
 
Posts: 531
Joined: Thu Jan 02, 2014 10:37 am

Re: 16-Bit-ADC an Elektor-Linux-Board(Gnublin)

Postby ag » Mon Nov 10, 2014 4:51 pm

Hallo RoKo66,

es läßt mich keine Ruhe, daher suche ich doch noch weiter. Ich bin ein Dummy im Bezug auf C bzw. C++, aber könnte es sein, dass das Problem, die ich im letzen Post geschildert habe, daran liegt, dass ADS1x1x_read als int16_t deklariert ist aber die darin aufgerufene ADS1x1x_read_register ein Wert von Typ uint16_t zurück gibt? Und doch funktioniert das zumindest beim Arduino. Weiß du, wie ich am besten vorgehen soll, um zu eruieren, ob es tatsächlich daran liegt bzw. das zu korrigieren?

Vielen Dank und viele Grüße,
Ag
ag
 
Posts: 531
Joined: Thu Jan 02, 2014 10:37 am

Next

Return to Elektor-Mikrocontroller-Forum

Who is online

Users browsing this forum: No registered users and 1 guest