Avvio motore con controllo di posizione a potenziometro

ciao a tutti sono alla ricerca di uno sketc che mi possa attivare 3 relè, 1 per avvio avanti, 1 per avvio ritorno ed un terzo che si attivi in entrambi i casi per comandare un elettromagnete.
il valore dovrei impostarlo tramite un potenziometro che comanda un motore trifase con riduttore al quale è collegata una catena con un potenziometro, purtroppo non vi è possibilità di cambiare e mettere un encoder...
Avrei bisogno di comparare il valore del potenziometro di comando con quello presente a fine catena
se il valore del primo potenziometro è basso deve attivarmi il motore ed elettro magnete in un senso,
se è invece alto deve poter avviare il motore nel senso opposto ed elettromangete fino a che i valori sono uguali
arrestarsi,l'avvio andrebbe bene anche tramite pulsante, si imposta il valore e si da il comando di start.
Altra domanda, scusate ma sono alle prime armi e sto cercando di imparare, è possibile visualizzare
su un display lcd 2x16 con modulo i2c i due valori dei due potenziometri?
Ho letto che l'ingresso di arduino sopporta da 0 a 5V che converte in valore compreso tra 0 - 1230 (se non ricordo male),è possibile farli corrispondere in altra numerazione?
esempio 0 diventa 3,550 o 3500 i decimali possono anche non servire, 200 corrispondere a 18000, 1230 uguale a 30000?? o comunque fare visualizzare dei valori personalizzati (una volta in funzione li misurerei per modificare la visualizzazione).
so che sono domande un pò specifiche, mi basterebbe anche qualche esempio per provare a programmarlo...

grazie mille

Spiegati meglio, l' circuito elettrico del motore é giá presente e devi solo cambiare il pilotaggio o vuoi costruirti tutto da zero?
Ciao Uwe

ciao il sistema mi serve per due cose ecco perchè dei relè e non comandi diretti,
uno è per un sistema di tagli molto antico, il motore mentre taglia ha un riduttore che muove una asta con un potenziometro a "reostato"
l'altro sistema invece è un motore in dc con inversione che consuma 9A quando è sotto sforzo, muove una serie di ingranaggi
chiusi ermeticamente che fungono da riduttore, ho provato a smontarlo ma nulla da fare tutte le viti sono bloccate con frena filetti.
Questo motore deve alzare ed abbassare un condensatore variabile sottovuoto, ha tutta la meccanica montata e come feedback di posizione ha un potenziometro multigiri collegato alla scatola degli ingranaggi di rinvio,purtroppo nonostante si possa levare dalla sua sede non esce dalla scatola ingranaggi e non posso cambiarlo con un encoder...
Vorrei fare in modo che con un potenziometro possa andare in posizione e fermarsi fino a che
non imposto ancora un valore da 3000 a 30000 e gli do il comando di start, possibilmente visualizzando su
un display un semplice 2x 16 indicando uno la posizione attuale e l'altra la posizione voluta....

ho cercato in diversi post ma purtroppo tutti parlavano di encoder e motori passo passo... :confused:

IZ1UQG:
...
Altra domanda, scusate ma sono alle prime armi e sto cercando di imparare, è possibile visualizzare
su un display lcd 2x16 con modulo i2c i due valori dei due potenziometri?
Ho letto che l'ingresso di arduino sopporta da 0 a 5V che converte in valore compreso tra 0 - 1230 (se non ricordo male),è possibile farli corrispondere in altra numerazione?
esempio 0 diventa 3,550 o 3500 i decimali possono anche non servire, 200 corrispondere a 18000, 1230 uguale a 30000?? o comunque fare visualizzare dei valori personalizzati (una volta in funzione li misurerei per modificare la visualizzazione).

Se vai vai nel reference e dedichi un po' di tempo a studiarti le varie funzioni, sicuramente ne troverai tantissime adatte a quello che devi fare ...

Ad esempio ti segnalo la funzione map() che fa esattamente quello che tu richiedi relativamente alla trasposizione di valori :wink:

Guglielmo

Ciao Guglielmo, grazie mille infatti ho visto chec'è la funzione per modificare il valore da 0 a 1023 in 3000 30000, non ho capito se posso usare i decimali per una lettura migliore, separati da un punto...

No, la funzione map() funziona solo con interi con segno percui, niente decimali.

Ciao Uwe

