In diesem Projekt werden wir mit kraft-sensitiven Drucksensoren arbeiten, um einen Alarm zu erzeugen, der uns visuell und akustisch vor der Manipulation einer in einer Vitrine ausgestellten Figur warnt. Die Figuren werden mit einem weißen Licht beleuchtet. Wenn sie manipuliert werden, wechselt die Farbe der Beleuchtung zu Rot und ein Alarm ertönt. Auch wenn wir die Figur wieder an ihren Platz stellen, ändert sich die Farbe des Lichts nicht und der Alarm ertönt weiterhin, um herauszufinden, welche Figur manipuliert wurde. Erklären wir zunächst, was ein kraftabhängiger Sensor ist.
Was sind resistive kraftabhängige Sensoren?
Die Force Sensitive Resistor (FSR) Sensoren sind Sensoren, die den auf sie ausgeübten physischen Druck als Spannungswert ausgeben. Es handelt sich dabei im Grunde um variable Widerstände.
Diese Sensoren bestehen in der Regel aus einer leitenden Substratschicht und einer Halbleitersubstratschicht, wobei diese beiden Schichten durch eine offene Abstandsschicht am inneren Umfang mit Klebstoff an den Rändern getrennt sind. Je mehr Druck auf die aktive Zone des Sensors ausgeübt wird, desto mehr Punkte dieser Zone berühren die Halbleiterschicht und lassen den Widerstandswert sinken.
FSR sind im Grunde Widerstände, die ihren Widerstandswert (in Ohm Ω) ändern, je nachdem wie stark sie gedrückt werden. Diese Sensoren sind sehr einfach zu bedienen, sind aber nicht sehr genau. Sie liefern keine exakten Werte. Es ist möglich, mit diesen Sensoren ein Gewicht zu ermitteln. Man muss jedoch den Widerstandswert in ein proportionales Gewicht umwandeln. Auch das Gewicht ist dann nicht exakt. Es ist allerdings möglich, eine Veränderung zu erkennen. Dadurch kann der Sensor für dieses Projekt verwendet werden.
Das Modul, das wir verwenden werden, besteht aus dem FSR-Sensor und einem 510 KΩ-Widerstand in Reihe mit dem Sensor. Die Schaltung wird mit 5 Vdc versorgt und die Ausgangssignalspannung der Schaltung wird aus dem Spannungsteiler entnommen, der durch den 510 Kohm-Widerstand und den FSR-Sensor gebildet wird. Wenn der FSR-Sensor nicht gedrückt wird, wirkt er wie ein unendlicher Widerstand (offener Stromkreis), so dass der durch das Modul fließende Strom sehr gering und die Ausgangssignalspannung sehr niedrig ist. Umgekehrt sinkt der Widerstand des Sensors, wenn der Druck auf ihn zunimmt, so dass die Spannung am Ausgangssignal des Moduls steigt. In unserem Projekt werden wir das Ausgangssignal des Moduls an den Analogeingang des AZ-Mikrocontrollers anschließen und den Messwert auf dem seriellen Monitor anzeigen. Die folgende Abbildung ist die Schaltung des Moduls aus dem AZ-Delivery-Datenblatt:
Erforderliche Hardware
- 1 Mikrocontroller Board AZ-ATmega328-Board mit USB-Kabel
- 3 Flexibler Dünnfilm Drucksensor
- 3 LED Ring 5V RGB WS2812B 12-Bit 37mm
- Ultraflexibles verzinntes Silikonkabel Schaltlitzen Kit
- 1 SYB-1660 Lötfreies Breadboard Protoboard | Breadboard Kit
- 1 Mini-MP3-Player DFPlayer Master-Modul
- 1 DFPlayer Mini 3 Watt 8 Ohm Mini-Lautsprecher
- 1 1K-Ohm-Widerstand
Erforderliche Software
- Arduino-IDE
- DFPlayer Mini-Bibliothek von DFRobot (DFRobotDFPlayerMini.h)
- Adafruit NeoPixel Bibliothek für WS2812B Ring (Adafruit_NeoPixel.h)
- flex_druck_sensor_alarm.ino
- 1.mp3 Tondatei
Schaltung und Beschreibung der verwendeten Module
Wir verwenden drei Drucksensoren für drei Objekte. Die WS2812B LED-Ringe werden sie mit weißem bzw. rotem Licht beleuchten. Außerdem verwenden wir auch den Mini-MP3-Player DFPlayer zusammen mit den Mini-Lautsprechern, um den Alarmton abzuspielen. Gesteuert wird das Ganze von einem AZ-ATmega328 Mikrocontroller. Wir brauchen dazu auch eine microSD-Karte, um die Sounddatei zu speichern. Das ganze Set wird mit einer externen 5 Vdc-Stromversorgung betrieben.
Beschreibung des Programmablaufs und des Sketches
Während die Objekte in Position sind, hat das FSR-Sensormodul ein hohes Ausgangssignal, das im seriellen Monitor angezeigt wird. Die LED-Ringe beleuchten die Figuren oder Objekte mit weißem Licht. Sobald eins der Objekte manipuliert wird, sinkt das Ausgangssignal des FSR-Sensormoduls, der LED-Ring des manipulierten Objekts leuchtet rot auf und der Alarm ertönt. Auch wenn das gleiche oder ein anderes Objekt wieder an seinem Platz positioniert wird, bleibt der Alarm bestehen.
Die ersten beiden Bibliotheken, werden benötigt, um das Mini MP3 Player DFPlayer-Modul zu verwenden. Die notwendige Kommunikation zwischen dem MP3-Modul und dem Mikrocontroller ist seriell. Die Bibliothek SoftwareSerial.h enthält die Funktionalität für den Mikrocontroller, um jeden digitalen Pin für die serielle Kommunikation zu aktivieren. Mit der Bibliothek DFRobotDFPlayerMini.h aktivieren wir die notwendigen Funktionalitäten, um das MP3-Player-Modul zu verwenden.
#include <SoftwareSerial.h> #include <DFRobotDFPlayerMini.h>
Die dritte Bibliothek, ist NeoPixel von Adafruit, um die LED-Ringe verwenden zu können.
#include <Adafruit_NeoPixel.h>
Nachdem wir die erforderlichen Bibliotheken für unser Projekt eingebunden haben, beginnen wir mit der Erstellung der Objekte und der Definition der Variablen. Um das mp3-Player-Modul zu verwenden, müssen wir das mySoftwareSerial-Objekt der Bibliothek SoftwareSerial.h implementieren. So werden dem Mikrocontroller die digitalen Pins angegeben, die wir für die serielle Kommunikation des Moduls verwenden werden. Wir verwenden den digitalen Pin 5, um Daten vom mp3-Modul zu empfangen und den digitalen Pin 6, um Daten an das mp3-Modul zu senden. Um die Steuermethoden und Befehle des Moduls zu nutzen, wie z.B. das Einstellen der Lautstärke, oder das Starten der Wiedergabe einer mp3-Datei, erstellen wir das Objekt myDFPlayer aus der Bibliothek DFRobotDFPlayerMini.h.
SoftwareSerial mySoftwareSerial(5, 6); DFRobotDFPlayerMini myDFPlayer;
Die Ausgänge der FSR-Sensoren werden mit den analogen Eingängen des Mikrocontrollers verbunden. Dafür werden die folgenden Variablen deklariert. Außerdem speichern wir die Signale in weiteren Variablen.
int sensor_flowers_pin = A1; int sensor_flowers_signal; int sensor_menina_pin = A2; int sensor_menina_signal; int sensor_hand_pin = A3; int sensor_hand_signal;
Die nächsten vier Zeilen des Sketches sind drei Konstanten für die Anschlüsse der WS2812B LED-Ringe an die digitalen Pins des Mikrocontrollers und die Konstante zur Definition der Anzahl der LEDs jedes Rings, in diesem Fall 8 LEDs.
#define hand_ring_LED 4 #define menina_ring_LED 3 #define flowers_ring_LED 2 #define number_LEDs_ring 8
Für den Betrieb jedes WS2812B-LED-Rings muss für jeden verwendeten Ring ein Objekt der NeoPixel-Bibliothek erstellt werden. In die Argumente dieses Objekts wird die jeweilige Anzahl der LEDs eines Rings geschrieben (dafür haben wir die Variable number_LEDs_ring), die Pins des Mikrocontrollers, an die jeder Ring angeschlossen ist (dafür haben wir die Variablen z. B. flowers_ring_LED), sowie die Eigenschaften jedes Rings. Es sind dreifarbige LEDs (NEO_GRB) und die Arbeitsfrequenz liegt bei 800 KHz (NEO_KHZ800).
Adafruit_NeoPixel flowers_ring(number_LEDs_ring, flowers_ring_LED, NEO_GRB + NEO_KHZ800); Adafruit_NeoPixel menina_ring(number_LEDs_ring, menina_ring_LED, NEO_GRB + NEO_KHZ800); Adafruit_NeoPixel hand_ring(number_LEDs_ring, hand_ring_LED, NEO_GRB + NEO_KHZ800);
In den nächsten Zeilen der Skizze deklarieren und definieren wir Variablen für die RGB-Werte der beiden Farben jedes Rings.
uint32_t flowers_color_red = flowers_ring.Color(150,0,0); uint32_t flowers_color_white = flowers_ring.Color(150,150,150); uint32_t menina_color_red = menina_ring.Color(150,0,0); uint32_t menina_color_white = menina_ring.Color(150,150,150); uint32_t hand_color_red = hand_ring.Color(150,0,0); uint32_t hand_color_white = hand_ring.Color(150,150,150);
Der nächste Block ist setup(), in dem wir den Anfangszustand der Module konfigurieren.
In den ersten beiden Zeilen initialisieren wir die serielle Kommunikation mit der Anweisung begin("baud rate"), sowohl für die Kommunikation mit dem mp3-Modul mit der Anweisung mySoftwareSerial.begin(9600), als auch mit dem Seriellen Monitor mit der Anweisung Serial.begin(115200).
mySoftwareSerial.begin(9600); Serial.begin(115200);
Als Nächstes überprüfen wir, ob unser MP3-Modul korrekt initialisiert wurde, indem wir eine if-Anweisung verwenden. In der Bedingung prüfen wir, ob das MP3-Modul aus irgendeinem Grund nicht initialisiert wurde. Wir haben die Initialisierung mit dem Symbol "!" negiert, d. h. wenn das Modul nicht initialisiert ist, ist die Bedingung wahr und der Code innerhalb der geschweiften Klammern wird ausgeführt. Wenn das MP3-Player-Modul korrekt initialisiert ist, ist die Bedingung nicht erfüllt und der von uns erläuterte Code wird nicht ausgeführt. Die setup()-Methode wird weiterhin ausgeführt, um die serielle Konsole mit der Zeile Serial.println(F("Correct DFPlayer initialization.")) zu informieren, dass das MP3-Player-Modul korrekt initialisiert wurde.
if (!myDFPlayer.begin(mySoftwareSerial)) { Serial.println(F("Error initializing mp3 module:")); Serial.println(F("1. Please check the connections!")); Serial.println(F("2. Please insert the microSD memory!")); while(true){ delay(0); } } Serial.println(F("Correct DFPlayer initialization."));
Nach der Initialisierung des MP3-Moduls müssen die drei LED-Ringe mit der Methode begin() des Objekts jedes Rings (name_ring.begin()) initialisiert werden. Dann schalten wir alle LEDs aus, falls eine von ihnen leuchtet.
flowers_ring.begin(); menina_ring.begin(); hand_ring.begin(); flowers_ring.clear(); menina_ring.clear(); hand_ring.clear();
Wir stellen zunächst die Helligkeit des Ringlichts auf einen Wert von 200 von insgesamt 254 ein.
flowers_ring.setBrightness(200);
In einer for-Schleife werden alle LEDs eines Rings mit flowers_ring.setPixelColor(i, flowers_color_white) mit weißer Beleuchtung konfiguriert und dann mit flowers_ring.show() eingeschaltet. Der maximale Wert der Zählvariablen i ist der Wert der Variablen number_LEDs_ring, die wir zu Beginn definiert haben.
for (int i=0; i<number_LEDs_ring; i++) { flowers_ring.setPixelColor(i, flowers_color_white); flowers_ring.show(); }
Die beiden for-Schleifen für die anderen beiden LED-Ringe sind ähnlich aufgebaut.
Es folgen nurn die Variablen für die Signalwerte der FSR-Module, die mit einem hohen Wert definiert werden. Wir erinnern uns, dass der Signalwert des Moduls hoch ist, wenn der Sensor gedrückt wird. Während sein Wert niedrig ist, wenn er nicht gedrückt wird.
sensor_flowers_signal = 900; sensor_menina_signal = 900; sensor_hand_signal = 900;
Mit diesen Zeilen ist die Programmierung des Blocks setup() abgeschlossen. Beginnen wir nun mit der der loop(), die kontinuierlich ausgeführt wird. Darin wird festgestellt, ob eine der Figuren von ihrer Position aus bewegt oder entfernt wurde. Wir werden den Code der Figur der Blumen beschreiben. Der Code der Figur der Menina und der Hand ist der gleiche, nur der Wert der Variablen jeder Figur ändert sich. Der der Menina ist sensor_menina_signal < 1200 und der der Hand ist sensor_hand_signal < 1000.
Um die Änderung des Ausgangswerts des FSR-Sensormoduls zu überprüfen, verwenden wir ein if, bei dem wir den zuvor gespeicherten Wert der Sensorvariable der entsprechenden Ziffer überprüfen. Der Code für die drei Figuren ist derselbe, nur der Prüfwert der Variablen jeder Figur ändert sich. Auch hier werden wir den Code zur Überprüfung der Variablen der Figur der Blumen sensor_flowers_signal analysieren.
Immer wenn der zuvor in der Variablen sensor_flowers_signal gespeicherte Wert kleiner als 1000 ist, wird das Innere des Blocks ausgeführt.
if (sensor_flowers_signal < 1000) { . . . . . . . . . .
Sobald wir den Anweisungsblock betreten, lesen wir mit der ersten Zeile den aktuellen Wert des Signals des FSR-Sensormoduls mit analogRead(sensor_flowers_pin) und speichern den Wert in der entsprechenden Variablen sensor_flowers_signal. Anschließend geben wir den Wert im Seriellen Monitor aus.
sensor_flowers_signal = analogRead(sensor_flowers_pin); Serial.print("Sensor flowers reading = "); Serial.print(sensor_flowers_signal);
In der nachfolgenden if - else if wird überprüft, ob der aktuelle Wert der Variable sensor_flowers_signal kleiner als 200 ist, wenn diese Bedingung wahr ist, wurde das Objekt bewegt und der folgende Code wird ausgeführt, um den Alarm auszulösen.
if (sensor_flowers_signal < 200) { . . . . . . . .
Wir geben einen Hinweis im seriellen Monitor aus:
Serial.println("The flowers have been manipulated !!!!");
Wir stellen die Intensität der Helligkeit des Ringlichts auf einen Wert von 200 von insgesamt 254 ein.
flowers_ring.setBrightness(200);
Um dann alle LEDs des betroffenen Rings in Rot einzuschalten, verwenden wir wieder eine for-Schleife, um alle LEDs des Rings durchzugehen. Die Zählvariable i entspricht der Nummer der LED. Die rote Beleuchtung wird mit flowers_ring.setPixelColor(i, flowers_color_red) konfiguriert. Dann werden sie mit flowers_ring.show() eingeschaltet. Wir erinnern uns, dass der maximale Wert der Variablen i und damit die Abbruchbedingung der Wert der Variablen number_LEDs_ring ist.
for (int i=0; i<number_LEDs_ring; i++) { flowers_ring.setPixelColor(i, flowers_color_red); flowers_ring.show(); }
Nun müssen wir den Alarmton abspielen, den wir auf der microSD-Karte unter dem Namen 1.mp3 gespeichert haben. Zuerst konfigurieren wir die Wiedergabelautstärke mit myDFPlayer.volume(10) und spielen die Tondatei in einer Schleife mit myDFPlayer.loop(1) ab. Die Tondatei hat eine Dauer von 7 Sekunden. Sie wird so lange abgespielt, bis der Mikrocontroller zurückgesetzt wird, da es sich um einen Alarm handelt, sollte der Zustand der Figur überprüft werden. Ich habe eine Verzögerung(500) im Sketch verwendet, so dass der Alarmton vor der Ausführung der nächsten Anweisung abgespielt wird.
myDFPlayer.volume(10); myDFPlayer.loop(1); delay(500);
Bis zu diesem Punkt wird der Code der if-Anweisung ausgeführt, solange der Wert der FSR-Sensorvariable kleiner als 200 ist. Wenn jedoch der gespeicherte Wert der aktualisierten Messwertvariable des FSR-Sensormoduls kleiner als 1000, aber größer oder gleich 200 ist, wird stattdessen der Code der else if-Anweisung ausgeführt. Darin wird einfach über den seriellen Monitor informiert, dass die entsprechende Figur nicht manipuliert wurde.
else if (sensor_hand_signal < 1000) { Serial.println("Flowers are OK and have not been manipulated."); }
Der Code für alle drei Figuren ist fast gleich, nur der Testbereich der Variablen mit den FSR-Sensorwerten jeder Figur ändert sich.
Sollte das Video nicht angezeigt werden, müssen Sie die Cookieeinstellungen Ihres Browsers ändern.
Ergänzungen
Dem Projekt können mehrere Optionen hinzugefügt werden. Die erste Option wäre, einen externen Taster zu installieren, der zwischen einem GND-Anschluss und dem RESET-Anschluss unseres Mikrocontrollers angeschlossen ist. Auf diese Weise würden wir den Mikrocontroller zurücksetzen, er hätte die gleiche Funktion wie der RESET-Knopf des Mikrocontrollers. Die folgende Baugruppe sollte der Schaltung hinzugefügt werden:
Eine zweite Möglichkeit wäre, einen Schalter an der positiven Leitung (rotes Kabel) des Lautsprechers zu installieren. Bei dieser anderen Anordnung würde beim Umlegen des Schalters nur der Alarm aufhören zu ertönen, aber die LED-Ringe der Figur würden weiterhin rot aufleuchten, um anzuzeigen, welche der Figuren manipuliert wurde. Bei dieser zweiten Option müssen wir darauf achten, den Schalter umzulegen, um den Ton wieder zu aktivieren, nachdem wir den Status der Figuren überprüft haben.
Wir hoffen, dass dieses Projekt die Grundlage für die Entwicklung eigener Projekte bildet, wie z. B. die Erkennung des Eindringens in einen Raum.