Amateurfunk - HAM info » 2024 laufende 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 *********