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

_images/mcp3008_and_adc0834.jpg

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:

_images/list2_2.1.4_potentiometer.png

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.

_images/MCP3008.jpg

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.

_images/MCP3008detail.png

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.

_images/image3101.png

Funktionen des Potentiometers in einer Schaltung:

  1. 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

_images/schematic_2.1.7_potentiometer_mcp3008.png

Experimentelle Schritte

Schritt 1: Baue die Schaltung auf.

_images/july24_2.1.7_potentiometer_mcp3008.png

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.