Show Posts
Pages: [1] 2 3 4
1  Using Arduino / Motors, Mechanics, and Power / controller brushless 48V 500W on: February 13, 2014, 06:38:50 am
Salve a tutti, devo realizzare un progetto che comporta l'uso di un motore da 24/36/48 V , da almeno 500Watt .  Tale motore dovrá essere controllato da Arduino. Ovviamente ho bisogno di un driver che lavori con quelle tensioni in gioco.

Vorrei chiedervi se mi consigliate di realizzarmelo da zero oppure se mi conviene trovarne uno giá fatto. In quest'ultimo caso, dato che trovo solo controller come questi (http://www.ebay.it/itm/48V-600W-brushless-controller-for-E-bike-scooter-/300352534034?pt=LH_DefaultDomain_0&hash=item45ee67f612&_uhb=1) pensate che posso interfacciarlo con arduino ?

Grazie a tutti.
2  Using Arduino / Programming Questions / Re: Samsung AC IR remote Decode Problem on: August 27, 2013, 11:59:26 am
Sorry to all i was too late to post the solution of samsung IR remote decoding.
I am here to explain step by step.
Code:
#include <avr/interrupt.h>
#include <avr/io.h>

#define TIMER_RESET  TCNT1 = 0
#define SAMPLE_SIZE  255

int IRpin = 3;
unsigned int TimerValue[SAMPLE_SIZE];
char direction[SAMPLE_SIZE];
byte change_count;
long time;

void setup() {
  Serial.begin(115200);
  Serial.println("Analyze IR Remote");
  TCCR1A = 0x00;          // COM1A1=0, COM1A0=0 => Disconnect Pin OC1 from Timer/Counter 1 -- PWM11=0,PWM10=0 => PWM Operation disabled
  // ICNC1=0 => Capture Noise Canceler disabled -- ICES1=0 => Input Capture Edge Select (not used) -- CTC1=0 => Clear Timer/Counter 1 on Compare/Match
  // CS12=0 CS11=1 CS10=1 => Set prescaler to clock/64
  TCCR1B = 0x03;          // 16MHz clock with prescaler means TCNT1 increments every 4uS
  // ICIE1=0 => Timer/Counter 1, Input Capture Interrupt Enable -- OCIE1A=0 => Output Compare A Match Interrupt Enable -- OCIE1B=0 => Output Compare B Match Interrupt Enable
  // TOIE1=0 => Timer 1 Overflow Interrupt Enable
  TIMSK1 = 0x00;          
  pinMode(IRpin, INPUT);
}

