# Συζήτηση Κυκλωμάτων > Ψηφιακά Κυκλώματα > Μικροελεγκτές >  >  ερωτηση για Arduino

## iliasklou

Καλησπερα παιδια φτιαχνω το παρακατω κυκλωμα IMG_20150427_205935.jpg που ουσιαστικα με τον αισθητηρα υπερηχων (http://grobotronics.com/ranging-detector.html) που διαθετει "κλειδωνει" πανω σε ενα αντικειμενο και το ακολουθει με την βοηθεια τον 2 σερβομηχανισμων (αυτους κατω απ'τον πυκνωτη) μονο που παραλληλα με την διοδο στο τελος δεν εβαλα αυτο το "κανονακι" αλλα ενα laser (απλο που ριχνει μια κοκκινη κουκιδα) και θελω να ρωτησω 

πρωτον, βρηκα τον κωδικα που ειναι γραμμενος για arduino nano εγω θα χρησιμοποιησω το UNO δεν υπαρχει καποια διαφοροποιηση?

δευτερον, το τρανζιστορ χρησιμοποιειτε ως διακοπτης (προστασια του arduino απ'το ρευμα). Eιναι σωστα εκει συνδεδεμενο ή επρεπε να μπει στην τροφοδοσια του arduino?

τριτον, το arduino θελει ταση 5volt εγω θα βαλω μια μπαταρια 9volt ως τροφοδοσια του κυκλωματος και αγορασα ενα LM7805 για να ριξω την τροφοδοσια απ'την μπαταρια στο arduino ειναι σωστο ή θα υπαρχουν πιθανες απωλειες ?

----------


## nestoras

> τριτον, το arduino θελει ταση 5volt εγω θα βαλω μια μπαταρια 9volt ως τροφοδοσια του κυκλωματος και αγορασα ενα LM7805 για να ριξω την τροφοδοσια απ'την μπαταρια στο arduino ειναι σωστο ή θα υπαρχουν πιθανες απωλειες ?







> *Summary* Microcontroller
> ATmega328
> 
> Operating Voltage
> 5V
> 
> *Input Voltage (recommended)
> *
> *7-12V*
> ...



Αν δώσεις τροφοδοσία *στο στρογγυλό βύσμα* τότε αυτές είναι οι προτεινόμενες τάσεις, οπότε με τη μπαταρία σκέτη θα είσαι μια χαρά!

----------


## thanasis 1

1) Κανενα απολυτως προβλημα δεν θα εχεις απλα να δηλωσεις σωστα τις πορτες που θα χριησιμοποιησεις.
3) Οτι θα υπαρχουν απωλειες ειναι σιγουρο αλλα για να κανεις την δουλεια σου αν δεν εχεις καποιο τροφοδοτικο στα 5V την δουλεια σου θα την κανεις.

----------


## eleCtroAsxetos

θα δουλεψει τελεια το uno με 9 βολτ. Δεν χρειαζεται ο regulator αφου εχει αλλο ενσωματομενο στην πλακετα . Ισως ειναι και λαθος να το τροφοδοτησεις με ακριβως 5 βολτ, γιατι αν υπολογισεις και την πτωση τασης στον ηδη ενσωματωμενο στο uno ams1117 τοτε χαιρετα την ακριβεια στην εσωτερικη ταση αναφορας 5volt οποτε παει και η ακριβεια στις αναλογικες εισοδους.
συνδεσε το + της 9βολτης στο Vin και το - στο GND(οποιοδηποτε GND σε βολευει)
Προσεξε μην δωσεις καταλαθως 9V στο πιν +5V

θα δουλεψει ο κωδικας του uno στο nano, απλα φροντισε αν ο κωδικας χρησιμοποιει καποια αναλογικη εισοδο απο τις Α6 ή Α7 να τις αλλαξεις γιατι δεν υπαρχουν στο uno.

----------


## SV1JRT

> Καλησπερα παιδια φτιαχνω το παρακατω κυκλωμα IMG_20150427_205935.jpg που ουσιαστικα με τον αισθητηρα υπερηχων (http://grobotronics.com/ranging-detector.html) που διαθετει "κλειδωνει" πανω σε ενα αντικειμενο και το ακολουθει με την βοηθεια τον 2 σερβομηχανισμων (αυτους κατω απ'τον πυκνωτη) μονο που παραλληλα με την διοδο στο τελος δεν εβαλα αυτο το "κανονακι" αλλα ενα laser (απλο που ριχνει μια κοκκινη κουκιδα) και θελω να ρωτησω 
> 
> πρωτον, βρηκα τον κωδικα που ειναι γραμμενος για arduino nano εγω θα χρησιμοποιησω το UNO δεν υπαρχει καποια διαφοροποιηση?
> 
> δευτερον, το τρανζιστορ χρησιμοποιειτε ως διακοπτης (προστασια του arduino απ'το ρευμα). Eιναι σωστα εκει συνδεδεμενο ή επρεπε να μπει στην τροφοδοσια του arduino?
> 
> τριτον, το arduino θελει ταση 5volt εγω θα βαλω μια μπαταρια 9volt ως τροφοδοσια του κυκλωματος και αγορασα ενα LM7805 για να ριξω την τροφοδοσια απ'την μπαταρια στο arduino ειναι σωστο ή θα υπαρχουν πιθανες απωλειες ?




1) ΝΑΙ, αν αλλάξεις λίγο τον κώδικα και βάλεις τις ΣΩΣΤΕΣ πόρτες που αντιστοιχούν στο UNO. Τώρα, αν ο κώδικας του nano έχει και τίποτα assembly μέσα, τι να σου πω. Καλές δοκιμές.

2) Το τρανζίστορ ΔΕΝ είναι για την προστασία του arduino απο το ρεύμα. Το τρανζίστορ "πυροδοτεί" το κανονάκι, βάση κάποιας εντολής στο πρόγραμμα του arduino. Επομένως ΣΩΣΤΑ βρίσκεται εκεί που είναι.

