Show Posts
Pages: [1] 2 3 ... 28
1  Using Arduino / Motors, Mechanics, and Power / Re: Rotary Encoder and Stepper motor on: May 04, 2014, 01:55:29 pm
I perfer to use the rotary encoder since it can turn in both directions without problem and so I think it's easier to handle for my application.

It is not a problem if I can't control the stepper motor smoothly, I just want to avoid to have the motor to move contonously even when I'm not moving the encoder.
I think this happens because the step() function continues to read the previous ecnoder value..
2  Using Arduino / Motors, Mechanics, and Power / Rotary Encoder and Stepper motor on: May 04, 2014, 11:32:13 am
Hi to all,

I'm using Motor Shield v2.0 by Seeedstudio with my Arduino UNO R3 since I want to control a stepper motor with a rotary encoder.

I'm able to read values from my rotary encoder and I'm also able to control the stepper motor without problems.

What I want to do is to move the stepper motor within a range between 0 to +90 degrees by moving the rotary encoder.
For example, if I move the encoder +4 then the motor should move clockwise +4 and then stops.
At this point, if I move the encoder -4 then the motor should return to its previous position and then stops.

What happens now is that when I move the encoder +4, the motor move forward clockwise but it does not stop and continue to go forward +4 and so on.

What I have to do in order to stop the motor after each command?
I tried to use a temp var (preValue) and to check if the last value from encoder is equals to the current value, but it seems to not work properly.

This is the code I'm using at the moment.

Thank you!

Code:
//  Demo function:The application method to drive the stepper motor.
//  Hareware:Stepper motor - 24BYJ48,Seeed's Motor Shield v2.0
//  Author:Frankie.Chu
//  Date:20 November, 2012
#define MOTOR_CLOCKWISE      0
#define MOTOR_ANTICLOCKWISE  1
/******Pins definitions*************/
#define MOTORSHIELD_IN1 8
#define MOTORSHIELD_IN2 11
#define MOTORSHIELD_IN3 12
#define MOTORSHIELD_IN4 13
#define CTRLPIN_A 9
#define CTRLPIN_B 10

//these pins can not be changed 2/3 are special pins
int encoderPin1 = 2;
int encoderPin2 = 3;
int preValue = 0;

volatile int lastEncoded = 0;
volatile long encoderValue = 0;

long lastencoderValue = 0;

int lastMSB = 0;
int lastLSB = 0;

const unsigned char stepper_ctrl[]={0x27,0x36,0x1e,0x0f};
struct MotorStruct
{
int8_t speed;
uint8_t direction;
};
MotorStruct stepperMotor;
unsigned int number_of_steps = 200;
/**********************************************************************/
/*Function: Get the stepper motor rotate                               */
/*Parameter:-int steps,the total steps and the direction the motor rotates.*/
/* if steps > 0,rotates anticlockwise,     */
/* if steps < 0,rotates clockwise.             */
/*Return: void                            */
void step(int steps)
{
int steps_left = abs(steps)*4;
int step_number;
int millis_delay = 60L * 1000L /number_of_steps/(stepperMotor.speed + 50);
if (steps > 0)
{
stepperMotor.direction= MOTOR_ANTICLOCKWISE;
step_number = 0;
}
    else if (steps < 0)
{
stepperMotor.direction= MOTOR_CLOCKWISE;
step_number = number_of_steps;
}
else return;
while(steps_left > 0)
{
PORTB = stepper_ctrl[step_number%4];
delay(millis_delay);
if(stepperMotor.direction== MOTOR_ANTICLOCKWISE)
{
step_number++;
   if (step_number == number_of_steps)
    step_number = 0;
}
else
{
step_number--;
   if (step_number == 0)
    step_number = number_of_steps;
}
steps_left --;

}
}
void initialize()
{
pinMode(MOTORSHIELD_IN1,OUTPUT);
pinMode(MOTORSHIELD_IN2,OUTPUT);
pinMode(MOTORSHIELD_IN3,OUTPUT);
pinMode(MOTORSHIELD_IN4,OUTPUT);
pinMode(CTRLPIN_A,OUTPUT);
pinMode(CTRLPIN_B,OUTPUT);
stop();
stepperMotor.speed = 25;
stepperMotor.direction = MOTOR_CLOCKWISE;
}
/*******************************************/
void stop()
{
/*Unenble the pin, to stop the motor. */
    digitalWrite(CTRLPIN_A,LOW);
    digitalWrite(CTRLPIN_B,LOW);
}

