Show Posts
Pages: [1] 2 3 ... 9
1  International / Software / Re: Utilizzo libreria SPI on: May 15, 2014, 08:14:38 am
ok.
l'adc non ha il pin CS.
Quindi visto il tutorial anche se ancora non ho avuto modo di verificare, il codice originario dovrebbe essere in grado di gestire un adc (seriale a due vie).

Quindi siccome non ho il pin CS, che caratterizza gli ADC a tre vie.

Se io assegno ad ogni adc la sua coppia di pin digitali e di volta in volta utilizzo la coppia opportuna in funzione dell'adc scelto sto sbagliando ?

devo gestire più adc contemporaneamente (almeno tre).

suggerimenti su come fare ?



2  International / Software / Utilizzo libreria SPI on: May 15, 2014, 07:50:00 am
Sto tentando di realizzare una libreria per gestire un ADC.
In modo tale da creare un'istanza per ogni ADC collegato.

Nella compilazione nonostante tutto ho fatto l'include della SPI.h mi solleva l'errore
'SPI' was non declared in this scope.

Non capisco dove il problema (sicuramente una banalità)

Code:
/* codice preso da http://forum.arduino.cc/index.php?topic=57873.0 */

#include "Arduino.h"
#include "ADS1252.h"
#include <SPI.h>

ADS1252::ADS1252(int SCLK, int MISO)
{
  SCLKPIN=SCLK;
  MISOPIN=MISO;
  
  pinMode(SCLKPIN, OUTPUT); pinMode(MISOPIN, INPUT);
  // corresponding to SCK pin and DRDY/DOUT pin on ADC
}

void ADS1252::init()
{
  resetADC();
  // put ADC on reset at the outset
  
  SPI.begin(); // riga dove viene generato l'errore
  // initialize SPI (with default settings, including...
  // CPOL = 0: so that SCLK is normally LOW
  // CPHA = 0: data sampled on rising edge (LOW to HIGH)
  // perhaps try changing CPHA ??
  
  digitalWrite(SCLKPIN, LOW);
  // release ADC from reset; now we're at a known point
  // in the timing diagram, and just have to wait for
  // the beginning of a conversion cycle
}

long ADS1252::readRaw()
{
  if (digitalRead(MISOPIN) == HIGH) readADC();
  
  return value;
}

float ADS1252::readVolt()
{
  if (digitalRead(MISOPIN) == HIGH) readADC();
  
  return value*3300/16777216;
}

void ADS1252::readADC()
{
  drdyWait();
  // go to drdy_wait routine, where we wait for
  // DRDY phase to pass, and thus for DOUT phase to begin

  byte1 = SPI.transfer(0x00);
  byte2 = SPI.transfer(0x00);
  byte3 = SPI.transfer(0x00);
  
  value = ....
}

void ADS1252::resetADC()
// to reset ADC, we need SCLK HIGH for min of 4 CONVCYCLES
// so here, hold SCLK HIGH for 5 CONVCYCLEs = 1440 usec
{
  digitalWrite(SCLKPIN, HIGH);
  delayMicroseconds(1440);
}

void ADS1252::drdyWait()
// wait for DRDY to pass and to reach start-point of DOUT
{
  delayMicroseconds(30);
  // to be safe, 30 usec, instead of 27 usec, which is
  // the expected period of DRDY phase
}
3  International / Software / Re: comporre byte on: May 14, 2014, 08:51:42 am
Ma con che libreria li leggi ???
... perché NON mi sembra che quel chip abbia un'interfaccia standard ... mi sembra piuttosto che occorre un programma che deve aspettare il DRDY e a quel punto leggere dando un segnale di clock su SCLK e leggere i bit su DOUT ...  smiley-roll

Guglielmo

sono partito da questo link: http://forum.arduino.cc/index.php?topic=57873.0
che coincide con il tuo link. Devo dire che ancora non ho provato a collegarli ed utilizzarli.

ritornando alla soluzione hardware: basta collegare i pin dell'adc (DRDY/DOUT - SCLK) a due ingressi del multiplexer e poi selezionare da arduino a quali canali accedere  e quindi a quale adc accedere ?
4  International / Software / Re: comporre byte on: May 14, 2014, 08:22:04 am
la seconda soluzione la escludo non ho idea di come si fa.

La prima potrei provare. Il punto di partenza è la libreria ufficiale SPI di arduino ?

Una terza soluzione potrebbe essere, tre arduino  di cui due mini light 05, ognuno dei quali gestisce il proprio ADC. dopodichè i mini inviano il valore all'arduino master ? c'è da valutare le prestazioni e le velocità ?

Però prima provo la soluzione software. suggerimenti da dove partire ?


grazie
5  International / Software / Re: comporre byte on: May 14, 2014, 07:48:09 am
mi è venuto un dubbio. se devo collegare i tre adc allo stesso arduino come faccio ?

i pin sclk (pin 6) li collego al pin 13 arduino
i pin dout/drdy (pin 5)  li collego al pin 12 arduino

per accedere al valore acquisito di ogni singolo adc  devo utilizzare il pin clk (pin 4) collegando il pin di ogni singolo adc ad un pin diverso dell'arduino ?


6  International / Software / Re: comporre byte on: May 14, 2014, 04:47:14 am
grazie. Ho dato una lettura veloce.
Ho capito che:
i byte devono essere trasferiti su una nuova variabile di tipo long (32 bit).
il primo byte rappresenta i bit da 0 a 7
il secondo byte rappresenta i bit da 8 a 15
il terzo byte rappresenta i bita da 16 a 24
Il posizionamento dei bit nella nuova variabile lo eseguo attraverso gli operatori shift left o shift right.

quindi:

  long var;

  byte1 = SPI.transfer(0x00);
  byte2 = SPI.transfer(0x00);
  byte3 = SPI.transfer(0x00);

   var |= byte1 ;
   var <<= 8;
   var |= byte2 ;
   var  <<= 8;
   var |= byte3 ;

alla fine var contiene il valore unificato ?

Praticamente ho montato l'ADS1252 su un adattatore (la mia prima saldatura SMD)
Ho utilizzato pasta salda.

Domanda come faccio ad eliminare la pasta salda in eccesso ?
Basta utilizzare un normale solvente tipo acetone per le unghie e cotonfioc (o come si chiama)

Visto le immagini allegate:

il puntino di riferimento qual'è ?
Come faccio a capire i pin corretti ?

Edit: il riferimento è il cerchietto che somiglia alla c del copyright ?
7  International / Software / comporre byte on: May 13, 2014, 06:41:39 am
Salve da questo codice:

  byte1 = SPI.transfer(0x00);
  byte2 = SPI.transfer(0x00);
  byte3 = SPI.transfer(0x00);

ottengo tre byte da un ADC a 24 bit (ADS1252)

A questo punto come faccio ad ottenere un unico valore ?

che rappresenta il valore acquisito.


}
8  International / Hardware / Re: servo motori on: February 15, 2014, 10:40:40 am
i servo sono HITEC HS311

escursione massima di 90° anche se fornisco valori alla libreria del TLC compresi tra 0 e 175
9  International / Hardware / Re: cube led numero max pin entrata on: February 15, 2014, 06:12:16 am
ok. ora è chiaro.
Per modificare il numero di TLC devi accedere al TLConfig e modificare il valore. chiudere arduino e riaprirlo affinche prenda le modfiche.

Ho tentato di passarlo come parametro quando inizializzi la libreria. senza esito positivo.
Al momento accedo al file di configurazione.
Quando ho più tempo ci riprovo.

hai provato ha comandare dei servo con la stessa libreria e TLC ?


10  International / Hardware / Re: cube led numero max pin entrata on: February 15, 2014, 05:56:27 am
il positivo dei led viene da un alimentatore a parte, che condivide con arduino la massa.

la mia domanda arduino regge 4 tlc.


11  International / Hardware / Re: cube led numero max pin entrata on: February 15, 2014, 04:54:51 am
Ho notato che è rognoso. infatti mi sta dando problemi.

Ma posso alimentarne 4 direttamente da arduino ?
Anche se si accendono tutti e 64 i led la corrente che deve fornire arduino non cambia ?
12  International / Hardware / Re: servo motori on: February 15, 2014, 04:42:20 am
Sto tentando di comandare dei servo con il TLC4950.

Lo schema d collegamento è uguale a quello dei LED RGB con una resistenza collegata al pin IREF di 2K
Mentre ad ogni servo ho collegato una resistenza di 3.3K

Quando alimento l'arduino che a sua volta alimenta il TLC, praticamente uno o più servi inizia a vibrare senza muoversi. Perchè ? è un problema di alimentazione ?

Inoltre i servo ruotano solo di 90°, bisogna fare qualche impostazione nella libreria ?

13  International / Hardware / Re: cube led numero max pin entrata on: February 15, 2014, 03:07:41 am
Salve ho utilizzato la libreria del TLC per alimentare i led è funziona alla grande.
Però mi si presenta un problema legato all'alimentazione del TLC, Arduino e LED RGB o servomotori.

I led rgb o i servo motori li alimento a parte, con arduino condivide il GND.
All'arduino ho collegato 4 TLC.
Arduino collegato alla USB
Se controllo un solo TLC alimentato mediante l'uscita 5V di arduino tutto funziona correttamente e costantemente.

Il problema nasce quando devo utilizzare 4 TLC.
Primo tentativo TLC alimentati separatamente rispetto ad arduino con il quale condivide il GND. Pensavo che funzionasse, invece quando ho rieseguito il test, i TLC si sono surriscandati e bruciati.

Non capisco, cosa succede.

Quindi, posso alimentare i 4 TLC con l'uscita di arduino ?

14  International / Hardware / Arduino DUE & SPI on: January 29, 2014, 10:33:08 am
l'Arduino due possiede due SPI.
Librerie permettendo posso pensare di collegare alle due spi due TLC4950

La libreria SPI di arduino supporta l'uso di entrambe le SPI

Mentre per utilizzare la libreria del TLC4950, basta crearne due identiche che fanno riferimento alle due spi diverse, cioè settare diversamente i pin necessari alla spi nelle due librerie replicate.


15  International / Hardware / Re: servo motori on: January 25, 2014, 05:19:12 am
premessa: ho avuto modo di verificare, con i servo che dispongo al momento, che per ruotare di 90° necessitano di circa 300 ms. Mi spiego, cioè dalla posizione zero do il comando per spostarsi alla posizione 90°; a questo punto se setto nuovamente il comando posizione 0 dopo un intervallo inferiore a 300 ms non arriva a 90 ma ritorna prima.

  moveServo(myservo6, 0);
  delay(300); // se imposto un valore inferiore la posizione non viene raggiunta
  moveServo(myservo6, 90);
  delay(300);

Quindi se impartisco il comando per una rotazione completa da 0 a 180 il servo necessità di 600 ms; dopo aver impartito il comando il controllo ritorna all'arduino per poter eseguire altre istruzioni o è una chiama sincrona, cioè il comando all'arduino ritorna dopo che il servo ha completato la propria escursione ?

Nel link da te segnalato parla di shiftPWM; Quando parla di shift register si riferisce allo shift-register dell'arduino stesso o uno shift register esterno ?

Uno di questi è il TLC4950
Mentre gli altri due 74HC595 e  il PCF8574AP non sono shiftPWM. EDIT: il 74HC595 è uno shiftPWM.

Quindi è più indicato un TLC4950 piuttosto che gli altri due, se voglio utilizzare uno shft register esterno ?

E' meglio utilizzare i pin PWM dell'arduino o utilizzare i pin PWM di uno sheift register esterno ?

scusate per le banalità, però ho necessità di capire.

praticamente devo comandare 64 servo contemporaneamente, i quali devono cambiare posizione velocemente e non allo stesso modo.

Ho messo su una infrastruttura di  tre arduini (al momento, ma possono crescere in base alle esigenze di cui sopra) collegati mediante I2C. Uno fa da master e riceve i dati dal pc e gli altri due (o più) da slave per il comando dei servo, led RGB, sensori e cosi via (distribuzione carico lavoro).

A questo punto devo decidere se utilizzare uno shiftRegister esterno tipo TLC4950 (16 canali PWM a 12 bit), oppure i pin PWM di arduino.

Eventualmente optare per arduino due per avere maggiori performance e una scelta possibile ?


Pages: [1] 2 3 ... 9