void loop()
{
  Serial.println("Waiting...");
  change_count = 0;
  while(digitalRead(IRpin) == HIGH) {}                                
  TIMER_RESET;
  TimerValue[change_count] = TCNT1;
  direction[change_count++] = '0';
  while (change_count < SAMPLE_SIZE) {
    if (direction[change_count-1] == '0') {
      while(digitalRead(IRpin) == LOW) {}
      TimerValue[change_count] = TCNT1;
      direction[change_count++] = '1';
    } else {
      while(digitalRead(IRpin) == HIGH) {}
      TimerValue[change_count] = TCNT1;
      direction[change_count++] = '0';
    }
  }
  Serial.println("Bit stream detected!");
  change_count = 0;
  time = (long) TimerValue[change_count] * 4;
  Serial.print(time);
  Serial.print("\t");
  Serial.println(direction[change_count++]);
  while (change_count < SAMPLE_SIZE) {
    time = (long) TimerValue[change_count] * 4;
    Serial.print(time);
    Serial.print("\t");
    Serial.println(direction[change_count-1]);
    Serial.print(time);
    Serial.print("\t");
    Serial.println(direction[change_count++]);    
  }
  Serial.println("Bit stream end!");
  delay(2000);
}
result shows
Code:
Analyze IR Remote
Waiting...
Bit stream detected!
0 0
3548 0
3548 1
5180 1
5180 0
5684 0
5684 1
6864 1
6864 0
7364 0
7364 1
8548 1
8548 0
9044 0
9044 1
9380 1
9380 0
9888 0
9888 1
10224 1
10224 0
10724 0
10724 1
11060 1
11060 0
11564 0
11564 1
12744 1
12744 0
13248 0
13248 1
13584 1
13584 0
14084 0
14084 1
14420 1
14420 0
14928 0
14928 1
16104 1
16104 0
16608 0
16608 1
17788 1
17788 0
18292 0
18292 1
18628 1
18628 0
19128 0
19128 1
20312 1
20312 0
20812 0
20812 1
21148 1
21148 0
21648 0
21648 1
21992 1
21992 0
22488 0
22488 1
23668 1
23668 0
24172 0
24172 1
25352 1
25352 0
25856 0
25856 1
26192 1
26192 0
26692 0
26692 1
27876 1
27876 0
28376 0
28376 1
29552 1
29552 0
30060 0
30060 1
30396 1
30396 0
30896 0
30896 1
31236 1
31236 0
31736 0
31736 1
32916 1
32916 0
33420 0
33420 1
33756 1
33756 0
34256 0
34256 1
34592 1
34592 0
35100 0
35100 1
36276 1
36276 0
36780 0
36780 1
37116 1
37116 0
37616 0
37616 1
37952 1
37952 0
38460 0
38460 1
38796 1
38796 0
39296 0
39296 1
39636 1
39636 0
40136 0
40136 1
40472 1
40472 0
40980 0
40980 1
41316 1
41316 0
41816 0
41816 1
42152 1
42152 0
42656 0
42656 1
42992 1
42992 0
43492 0
43492 1
43828 1
43828 0
44336 0
44336 1
44672 1
44672 0
45172 0
45172 1
45512 1
45512 0
46012 0
46012 1
46348 1
46348 0
46848 0
46848 1
47192 1
47192 0
47692 0
47692 1
48028 1
48028 0
48532 0
48532 1
48868 1
48868 0
49368 0
49368 1
49704 1
49704 0
50208 0
50208 1
50544 1
50544 0
51044 0
51044 1
51380 1
51380 0
51888 0
51888 1
52224 1
52224 0
52724 0
52724 1
53064 1
53064 0
53564 0
53564 1
54744 1
54744 0
55248 0
55248 1
55584 1
55584 0
56084 0
56084 1
56428 1
56428 0
56928 0
56928 1
57264 1
57264 0
57760 0
57760 1
58104 1
58104 0
58604 0
58604 1
58940 1
58940 0
59444 0
59444 1
59784 1
59784 0
60280 0
60280 1
60620 1
60620 0
61128 0
61128 1
61460 1
61460 0
61960 0
61960 1
62296 1
62296 0
62800 0
62800 1
63136 1
63136 0
63636 0
63636 1
63980 1
63980 0
64480 0
64480 1
64816 1
64816 0
65316 0
65316 1
65656 1
65656 0
66156 0
66156 1
67340 1
67340 0
67840 0
67840 1
68176 1
68176 0
68676 0
68676 1
69020 1
69020 0
69520 0
69520 1
69856 1
69856 0
70356 0
70356 1
70696 1
70696 0
71196 0
71196 1
71532 1
71532 0
72036 0
72036 1
73216 1
73216 0
73716 0
73716 1
74900 1
74900 0
75400 0
75400 1
75736 1
75736 0
76240 0
76240 1
77420 1
77420 0
77924 0
77924 1
79104 1
79104 0
79600 0
79600 1
79944 1
79944 0
80444 0
80444 1
80780 1
80780 0
81284 0
81284 1
81620 1
81620 0
82120 0
82120 1
82456 1
82456 0
82964 0
82964 1
83300 1
83300 0
83800 0
83800 1
84136 1
84136 0
84640 0
84640 1
84976 1
84976 0
85476 0
85476 1
85820 1
85820 0
86320 0
86320 1
87504 1
87504 0
88000 0
88000 1
88340 1
88340 0
88836 0
88836 1
89180 1
89180 0
89680 0
89680 1
90016 1
90016 0
90516 0
90516 1
90860 1
90860 0
91356 0
91356 1
91692 1
91692 0
92192 0
92192 1
92536 1
92536 0
93036 0
93036 1
93372 1
93372 0
93876 0
93876 1
94212 1
94212 0
94712 0
94712 1
95048 1
95048 0
95556 0
95556 1
95892 1
95892 0
96392 0
96392 1
96732 1
96732 0
97232 0
97232 1
97568 1
97568 0
98068 0
98068 1
98412 1
98412 0
98912 0
98912 1
99248 1
99248 0
99748 0
99748 1
100088 1
100088 0
100588 0
100588 1
100924 1
100924 0
101432 0
101432 1
101768 1
101768 0
102268 0
102268 1
102608 1
102608 0
103116 0
103116 1
103444 1
103444 0
103944 0
103944 1
104288 1
104288 0
104784 0
104784 1
105124 1
105124 0
105620 0
105620 1
105964 1
105964 0
106464 0
106464 1
106800 1
106800 0
107300 0
107300 1
107644 1
107644 0
108140 0
108140 1
108480 1
108480 0
108984 0
108984 1
109320 1
109320 0
109820 0
109820 1
110160 1
110160 0
110660 0
110660 1
110996 1
110996 0
111496 0
111496 1
111840 1
111840 0
112340 0
112340 1
112676 1
112676 0
113176 0
113176 1
113516 1
113516 0
114016 0
114016 1
114352 1
114352 0
114852 0
114852 1
115196 1
115196 0
115696 0
115696 1
116032 1
116032 0
116532 0
116532 1
116872 1
116872 0
117372 0
117372 1
117716 1
117716 0
118216 0
118216 1
118552 1
118552 0
119052 0
119052 1
119392 1
119392 0
119892 0
119892 1
120228 1
120228 0
120728 0
120728 1
121072 1
121072 0
121572 0
121572 1
121908 1
121908 0
122408 0
122408 1
122748 1
122748 0
123248 0
123248 1
123584 1
123584 0
124084 0
124084 1
124428 1
124428 0
124928 0
124928 1
125264 1
125264 0
125768 0
125768 1
126104 1
126104 0
126604 0
126604 1
126948 1
126948 0
Bit stream end!
Waiting...

