Ich habe 64 Hall-Effekt-Sensoren (Magnetfeldsensoren) ( DRV5023AJQLPG), die an einen Arduino MEGA 2560 angeschlossen sind. Dafür verwende ich 48 digitale Pins und 16 analoge Pins als digitale Eingangs-Pins. Das Programm im Arduino liest kontinuierlich diese 64 digitalen Eingangspins (in einer for-Schleife) aus und sendet ein serielles Byte über ein USB-Kabel an einen Laptop, wenn einer dieser Eingangspins zwischen LOW und HIGH wechselt. Ich verwende auch die internen Pullup-Widerstände des ATmega2560, um unregelmäßige Auslesungen der Eingangsstifte zu verhindern, wenn der Sensor keinen 0-V-Ausgang liefert (dh wenn er kein ausreichend starkes Magnetfeld misst).
Alles funktioniert Gut, wenn ich nur bis zu 16 Sensoren physisch anschließe. Der Laptop empfängt dann nur Bytes, die korrekt anzeigen, wann ein Sensor eine Zustandsänderung misst.
Wenn ich jedoch anfange, mehr dieser 64 Sensoren anzuschließen, empfängt der Laptop unregelmäßige Byteströme, was fälschlicherweise darauf hindeutet Alle angeschlossenen Sensoren messen sich ändernde Magnetfelder (HIGH- und LOW-Anzeigen).
Ich kann mir zwei Gründe vorstellen, warum diese unregelmäßigen Anzeigen auftreten: 1. Entweder funktionieren die internen Pullup-Widerstände des ATmeag2560 nicht so, wie ich es mir vorstelle.2. Oder die Arduino-Platine und> 16 Hall-Effekt-Sensoren zusammen ziehen zu viel Strom.
-
Pullup-Widerstände funktionieren nicht? Beim Testen mit nur 16 angeschlossenen Sensoren Es ist ein stabiles, ordnungsgemäß funktionierendes Setup. Wenn ich die Pullup-Widerstände im Programm ausdrücklich nicht verwende, verhält sich das Setup unregelmäßig, auch mit nur 16 Sensoren. Die internen Pullup-Widerstände scheinen also vom Programm ordnungsgemäß aktiviert zu werden.
-
Arduino + 64-Sensoren ziehen zu viel Strom? Neben der Stromversorgung der Arduino-Platine und der Sensoren über das USB-Kabel (mit 500 mA) habe ich auch externe Stromquellen mit 1 oder 2 A ausprobiert. Ich habe das Arduino-Board auch über einen externen 5-V- + 1-A-Spannungsregler mit Strom versorgt und den integrierten Spannungsregler des Arduino umgangen. Dies alles scheint keinen Unterschied im unregelmäßigen Verhalten des Systems zu machen. Bei der Messung des aktuellen Verbrauchs dieses Setups (mit Stromstärkemessgerät) wurde der Wert 250 mA nicht überschritten.
ol>
Berechnung des kombinierten aktuellen Verbrauchs (mithilfe von Datenblattinformationen) ), Ich bin zu folgendem Ergebnis gekommen:
- Sensorbetriebsstrom: 2,7 mA - Sensorausgangsstrom im aktiven Zustand: 0,25 mA - GESAMTstrom von 64 Sensoren (3 mA *) 64 =) 192 mA - Arduino MEGA-Strom (ungefähr) 150 mA - GESAMTstrom von 64 Sensoren + Arduino MEGA: ** 342 mA **
Also sowohl der berechnete als auch der gemessene Stromverbrauch scheinen im Bereich dessen zu liegen, was von den genannten Stromquellen gehandhabt werden kann.
Ich stecke jetzt irgendwie fest. Kann jemand etwas vorschlagen, das dieses Problem verursachen könnte? Oder auf falsches Denken an mich hinweisen? Vielen Dank für alle Antworten.
'Schema' (zeigt nur die ersten 8 angeschlossenen Sensoren. Das ArduinoMEGA ist über ein USB-Kabel mit deaktivierter Stromleitung mit einem Computer verbunden):
Oberseite: die Hall-Effekt-Sensoren und Vcc- und GND-Schienen:
Unten- Seite: ArduinoMEGA + die 64 roten Sensorausgangsleitungen zu den Eingangspins:
Unten ist der Arduino-Code:
/ * Arduino-zu-Pd-Protokoll Beim Platzieren oder Entfernen einer Schachfigur wird nur ein Byte gesendet. Es werden keine anderen seriellen Daten übertragen. Ereignis: Bytewert: Platzieren einer Schachfigur auf einem Quadrat: 0-63 Entfernen einer Schachfigur von einem Quadrat: 64-127 Zuordnung von ArduinoMEGA-Pin zu Bytewert: Byte-Pin 0 6 1 7 2 8 3 9… 46 52 47 53 48 A0 (analog 0) 49 A1 50 A2…
62 A14 63 A15 * / Byte prevSquares [64]; // Array, das das vorherige Readbybyte enthält i; // Variable, die in for-loopsbyte sensorValue verwendet wird; // variable temporäre Speicherung von digitalreadvoid setup () {Serial.begin (9600); für (i = 0; i < 64; i ++) {pinMode (i + 6, INPUT_PULLUP); // Pullup-Widerstand aktivieren} für (i = 0; i < 64; i ++) {prevSquares [i] = digitalRead (i + 6); }} void loop () {für (i = 0; i < 64; i ++) {sensorValue = digitalRead (i + 6); if (sensorValue! = prevSquares [i]) {// Schachfigur wurde platziert oder aus dem Quadrat entfernt if (sensorValue == 0) {// Schachfigur wurde platziert // Serienbyte senden (0-63): Serial.write ( ich); } else {// Schachfigur wurde entfernt // Serielles Byte senden (64-127): Serial.write (i + 64); } // aktualisiere das Array prevSquares: prevSquares [i] = sensorValue; }}}