Rückblick auf den Online-Kurs über Arduino / Robotik von MIPT (zweite Woche)


Wir veröffentlichen weiterhin einen Überblick über den Online-Kurs "Bauen von Robotern und anderen Arduino-Geräten", der hier beginnt.


Wie lange es noch dauerte, endete die zweite Woche des Online-Kurses für Robotik von MIPT . Ehrlich gesagt war die Woche sehr voll von verschiedenen Themen.


Hier ist eine Beispielliste, die ich mir selbst zugewiesen habe:


  • Spannungsteiler. Verwendung eines Fotowiderstands und eines Thermistors
  • Analoges Signal. Signalbreite
  • Kommunikation über serielle Schnittstelle. Verarbeitungsumgebung
  • Digitales Signal. Schaltflächen und Verbindungsoptionen. Pull-up-Widerstand
  • Logische Ausdrücke, if- und else-Anweisungen
  • Summer, LED-Leiste, Sieben-Segment-Anzeige
  • Mikroschaltungen. Logikwechselrichter 74HC04, Schieberegister 74HC595
  • Debugging-Programme
  • Externe Module
  • Eine Variante eines vorgefertigten Überwachungssystems, das die Temperatur und den Lichtpegel auf der LED-Skala anzeigt, sowie eines Lautsprechers, der funktioniert, wenn eine bestimmte Temperatur überschritten wird

Nachdem ich den Test erfolgreich bestanden und die vorgeschlagenen Schemata aus den Lektionen gesammelt hatte, überlegte ich, wie ich dieses oder jenes Schema verbessern oder etwas Eigenes sammeln könnte.



Als erstes fiel mir die Modernisierung des Lichtsensors ein. Die in der Lektion vorgeschlagene Implementierung nahm einfach den Wert vom Fotowiderstand und schickte ihn an die serielle Schnittstelle.


Die aktualisierte Version sollte eine Sieben-Segment-Anzeige verwenden, um Zahlen von 0 (minimale Beleuchtung) bis 9 (maximale Beleuchtung) anzuzeigen. Die Anzeige muss über ein Schieberegister angeschlossen werden. Mit zwei Tasten können Sie die minimale und maximale Beleuchtungsstärke einstellen. Das Schieberegister wird benötigt, um nicht den Arduino-Pin in jedem Segment zu verwenden, sondern weniger Pins. Tatsächlich wandelt das Schieberegister die serielle Datenausgabe (ein Bit pro Zeiteinheit) in eine parallele (mehrere Bits pro Zeiteinheit) um. In unserem Fall benötigen wir anstelle von sieben Arduino-Pins nur drei.


Im Fritzing-Editor habe ich ein solches Gerät bekommen.



So sieht es live aus.




Grundlage waren Schemata für die Arbeit mit einem Schieberegister und einem Fotowiderstand.


Beachten Sie, dass der Fotowiderstand auf der Platine etwas anders angeschlossen ist als im Video-Tutorial - dort haben wir den Spannungswert am Fotowiderstand relativ zur Masse genommen und in der Schaltung den Spannungsabfall relativ zur Stromversorgung entfernt. Dies geschieht, um das Programm ein wenig zu vereinfachen - mit zunehmender Beleuchtungsstärke nimmt der Widerstand des Fotowiderstands ab. Daher nimmt bei gleichem Strom der Spannungsabfall ab. Daher ist am Analogeingang der Beleuchtungspegel umso höher und umgekehrt, je höher die Spannung ist.


Jetzt liegt es an Ihnen, den Quellcode fertigzustellen. Das gleiche Programm wurde als Grundlage für die Anzeige des Werts auf einem Sieben-Segment-Indikator verwendet.


