Due Portierung (Achtung: nur experimentell)

Hi,

habe das "Servo.h Problem" nun auch mit einem zusätzlichen Arduino gelöst.
Das Ausgangssignal für den Mähantrieb des DUE wandle ich über einen RC-Filter (15k 100nF) in ein Analogsignal, was ich dann einfacher auswerten kann.
Funktioniert soweit ganz gut und mann kann die Drehzahl immernoch über die Software anpassen. Die Modulation hab ich nicht ausprobiert, da ich noch keinen Sensor verbaut habe.

Hier mal die Software für den zusätzlichen Arduino:
Code:
#include <Servo.h>

Servo myservo;

int pinMotorMowPWM = 0;                   // Input from Arduino DUE or MEGA (MotorMowPWM) use a RC-Filter to convert the PWM Signal (15k 100nF)
int val;    							 

int ledPin =  13;
int ledState = HIGH; 					 

void setup()
{
  myservo.attach(9);                        // choose a pin what you want for the ESC
  pinMode(ledPin, OUTPUT);
}

void loop() 
{ 
  if ( millis() > 10000 )                  // wait 10s untill the DUE/MEGA is ready
  {
      ledState = LOW;
  
      val = analogRead(pinMotorMowPWM); 
      val = map(val, 0, 1023, 0, 272);     // Arduino DUE		scale to 3,3V  
  // val = map(val, 0, 1023, 0, 180)"	   // Arduino Mega    scale to 5V
      myservo.write(val);                 
     
      delay(20);                       	  
  }   
     
  else
  {
      ledState = HIGH;
      delay(2000);
  }
}


Beim DUE hab ich noch große Probleme mit den analogen Eingängen. Ich bekomme keine vernünftigen Werte für meine Stromsensoren. Der Nullpunkt ist nach einem Reboot immer auf einem anderen Wert. Hab die Config.h schon etwas angepasst und auch die Scalierung mal deaktiviert aber bekomm es nicht hin. Was unter ADCMan passiert versteh ich auch noch nicht wirklich.

Da muss ich wohl hoffen das Alexander mal wieder Zeit und Muse für den DUE hat ;)


Greez Chrisser
 
@Christian: bei mir kommen stabile Werte heraus :) - kannst Du ausschließen dass es am Stromsensor liegt? Hast Du mal ein Poti drangehängt? Dann sollten die Werte ja stabil sein...


Code:
Due VCC o----- Poti Außen-Pin 1
Due ADC o----- Poti Mittelanzapfung
Due GND o----- Poti Außen-Pin 2
 
Hab jetzt nochmal ein wenig probiert.
Wenn ich die Eingänge mit einem Poti ansteuer werden die Initialisierungswerte des Analogeingangs richtig im Serial Monitor angezeigt (0V = 0, 3,3V = 1024).

In der PfodApp stehen dann aber utopische Werte bei den Stromwerten der Motoren. (3,3V = 65000)
Die Config hatte dabei für die Motoren:
motorSenseLeftZero = 0
case SEN_MOTOR_LEFT: return((ADCMan.read(pinMotorLeftSense)-motorSenseLeftZero))


Bei der Spannungsmessung des Akkus hab ich das selbe Problem. Es werden viel zu hohe Werte angezeigt in der PfodApp. Hab den batFaktor weggelassen
case SEN_BAT_VOLTAGE: return (ADCMan.read(pinBatteryVoltage)); break;

Hab ich da irgendwas übersehen?
 
Hallo Sven,

das mit den Scalewerten ist mir schon klar. Was ich nur nicht versteh sind, dass die angezeigten Werte mit einem Scalefaktor von 1 über den 1024 der 10bit liegen.

Ich werd morgen nochmal danach schauen.

Greez Chrisser
 
Nur mal zum Verstädniss für mich.

Ich mass also im Datenblatt nachsehen, was das Modul für einen Messbereich hat z.B 10A und das dann
entsprechend ausrechnen ?

Aber warum stehen dann in der config :



Code:
int motorSenseRightZero = 0;     // motor right sense zero point (mA=(ADC-zero)/scale)
double motorSenseRightScale = 15.015; // motor right sense scale (mA=(ADC-zero)/scale)
int motorSenseLeftZero  = 0;     // motor left sense zero point (mA=(ADC-zero)/scale)
double motorSenseLeftScale = 15.58; // motor left sense scale  (mA=(ADC-zero)/scale)
int motorRollTimeMax    = 4000;  // max. roll time (ms)


Für motorSense unterschiedliche Werte für Rechts und Links ?

Gruss Stefan
 
Hallo Sven,

das ist jetzt klar aber wie werden die Richtigen Werte ermittelt.

Ich messe den tatsächlichen Strom, vergleiche ihn mit der Anzeige und berichtige ihn nach oben oder Unten ?


Ich überleg mir gerade eine Formel dafür.

Gruss Stefan
 
Hallo,

hab jetzt meinen Mower nochmal Komplett Umgebaut und bei der Gelegenheit, die Due Portierung oder pre1.0
draufgespielt.

Leider leide ich auch unter dem pfodapp Problem, so das nicht darüber machen kann.

In der Konsole erhalte ich folgende Ausgabe :



Code:
Signal size=48
ADC3ofs=394
ADC1ofs=0
ADC0ofs=0
ADC5ofs=507
ADC4ofs=848
--------
accOfs=2.95,-17.75,-22.05
accScale=517.90,526.50,514.50
comCalB=0.000000  0.000000  0.000000  comCalA_1=1.000000  0.000000  0.000000  0.000000  1.000000  0.000000  0.000000  0.000000  1.000000  
comDev
-180=0.00
-170=10.00
-160=20.00
-150=30.00
-140=40.00
-130=50.00
-120=60.00
-110=70.00
-100=80.00
-90=90.00
-80=100.00
-70=110.00
-60=120.00
-50=130.00
-40=140.00
-30=150.00
-20=160.00
-10=170.00
0=180.00
10=190.00
20=200.00
30=210.00
40=220.00
50=230.00
60=240.00
70=250.00
80=260.00
90=270.00
100=280.00
110=290.00
120=300.00
130=310.00
140=320.00
150=330.00
160=340.00
170=350.00
--------
gyro calib min=257.00	max=3598.00	ofs=1855.54	noise=4011816.50
gyro calib min=0.00	max=2827.00	ofs=1727.04	noise=397060.31
gyro calib min=514.00	max=3598.00	ofs=1927.50	noise=534891.06
gyro calib min=0.00	max=3084.00	ofs=1711.66	noise=465697.31
gyro calib min=514.00	max=3598.00	ofs=1809.28	noise=381961.62
gyro calib min=-2.00	max=2570.00	ofs=1583.08	noise=477599.71
gyro calib min=257.00	max=2827.00	ofs=1901.80	noise=487308.37
gyro calib min=514.00	max=3084.00	ofs=1788.72	noise=364062.09


nach einem Reset


Code:
��hSignal size=48
ADC3ofs=394
ADC1ofs=0
ADC0ofs=0
ADC5ofs=507
ADC4ofs=848
--------
accOfs=2.95,-17.75,-22.05
accScale=517.90,526.50,514.50
comCalB=0.000000  0.000000  0.000000  comCalA_1=1.000000  0.000000  0.000000  0.000000  1.000000  0.000000  0.000000  0.000000  1.000000  
comDev
-180=0.00
-170=10.00
-160=20.00
-150=30.00
-140=40.00
-130=50.00
-120=60.00
-110=70.00
-100=80.00
-90=90.00
-80=100.00
-70=110.00
-60=120.00
-50=130.00
-40=140.00
-30=150.00
-20=160.00
-10=170.00
0=180.00
10=190.00
20=200.00
30=210.00
40=220.00
50=230.00
60=240.00
70=250.00
80=260.00
90=270.00
100=280.00
110=290.00
120=300.00
130=310.00
140=320.00
150=330.00
160=340.00
170=350.00
--------
gyro calib min=-1.00	max=2827.00	ofs=1577.96	noise=2949748.50
gyro calib min=0.00	max=3598.00	ofs=1747.60	noise=448849.25
gyro calib min=257.00	max=2827.00	ofs=1608.82	noise=409768.09
gyro calib min=-1.00	max=2827.00	ofs=1572.82	noise=539367.75
gyro calib min=257.00	max=2827.00	ofs=1829.84	noise=501031.43
gyro calib min=771.00	max=3084.00	ofs=1691.06	noise=399940.09
gyro calib min=0.00	max=2827.00	ofs=1639.52	noise=469866.71
gyro calib min=-2.00	max=3084.00	ofs=1541.96	noise=638427.68
gyro calib min=0.00	max=3341.00	ofs=1649.94	noise=421401.15
gyro calib min=257.00	max=3341.00	ofs=1706.48	noise=383004.93
gyro calib min=-1.00	max=3084.00	ofs=1644.78	noise=458289.68


Er läst sich auch nicht mit der Taste und gibt keine Töne von sich.

Die Anschlüsse hab ich and config.h angepasst und IMU deaktiviert.

Muss erst der Kompass Kalibriert werden ?

Stefan
 
Wie ich in der Software gefunden habe, wird die Einstellung ob IMU Aktiv ist übergangen und der Kompass
Kalibriert oder zumindest versucht. Damit die Kalibrierung abgeschlossen ist mus Das Rauschene unter 20 liegen.

Aber wie bekomme ich das hin ?

Hab den Mower heute mehrfach gedreht aber an den Noise Werten ändert sich nicht wirklich was.

Also wie wird der Kompass in der neuen Version Kalibriert.

Und da er bei der Kalibrierung hängt komme ich auch nicht mit pfodapp rein.

Stefan
 
Ich hab's gestern erstmal aufgegeben die dev Version zu Installieren. Auf einem Mega bekomme ich das Teil nicht zum Laufen.
Nachdem ich den IMU abgeklemmt habe , bin zwar weiter gekommen, konnte aber auch das Motor Testprog mit "d" nicht aufrufen.
Auch start über den Taster war nicht möglich.

Schade. Ich würde gerne mithelfen. Vielleicht sollte man eine eigene Rubrik für die Portierung einrichten, damit es übersichtlicher bleibt.

Stefan
 
Hallo Stefan,
Wie hast du denn das IMU an das Mega angeschlossen?
Ich habe zur Zeit auch die aktuelle SVN ich glaube R25 drauf. Läuft soweit super. Nur bekomme ich das mit dem IMU nicht hin. Hast du das direkt angeschlossen oder wie zuvor über das Nano? Bei beiden Versuchen wird das bei mir nicht erkannt. Auch meine Ladespannung und auch der Ladestrom wird nicht mehr angezeigt.
Dafür muss ich sagen ist das fiepen der Motoren komplett verschwunden bei langsamen Fahrten. Spitze.
Ich denke du hast gesehen, dass der Pin für den Motoranschluss links PWM geändert wurde.
Gruß
Stephan
 
@Stefan: IMU-Code im SVN ist derzeit "broken" - ich habe den Code einfach vom Nano genommen und in eine C++Klasse gesteckt und das war's. Ziel war das es kompiliert. Da müsste noch einiges angepaßt werden bis das wieder läuft...
 
Den IMU hatte ich ohne Nano Angeschlossen

Ich hatte auch mal IMU Code der für den Nano ist auf den Mega gespielt ging merkwürdiger Weise auch nicht. Deswegen hatte ich dann den IMU abgeklemmt und lief leider auch nicht.

Ich mach den Mower jetzt erst mal mit "offiziellen " Code fertig und stelle mir was zum testen auf die Basis zusammen.

Stefan
 
ich habe heute die letzte Version vom SVN heruntergeladen und versucht diese für den DUE zu kompilieren.



Code:
In file included from ardumower.ino:96:
C:UsersDietmarAppDataLocalTempbuild8027438895129430191.tmp/config.h: In function 'void PCINT2_vect()':
C:UsersDietmarAppDataLocalTempbuild8027438895129430191.tmp/config.h:173: error: 'A12' was not declared in this scope
C:UsersDietmarAppDataLocalTempbuild8027438895129430191.tmp/config.h:174: error: 'A13' was not declared in this scope
C:UsersDietmarAppDataLocalTempbuild8027438895129430191.tmp/config.h:175: error: 'A15' was not declared in this scope
C:UsersDietmarAppDataLocalTempbuild8027438895129430191.tmp/config.h:176: error: 'A14' was not declared in this scope
C:UsersDietmarAppDataLocalTempbuild8027438895129430191.tmp/config.h: In function 'void config()':
C:UsersDietmarAppDataLocalTempbuild8027438895129430191.tmp/config.h:256: error: 'A12' was not declared in this scope
C:UsersDietmarAppDataLocalTempbuild8027438895129430191.tmp/config.h:258: error: 'A13' was not declared in this scope
C:UsersDietmarAppDataLocalTempbuild8027438895129430191.tmp/config.h:259: error: 'A15' was not declared in this scope
C:UsersDietmarAppDataLocalTempbuild8027438895129430191.tmp/config.h:260: error: 'A14' was not declared in this scope


Eigentlich ist alles richtig in der config.h eingetragen und es sollte sehr wohl declared sein.
 
@Dietmar: Die Odometrie-Pins wurden so ausgesucht, dass der Mega Interrupts dafür generieren kann (also eine spezielle Interrupt-Funktion aufruft, wenn der Pin seinen Zustand ändert).

Könntest Du den Code für den Due anpassen und dann ins SVN übertragen (SVN commit)?

Idee:
Schau mal ob Du einen passenden Pin an derselben Position am Due findest... http://www.tonylabs.com/wp-content/uploads/arduino-due-pinout-diagram.jpg
Der Due kann (anders als der Mega) für jeden Pin einen Interrupt auslösen. Die Konfiguration hierfür kann für den Due (anders als bei den PCINT Pins beim Mega) mit Standard Arduino-Befehlen erfolgen:
http://arduino.cc/de/Reference/AttachInterrupt
Ansatz z.B.:


Code:
// odometry: enable pin interrupts
  ...
  #ifdef __AVR__  
    // interrupt config for Mega
    PCICR |= (1<<PCIE2);
    PCMSK2 |= (1<<PCINT20);
    PCMSK2 |= (1<<PCINT21);  
    PCMSK2 |= (1<<PCINT22);
    PCMSK2 |= (1<<PCINT23);       
  #else
    // interrupt config for Due
    attachInterrupt ( ... )
  #endif


// odometry signal change interrupt
#ifdef __AVR__  
// interrupt function for Mega
ISR(PCINT2_vect)
{
   ...
}
#else
// interrupt function for Due
....
#endif
 
ich kann versuchen daran zuarbeiten, leider verstehe ich das interruptkonzept nicht so ganz.

Hab in meinen Projekten(lange her, Pascal, später Delphi) sowas nie gebraucht.
Die Arbeit hat da ein eventhandler gemacht :cheer:

einige Zeit Später ..... ich verstehe da noch mehr nicht :(

Was soll der Interrupt eigentlich machen? bzw auslösen verändern.

Leider ist der Code schon so komplex geworden, das ich aufgebe diesen zu verstehen.

Ich denke ich reiß den Due aus dem Mower und besorg mir einen Mega. Dann kannst du erst in ruhe eine Stable version für den Mega fertigstellen an deren Fortschritt ich mich wie alle anderen auch erfreuen kann.

Deshalb kannst du mich als schreibendes Mitglied mal aus dem SVNstreichen, dann kann ich auch nicht aus Versehen was überschreiben.
 
@Dietmar: habe dich ausgetragen - die Idee mit dem Mega zu starten ist vielleicht gar nicht so verkehrt...


Interrupts sind eine "Hardware-Erfindung" - Der Odometrie-Pin gibt für jeden "Tick" (eine Radumdrehung z.B. 1000 Ticks) einen Hi-Lo-Puls aus. Nun könnte man den Pin ständig abfragen, könnte dann aber nichts anderes im Programm mehr machen. Daher gibt es das Interrupt-Konzept. Man sagt dem Interrupt-Controller, er solle für einen bestimmten Pin (und bei bestimmten Pin-Zustand) einen Interrupt auslösen. Mit der Arduino-Funktion "attachInterrupt" kann man das bewerkstelligen...

Die Odometrie soll in v1.0 dafür sorgen dass der Roboter auch nach längerer Mähdauer (niedriger Batteriespannung) so schnell fährt wie beim Start (vorausgesetzt, er ist beim Start nicht auf maximale Geschwindigkeit gesetzt worden).

Dasselbe Problem bei Steigung etc. (konstante Geschwindigkeit halten)
 
@Dietmar : Arduino due has only 11 analog inputs so A12 to A15 labels don't exist.
Interrupt declaration could be like that but i don't test for the moment:

Code:
void config(){
  ...
  attachInterrupt(pinOdometryLeft, Odometry_interrupt, CHANGE);
  attachInterrupt(pinOdometryLeft2, Odometry_interrupt, CHANGE);
  attachInterrupt(pinOdometryRight, Odometry_interrupt, CHANGE);
  attachInterrupt(pinOdometryRight2, Odometry_interrupt, CHANGE);

...
}

// odometry signal change interrupt
void Odometry_interrupt()
{   
  unsigned long timeMicros = micros();
  boolean odometryLeftState = digitalRead(pinOdometryLeft);
  boolean odometryLeftState2 = digitalRead(pinOdometryLeft2);
  boolean odometryRightState = digitalRead(pinOdometryRight);  
  boolean odometryRightState2 = digitalRead(pinOdometryRight2);  
  setOdometryState(timeMicros, odometryLeftState, odometryRightState, odometryLeftState2, odometryRightState2);
}



@AlexanderG: Svn code seems to be broken for due. Compilation is OK but setup() don't run. (I have try from r28 to r32).
By now, i'm using your archive dated 2014-05-21 as a base for due porting. I begin to implement IMU (MinIMU-9 v2 ) and rewrite interrupt but i don't have enough time to test...
 
Some code donated by "djekk" (Due code for tone() that does not conflict with Arduino servo.h library)...

about tone http://forum.arduino.cc/index.php?topic=136500.0;wap
please try change in the due.cpp to this


Code:
TC_Configure(chTC, chNo,
        TC_CMR_TCCLKS_TIMER_CLOCK4 |
        TC_CMR_WAVE |         // Waveform mode
        TC_CMR_WAVSEL_UP_RC | // Counter running up and reset when equals to RC
        TC_CMR_ACPA_SET |     // RA compare sets TIOA
        TC_CMR_ACPC_CLEAR );  // RC compare clears TIOA


and test it
 
Ok for the problem with tone().

Does anyone try the svn code on due? My problem is still here.
Compiling is Ok after modify the config.h but the setup() don't run.
I have replace setup() code by the simple code below but the serial monitor stay empty.

Code:
void setup()  {     
  Serial.begin(BAUDRATE); 

  for (int i=5; i>0; i--) {
    // wait a few secs to see if we are being programmed
    delay(1000);
    Serial.print(i);}
}
 
Oben