void setup()
{
initialize();//Initialization for the stepper motor.
  Serial.begin (9600);

 // pinMode(7, INPUT);    
  pinMode(encoderPin1, INPUT);
  pinMode(encoderPin2, INPUT);

  digitalWrite(encoderPin1, HIGH); //turn pullup resistor on
  digitalWrite(encoderPin2, HIGH); //turn pullup resistor on

  //call updateEncoder() when any high/low changed seen
  //on interrupt 0 (pin 2), or interrupt 1 (pin 3)
  attachInterrupt(0, updateEncoder, CHANGE);
  attachInterrupt(1, updateEncoder, CHANGE);
}

void loop()
{
        if (encoderValue >= 15) encoderValue = 15;
        if (encoderValue <= -15) encoderValue = -15;
        if (preValue == encoderValue)
       {
         stop();
       }
       else {
        Serial.print("encoderValue: ");
        Serial.print(encoderValue);
        Serial.print(" preValue: ");
        Serial.println(preValue);
step(encoderValue);//Stepper motors rotate anticlockwise 200 steps.
delay(1000);
       step(encoderValue);//Stepper motors rotate clockwise 200 steps.
delay(1000);
        preValue = encoderValue;
       }
}


void updateEncoder(){
  int MSB = digitalRead(encoderPin1); //MSB = most significant bit
  int LSB = digitalRead(encoderPin2); //LSB = least significant bit

  int encoded = (MSB << 1) |LSB; //converting the 2 pin value to single number
  int sum  = (lastEncoded << 2) | encoded; //adding it to the previous encoded value

  if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue ++;
  if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue --;

  lastEncoded = encoded; //store this value for next time
}
3  Using Arduino / Sensors / Analog Magnetic Sensor with Arduino on: April 02, 2014, 12:57:58 pm
Hello,

I would like to use Arduino to detect the magnetic field of different magnetic pads.
To do this, I've bought a 1108 Phidget sensor which has a voltage output proportional to the applied magnetic field.

I've bought also three magnetic pads with different size and force (200g, 300g and 400g).

I connected +5V and GND and the voltage output directly to A0 analog input in my Arduino UNO but the sensor readings are not so accurate because I can't recognize the magnetic field of each magnets but only their presence.

I was looking for the senso suggested also in the Arduino playground: A1301.
Do you think it will be suitable for my application?

I just want to be able to recognize at maximum 6 different magnetic pads without errors.

Thank you a lot!
4  International / Hardware / Re: Generare codici con Arduino e resistori on: April 04, 2013, 10:23:00 am
Guglielmo, ti ringrazio per il tuo feedback!
Allora li provo anche io! smiley
5  International / Hardware / Re: Generare codici con Arduino e resistori on: April 02, 2013, 07:57:14 am
Non è necessario che faccia il collegamento a caldo, posso spegnere e riavviare il sistema senza problemi.

Diciamo che, da questo punto di vista, comunque, la soluzione su RFID sarebbe quella più robusta e stabile perchè non richiederebbe connessioni tra Arduino e il modulo recante il codice.
6  International / Hardware / Re: Generare codici con Arduino e resistori on: April 02, 2013, 07:31:07 am
EDIT: per l'RFID mi serve solo trovare dei tag molto piccoli e non a forma di tessera come quelli comunemente usati.

