Show Posts
Pages: [1]
1  International / Software / Re: [RISOLTO] problema Led (SPI), Sensori distanza (comunicazione seriale) on: March 15, 2013, 03:12:16 am
scusa se rispondo solo ora.. comunque si dipendeva proprio dalla pulseIn, grazie per la dritta!
2  International / Software / Re: problema Led (SPI), Sensori distanza (comunicazione seriale) on: February 27, 2013, 07:37:45 pm
ho capito.
il loop si blocca quando passo qualcosa di morbido/assorbente (la mia felpa) davanti ai sensori: il suono generato dal sensore viene assorbito, quindi non riesce ad effettuare la lettura.
3  International / Software / [RISOLTO] problema Led (SPI), Sensori distanza (comunicazione seriale) on: February 27, 2013, 01:58:43 pm
ciao ragazzi, ho un problemino e chiedo aiuto e consigli a tutti voi.
Il progetto si basa su due piani, uno che riguarda i led e l'altro che riguarda i sensori. Vi spiego la versione semplificata del progetto:

-ho 2 shift register (74HC595) che controllano 8 led ciascuno
-arduino comunica con i regiter attraverso SPI

-ho 2 sensori ultrasuoni di distanza (srf05)
-faccio la media dei valori ottenuti da 10 letture del sensore
-invio i valori medi a MaxMSP via seriale

Sembra funzionare tutto per bene: i led si accendono uno dopo l'altro e a maxmsp arrivano i valori corretti delle letture.
Però ho notato che ogni tanto il processo si blocca (per 1/2 secondi), e poi riprende a funzionare. Questo succede soprattutto se faccio movimenti "veloci" davanti ai sensori.

questo è lo sketch

Code:
             
#include <SPI.h>

const byte LATCH = 10;

byte leftByte = 1;         // 0 0 0 0 0 0 0 1
byte rightByte = 128;      // 1 0 0 0 0 0 0 0

int cLayer = 0;            // layer couter
int cL = 0;                // left couter  
int cR = 0;                // right couter

int maxL;                  //set the max range of the left counter
int maxR;                  //set the max range of the right counter

// SENSORS variables |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const int numOfReadingsA = 10;                   // number of readings to take/ items in the array
const int numOfReadingsB = 10;                   // number of readings to take/ items in the array
int readingsA[numOfReadingsA];                    // stores the distance readings in an array S1
int readingsB[numOfReadingsB];                    // stores the distance readings in an array SensorB
int arrayIndexA = 0;                             // arrayIndex of the current item in the array S1
int arrayIndexB = 0;                             // arrayIndex of the current item in the array SensorB
int totalA = 0;                                  // stores the cumlative total SensorA
int totalB = 0;                                  // stores the cumlative total SensorB
int averageDistanceA = 0;                        // stores the average value SensorA
int averageDistanceB = 0;                        // stores the average value SensorB

// setup pins and variables for SRF05 sonar device

int echoPinA = 2;                                // SRF05 echo pin (digital 2) SensorA
int initPinA = 3;                                // SRF05 trigger pin (digital 3) SensorA
unsigned long pulseTimeA = 0;                    // stores the pulse in Micro Seconds SensorA
unsigned long distanceA = 0;                     // variable for storing the distance (cm) SensorA

int echoPinB = 4;                                // SRF05 echo pin (digital 4) SensorB
int initPinB = 5;                                // SRF05 trigger pin (digital 5) SensorB
unsigned long pulseTimeB = 0;                    // stores the pulse in Micro Seconds SensorB
unsigned long distanceB = 0;                     // variable for storing the distance (cm) SensorB


//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// start SETUP| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

void setup ()
{
  
  SPI.begin ();         //initialize SPI
  
 // SENSORS SETUP||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  pinMode(initPinA, OUTPUT);                     // set init pin 3 as output
  pinMode(echoPinA, INPUT);                      // set echo pin 2 as input
  
  pinMode(initPinB, OUTPUT);                     // set init pin 5 as output
  pinMode(echoPinB, INPUT);                      // set echo pin 4 as input

  // create array loop to iterate over every item in the array of SensorA and SensorB

  for (int thisReadingA = 0; thisReadingA < numOfReadingsA; thisReadingA++) {
readingsA[thisReadingA] = 0;
 }
 
   for (int thisReadingB = 0; thisReadingB < numOfReadingsB; thisReadingB++) {
readingsB[thisReadingB] = 0;
 }
 
  
// initialize the serial port, lets you view the
 // distances being pinged if connected to computer
     Serial.begin(57600);
    
}  // end of setup



//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// start LOOP ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

void loop ()
{
  
  
//SENSORS READS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

// execute process for sensor1
digitalWrite(initPinA, HIGH);                    // send 10 microsecond pulse SensorA
delayMicroseconds(10);                  // wait 10 microseconds before turning off
digitalWrite(initPinA, LOW);                     // stop sending the pulse SensorA

pulseTimeA = pulseIn(echoPinA, HIGH);             // Look for a return pulse, it should be high as the pulse goes low-high-low SensorA
distanceA = pulseTimeA/58;                        // Distance = pulse time / 58 to convert to cm. SensorA

 totalA= totalA - readingsA[arrayIndexA];           // subtract the last distance SensorA
 
readingsA[arrayIndexA] = distanceA;                // add distance reading to array SensorA

totalA= totalA + readingsA[arrayIndexA];            // add the reading to the total SensorA
arrayIndexA = arrayIndexA + 1;                    // go to the next item in the array SensorA

// At the end of the array (10 items) then start again
if (arrayIndexA >= numOfReadingsA)  {
    arrayIndexA = 0;
  }

  averageDistanceA = totalA / numOfReadingsA;      // calculate the average distance SensorA

  
// execute process for sensor2
digitalWrite(initPinB, HIGH);                    // send 10 microsecond pulse SensorB
delayMicroseconds(10);                  // wait 10 microseconds before turning off
digitalWrite(initPinB, LOW);                     // stop sending the pulse SensorB

pulseTimeB = pulseIn(echoPinB, HIGH);             // Look for a return pulse, it should be high as the pulse goes low-high-low SensorB
distanceB = pulseTimeB/58;                        // Distance = pulse time / 58 to convert to cm. SensorB

 totalB= totalB - readingsB[arrayIndexB];           // subtract the last distance SensorB
 
readingsB[arrayIndexB] = distanceB;                // add distance reading to array SensorB

totalB= totalB + readingsB[arrayIndexB];            // add the reading to the total SensorB
arrayIndexB = arrayIndexB + 1;                    // go to the next item in the array SensorB

// At the end of the array (10 items) then start again

if (arrayIndexB >= numOfReadingsB)  {
    arrayIndexB = 0;
  }

  averageDistanceB = totalB / numOfReadingsB;      // calculate the average distance SensorB
 
 //SERIAL TO MAX ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

  Serial.print(averageDistanceA);
  Serial.print(" ");
  Serial.println(averageDistanceB);
  
  
// LEDS |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 
// register2
    if (cL <= 7) {
        leftByte <<= 1;       // the byte shift lo left at each loop
        cL++;
    } else {                  
        cL = 0;               // reset the counter
       leftByte = 1;          // reset byte value
    }
    

 // register1  
    if (cR <= 7) {
        rightByte >>= 1;       // the byte shift lo left at each loop
        cR++;
    } else {
        cR = 0;                // reset the counter
        rightByte = 128;       // reset byte value: return to the byte original value
    }
 
  
       digitalWrite (LATCH, LOW);
       SPI.transfer (leftByte);       // register2
       SPI.transfer (rightByte);      // register1  
       digitalWrite (LATCH, HIGH);
  
  
delay (100);

}  // end of loop

non riesco proprio a capire il problema, può essere che la comunicazione seriale e l'SPI si disturbano a vicenda?
4  International / Hardware / Re: controllare più 74HC595 shift registers on: October 13, 2012, 08:50:59 am
ragazzi siccome inizio a sentirmi ignorante ho deciso di iniziare a studiare il C in modo da capire le basi... per ora metto da parte il progetto, in ogni caso se qualcuno ha tempo e volontà per controllare il codice e trova l'errore mi sarà comunque comodo..grazie a tutti per la pazienza!
5  International / Hardware / Re: controllare più 74HC595 shift registers on: October 12, 2012, 04:50:50 pm
aggiornamento: ho fatto un paio di prove e lo sketch con 8 595 funziona (ho provato fino al terzo 595 per mancanza di spazio sulla breadboard,ma penso che funzionino anche gli altri).. quello con il controllo dei NPN no invece
6  International / Hardware / Re: controllare più 74HC595 shift registers on: October 12, 2012, 03:40:00 pm
ho provato a continuarlo...
Code:
//Pin connected to ST_CP of 74HC595
int latchPin = 8;
//Pin connected to SH_CP of 74HC595
int clockPin = 12;
////Pin connected to DS of 74HC595
int dataPin = 11;

int npnPin1 = 2;
int npnPin2 = 3;
int npnPin3 = 4;
int npnPin4 = 5;
int npnPin5 = 6;
int npnPin6 = 7;
int npnPin7 = 8;
int npnPin8 = 9;

byte data1;
byte data2;
byte data3;
byte data4;
byte data5;
byte data6;
byte data7;
byte data8;

int data9;
int data10;
int data11;
int data12;
int data13;
int data14;
int data15;
int data16;

void setup() {

Serial.begin(57600);

pinMode(latchPin, OUTPUT);

pinMode(npnPin1, OUTPUT);
pinMode(npnPin2, OUTPUT);
pinMode(npnPin3, OUTPUT);
pinMode(npnPin4, OUTPUT);
pinMode(npnPin5, OUTPUT);
pinMode(npnPin6, OUTPUT);
pinMode(npnPin7, OUTPUT);
pinMode(npnPin8, OUTPUT);
}

void loop() {

if(Serial.available() > 15) {

data1 = Serial.read();
data2 = Serial.read();
data3 = Serial.read();
data4 = Serial.read();
data5 = Serial.read();
data6 = Serial.read();
data7 = Serial.read();
data8 = Serial.read();

data9 = Serial.read();
data10 = Serial.read();
data11 = Serial.read();
data12 = Serial.read();
data13 = Serial.read();
data14 = Serial.read();
data15 = Serial.read();
data16 = Serial.read();

digitalWrite(latchPin, 0);

digitalWrite(npnPin1, data9);
digitalWrite(npnPin2, data10);
digitalWrite(npnPin3, data11);
digitalWrite(npnPin4, data12);
digitalWrite(npnPin5, data13);
digitalWrite(npnPin6, data14);
digitalWrite(npnPin7, data15);
digitalWrite(npnPin8, data16);

shiftOut(dataPin, clockPin, data1);
shiftOut(dataPin, clockPin, data2);
shiftOut(dataPin, clockPin, data3);
shiftOut(dataPin, clockPin, data4);
shiftOut(dataPin, clockPin, data5);
shiftOut(dataPin, clockPin, data6);
shiftOut(dataPin, clockPin, data7);
shiftOut(dataPin, clockPin, data8);

digitalWrite(latchPin, 1);

}

}

void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {

int i=0;

int pinState;

pinMode(myClockPin, OUTPUT);
pinMode(myDataPin, OUTPUT);

 digitalWrite(myDataPin, 0);

digitalWrite(myClockPin, 0);


 for (i=7; i>=0; i--) {

digitalWrite(myClockPin, 0);

if ( myDataOut & (1<<i) ) {

pinState= 1;

}

else {

pinState= 0;

}

digitalWrite(myDataPin, pinState);

digitalWrite(myClockPin, 1);

digitalWrite(myDataPin, 0);

}

digitalWrite(myClockPin, 0);

}

da maxmsp semplicemente invio numeri da 0-255 che vengono interpretati come byte per gestire i 595, invece per attivare gli NPN invia semplicemente 0 o 1 ... cosa ne dite?
7  International / Hardware / Re: controllare più 74HC595 shift registers on: October 12, 2012, 12:59:40 pm
@vic_20 : grazie per la segnalazione..comunque nel mio primo commento c'è un il link dove ho visto come collegare 3 595..è molto semplice: come colleghi il 2 così colleghi il 3.
@uwe: cavolo ho sbagliato e ho scritto int clockPin2 = 12; anzichè int clockPin1 = 12; eheh! comunque non ho messo il pinMode di tutti gli out perchè se vedi lo sketch intero li mette dopo nel void shiftOut:
pinMode(myClockPin, OUTPUT);
pinMode(myDataPin, OUTPUT);
...non ho capito bene perchè cambia il nome da clockPin a myClockPin, idem per data...
comunque ho fatto un po di ricerche e ho abbandonato l'idea di utilizzare più pin di arduino...in pratica il mio fine è quello di avere il solito cubo led 8x8x8 ma controllabile con maxmsp. cerca cerca e ho capito che per quanto riguarda la parte hardware posso fare in questo modo: uso 8 595 e 8 transistor npn usati come switch che mi vanno a gestire gli 8 livelli.. qui spiega come fare:
http://jacksonliam.blogspot.it/2012/03/led-cube-8x8x8-part-2-construction.html

risolto il problema hardware sorge quello software. Direi che per gestire gli 8 595 mi basta modificare lo skatch in questo modo:
Code:
//Pin connected to ST_CP of 74HC595
int latchPin = 8;
//Pin connected to SH_CP of 74HC595
int clockPin = 12;
////Pin connected to DS of 74HC595
int dataPin = 11;

byte data1;
byte data2;
byte data3;
byte data4;
byte data5;
byte data6;
byte data7;
byte data8;

void setup() {

Serial.begin(57600);

pinMode(latchPin, OUTPUT);

}

void loop() {

if(Serial.available() > 7) {

data1 = Serial.read();
data2 = Serial.read();
data3 = Serial.read();
data4 = Serial.read();
data5 = Serial.read();
data6 = Serial.read();
data7 = Serial.read();
data8 = Serial.read();

digitalWrite(latchPin, 0);

shiftOut(dataPin, clockPin, data1);
shiftOut(dataPin, clockPin, data2);
shiftOut(dataPin, clockPin, data3);
shiftOut(dataPin, clockPin, data4);
shiftOut(dataPin, clockPin, data5);
shiftOut(dataPin, clockPin, data6);
shiftOut(dataPin, clockPin, data7);
shiftOut(dataPin, clockPin, data8);

digitalWrite(latchPin, 1);

}

}

void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {

int i=0;

int pinState;

pinMode(myClockPin, OUTPUT);
pinMode(myDataPin, OUTPUT);

 digitalWrite(myDataPin, 0);

digitalWrite(myClockPin, 0);


 for (i=7; i>=0; i--) {

digitalWrite(myClockPin, 0);

if ( myDataOut & (1<<i) ) {

pinState= 1;

}

else {

pinState= 0;

}

digitalWrite(myDataPin, pinState);

digitalWrite(myClockPin, 1);

digitalWrite(myDataPin, 0);

}

digitalWrite(myClockPin, 0);

}

fatto questo (sempre se è corretto!) il problema è come gestire gli NPN tramite maxmsp..poichè fungono da switch dovrei attivarli/disattivarli tramite la porta seriale, cosa dovrei aggiungere nello sketch per fare questo?
8  International / Hardware / Re: controllare più 74HC595 shift registers on: October 11, 2012, 06:43:36 am
ciao Uwe e grazie! quindi ciò che voglio fare è possibile...di questo ne ero quasi certo, ora il problema principale è modificare lo skecth per usare altri 3 pin. Mettiamo il caso che voglio continuare ad usare 3 595 sui 3 pin di arduino e altri 3 595 su altrettanti pin (ad esempio uso 2,3 e 4), in tal caso come dovrei modificare lo skecth? in primis dovrei introdurre le variabili quindi la prima parte dovrebbe diventare così:
Code:
//Pin connected to ST_CP of 74HC595
int latchPin1 = 8;
int latchPin2 = 2 ;
//Pin connected to SH_CP of 74HC595
int clockPin2 = 12;
int clockPin2 = 4;
////Pin connected to DS of 74HC595
int dataPin1 = 11;
int dataPin2 = 3;

byte data1;
byte data2;
byte data3;

byte data4;
byte data5;
byte data6;

void setup() {

Serial.begin(57600);

pinMode(latchPin1, OUTPUT);
pinMode(latchPin2, OUTPUT);

}

void loop() {

if(Serial.available() > 2) {

data1 = Serial.read();
data2 = Serial.read();
data3 = Serial.read();

data4 = Serial.read();
data5 = Serial.read();
data6 = Serial.read();

digitalWrite(latchPin1, 0);
digitalWrite(latchPin2, 0);

shiftOut(dataPin1, clockPin1, data1);
shiftOut(dataPin1, clockPin1, data2);
shiftOut(dataPin1, clockPin1, data3);

shiftOut(dataPin2, clockPin2, data4);
shiftOut(dataPin2, clockPin2, data5);
shiftOut(dataPin2, clockPin2, data6);

digitalWrite(latchPin1, 1);
digitalWrite(latchPin2, 1);

}

}

sbaglio?
9  International / Hardware / controllare più 74HC595 shift registers on: October 10, 2012, 12:03:46 pm
Ciao, premetto che sono nuovo nel mondo di Arduino e ho un po' di problemi a comprendere gli sketch. Vi spiego il problema (ho cerato nel forum ma non ho trovato quello che mi serviva): vorrei utilizzare diversi 74HC595 per per controllare più LEDs possibili e poi usare maxmsp per gestire il tutto. ho cercato in rete e ho trovato queste utilissime guide per l'utilizzo e la connessione di due o tre 595:
http://www.arduino.cc/en/Tutorial/ShiftOut
http://little-scale.blogspot.co.uk/2008/01/three-595-shift-registers.html
ho anche trovato una guida per maxuino, quindi ora come ora riesco tranquillamente a controllare 3 595 usando 3 uscite digitali di Arduino. Mi chiedo: ho usato solo 3 pin di arduino per controllare 3 595, potrei usare i pin rimanenti per controllare altri 595..in teoria potrei quindi controllare altri 9 595 in quanto ho i 9 pin disponibili per farlo, giusto? se si, qualcuno potrebbe aiutarmi a modificare lo skecth che usa solo 3 pin e adattarlo all'utilizzo di più pin e quindi più 595?
Code:
//Pin connected to ST_CP of 74HC595

int latchPin = 8;

//Pin connected to SH_CP of 74HC595

int clockPin = 12;

////Pin connected to DS of 74HC595

int dataPin = 11;
byte data1;

byte data2;

byte data3;


void setup() {

Serial.begin(57600);

pinMode(latchPin, OUTPUT);


}


void loop() {

if(Serial.available() > 2) {

data1 = Serial.read();

data2 = Serial.read();

data3 = Serial.read();

digitalWrite(latchPin, 0);

shiftOut(dataPin, clockPin, data1);

shiftOut(dataPin, clockPin, data2);

shiftOut(dataPin, clockPin, data3);

digitalWrite(latchPin, 1);

}

}


void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {

int i=0;

int pinState;

pinMode(myClockPin, OUTPUT);

pinMode(myDataPin, OUTPUT);


 digitalWrite(myDataPin, 0);

digitalWrite(myClockPin, 0);


 for (i=7; i>=0; i--) {

digitalWrite(myClockPin, 0);

if ( myDataOut & (1<<i) ) {

pinState= 1;

}

else {

pinState= 0;

}

digitalWrite(myDataPin, pinState);

digitalWrite(myClockPin, 1);

digitalWrite(myDataPin, 0);

}

digitalWrite(myClockPin, 0);

}
10  International / Generale / Re: Presentazioni nuovi iscritti, fatevi conoscere da tutti! on: October 10, 2012, 11:47:15 am
Ciao a tutti, mi chiamo Alfredo e studio Musica Elettronica..di elettronica e programmazione sono un po a digiuno:mi sono dilettato con il circuit bending e la costruzione di pedali per chitarra DIYe come linguaggio di programmazione conosco MaxMSP . Ho da poco conosciuto Arduino e mi è subito interessato, soprattutto per l a possibilità di interfacciarlo a Max/MSP e utilizzarlo per applicazioni musicali, installazioni audio ecc..
Pages: [1]