es gibt eine angepasste version auf der kommndozeile für arduino für den rpi.
Druckbare Version
es gibt eine angepasste version auf der kommndozeile für arduino für den rpi.
das erinnert so bischen an die RP6 zeiten (so 2010), wo das ganze kompilieren und flashen von der Kommandozeile aus erfolgte 🤨 - fand ich persönlich nicht so toll...
- - - Aktualisiert - - -
würde sich für die umschaltung der RX/TX paare so etwas eignen?
Das sehe ich ganz anders. Auch wenn ich kein AVR-Fan bin, ist der Mega2560 schon ziemlich kräftig. Nur mal so zum Vergleich, obwohl die "MIPS" nicht so wirklich vergleichbar sind: für den Mega werden 16 MIPS angegeben, für den ersten PC mit 8088 0,75 MIPS und für die ersten 386 2,15 MIPS (und da lief schonmal Windows drauf). Um deine Aufgaben zu schaffen hat der Mega ausreichend MIPS und eine Menge eingebaute Hardware zur Unterstützung.
Ich versuche mal ein Konzept zu skizzieren, wie das IMHO machbar ist. Es bietet sich an, mit den Steppern anzufangen. Wenn ich mich richtig erinnere, taktest du mit 4ms, wenn es mal etwas schneller sein soll, könnten es auch 2ms sein. Ich würde also einen Timerinterrupt mit ca. 2ms aufsetzen. Von diesem werden unabhängig von der Mainloop die Motoren bedient. Gleichzeitig werden alle Schalter und Kontakte eingelesen und entprellt. (Auf dem Arduino gibt es das eigentlich schon, dort werden z.B. die Millis bearbeitet, es wird aber vor dem User versteckt, mit ein Grund, daß ich kein Arduino-Fan bin).
Nun zu den US-Sensoren. Eigentlich sind sie ein schlechtes Design. Als sie mal erfunden wurden, waren sie reine Hardware bestehend aus Treiber, OP-Amps und Komparator. Die echte Auswertung musste der µC machen. Soweit war das in Ordnung. Der neueste Schaltplan, den ich gesehen habe, hat aber einen eigenen Prozessor drauf, der das eigentlich erledigen könnte. Um aber mit den alten Teilen kompatibel zu sein, erzeugt der die gleichen Signale wie sie. Aber auch dafür hat der Mega Unterstützung, den Input-Capture. Damit kann man das zeitliche Eintreten einer Taktflanke automatisch aufzeichnen, ohne den Prozessor zu blockieren. Es gibt davon mehrere Einheiten, damit kann man auch mehrere Sensoren, möglicherweise abwechselnd, laufen lassen.
Die Kommunikation lässt man ebenfalls aus ihren Interrupten laufen und kann sich in der Mainloop mit der Routenplanung beschäftigen oder PI auf hunderttausend Stellen ausrechnen.
Die Vorstellung, daß das Aufteilen der Aufgaben auf mehrere Prozessoren einem das Leben erleichtert, ist trügerisch. Am Ende ist der Aufwand, die µCs zu überwachen und zu synchronisieren und dabei kein Ereignis zu verpassen größer, als alles mit einem zu erledigen.
MfG Klebwax
also bei mir läuft das nach eva prinzip, kommunikation kommt noch vor dem a also ein evka :D
praxis erfahrung in 2 wochen auf dem 2560, mit 6 x hsr04, mal schauen.
Du kannst auch noch anders vorgehen (hab ich auch schon gemacht): den Arduino direkt vom Pi aus mit der Arduino-IDE programmieren.
Das funktioniert einwandfrei, auch wenn complilieren ein _bisschen_ länger dauert, als gewohnt.
Selbst ohne ein Display am Pi geht das: ich benutze (aus Bequemlichkeit) einfach VNC- somit kann ich gemütlich am Laptop sitzen, und via WLAN auf dem Pi die IDE starten, und so bedienen als liefe sie auf dem Laptop.
ich glaube meine probleme beruhen nicht auf der ungenügenden rechenpower des mega2560, sondern am nicht funktionierendem timing der abläufe "fahren" und "orten"...
leuchtet absolut ein, ich hatte (und habe teilweise immer noch) schwierigkeiten die kontrolle der stepper allein so zu machen, dass es einigermassen läuft, anfangs ohne eine lib, dann mit der accelstepper lib und zuletzt mit einem mix von beidem. Stepper allein würden nun laufen, im prinzip so, wie ich es wollte...
Ich bin dann, was die weitergehenden funktionen der roboters betrifft, einem anderen konzept gefolgt, der von Rabenauge beschrieben wurde:
Ich verwende einen timer:
und "sekundenaufgaben"Code:void timer()
{
aktuelle_timer_millis = millis();
if (aktuelle_timer_millis - vergangene_timer_millis >= interval_timer) // halbe sekunde um
{
vergangene_timer_millis = aktuelle_timer_millis;
halbe_tick ++; // 500ms sind um
if (halbe_tick > 2) // hier ist eine volle Sekunde vorbei
{
halbe_tick = 1; // wechselt alle halbe Sekunde
sekunden_tick++;// wechselt jede volle Sekunde
Serial.println(sekunden_tick);
}
if (sekunden_tick >= 11) // mehr brauchen wir nicht
{
sekunden_tick = 0;
}
}
}
die beide in der loop() laufen...Code:void sekunden_aufgaben()
{
if (sekunden_tick == 1)
{
// spannung_messung_gemacht = 0;
}
if ((sekunden_tick == 2) && (spannung_messung_gemacht == 0))
{
// spannung_messen_chip();
// spannung_messen_3();
}
if (sekunden_tick == 3)
{
ping_zwei_sensoren_gemacht = 0;
// myservo.write(35);
}
if ((sekunden_tick == 4) && (ping_zwei_sensoren_gemacht == 0))
{
sonar_2_sensoren ();
start_1();
}
if (sekunden_tick == 5)
{
}
if (sekunden_tick == 6)
{
ping_zwei_sensoren_gemacht = 0;
// myservo.write(70);
}
if ((sekunden_tick == 7) && (ping_zwei_sensoren_gemacht == 0))
{
sonar_2_sensoren ();
start_1();
}
if (sekunden_tick == 8)
{
// hindernis_vorh_mitte_entprellt();
}
if (sekunden_tick == 9)
{
ping_zwei_sensoren_gemacht = 0;
// myservo.write(0);
}
if ((sekunden_tick == 10) && (ping_zwei_sensoren_gemacht == 0))
{
sonar_2_sensoren ();
start_1();
}
if (sekunden_tick == 11)
{
}
}
auch die habe ich schon verwendet, ohne dass sich die stepper (allerdings eine andere art stepper als die NEMA17 und die customstepper lib) sich mit irgendetwas anderem ins gehege gekommen wären....
bei der verwendung der timerfunktion und der sekundenaufgaben dachte ich es wäre (natürlich durch zwei controler und I2C etwas verkompliziert) relativ einfach ein paar werte von einem mc zu generieren (die ortungsabstände) um sie vom anderen controler zu lesen und auszuwerten...
Was die ISR's betrifft, bin ich trotz mehrere kurze anläufe immer wieder davor zurückgeschreckt, wenn sich nur eine andere (vielleicht auch nur vermeintlich einfachere) methode der lösung angeboten habe...
ich möchte mein letztes statement etwas ergänzen:
natürlich weiss ich um die vorteile der ISR routinen, habe auch versucht mich in die problematik in verschiedenen tutorials und anderen webseiten einzulesen, bin dabei aber nicht wirklich weitergekommen :-( ...
Es wäre vielleicht ein versuch wert, wenn jemand mit mir zusammen versuchen würde, die problematik schritt für schritt durchzuarbeiten, an codebeispielen, fragen und erklärungen...
Insofern sollte mein letzte äusserung hier im thread keine rigorose ablehnung in richtung ISR sein. Den thread würde das sicher bereichern...
Gab es da nicht diese TimerOne (oder so ähnlich)-Bibliothek für derartiges?
Bisher komme ich im XP2 glänzend ohne solche Interrupts aus, ich benutze lediglich für die Odometer welche (PinChange).
Es gibt viele Links zu einfachen Abhandlungen, für Einsteiger in Arduino. Man muss sich dann tatsächlich auch mal damit auseinandersetzen und das ausprobieren und durcharbeiten. Zum Beispiel diesen Inhalt hier: http://diwo.bq.com/de/interrupts-mit-arduino-benutzen/
Auf DIWO ist es ein sehr anschauliches Beispiel, das jeder ausprobieren kann. Einfacher gehts eigentlich nicht mehr. Dort steht genau, was, warum und wo.
Die ISR muss verankert werden. Eine Erklärung, im Detail, gibts hier, für attachInterrupt: https://www.arduino.cc/reference/de/...tachinterrupt/
MfG