3) Απαντήθηκε.

Καλές κατασκευές.

----------


## iliasklou

> 1) ΝΑΙ, αν αλλάξεις λίγο τον κώδικα και βάλεις τις ΣΩΣΤΕΣ πόρτες που αντιστοιχούν στο UNO. Τώρα, αν ο κώδικας του nano έχει και τίποτα assembly μέσα, τι να σου πω. Καλές δοκιμές.
> 
> 2) Το τρανζίστορ ΔΕΝ είναι για την προστασία του arduino απο το ρεύμα. Το τρανζίστορ "πυροδοτεί" το κανονάκι, βάση κάποιας εντολής στο πρόγραμμα του arduino. Επομένως ΣΩΣΤΑ βρίσκεται εκεί που είναι.
> 
> 3) Απαντήθηκε.
> 
> Καλές κατασκευές.




εστειλα mail σε αυτον που το εφτιαξε και μου ειπε οτι ειναι για την προστασια του arduino απο το ρευμα..και οταν ρωτησα εναν καθηγητη μου στη σχολη μου απαντησε το ιδιο λεγοντας μου οτι λειτουργει ως διακοπτης

----------


## nestoras

> εστειλα mail σε αυτον που το εφτιαξε και μου ειπε οτι ειναι για την προστασια του arduino απο το ρευμα..και οταν ρωτησα εναν καθηγητη μου στη σχολη μου απαντησε το ιδιο λεγοντας μου οτι λειτουργει ως διακοπτης



Έχει μια λογική αυτή η απάντηση... Αν οδηγούσες απευθείας τον κινητήρα από την έξοδο του μικροελεγκτή το μόνο σίγουρο είναι ότι θα έκαιγες την έξοδο από το πολύ ρεύμα που θα τραβούσε το μοτέρ.
Κάποια πράγματα βέβαια είναι αυτονόητα: όπως για παράδειγμα το να μην οδηγούμε φορτία άνω των 30-40mA (ή και ακόμη λιγότερα) από τις εξόδους του μικροελεγκτή.

Για το λόγο αυτό, προτιμάμε να οδηγούμε τη βάση ενός τρανζίστορ με ελάχιστο ρεύμα και το τρανζίστορ με τη σειρά του να οδηγεί το "μεγάλο" φορτίο.

----------


## SV1JRT

Ναι, όπως είναι συνδεδεμένο τώρα το τρανζίστορ, κάνει ενίσχυση ρεύματος της εξόδου του arduino, γιατί λογικά το "κανονάκι" χρειάζεται περισσότερο ρεύμα από ότι μπορεί να βγάλει η πόρτα του arduino. Υπό μια έννοια "προφυλάσσει" την ΕΞΟΔΟ του Arduino από υπερένταση. Δεν έχει καμία σχέση με την προφύλαξη του arduino σαν συνολικό ολοκληρωμένο. Οπότε όπως σου είπα αρχικά, σωστά έχει τοποθετηθεί το τρανζίστορ εκεί που βρίσκετε.

.

----------


## eleCtroAsxetos

To τρανζιστορ λειτουργει και ως διακοπτης αλλα λόγω της ιδιοτητας του να λειτουργει και ως ενισχυτης προστατευει την εξοδο του arduino.
καθε τρανζιστορ εχει μια χαρακτηριστικη τιμη ενισχυσης Gain ή hfe οπως λεγεται. Μπορει τραβωντας μολις 1-2 ma απo ενα κυκλωμα ελεγχου προς το base του να οδηγησει ενα μεγαλο ρευμα (μεταξυ collector emitter) που σε αλλη περιπτωση θα διαπερνουσε το κυκλωμα ελεγχου στην περιπτωση σου το arduino και θα εβλεπες καπνους, τα λεντακια να αναβουν εντονα και τελικα να σβηνουν για παντα.
Λογω της ενισχυσης που κανει πχ Χ100 ή Χ1000 αναλογα το τρανζιστορ, πολλαπλασιαζει τα 2ma (οταν εχει παρει εντολη απο το arduino να κλεισει σαν διακοπτης) μεταξυ base και emitter σε ρευμα 200mA για να οδηγησει ενα επαγωγικο φορτιο πχ μοτερ, solenoid κτλ.
Οταν το arduino δωσει εντολη για να ανοιξει σαν διακοπτης το τρανζιστορ, το ρευμα που περναει απο το base γινεται 0. Και παλι συνεχιζει να ενισχυει το τρανζιστορ, αλλα το 0mA X Gain κανει 0...οποτε κλεινει οτι ειναι να κλεισει.

Για μεγαλυτερα φορτια πχ 2Α μεταξυ collector emitter χρειαζεται να χρησιμοποιησουμε τρανζιστορ ισχυος με μεγαλo Gain, ετσι ωστε πχ 2 Α αρχικα να μην καψουν το τρανζιστορ, και λογω του μεγαλου Gain, τα 2Α να αντιστοιχουν (μεσω της αντιστροφης λογικης ) σε μικρο ρευμα βασης ωστε παλι να μην καψουμε το κυκλωμα ελεγχου

----------


## thanasis 1

Σε εναν atmega644 που τον δουλευω στο arduino εβαλα στις πορτες pc2,pc3,pc4 κουμπια,δεν ειχα δει ομως οτι οι πορτες αυτες 
ειναι ενεργοποιημενες απο την αρχη και ετσι οταν παω να τον ενεργοποιησω τον μ/ε μου παταει τα κουμπια απο μονο του.
Μπορω αυτες τις πορτες να τις απενεργοποιησω,δηλαδη να ειναι σε λογικο '0' αντι '1'??

datasheet atmega644

----------


## The_Control_Theory

Οι πόρτες είναι είσοδοι στους AVR στην αρχή.

----------


## thanasis 1

Οκ ως εισοδο την θελω αφου ειναι για κουμπι απλα ειναι σε λογικη κατασταση '1' απο
την αρχη που θα τροφοδοτισω τον μ/ε,ειναι σαν να εχω πατημενω το κουμπι.

----------


## The_Control_Theory

Πιθανώς το πρόβλημα είναι στο πρόγραμμα. Μάλλον πρέπει να πεις στο πρόγραμμα πως αν είναι 1 το πιν να το βλέπει σαν 0.

Το θαυμαστικό ! μπροστά από κάποια λογική πρόταση κώδικα αντιστρέφει τα αποτελέσματα. (σαν πύλη ΝΟΤ)
Ξαναδες και πες μου να σου πω κάτι παραπάνω αν είναι αυτό αν δεν το βρεις.

----------


## thanasis 1

Το έχω δοκιμάσει και αυτό αλλά τίποτα,βασικά δοκιμασα στις  πόρτες αυτές το εξής απλό δηλαδη να αναβοσβησω ενα led αλλά ουτε και αυτό δούλευε ηταν μόνιμα ανοικτο.Μήπως τις συγκεκριμένες πόρτες δεν μπορώ να τις ορισω ως input ή ως output?Τι να πω δεν ξερω και το κακό είναι οτι δεν μπορώ να αλλάξω τις πόρτες γιατι έχω φτιαξει την πλακέτα.

----------


## SProg

Θα ορισεις τα pin που θελεις ως εισοδους (κατα το reset είναι σαν εισοδοι αλλα καντο) χωρις την pull-up ενεργοποιημενη.Θα προσθεσεις μια εξωτερικη pull-down και θα δινεις με τον διακοπτη 'τίποτα' ή +5V.

Καλα το πιο απλο είναι με εσωτερική pull-up και να δινεις τίποτα ή γη.


Ανεβασε τον κωδικα και ενα σχηματικό να δουμε πως συνδεεις τα κουμπια.

----------


## thanasis 1

Για σου σαββα,το σχηματικο για τα κουμπια ειναι αυτο,o κωδικας ας ειναι το απλο
παραδειγμα που εχει,δηλαδη το "button"




```
const int buttonPin = 18;     
const int ledPin =  14;      

int buttonState = 0;         

void setup() {
  
  pinMode(ledPin, OUTPUT);  

  
  pinMode(buttonPin, INPUT);   
}

void loop() {
  
  buttonState = digitalRead(buttonPin); 

  if (buttonState == HIGH) {
   
    digitalWrite(ledPin, HIGH);
  }
  else {

    digitalWrite(ledPin, LOW);
  }
}
```


Παντως τις πορτες αυτες ειτε τις κανεις ''HIGH" ειτε "LOW" παντα ειναι σε κατασταση "HIGH",γιατι :Confused1:

----------


## SProg

Δεν χρειαζεται να προσθεσεις εξωτερικη pull-up.



Απλα ενεργοποιησε την εσωτερικη pull-up:




```
pinMode(buttonPin, INPUT_PULLUP);
```



Εγω τα εβαλα σε αλλα pin (pin_13 που εχει ηδη LED και pin_12) και δουλευει κανονικα.Οποτε στελνεις 'γη' σβηνει το LED και ποτε στελνεις 'τιποτα' το LED αναβει.




```
const int buttonPin = 12;     const int ledPin =  13;      


int buttonState = 0;         


void setup() {
  
  pinMode(ledPin, OUTPUT);  


  
  pinMode(buttonPin, INPUT_PULLUP);   
}


void loop() {
  
  buttonState = digitalRead(buttonPin); 


  if (buttonState == HIGH) {
   
    digitalWrite(ledPin, HIGH);
  }
  else {


    digitalWrite(ledPin, LOW);
  }
}
```




Mηπως το pin_18 που εβαλες ως εισοδο δεν αντιστοιχει στο σωστο pin;.

----------


## thanasis 1

Λοιπον σαββα καταρχην σε ευχαριστω για τον χρονο σου,ειχα δοκιμασει σε αλλες πορτες αυτα τα τρια κουπια και δουλευουν κανονικα απλα σε αυτες δεν δουλευει με τιποτα
οι πορτες του atmega644 φενονται εδω και η pc2 αντιστοιχει στο 18,pc3 στην 19 και η pc4 στην 20 οποτε αυτο ειναι σωστο.
Οπως ειπα και ποιο πριν η pc2,pc3,pc4 που εχω τα 3 κουμπια ειναι παντα σε κατασταση "high" δεν μπορεις να τις αλλαξεις κατασταση δεν ξερω γιατι,προσπαθω να τις ορισω σε 
"LOW" και δεν γινετε.Εδω ειναι το datasheet οπου στην σελιδα 78 κανει αναφορα για την πορτα c.
Το θεμα ειναι οτι την πλακετα την εχω μονταρει και δεν ξερω τι να κανω τωρα,δεν μπορω να αλλαξω τα κουμπια σε αλλες πορτες αν δεν βρειθει τροπος πρεπει αναγκατικα να φτιαξω απο 
την αρχη πλακετα.Μαλιστα σημερα αγορασα εναν 644 για να κανω δοκιμες και ναι σε αλλες πορτες δουλευει κανονικα αν ομως βαλω κουμπια σε αυτες που ειπα οχι.

----------


## manolena

Θανάση μπορείς να κάνεις το εξής: μπορείς σε αυτές τις τρείς εισόδους να ορίσεις εξωτερικά interrupts και να δουλέψεις τα κουμπιά με διακοπές στο πρόγραμμα. Δεν το έχω κάνει αλλά αν εγκαταστήσεις τη βιβλιοθήκη PinChangeInt με την οποία καθορίζεις τα χαρακτηριστικά κάθε pin που εμπλέκεις (είσοδος, pull-up, falling ή rising κτλ) ίσως το καταφέρεις.

Εν τω μεταξύ, δεν ξέρω αν έχεις πειράξει το αρχείο boards.txt στη διαδρομή C:\...\arduino-1.x.x\hardware\arduino\boards.txt
Σε αυτό εγώ έχω προσθέσει τις παρακάτω γραμμές για να βλέπει το IDE τον 644 σαν πλακέτα Arduino:

*atmega644.name=Sanguino W/ ATmega644 or ATmega644A (16 MHz)*
*atmega644.upload.maximum_size=64512*
*atmega644.upload.maximum_data_size=4096*
*atmega644.upload.protocol=arduino*
*atmega644.upload.speed=115200*
*#atmega644.upload.using=arduino:arduinoisp*
*atmega644.bootloader.path=optiboot*
*atmega644.bootloader.file=optiboot_atmega644.hex*
*atmega644.bootloader.low_fuses=0xFF*
*atmega644.bootloader.high_fuses=0xDE*
*atmega644.bootloader.extended_fuses=0xFD*
*atmega644.bootloader.unlock_bits=0x3F*
*atmega644.bootloader.lock_bits=0x0F*
*atmega644.build.mcu=atmega644*
*atmega644.build.f_cpu=16000000L*
*atmega644.build.board=AVR_SANGUINO*
*atmega644.build.core=arduino:arduino*
*atmega644.build.variant=sanguino
*
To στήσιμο είναι απλό: κάνε include την παρακάτω επισυναπτόμενη βιβλιοθήκη και τα παρακάτω:




```
#include <PinChangeInt.h>

#define Button1          18//το κουμπί του pin PORTC.2
#define Button2          19//το κουμπί του pin PORTC.3
#define Button3          20//το κουμπί του pin PORTC.4

void setup()
{
  pinMode(Button1, INPUT); digitalWrite(Button1, HIGH);
  pinMode(Button2, INPUT); digitalWrite(Button2, HIGH);
  pinMode(Button3, INPUT); digitalWrite(Button3, HIGH);
  PCintPort::attachInterrupt(Button1, &Button1_ISR, FALLING);
  PCintPort::attachInterrupt(Button2, &Button2_ISR, FALLING);
  PCintPort::attachInterrupt(Button3, &Button3_ISR, FALLING);
}

...
...
...

void Button1_ISR(void)
{
    //εδώ σήκωσε μια σημαία για να δείς την αλλαγή κατάστασης στον κυρίως βρόγχο για το κουμπί 1
}

void Button2_ISR(void)
{
    //εδώ σήκωσε μια σημαία για να δείς την αλλαγή κατάστασης στον κυρίως βρόγχο για το κουμπί 2
}

void Button3_ISR(void)
{
    //εδώ σήκωσε μια σημαία για να δείς την αλλαγή κατάστασης στον κυρίως βρόγχο για το κουμπί 3
}
```

----------

thanasis 1 (13-02-16)

----------


## thanasis 1

Μαλλον μανο σε αυτην την λυση θα καταφυγω,ναι και εγω εχω πειραξει το αρχειο board και το βλεπει σαν sanguino.
Απλα δεν μπορω να καταλαβω γιατι σε αυτα τα συγκεκριμενα πιν(pc2 εως pc5)δεν μπορεις να τα δουλεψεις οπως π.χ. την πορτα d.

----------


## SProg

Δεν ειναι τυχαια pin,ουτε λυνεται με διακοπες το προβλημα.


Τα pin που αναφερεις ειναι τα *TCK/TMS/TDO/TDI*,αυτα τα pin ειναι για το *JTAG*.Σιγουρα δεν εχεις πειραξει καποιο fuse;

Οταν εχεις ενεργοποιημενο το Jtag,αυτα τα pin δεν μπορεις να τα χρησιμοποιεις.

----------

manolena (13-02-16)

----------


## thanasis 1

Λοιπον μαλλον βρηκα τι παιζει :Smile: η διεπαφή JTAG είναι στις πορτες PC2, PC3, PC4 και PC5 ,οι προεπιλεγμένες ρυθμίσεις ασφάλειας εχει ενεργοποιημενο το JTAG.
Λενε πως αν κανεις disable  το JTAG θα μπορεις να τις χρησιμοποιησεις κανονικα τις πορτες αυτες.Οποτε πρεπει να πειραξω τις ασφαλειες στο αρχειο
board που εχει το arduino ετσι δεν ειναι??

Edit:
Με προλαβες στο γραψιμο...

----------


## SProg

Οταν ειπες για 1 pin δεν μου πηγε το μυαλο,μολις ειπες *4pin στην C θυρα*...ηξερα ηδη την απαντηση  :Very Happy:

----------


## thanasis 1

Ναι εχεις δικιο δεν ημουν ξεκαθαρος απο την αρχη,χωρις την ενεργοποιηση του jtag απο την σελιδα αυτη
ειναι low=0x62 και high=0xd9 αν τις βαλω στο board που εχει το arduino θα παιξει ή θα εχω κανα θεμα??
Ή δεν θα αλλαξει τιποτα εφοσον δεν αλλαζει κατι στο bootloader??

----------


## SProg

Δοκιμασε να τα αλλαξεις.


http://forum.arduino.cc/index.php?topic=137343.0

----------


## thanasis 1

Ουφ,αλλαξα τις ασφαλειες στο αρχειο board και δουλεψε,παιζει κανονικα. :Dancing: 
 Ευχαριστω πολυ παιδια. :Smile:

----------


## SProg

Τιποτα Θαναση  :Smile:

----------


## thanasis 1

Καθως διαβαζα τα datasheet σε δυο αισθητηρια ειδα τα εξης

LSM6DS3H
 *Spoiler:*       
The transaction on the bus is started through a START (ST) signal. A START condition is
defined as a HIGH to LOW transition on the data line while the SCL line is held HIGH. After
this has been transmitted by the master, the bus is considered busy. The next byte of data
transmitted after the start condition contains the address of the slave in the first 7 bits and
the eighth bit tells whether the master is receiving data from the slave or transmitting data to
the slave. When an address is sent, each device in the system compares the first seven bits
after a start condition with its address. If they match, the device considers itself addressed
by the master.
*The Slave ADdress (SAD) associated to the LSM6DS3H is 110101xb. The SDO/SA0 pin
can be used to modify the less significant bit of the device address. If the SDO/SA0 pin is
connected to the supply voltage, LSb is ‘1’ (address 1101011b); else if the SDO/SA0 pin is
connected to ground, the LSb value is ‘0’ (address 1101010b). This solution permits to
connect and address two different inertial modules to the same I2C bus.*
Data transfer with acknowledge is mandatory. The transmitter must release the SDA line
during the acknowledge pulse. The receiver must then pull the data line LOW so that it
remains stable low during the HIGH period of the acknowledge clock pulse. A receiver
which has been addressed is obliged to generate an acknowledge after each byte of data
received.
The I2C embedded inside the LSM6DS3H behaves like a slave device and the following
protocol must be adhered to. After the start condition (ST) a slave address is sent, once a
slave acknowledge (SAK) has been returned, an 8-bit sub-address (SUB) is transmitted.
The increment of the address is configured by the CTRL3_C (12h) (IF_INC).
The slave address is completed with a Read/Write bit. If the bit is ‘1’ (Read), a repeated
START (SR) condition must be issued after the two sub-address bytes; if the bit is ‘0’ (Write)
the master will transmit to the slave with direction unchanged. Table 11 explains how the
SAD+Read/Write bit pattern is composed, listing all the possible configurations.
  

LSM9DS1
 *Spoiler:*       
The transaction on the bus is started through a START (ST) signal. A START condition is
defined as a high-to-low transition on the data line while the SCL line is held high. After this
has been transmitted by the master, the bus is considered busy. The next byte of data
transmitted after the start condition contains the address of the slave in the first 7 bits and
the eighth bit tells whether the master is receiving data from the slave or transmitting data to
the slave. When an address is sent, each device in the system compares the first seven bits
after a start condition with its address. If they match, the device considers itself addressed
by the master.
Data transfer with acknowledge is mandatory. The transmitter must release the SDA line
during the acknowledge pulse. The receiver must then pull the data line low so that it
remains stable low during the high period of the acknowledge clock pulse. A receiver which
has been addressed is obliged to generate an acknowledge after each byte of data
received.
The I2C embedded inside the LSM9DS1 behaves like a slave device and the following
protocol must be adhered to. In the I2C of the accelerometer and gyroscope sensor, after
the start condition (ST) a slave address is sent, once a slave acknowledge (SAK) has been
returned, an 8-bit sub-address (SUB) is transmitted. The 7 LSb represent the actual register
address while the CTRL_REG8 (22h) (IF_ADD_INC) bit defines the address increment. In
the I2C of the magnetometer sensor, after the START condition (ST) a slave address is sent,
once a slave acknowledge (SAK) has been returned, an 8-bit sub-address (SUB) is
transmitted. The 7 LSb represent the actual register address while the MSB enables the
address auto increment. The SUB (register address) is automatically increased to allow
multiple data read/write.
  

Αν εγω π.χ. θελω να συνδεσω δυο lsm6ds3h τοτε μου δινετε η δυνατοτητα με το SDO/SA0 pin να βαλω και τα δυο σε εναν διαυλο isc.
Με το lsm9ds1 ομως τι γινεται δεν εχω την δυνατοτητα να δουλεψω δυο τετοια αισθητηρια σε εναν κοινο διαυλο??

----------


## manolena

Και τα δύο ολοκληρωμένα έχουν διαθέσιμο 1 bit διευθυνσιοδότησης (μαζί με το σταθερό address της σειράς αυτής), που σημαίνει οτι μπορείς να έχεις δύο ίδια (ίδιου P/N) ή 
απο ένα κάθε τύπου σε κοινό I2C bus.
Δηλαδή: 

LSM9DS1---------> 110101*0*1 (D5h) ή 110101*1*1 (D7h)    Το κόκκινο bit είναι αυτό που σου επιτρέπει την τοποθέτηση μέχρι και 2 ολοκληρωμένων στο δίαυλο. Το τελευταίο bit αφορά την 
λειτουργία ανάγνωσης ή εγγραφής πληροφορίας.

LSM6DS3H---------> 110101*0*1 (D5h) ή 110101*1*1 (D7h)    Το κόκκινο bit είναι αυτό που σου επιτρέπει την τοποθέτηση μέχρι και 2 ολοκληρωμένων στο δίαυλο. Το τελευταίο bit αφορά την 
λειτουργία ανάγνωσης ή εγγραφής πληροφορίας.

Άρα οι συνδυασμοί μπορούν να είναι: 2xLSM9DS1 ή 2xLSM6DS3H ή (1xLSM9DS1+1xLSM6DS3H) 

Σ.Σ.: Τα καταφέρνεις με κόλλημα LGA ή κολλάς σε P&Ρ;

----------


## thanasis 1

Ναι σωστα μανο για το lsm9ds1 το βλεπεις και στο πινακακι που εχει κατω.
Απλα μπερδευτικα διοτι στο LSM6DS3H το λεει ξεκαθαρα εκει που εξηγει για την λειτουργια i2c ενω στο lsm9ds1 δεν το λεει αλλα
μπορεις να το δεις στο πινακακι read/write,σε ευχαριστω.





> Σ.Σ.: Τα καταφέρνεις με κόλλημα LGA ή κολλάς σε P&Ρ;



Ναι εχω κολλησει αρκετα LGA με θερμο αερα το ποιο προσφατο ενα επιταχυνσιομετρο. :Smile:

----------


## vasilisd

Για να μη μπερδευουμε με fuse, ο JTAG απενεργοποιηται και με την εντολη  
MCUCSR |=(1<<JTD);

----------


## thanasis 1

Εχω το γυροσκοπιο l3g4200d(datasheet) και εκανα μια προσπαθεια ωστε να επικοινωνησω μεσω i2c σε ενα arduino και τα καταφερα,μετα ειπα να επικοινωνησω και μεσω spi και ειδα τα εξης:

Για να γραψω σε ενα μητρωο του γυροσκοποιου π.χ. στο CTRL_REG1 που εχει διευθυνση 20h εγραψα





> ```
> void setup() {
> 
>   Serial.begin(9600);
> 
>   SPI.begin();
>   SPI.setDataMode(SPI_MODE0);
>   SPI.setClockDivider(SPI_CLOCK_DIV2);
> 
> ...



και ειδα οτι γραφτηκε σωστα.Ομως ειδα σε ενα ετοιμο παραδειγμα και εγρφε το εξης(βαζω απλα το κομματι που ειναι η διαφορα)





> ```
> void writeRegister(byte address, byte data)   //οπου addess-->CTRL_REG1=20h και data 0x0F
> {
>   address &= 0x7F;  // This to tell the L3G4200D we're writing
>   
>   digitalWrite(chipSelect, LOW);
>   SPI.transfer(address);
>   SPI.transfer(data);
>   digitalWrite(chipSelect, HIGH);
> ...



αυτο το 0x7f απο που προκυπτει,κοιταξα το datasheet αλλα δεν καταλαβα.
Παντως και με τους δυο τροπους γραφτηκε σωστα,απλα ρωταω για να δω τι παιζει.

----------


## SProg

Αυτη η πραξη σου μηδενιζει το bit.7 και αφηνει τα υπολοιπα bit.0-bit.6 οπως ειναι (ανεξαρτητου τιμης).

Προφανως το Bit αυτο κατι σημαινει και βεβαιαωνεται οτι ειναι 0.

----------


## thanasis 1

Σαββα μηπως εχει να κανει με αυτο που λεει στο datasheet στην σελιδα 25 παραγραφο 5.2.2??

----------


## SProg

Μισο να δω Θαναση.

To Bit αυτο ειναι το πρωτο που στελνει και αναλογως την τιμη που εχει (0 ή 1) δηλωνει εαν προκειται για εγγραφη ή διαβασμα.

Η πραξη *address &= 0x7F;* κανει λογικο AND την διευθυνση με τον αριθμο 0111.1111b.Οποτε μηδενιζει το πρωτο Bit που θα σταλει και αφηνει τα υπολοιπα το ιδιο.


Ετσι βεβαιωνεται οτι το Bit μας ειναι 0 και προκεται να γραψουμε.

dsasaddsa.jpg


(ΑΝΕΒΑΣΑ ΚΑΙ ΜΙΑ ΛΑΘΟΣ ΕΙΚΟΝΑ)

----------


## thanasis 1

Αρα εγω που ειχα γραψει





> ```
> void setup() {
> 
>   Serial.begin(9600);
> 
>   SPI.begin();
>   SPI.setDataMode(SPI_MODE0);
>   SPI.setClockDivider(SPI_CLOCK_DIV2);
> 
> ...



Το εγραψε σωστα επειδη τυχαινε με την διευθυνση 20h-->0b00100000 το πρωτο bit να ειναι 0 οποτε καταλαβαινε οτι προκειται για εγγραφη σωστα??

----------


## SProg

Ακριβως.

----------


## thanasis 1

> Ακριβως.



Α ρε τι σου ειναι η τυχη. :Smile: 

Τωρα κατι οσο αφορα το διαβασμα,το ετοιμο παραδειγμα ελεγε




> ```
> int readRegister(byte address) //οπου address 0X28....2C για το διαβασμα τον αξονων
> {
>   int toRead;
>   
>   address |= 0x80;  // This tells the L3G4200D we're reading;
>   
>   digitalWrite(chipSelect, LOW);
>   SPI.transfer(address);
> ...



Ενταξη το address |= 0x80; το κανει για να δειξει οτι προκειται για διαβασμα,το "toRead = SPI.transfer(0x00);" ομως τι κανει??

Εγω το εγραψα ετσι 





> ```
> void GyroValues()
> {
>   digitalWrite(CS, LOW);
>   SPI.transfer(0x28 | 0x80);
>   lowByte = SPI.transfer(0x00);
>   digitalWrite(CS, HIGH); 
> 
>   digitalWrite(CS, LOW);
> ...



για να μην καλω καποια συναρτηση και μου δουλεψε.Ομως το "toRead = SPI.transfer(0x00);" και "lowByte = SPI.transfer(0x00);" που εχω γραψει εγω σε τι κανουν?

----------


## SProg

Δεν καταλαβαινω.Το ιδιο ακριβως πραγματα κανετε.

Και απ οτι βλεπω υπολογιζεις και σωστα τις τιμες.Ενωνεις δηλαδη σωστα τα 2 Byte καθε φορα.

----------


## thanasis 1

Εγω δεν καταλαβαινω γιατι πρεπει να γραψω και το "lowByte = SPI.transfer(0x00);" ή το "toRead = SPI.transfer(0x00);" για να παιξει σωστα ?
Αν το γραψω ετσι




> ```
> void GyroValues()
> {
>   digitalWrite(CS, LOW);
>   lowByte = SPI.transfer(0x28 | 0x80);
>   digitalWrite(CS, HIGH); 
> 
>   digitalWrite(CS, LOW);
>   highByte = SPI.transfer(0x29 | 0x80);
> ...



δεν θα παιξει.

----------


## SProg

_// send a value of 0 to read the first byte returned:_
  result = SPI.transfer(0x00);

----------


## thanasis 1

Η απαντηση ειναι ακριβως εδω για το ερωτημα μου,οπως λεει:

_The SPI protocol calls for a single master clock to  the slave so while it writes, it also reads.  In your case, when you  send the 8 bytes to the slave simply ignore the read data, wait the 50ms  then do your reads.  Typically, a "dummy" byte value (eg. 0xFF or 0x00)  is sent to the slave for the reads to work._

και απο την σελιδα του arduino

_In the above, "0xFF" is sent to the SPI device on pin 4 and the data coming from MISO is saved inside the variable response. The chip selection is handled automatically by the SPI controller, the transfer command implies the following:

    Select device by setting pin 4 to LOW
    Send 0xFF through the SPI bus and return the byte received
    Deselect device by setting pin 4 to HIGH_ 

Σαββα σε ευχαριστω για το σημερινο μαθημα σου,να εισαι καλα.Μου ελυσες σημαντικες αποριες.

----------


## SProg

Ακριβως αυτο Θαναση.Να κοιτας και στο επισημο τους forum,δεν ειναι βεβαια AVRfreaks αλλα ειδικα ο MarkT πεταει διαμαντια και υπεροχες εξηγησεις.

----------


## thanasis 1

Σωστος,ο συγκεκριμενος ειναι...

----------


## misterno

Ερώτηση σχετικά με το arduino:
Υπάρχει πρόγραμμα σαν το codeflow ώστε να μετατρέπει ένα διάγραμμα ροής σε κώδικα arduino;

----------


## SProg

Δεν εχω ιδεα αλλα δεν μου φαινεται πρακτικο.

----------


## misterno

> Δεν εχω ιδεα αλλα δεν μου φαινεται πρακτικο.



Το πρόγραμμα αυτό, παράγει κώδικα για επεξεργαστές τύπου PIC.
Λογικά θα μπορεί να παράγει και κώδικα τύπου C για arduino.
Ειδικά για αρχάριους όπως εγώ, θα ήταν ένα εξαιρετικό βοήθημα παραγωγής κώδικα με βάση τον αλγόριθμο του προβλήματος.
Για προγραμματισμό σε arduino πως ξεκινάς το πρόγραμμα;
Με κώδικα τύπου top down ή άλλη μορφή; Τι θα συμβούλευες για ευκολία και πρακτική εφαρμογή;

----------


## SProg

Διαγραμμα ροης κανουμε (τουλαχιστον εγω) σε προγραμματα συνθετα ή με αρκετες διακοπες που πρεπει ερχονται σωστα.


Ο καλυτερος τροπος να μαθεις Arduino ειναι να δεις τα βασικα του παραδειγματα και να κοιτας το Site του.Εαν εχεις ασχοληθει και με PIC τοτε ειναι γελοιο.


Με διαγραμματα ροης απλα θα φας το χρονο σου.


Η γλωσσα του Arduino 'Wiring' (μαλλον ψευδογλωσσα) ειναι ηδη ευκολη.

----------


## Fire Doger

Γνώμη μου σαν τον καθαρό κώδικα δεν είναι τίποτα.
Τα μόνα τύπου flowchart που βρίσκω χρήσιμα  (που δεν τα λες και σοβαρό διάγραμμα ροής) είναι αυτά που έχουν συνήθως δεξιά οι compiler με τα ονόματα των συναρτήσεων,  κλάσεων κλπ γιατί τα έχει συμπυκνωμένα και δεν ψάχνω πάνω κάτω που τα έβαλα.

Υπάρχουν διάφορα βέβαια για το arduino για "ευκολία" αλλά μου φάνηκαν πολύ παιδικά.
https://learn.sparkfun.com/tutorials...aces/ardublock

Θα σου πρότεινα να δεις και το extension στο Visual Studio που επιταχύνει πολύ το γράψιμο με τo Auto Complete γιατί γράφεις 2 γράμματα ctrl+space έτοιμος  :Biggrin: 
Υπάρχουν και άλλοι σοβαροί compilers που δέχονται arduino extension πχ eclipse, codeblocks

----------


## SProg

Δεν υπαρχει σοβαρο προγραμμα που να μην εχει διαγραμμα ροης.Σε οτι γλωσσα και να γραφεις.
Ολα τα παραδειγματα-application απο μεγαλες εταιρειες εχουν και διαγραμματα ροης.


θα μπλεκεις τα μπουτια σου μετα τις 2-3k γραμμες ετσι και αλλιως οταν γραφεις χωρις διαγραμμα και ακομα χειροτερα στο Debug.


Το να κανεις διαγραμμα και να στο κανει ετοιμο προγραμμα δεν το εχω δοκιμασει ποτε και ουτε προκειται οποτε δεν ξερω.


Και το MKD που γραφω εχει auto-fill αλλα εκει εχει νοημα,στον Arduino τι να σε βοηθησει;Να μην ξεχασεις το AnalogWrite και PinMode ;

----------


## thanasis 1

Δοκιμασα σημερα το κωδικα για το γυροσκοπιο που ετρεχα στο arduino mega σε ενα arduino due αλλα παρατηρησα οτι στο due οι τιμες που μου εβγαζε ηταν αλλα ντ αλλων.
Σε τρια φορουμ που εψαξα ελεγαν οτι σε αυτους ετρεχε σωστα μονο rσε εναν δεν επαιζε και του ειπαν να προσθεσει pull up αντιστασεις αλλα αφου το εκανε του εβγαζε και παλι λαθος τιμες.
Σε εμενα το γυροσκοπιο εχει πανω στην πλακετα τις pull
up.Εχει να κανει με το κωδικα??

----------


## Fire Doger

Μήπως έχει να κάνει με την ταχύτητα του SPI? Διαφορετικός κρύσταλλος = διαφορετικός divider.
Και το pinout του hardware SPI  MISO 74, MOSI 75, SCK 76

Για να μην παιδεύεσαι στο μέλλον με τα bus θα σου πρότεινα κάτι τέτοιο για να μην πας στα τυφλά.

----------

manolena (05-08-16), 

thanasis 1 (05-08-16)

----------


## thanasis 1

Το δοκιμασα και με spi και με i2c αλλα και στις δυο περιπτωσεις μου βγαζει οτι να ναι.

----------


## Fire Doger

To clock το άλλαξες? Αν ναι πως?
Στην έκδοση 1.6+ έχουν προσθέσει αυτό *SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0));*
Σε αντίθεση με τις παλαιότερες που χρησιμοποιούσαν 0-255 (για due) ως διαιρέτη του clock απλώς ρυθμίζοντας το hardware prescaler τώρα το κάνουν με ακρίβεια βάζοντας ο χρήστης το επιθυμητό clock speed. Απ' ότι είδα εσύ θέλεις 8.000.000 clock γιατί χρησημοποιούσες SPI_CLOCK_DIV2 στον 16Mhz κρύσταλλο.

Με το 0-255 δεν έχω ιδέα πως κάνει τις διαιρέσεις, θα πρέπει να διαιρέσεις τα 84Mhz του due με 10.5  :Confused1:  20% σφάλμα βγάζει το 10 ή 11

Απ' εδώ τα διάβασα.

----------


## thanasis 1

Ενταξει πες οτι στο spi εχει θεμα με το ρολοι στο i2c ομως γιατι δεν παιζει??

Με αυτο που εβαλες παραπανω εκανα τις δοκιμες στον due δηλαδη "*SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0));*"

----------


## Fire Doger

Χωρίς διαγράμματα χρονισμού λίγο δύσκολο να βγάλουμε συμπέρασμα.
Οι έτοιμες βιβλιοθήκες δοκίμασες αν δουλεύουν?
https://github.com/pololu/l3g-arduino
http://lucidtronix.com/tutorials/63

Επίσης πρόσεξα ότι χρησιμοποιεί SPI mode 3 και δεν χρησιμοποιεί και τα dummy εδώ
https://github.com/sparkfun/Tri-Axis...akout-L3G4200D

----------


## thanasis 1

Ναι στεφανε τις ειχα δοκιμασει και καμια δεν δουλευει σωστα.
Στον mega ομως δουλευαν ολες ρολοι.

----------


## thanasis 1

Παντως ειναι πολυ περιεργο οταν βαζω καποιο αισθητηριο και το διαβασω με i2c ή spi στο arduino due δεν μπορω να το διαβασω σωστα,οταν ομως
βαλω το nrf24l01 για ασυρματη επικοινωνια με ενα arduino mega τοτε δουλευει μια χαρα.Εχω δοκιμασει 5 αισθητηρια και ολα δεν μπορει να τα 
διαωασει σωστα.Τι διαολο εχει θεμα με τα αισθητηρια??

----------


## thanasis 1

Δεν μπορουσα να κανω επεξεργασια στο πανω μηνυμα και ετσι το γραφω σε νεο.
Το προβλημα λυθηκε προσθετοντας εκει που ενωνω τα δυο bytes μια "(int16_t)" typecast δηλαδη γραφοντας "gyro_roll = (int16_t)((highByte<<8|lowByte);" και τωρα δουλευει ρολοι.
Ετσι αν καποιος αντιμετοπισει το ιδιο προβλημα ας το εχει υποψιν.

----------

