Jump to content
PLC Forum


dott.cicala

Regalo di Natale inaspettato

Recommended Posts

dott.cicala

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:

Edited by dott.cicala

Share this post


Link to post
Share on other sites

dnmeza

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

Share this post


Link to post
Share on other sites
luigi69

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

 

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

Share this post


Link to post
Share on other sites
dott.cicala
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.

Share this post


Link to post
Share on other sites
luigi69

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

Share this post


Link to post
Share on other sites
dott.cicala

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

Share this post


Link to post
Share on other sites
dnmeza

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

Share this post


Link to post
Share on other sites
ilguargua
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.

Share this post


Link to post
Share on other sites
Ivan Botta
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.

Share this post


Link to post
Share on other sites
Livio Orsini
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)

Share this post


Link to post
Share on other sites
Riccardo Ottaviucci

a me regalarono questi a suo tempo

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

Share this post


Link to post
Share on other sites
dott.cicala
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.

 

 

Share this post


Link to post
Share on other sites
dnmeza
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

Share this post


Link to post
Share on other sites
Livio Orsini

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.

Share this post


Link to post
Share on other sites
dott.cicala

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

 

Share this post


Link to post
Share on other sites
Lorenzo-53

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

Share this post


Link to post
Share on other sites
Livio Orsini

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.

Share this post


Link to post
Share on other sites
dott.cicala

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

Edited by dott.cicala

Share this post


Link to post
Share on other sites
Livio Orsini

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

Share this post


Link to post
Share on other sites
ilguargua

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.

Share this post


Link to post
Share on other sites
dott.cicala

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

 

Share this post


Link to post
Share on other sites
ilguargua
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.

Share this post


Link to post
Share on other sites
dott.cicala

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

 

Edited by dott.cicala

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...