Arduino Steuerung für die Hellenic Spirit (Rettungsboot Hebekran)

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Hallo Miteinander
      Ich habe X Stunden versucht den Sketch zu verstehen. Leider ist das noch zu hohe schule für mich.
      Kann mir da jemand helfen?

      Aktueller Stand:
      Auf der Fernbedienung wird über ein 3 Fach Schalter gesteuert. Die Mittelstellung bedeutet alle Motoren Stopp (case 0)
      die eine Seite bedeutet Motoren Rückwärts (case 2) und die andere Vorwärts (case 1).
      Zur zeit laufen beide Motoren paralell in die richtige Richtung.
      Die Endschalter sind auf dem Bord bereit und die Pin Nummern stimmen soweit auch alle.

      Nächster Schritt:
      1. Es wäre gut wenn ich die Endschalter am Serial Monitor besser auslesen könnte. Zur Zeit muss ich den Fernbedienungs Schalter einmal bewegen um die Stellung der Endschalter zu sehen.
      2. In Stellung Case 1 soll Motor 1 solange gedreht werden bis Endschalter Endschalter 1 erreicht ist. Wenn Endschalter 1 geschlossen ist soll Motor 2 in die gleiche Richtung fahren bis Endschalter 2 erreicht.
      In Stellung Case 2 soll dann Motor 2 Rückwäts bis zum Endschalter 3 und danach mit Motor 1 bis zum Endschalter 4

      Zu Jeder Zeit soll Case 0 die Motoren Stoppen.
      Luxus wäre wenn die Motoren einen langsamen anlauf hätten.

      C-Quellcode

      1. /*
      2. * L2HF.de
      3. * project-id 19021 (rc-schiffe.com Hebekran)
      4. * Hardware Arduino UNO 16Mhz
      5. * r 0.1.23 first public (erste Diskussionsgrundlage)
      6. */
      7. #include <Arduino.h>
      8. // i/o Ports bezogen auf den Nano
      9. #define PPM_PIN 2 // WICHTIG!!! In der ISR wird der PIN direkt angesprochen, also dort anpassen bei Bedarf //Signal vom Empfänger
      10. #define PIN_MOTOR_1 3 //geht an L293 pin 2
      11. #define PIN_MOTOR_2 5 //geht an L293 pin 10
      12. #define PIN_MOTOR_1_REV 4 //geht an L293 pin 7
      13. #define PIN_MOTOR_2_REV 9 //geht an L293 pin 15
      14. #define PIN_ENDSCHALTER_1 7 //Masse wenn schalter gedrückt
      15. #define PIN_ENDSCHALTER_2 8 //Masse wenn schalter gedrückt
      16. #define PIN_ENDSCHALTER_3 6 //Masse wenn schalter gedrückt
      17. #define PIN_ENDSCHALTER_4 10 //Masse wenn schalter gedrückt
      18. #define PPM_IN_MID 1500
      19. #define PPM_IN_LOW 500
      20. #define PPM_IN_HIGH 2500
      21. #define PPM_RANGE 50 // Nullpunkt (PPM_IN_MID - PPM_RANGE) bis (PPM_IN_MID + PPM_RANGE)
      22. // ppm Eingang
      23. uint8_t ppmCnt = 99;
      24. uint8_t ppmCntLast = 0;
      25. volatile uint16_t ppmLen = 0;
      26. volatile uint8_t ppmInput = 0;
      27. unsigned long millisTemp;
      28. unsigned long millisTemp2;
      29. uint8_t cmdOld = 4;
      30. uint8_t motorRevOn = 0;
      31. uint8_t fs = 0;
      32. // Ablausteuerung cmdStep
      33. /*
      34. * 0 relais an oder aus
      35. * 1 motor an
      36. * 2 motor aus, weil endschalter
      37. * 3 warten 1s motor an
      38. * 4 motor aus, weil endschalter
      39. */
      40. uint8_t cmdStep = 0;
      41. /*
      42. *
      43. */
      44. ISR( TIMER1_OVF_vect)
      45. {
      46. // wird heute nicht benoetigt aber ...
      47. } // ISR TIMER1_OVF_vect
      48. /*
      49. * ISR liest ppm ein
      50. */
      51. ISR( INT0_vect)
      52. {
      53. static uint16_t tcstart;
      54. uint16_t tc = TCNT1; // nur wenig ticks verlieren, daher zwischen speichern
      55. if ( PIND & (1 << PIND2)) // Wechsel von low auf high
      56. tcstart = tc; // Messung starten
      57. else // ende
      58. { // Wechsel von high auf low Pegel
      59. ppmLen = (tc - tcstart) / 2;
      60. ++ppmInput;
      61. }
      62. } // ISR INT0_vect
      63. /*
      64. * ppmGetCmd
      65. * liefert fuer ppmIn die Befehle 0=neutral, 1=vor usw
      66. */
      67. uint8_t ppmGetCmd( void)
      68. {
      69. uint16_t pLen;
      70. cli(); // atomarer Zugriff
      71. pLen = ppmLen;
      72. ppmCnt = ppmInput;
      73. sei();
      74. if( (pLen < PPM_IN_LOW - PPM_RANGE) || (pLen > PPM_IN_HIGH + PPM_RANGE))
      75. return 3; // irgendwo im nirgendwo
      76. if( pLen < PPM_IN_MID - PPM_RANGE)
      77. return 2; // ppm_low
      78. if( pLen > PPM_IN_MID + PPM_RANGE)
      79. return 1; // ppm_mid
      80. return 0; // neutral
      81. } // ppmGetState
      82. /*
      83. * setup
      84. * klassisches init
      85. */
      86. void setup()
      87. {
      88. // Ausgaenge Motoren
      89. pinMode( PIN_MOTOR_1, OUTPUT);
      90. digitalWrite( PIN_MOTOR_1, LOW);
      91. pinMode( PIN_MOTOR_2, OUTPUT);
      92. digitalWrite( PIN_MOTOR_2, LOW);
      93. Serial.begin( 9600);
      94. Serial.println( "Starte...");
      95. // Eingang ppm
      96. pinMode( PPM_PIN, INPUT_PULLUP); // Eingang PPM -> INT0
      97. // Eingaenge Endschalter
      98. pinMode( PIN_ENDSCHALTER_1, INPUT_PULLUP);
      99. pinMode( PIN_ENDSCHALTER_2, INPUT_PULLUP);
      100. pinMode( PIN_ENDSCHALTER_3, INPUT_PULLUP);
      101. pinMode( PIN_ENDSCHALTER_4, INPUT_PULLUP);
      102. pinMode (7,INPUT_PULLUP);
      103. // Ausgaenge Motor-Richtung
      104. pinMode( PIN_MOTOR_1_REV, OUTPUT);
      105. digitalWrite( PIN_MOTOR_1_REV, LOW);
      106. pinMode( PIN_MOTOR_2_REV, OUTPUT);
      107. digitalWrite( PIN_MOTOR_2_REV, LOW);
      108. // 16bit timer1
      109. TCCR1A = 0;
      110. TCCR1B = (1 << CS11);
      111. TCCR1C = 0;
      112. TIMSK1 = (1 << TOIE1);
      113. TIFR1 = (1 << TOV1);
      114. // ISR fuer ppmIn aktivieren
      115. EICRA = (1<<ISC00);
      116. EIMSK = (1<<INT0);
      117. sei(); // showtime irqs aktivieren
      118. millisTemp2 = millis();
      119. } // setup
      120. /*
      121. * main loop
      122. * the endless summer
      123. */
      124. void loop()
      125. {
      126. uint8_t cmd;
      127. if( ppmInput != ppmCntLast) // neues ppm-Signal?
      128. {
      129. cmd = ppmGetCmd();
      130. ppmCntLast = ppmCnt;
      131. fs = 0;
      132. if( cmd != cmdOld)
      133. {
      134. Serial.print( "cmd: ");
      135. Serial.println( cmd);
      136. cmdOld = cmd;
      137. Serial.print( "Endschalter1 ");
      138. int Endschalter1 = digitalRead(7);
      139. Serial.println(Endschalter1,DEC);
      140. Serial.print( "Endschalter2 ");
      141. int Endschalter2 = digitalRead(8);
      142. Serial.println(Endschalter2,DEC);
      143. Serial.print( "Endschalter3 ");
      144. int Endschalter3 = digitalRead(6);
      145. Serial.println(Endschalter3,DEC);
      146. Serial.print( "Endschalter4 ");
      147. int Endschalter4 = digitalRead(10);
      148. Serial.println(Endschalter4,DEC);
      149. }
      150. millisTemp2 = millis();
      151. switch( cmd)
      152. {
      153. case 3 : // undefiniert
      154. case 0 : // neutral -> alles aus
      155. digitalWrite( PIN_MOTOR_1, LOW); // Motor 1 aus
      156. digitalWrite( PIN_MOTOR_2, LOW); // Motor 2 aus
      157. digitalWrite( PIN_MOTOR_1_REV, LOW); // Motor 1 aus
      158. digitalWrite( PIN_MOTOR_2_REV, LOW); // Motor 2 aus
      159. break;
      160. case 1 : // ausfahren
      161. digitalWrite( PIN_MOTOR_1, HIGH);
      162. digitalWrite( PIN_MOTOR_2, HIGH);
      163. millisTemp = millis();
      164. motorRevOn = 1;
      165. break;
      166. case 2 : // einfahren
      167. digitalWrite( PIN_MOTOR_1_REV, HIGH);
      168. digitalWrite( PIN_MOTOR_2_REV, HIGH);
      169. millisTemp = millis();
      170. motorRevOn = 1;
      171. break;
      172. } // switch cmd
      173. } // neuer Befehl (cmd)
      174. else
      175. if( (millis() - millisTemp2 > 500) && ( !fs))
      176. {
      177. fs = 1;
      178. Serial.println( "failsave");
      179. }
      180. if( cmd == 1) // ausfahren
      181. {
      182. // fehlt noch komplett
      183. } // if
      184. if( cmd == 2) // einfahren
      185. {
      186. // fehlt noch komplett
      187. } // if neues PPM Ereignis
      188. } // loop
      Alles anzeigen
    • Der Sketch ist für mich auch noch etwas sehr hoch, einige Teile daraus entzieht sich bisher auch meinem Kenntnisstand. Trotzdem würde ich mich deinem Problem gerne annehmen.
      Die Idee mit Anfahr- und Bremsrampen ist gut und sieht vorallem echt Klasse aus. Leider ist die Umsetzung etwas tricky. Ich versuche mal das Ganze zum Laufen zu bringen, versprechen kann ich aber nix. Müsste mir auch erstmal einen Versuchsaufbau zurecht basteln, was die Mechanik betrifft, daran sollte es aber nicht scheitern.
      Fahrbereit:
      "Varta Spielzeugyacht"

      In Arbeit:
      "Bismarck" in 1:200

      Geplant:
      "Prinz Eugen"
      "Admiral Graf Spee"
      "Rechtschreibfehler sind gewollt, um die Aufmerksamkeit der Leser zu überprüfen"
    • Buenas noches

      He estado investigando un poco sobre tus problemas con el código y he encontrado varias soluciones.

      Aplicar la macro F sobre todos los Serial.print , que no sean datos, me refiero a todos los Serial. Print que son líneas de texto, por ejemplo la línea 94

      Serial.println(“Starte…”);

      Cambiarla por

      Serial.println (F (“Starte…));

      Debes cambiar las líneas 94, 134, 137, 140, 143, 146 y 178, y así se reduce mucho el uso de memoria dinámica y de memoria de almacenamiento de tu Arduino.

      Para saber cuál es el estado de los finales de carrera, hay que ponerle una resistencia Pull UP, o bien una resistencia Pull down, te pongo un enlace donde se explica bastante bien, está escrita en Español, lo siento, pero con San Google la puedes traducir sin problemas.

      luisllamas.es/leer-un-pulsador-con-arduino/

      A demás, leyendo en el foro oficial de Arduino, me han remitido a ella varias veces.

      Y también esta otra pagina

      programarfacil.com/blog/utilizar-pulsadores-en-arduino/

      En esta otra página explican como aumentar progresivamente la velocidad de giro de un motor, sin utilizar un potenciómetro.

      huborarduino.com/programacion/…amacion/30-leccion12.html

      Espero que te sirva de ayuda, un saludo.

      Salud y cerveza para todos

      Gute Nacht.

      Ich habe einige Nachforschungen über Ihre Probleme mit dem Code angestellt und mehrere Lösungen gefunden.

      Wenden Sie das F-Makro auf alle Serial.print , mit Ausnahme von Daten, ich meine alle Serials, an. Drucken, die Textzeilen sind, zum Beispiel Zeile 94

      Serial.println ("Starte...");

      Ändern Sie ihn in

      Serial.println (F ("Starte...));

      Sie sollten die Zeilen 94, 134, 137, 140, 143, 146 und 178 ändern, da dies den dynamischen Speicher und die Speicherauslastung Ihres Arduino stark reduziert.

      Um den Zustand am Ende des Rennens zu erfahren, muss man einen Pull-Up-Widerstand oder einen Pull-Down-Widerstand einbauen, ich habe einen Link gesetzt, wo es recht gut erklärt wird, es ist auf Spanisch geschrieben, sorry, aber mit San Google kann man es ohne Probleme übersetzen.

      luisllamas.es/leer-un-pulsador-con-arduino/

      Außerdem bin ich beim Lesen im offiziellen Forum von Arduino mehrfach darauf hingewiesen worden.

      Und auch diese andere Seite

      programarfacil.com/blog/utilizar-pulsadores-en-arduino/

      Auf dieser anderen Seite erläutern sie, wie man die Drehzahl eines Motors progressiv erhöhen kann, ohne ein Potentiometer zu verwenden.

      huborarduino.com/programacion/…amacion/30-leccion12.html

      Ich hoffe, es hilft Ihnen, ein Grußwort.

      Prost und Bier für alle

      Übersetzt mit DeepL.com/Translator (kostenlose Version)
    • Zusätzliche Pullup oder Pulldown Widerstände kann man sich sparen. Die Arduinos haben Pullup Widerstände bereits integriert, muss man nur im Sketch aktivieren (INPUT_PULLUP). Die Endlagenschalter schalten die Eingänge dann einfach nach Masse und gut ist. Die ganzem Serial.println Anweisungen dienen nur der Übersicht, wenn man sich die Daten im seriellen Monitor anzeigen lässt und löscht sie in der finalen Version einfach raus. Der Sketch ist auch nicht so groß, dass es zu Problemen mit zu wenig RAM-Speicher kommen könnte. Insofern kann man sich das sparen, die Strings im Flash abzulegen.
      Fahrbereit:
      "Varta Spielzeugyacht"

      In Arbeit:
      "Bismarck" in 1:200

      Geplant:
      "Prinz Eugen"
      "Admiral Graf Spee"
      "Rechtschreibfehler sind gewollt, um die Aufmerksamkeit der Leser zu überprüfen"