Il 0% ha trovato utile questo documento (0 voti)
157 visualizzazioni10 pagine

IoT LL5

Il documento descrive due progetti di controllo implementati su un microcontrollore. Il primo progetto controlla la temperatura usando un termostato on-off. Il secondo progetto controlla la velocità di un motore usando un algoritmo PID.

Caricato da

Anya Mr
Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
157 visualizzazioni10 pagine

IoT LL5

Il documento descrive due progetti di controllo implementati su un microcontrollore. Il primo progetto controlla la temperatura usando un termostato on-off. Il secondo progetto controlla la velocità di un motore usando un algoritmo PID.

Caricato da

Anya Mr
Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Sei sulla pagina 1/ 10

MINISTERUL EDUCAŢIEI, CULTURII ȘI CERCETĂRII

Universitatea Tehnică a Moldovei


Facultatea Calculatoare Informatică şi Microelectronică
Departamentul Ingineria Software și Automatică

Raport
Disciplina: Internetul Lucrurilor(IoT)
Tema: “Control”

Student: _____________ Mereuță Ana, TI-192

Coordonator: _____________ Lupan Cristian, asist. univ.

Chişinău 2022
Sarcina lucrării
Să se realizeze o aplicație in baza de MCU care va implementa sisteme de control pentru:
Control temperatura sau umiditate cu aplicarea metodei de control On-Off cu histerezis cu acționare prin
releu. Control turații motor cu aplicarea metodei PID cu un encoder în calitate de senzor, și driver L298
pentru aplicarea puterii la motor.
NOTA: in p (b) se poate alege și la alt parametru de control, cu constrângerea ca acționarea va fi cu o
rezoluție de min 8 biți.
Set point (valoarea de referința pentru control) se va seta de la una din surse, la alegere:
- Un potențiometru;
- Doua butoane pentru UP/Down;
- Sensor encoder;
- Keypad;
- Interfața serial;
Valoarea de Setpoint si cea Curenta se vor afișa la LCD.
Problema 1
1. Schema

Figura 1.1 – Schema circuitului


2. Codul sursă:
#define THERMOSTAT_PIN 2

#define VRX_PIN A0
#define VRY_PIN A1

#define TEMP_PIN A5

LiquidCrystal lcd(13, 12, 8, 9, 10, 11);


Joystick *joystick;

TempSensor tempSensor(TEMP_PIN);
Relay thermostat(THERMOSTAT_PIN, false);

uint8_t minTemp = 25;


uint8_t lastMinTepm = -1;
uint8_t lastTemp = -1;
void controlMinTemp();

bool lastThermostatState;
bool shouldThermostatBeActive(float tempC);
void controlThermostat();

void clearLcdLine(int line, int startIndex = 0, int endIndex = 15);


void displayCurrentTemp();
void displayMinTemp();

void controlMinTemp() {
Joystick::Move move = joystick->singleRead();

switch (move)
{
case Joystick::Move::UP:
if (minTemp < 50) {
minTemp++;
}
displayMinTemp();
break;
case Joystick::Move::DOWN:
if(minTemp > 1) {
minTemp--;
}
displayMinTemp();
break;
}
}
bool shouldThermostatBeActive(float tempC) {
if (tempC < minTemp) return true;
return false;
}

void controlThermostat() {
bool thermostatState = shouldThermostatBeActive(tempSensor.getTempCelsius());

if (thermostatState && !lastThermostatState) {


lastThermostatState = true;
thermostat.turnOn();
} else if (!thermostatState && lastThermostatState) {
lastThermostatState = false;
thermostat.turnOff();
}
}

3. Rezultatul
Figura 1.2 – Stare inițială

Figura 1.3 – Modificare temperatură minimă


Figura 1.4 – Temperatură mică, termostat aprins

Figura 1.5 – Temperatură normală, termostat stins

Problema 2
Figura 2.1 – Schema circuitului

1. Codul sursă:
#include <Arduino.h>
#include <AxisJoystick.h>
#include <LiquidCrystal.h>

#include "MotorDriver.h"

extern "C"
{
#include "pid.h"
}

#define IN1 13
#define IN2 12
#define ENA1 5
#define ENC1 3
#define ENC2 2

#define PULSES_PER_REVOLUTION 24

#define BAUD_RATE 9600

#define VRX_PIN A0
#define VRY_PIN A1

double setpoint = -200;


double kp = 3;
double ki = 0.5;
double kd = 0.5;
double minPwm = 0;
double maxPwm = 255;

pid_t pid;
volatile double actualSpeed;

LiquidCrystal lcd(11, 10, 6, 7, 8, 9);


Joystick *joystick;

MotorDriver motor(ENA1, IN1, IN2);


void readEncoder();
double convertSpeedToRPM();

void motorControl();
void setPointControl();

void clearLcdLine(int line, int startIndex = 0, int endIndex = 15);


void displaySetPoint();
void displayMotorStats();
void setPointControl() {
Joystick::Move move = joystick->singleRead();

switch (move)
{
case Joystick::Move::UP:
if (setpoint < 255) {
setpoint += 10;
}
displaySetPoint();
pid_set_setpoint(&pid, setpoint);
break;
case Joystick::Move::DOWN:
if(setpoint > -255) {
setpoint -= 10;
}
displaySetPoint();
pid_set_setpoint(&pid, setpoint);
break;
case Joystick::Move::RIGHT:
if (setpoint < 255) {
setpoint += 50;
}
displaySetPoint();
pid_set_setpoint(&pid, setpoint);
break;
case Joystick::Move::LEFT:
if(setpoint > -255) {
setpoint -= 50;
}
displaySetPoint();
pid_set_setpoint(&pid, setpoint);
break;
}
}
void motorControl()
{
double rpmSpeed = speedToRpm(actualSpeed);
double computedSpeed = pid_compute(&pid, abs(rpmSpeed));

displayMotorStats();

if (setpoint < 0) {
motor.reverse(abs(computedSpeed));
} else if (setpoint > 0) {
motor.forward(computedSpeed);
} else {
motor.stop();
}
}
double speedToRpm(double speed)
{
return speed / PULSES_PER_REVOLUTION * 60.0;
}
attachInterrupt(digitalPinToInterrupt(ENC1), readEncoder, RISING);
pid_init(&pid, abs(setpoint), kp, ki, kd, minPwm, maxPwm);
void readEncoder()
{
static uint32_t prevTime = 0;
uint32_t currentTime = micros();
double deltaTime = ((double)(currentTime - prevTime)) * 0.000001;

int8_t direction = (digitalRead(ENC2)) ? 1 : -1;

actualSpeed = direction / deltaTime;

prevTime = currentTime;
}
2. Rezultatul

Figura 2.2 – Stare inițială

Figura 2.3 – Creșterea vitezei până la setpoint


Figura 2.4 – Modificarea vitezei

Figura 2.5 – Rotirea motorului în direcția opusă

Potrebbero piacerti anche