Tutorial_Python_GPIOZero Bladzijde 127
Alle codes (van proefjes) overzichtelijk op een rij
Staat het project er niet bij kijk dan hier
In dit hoofdstuk leren we over DC-motoren en DC-motordrivers en hoe we de snelheid en richting van een DC-motor kunnen regelen.
Project 13.1 Een DC-motor besturen met een potentiometer
In dit project wordt een potentiometer gebruikt om een DC-motor te regelen. Wanneer de potentiometer zich in de middenpositie bevindt, zal de DC-motor STOPPEN en wanneer de potentiometer in beide richtingen van dit middenpunt wordt gedraaid, neemt de snelheid van de DC-motor toe totdat het eindpunt is bereikt waarop de DC-motor zijn maximale snelheid bereikt.
Wanneer de potentiometer “Links” van het middenpunt wordt gedraaid, zal de DC-motor in één richting DRAAIEN en wanneer deze “Rechts” wordt gedraaid, zal de DC-motor in de tegenovergestelde richting DRAAIEN.

Componentkennis
Breadboard Power Module
Breadboard Power Module is een onafhankelijk circuitbord, dat onafhankelijk 5V of 3,3V vermogen kan leveren aan het breadboard bij het bouwen van circuits.
Het heeft ook ingebouwde stroombeveiliging om schade aan uw RPi-module te voorkomen.
Het onderstaande schema identificeert de belangrijke kenmerken van deze Power Module:

Hier is een acceptabele verbinding tussen Breadboard Power Module en Breadboard met behulp van een 9V batterij en de meegeleverde voedingskabelboom:

DC-motor
DC-motor is een apparaat dat elektrische energie omzet in mechanische energie. DC-motoren bestaan uit twee hoofdonderdelen, een stator en de rotor. Het stationaire deel van een DC-motor is de stator en het deel dat roteert is de rotor.
De stator is meestal onderdeel van de buitenste behuizing van de motor (als het gewoon een paar permanente magneten is) en heeft aansluitingen om verbinding te maken met de stroom als het is samengesteld uit elektromagnetische spoelen.
De meeste hobby-DC-motoren gebruiken alleen permanente magneten voor het statorveld.
De rotor is meestal de as van de motor met 3 of meer elektromagneten die zijn aangesloten op een commutator waar de borstels (via de aansluitingen 1 en 2 hieronder) elektrische energie leveren, die andere mechanische apparaten kan aandrijven. Het onderstaande diagram toont een kleine DC-motor met twee aansluitpennen.

Wanneer een DC-motor is aangesloten op een voeding, draait deze in één richting.
Als u de polariteit van de voeding omkeert, draait de DC-motor in de tegenovergestelde richting. Dit is belangrijk om op te merken.

L293D
L293D is een IC-chip (Integrated Circuit Chip) met een 4-kanaals motoraandrijving.
U kunt een unidirectionele DC-motor met 4 poorten of een bidirectionele DC-motor met 2 poorten of een stappenmotor (stappenmotoren worden later in deze tutorial behandeld) aansturen.


Voor meer details, zie het datasheet voor deze IC-chip.
Bij gebruik van de L293D om een DC-motor aan te drijven, zijn er doorgaans twee verbindingsopties.
De volgende verbindingsoptie gebruikt één kanaal van de L239D, die de motorsnelheid kan regelen via de PWM. De motor kan dan echter maar in één richting draaien.

De volgende verbinding gebruikt twee kanalen van de L239D: één kanaal geeft de PWM-golf af en het andere kanaal maakt verbinding met GND.
Daarom kunt u de snelheid van de motor regelen. Wanneer deze twee kanaalsignalen worden uitgewisseld, regelt u niet alleen de snelheid van de motor, maar kunt u ook de richting van de motor regelen.

