Friday, 8 January 2016

έξοδος 0-10V με arduino, 2η έκδοση

Η 2η έκδοση είναι βελτιωμένη στα σημεία.
Κυρίως, αντιμετωπίζει το θέμα της αντιστροφής της εξόδου που είχε η πρώτη έκδοση, που έπρεπε να αντιμετωπιστεί με software, (χρειαζόταν να δοθεί analogWrite(pin, 255) για να βγάλει μηδενική τάση).

Το νέο σχέδιο έχει ως ακολούθως:

και όπως φαίνεται, έχει προστεθεί ένα transistor-based inverter.

Στο σημείο Α έχουμε την παλμοσειρά που παράγει το arduino με πλάτος 5V.
Στο σημείο Β υπάρχει η παλμοσειρά ανεστραμμένη, πάλι  με 5V πλάτος.
Στο σημείο C υπάρχει η παλμοσειρά με πλάτος 12V αλλά ξανά ανεστραμμένη, δηλαδή με ίδια φάση όπως παράγεται στο σημείο Α.
Στο σημείο D έχουμε την μεταβλητή τάση εξόδου, η τιμή της οποίας εξαρτάται από το το duty cycle του αρχικού παλμού.

Το παρακάτω βίντεο δείχνει την παραγόμενη παλμοσειρά (σημείο A) και το βολτάζ (σημείο D) στην έξοδο του low pass.
Σε αντίθεση με την προηγούμενη έκδοση, σήμερα το βολτάζ που έχουμε στην έξοδο είναι ευθέως ανάλογο του duty cycle και όχι αντιστρόφως ανάλογο, όπως ήταν χτες.

Επίσης έχει προστεθεί ένα ενδεικτικό led στο pin 9 η ένταση του οποίου μεταβάλετε με βάση τo duty cycle.
H συσκευή στο breadboard είναι ως εξής:


Μεταξύ άλλων διακρίνονται τα δύο τρανζίστορ που φτιάχνουν τον διπλό inverter.
Α, και έβαλα και ένα ενδεικτικό LED στο pin 9 (συνδεδεμένο στην γείωση μέσω μία μικρής αντίστασης (470Ω, θα ήθελε μικρότερη αλλά τέτοιες είχα πρόχειρες...)

Το λογισμικό είναι και αυτό ελαφρά τροποποιημένο και έχει ως εξής:
char  fromConsole;
int   i,j;
void setup() {
  // put your setup code here, to run once:
  setPwd(0);
  Serial.begin(9600);
  delay(1000);
  sunRize();
  sunSet();
}
void setPwd (int value) {
     analogWrite(10, value);
     analogWrite(9, value); //led
}
void sunSet(){
      for (i=64;i>=0;i--){
      j=i*4; if (j<0) j=0; if (j>255) j=255;
      setPwd(j);
      Serial.println(j);
      delay (150);
    }
}
void sunRize(){
    for (i=0;i<=64;i++){
      j=i*4; if (j<0) j=0; if (j>255) j=255;
      setPwd(j);
      Serial.println(j);
      delay (150);
    }
}
void loop() {
  //check if a character on serial
  if (Serial.available()) {
    fromConsole=Serial.read();
    switch (fromConsole) {
      case '0':
        Serial.println("I received 0, setting PWD to 0, ie output 0V");
        setPwd(0);
        break;
      case '1':
        Serial.println("I received 1, setting PWD to 64, ie output to 1/4:");
        setPwd(64);
        break;
      case '2':
        Serial.println("I received 2, setting PWD to 128, ie output to 2/4:");
        setPwd(128);
        break;
      case '3':
        Serial.println("I received 3, setting PWD to 192, ie output to 3/4:");
        setPwd(192);
        break;
      case '4':
        Serial.println("I received 4, setting PWD to 255, ie output to 4/4:");
        setPwd(255);
        break;
      case '5':
        Serial.println("I received 5, doing a sunrize sequence");
        sunRize();
        break;
      case '6':
        Serial.println("I received 6, doing a sunset sequence");
        sunSet();
        break;
      default:
        Serial.println("Undefined button pressed");
        break;
      }
    }
  else {
    delay (500);
  }

}
Θέλω να πιστεύω πως με αυτή την καταχώριση το θέμα του ελέγχου ενός ballast με μεταβλητή τάση 0-10V έχει λήξει.

BR,
GT


--------------------

UPDATE!
κάθε άλλο παρά λήξαν αποδείχτηκε το θέμα ελέγχου ενός Ballast 0-10V για τον απλό λόγο πως όταν έγινε δοκιμή με πραγματικό ballast, βρέθηκε πως το ballast έδινε τάση (δεν λάμβανε) και για χειροκίνητο έλεγχο αρκούσε μία μεταβλητή αντίσταση...
Δυστυχώς είχαμε λάθος specs και αυτό που φτιάχτηκε ναι μεν μπορεί να βγάλει ρυθμιζόμενη τάση 0/10V ελεγχόμενη από πρόγραμμα, αλλά δεν μπορεί να χρησιμοποιηθεί για να ελέγξει την φωτεινότητα μίας λάμπας που έχει συνδεθεί σε ένα ballast τύπου  πχ Osram Quicktronic Deluxe.

Θεωρητικά θα έπρεπε να βάλουμε ψηφιακά ποτενσιόμετρα, που να συνδέονται με I2C, να ψάξουμε για βιβλιοθήκες ή να γράψουμε πολύπλοκα προγράμματα κλπ κλπ

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


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

Αλλά με Ballast Osram Quicktronic που έγινε δοκιμή, δουλεύει κανονικά.

Αξίζει να σημειωθεί ότι ένα arduino mini έχει 6 εξόδους PWM που σημαίνει ότι χωρίς δυσκολία ένα arduino θα μπορούσε να ελέγξει 6 ballasts. Βεβαίως τότε το challenge θα ήταν το UI.

Ίσως αργότερα, συνδυάζοντας το παραπάνω με ένα Raspberry Zero, να φτιαχτεί ένα IoT dimmer με UI ελεγχόμενο από smartphone.

(αν και δεν βλέπω μεγάλη χρησιμότητα, ίσως σαν άσκηση στη διασύνδεση Raspberry/Arduino και IoT Stacκ...)

No comments:

Post a Comment