Programmcode
// ,      #define DATA_PIN 13 #define LATCH_PIN 12 #define CLOCK_PIN 11 //  ,        #define BTN_MIN 3 #define BTN_MAX 2 // ,       #define SENS_PIN A5 //     ,   byte d0 = 0b01111101; byte d1 = 0b00100100; byte d2 = 0b01111010; byte d3 = 0b01110110; byte d4 = 0b00100111; byte d5 = 0b01010111; byte d6 = 0b01011111; byte d7 = 0b01100100; byte d8 = 0b01111111; byte d9 = 0b01110111; //        int min_light = 0; int max_light = 1023; //    int value; // ,  .  .  int output; //   int digit; void setup() { //     pinMode(DATA_PIN, OUTPUT); pinMode(CLOCK_PIN, OUTPUT); pinMode(LATCH_PIN, OUTPUT); //       Serial.begin(9600); //     pinMode(BTN_MIN, INPUT_PULLUP); pinMode(BTN_MAX, INPUT_PULLUP); } void loop() { //     value = analogRead(SENS_PIN); output = value; //    -    if (!digitalRead(BTN_MIN)) min_light = value; if (!digitalRead(BTN_MAX)) max_light = value - 10; //      if (value < min_light) output = min_light; if (value > max_light) output = max_light; //  ,      digit = map(value, min_light, max_light, 0, 9); //   Serial.println("Value: " + String(value) + " Output: " + String(output) + " Min: " + String(min_light) + " Max: " + String(max_light) + " Current : " + String(value) + " Digit: " + String(digit)); //      if (digit == 0) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d0); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 1) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d1); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 2) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d2); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 3) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d3); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 4) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d4); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 5) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d5); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 6) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d6); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 7) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d7); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 8) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d8); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 9) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d9); digitalWrite(LATCH_PIN, HIGH); } //       delay(10); } 

Von den Merkmalen mussten wir beim Einstellen des maximalen Beleuchtungsniveaus eine empirisch ausgewählte Konstante (max_light = value - 10) subtrahieren. Dies ist notwendig, um ein „Klappern“ bei maximaler Beleuchtungsstärke zu vermeiden, da der vom Fotowiderstand entnommene Spannungswert instabil ist.


Wir kompilieren die Skizze, laden sie in das Arduino und überprüfen sie.


Zuerst im Port Monitor ...




Und dann leben



Wie Sie sehen, funktioniert das Gerät erfolgreich wie beschrieben. Natürlich gibt es noch Verbesserungspotenzial - Sie können beispielsweise ein Audiosignal hinzufügen, wenn die Beleuchtung einen bestimmten Pegel unterschreitet - dies bedeutet, dass Sie zusätzliche Beleuchtung am Arbeitsplatz einschalten müssen. Auch in Zukunft wird es möglich sein, das Programm selbst mithilfe von Arrays und zusätzlichen Funktionen zu ändern.


Abschließend wiederhole ich noch einmal, dass die Woche zu verschiedenen Themen sehr ereignisreich war. Beachten Sie, dass seit der Veröffentlichung des Kurses in der Arduino IDE die integrierte Serial Plotter-Funktion angezeigt wurde, die die in den Lektionen berücksichtigten Funktionen der Verarbeitungsumgebung teilweise überlappt. Ende der Woche kamen die Autoren auf die Idee der Modularität, wenn das Endgerät aus vorgefertigten Elementen zusammengesetzt wird - Modulen, beispielsweise Tasten mit einem bereits eingebauten Pull-up-Widerstand, einem vorgefertigten Lichtsensor, bei dem ein Fotowiderstand und ein herkömmlicher Widerstand bereits zu einem Spannungsteiler zusammengebaut sind, und dergleichen. Das Gerät kann jedoch leicht auf einem Steckbrett montiert werden, was getan wurde. Die Frage ist für Leser, haben Sie jemals einen Fall für Ihre Geräte gemacht? Welche Materialien haben Sie dafür verwendet? Vielleicht wurde Pappe, Sperrholz, Plexiglas oder, was heute nicht ungewöhnlich ist, auf einem 3D-Drucker gedruckt?

Source: https://habr.com/ru/post/de403029/


All Articles