Valuta anche gli iButton, in particolare il DS1990, 1000 pz 1.30$, sono grandi come una piccola batteria, sono indistruttibili e dialogano tramite onewire autoalimentandosi dalla stessa.

Non hanno bisogno nemmeno della connessione a GND?
Funzionano soltanto con il pin settato per l'1-wire?
7  International / Hardware / Re: Generare codici con Arduino e resistori on: April 02, 2013, 07:29:13 am
Mi sto documentando sugli iButton: avevo visto il sito la prima volta che li avevate nominati, ma non mi avevano convinto di più rispetto alla soluzione ATSHA204.
Ma ora mi sto ricredendo! smiley

Per quanto riguarda la soluzione RFID, stavo pensando di prendere direttamente il chip PN532 (lo stesso dello shield di AdaFruit) e fare il circuito direttamente senza usare lo shield, tanto i collegamento dovrebbero essere facili e dovrebbe venire a costare molto meno dello shield stesso.
8  International / Hardware / Re: Generare codici con Arduino e resistori on: April 02, 2013, 07:03:57 am
Accidenti, ragazzi, ora ho almeno tre soluzioni tutte adeguate al mio caso smiley Non potevo sperare di meglio! smiley

- ATSHA204
- ATtiny
- RFID

Forse l'ultima ha un costo più alto per via del lettore che comunque sarebbe solo uno dato che andrebbe collegato solo ad Arduino, ma poi i singoli tag costerebbero pochissimo.
Dovrei però acquistare un programmatore per scrivere i tag con i codici che mi servono.

Attiny, in effetti, ha dimensioni piccolissime, più piccole dell'atmega in TQFP ed è abbastanza semplice collegarlo.
Stessa cosa dicasi per ATSHA204.

Ho l'imbarazzo della scelta smiley-grin
EDIT: per l'RFID mi serve solo trovare dei tag molto piccoli e non a forma di tessera come quelli comunemente usati.
9  International / Hardware / Re: Generare codici con Arduino e resistori on: April 02, 2013, 06:45:49 am
RFID costa troppo per poterlo replicare n volte su n dispositivi da collegare. smiley-sad Sarebbe una soluzione, ma credo che i tag costino un bel pò e per utilizzarlo su molti device mi sa che occorre avere anche delle licenze di utilizzo. Anche se forse la storia delle licenze vale solo nel caso si voglia commercializzare qualcosa.

ATtiny sarebbe ottimale, ma è troppo grande e il tutto dovrà essere fatto in SMD, quindi, se non ci fossero problemi, preferirei optare per il chip ATSHA204 che è abbastanza piccolo.
Avevo pensato, inizialmente, di usare un atmega328 in SMD e fargli sparare il numero in continuazione attraverso la seriale dato che è una cosa che avevo già fatto e la programmazione dell'SMD mi era sembrata abbastanza agevole solo che il componente è già un bel pò grande (10x10x0.8mm) e richiede altri componenti aggiuntivi che occuperebbero solo spazio.

La soluzione basata su ATSHA204 mi sembra quella più agevole tanto, comunque, non devo fare il collegamento a caldo: prima collego e poi avvio Arduino che alimenterà il chip ATSHA204.
10  International / Hardware / Re: Generare codici con Arduino e resistori on: April 02, 2013, 06:16:40 am
...
Quindi a me serve solo la funzione per la lettura del numero seriale che dovrebbe essere il numero che è già impostato nel chip e che è univoco, cioè, non ci saranno altri chip atsha204 con lo stesso codice, giusto?
...

Si, a te occorre solo la lettura del numero di serie UNIVOCO. Tutte le altre funzioni sono per altri scopi, come autenticazione di messaggi, ecc. ecc.

Ogni singolo chip ha un suo codice UNIVOCO.

Guglielmo

