Skip Navigation
 

draussen im Frühling entwickeln

die Anordnung

vor dem Start Anzeige der Vorgaben

Anzeige nach Druck der Start Taste

Amateurfunk - HAM info » Funduino (Arduino) Projekte

2/2018 Stepper gesteuert mit IR-Fernbedienung und LCD Anzeige

Test Projekt um Erfahrung mit der Steuerung des Steppers, des LCD's  und der IR-Fernbedienung zu sammeln.

Die Sat Automatik hat 4 Relais mit denen die Signale für Azimut und Elevation gesteuert werden:
Azimut links
Azimut rechts
Elevation auf
Elevation ab

Diese ziehen die Eingangs Pins des Arduinos jeweils auf GND das dann die richtige Drehung der jeweiligen Achse auslöst (mit der voreingestellten Geschwindigkeit, zB 100 und den Anzahl Schritten zB 16). Dies solange als die Soll Position (in der Sat Automatik) nicht erreicht ist.
Die Automatik erhält die Rückmeldung der Position mittels kalibrierten Potentiometern die mit der jeweiligen Achse mitdrehen.
  
Die Fernsteuerung soll folgendes mit dem Stepper steuern und auf dem LCD anzeigen:
- Vorgaben wie Speed, Schritte und Drehrichtung einstellen
- den Tastencode (Dezimal) und das Label der gedrückten Taste anzeigen
- die Einstellungen vor dem Starten auf dem LCD anzeigen
- den Motor mit den Vorgaben drehen lassen

20.3.2018 - eine Achse (Azimut oder Elevation) ist fertig
(die 2. kommt in den gleichen Sketch)

Der Sketch enthält weitere Informationen, somit erübrigt sich ein weiterer Beschrieb hier.
Sicher mag einiges optimierter und einfacher programmiert werden, (ich bin auch erst am Anfang)...

 

Genaue Funktionen der Tasten: (von mir festgelegt)

 Label  Dezimal Code  Funktion  
 CH-  16 753 245  Vorgeben: 1U-Uhrzeigersinn  
 CH  16 736 925  Vorgeben: Drehrichtung +/-  
 CH+  16 769 565  Vorgeben: 1U-GegenU  
 |<<  16 720 605  Vorgeben: Steps / 2 (min 4)  
 >>|  16 712 445  Vorgeben: Steps * 2  
 >||  16 761 405  Motor mit Vorgaben starten  
 -  16 769 055  Vorgeben: Speed -100  
 +  16 754 775  Vorgeben: Speed +100  
 "LD"  42 949 672 95  Tastendruck lang
  löscht beliebige Steps
 
 0-9  siehe Sketch  beliebige Steps eingeben  
 EQ  16 748 655  auf Vorgabe Speed/Steps  
  

Material:

*Funduino UNO
I2C Interface für LCD
*LCD 16 Zeichen / 2 Zeilen
*IR-Fernbedienung
*IR Empfänger Diode
*Stepper 28BYJ-48 (5V DC)
*Stepper Interface/Driver 
(das Material mit * stammt aus dem Starter Set 8 aus dem Funduino Shop)

 



der Sketch zum kopieren
****** ab hier unterhalb kopieren *********



// Version 20.3.2018 Erich Rieder HB9FIH
// das Programm steuert einen Schrittmotor entweder per IR-Fernbedienung oder
// von der SAT Nachführungs Automatik aktuell dem "EA4TX ARS-USB"
//
// 20.3.2018 Code optimiert, Tasten eingebau (Simulation Steuergerät)





#include <IRremote.h>   // Library für IR-Fernbedienung
#include <Stepper.h> // Stepper Library

#define STEPS 32     // Anzahl der Steps für den 28BYJ-48 er Stepper
Stepper stepper(STEPS, 8, 10, 9, 11); // eine stepper Instanz initialisieren mit Anzahl STEPS und Anschluss-Pins bestimmen
                                     // 8 = IN1 / 9 = IN2 / 10 = IN3 / 11 = IN4
int Steps2Take = 2048 ;              // Vorgabe Anzahl der Steps  !!!!! ACHTUNG der Links/Rechtslauf immer vom Stepper hinten gesehen !!!!!
int StepsSpeed = 500 ;               // Vorgabe Speed

int Steps2TakeInit = 2048 ;          // Init-Vorgabe Anzahl der Steps  !!!!! ACHTUNG der Links/Rechtslauf immer vom Stepper hinten gesehen !!!!!
int StepsSpeedInit = 500 ;           // Init-Vorgabe Speed

