Hinzufügen eines ADC zu Ihrem Raspberry Pi: Was Sie wissen müssen
Die zentralen Thesen
- Dem Raspberry Pi fehlt ein analoger Eingang, aber Sie können externe ADCs hinzufügen, um Spannungen aus der realen Welt in digitale Form umzuwandeln, um sie aufzuzeichnen, zu manipulieren und zu steuern.
- Zu den beliebten ADC-Optionen gehören MCP3004/MCP3008 für einen Kompromiss zwischen Geschwindigkeit und Präzision oder ADS111x für 16-Bit-Messungen bei einer langsameren Abtastrate.
- Der ADS1115 von Adafruit ist eine einfache Option mit einem Programmable Gain Amplifier (PGA), mit dem Sie kleine Spannungsunterschiede erkennen und die Verstärkung während des Programms anpassen können. Die Verkabelung mit Raspberry Pi über I2C ist unkompliziert.
Im Auslieferungszustand fehlt dem Raspberry Pi ein analoger Eingang. Dies stellt einen Nachteil gegenüber Mikrocontroller-basierten Platinen wie dem Arduino dar.
Aber verzweifeln Sie nicht: Es gibt viele Möglichkeiten, die Sie in Betracht ziehen können. Starten Sie mit Raspberry Pi und einem externen ADC.
Warum Eingaben hinzufügen?
Die reale Welt ist voller Phänomene, die sich mit der richtigen Schaltung leicht mithilfe einer Spannung beschreiben lassen. Bringen Sie diese Spannungen in digitale Form, und Sie können sie aufzeichnen, manipulieren und zur Steuerung anderer Parameter und Geräte verwenden.
Möglicherweise möchten Sie die Feuchtigkeit Ihres Bodens, die Temperatur Ihres Gewächshauses oder das Gewicht Ihres Hamsters überwachen. Möglicherweise möchten Sie Ihrem Pi einen Lautstärkeregler hinzufügen, eine ganze Reihe von Fadern erstellen oder einen Joystick von Grund auf neu entwerfen. Die Möglichkeiten sind mehr oder weniger grenzenlos.
Optionen für ADCs
Welcher ADC eignet sich also am besten für Anfänger?
Zu den beliebtesten und unkompliziertesten Optionen gehören die Chips MCP3004 (und MCP3008 ) von Microchip. Sie erhalten vier (oder acht) Kanäle mit jeweils 10 Bit, die bis zu 200 kSPS lesen können. Zum anderen gibt es die ADS111x-Geräte von Texas Instruments, die 16 Bit bei 860 SPS lesen. Es gibt also einen Kompromiss zwischen Geschwindigkeit und Präzision (und natürlich dem Preis).
Viele Mikrocontroller verfügen über integrierte ADCs. Der ATMega, den Sie auf einem durchschnittlichen Arduino finden, bietet zusätzlich zu allem anderen mehrere 10-Bit-Kanäle. Dies ermöglicht es dem Arduino, analoge Eingänge bereitzustellen, wo der Raspberry Pi dies nicht kann. Wenn Sie bereits ein Arduino in Ihrem Setup haben und 10 Bit ausreichend Wiedergabetreue sind, dann ist dies möglicherweise der einfachste Weg.
Hier machen wir es einfach, mit einem ADS1115 von Adafruit.
Was ist ein Verstärker mit programmierbarer Verstärkung?
Dieser Chip verfügt über einige interessante Funktionen, darunter einen Programmable Gain Amplifier (PGA). Damit können Sie den gewünschten Wertebereich bis auf den Bruchteil eines Volts digital einstellen. Mit der Anzahl der Werte, die 16 Bit darstellen können, können Sie so Unterschiede von nur wenigen Mikrovolt erkennen.
Der Vorteil hierbei ist, dass Sie die Verstärkung mitten im Programm ändern können. Andere Chips, wie der MCP3004, verfolgen einen anderen Ansatz; Sie verfügen über einen zusätzlichen Pin, an den Sie eine Referenzspannung anschließen können.
Was ist mit Multiplexing?
Ein Multiplexer (oder Mux) ist ein Schalter, mit dem Sie viele Eingänge mit einem einzigen ADC lesen können. Wenn Ihr ADC-Chip über viele Eingangspins verfügt, findet intern Multiplexing statt. Der Mux des ADS1115 ermöglicht vier Eingänge, die Sie über die internen Register auswählen können.
Umgang mit Registern
Der ADS1115 bietet diese und noch einige weitere Optionen. Sie können mit dem Multiplexer umgehen, die Verstärkung anpassen, den integrierten Komparator aktivieren, die Abtastrate ändern und das Gerät in den Energiesparmodus versetzen – alles durch Umlegen einiger Schalter.
Aber wo sind diese Schalter? Sie befinden sich im Paket in Form sehr kleiner Speicherbits, die als Register bezeichnet werden . Um eine bestimmte Funktion zu aktivieren, müssen Sie lediglich das entsprechende Bit auf 1 statt auf 0 setzen.
Wenn Sie sich das ADS111x-Datenblatt ansehen , werden Sie feststellen, dass diese Modelle über vier Register verfügen, einschließlich der Konfigurationsregister, die das Verhalten des Geräts steuern.
Beispielsweise steuern die Bits 14 bis 12 den Multiplexer. Mithilfe dieser drei Bits können Sie aus acht Konfigurationen auswählen. Der Wert, den Sie hier benötigen, ist „100“, was die Differenz zwischen Eingang Null und Masse angibt. Die Bits 7 bis 5 hingegen bestimmen die Abtastrate. Wenn Sie das Maximum von 860 Samples pro Sekunde wünschen, können Sie diese auf „111“ einstellen.
Sobald Sie wissen, welche Optionen Sie festlegen müssen, müssen Sie zwei Bytes an den ADC senden. Wenn Sie später hier oder da ein einzelnes Bit setzen möchten, können Sie diese einzeln mit bitweisen Operatoren behandeln.
Hier könnte es verwirrend werden. In diesem Fall stellt die Binärdatei keinen Wert dar, sondern die Werte einzelner Schalter. Sie können diese Variablen als eine große Zahl, dezimal oder hexadezimal ausdrücken. Wenn Sie jedoch Kopfschmerzen vermeiden möchten, sollten Sie bei der Binärversion bleiben, die einfacher zu lesen ist.
Verkabelung
Sie können dieses Gerät direkt an das Steckbrett anschließen. Der positive Spannungseingang akzeptiert Spannungen zwischen 2 und 5,5 V, was bedeutet, dass die 3,3-V-Schiene des Raspberry Pi gut funktioniert.
Verdrahten Sie die SDA- und SCL-Eingänge mit den Gegenstücken am RPi und machen Sie dasselbe mit der Masse und 3,3 V. Bringen Sie ein Potentiometer zwischen Masse und Spannungsleitungen an und stecken Sie die mittlere Leitung in den ersten Eingang des ADC. Das ist alles, was Sie brauchen, um loszulegen!
Umgang mit I2C
Verschiedene ADCs arbeiten über unterschiedliche Protokolle. Im Fall unseres ADS1115 werden wir I2C verwenden .
Das folgende Beispiel interagiert mit dem ADC über Python. Aber bevor Sie das tun, müssen Sie es einrichten. Neuere Versionen des Raspberry Pi OS haben dies sehr einfach gemacht. Gehen Sie zu Einstellungen > Raspberry Pi-Konfiguration . Schalten Sie dann auf der Registerkarte „ Schnittstellen “ I2C ein.
Um zu überprüfen, ob alles funktioniert, öffnen Sie ein Terminal und führen Sie Folgendes aus:
sudo i2cdetect -y 1
Dieser Befehl gibt ein Raster aus. Vorausgesetzt, dass alles funktioniert und Sie es richtig verkabelt haben, wird im Raster ein neuer Wert angezeigt. Dies ist die Adresse Ihres ADC. Beachten Sie hierbei, dass es sich um einen Hexadezimalwert handelt. Sie müssen ihm also „0x“ voranstellen, wenn Sie ihn im folgenden Code verwenden. Hier ist es 0x48 :
Sobald Sie die Adresse haben, können Sie die SMBus-Bibliothek zum Senden von I2C-Befehlen verwenden. Sie werden es hier mit zwei Methoden zu tun haben. Das erste ist write_word_data() , das drei Argumente akzeptiert: die Geräteadresse, das Register, in das Sie schreiben, und den Wert, den Sie schreiben möchten.
Sie können das Ergebnis ein wenig verschönern und es dann ausdrucken. Bevor Sie zum Anfang der Schleife zurückkehren, führen Sie eine kurze Verzögerung ein. Dadurch wird sichergestellt, dass Sie nicht mit Daten überhäuft werden.
from smbus import SMBusimport timeaddr = 0x48bus = SMBus(1)# set the registers for readingCONFIGREG = 1CONVERSIONREG = 0# set the address register to point to the config register# write to the config registersbus.write_word_data(addr, CONFIGREG, (0b00000100 << 8 | 0b10000010)) # define the top of the rangeTOP = 26300while True: # read the register b = bus.read_word_data(addr, CONVERSIONREG) # swap the two bytes b = ((b & 0xFF) << 8) | ((b >> 8) & 0xFF) # subtract half the range to set ground to zero b -= 0x8000 # divide the result by the range to give us a value between zero and one b /= TOP # cap at one b = min(b, 1) # bottom is zero b = max(b, 0) # two decimal places b = round(b, 2) print(b) time.sleep(.01)
Du bist fast fertig. Ordnen Sie den Wertebereich, den Sie erhalten, dem von Ihnen bevorzugten Wert zu und kürzen Sie ihn dann auf die gewünschte Anzahl an Dezimalstellen. Sie können die Druckfunktion so anpassen, dass ein neuer Wert nur dann gedruckt wird, wenn er sich vom letzten Wert unterscheidet.
Umgang mit Lärm
Wenn Ihr Setup nicht super, super ordentlich und aufgeräumt ist, werden Sie einige Geräusche bemerken. Dies ist der inhärente Nachteil der Verwendung von 16 Bit anstelle von nur zehn: Das kleine bisschen Rauschen ist deutlicher wahrnehmbar.
Indem Sie den benachbarten Eingang (Eingang 1) mit Masse verbinden und den Modus so umschalten, dass Sie die Eingänge eins und zwei vergleichen, können Sie wesentlich stabilere Ergebnisse erzielen. Sie könnten auch diese langen, rauschauffangenden Überbrückungskabel gegen kleine austauschen und nebenbei noch ein paar Kondensatoren hinzufügen. Auch der Wert Ihres Potentiometers kann einen Unterschied machen.
Es gibt auch Softwareoptionen. Sie können einen gleitenden Durchschnitt erstellen oder kleine Änderungen einfach ignorieren. Der Nachteil besteht darin, dass zusätzlicher Code einen Rechenaufwand verursacht. Wenn Sie bedingte Anweisungen in einer Hochsprache wie Python schreiben und jede Sekunde Tausende von Proben nehmen, erhöhen sich diese Kosten schnell.
Gehen Sie mit vielen möglichen nächsten Schritten weiter
Die Messung über I2C ist ziemlich einfach und das Gleiche gilt weitgehend auch für andere Methoden wie SPI. Auch wenn es den Anschein hat, dass es große Unterschiede zwischen den verfügbaren ADC-Optionen gibt, ist es in Wahrheit so, dass es einfach ist, das Wissen auf die anderen anzuwenden, sobald man eine davon zum Laufen gebracht hat.
Warum also nicht noch einen Schritt weiter gehen? Verbinden Sie mehrere Potentiometer miteinander oder versuchen Sie, Licht, Ton oder Temperatur abzulesen. Erweitern Sie den Controller, den Sie gerade erstellt haben, und erstellen Sie ein Raspberry Pi-Setup, das wirklich praktisch ist!
Schreibe einen Kommentar