righetz
| Inviato il: 21/02/2016 22:17:50
|
La versione aggiornata del codice per arduino uno e arduino nano 328P
con controllo direzione e velocità del motore passo passo tramite potenziometro. Ancora da collaudare , il driver arriva martedi
/*Condiviso su www.energialternativa.info by Righetz ;-)
*
* Versione test del 21/02/2016
*
*
*
*============================================================
*
* (Gnd) ---- (100k-Resistor) -------|------- (100K-Thermistor) ---- (+5v)
* |
* Analog Pin 1
*============================================================
*/
#include <PID_v1.h>
#include <math.h>
#include <Wire.h>
#include <LiquidCrystal.h>
#include <HCMotor.h>
#define POT_PIN 0 // Pin ingresso analogico potenziometro per stepper
#define ThermistorPin 1 // Pin analogico dove viene connesso il termistore
#define ThresholdPin 2 // Pin analogico cove viene connesso il pin centrale del potenziometro
#define HeaterPin 10 // Pin digitale con funzione PWM dove viene collegata la resistenza riscaldante
#define CLK_PIN 9 // Connessione al modulo tb6560 ingresso 'step' or 'CLK'
#define DIR_PIN 8 // Connessione al modulo tb6560 ingresso 'direction'
#define STOP 20 // specifica il punto centrale del potenziometro per fermare lo stepper per il cambio di rotazione
#define POT_REV_MIN 0 // gira a dx al minimo
#define POT_REV_MAX (512 - STOP) // gira a dx al massimo
#define POT_FWD_MIN (512 + STOP) // gira a sx al minimo
#define POT_FWD_MAX 1024 // gira a sx al massimo
double SetPoint, ActualTemp, Output;
LiquidCrystal lcd(6,7,2,3,4,5); // settaggio dei piedini per la schield 16x2 www.microbot.it mr007-005
PID myPID(&ActualTemp, &Output, &SetPoint,2,5,1, DIRECT); // Specifiche per la taratura delle funzioni del PID automatico
int calibrationTime = 10; // tempo necessario per la calibrazione del sensore
double Thermister(int RawADC) {
long Resistance;
double Temp;
Resistance=((10240000/RawADC) - 10000);
Temp = log(Resistance);
Temp = 1 / (0.001129148 + (0.000234125 * Temp) + (0.0000000876741 * Temp * Temp * Temp)); //resisteza termistori convertiti in volt
Temp = Temp - 273.15; //convertiti in celsius...da kelvin
return Temp;
}
HCMotor HCMotor; // creazione dell'istanza per la libreria stepper
void setup() {
pinMode(ThresholdPin, INPUT);
pinMode(HeaterPin, OUTPUT);
Serial.begin(57600);
lcd.begin(16,2); // inizializzazione display
lcd.clear();
lcd.setCursor(0,0);
lcd.print("calibrazione....");
for(int i = 0; i < calibrationTime; i++){ // tempo di 10 secondi per la calibrazione del sensore
delay(1000);}
delay(50);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("SETPOINT TEMP ");
myPID.SetMode(AUTOMATIC); // abilita il PID
HCMotor.Init(); // inizializzazione libreria stepper
HCMotor.attach(0, STEPPER, CLK_PIN, DIR_PIN); // Attacca il motore 0 Tipo motore STEPPER ai pin digitali 8 e 9
HCMotor.Steps(0,CONTINUOUS);
}
void loop() {
SetPoint = map(analogRead(ThresholdPin),0,1023,0,300);
ActualTemp = double(Thermister(analogRead(ThermistorPin)));
analogWrite(HeaterPin,Output);
lcd.setCursor(11,1);
lcd.print(ActualTemp);
lcd.setCursor(3,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(SetPoint);
myPID.Compute();
int Speed, Pot;
Pot = analogRead(POT_PIN);
if (Pot >= POT_REV_MIN && Pot <= POT_REV_MAX)
{
HCMotor.Direction(0, REVERSE);
Speed = map(Pot, POT_REV_MIN, POT_REV_MAX, 10, 1024);
}else if (Pot >= POT_FWD_MIN && Pot <= POT_FWD_MAX)
{
HCMotor.Direction(0, FORWARD);
Speed = map(Pot, POT_FWD_MIN, POT_FWD_MAX, 1024, 10);
}else
{
Speed = 0;
}
HCMotor.DutyCycle(0, Speed);
}
--------------- Chi non si indebita fa la rabbia degli usurai
|