Copy the result and past it in notpad, save it as dat extension file.
Open this file in gnuplot .(explain in uploaded figure named "gnuplot command"). Press enter to see the graph.
Graph shows mark and spaces.
code decoding is explained in the figure"gnuplot explain"
Anybody who did not understand can share his confusion.






Ok, once i have my chart what's the next step? Thanks a lot.  smiley-lol
3  International / Software / Re: Port Manipulation Encoder on: March 12, 2013, 07:05:41 am
Io ho appena costruito un oggetto vagamente simile al tuo, con display grafico abbastanza impegativo, e per variate alcuni parametri ho usato un encoder rotativo (a mò di Volume autoradio), usando gli interrupt sui pin 2 e 3.

Mi spieghi che problemi avresti con il display, visto che non usa alcun timer interno (unico motivo per cui un Interrupt ext non dovrebbe funzionare)?

Solo usando gli interrupt puoi avere una "fluidità" di utilizzo soddisfacente.

Tieni sempre a mente che l'ambizione e coronamento finale di un "Power user" di MCU, è quella di non scrivere NULLA nella funzione while(), nel caso di Arduino la funzione loop().

Utilizzo display glcd con controller ST7565 (http://www.ladyada.net/learn/lcd/st7565.html) e relative librerie che non mi consentono di usare interrupt, pena lo sputtanamento del display e relativo reset.

Se aumento il numero degli impulsi acquisisti, prelevandoli non solo dal fronte di salita ma anche da quello di discesa, avrei miglioramenti oppure la situazione sarebbe la stessa?
4  International / Software / Re: Port Manipulation Encoder on: March 11, 2013, 09:14:54 pm
Grazie, ora funziona!
Ho applicato la stessa funzione ad un encoder Hall di un motore che fa al massimo 80 giri/minuto (rapporto riduzione 131:1), con una risoluzione di 64 cpr, ma di cui utilizzo un solo canale, perché la direzione la prendo da una variabile impostata altrove. (non posso usare gli interrupt)
Dopo alcuni calcoli, ho fatto in modo che ad ogni 25 impulsi letti (solo sul fronte di salita) mi faccio aumentare una variabile per indicarmi i millimetri percorsi. Ora per distanze che vanno da 5mm fino ad 80 mm la precisione é buona. Oltre gli 80 mm inizio ad avere imprecisioni non uniformi.
Tengo a precisare che ho modificato gran parte delle funzioni presenti nel codice con quelle proprie della port manipulation ed ora tutto il funzionamento mi sembra molto piú fluido e senza ritardi.

Cosa posso fare per aumentare la precisione?
5  International / Software / Re: Port Manipulation Encoder on: March 10, 2013, 06:06:58 am
Purtroppo non posso usare gli interrupt perché mi da problemi con il display.
Inoltre vorrei imparare meglio la port manipulation. Secondo voi il codice é corretto?
6  International / Software / Port Manipulation Encoder on: March 09, 2013, 09:27:45 pm
Ciao a tutti. Devo controllare un rotary encoder per interfaccia utente e devo modificare il codice in "true C" per velocizzare le letture. Sto usando Arduino Uno (Atmega328).

Il codice di partenza é questo:

Code:
encoderLast=LOW;
n=LOW;
void setup(){
pinMode(2,INPUT);
pinMode(3,INPUT);
digitalWrite(2,HIGH);
digitalWrite(3,HIGH);
}
void loop(){
encoder();
}
void encoder(){
  n = digitalRead(2);
   if ((encoderLast == LOW) && (n == HIGH)) {
    if (digitalRead(3) == LOW) {
       encoderPos--;
     } else {
       encoderPos++;
     }
   }
   encoderLast = n;
}

Ora dovrei velocizzare la funzione encoder utilizzando la port manipulation:

Code:
void encoder(){
  n = PIND & _BV(PIND2);
   if ((encoderLast == LOW) && (n == HIGH)) {
    if ((PIND & _BV(PIND3)) == LOW) {
       encoderPos--;//antiorario
     } else {
       encoderPos++;//orario
     }
   }
   encoderLast = n;
}

Il risultato della modifica é che la variabile encoderPos non si incrementa ne si decrementa ed é come se nelle condizioni vi sia qualcosa che non va. Potete aiutarmi? Grazie
7  International / Software / Re: Velocizzare l'IO delle porte digitali on: March 09, 2013, 10:16:10 am
Ragazzi mi inserisco anche io nella discussione perché ho un problema con gli input utilizzando "true C". Non so se devo aprire un'altra discussione, nel dubbio posto la domanda...

In pratica devo sostituire il classico DigitalRead(pin) con PINx.
Il codice di test é questo:
Code:
int encoder0PinALast=LOW;
int countPulses=0;
int n=LOW;

void setup()
{
  Serial.begin(115200);
  
  pinMode(2,INPUT);
  pinMode(3,INPUT);
  digitalWrite(2,HIGH);
  digitalWrite(3,HIGH);
}

void loop()
{
  
  encoderMotor();
 }

void encoderMotor(){
 // n = digitalRead(2);
 n=PIND & _BV(PCINT2);//<== il mio dubbio é qui. n varrá di volta in volta 1 o 0 ??

   if ((encoder0PinALast == LOW) && (n == HIGH ) ) {
      if (PIND & _BV(PCINT19) == LOW) {
       countPulses++;
     } else {
       countPulses--;
     }
   }
   encoder0PinALast = n;
}

Il fatto é che l' if non procede nel modo corretto e non ottengo ne l'incremento ne il decremento della variabile. Potreste chiarirmi il concetto su PINx ? Grazie.
8  International / Software / Re: Encoder quadratura e calcolo rpm on: March 01, 2013, 06:44:49 am
Grazie intanto per le risposte.

Questo é il mio codice modificato:
Code:
#define encoder0PinA  2
#define encoder0PinB  5
#define pinmotorPWM 3
#define pinmotor 4

volatile unsigned int encoder0Pos = 0;
byte pwm=255;
unsigned long timecamp;
unsigned long currentTime;
unsigned long timeold;
float rpm;
//float spost;
void setup() {
  Serial.begin (115200);


  pinMode(encoder0PinA, INPUT);
  digitalWrite(encoder0PinA, HIGH);       // turn on pullup resistor
  pinMode(encoder0PinB, INPUT);
  digitalWrite(encoder0PinB, HIGH);       // turn on pullup resistor

  attachInterrupt(0, doEncoder, RISING);  // encoder pin on interrupt 0 - pin 2
  Serial.println("start");                // a personal quirk
  timecamp=1000;
  rpm=0.0;
  spost=0.0;
}
void avanti() {
digitalWrite(4, HIGH); 
analogWrite(3, (255-pwm)); 
 
}
void indietro() {
      digitalWrite(4, LOW);
analogWrite(3,pwm);   
}

void ferma() {            //ferma i motori
digitalWrite(pinmotor, LOW);   
digitalWrite(pinmotorPWM, LOW);
 
 

void loop(){

currentTime=millis();

if(currentTime-timecamp > 1000){
  rpm=((encoder0Pos/16)/131.25)*60;
  encoder0Pos=0;
  Serial.println(rpm);
  timecamp=millis();

  }
}

void doEncoder() {
 
  if (digitalRead(encoder0PinA) == digitalRead(encoder0PinB)) {
    encoder0Pos++;
  } else {
    encoder0Pos--;
  }

 
}

Ora riesco a vedere i giri/min e dividendo per il rapporto di riduzione ottengo i giri esatti.

L'altra domanda cruciale che vorrei porvi é come calcolare la distanza percorsa ad ogni giro (o anche meno di un giro) del motore. Ho pensato di usare la velocitá tangenziale: V=W x r dove ottengo lo spostamento in metri al secondo (o mm al secondo) attraverso il prodotto della velocitá angolare e del raggio della ruota.

Secondo voi sarebbe una buona soluzione? Avete delle alternative?
Grazie 
9  International / Software / Re: Encoder quadratura e calcolo rpm on: February 28, 2013, 07:46:09 am
ragazzi non c'é nessuno che mi aiuta?
10  International / Software / Encoder quadratura e calcolo rpm on: February 27, 2013, 07:51:44 pm
Ciao, ho bisogno di un consiglio su come ottenere i giri di un motoriduttore 12Volt dotato di un encoder Hall a 64 CPR (http://arduino.cc/forum/index.php?PHPSESSID=9ce889364b858aa71b53f24042e5cf26&topic=36204.45).
 Il motore ha una velocitá massima di 80 giri minuto con un rapporto di riduzione di 131:1.
Ho cercato di visualizzare gli rpm con questo codice:

Code:
byte pwm=255;
volatile int rpmcount;
 unsigned int rpm;
 unsigned long timeold;
 float tempFloat = 0.0;
#define SHAFT_ENCODER_PPR 64.0
void setup() {
  //MOTORE DESTRO 
  Serial.begin(115200);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
digitalWrite(3,HIGH);
//attachInterrupt(0, rpm_fun, HIGH);
   rpmcount = 0;
   rpm = 0;
   timeold = 0;

avanti(pwm);      //chiama procedura avanti

}

void avanti(byte pwm) {
digitalWrite(4, HIGH); 
analogWrite(3, (255-pwm)); 
 
}

void indietro(byte pwm) {
digitalWrite(4, LOW);
analogWrite(3, pwm);   

}

void fermo() {            //ferma i motori
digitalWrite(4, LOW);   
digitalWrite(3, LOW);   



void loop() 
{
 
//Update RPM every second
   delay(1000);
   detachInterrupt(0);
 
   tempFloat = (rpmcount / SHAFT_ENCODER_PPR) * 600.0;
   rpmcount = 0;
   Serial.println(tempFloat,DEC);
 

   //Restart the interrupt processing
   attachInterrupt(0, rpm_fun, RISING);

}

void rpm_fun()
 {
   rpmcount++;
 
 }
 
 

Non sono sicuro, peró, se il numero di giri ottenuti sono quelli giusti, anche perché se divido poi per 131 non ottengo nulla che si avvicini ad 80. Potreste dirmi se sbaglio qualcosa e consigliarmi una formula adatta allo scopo?

Grazie
11  International / Hardware / Re: Scelta encoder incrementale per distanza percorsa on: February 24, 2013, 10:27:27 pm
Allora, ho giá ordinato tutto il necessario per la prima slitta, encoder compreso. Ora devo allestire la seconda slitta che la corerá in parallelo con la precedente.

Per questa abbiamo optato per un acquisto di un motoriduttore con encoder incorporato, con cui devo rilevare velocitá, verso di rotazione e distanza percorsa. Vorrei un consiglio tra questi due modelli tenendo conto delle peculiaritá dell' encoder:

opzione1:
http://www.robot-italy.com/it/gearmotor-12vdc-81rpm-encoder.html

opzione 2:
http://www.robotstore.it/product/304/Motoriduttore-12V-80rpm-18Kg-cm-diam.-37mm-con-Encoder.html
12  International / Hardware / Re: Scelta encoder incrementale per distanza percorsa on: February 20, 2013, 12:39:05 pm
Allora, sono in procinto di finire l'ordine e finalmente acquistare da RS . Manca all'appello il connettore da collegare sui pin dell'encoder (http://it.rs-online.com/web/p/encoder-ottici-rotativi/2632889/) . Deve essere a 5 vie e molto fine con passo da 2,54 e la terminazione su cavi. Dato che é la prima volta che mi trovo ad acquistare connettori non preassemblati, vi chiedo gentilmente di aiutarmi a trovare quello giusto nella jungla RS. Ho scoperto che tali connettori vengono venduti senza contatti, che devono essere acquistati a parte e sono nel pallone piú totale. smiley-sad-blue
13  International / Hardware / Re: Scelta encoder incrementale per distanza percorsa on: February 15, 2013, 04:04:02 pm
Ragazzi, dato che ho fretta nel portare a termine il progetto vi rinnovo di nuovo la mia domanda:

É possibile determinare la distanza percorsa dal carrello con soluzioni alternative all'encoder?

Nel caso, sarebbe meglio acquistare un altro motore con encoder incorporato anziché il singolo encoder ? Che dite?
14  International / Hardware / Re: Scelta encoder incrementale per distanza percorsa on: February 15, 2013, 08:38:05 am
Potresti dirmi il perché non va bene e quale modello/tipo dovrei scegliere?
Perché sono fatti per essere un interfacia utente e percui con un numero di azionamenti limmitati oltre hanno un dispositivo per sentire i scatti.  Quello che hai indicato ha una vita di 100,000 cicli (scatti) ed é sicuramente meccanico (contatti su un disco sagomato) mentre quello che ha indicato astrobeed é ottico percui senza contatto ed é garantito per 10 000 000 giri a una velocita di 300 giri al minuto (versione ENA..) e per 200 000 000 giri a una velocita di 3000 giri al minuto (versione ENS..) (che sono un uso continuo di 23 e 46 giorni alla massima velocitá. Il limite é in questi modelli il cuscinetto sul quale gira l'albero. Altri modelli che non hanno un cucineto interno ma usano quello del motore/ingranaggio hanno una vita utile praticamente infinita che é determinata dalla meccanica del motore/riduttore).

Parli che vuoi determinare la posizio nella grandezza tra i mm e cm. Quanto é la corsa del carello? 10 cm o svariati metri?

Ciao Uwe

la lunghezza della slitta va da 1 metro fino anche ad arrivare a 3-4 metri. Dipende dalle versioni e cmq la lunghezza é sempre nota a priori.

Il modello di astrobeed l'avevo giá visto ed infatti ora ho chiarito i miei dubbi, penso che mi orieteró verso questo modello.

Vorrei farvi un'altra domanda. É possibile calcolare la distanza percorsa senza encoder? Oppure vi sono altre soluzioni oltre all'uso di encoder?
15  International / Hardware / Re: Scelta encoder incrementale per distanza percorsa on: February 14, 2013, 07:05:39 pm
Potresti dirmi il perché non va bene e quale modello/tipo dovrei scegliere?
Pages: [1] 2 3 4