Secondo la tua esperienza, potrei avere problemi nel leggere il codice seriale con Arduino?
Nel sito di sparkfun, nei commenti, mi sembra di aver letto che ci potrebbero essere problemi sulla velocità di comunicazione tra i due device e sulla precisione.
Oppure questo è valido solo per l'uso delle altre funzioni che, comunque, a me non servono?
11  International / Hardware / Re: Generare codici con Arduino e resistori on: April 02, 2013, 06:09:35 am
Questo PRNG usa un po' più componenti di quelli da te specificati:
http://robseward.com/misc/RNG2/

Ma a me non serve generare numeri casuali con Arduino, se ho ben capito cosa fa il circuito del link che mi hai postato.

Questo è quello che hai scritto inizialmente  smiley-razz:
Avrei una curiosità: secondo voi, è possibile generare codici univoci utilizzando solo dei resistori di valore diverso e solo uno o due pin di Aruino, digitali o analogici?

Secondo me, non ho spiegato bene quello che volevo fare all'inizio.
Cioè, non volevo intendere che volevo generare quei codici con Arduino, ma generarli con un circuito e leggerli da Arduino smiley Mi scuso per la confusione che ho fatto.  smiley-red

Mi spiego meglio: ho un Arduino UNO e poi dei circuiti a parte, magari inseriti in una black box, che poi collego ad Arduino.
I circuiti all'interno della black box devono essere in grado di comunicare un codice ad Arduino quando io li collego a quest'ultimo.
Il codice deve essere univoco in modo che io possa distinguere i vari circuiti che collego.
Il codice, quindi, mi viene dato dal circuito e non è generato da Arduino.
Inizialmente, avevo pensato di realizzare questi circuiti con dei resistori in modo da ottenere dei valori numeri diversi quando andavo a collegarli ad Arduino.
Poi, ho pensato che questi circuiti possono, in realtà, essere costituiti dal chip atsha204, come mi ha suggerito Guglielmo anche perchè la cosa sarebbe poco costosa; il tutto sarebbe accettabile se, come ho capito, per leggere il codice contenuto in ogni chip, mi basta usare la funzione generica per la lettura del codice seriale.
Per il MAC mi pare di capire che occorre scambiarsi dei pacchetti e la cosa non sarebbe ottimale, tanto a me serve solo ed esclusivamente riuscire a leggere un codice univoco una volta che collego il circuito al mio Arduino.
12  International / Hardware / Re: Generare codici con Arduino e resistori on: April 02, 2013, 05:55:35 am
In crittografia, un MAC è un codice di autenticazione di un messaggio:
http://it.wikipedia.org/wiki/Message_authentication_code
Una specie di firma digitale.

Ti ringrazio Leo!

Quindi a me serve solo la funzione per la lettura del numero seriale che dovrebbe essere il numero che è già impostato nel chip e che è univoco, cioè, non ci saranno altri chip atsha204 con lo stesso codice, giusto?

Perchè dato che il MAC richiede uno scambio di dati, non posso prenderlo in considerazione dato che non devo interagire con un solo chip. Corretto?
13  International / Hardware / Re: Generare codici con Arduino e resistori on: April 02, 2013, 05:51:46 am
Questo PRNG usa un po' più componenti di quelli da te specificati:
http://robseward.com/misc/RNG2/

Ma a me non serve generare numeri casuali con Arduino, se ho ben capito cosa fa il circuito del link che mi hai postato.

A me serve avere un numero elevato di circuiti separati da Arduino, ognuno con un codice univoco ben preciso, in modo da poter riconoscere ogni circuito una volta che io lo collego al mio Arduino.
14  International / Hardware / Re: Generare codici con Arduino e resistori on: April 02, 2013, 05:47:20 am
@gpb01: è un'ottima alternativa, ma non capisco come funziona, cioè, non capisco se il chip ha già un numero univoco o se gli deve essere impartito prima via software.
Non capisco nemmeno se per leggerlo da Arduino c'è bisogno di avere delle informazioni sul chip o se con lo stesso codice su Arduino è possibile leggere più di un chip ATSHA204 senza distinzioni.