// Eingangs Signal Pins bestimmen für Signale von der Sat Nachführungs Steuerung
int pinUZ  = 12;                     // 12 auf GND -> Uhrzeigersinn
int pinGUZ = 13;                     // 13 auf GND -> G-Uhrzeigersinn

String StepsEingabeS = "";
int    StepsEingabe = Steps2TakeInit;
String StepsEingabeT = "";  //Letzte gedrückte Taste
boolean drehung = false;    // Drehen ja/nein
boolean anzeigen= false;    // Werte anzeigen

#include <Wire.h>                     //Wire  Library
#include <LiquidCrystal_I2C.h>        //I2C LCD Display Library
LiquidCrystal_I2C lcd(0x27, 16, 2); // Instanz lcd initialisieren, I2C Adresse sowie Type (16 Zch auf 2 Zln)  bestimmen.

// Fernbedienungs-Tasten Codes (der Car mp3 Fernsteuerung)
#define bCHm 16753245     // CH-
#define bCH  16736925     // CH
#define bCHp 16769565     // CH+
#define bL   16720605     // |<<
#define bR   16712445     // >>|
#define bRs  16761405     // >||
#define bm   16769055     // -
#define bp   16754775     // +
#define bEQ  16748655     // EQ
#define b0   16738455     // 0
#define b1   16724175
#define b2   16718055
#define b3   16743045
#define b4   16716015
#define b5   16726215
#define b6   16734885
#define b7   16728765
#define b8   16730805
#define b9   16732845     // 9
#define b100 16750695     // 100+
#define b200 16756815     // 200+
#define bLD  4294967295 // Langer Druck auf eine Taste
unsigned long btnCode = 0;          // Var für Zwischenspeichern des erhaltenen Tastencodes

int RECV_PIN = 6;          // IR Signal Pin Input ( von Vorne: Sig / - / +5V
IRrecv irrecv(RECV_PIN);
decode_results results ;  // Decodierung initialisieren


void setup() {

pinMode(pinUZ, INPUT_PULLUP) ;  // Uhrzeigersinn pin init
pinMode(pinGUZ, INPUT_PULLUP) ; // G-Uhrzeigersinn pin init

delay(1000);

//  Serial.begin(9600);
//  Wire.begin();

stepper.setSpeed(StepsSpeed);     // Stepper Speed setzen

irrecv.enableIRIn();              // IR Empfang starten  

lcd.begin();                      // LCD starten und erste Anzeige
lcd.backlight();
lcd.clear();
lcd.print("Fernbedienung ?");
lcd.setCursor(0, 1);
lcd.print("St:");
lcd.print(Steps2Take);
lcd.print(" Sp:");
lcd.print(StepsSpeed);

}



void loop() {

// Eingänge ob UZ oder GUZ Signal von der automatischen Nachführungs Steuerung anliegt
  if (digitalRead(pinUZ) == LOW) {
      StepsEingabeT = "+UZ";    
      Steps2Take = abs(Steps2Take);
      btnCode = 0;
      drehung = true;
      anzeigen = true;
  }
  if (digitalRead(pinGUZ) == LOW) {
      StepsEingabeT = "-UZ";
      Steps2Take = - abs(Steps2Take);
      btnCode = 0;
      drehung = true;
      anzeigen = true;      
  }  



if (irrecv.decode(&results)) {      // Wenn eine Taste grdückt untersuchen welche und behandeln

btnCode = results.value, DEC ;      // den erhaltenen Tastencode als Dezimal in der Var btnCode speichern
anzeigen = true;
//  Serial.println("Taste: ");
//  Serial.print(results.value, DEC);




switch (btnCode) {
  case bCHm:
      StepsEingabeT = "CH-" ;             // anzeigen der gedrückten Taste
      Steps2Take = -2048;           // soll 1 Umdrehung im gegen Uhrzeigersinn machen
    break;
  case bCH:
      StepsEingabeT = "CH";
      Steps2Take = - Steps2Take;    // soll die Richtung umkehren    
    break;
      case bCHp:
      StepsEingabeT = "CH+";
      Steps2Take = 2048;            // soll 1 Umdrehung im Uhrzeigersinn machen
    break;
  case bL:
      StepsEingabeT = "<<-";
      if (abs(Steps2Take) > 2) {    // darf nicht kleiner 2 sein (2 4 8 16 ....)
      Steps2Take = Steps2Take / 2;  // die Steps halbieren
      }
    break;   
  case bR:
      StepsEingabeT = "->>" ;
      Steps2Take = Steps2Take * 2 ;   // die Steps verdoppeln
    break;    
  case bRs:
      StepsEingabeT = ">||";
      drehung = true;
    break;  
  case bm:
      StepsEingabeT = "-";
      StepsSpeed = StepsSpeed - 100;    // Speed um 100 reduzieren
      if(StepsSpeed < 100) {
        StepsSpeed = 100;
      }
     break;
  case bp:
      StepsEingabeT = "+";
      StepsSpeed = StepsSpeed + 100;    // Speed um 100 erhöhen
    break;
  case bEQ:
      StepsEingabeT = "EQ";
      StepsEingabeS = "";
      Steps2Take = Steps2TakeInit;
      StepsSpeed = StepsSpeedInit;
    break;  
  case b0:
      StepsEingabeT = "0";  
      StepsEingabeS = StepsEingabeS + StepsEingabeT;
      Steps2Take = StepsEingabeS.toInt();
    break;
  case b1:
      StepsEingabeT = "1";
      StepsEingabeS = StepsEingabeS + StepsEingabeT;
      Steps2Take = StepsEingabeS.toInt();
    break;
  case b2:
      StepsEingabeT = "2";
      StepsEingabeS = StepsEingabeS + StepsEingabeT;
      Steps2Take = StepsEingabeS.toInt();      
    break;
  case b3:
      StepsEingabeT = "3";
      StepsEingabeS = StepsEingabeS + StepsEingabeT;
      Steps2Take = StepsEingabeS.toInt();     
    break;
  case b4:
      StepsEingabeT = "4";
      StepsEingabeS = StepsEingabeS + StepsEingabeT;
      Steps2Take = StepsEingabeS.toInt();      
    break;
  case b5:
      StepsEingabeT = "5";
      StepsEingabeS = StepsEingabeS + StepsEingabeT;
      Steps2Take = StepsEingabeS.toInt();      
    break;   
  case b6:
      StepsEingabeT = "6";
      StepsEingabeS = StepsEingabeS + StepsEingabeT;
      Steps2Take = StepsEingabeS.toInt();     
    break;
  case b7:
      StepsEingabeT = "7";
      StepsEingabeS = StepsEingabeS + StepsEingabeT;
      Steps2Take = StepsEingabeS.toInt();
    break;
  case b8:
      StepsEingabeT = "8";
      StepsEingabeS = StepsEingabeS + StepsEingabeT;    
      Steps2Take = StepsEingabeS.toInt();  
    break;   
  case b9:
      StepsEingabeT = "9";
      StepsEingabeS = StepsEingabeS + StepsEingabeT;
      Steps2Take = StepsEingabeS.toInt();    
    break;
  case b100:
      StepsEingabeT = "100+";
      StepsEingabeS = "";
      Steps2Take = Steps2TakeInit;
    break;
  case b200:
      StepsEingabeT = "200+";
      StepsEingabeS = "";
      Steps2Take = Steps2TakeInit;
    break;
  case bLD:
      StepsEingabeT = "LD";
      StepsEingabeS = "";
      Steps2Take = Steps2TakeInit;   
    break;         
  default:
    anzeigen = false;
  break;
       
}
delay(500);
irrecv.resume();  //Der nächste Wert soll vom IR-Empfänger eingelesen werden
}

// Anzeige der eingestellten Steps und Speed
if (anzeigen == true) {
lcd.clear();
lcd.print("T:");
lcd.print(btnCode);    // anzeigen des gedrückten Tasten Codes
lcd.setCursor(13, 0);
lcd.print(StepsEingabeT);             // anzeigen der gedrückten Taste
lcd.setCursor(0, 1);
lcd.print("St:");
lcd.print(Steps2Take);
lcd.print(" Sp:");
lcd.print(StepsSpeed);
anzeigen = false;
}

if (drehung == true) {
      stepper.setSpeed(StepsSpeed);     // den Stepper mit den Einstellungen (Speed / Steps / Drehrichtung) Starten
      stepper.step(Steps2Take);  
      drehung = false;
     // delay(100);
}

}

********* bis hier oberhalb kopieren *********

 
 
« zurück|drucken