Ich habe mir eine Steuerung mit folgenden Komponenten gebastelt:
Arduino Nano Ever
4 x MCP23008 Port Expander
Nun habe ich folgendes 2 Fragen:
Die ganze Steuerung ist im umkreis von ca. 10 cm. Habe ich die PULLUP Widerstände von SCL & SDA mit 4.7kOhm Richtig gewählt? Speisung der MCP23008 = 5V.
Beim Starten des Arduinos kommt es manchmal (1 von 10 mal) vor das sich Das Programm bei Wire.begin() aufhängt.
Hier mal mein Code:
#include <SoftwareSerial.h>
#include <RS485_non_blocking.h>
#include "static_variable.h"
#include "Adafruit_MCP23008.h"
Adafruit_MCP23008 mcp1;
Adafruit_MCP23008 mcp2;
Adafruit_MCP23008 mcp3;
Adafruit_MCP23008 mcp4;
const int tx_enabled = 4;
SoftwareSerial rs485 (10, 11);
int zwst_on_button = 0;
int bne_auf_button = 0;
int bne_ab_button = 0;
int fahren_rechts_button = 0;
int fahren_links_button = 0;
int masch_dreh_rechts_button = 0;
int masch_dreh_links_button = 0;
int ausleger_auf_button = 0;
int ausleger_ab_button = 0;
int ausleger_aus_button = 0;
int ausleger_ein_button = 0;
int parksteuerung_on_button = 0;
int externe_bedienung_befehl = 0;
int zw_bne_befehl = 0;
int zw_fahren_befehl = 0;
int zw_masch_dreh_befehl = 0;
int zw_ausleger_auf_ab_befehl = 0;
int zw_ausleger_ein_aus_befehl = 0;
int zw_bewegung_links = 0;
int zweitsteuerung_aktiviert = 0;
int funktion1_button = 0;
int funktion2_button = 0;
int funktion3_button = 0;
int funktion4_button = 0;
int fAvailable () {
return rs485.available ();
}
int fRead () {
return rs485.read ();
}
size_t fWrite (const byte what) {
return rs485.write (what);
}
RS485 myChannel (fRead, fAvailable, fWrite, 16);
void setup ()
{
delay(100);
Serial.begin(9600);
Serial.println("Starte Rec BMU");
rs485.begin (22000); //22000
Serial.println("RS485 starten");
myChannel.begin ();
Wire.begin();
Serial.println("Wire gestartet");
delay(250);
Serial.println("SCL / SDA Pullup Starten");
delay(150);
mcp1.begin(7);
----------------------------------------------Hier bleibt das Programm hängen------------------------------------
Serial.println("Starte Chanell 1");
delay(100);
mcp2.begin(6);
Serial.println("Starte Chanell 2");
delay(100);
mcp3.begin(3);
Serial.println("Starte Chanell 3");
delay(100);
mcp4.begin(4);
Serial.println("Starte Chanell 4");
delay(100);
pinMode (tx_enabled, OUTPUT);
}
Die Baudrate finde ich ungewöhnlich, beispielsweise der serielle Monitor bietet die nicht an. Mehr als 9600 würde ich mich bei SoftwareSerial auch nicht trauen.
Schade!
Da ich weder einen Nano Every noch MCP23008 habe, kann ich Dich leider nicht mit praktischen Tipps unterstützen.
Einen "normalen" Nano, UNO oder ESP32 habe ich schon mit drei MCP23017 oder MCP23S17 verbunden, aber das hilft Dir leider nicht.
Ich habe alle Bibliotheken auf den aktuellen stand gebracht.
Baudraten auf 9600 eingestellt und getestet.
Theoretisch scheint es zu Funktionieren.
Leider erscheint noch folgender Fehler für welchen ich noch keine Lösung finden konnte:
C:\Users\home\Documents\Arduino\libraries\Adafruit_BusIO\Adafruit_I2CDevice.cpp: In member function 'bool Adafruit_I2CDevice::_read(uint8_t*, size_t, bool)':
C:\Users\home\Documents\Arduino\libraries\Adafruit_BusIO\Adafruit_I2CDevice.cpp:191:79: warning: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:
size_t recv = _wire->requestFrom((uint8_t)_addr, (uint8_t)len, (uint8_t)stop);
^
In file included from C:\Users\home\Documents\Arduino\libraries\Adafruit_BusIO\Adafruit_I2CDevice.h:5:0,
from C:\Users\home\Documents\Arduino\libraries\Adafruit_BusIO\Adafruit_I2CDevice.cpp:1:
C:\Users\home\AppData\Local\Arduino15\packages\arduino\hardware\megaavr\1.8.7\libraries\Wire\src/Wire.h:64:12: note: candidate 1: size_t TwoWire::requestFrom(int, int, int)
size_t requestFrom(int, int, int);
^~~~~~~~~~~
C:\Users\home\AppData\Local\Arduino15\packages\arduino\hardware\megaavr\1.8.7\libraries\Wire\src/Wire.h:62:12: note: candidate 2: virtual size_t TwoWire::requestFrom(uint8_t, size_t, bool)
size_t requestFrom(uint8_t, size_t, bool);
^~~~~~~~~~~
Es geht mir wie dem Compiler:
Ich verstehe auch nicht wozu die expliziten Casts da gut sind.
Offensichtlich meint der Compiler, bzw. seine Programmierer, dass ISO C++ dieses so verbietet.
Der Gcc C++ Compiler ist allerdings in der Lage das zu schlucken.
Und auch wohl richtig zu verarbeiten.
Für den Every ist es, per default, der Gcc 7.3
Eigentlich ist das Compilerflag -pedantic für solche Meldungen verantwortlich.
Aber hier scheint es seltsame Verwirrungen zu geben.
Denn mein ganz moderner Gcc 11.x meldet das nicht.
Auch nicht mit -pedantic
das haben die gemacht weil sonst die Wire Lib meckert wenn es keine passende Überladung findet. Es gibt zum Bsp. kein requestFrom mit einem size_t Parameter.
Die Wire Lib kann man sich noch schnell erweitern mit fehlenden Überladungen. Aber das was Adafruit mit ihrem Wollknäuel an Libs anstellt ist dann die Spitze des Eisbergs. Gefällt mir überhaupt nicht. Undurchsichtiger gehts nicht. Ich habe auch keine Erklärung dafür warum Adafruit allgemein so schlecht gepflegte Libs bereitstellt. Da erzeugt doch gefühlt jede Lib irgendwelche Warnungen. Als ob die selbst in der IDE keine Warnungen eingeschaltet hätten. Das musste jetzt mal raus.
Letztens Nachricht bekommen:
Das Problem ist jetzt in der Lib behoben!
Mein Vorschlag wurde übernommen.
Die Änderung ist im frischen Update integriert.