In de praktijk wordt de motor meestal aangesloten op kanaal 1 en door verschillende niveaus uit te sturen naar in1 en in2 om de draairichting van de motor te regelen, en door uit te sturen naar de PWM-golf naar de Enable1-poort om de draaisnelheid van de motor te regelen.
Als de motor is aangesloten op kanaal 3 en 4 door verschillende niveaus uit te sturen naar in3 en in4 om de draairichting van de motor te regelen, en door uit te sturen naar de PWM-golf naar de Enable2-pin om de draaisnelheid van de motor te regelen.
Circuit met ADS7830
Wees voorzichtig bij het aansluiten van dit circuit, omdat de DC-motor een component met een hoog vermogen is.
Gebruik de stroom die de RPi levert niet om de motor rechtstreeks van stroom te voorzien, omdat dit permanente schade aan uw RPi kan veroorzaken!
Het logische circuit kan worden gevoed door de stroom van de RPi of een externe voeding, die een gemeenschappelijke aarde met de RPi moet delen.
Schema diagram



Code
#!/usr/bin/env python3
#############################################################################
# Filename : Motor.py
# Description : Control Motor with L293D
# Author : www.freenove.com
# modification: 2023/05/11
########################################################################
from gpiozero import DigitalOutputDevice,PWMOutputDevice
import time
from ADCDevice import *
# define the pins connected to L293D
motoRPin1 = DigitalOutputDevice(27) # define L293D pin according to BCM Numbering
motoRPin2 = DigitalOutputDevice(17) # define L293D pin according to BCM Numbering
enablePin = PWMOutputDevice(22,frequency=1000)
adc = ADCDevice() # Define an ADCDevice class object
def setup():
global adc
if(adc.detectI2C(0x48)): # Detect the pcf8591.
adc = PCF8591()
elif(adc.detectI2C(0x4b)): # Detect the ads7830
adc = ADS7830()
else:
print("No correct I2C address found, \n"
"Please use command 'i2cdetect -y 1' to check the I2C address! \n"
"Program Exit. \n");
exit(-1)
# mapNUM function: map the value from a range of mapping to another range.
def mapNUM(value,fromLow,fromHigh,toLow,toHigh):
return (toHigh-toLow)*(value-fromLow) / (fromHigh-fromLow) + toLow
# motor function: determine the direction and speed of the motor according to the input ADC value input
def motor(ADC):
value = ADC -128
if (value > 0): # make motor turn forward
motoRPin1.on() # motoRPin1 output HIHG level
motoRPin2.off() # motoRPin2 output LOW level
print ('Turn Forward...')
elif (value < 0): # make motor turn backward
motoRPin1.off()
motoRPin2.on()
print ('Turn Backward...')
else :
motoRPin1.off()
motoRPin2.off()
print ('Motor Stop...')
b=mapNUM(abs(value),0,128,0,100)
enablePin.value = b / 100.0 # set dc value as the duty cycle
print ('The PWM duty cycle is %d%%\n'%(abs(value)*100/127)) # print PMW duty cycle.
def loop():
while True:
value = adc.analogRead(0) # read ADC value of channel 0
print ('ADC Value : %d'%(value))
motor(value)
time.sleep(0.2)
def destroy():
motoRPin1.close()
motoRPin2.close()
enablePin.close()
adc.close()
if __name__ == '__main__': # Program entrance
print ('Program is starting ... ')
setup()
try:
loop()
except KeyboardInterrupt: # Press ctrl-c to end the program.
destroy()
print("Ending program")
Nadat het programma is uitgevoerd, kunt u de potentiometer gebruiken om de DC-motor te regelen. Wanneer de potentiometer zich in de middenpositie bevindt, zal de DC-motor STOPPEN en wanneer de potentiometer in een van beide richtingen van dit middenpunt wordt gedraaid, neemt de snelheid van de DC-motor toe totdat het eindpunt wordt bereikt waarop de DC-motor zijn maximale snelheid bereikt.
Wanneer de potentiometer “links” van het middenpunt wordt gedraaid, zal de DC-motor in één richting DRAAIEN en wanneer deze “rechts” wordt gedraaid, zal de DC-motor in de tegenovergestelde richting DRAAIEN.
U ziet ook de ADC-waarde van de potentiometer weergegeven in de terminal met de motorrichting en de PWM-duty cycle die wordt gebruikt om de snelheid van de DC-motor te regelen.