Ogni ic arriva con un codice unico a 72 bit (4.72 * 10^21 diverse combinazioni), in più hai 4.5k di EEPROM in cui memorizzare ulteriori informazioni a tuo piacere.
Con lo stesso codice per Arduino, vedi libreria linkata da Sparkfun, leggi tutte le key che ti pare.

Si, la stavo leggendo solo che non capisco a cosa serve il MAC Challenge perchè avevo capito che il numero univoco fosse il numero seriale.

Cioè, pensavo che potevo accedere al valore del numero univoco contenuto nel chip già solo con la funzione serialNumberExample().

E' corretto o sto facendo degli errori nella comprensione del codice?
A cosa serve il Mac Challenge?

Code:
const int sha204Pin = 7;

atsha204Class sha204(sha204Pin);

void setup()
{
  Serial.begin(9600);
  Serial.println("Sending a Wakup Command. Response should be:\r\n4 11 33 43:");
  Serial.println("Response is:");
  wakeupExample();
  Serial.println();
  Serial.println("Asking the SHA204's serial number. Response should be:");
  Serial.println("1 23 x x x x x x x EE");
  Serial.println("Response is:");
  serialNumberExample();
  Serial.println();
  Serial.println("Sending a MAC Challenge. Response should be:");
  Serial.println("23 6 67 0 4F 28 4D 6E 98 62 4 F4 60 A3 E8 75 8A 59 85 A6 79 96 C4 8A 88 46 43 4E B3 DB 58 A4 FB E5 73");
  Serial.println("Response is:");
  macChallengeExample();
}

void loop()
{
}

byte wakeupExample()
{
  uint8_t response[SHA204_RSP_SIZE_MIN];
  byte returnValue;
  
  returnValue = sha204.sha204c_wakeup(&response[0]);
  for (int i=0; i<SHA204_RSP_SIZE_MIN; i++)
  {
    Serial.print(response[i], HEX);
    Serial.print(" ");
  }
  Serial.println();
  
  return returnValue;
}

byte serialNumberExample()
{
  uint8_t serialNumber[9];
  byte returnValue;
  
  returnValue = sha204.getSerialNumber(serialNumber);
  for (int i=0; i<9; i++)
  {
    Serial.print(serialNumber[i], HEX);
    Serial.print(" ");
  }
  Serial.println();
  
  return returnValue;
}

byte macChallengeExample()
{
  uint8_t command[MAC_COUNT_LONG];
  uint8_t response[MAC_RSP_SIZE];

  const uint8_t challenge[MAC_CHALLENGE_SIZE] = {
    0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
    0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF,
    0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
    0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF
  };

  uint8_t ret_code = sha204.sha204m_execute(SHA204_MAC, 0, 0, MAC_CHALLENGE_SIZE,
    (uint8_t *) challenge, 0, NULL, 0, NULL, sizeof(command), &command[0],
    sizeof(response), &response[0]);

  for (int i=0; i<SHA204_RSP_SIZE_MAX; i++)
  {
    Serial.print(response[i], HEX);
    Serial.print(' ');
  }
  Serial.println();
  
  return ret_code;
}
15  International / Hardware / Re: Generare codici con Arduino e resistori on: April 02, 2013, 05:34:38 am
@astrobeed: era quello che temevo, in effetti, i valori sono troppo affetti da errore smiley-sad

@gpb01: è un'ottima alternativa, ma non capisco come funziona, cioè, non capisco se il chip ha già un numero univoco o se gli deve essere impartito prima via software.
Non capisco nemmeno se per leggerlo da Arduino c'è bisogno di avere delle informazioni sul chip o se con lo stesso codice su Arduino è possibile leggere più di un chip ATSHA204 senza distinzioni.

Pages: [1] 2 3 ... 28