Mari o sicuramente mi sbaglio, per fare funzionare i relé in modo che:

  • il comando ha un valore basso in confronto al valore sul motore si eccita il relè1, quando hanno lo stesso
    valore si ferma tutto fino a che non si varia il valore e si preme start.
  • se il comando ha un valore alto in confronto al valore sul motore e viene premuto un pulsante di start,
    si eccita il relé2, quando ha lo stesso valore si ferma tutto.
    un sistema simile all'inseguitore solare ad un asse solamente, potrebbe andare bene?? ho provato a vedere diversi programmi ma tutti utilizzano i soliti servo motori e non riesco a capire come poter fare invece con due semplici relè...

sto cominciando passo passo per riuscire a creare tutto il programma...
ho cominciato con il far leggere i potenziometri e a visualizzarli sia sul display (display 16x2 con i2c )che su seriale ma ho un problema...
sto provando tutti i modi ma non riesco a capire come mai facendogli leggere un valore oltre 10 e poi diminuendo sul display resta sempre il decimale anche se arrivo a 100 o a 1000 restano sempre i 3 decimali con valori diversi..
ho scritto questo codice....

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h>
int potentiometerPin = A0;
int value = 0;
int potentiometer2Pin = A1;
int value2 = 0; 
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
void setup()
{
  lcd.begin (16, 2);
  lcd.setCursor(4, 0);
  lcd.print("IZ1UQG");
  delay(1000);
  lcd.setCursor(0, 1);
  lcd.print("iz1uqg@gmail.com");
  delay(1000);
lcd.clear(); 
 lcd.begin (16, 2);
lcd.setCursor(0, 0);
  lcd.print("Impostata");
 lcd.setCursor(0, 1);
  lcd.print("Reale");

  Serial.begin(9600); // inizializzazione porta seriale
}
 
void loop()
{
 
  lcd.setCursor(12, 0);
  lcd.print (value);
  lcd.setCursor(12, 1);
  lcd.print (value2);
value = analogRead(potentiometerPin); // leggo valore potenziometro
Serial.print(value); // scrivo il valore sulla seriale come debugging
value2 = analogRead(potentiometer2Pin); // leggo valore potenziometro
Serial.println(value2); // scrivo il valore sulla seriale come debugging
    
}

via seraiale leggo il valore e si aggiorna, anche se un valore accanto all'altro usando il comando serial.println
purtroppo sull'lcd non lo fa....

**@IZ1UQG: **ti ricordo che in conformità al regolamento, punto 7, devi editare (in basso a destra del post, bottone More -> Modify) il tuo post e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra). Grazie :slight_smile:

Guglielmo

sono riuscito grazie a dei consigli da alcuni amici a risolvere il problema dei decimali che restavano memorizzati.
adesso sto cercando di implementare un codice per far eccitare i releè di comando...

ho cercato sul forum ma purtroppo non sono affatto un esperto di programmazione e vado a tentativi...

ho scritto questa parte di codice cercando di creare una comparazione tra due valori value e value2 che sarebbero i due potenziometri.

if (value == value2);
digitalWrite(uscita, LOW); //se sono uguali stop
digitalWrite(uscita1, LOW); //se sono uguali stop
if(value < value2); 
digitalWrite(uscita1, HIGH); // se impostata è miore di reale scende
if(value > value2);  
digitalWrite(uscita, HIGH); // se impostata è maggiore di reale sale
if(value >= value2);
digitalWrite(uscita1, HIGH); // se reale è uguale o maggiore di impostata scende
if(value <= value2);
digitalWrite(uscita1, HIGH); //se reale è minore o uguale di imposta sale

ho inserito inizialmente come pin e numero (volevo usare le uscite digitali d7 e d8 come pin 9 e 10 ma nulla da fare

ho cercato allora di usare le analogiche a2 ed a3 per comandare inizialmente almeno 2 relè ma restano perennmente eccitati e se inserisco il comando else restano diseccitati sempre

#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h>
int potentiometerPin = A0;
int value = 0;
int potentiometer2Pin = A1;
int value2 = 0; 

char _buffer[20];

aggiungendo

int uscita = A2; // salita
int uscita1 = A3; //discesa

poi nella sezione setup

void setup()
{

pinMode (A2, OUTPUT);  
pinMode (A3, OUTPUT);

non so dove sbattere la testa purtroppo... :confused: