ShieldBuddy TC275

Moin liebe ShieldBuddy Freunde,

ich bin gerade dabei V1.0 einer Shieldbuddy Version hochzuladen.
Ich habe einen neuen Fork erstellt dafür und NUR die Software für den Mower und etwas Doku drin gelassen.

---> Hier

Vorsicht! Es ist nur eine Testversion! Bitte vorerst unbedingt Mower-Motor abklemmen! [strike]und den Mower aufbocken![/strike]
[strike]Nach Anlegen der Versorgungsspannung und nach Reset laufen die Motoren für eine halbe Sekunde an.[/strike]
[strike]Ich weiß noch nicht woran das liegt. Vermutlich werden die Ausgänge nicht korrekt oder zu spät initialisiert.[/strike]
Es gibt noch etliche Fehler/Baustellen die ich bearbeiten muss.

VG
Reiner
 
Hi Patrick,

ja ich glaube das ist eine gute Adresse. Günstiger hab ich ihn leider noch nicht gesehen.
Bei RS kostet er knapp 130,- inkl. Steuer.

VG
Reiner
 
Hallo,

bin neu hier, arbeite aber schon länger an meinen eigenen Ardumower.
Da mein zu mähendes Grundstück relativ groß ist (3500 qm) muss ich alles aus meinen Mäher rausholen das technisch möglich ist....
Bin aber mit dem Arduino Mega relativ schnell an Grenzen gekommen.

Deshalb will ich mich schon einmal bei Dir für den super Einfall einen ShieldBuddy zu benutzen sehr bedanken.
Seitdem der ShieldBuddy das Herzstück meines Mähers ist, läuft alles gleich ein wenig runder.

Hänge aber momentan an dem Problem, das Du scheinbar schon gelöst hast.
Wie verhindert man das anlaufen der Antriebe bei starten des Mähers (Strom an)

Mir fällt einfach kein richtiger Lösungsweg ein....

Über eine Antwort würd ich mich sehr freuen....

Viele Grüße, Andi
 
Hallo Andi,
ich glaube die fettgedruckten Zeilen haben das Problem gelöst:


Code:
Console.print(".");
pinMode(pinMotorEnable, OUTPUT);  
[b]//digitalWrite(pinMotorEnable, HIGH);[/b] 
pinMode(pinMotorLeftPWM, OUTPUT);
pinMode(pinMotorLeftDir, OUTPUT);   
pinMode(pinMotorLeftSense, INPUT);


Mower.cpp

Code:
motorRollTimeMax          = 1500;      // max. roll time (ms)
  motorRollTimeMin          = 750;       //min. roll time (ms) should be smaller than motorRollTimeMax
  motorReverseTime          = 1200;      // max. reverse time (ms)
  ...
  ...
  Robot::setup();  

[b]
//Necessary to prevent motor-start at start-up or reset
delay(1000);
digitalWrite(pinMotorEnable, HIGH);
[/b]


Ich habe gerade ein Problem mit I2C und der IMU. Ich glaube das hat schon mal funktioniert. Aber im Moment bekomme ich zeitweise nur Nullen aus dem Ding. Manchmal geht die Kommunikation überhaupt nicht...

VG
Reiner


***EDIT***
Sorry HTML ist wohl im neuen Forum noch nicht aktiv?
 
Hey Reiner,

danke für die schnelle Antwort....
Hab das ganze mal überprüft, war alles schon so im Programm, wie du mir das geschrieben hast.

Der ShieldBuddy setzt bei mir alle Ausgänge beim starten oder upload auf 1....

Somit laufen alle Antriebe für ca. 3 Sekunden los.

Hab das jetzt mal Hardwareseitig behoben, in dem ich ein Not-IC zwischen Ausgang (Freigabe Motoren) und Motorplatine geschalten habe.
Das ganze noch im Programm logisch umgekehrt, und schon läufts!!

Ansonsten fiel mir nix ein!!! ;-)

Leider kann ich dir beim IMU gar nicht helfen, so weit bin ich noch lange nicht!
Versuch gerade über PeriMag das der Roboter schon etwas weiter weg von der Primeterschleife (1m) langsamer wird, damit er nicht so stark auf der Schleife abbremsen muss, oder er nicht so weit darüber fährt....

Gruß Andi
 
Hallo Andi,

wie steckt denn der Power Jumper auf dem ShieldBuddy? Bei mir steckt der auf Vcc. Nicht auf Vusb.


VG
Reiner
 
Hallo Reiner,

So, jetzt hab ich mal wieder Zeit für meinen Mäher.

Also bei mir steckt der auch auf Vcc.

Warum?

VG Andi
 
Moin Shieldbuddy Freunde,

ich bin gerade dabei einzelne Teile des Codes auf die Kerne zu verteilen. Beim "ADCMan" ist mir das auch schon geglückt.
Jetzt hänge ich aber an der IMU. Beim Shieldbuddy ist es so, dass es je Kern eine "Setup()" und ein "Loop()" gibt. Ich kann also eine Funktion z.B. in Loop1() aufrufen, dann wird der Code der Funktion auf Core1 ausgeführt. Eigentlich ganz einfach.

Das IMU Objekt ist aber so wie ich das sehe ein Member der Robot() Klasse. Bei compilieren kommt dann immer die Fehlermeldung "undefined reference to `imu'" weil das IMU Objekt ja dort nicht bekannt ist. Was muss ich tun, damit das IMU Objekt dem Compiler dort bekannt gegeben wird? Sorry bin immer noch nicht so OOP erfahren :-:whistle:


Code:
/*
  Ardumower (www.ardumower.de)
  Copyright (c) 2013-2015 by Alexander Grau
  Copyright (c) 2013-2015 by Sven Gennat
  Copyright (c) 2014 by Maxime Carpentieri    
  Copyright (c) 2014-2015 by Stefan Manteuffel
  Copyright (c) 2015 by Uwe Zimprich
  Copyright (c) 2016-2017 by Reiner Ehlers
    
  Private-use only! (you need to ask for a commercial-use)
 
  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  Private-use only! (you need to ask for a commercial-use)
*/

/* LMU uninitialised data */
StartOfUninitialised_LMURam_Variables
/* Put your LMU RAM fast access variables that have no initial values here e.g. uint32 LMU_var; */
EndOfUninitialised_LMURam_Variables

/* LMU uninitialised data */
StartOfInitialised_LMURam_Variables
/* Put your LMU RAM fast access variables that have an initial value here e.g. uint32 LMU_var_init = 1; */
EndOfInitialised_LMURam_Variables

/* If you do not care where variables end up, declare them here! */

#include <Arduino.h>
#include <Wire.h>
#include <EEPROM.h>
#include "config.h"
#include "buzzer.h"

/***********************************/
/***           Core 0            ***/
/***********************************/
void setup()
{

  // Set Arduino PWM Frequency to 5kHz
  useCustomPwmFreq(5000);
  
  // Initialise EEPROM system
  if(EEPROM.eeprom_initialise() == EEPROM_Not_Initialised)
  {
    // EEPROM is bad 
    // TODO: Timeout einbauen
    while(1) { ; }
  }
 
  robot.setup(); 
}

void loop()
{
  robot.loop();    
}

/***********************************/
/***           Core 1            ***/
/***********************************/

/* CPU1 Uninitialised Data */
StartOfUninitialised_CPU1_Variables
/* Put your CPU1 fast access variables that have no initial values here e.g. uint32 CPU1_var; */
EndOfUninitialised_CPU1_Variables
/* CPU1 Initialised Data */
StartOfInitialised_CPU1_Variables
/* Put your CPU1 fast access variables that have an initial value here e.g. uint32 CPU1_var_init = 1; */
EndOfInitialised_CPU1_Variables

void setup1()
{ 
}

void loop1() 
{  
  if (ADCMan.run_enable == true)
    ADCMan.run(); 
}

/***********************************/
/***           Core 2            ***/
/***********************************/

/* CPU2 Uninitialised Data */
StartOfUninitialised_CPU2_Variables
/* Put your CPU2 fast access variables that have no initial values here e.g. uint32 CPU2_var; */
EndOfUninitialised_CPU2_Variables
/* CPU2 Initialised Data */
StartOfInitialised_CPU2_Variables
/* Put your CPU2 fast access variables that have an initial value here e.g. uint32 CPU2_var_init = 1; */
EndOfInitialised_CPU2_Variables

void setup2()
{
}

void loop2()
{
  if (imu.update_enable == true)
    imu.update();  
}


VG
Reiner
 
Hallo drolli,
das ist ja super, dass du das hinbekommen hast.
Ich habe mich mit dem Thema nicht weiter beschäftigt, aber ich gehe davon aus, dass der Shieldbuddy eine ARM Architektur mit 3 Kernen hat.
D.h. dieser ist nicht mehr mit dem Mega vergleichbar und man sollte nicht versuchen schwächen des Mega auszubügeln indem man meint etwas anders machen zu müssen, obwohl der Prozessor dies ganz locker schafft. Das gleiche wurde mit der Boardversion 1.3 gemacht, indem die Erfahrung gemacht wurde, dass der Atmega die Encoder Interrupts (scheinbar) nicht schafft und beim neuen Board der PIN für den zweiten Encoderinterrupt weggelassen wurde und so ein fachgerechtes Auslesen der Encodersignale nicht mehr möglich ist.

Aufgrund meiner aktuellen ARM Erfahrung aber keiner Ahnung vom Shieldbuddy hätte ich folgende Anregung:
Die Auswertung des Perimetersignals würde ich einem extra Kern überlassen. Da hat man dann noch Luft nach oben, dies ggf. zu optimieren.
Für den restlichen Code würde ich die loops/sek messen. Wenn diese bei möglicherweise 10000 liegen, muss da nichts weiter ausgelagert werden. Da könntest du dann noch ganz locker was reinpacken. Den 3 Kern würde ich dann für Lokalisierung und den Partikelfilter verwenden oder andere schöne Sachen, falls angedacht.

Ist alles nur ein Gedankengang den ich hatte und nun niedergeschrieben habe, nachdem ich deine Ausführung gelesen habe. Möglicherweise Unsinn.
 
Hi Roland,

ja, so habe ich mir das eigentlich auch gedacht. Vermutlich könnte ich die IMU auch auf dem Kern laufen lassen.
Wenn die loops/sek. richtig berechnet werden, dann liege ich da um die 34000 inkl. IMU. Wenn ich die IMU ausschalte dann liege ich bei 126000.
Ist ein ziemlich krasser Unterschied. Kommt mir gerade wo ich´s sehe ganz schön hoch vor...:S
Aber die Auslagerung des ADCMan macht gefühlt schon mal einen großen Unterschied. Alle Regelfunktionen laufen viel "runder".

VG
Reiner
 
Was stört dich an den loops per second? Das sagt doch letztlich nur aus, wie oft der gesamte Ardumower Code (Loop) pro Sekunde durchlaufen wird. Das der ShieldBudy hier deutlich höhere Raten erreicht, wundert ja nicht. Die IMU erfordert viel Rechenzeit, fällt die weg wird es natürlich noch mal viel mehr Durchläufe.

Das bedeutet doch letztlich nur, dass der Mower viel schneller auf geänderte Bedingungen reagieren kann. Ob man das im Betrieb merkt, sei mal dahin gestellt.

Ich finde die Portierung jedenfalls sehr spannend. Schade dass der ShieldBuddy recht teuer ist.
 
Hi Paddy,

mich stört nix an den loops. Im Gegenteil, es ist ja gut so dass die so hoch sind. Ich habe mich nur gewundert das der Unterschied zwischen IMU AUS und IMU AN auch beim Shieldbuddy sehr groß ist.
Ich habe es aber inzwischen geschafft, den IMU Teil auf Core2 auszulagern. Ist zwar keine schöne Lösung, aber sie funktioniert erst mal.

VG
Reiner
 
Hallo Reiner,

Wie gehts bei dir vorran?

Hast du eigentlich die Mäher Modulation schon am laufen?
Versuch Sie seit Tagen zum laufen zu bringen, leider komm ich da nicht weiter...:(

Kannst du mir evtl. weiterhelfen?

VG Andi
 
Hallo Andi,

bin gerade dabei mir ein Übergehäuse zu drucken. Es soll auch als Bumper herhalten.
Mäher Modulation habe ich bei mir nicht eingebaut. Habe mir einen anderen Messerhalter gedruckt, weil die Scheibe aus dem Shop immer wieder für starke Vibrationen gesorgt hat. Mein Mähwerk läuft zur Zeit auf 100% und man hört es kaum.

--> Aktuelles Video

Hast Du dem Mähmotor aus dem Shop? Da muss man glaube ich einen kleinen Magnet oben auf die Welle kleben und mit einem Hall Sensor abfragen.

VG
Reiner
 
Hallo,

hat schon jemand den RTC Timer am ShieldBuddy am laufen?

Krieg einfach keine Verbindung zusammen....

VG Andi
 
Oben