Mit RC Empfänger Arduino steuern

Schönes Ding - gutes Gelingen!

Danke. Schöne Baustelle. Macht aber auf jeden Fall Spaß.

Bin den ganzen Vormittag schon auf der Suche nach nem vernünftigen deutschen tutoriel für nen motorshield mit dc Motoren. Leider bis jetzt ohne Erfolg. Hat von euch jemand ne Idee?

Habe endlich ein passendes tutoriel gefunden.
Dafür stellt sich mir gerade eine andere Frage. Muss ich die PulseIn Eingänge an einen analogen pin oder an einen pwm pin anschließen?

https://www.arduino.cc/reference/de/language/functions/advanced-io/pulsein/

Moin, habe heute die Pinbelegung auf das Nano Board angepasst und die Motorsteuerung hinzugefügt. Fehler oder Warnungen werden mir nicht angezeigt. Ich würde mich freuen, wenn hier nochmal einer drüber schaut, ob das so auch funktioniert. Da ich ein Board ohne Header nutze, möchte ich nicht mehrfach dran rum löten.
Hier nochmal das ganze Skript:

#include <Servo.h>
//Pinbelegung
const byte PulseInRauch = 4;
Servo servoRauch;
Servo servo1;
const byte motor1 = 6;
const byte PulseInStuetzen = 7;
const byte vorwaerts = 8;
const byte rueckwaerts = 12;
const byte endschalter1 = 13;
const byte endschalter2 = 14;
//Timer
const int aufheizen = 3000;
const int abkuehlen = 3000;
const int stuetze = 5000;
unsigned long rauchInterval = 0;
unsigned long stuetzenInterval = 0;

enum RAUCH {warteAufRauch, servo90Grad, warteBisAufheizenFertig, servo180Grad, servoHalbZurueck, warteBisAbgekuehlt, servo0Grad};
byte rauch = warteAufRauch;

enum STUETZEN {warteAufStuetzen, tuerenAuf, warteBisOffen, stuetzenRaus, stuetzenStopRaus, stuetzenRein, stuetzenStopRein, warteBisZu, tuerenZu};
byte stuetzen = warteAufStuetzen;

void setup()
{
  pinMode(PulseInRauch, INPUT);
  pinMode(PulseInStuetzen, INPUT);
  pinMode(endschalter1, INPUT);
  pinMode(endschalter2, INPUT);
  servoRauch.attach(3);
  pinMode (motor1, OUTPUT);
  pinMode (vorwaerts, OUTPUT);
  pinMode (rueckwaerts, OUTPUT);
  servo1.attach(5);
}


void loop()
{
  switch (rauch)
  {
    case warteAufRauch:
      if (PulseInRauch > (1600))
        rauch = servo90Grad;
      break;

    case servo90Grad:
      servoRauch.write(90);
      rauchInterval = millis();
      rauch = warteBisAufheizenFertig;
      break;

    case warteBisAufheizenFertig:
      if (millis() > rauchInterval + aufheizen) {
        rauch = servo180Grad;
      }
      break;

    case servo180Grad:
      servoRauch.write(180);
      rauch = servoHalbZurueck;
      break;

    case servoHalbZurueck:
      if (PulseInRauch < (1400)) {
        rauch = servoHalbZurueck;
      }
      servoRauch.write(90);
      rauchInterval = millis();
      rauch = warteBisAbgekuehlt;
      break;

    case warteBisAbgekuehlt:
      if (millis() > rauchInterval + abkuehlen) {
        rauch = servo0Grad;
      }
      break;

    case servo0Grad:
      servoRauch.write(0);
      rauch = warteAufRauch;
  }
  switch (stuetzen)
  {
    case warteAufStuetzen:
      if (PulseInStuetzen > (1600))
        stuetzen = tuerenAuf;
      break;

    case tuerenAuf:
      servo1.write(90);
      stuetzenInterval = millis();
      stuetzen = warteBisOffen;
      break;

    case warteBisOffen:
      if (millis() > stuetzenInterval + stuetze) {
        stuetzenInterval = millis();
        stuetzen = stuetzenRaus;
      }
      break;

    case stuetzenRaus:
      digitalRead(endschalter2);
      if (endschalter2 == LOW) {
        digitalWrite(vorwaerts, HIGH);
        digitalWrite(rueckwaerts, LOW);
        analogWrite(motor1, 100);
        stuetzen = stuetzenStopRaus;
      }
      break;

    case stuetzenStopRaus:
      digitalRead(endschalter2);
      if (endschalter2 == HIGH) {
        digitalWrite(vorwaerts, LOW);
        digitalWrite(rueckwaerts, LOW);
      }
      stuetzen = stuetzenRein;
      break;


    case stuetzenRein:
      if (PulseInStuetzen < 1400) {
        digitalWrite(vorwaerts, LOW);
        digitalWrite(rueckwaerts, HIGH);
        analogWrite(motor1, 100);
      }
      stuetzen = stuetzenStopRein;
      break;

    case stuetzenStopRein:
      digitalRead(endschalter1);
      if (endschalter1 == HIGH) {
        digitalWrite(vorwaerts, LOW);
        digitalWrite(rueckwaerts, LOW);
        stuetzenInterval = millis();
        stuetzen = warteBisZu;
      }
      break;

    case warteBisZu:
      if (millis() > stuetzenInterval + stuetze) {
        stuetzen = tuerenZu;
      }
      break;

    case tuerenZu:
      servo1.write(0);
      stuetzen = warteAufStuetzen;
      break;
  }
}

Nun noch ein paar Links der von mir verwendeten Bauteile:
Board: AZDelivery 3 x Nano V3.0 mit Atmega328 CH340 inklusive E-Book!: Amazon.de: Computer & Zubehör
Motorshield: Neuftech L298N Dual H-Brücke DC Stepper Motortreiber Schrittmotor Controller Modul für Arduino: Amazon.de: Computer & Zubehör
Motor: MICGEEK Getriebemotor Motor Elektromotor Gleichstrommotor Elektro Getriebe Motor Motor mit Getriebe Elektromotoren N20 DC 12v 100rpm : Amazon.de: Auto & Motorrad
Da das Shield Motoren mit bis zu 2A unterstützt und die Motoren (wenn ich das richtig gesehen habe) 1A ziehen, kann ich 2 Motoren parallel Schalten. Somit habe ich noch einen Kanal am Shield frei für eventuelle Erweiterungen.

Wie schon gesagt, bitte um kurze Rückmeldung ob das so funktioniert.

Gruß Andre