Bemerkung
Hallo, willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Community auf Facebook! Tauche tiefer in Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten ein.
Warum beitreten?
Expertenunterstützung: Löse Probleme nach dem Kauf und technische Herausforderungen mit Hilfe unserer Community und unseres Teams.
Lernen & Teilen: Teile Tipps und Tutorials, um deine Fähigkeiten zu verbessern.
Exklusive Vorschauen: Erhalte frühzeitigen Zugang zu neuen Produktankündigungen und Vorschauen.
Sonderrabatte: Genieße exklusive Rabatte auf unsere neuesten Produkte.
Festliche Aktionen und Verlosungen: Nimm an Verlosungen und Feiertagsaktionen teil.
👉 Bereit, mit uns zu entdecken und zu erschaffen? Klicke auf [hier] und tritt noch heute bei!
2.1.4 Potentiometer (MCP3008)
Bemerkung
Je nach Kit-Version prüfe bitte, ob du ADC0834 oder MCP3008 hast, und fahre mit dem entsprechenden Abschnitt fort.
Einführung
Die ADC-Funktion wird verwendet, um analoge Signale in digitale Werte umzuwandeln. In diesem Experiment verwenden wir den MCP3008-ADC-Chip, um diese Umwandlung durchzuführen. Ein Potentiometer wird verwendet, um eine variable Spannung zu erzeugen, die die physikalische Größe verändert. Der MCP3008 wandelt diese analoge Spannung dann in einen digitalen Wert um, der vom Raspberry Pi gelesen und verarbeitet werden kann.
Benötigte Komponenten
In diesem Projekt benötigen wir die folgenden Komponenten:
Prinzip
MCP3008
Der MCP3008 ist ein 10-Bit-Analog-Digital-Wandler (ADC) mit sukzessiver Approximation, 8 Eingangskanälen und einem SPI- (Serial Peripheral Interface) Kommunikationsprotokoll. Er kann mit einem Mikrocontroller verbunden werden, um analoge Eingangssignale in digitale Daten für die weitere Verarbeitung umzuwandeln.
Ablauf der Operation
Eine Konvertierung auf dem MCP3008 beginnt damit, dass der CS- (Chip Select) Pin auf LOW gesetzt wird, um die Kommunikation mit dem Gerät zu aktivieren. Der Mikrocontroller sendet dann einen 3-Byte-Steuerstrom über die SPI-Schnittstelle, um die Konfiguration festzulegen und den Eingangskanal auszuwählen.
Das erste gesendete Byte enthält das Startbit und das Bit für die Auswahl zwischen Single-Ended/Differential. Die nächsten Bits geben an, welcher der 8 Kanäle (CH0–CH7) gelesen werden soll. Daten werden bei jeder steigenden Flanke des SPI-Takts (SCLK) in das Gerät verschoben, und das Konvertierungsergebnis wird gleichzeitig zurückgesendet.
Eine kurze interne Verzögerung sorgt dafür, dass der ausgewählte Eingangskanal stabilisiert wird, bevor die Umwandlung beginnt. Der MCP3008 führt dann eine 10-Bit-Analog-Digital-Wandlung mithilfe einer Sample-and-Hold-Schaltung und eines SAR-Komparators (Successive Approximation Register) durch.
Das Konvertierungsergebnis wird über die MISO- (Master In Slave Out) Leitung an den Mikrocontroller zurückgesendet. Das höchstwertige Bit (MSB) des 10-Bit-Ergebnisses wird zuerst gesendet, gefolgt von den verbleibenden Bits. Der Mikrocontroller liest das Ergebnis während dieser Zeit über den SPI-Bus aus.
Nachdem der vollständige 10-Bit-Digitalwert übertragen wurde, beendet der MCP3008 den Zyklus und wartet auf den nächsten Befehl.
Potentiometer
Ein Potentiometer ist ebenfalls ein Widerstandselement mit 3 Anschlüssen, dessen Widerstandswert in einer bestimmten Weise veränderbar ist. Es besteht normalerweise aus einem Widerstand und einem beweglichen Schleifer. Wenn sich der Schleifer entlang des Widerstands bewegt, ändert sich der Widerstand oder die Ausgangsspannung abhängig von der Position.
Funktionen des Potentiometers in einer Schaltung:
Als Spannungsteiler
Ein Potentiometer ist ein kontinuierlich einstellbarer Widerstand. Wenn man die Achse oder den Schieberegler des Potentiometers dreht, bewegt sich der Schleifkontakt entlang des Widerstands. Dadurch kann eine Spannung ausgegeben werden, die von der angelegten Spannung und der Stellung des Schleifarms abhängt.
Schaltplan
T-Board-Name |
Physical |
WiringPi |
BCM |
|---|---|---|---|
SPICE0 |
pin24 |
10 |
8 |
SPIMOSI |
pin19 |
12 |
10 |
SPIMISO |
pin21 |
13 |
9 |
SPISCLK |
pin23 |
14 |
11 |
GPIO22 |
pin15 |
3 |
22 |
Experimentelle Schritte
Schritt 1: Baue die Schaltung auf.
Bemerkung
Bitte platziere den Chip entsprechend der Abbildung. Achte darauf, dass sich die Kerbe am Chip auf der linken Seite befindet.
Für C-Sprach-Nutzer
Schritt 2: Öffne die C-Datei.
cd ~/davinci-kit-for-raspberry-pi/c/2.1.4-2/
Schritt 3: Kompiliere den Code.
gcc 2.1.4_Potentiometer.c -lwiringPi
Schritt 4: Ausführen.
sudo ./a.out
Nachdem der Code ausgeführt wird, ändert sich die Helligkeit der LED je nach Stellung des Potentiometers.
Bemerkung
Falls die Fehlermeldung „wiringPi.h: No such file or directory“ erscheint, siehe Installieren und Überprüfen von WiringPi.
Code
#include <wiringPi.h>
#include <wiringPiSPI.h>
#include <stdio.h>
#include <softPwm.h>
#define SPI_CHANNEL 0 // CE0
#define SPI_SPEED 1000000 // 1MHz
#define LedPin 3
int readADC(int channel) {
if (channel < 0 || channel > 7) return -1;
unsigned char buffer[3];
buffer[0] = 1; // Startbit
buffer[1] = (8 + channel) << 4; // Single-Ended-Modus, Kanal
buffer[2] = 0;
wiringPiSPIDataRW(SPI_CHANNEL, buffer, 3);
int value = ((buffer[1] & 3) << 8) | buffer[2];
return value;
}
int main(void) {
if (wiringPiSetup() == -1) {
printf("WiringPi init fehlgeschlagen!\n");
return 1;
}
if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) {
printf("SPI Setup fehlgeschlagen!\n");
return 1;
}
softPwmCreate(LedPin, 0, 100);
while (1) {
int analogVal = readADC(0); // CH0
printf("ADC Wert: %d\n", analogVal);
int pwmVal = analogVal * 100 / 1023; // Normierung auf 0–100
softPwmWrite(LedPin, pwmVal);
delay(100);
}
return 0;
}
Code-Erklärung
SPI_CHANNEL ist CE0, SPI_SPEED ist 1 MHz, LedPin ist GPIO3.
readADC liest den analogen Wert vom MCP3008 über SPI, prüft den Kanal, sendet 3 Bytes und wertet den 10-Bit-Wert aus.
Die Hauptschleife liest kontinuierlich den Wert, wandelt ihn in PWM um und passt die LED-Helligkeit an.
Für Python-Nutzer
Schritt 2: SPI-Schnittstelle einrichten und spidev installieren (siehe SPI-Konfiguration).
Schritt 3: Öffne die Python-Datei.
cd ~/davinci-kit-for-raspberry-pi/python
Schritt 4: Ausführen.
sudo python3 2.1.4-2_Potentiometer.py
Warnung
Falls die Fehlermeldung RuntimeError: Cannot determine SOC peripheral base address erscheint, siehe Wenn gpiozero nicht funktioniert.
Code
#!/usr/bin/env python3
import spidev
import time
import RPi.GPIO as GPIO
PWM_PIN = 22
GPIO.setmode(GPIO.BCM)
GPIO.setup(PWM_PIN, GPIO.OUT)
pwm = GPIO.PWM(PWM_PIN, 1000)
pwm.start(0)
spi = spidev.SpiDev()
spi.open(0, 0)
spi.max_speed_hz = 1000000
def read_adc(channel):
if channel < 0 or channel > 7:
return -1
adc = spi.xfer2([1, (8 + channel) << 4, 0])
value = ((adc[1] & 3) << 8) | adc[2]
return value
def MAP(x, in_min, in_max, out_min, out_max):
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
try:
while True:
res = read_adc(0)
print('res = %d' % res)
duty_cycle = MAP(res, 0, 1023, 0, 100)
pwm.ChangeDutyCycle(duty_cycle)
time.sleep(0.2)
except KeyboardInterrupt:
pass
finally:
pwm.stop()
GPIO.cleanup()
spi.close()
Code-Erklärung
RPi.GPIO erzeugt PWM-Signale für die LED, spidev kommuniziert über SPI mit dem MCP3008.
In der Hauptschleife wird der ADC-Wert eingelesen, auf 0–100 % Duty Cycle umgerechnet und an die LED weitergegeben.