Vai al contenuto
PLC Forum

Partecipa anche tu alla Live su Youtube martedì 28/01/2025 per festeggiare i 24 anni di PLC Forum

Per ulteriori informazioni leggi questa discussione: https://www.plcforum.it/f/topic/326513-28012025




Regalo di Natale inaspettato


Messaggi consigliati

Inserito: (modificato)

Mi hanno regalato questo starter kit Clonuino Rev3....non sapendo della mia avversione verso il mondo arduino

Ino2.thumb.jpg.a67104a4991ab6da1d968465c9f9dd3d.jpg

C'è un gran numero di componenti, sensori, motorini ,un DVD pieno zeppo di esempi e programmini già fatti....tutto sommato è molto interessante.

Mi ha ricordato quelle scatole come l' Elettro Bral o il Meccano che ricevevo da bambino.

Adesso sono obbligato a giocarci :smile:

Modificato: da dott.cicala

Inserita:

anchio stò "giocando" con arduino, 😃😙 Stefano è bello ritornare "Bambini" 😅🤣 AUGURI, di Buone Feste !!! buon divertimento, con le Tue iniziative combinerai sicuramente qualcosa di BELLO !!!!!

Inserita:

Come si chiamava il puffo che si lamentava sempre ?  Brontolone ?

 

Io odio quella cosa li che ti hanno regalato . . . . 

Inserita:
29 minuti fa, luigi69 scrisse:

Io odio quella cosa li che ti hanno regalato

Anche io la pensavo così ma vista la gioia negli occhi dei miei figli che me l'hanno regalato...ho cambiato idea.

Inserita:

Dott.  certamente.    Se la metti così le cose cambiano . . . 

Inserita:

Auguri Danilo!!.....io non ho bisogno di tornar bambino, secondo mia madre e confermato da mia moglie, sono rimasto un po' indietro :superlol: (loro dicono "un po' scemo")

Inserita:

Esagerato 🤣🤣🤣, io mi sto divertendo a creare con arduino, un prova differenziale ed ora anche un soff starter, che mi serve per i miei hobby in legno, con calma e tempo penso che li farò, mi sto procurando il materiale, moc3020, Transistor, ecc.... spero per i primi dell'anno o al max per fine gennaio di finirli, 🤒, ciao

Inserita:
2 ore fa, dott.cicala scrisse:

Mi hanno regalato questo starter kit Clonuino Rev3....

Ecco, per dire, a me hanno regalato un maglione...:angry:

No dico, poi lamentatevi anche, te e quello che nello sgabuzzino trova elettronica vintage, quando nel mio abbondano solo gli scarafaggi... :angry:

 

Scherzo, era solo per farvi a tutti gli auguri in ritardo! :lol:

(ma il maglione me l'hanno regalato veramente!)

 

Ciao, Ale.

Inserita:
Quote

Anche io la pensavo così ma vista la gioia negli occhi dei miei figli che me l'hanno regalato...ho cambiato idea.

Ottima decisione, la felicità dei figli è la miglior cosa che ci sia!!

Quote

sono rimasto un po' indietro :superlol: (loro dicono "un po' scemo")

Sei in buona compagnia.......la mia.

Inserita:
12 ore fa, dott.cicala scrisse:

..io non ho bisogno di tornar bambino, secondo mia madre e confermato da mia moglie, sono rimasto un po' indietro :superlol: (loro dicono "un po' scemo")

 

Mantenere, in una certa misura, un po' di infantilismo è una cosa bellissima basta, come sempre, non esagerare.

 

Comunque i tuoi figli ti hanno fatto un bellissimo regalo; ti devono voler molto bene per cercare di assecondare le tue passioni. Inoltre è anche un bel kit.

 

13 ore fa, dott.cicala scrisse:

Mi ha ricordato quelle scatole come l' Elettro Bral o il Meccano che ricevevo da bambino.

 

E si son prorpio questi regali che iniziano a rovinarti.:P

Se invece del piccolo elettricista e del meccano mi avessero regalato, che so, il piccolo speculatore forse oggi sarei come Soros (che roba brutta)

Riccardo Ottaviucci
Inserita:

a me regalarono questi a suo tempo

image.jpeg.fe5a24042bd29878cf0b8e8b620a149d.jpegimage.jpeg.544b817a38ccecdde831c771183b7125.jpegil primo è stato fatale ...:roflmao:

Inserita:

Roba di lusso!

Inserita:
22 ore fa, dnmeza scrisse:

un prova differenziale ed ora anche un soff starter,

Interessante, ti invito a renderci partecipi così da ravvivare un po' l'ambiente B)

Io sono in attesa che mi venga qualche idea.

Ho provato il programmino che gestisce il motore passo passo da encoder e funziona male. Si perde qualche impulso e il motore a volte più che dei passi fa dei balzi....

Devo ancora indagare se è dovuto all'encoder o al codice.

 

 

Inserita:
48 minuti fa, dott.cicala scrisse:

Interessante, ti invito a renderci partecipi così da ravvivare un po' l'ambiente

non manchero, appeno mi arriva il materiale e l'avro provato

Inserita:

Ottima idea!

Aspettiamo con ansia le prossime applicazioni.

Visto che non c'è costruire Hw, magari darò il mio contributo.

 

11 ore fa, dott.cicala scrisse:

Devo ancora indagare se è dovuto all'encoder o al codice.

 

Stefano, se vuoi, metti il codice in una discussione così magari ci diamo un'occhiata e ne discutiamo.

Inserita:

Eccolo qua

 

#include "Stepper.h"
#define STEPS  32   // Number of steps for one revolution of Internal shaft
                    // 2048 steps for one revolution of External shaft

volatile boolean TurnDetected;  // need volatile for Interrupts
volatile boolean rotationdirection;  // CW or CCW rotation

const int PinCLK=2;   // Generating interrupts using CLK signal
const int PinDT=3;    // Reading DT signal
const int PinSW=4;    // Reading Push Button switch

int RotaryPosition=0;    // To store Stepper Motor Position

int PrevPosition;     // Previous Rotary position Value to check accuracy
int StepsToTake;      // How much to move Stepper

// Setup of proper sequencing for Motor Driver Pins
// In1, In2, In3, In4 in the sequence 1-3-2-4
Stepper small_stepper(STEPS, 8, 10, 9, 11);

// Interrupt routine runs if CLK goes from HIGH to LOW
void isr ()  {
  delay(4);  // delay for Debouncing
  if (digitalRead(PinCLK))
    rotationdirection= digitalRead(PinDT);
  else
    rotationdirection= !digitalRead(PinDT);
  TurnDetected = true;
}

void setup ()  {
  
pinMode(PinCLK,INPUT);
pinMode(PinDT,INPUT);  
pinMode(PinSW,INPUT);
digitalWrite(PinSW, HIGH); // Pull-Up resistor for switch
attachInterrupt (0,isr,FALLING); // interrupt 0 always connected to pin 2 on Arduino UNO
}

void loop ()  {
  small_stepper.setSpeed(700); //Max seems to be 700
  if (!(digitalRead(PinSW))) {   // check if button is pressed
    if (RotaryPosition == 0) {  // check if button was already pressed
    } else {
        small_stepper.step(-(RotaryPosition*50));
        RotaryPosition=0; // Reset position to ZERO
      }
    }

  // Runs if rotation was detected
  if (TurnDetected)  {
    PrevPosition = RotaryPosition; // Save previous position in variable
    if (rotationdirection) {
      RotaryPosition=RotaryPosition-1;} // decrase Position by 1
    else {
      RotaryPosition=RotaryPosition+1;} // increase Position by 1

    TurnDetected = false;  // do NOT repeat IF loop until new rotation detected

    // Which direction to move Stepper motor
    if ((PrevPosition + 1) == RotaryPosition) { // Move motor CW
      StepsToTake=50; 
      small_stepper.step(StepsToTake);
    }

    if ((RotaryPosition + 1) == PrevPosition) { // Move motor CCW
      StepsToTake=-50;
      small_stepper.step(StepsToTake);
    }
  }
     digitalWrite(8, LOW);
     digitalWrite(9, LOW);
     digitalWrite(10, LOW);
     digitalWrite(11, LOW);     
}

 

Inserita:

Tempo addietro ho letto un articolo sul proliferare di kit per Arduino, spiegavano che in pratica non tutti i moduli erano affidabili, forse l'encoder ha dei problemi

Inserita:

Scusa Stefano ma come piloti lo stepper? Usi la classica interfaccia basata sul 298?

Io qualche tempo fa avevo fatto un qualche cosa con uno stepper usando una vecchia interfaccia fatta da me e non usando le funzioni di libreria.

Usare arduino mi riporta alle tecniche di debug di 40 e più anni fa, quando si usava solo la teletype.

Io dividerei il problema in 2.

Ad esempio, con il PC che sfrutta la seriale come interfaccia dai il dto corrispondente al numero di passi e verifichi l'esecuzione.

Anche direzione e numero di passi ricevuti dall'encoder li puoi visualizzare sul terminale seriale.

Inserita: (modificato)

Lo stepper è un cosino piccolissimo che viene comandato direttamente da un buffer ULN2003, è proprio questo

image.png.8c7722b966a27bd9902f11f2558d5098.pngimage.png.f5c527dac80b68122a29ba3ca9cab57c.pngimage.png.fda2fe416d912d4e2a4fa19458be2f24.png

L'encoder è questo

image.png.9e8dd732a9d7a33acf0e67a49cbf61f7.png

Il problema sta proprio nell'encoder che genera gli impulsi un po' a casaccio, fa proprio schifo.

L'ho appurato tramite l'analizzatore di stati logici.

Ne ho uno Omron professionale come questo, ma non ho ancora provato a collegarlo

image.png.4719ad8c7dc21b8a608e9b615113645e.png

Modificato: da dott.cicala
Inserita:

Ero andato a rivedermi il mio programma ed anch'io, confrontando ill tuo, ero giunto alla medesima conclusione: il difettio eraq nel comando.

 

4 ore fa, dott.cicala scrisse:

 

Il problema sta proprio nell'encoder che genera gli impulsi un po' a casaccio, fa proprio schifo.

 

Son quelli usati come potenziometri digitali; però sei sicuro che sia lui e non il modo come li leggi?.

Inserita:

Io per quegli encoder uso sempre questo codice, che usa o 2 interrupt o un timer :

 

/*
 *      rotary_sm.ino   --  State machine implementation of rotary encoder driver
 *                          Interrupt driven; supports 2 types of interrupts:
 *                            * Polled interrupts; enable by defining TIMER2INT
 *                            * Pin change interrupts: enalbe by defining PINCHANGEINT
 *                              (Do NOT enable both at the same time)
 *
 *          This program is developed from the code at: 
 *              http://www.buxtronix.net/2011/10/rotary-encoders-done-properly.html
 *          Since this code was in the form of an arduino library, and I had unresolvable
 *          references that I could not figure out, I just modified it as a single sketch.
 *          The only library support required is if you want to use interrupt polling,
 *          and then the MsTimer2 library needs to be installed.
 */

/* Define PINCHANGEINT if you want to interrupt on any encoder pin change */
#define PINCHANGEINT
/* --- OR --- */
/* Define TIMER2INT if you want to use periodic interrupts to poll the encoder */
//#define TIMER2INT

/* Define ENABLEPULLUPS if there are no external pull-ups on encoder AB pins */
//#define ENABLEPULLUPS

/* Define to enable the ISR debug flag */
//#define ISRFLAG


/* You may need to install this library (MsTimer2) from the arduino site */
#ifdef TIMER2INT
#include    <MsTimer2.h>
#endif


#define DIR_NONE 0x00           // No complete step yet.
#define DIR_CW   0x10           // Clockwise step.
#define DIR_CCW  0x20           // Anti-clockwise step.

unsigned int state;
unsigned int A = 2;             // pins connected to the encoder (digital_pin 2)
unsigned int B = 3;             //              "                (digital_pin 3)
unsigned int ISRflag = 5;       //              "                (digital_pin 3)
         int count = 0;         // count each indent
         int old_count = 0;     // check for count changed


/*
 * The below state table has, for each state (row), the new state
 * to set based on the next encoder output. From left to right in,
 * the table, the encoder outputs are 00, 01, 10, 11, and the value
 * in that position is the new state to set.
 */

// State definitions state table (emits a code at 00 only)
// states are: (NAB) N = 0: clockwise;  N = 1: counterclockwiswe
#define R_START     0x3
#define R_CW_BEGIN  0x1
#define R_CW_NEXT   0x0
#define R_CW_FINAL  0x2
#define R_CCW_BEGIN 0x6
#define R_CCW_NEXT  0x4
#define R_CCW_FINAL 0x5

const unsigned char ttable[8][4] = {
    {R_CW_NEXT,  R_CW_BEGIN,  R_CW_FINAL,  R_START},                // R_CW_NEXT
    {R_CW_NEXT,  R_CW_BEGIN,  R_CW_BEGIN,  R_START},                // R_CW_BEGIN
    {R_CW_NEXT,  R_CW_FINAL,  R_CW_FINAL,  R_START | DIR_CW},       // R_CW_FINAL
    {R_START,    R_CW_BEGIN,  R_CCW_BEGIN, R_START},                // R_START
    {R_CCW_NEXT, R_CCW_FINAL, R_CCW_BEGIN, R_START},                // R_CCW_NEXT
    {R_CCW_NEXT, R_CCW_FINAL, R_CCW_FINAL, R_START | DIR_CCW},      // R_CCW_FINAL
    {R_CCW_NEXT, R_CCW_BEGIN, R_CCW_BEGIN, R_START},                // R_CCW_BEGIN
    {R_START,    R_START,     R_START,     R_START}                 // ILLEGAL
};

void setup( ) {
    pinMode( A, INPUT );
    pinMode( B, INPUT );

#ifdef ENABLEPULLUPS
    digitalWrite( A, HIGH );                // set pullups
    digitalWrite( B, HIGH );                //      "
#endif

#ifdef TIMER2INT
    MsTimer2::set( 1, T2_isr );             // interrupt polling:
    MsTimer2::start( );
#endif

#ifdef PINCHANGEINT
    attachInterrupt( 0, AB_isr, CHANGE );   // pin-change interrupts: 
    attachInterrupt( 1, AB_isr, CHANGE );
#endif

#ifdef ISRFLAG
    pinMode( ISRflag, OUTPUT );             // time the ISR
    digitalWrite( ISRflag, HIGH );          // set pull-up ON
#endif

    state = (digitalRead( A ) << 1) | digitalRead( B );     // Initialise state.
    old_count = 0;

    Serial.begin( 9600 );
    Serial.println( "Rotary Encoder Tests" );
}


#ifdef PINCHANGEINT
void AB_isr( ) {
    // Grab state of input pins.
    unsigned char pinstate = (digitalRead( A ) << 1) | digitalRead( B );

    // Determine new state from the pins and state table.
    state = ttable[state & 0x07][pinstate];

    if( state & DIR_CW )    count++;
    if( state & DIR_CCW )   count--;
}
#endif


#ifdef TIMER2INT
void T2_isr( ) {

#ifdef ISRFLAG
    digitalWrite( ISRflag, HIGH );
#endif

    // Grab state of input pins.
    unsigned char pinstate = (digitalRead( A ) << 1) | digitalRead( B );

    // Determine new state from the pins and state table.
    state = ttable[state & 0x07][pinstate];

    if( state & DIR_CW )    count++;        // count up for clockwise
    if( state & DIR_CCW )   count--;        // count down for counterclockwise

#ifdef ISRFLAG
    digitalWrite( ISRflag, LOW );
#endif
}
#endif


void loop( ) {
    if( old_count != count ) {
        Serial.println( count );
        old_count = count;
    }
}

 

Ciao, Ale.

Inserita:

Non mi sono ancora abituato alle lungaggini dell' arduinese.

 

Non ci sono i fronti di salita-discesa?

 

verrebbe una cosa elementare

	//*************************************************************************
	// tA= Traccia A
	// tB= Traccia B
	
	// rA= Fronte salita traccia A
	// rB= Fronte salita traccia B
	
	// fA= Fronte discesa traccia A
	// fB= Fronte discesa traccia B	
	
	// Impulsi = conteggio attuale encoder
	//*************************************************************************
	
	// Incremento
	if((rA &! tA)||(rB && tA)||(fA && tB)||(fB &! tB)){Impulsi++};
	
	// Decremento
	if((rB &! tA)||(rA && tB)||(fB && tA)||(fA &! tB)){Impulsi--};	

 

Inserita:
23 minuti fa, dott.cicala scrisse:

Non ci sono i fronti di salita-discesa?

Che io sappia no, se non per gli interrupts.

 

Ciao, Ale.

Inserita: (modificato)

magari una cosa così funziona

	tA=(digitalRead(trA)==HIGH);
	tB=(digitalRead(trB)==HIGH);
	
// Fonte salita traccia A
	rA= tA &! app1;
	app1=tA;

// Fonte discesa traccia A
	fA= !tA && app2;
	app2 =tA;

// Fonte salita traccia B
	rB= tB &! app3;
	app3=tB;

// Fonte discesa traccia B
	fB= !tB && app4;
	app4 =tB;

// Incremento
	if((rA &! tA)||(rB && tA)||(fA && tB)||(fB &! tB)){Impulsi++};
	
// Decremento
	if((rB &! tA)||(rA && tB)||(fB && tA)||(fA &! tB)){Impulsi--};	

 

Modificato: da dott.cicala

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...