Для научного проекта я хочу управлять воздушным насосом с шаговым приводом. Моя основная задача - регулировать скорость шагового двигателя относительно показаний датчика давления, чтобы я мог поддерживать постоянный уровень давления в контейнере. На этом этапе я могу управлять шаговым двигателем с постоянной скоростью, которая создает давление в моем контейнере, и я могу считывать уровень давления в контейнере с помощью датчика давления Honeywell в программе Raspberry Pi с помощью программы АЦП и Python MCP3008. Ниже приведена краткая схема системы и кода Python для работы шагового двигателя и считывания давления.
Что я хочу это
Первый сценарий: когда давление в контейнере равно нулю, я хочу запустить шаговый двигатель на максимальной скорости, чтобы можно было быстро достичь желаемого давления, а когда уровень давления близок к желаемому давлению, скорость шагового двигателя должна уменьшиться и остановится, когда достигнет определенный предел давления.
Второй сценарий: когда давление сбрасывается из контейнера, степпер должен запускаться автоматически, чтобы поддерживать желаемое давление, как описано выше.
Как это можно сделать как механизм обратной связи с датчиком? Есть ли способ, которым я могу сделать это через программу Python? Любые предложения приветствуются. И заранее спасибо ...
Дополнительная информация:
- Я не использую штифт DIRECTION в Easy Driver, так как для меня обратное вращение не требуется.
- Мое желаемое давление в терминах вольт составляет 3 В, и когда оно достигает значения ниже 2,5 В, я хочу запустить шаговый двигатель медленно, а когда он падает до 2 В, я хочу запустить шаговый двигатель на полной скорости, чтобы можно было быстро поддерживать давление.
- Я могу изменить скорость шагового двигателя (на постоянную скорость), изменив время ожидания в STEP pin ON-OFF
Код Python
#!/usr/bin/python
import spidev
import time
import os
import RPi.GPIO as GPIO
import _thread
# Open SPI bus
spi = spidev.SpiDev()
spi.open(0,0)
spi.max_speed_hz=1000000
#Stepper pin setup
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO_pins = (6, 13)
step = 19
GPIO.setup(step, GPIO.OUT)
GPIO.setup(GPIO_pins, GPIO.OUT)
GPIO.output(GPIO_pins, False)
# Function to read SPI data from MCP3008 chip
# Channel must be an integer 0-7
def ReadChannel(channel):
adc = spi.xfer2([1,(8+channel)<<4,0])
data = ((adc[1]&3) << 8) + adc[2]
return data
# Function to convert data to voltage level,
# rounded to specified number of decimal places.
def ConvertVolts(data,places):
volts = (data * 3.3) / float(1023)
volts = round(volts,places)
return volts
# Define sensor channels
pressure_channel = 0
# Define delay between readings
delay = 1
def SensorRead():
while True:
# Read the pressure sensor data
pressure_level = ReadChannel(pressure_channel)
pressure_volts = ConvertVolts(pressure_level,2)
# Print out results
print ("--------------------------------------------")
print("pressure : {} ({}V)".format(pressure_level,pressure_volts))
# Wait before repeating loop
time.sleep(delay)
def StepperRun():
while True:
# Stepper run
GPIO.output(step, False)
time.sleep(.008)
GPIO.output(step, True)
time.sleep(.008)
GPIO.cleanup
_thread.start_new_thread(SensorRead, ())
_thread.start_new_thread(StepperRun, ())