Vai al contenuto
PLC Forum


Regalo di Natale inaspettato


dott.cicala

Messaggi consigliati

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
Link al commento
Condividi su altri siti


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

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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")

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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)

Link al commento
Condividi su altri siti

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.

 

 

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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);     
}

 

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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
Link al commento
Condividi su altri siti

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?.

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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--};	

 

Link al commento
Condividi su altri siti

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
Link al commento
Condividi su altri siti

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...