Arduino: Soft-I2C-Lib - Datenpin on the fly umdefinieren?

(Firma: Q3) #5592630
Lesenswert?

Ich muss an einem Arduino Nano 5 I2C-Sensoren auslesen, die leider keine 
Adresscodierung auf ihren Breakout-Boards anbieten, also eine feste 
Adresse haben.

Als Lösung dacht ich mir, mithilfe der Library Soft-I2C einfach die 
Datenleitungen der Sensoren an 5 verschiedene Arduino-Pins anzuschießen 
und den jeweiligen Pin vor jedem Auslesen on-the-fly umzudefinieren bzw. 
umzuschalten.

Das Auslesen muss nicht besonders schnell erfolgen, so dass das sicher 
kein Zeitproblem darstellt, sofern es überhaupt funktioniert.

Die entscheidende Zeile ist:
1
SoftWire i2c(sdaPin, sclPin);

Dumme Frage: Kann das beliebig of neu ausgeführt werden, oder klappt das 
nur einmal im Setup-Bereich?
Gast #5592665
Lesenswert?

Frank E. schrieb:
> Kann das beliebig of neu ausgeführt werden, oder klappt das
> nur einmal im Setup-Bereich?

Ich habe es nicht ausprobiert aber ich ich denke, das sollte gehen. 
Dabei wird aber jedesmal eine neue Instanz von dem Objekt erzeugt, was 
je nach Konstellation den Speicher fragmentieren könnte.

Wenn du das Objekt nicht global deklarierst, sondern nur innerhalb der 
Funktion wo es benutzt wird, reduzierst du die Gefahr, den Heap zu 
fragmentieren.
(Firma: Q3) #5592673
Lesenswert?

Stefanus F. schrieb:
> Frank E. schrieb:
>> Kann das beliebig of neu ausgeführt werden, oder klappt das
>> nur einmal im Setup-Bereich?
>
> Ich habe es nicht ausprobiert aber ich ich denke, das sollte gehen.
> Dabei wird aber jedesmal eine neue Instanz von dem Objekt erzeugt, was
> je nach Konstellation den Speicher fragmentieren könnte.
>
> Wenn du das Objekt nicht global deklarierst, sondern nur innerhalb der
> Funktion wo es benutzt wird, reduzierst du die Gefahr, den Heap zu
> fragmentieren.

Ja, danke, das ist Plan A: Instantiierung und Abfrage in einer Funktion, 
Sensorauswahl als Parameter. Ich werde berichten ...
#5593038
Lesenswert?

Frank E. schrieb:
> Dumme Frage: Kann das beliebig of neu ausgeführt werden, oder klappt das
> nur einmal im Setup-Bereich?

Nur einmal, denn das sieht für mich schwerstens nach einem C++ 
Konstruktor aus.

Wie gut ist Dein C++? Ich hätte mir die Lib mal kurz im Source 
angeschaut -

falls https://github.com/stevemarple/SoftWire/tree/master/src kompatibel 
ist,
könnte man einfach die setSda(), setScl() und begin() Methode benutzen.
(Firma: Q3) #5595340
Lesenswert?

So, ich hab mal experimentiert!

Mit der Lib "SoftwareI2C" von Sparkfun (hab noch 3 andere ausprobiert, 
die alle "zickig" waren!) klappt es, quasi beliebig viele (soweit Pins 
vorhanden), I2C-Devices mit der gleichen Adresse zu benutzen. Hier ein 
Beispiel mit dem Magnetsensor HCM5883L.

Der Code läuft auf einem UNO seit einigen Stunden problemlos, dürfte 
also auch keine Mem-Leaks produzieren.
1
#include <SoftwareI2C.h>
2

3
int  hmc_adr = 0x1E;
4
byte hmc_mode = 0x02;
5
byte hmc_cont = 0x00;
6
byte hmc_out = 0x03;
7

8
void setup()
9
{
10
  Serial.begin(9600);
11
}
12

13
void loop()
14
{
15
  Serial.println(get_mag(A0));
16
  Serial.println(get_mag(A1));
17
  Serial.println(get_mag(A2));
18
  Serial.println(get_mag(A3));
19
  Serial.println(get_mag(A4));
20
  Serial.println("-----------");
21
  delay(500);
22
}
23

24
int get_mag(int sda_pin)
25
{
26
  int x,y,z; // 3 Achsen
27
  SoftwareI2C s;
28
  s.begin(sda_pin,A5); //SCL unverändert
29
  s.beginTransmission(hmc_adr); // Verbindung öffnen mit dem HMC5883
30
  s.write(hmc_mode); // Mode Register
31
  s.write(hmc_cont);   // Kontinuierliche Messung
32
  s.endTransmission();
33

34
  s.beginTransmission(hmc_adr);
35
  s.write(hmc_out); // Register 3, X MSB Register
36
  s.endTransmission();
37
  
38
  s.requestFrom(hmc_adr, 6);
39
  x = s.read()<<8;  x |= s.read();
40
  z = s.read()<<8;  z |= s.read();
41
  y = s.read()<<8;  y |= s.read();
42
  s.endTransmission();
43
 
44
  float w = atan2(-y , x) / M_PI * 180.0;
45
  if(w < 0){w = w + 360.0;}
46
  return w; 
47
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren