Πίνακας περιεχομένων:

IOT123 - SOLAR TRACKER - ΕΛΕΓΧΟΣ: 8 Βήματα
IOT123 - SOLAR TRACKER - ΕΛΕΓΧΟΣ: 8 Βήματα

Βίντεο: IOT123 - SOLAR TRACKER - ΕΛΕΓΧΟΣ: 8 Βήματα

Βίντεο: IOT123 - SOLAR TRACKER - ΕΛΕΓΧΟΣ: 8 Βήματα
Βίντεο: Solar Τracker - Σύστημα Αυτομάτου Ελέγχου ΦΒ πάνελ 2024, Ιούλιος
Anonim
Image
Image
IOT123 - SOLAR TRACKER - ΕΛΕΓΧΟΣ
IOT123 - SOLAR TRACKER - ΕΛΕΓΧΟΣ
IOT123 - SOLAR TRACKER - ΕΛΕΓΧΟΣ
IOT123 - SOLAR TRACKER - ΕΛΕΓΧΟΣ

Αυτή είναι μια επέκταση του Instructable

IOT123 - SOLAR TRACKER - TILT/PAN, PANEL FRAME, LDR MOUNTS RIG. Εδώ επικεντρωνόμαστε στον ελεγκτή των servos και στους αισθητήρες της θέσης του ήλιου. Είναι σημαντικό να επισημανθεί ότι αυτός ο σχεδιασμός προϋποθέτει ότι θα χρησιμοποιηθούν 2 MCU: ένα (3.3V 8mHz Arduino Pro Mini) για τον ηλιακό ιχνηλάτη και ένα ανεξάρτητο MCU για τους αισθητήρες/ηθοποιούς σας.

Αυτή είναι η έκδοση 0.3

Αντί να δημοσιεύω όλα τα έργα μετά από πλήρη ικανοποίηση, θα εξασκήσω τη συνεχή ολοκλήρωση και θα παραδώσω κάτι πιο συχνά, τροποποιώντας αυτό που έχω παραδώσει όπως χρειάζομαι. Θα γράψω ένα άλλο οδηγό για τον φορτιστή μπαταρίας, όταν ολοκληρωθεί η βελτιστοποίηση του λογισμικού/υλικού του ελεγκτή. Θα επισημάνω πού χρειάζονται οι βελτιστοποιήσεις καθώς προχωράμε σε αυτό.

Ένας λόγος για αυτήν την προσέγγιση είναι η ανατροφοδότηση των πελατών. Αν βλέπετε την ανάγκη ή έχετε καλύτερη προσέγγιση, παρακαλώ σχολιάστε, αλλά λάβετε υπόψη ότι δεν μπορώ να παραδώσω τα πάντα και πιθανώς όχι σε ένα χρονικό πλαίσιο που σας ταιριάζει. Καθώς αυτές οι εξηγήσεις φαίνονται λιγότερο σχετικές, θα διαγραφούν από αυτό το άρθρο.

Τι περιλαμβάνει αυτό:

  1. Χρησιμοποιήστε τα LDR από το αρχικό Instructable για να αντιληφθείτε την κατά προσέγγιση τοποθεσία του ήλιου.
  2. Μετακινήστε τα servos για να κοιτάξετε τον ήλιο.
  3. Επιλογές για την ευαισθησία των κινήσεων.
  4. Επιλογές για το μέγεθος του βήματος όταν μετακινείστε στον ήλιο.
  5. Επιλογές για τους γωνιακούς περιορισμούς που χρησιμοποιούνται στα servos.
  6. Επιλογές για καθυστερήσεις των κινήσεων.
  7. Διεπαφή I2C για ρύθμιση/λήψη τιμών μεταξύ MCU.
  8. Βαθύς ύπνος ανάμεσα στις κινήσεις.

Τι δεν περιλαμβάνει αυτό (και θα αντιμετωπιστεί ως χρονικό περιθώριο):

  1. Χρησιμοποιείτε ρεύμα μόνο κατά τη διάρκεια της ημέρας.
  2. Θυμάμαι τη θέση της αυγής και πηγαίνω εκεί όταν κλείνει το σούρουπο.
  3. Αφαίρεση του ρυθμιστή από το MCU.
  4. Απενεργοποίηση των (των) LED (ων) στο MCU.
  5. Αναδρομολόγηση της ισχύος μέσω VCC και όχι RAW.
  6. Παροχή λύσεων για αναβοσβήσιμο χωρίς ρυθμιζόμενη ισχύ από τον μετατροπέα USB σε σειριακό TTL.
  7. Οθόνη τάσης μπαταρίας.

ΙΣΤΟΡΙΑ

20 Δεκ 2017 V0.1 ΚΩΔ

Η αρχική έκδοση παρακολουθεί την πηγή φωτός, πάντα αναμμένη, χωρίς φόρτιση

7 Ιανουαρίου 2018 V0.2 ΚΩΔ

  • ΑΛΛΑΓΕΣ ΣΥΛΛΟΓΟΥ

    • Προσθέστε καρφίτσες I2C
    • Προσθήκη διακόπτη σε σερβο GND
    • Εκτυπωμένη ετικέτα σε περιτονία κουτιού ελεγκτή
  • ΑΛΛΑΓΕΣ ΛΟΓΙΣΜΙΚΟΥ

    • Διαβάστε τη διαμόρφωση από το EEPROM
    • Υποστήριξη διαύλου I2C ως υποτελής σε άλλο MCU (3.3V)
    • Ορίστε τη διαμόρφωση μέσω I2C
    • Ορισμός ενεργοποιημένη μέσω I2C
    • Λάβετε διαμόρφωση μέσω I2C
    • Λάβετε ιδιότητες χρόνου εκτέλεσης μέσω I2C (ενεργοποιημένο αυτήν τη στιγμή και τρέχουσα ένταση φωτός)
    • Κατάργηση σειριακής καταγραφής (επηρέασε τις τιμές I2C)

19 Ιαν. 2018 V0.3 ΚΩΔ

  • ΣΚΕΥΗ, ΕΞΑΡΤΗΜΑΤΑ

    Η ετικέτα ενημερώθηκε. Ο διακόπτης χρησιμοποιείται τώρα για την επιλογή λειτουργίας CONFIG ή TRACK

  • ΛΟΓΙΣΜΙΚΟ

    • Το I2C χρησιμοποιείται μόνο για διαμόρφωση
    • Ο ελεγκτής περιμένει 5 δευτερόλεπτα πριν από την αρχική παρακολούθηση, επιτρέπει την κίνηση των χεριών
    • Για να χρησιμοποιήσετε τη διαμόρφωση I2C, το SPDT πρέπει να είναι στο CONFIG ως μονάδες εκκίνησης
    • Μεταξύ της κίνησης παρακολούθησης, η μονάδα βρίσκεται σε κατάσταση βαθιάς αναστολής λειτουργίας για τιμή διαμόρφωσης SLEEP MINUTES (προεπιλογή 20 λεπτά).

Βήμα 1: Υλικά και εργαλεία

Υλικά και Εργαλεία
Υλικά και Εργαλεία
Υλικά και Εργαλεία
Υλικά και Εργαλεία
Υλικά και Εργαλεία
Υλικά και Εργαλεία

Υπάρχει τώρα μια πλήρης λίστα υλικών και πηγών.

  1. Τρισδιάστατα τυπωμένα μέρη.
  2. Arduino Pro Mini 3.3V 8mHz
  3. 1 από 4x6cm Double Side Prototype PCB Universal Printed Circuit Board (για να κοπεί στη μέση)
  4. 1 έκπτωση 40P αρσενική κεφαλίδα (για κοπή σε μέγεθος).
  5. 1 γυναικεία κεφαλίδα 40P (για κοπή σε μέγεθος).
  6. 4 off 10K 1/4W restistors.
  7. Σύρμα σύνδεσης.
  8. Συγκολλητής και σίδερο.
  9. 20 από ανοξείδωτες βίδες κεφαλής από ανοξείδωτο χάλυβα 4G x 6mm.
  10. 4 off 4G x 6mm ανοξείδωτες βίδες αυτοεπιπεδώματος.
  11. 1 έκπτωση 3.7V μπαταρία LiPo και θήκη (τερματισμός σε 2P συνδετήρες dupont).
  12. 1 off 2P αρσενική κεφαλίδα δεξιάς γωνίας
  13. 1 απενεργοποιημένος διακόπτης SPDT 3 ακίδων βήματος 2,54mm
  14. Ισχυρή κυανοακρυλική κόλλα
  15. Συνδέσεις Dupont θηλυκή κεφαλίδα 1P (1 από μπλε, 1 από πράσινη).

Βήμα 2: Συναρμολόγηση του κυκλώματος

Συναρμολόγηση του Κυκλώματος
Συναρμολόγηση του Κυκλώματος
Συναρμολόγηση του Κυκλώματος
Συναρμολόγηση του Κυκλώματος
Συναρμολόγηση του Κυκλώματος
Συναρμολόγηση του Κυκλώματος

Το κύκλωμα προς το παρόν δεν διαθέτει κύκλωμα διαίρεσης τάσης (βολτόμετρο).

  1. Κόψτε τη διπλή όψη 4x6cm Πρωτότυπο PCB Universal Printed Circuit Board στη μέση κατά μήκος του μεγάλου άξονα.
  2. Κόψτε την αντρική κεφαλίδα 40P σε κομμάτια:

    1. 2 έκπτωση 12P
    2. 3 έκπτωση 3Ρ
    3. 6 έκπτωση 2P.
  3. Κόψτε τη γυναικεία κεφαλίδα 40P σε κομμάτια:

    1. 2 έκπτωση 12P
    2. 1 έκπτωση 6P
  4. Συγκόλληση 2 από 12Κεφαλίδα γυναικών όπως φαίνεται.
  5. Κολλήστε το διαχωριστικό που αφαιρέθηκε από μια αρσενική κεφαλίδα 3P (επιπλέον) στην κάτω πλευρά του διακόπτη SPDT με κόλλα κυανοακρυλικού
  6. Σε άλλη πλευρά τοποθετήστε στη συνέχεια 6 κολλήσεις 2P, 2 off 3Pmale κεφαλίδας και τον διακόπτη SPDT όπως φαίνεται.
  7. Συγκολλήστε 4 αντιστάσεις 10Κ (A, B, C, D μαύρο) μέσω καλωδίου στην κεφαλίδα καρφιτσών GND (#2 μαύρο) και στις ακίδες κεφαλίδας A0 - A3 (#5, #6, #7, #8) και στη συνέχεια μέσω οπής (κίτρινο) όπως φαίνεται (3 φωτογραφίες + 1 διάγραμμα).
  8. Ανιχνεύστε 3.3V από PINS συγκόλλησης LDR PINS #4, #6, #8, #10 και περάστε από το νήμα στην καρφίτσα VCC της επικεφαλίδας (πράσινο).
  9. Ανιχνεύστε 3.3V στη γυναικεία κεφαλίδα, όπως φαίνεται (κόκκινη) συγκόλληση στα PINS #1, #12, #15.
  10. 3.3V μέσω οπής το συγκολλημένο στο πλάι (κόκκινο) PIN κεφαλίδας RAW #1.
  11. Ανιχνεύστε πορτοκαλί σύνδεση από το PIN #11 μέσα από την τρύπα για να κολλήσετε θηλυκό πείρο στην άλλη πλευρά, όπως φαίνεται.
  12. Ανιχνεύστε και κολλήστε μπλε σύρμα σύνδεσης από #20 έως #30 και από #31 έως #13 και #16.
  13. Συγκολλητικό θηλυκό κεφαλίδα PIN #11 σε αρσενικό header PIN #11 μέσω οπής.
  14. Προετοιμάστε 2 συνδετήρες dupont μήκους 30mm με θηλυκή κεφαλίδα 1P (1 από μπλε, 1 από πράσινη). Λωρίδα και κασσίτερος στην άλλη άκρη.
  15. Συγκόλληση μπλε σύρμα Dupont στο #28? συγκολλήστε πράσινο σύρμα Dupont στο #29.
  16. Στην κορυφή του Arduino στερεώστε τη θηλυκή κεφαλίδα 6P και στη συνέχεια συγκολλήστε.
  17. Στο επάνω μέρος του Arduino στερεώστε τη γυναικεία κεφαλίδα 2P ορθής γωνίας int #29 και #30 και στη συνέχεια συγκολλήστε.
  18. Στην κάτω πλευρά του Arduino στερεώστε τις 2 αρσενικές ακίδες 12P και 1 off 3P και μετά κολλήστε.
  19. Εισαγάγετε αρσενικές ακίδες 12P Arduino σε θηλυκές κεφαλίδες PCB 12P.

Βήμα 3: Αναβοσβήνει το MCU

Αναβοσβήνει το MCU
Αναβοσβήνει το MCU
Αναβοσβήνει το MCU
Αναβοσβήνει το MCU
Αναβοσβήνει το MCU
Αναβοσβήνει το MCU

Το Arduino Pro Mini αναβοσβήνει βολικά χρησιμοποιώντας μετατροπέα USB FTDI232 USB σε TTL χρησιμοποιώντας τη θηλυκή κεφαλίδα 6P. Δείτε την παραπάνω φωτογραφία για την ευθυγράμμιση των 2 σανίδων.

Βεβαιωθείτε ότι η ρύθμιση 3.3V είναι επιλεγμένη στο FTDI232. Ακολουθήστε τις οδηγίες εδώ χρησιμοποιώντας τον παρακάτω κώδικα (χρησιμοποιήστε το σύνδεσμο για το GIST).

Η βιβλιοθήκη χαμηλής ισχύος (επισυνάπτεται και https://github.com/rocketscream/Low-Power) πρέπει να εγκατασταθεί.

Μόλις εγκατασταθεί το Arduino Pro Mini + PCB στο περίβλημα, μπορεί ακόμα να αναβοσβήνει καθώς εκτίθενται οι ακίδες κεφαλίδας. Απλώς αποσυνδέστε τη μονάδα ελεγκτή από το πλαίσιο πίνακα εκθέτοντας την κεφαλίδα.

Ηλιακός ιχνηλάτης κλίσης με ρύθμιση I2C/EEPROM και κύκλος ύπνου μεταξύ των κινήσεων. Η ακρίβεια διάρκειας κύκλου ύπνου μειώνεται καθώς αυξάνεται η διάρκεια, αλλά επαρκής για το σκοπό αυτό

/*
* τροποποιήθηκε από τον κώδικα
* από τον Mathias Leroy
*
* V0.2 ΤΡΟΠΟΠΟΙΗΣΕΙΣ
** ΣΕΤ I2C SET GET
** EEPROM SET GET
** ΑΦΑΙΡΕΣΗ ΣΕΙΡΙΑΣ ΕΞΟΔΟΥ - ΕΠΗΡΕΑΜΕΝΟ I2C
** ΕΝΕΡΓΟΠΟΙΗΣΗ/ΑΠΕΝΕΡΓΟΠΟΙΗΣΗ ΠΑΡΑΚΟΛΟΥΘΗΣΗΣ
** ΚΙΝΗΣΤΕ ΤΑ ΣΕΡΒΟΣ ΣΤΑ ΠΕΡΙΟΡΙΣΜΕΝΑ ΜΕΣΩ ΤΟΥ I2C
** ΔΙΑΒΑΣΤΕ ΤΡΕΧΟΝ ΜΕΓΑΛΗ ΕΝΤΑΣΗ ΜΕΣΩ I2C
* V0.3 ΤΡΟΠΟΠΟΙΗΣΕΙΣ
** ΑΛΛΑΓΗ ΓΙΑ 2 ΛΕΙΤΟΥΡΓΙΕΣ - TRACK (NO I2C) και CONFIGURE (ΧΡΗΣΕΙΣ I2C)
** ΥΠΝΟ ΣΤΗ ΛΕΙΤΟΥΡΓΙΑ (ΠΟΛΥ ΧΑΜΗΛΗ ΑΚΡΙΒΕΙΑ ΛΟΓΩ 8 ΔΕΥΤΕΡΩΝ ΜΕΓΑΛΩΝ)
** ΑΠΕΝΕΡΓΟΠΟΙΗΣΗ/ΣΥΝΔΕΣΜΟΣ ΣΕΡΒΟΣ ΣΤΟΝ ΥΠΝΟ/ΞΥΠΝΗΣΗ (ΤΡΑΝΣΙΣΤΟΡ ΧΡΗΣΙΜΟΠΟΙΕΙΤΑΙ ΕΚΤΑΚΤΟ)
** ΑΦΑΙΡΕΣΤΕ ΤΗ ΔΙΑΜΟΡΦΩΣΗ ΤΗΣ ΑΡΧΙΚΗΣ ΘΕΣΗΣ (ΕΠΙΠΛΕΟΝ)
** ΑΦΑΙΡΕΣΗ ΔΙΑΦΟΡΕΤΙΚΟΥ ΔΕΥΤΕΡΟΥ ΞΥΠΝΙΣΜΑΤΟΣ (ΕΠΙΠΛΕΟΝ)
** ΑΦΑΙΡΕΣΗ ΔΙΑΜΟΡΦΩΣΗΣ ΕΝΕΡΓΟΠΟΙΗΣΗ/ΑΠΕΝΕΡΓΟΠΟΙΗΣΗ (ΜΕΙΩΣΗ)
** ΑΦΑΙΡΕΣΗ ΕΓΚΑΤΑΣΤΑΣΗΣ ΔΙΑΜΟΡΘΩΜΕΝΟΥ ΔΙΑΚΟΠΤΗ (ΧΡΗΣΗ ΣΥΣΚΕΥΗΣ HARDWARE)
** ΑΦΑΙΡΕΣΗ ΤΗΣ ΤΑΣΗΣ - ΘΑ ΧΡΗΣΙΜΟΠΟΙΗΣΕΙ ΧΩΡΙΣΤΙΚΟ ΣΥΣΤΑΤΙΚΟ I2C
** ΠΡΟΣΘΗΚΗ ΣΕΙΡΙΚΗΣ ΣΥΝΔΕΣΗΣ ΟΤΑΝ ΔΕΝ ΧΡΗΣΙΜΟΠΟΙΕΙΤΕ ΤΟ I2C
*/
#περιλαμβάνω
#περιλαμβάνω
#περιλαμβάνω
#περιλαμβάνω
#περιλαμβάνω
#defineEEPROM_VERSION1
#defineI2C_MSG_IN_SIZE3
#definePIN_LDR_TL A0
#definePIN_LDR_TR A1
#definePIN_LDR_BR A3
#definePIN_LDR_BL A2
#definePIN_SERVO_V11
#definePIN_SERVO_H5
#defineIDX_I2C_ADDR0
#defineIDX_V_ANGLE_MIN1
#defineIDX_V_ANGLE_MAX2
#defineIDX_V_SENSITIVITY3
#defineIDX_V_STEP4
#defineIDX_H_ANGLE_MIN5
#defineIDX_H_ANGLE_MAX6
#defineIDX_H_SENSITIVITY7
#defineIDX_H_STEP8
#defineIDX_SLEEP_MINUTES9
#defineIDX_V_DAWN_ANGLE10
#defineIDX_H_DAWN_ANGLE11
#defineIDX_DAWN_INTENSITY12 // μέσος όρος όλων των LDRS
#defineIDX_DUSK_INTENSITY13 // μέσος όρος όλων των LDRS
#defineIDX_END_EEPROM_SET14
#defineIDX_CURRENT_INTENSITY15 // μέσος όρος όλων των LDRS - χρησιμοποιείται για τον υπολογισμό του μη άμεσου φωτισμού IDX_DAWN_INTENSITY
#defineIDX_END_VALUES_GET16
#defineIDX_SIGN_117
#defineIDX_SIGN_218
#defineIDX_SIGN_319
Servo _servoH;
Servo _servoV;
byte _i2cVals [20] = {10, 10, 170, 20, 5, 10, 170, 20, 5, 20, 40, 10, 30, 40, 0, 0, 0, 0, 0, 0};
int _servoLoopDelay = 10;
int _slowingDelay = 0;
int _angleH = 90;
int _angleV = 90;
int _averageTop = 0;
int _averageRight = 0;
int _averageBottom = 0;
int _averageLeft = 0;
byte _i2cResponse = 0;
bool _inConfigMode = false;
voidsetup ()
{
Serial.begin (115200);
getFromEeprom ();
εάν (inConfigMode ()) {
Serial.println ("Λειτουργία διαμόρφωσης");
Serial.print ("Διεύθυνση I2C:");
Serial.println (_i2cVals [IDX_I2C_ADDR]);
Wire.begin (_i2cVals [IDX_I2C_ADDR]);
Wire.onReceive (ReceEvent);
Wire.onRequest (requestEvent);
}αλλού{
Serial.println ("Λειτουργία παρακολούθησης");
καθυστέρηση (5000); // χρόνος για να ξεφύγουμε από τα χέρια εάν συνδέσετε την μπαταρία κ.λπ.
}
}
voidloop ()
{
getLightValues ();
εάν (! _inConfigMode) {
// ToDo: ΕΝΕΡΓΟΠΟΙΗΣΗ TRANSISTOR SWITCH
_servoH.attach (PIN_SERVO_H);
_servoV.attach (PIN_SERVO_V);
για (int i = 0; i <20; i ++) {
αν (i! = 0) {
getLightValues ();
}
moveServos ();
}
καθυστέρηση (500)?
_servoH.detach ();
_servoV.detach ();
// ToDo: ΑΠΕΝΕΡΓΟΠΟΙΗΣΗ ΔΙΑΚΟΠΤΗΣ TRANSISTOR
καθυστέρηση (500)?
κοιμισμένος για ((_ i2cVals [IDX_SLEEP_MINUTES] * 60) / 8);
}
}
// --------------------------------- ΤΡΕΧΟΥΣ ΤΡΟΠΟΣ
boolinConfigMode () {
pinMode (PIN_SERVO_H, INPUT);
_inConfigMode = digitalRead (PIN_SERVO_H) == 1;
return _inConfigMode;
}
// --------------------------------- EEPROM
voidgetFromEeprom () {
αν(
EEPROM.read (IDX_SIGN_1)! = 'S' ||
EEPROM.read (IDX_SIGN_2)! = 'T' ||
EEPROM.read (IDX_SIGN_3)! = EEPROM_VERSION
) EEPROM_write_default_configuration ();
EEPROM_read_configuration ();
}
voidEEPROM_write_default_configuration () {
Serial.println ("EEPROM_write_default_configuration");
για (int i = 0; i <IDX_END_EEPROM_SET; i ++) {
EEPROM.update (i, _i2cVals );
}
EEPROM.update (IDX_SIGN_1, 'S');
EEPROM.update (IDX_SIGN_2, 'T');
EEPROM.update (IDX_SIGN_3, EEPROM_VERSION);
}
voidEEPROM_read_configuration () {
Serial.println ("EEPROM_read_configuration");
για (int i = 0; i <IDX_END_EEPROM_SET; i ++) {
_i2cVals = EEPROM.read (i);
//Serial.println(String(i) + "=" + _i2cVals );
}
}
// --------------------------------- I2C
voidreceiveEvent (int count) {
εάν (μετρήστε == I2C_MSG_IN_SIZE)
{
char cmd = Wire.read ();
byte index = Wire.read ();
byte value = Wire.read ();
διακόπτης (cmd) {
case'G ':
εάν (ευρετήριο <IDX_END_VALUES_GET) {
_i2cResponse = _i2cVals [ευρετήριο];
}
Διακοπή;
περίπτωση 'S':
εάν (ευρετήριο <IDX_END_EEPROM_SET) {
_i2cVals [index] = τιμή;
EEPROM.update (index, _i2cVals [index]);
}
Διακοπή;
Προκαθορισμένο:
ΕΠΙΣΤΡΟΦΗ;
}
}
}
voidrequestEvent ()
{
Wire.write (_i2cResponse);
}
// --------------------------------- LDR
voidgetLightValues () {
int valueTopLeft = analogRead (PIN_LDR_TL);
int valueTopRight = analogRead (PIN_LDR_TR);
int valueBottomRight = analogRead (PIN_LDR_BR);
int valueBottomLeft = analogRead (PIN_LDR_BL);
_averageTop = (valueTopLeft + valueTopRight) / 2;
_averageRight = (valueTopRight + valueBottomRight) / 2;
_averageBottom = (valueBottomRight + valueBottomLeft) / 2;
_averageLeft = (valueBottomLeft + valueTopLeft) / 2;
int avgIntensity = (valueTopLeft + valueTopRight + valueBottomRight + valueBottomLeft) / 4;
_i2cVals [IDX_CURRENT_INTENSITY] = χάρτης (μέση ένταση, 0, 1024, 0, 255);
}
// --------------------------------- ΣΕΡΒΟΣ
voidmoveServos () {
Serial.println ("moveServos");
if ((_averageLeft-_averageRight)> _ i2cVals [IDX_H_SENSITIVITY] && (_angleH-_i2cVals [IDX_H_STEP])> _ i2cVals [IDX_H_ANGLE_MIN]) {
// πηγαίνοντας αριστερά
Serial.println ("moveServos πρόκειται αριστερά");
καθυστέρηση (_slowingDelay);
για (int i = 0; i <_i2cVals [IDX_H_STEP]; i ++) {
_servoH.write (_angleH--);
καθυστέρηση (_servoLoopDelay);
}
}
elseif ((_averageRight-_averageLeft)> _ i2cVals [IDX_H_SENSITIVITY] && (_angleH+_i2cVals [IDX_H_STEP]) <_ i2cVals [IDX_H_ANGLE_MAX]) {
// πάει δεξιά
Serial.println ("moveServos πρόκειται αριστερά");
καθυστέρηση (_slowingDelay);
για (int i = 0; i <_i2cVals [IDX_H_STEP]; i ++) {
_servoH.write (_angleH ++);
καθυστέρηση (_servoLoopDelay);
}
}
αλλιώς {
// δεν κάνει τίποτα
Serial.println ("moveServos δεν κάνει τίποτα");
καθυστέρηση (_slowingDelay)?
}
if ((_averageTop-_averageBottom)> _ i2cVals [IDX_V_SENSITIVITY] && (_angleV+_i2cVals [IDX_V_STEP]) <_ i2cVals [IDX_V_ANGLE_MAX]) {
// ανεβαίνοντας
Serial.println ("moveServos going up");
καθυστέρηση (_slowingDelay);
για (int i = 0; i <_i2cVals [IDX_V_STEP]; i ++) {
_servoV.write (_angleV ++);
καθυστέρηση (_servoLoopDelay);
}
}
elseif ((_averageBottom-_averageTop)> _ i2cVals [IDX_V_SENSITIVITY] && (_angleV-_i2cVals [IDX_V_STEP])> _ i2cVals [IDX_V_ANGLE_MIN]) {
// πηγαίνει προς τα κάτω
Serial.println ("moveServos going down");
καθυστέρηση (_slowingDelay);
για (int i = 0; i <_i2cVals [IDX_V_STEP]; i ++) {
_servoV.write (_angleV--);
καθυστέρηση (_servoLoopDelay);
}
}
αλλιώς {
Serial.println ("moveServos δεν κάνει τίποτα");
καθυστέρηση (_slowingDelay);
}
}
//---------------------------------ΥΠΝΟΣ
voidasleepFor (χωρίς υπογραφή οκτώΔευτερεύοντα τμήματα) {
Serial.println ("asleepFor");
για (ανυπόγραφο sleepCounter = οκτώSecondSegments; sleepCounter> 0; sleepCounter--)
{
LowPower.powerDown (SLEEP_8S, ADC_OFF, BOD_OFF);
}
}

προβολή rawtilt_pan_tracker_0.3.ino που φιλοξενείται με ❤ από το GitHub

Βήμα 4: Συναρμολόγηση του περιβλήματος κυκλώματος

Συναρμολόγηση του περιβλήματος κυκλώματος
Συναρμολόγηση του περιβλήματος κυκλώματος
Συναρμολόγηση του περιβλήματος κυκλώματος
Συναρμολόγηση του περιβλήματος κυκλώματος
Συναρμολόγηση του περιβλήματος κυκλώματος
Συναρμολόγηση του περιβλήματος κυκλώματος
  1. Βεβαιωθείτε ότι το Ardiuno Pro Mini έχει εισαχθεί στις κεφαλίδες του PCB.
  2. Τοποθετήστε τη βάση του κιβωτίου ελεγκτή SOLAR TRACKER στα τοιχώματα του κιβωτίου ελεγκτή SOLAR TRACKER και τοποθετήστε με 2 βίδες αυτοκόλλητων ανοξείδωτων ανοξείδωτων βαλβίδων 4G x 6mm.
  3. Τοποθετήστε το Ardiuno Pro Mini + PCB με κεφαλίδα 6P με εγκοπή στο κενό στη βάση κουτιού ελεγκτή SOLAR TRACKER.
  4. Τοποθετήστε το καπάκι του κιβωτίου ελεγκτή SOLAR TRACKER στα τοιχώματα του κιβωτίου ελεγκτή SOLAR TRACKER και στερεώστε με 2 βίδες αυτοκόλλητων από ανοξείδωτο ανοξείδωτο ατσάλι 4G x 6mm.
  5. Τοποθετήστε το συγκρότημα πάνω στη βάση του Πλαισίου Πάνελ με 4 ανοξείδωτες βίδες αυτοεπιπεδώματος από ανοξείδωτο ατσάλι 4G x 6mm.

Βήμα 5: Σύνδεση των καλωδίων εγκατάστασης με τον ελεγκτή

Σύνδεση των καλωδίων εγκατάστασης με τον ελεγκτή
Σύνδεση των καλωδίων εγκατάστασης με τον ελεγκτή
Σύνδεση των καλωδίων εγκατάστασης με τον ελεγκτή
Σύνδεση των καλωδίων εγκατάστασης με τον ελεγκτή
Σύνδεση των καλωδίων εγκατάστασης με τον ελεγκτή
Σύνδεση των καλωδίων εγκατάστασης με τον ελεγκτή

Οι σχετικές συνδέσεις έτοιμες από το προηγούμενο Instructable, είναι 4 off 2P LDR συνδέσεις και 2 off 3P συνδέσεις από τα servos. Αυτό που είναι προσωρινό μέχρι να είναι έτοιμη η επαναφόρτιση είναι η μπαταρία. Χρησιμοποιήστε ένα 3.7V LiPo που τερματίζεται σε σύνδεση 2P DuPont προς το παρόν.

  1. Τοποθετήστε τις συνδέσεις LDR (χωρίς πολικότητα) από πάνω:

    1. Πάνω δεξιά
    2. Πάνω αριστερά
    3. Κάτω δεξιά
    4. Κάτω αριστερά
  2. Τοποθετήστε τις συνδέσεις Servo (με το καλώδιο σήματος προς τα αριστερά) από πάνω:

    1. Οριζόντιος
    2. Κατακόρυφος
  3. ΠΕΡΙΜΕΝΕΤΕ ΜΕΧΡΙ ΕΤΟΙΜΟΣ ΓΙΑ ΔΟΚΙΜΗ ΤΟΤΕ: Τοποθετήστε το καλώδιο 3.7V DC Power +ve στο επάνω μέρος, -ve στο κάτω μέρος.

Βήμα 6: Δοκιμή του ελεγκτή

Image
Image

Όπως προαναφέρθηκε, το λογισμικό δεν έχει βελτιστοποιηθεί για ροή εργασίας Solar Charging. Μπορεί να δοκιμαστεί και να τροποποιηθεί χρησιμοποιώντας φυσικές (ηλιακές) και αφύσικες πηγές φωτός.

Για να δοκιμάσετε την παρακολούθηση σε ελεγχόμενο περιβάλλον, μπορεί να είναι βολικό να ρυθμίσετε τα SLEEP MINUTES σε χαμηλότερη τιμή (δείτε το επόμενο βήμα).

Βήμα 7: Διαμόρφωση μέσω I2C με χρήση εισόδου κονσόλας

Αυτό εξηγεί τη διαμόρφωση του ελεγκτή μέσω ενός δεύτερου MCU, εισάγοντας ρυθμίσεις σε ένα παράθυρο κονσόλας.

  1. Ανεβάστε το παρακάτω σενάριο σε D1M WIFI BLOCK (ή Wemos D1 Mini).
  2. Αποσυνδέστε το USB από τον υπολογιστή
  3. ΣΥΝΔΕΣΕΙΣ PIN: -ve (Controller) => GND (D1M)+ve (Controller) => 3V3 (D1M) SCL (Controller) => D1 (D1M)

    SDA (Controller) => D2 (D1M)

  4. Γυρίστε το διακόπτη SPDT στη ρύθμιση CONFIG
  5. Συνδέστε USB σε υπολογιστή
  6. Από το Arduino IDE ξεκινήστε ένα παράθυρο κονσόλας με τη σωστή θύρα COM
  7. Βεβαιωθείτε ότι έχετε επιλέξει "Newline" και "9600 baud"
  8. Οι εντολές εισάγονται στο πλαίσιο αποστολής κειμένου και ακολουθεί το πλήκτρο Enter
  9. Οι εντολές έχουν τη μορφή byte byte byte
  10. Εάν το δεύτερο byte (τρίτο τμήμα) δεν περιλαμβάνεται 0 (μηδέν) αποστέλλεται από το σενάριο
  11. Να είστε προσεκτικοί με τη χρήση σειριακής εισόδου. ελέγξτε τι έχετε εισαγάγει πριν πατήσετε το πλήκτρο "Enter". Εάν είστε κλειδωμένοι (για παράδειγμα, αλλάζοντας τη διεύθυνση I2C σε μια τιμή που έχετε ξεχάσει), θα χρειαστεί να αναβοσβήσετε ξανά το υλικολογισμικό του ελεγκτή.

Οι υποστηριζόμενες παραλλαγές στον πρώτο χαρακτήρα της εντολής είναι:

  • E (Ενεργοποίηση παρακολούθησης σερβο) χρήσιμο για τη διακοπή της κίνησης κατά τη διαμόρφωση. Αυτό εισάγεται χρησιμοποιώντας: E 0
  • D (Απενεργοποίηση παρακολούθησης σερβο) χρήσιμο για την έναρξη της αυτόματης παρακολούθησης εάν δεν κάνετε επανεκκίνηση της συσκευής. Αυτό εισάγεται χρησιμοποιώντας: D 0
  • G (Λήψη τιμής διαμόρφωσης) διαβάζει τιμές από EEPROM και IN -MEMORY: Αυτό εισάγεται χρησιμοποιώντας: G (ο δείκτης είναι έγκυρες τιμές byte 0 - 13 και 15)
  • S (Ορισμός τιμής EEPROM) ορίζει τιμές σε EEPROM οι οποίες είναι διαθέσιμες μετά την επανεκκίνηση. Αυτό εισάγεται χρησιμοποιώντας: S (ο δείκτης είναι έγκυρες τιμές byte 0 - 13, η τιμή είναι έγκυρες τιμές byte και ποικίλλει ανά ιδιότητα)

Ο κώδικας είναι το σημείο αλήθειας για τα ευρετήρια, αλλά το ακόλουθο χρησιμοποιείται για οδηγό για έγκυρες τιμές/σχόλια:

  • I2C ΔΙΕΥΘΥΝΣΗ 0 - διεύθυνση βοηθού ελεγκτή, ο κύριος χρειάζεται αυτό για να επικοινωνήσει με τον ελεγκτή (προεπιλογή 10)
  • ΕΛΑΧΙΣΤΗ ΚΑΘΕΤΗ ΓΩΝΙΑ 1 - κάτω κάθετο σερβο σερβο γωνίας (προεπιλογή 10, εύρος 0 - 180)
  • MAXIMUM VERTICAL ANGLE 2 - κάθετο σερβο άνω όριο γωνίας (προεπιλογή 170, εύρος 0 - 180)
  • SENSITIVITY VERTICAL LDR 3 - Κάθετο περιθώριο ανάγνωσης LDR (προεπιλογή 20, εύρος 0 - 1024)
  • ΚΑΘΕΤΟ ΓΩΝΙΑ ΒΗΜΑ 4 - κάθετα σερβο βήματα γωνίας σε κάθε ρύθμιση (προεπιλογή 5, εύρος 1 - 20)
  • ΕΛΑΧΙΣΤΟΣ ΟΡΙΖΟΝΤΙΟΣ ΓΩΝΙΑ 5 - οριζόντιο κάτω όριο σερβο σερβο (προεπιλεγμένο 10, εύρος 0 - 180)
  • MAXIMUM HORIZONTAL ANGLE 6 - οριζόντιο οριζόντιο σερβο πάνω όριο (προεπιλογή 170, εύρος 0 - 180)
  • SENSITIVITY HORIZONTAL LDR 7 - Οριζόντιο LDR περιθώριο ανάγνωσης (προεπιλογή 20, εύρος 0 - 1024)
  • ΟΡΙΖΟΝΤΙΑ ΓΩΝΙΑ ΒΗΜΑ 8 - γωνιακά οριζόντια σέρβο βήματα σε κάθε ρύθμιση (προεπιλογή 5, εύρος 1 - 20)
  • SLEEP MINUTES 9 - η κατά προσέγγιση περίοδος ύπνου μεταξύ παρακολούθησης (προεπιλογή 20, εύρος 1 - 255)
  • ΚΑΘΕΤΗ ΑΥΓΗ ΓΩΝΙΑ 10 - ΜΕΛΛΟΝΤΙΚΗ ΧΡΗΣΗ - η κατακόρυφη γωνία για να επιστρέψετε όταν δύει ο ήλιος
  • ΟΡΙΖΟΝΤΙΚΗ ΑΥΓΗ ΓΩΝΙΑ 11 - ΜΕΛΛΟΝΤΙΚΗ ΧΡΗΣΗ - η οριζόντια γωνία για να επιστρέψετε όταν δύει ο ήλιος
  • ΕΝΤΑΣΗ ΑΥΓΗΣ 12 - ΜΕΛΛΟΝΤΙΚΗ ΧΡΗΣΗ - ο ελάχιστος μέσος όρος όλων των LDR που ενεργοποιεί την έναρξη της καθημερινής παρακολούθησης του ήλιου
  • ΕΝΤΑΣΗ ΣΠΟΥΔΑ 13 - ΜΕΛΛΟΝΤΙΚΗ ΧΡΗΣΗ - ο ελάχιστος μέσος όρος όλων των LDR που ενεργοποιεί το τέλος της καθημερινής παρακολούθησης του ήλιου
  • ΤΕΛΟΣ ΤΙΜΩΝ EEPROM MARKER 14 - ΤΙΜΗ ΔΕΝ ΧΡΗΣΙΜΟΠΟΙΕΙΤΑΙ
  • ΤΡΕΧΟΝ ΕΝΤΑΣΗ 15 - το τρέχον μέσο ποσοστό της έντασης του φωτός
  • ΤΕΛΟΣ ΕΠΙΣΗΜΑΝΣΗΣ ΑΞΙΩΝ ΑΝΑΜΝΗΣΗΣ 16 - ΑΞΙΑ ΔΕΝ ΧΡΗΣΙΜΟΠΟΙΕΙΤΑΙ.

Καταγράφει σειριακή είσοδο (είσοδος πληκτρολογίου στο παράθυρο της κονσόλας) και την προωθεί σε υποτελή I2C με τη μορφή char, byte, byte

#περιλαμβάνω
#defineI2C_MSG_IN_SIZE2
#defineI2C_MSG_OUT_SIZE3
#defineI2C_SLAVE_ADDRESS10
boolean _newData = false;
const byte _numChars = 32;
char _receivedChars [_numChars]; // ένας πίνακας για την αποθήκευση των ληφθέντων δεδομένων
voidsetup () {
Serial.begin (9600);
Wire.begin (D2, D1);
καθυστέρηση (5000)?
}
voidloop () {
recvWithEndMarker ();
parseSendCommands ();
}
voidrecvWithEndMarker () {
στατικό byte ndx = 0;
char endMarker = '\ n';
char rc;
while (Serial.available ()> 0 && _newData == false) {
rc = Serial.read ();
εάν (rc! = endMarker) {
_receivedChars [ndx] = rc;
ndx ++;
εάν (ndx> = _numChars) {
ndx = _numChars - 1;
}
} αλλο {
_receivedChars [ndx] = '\ 0'; // τερματισμός της συμβολοσειράς
ndx = 0;
_newData = true;
}
}
}
voidparseSendCommands () {
εάν (_newData == true) {
constchar delim [2] = "";
char *token?
token = strtok (_receivedChars, delim);
char cmd = _receivedChars [0];
δείκτης byte = 0;
τιμή byte = 0;
int i = 0;
ενώ (διακριτικό! = NULL) {
//Serial.println(token);
i ++?
εναλλαγή (i) {
περίπτωση 1:
token = strtok (NULL, delim);
index = atoi (token);
Διακοπή;
περίπτωση 2:
token = strtok (NULL, delim);
εάν (διακριτικό! = NULL) {
value = atoi (διακριτικό);
}
Διακοπή;
Προκαθορισμένο:
διακριτικό = NULL;
}
}
sendCmd (cmd, ευρετήριο, τιμή);
_newData = false;
}
}
voidsendCmd (char cmd, δείκτης byte, τιμή byte) {
Serial.println ("-----");
Serial.println ("Αποστολή εντολής:");
Serial.println ("\ t" + String (cmd) + "" + String (index) + "" + String (value));
Serial.println ("-----");
Wire.beginTransmission (I2C_SLAVE_ADDRESS); // μετάδοση στη συσκευή
Wire.write (cmd); // στέλνει κάρτα
Wire.write (ευρετήριο); // στέλνει ένα byte
Wire.write (value); // στέλνει ένα byte
Wire.endTransmission ();
byte απάντηση = 0;
bool hadResponse = false;
εάν (cmd == 'G') {
Wire.requestFrom (I2C_SLAVE_ADDRESS, 1);
ενώ το (Wire.available ()) // slave μπορεί να στείλει λιγότερα από όσα ζητήθηκαν
{
hadResponse = true;
απάντηση = Wire.read ();
}
εάν (hadResponse == true) {
Serial.println ("Λήψη απάντησης:");
Serial.println (απάντηση);
}αλλού{
Serial.println ("Δεν υπάρχει απάντηση, ελέγξτε τη διεύθυνση/σύνδεση").
}
}
}

προβολή rawd1m_serial_input_i2c_char_byte_byte_v0.1.ino που φιλοξενείται με ❤ από το GitHub

Βήμα 8: Επόμενα βήματα

Ελέγχετε περιοδικά για έλεγχο για αλλαγές στο λογισμικό/το υλικό.

Τροποποιήστε το λογισμικό/υλικό σύμφωνα με τις απαιτήσεις σας.

Σχολιάστε τυχόν αιτήματα/βελτιστοποιήσεις.

Συνιστάται: