Servos sind aufgrund Ihres Preises und der relative einfachen Ansteuerung für vieles rund um die Modelleisenbahn zu gebrauchen.
Ich steuere Servos meistens über Arduinos oder andere ATMEL Mikroprozessoren die sich über die Arduino IDE programmieren lassen.
Um nicht immer den ganzen Sketch neu zu schreiben, oder ein Servo einfach direkt nach oder während des Einbaus zu Testen habe ich mir folgende Testschaltung aufgebaut:
Das ganze ist einArduino Uno mit einem LCD Shield. Das Servo hängt mit der Steuerleitung an einem PWM Pin (in dem Fall Pin 2) und der Stromversorgung an den entsprechenden 5V und GND Pins am Arduino. Die Stromversorgung erfolgt über den USB Port mit einer Powerbank, damit das ganze mobil ist.
Mit LEFT – RIGHT wird der Startwinkel und mit UP – DOWN die Endposition des Sevos justiert. SELECT löst die Bewegung aus.
Somit kann man die benötigten Winkel zB für Weichen einfach austesten um sie später in einen Decoder Sketch übernehmen.
Viel Spass beim Nachbau!
#include <LiquidCrystal.h> #include <Servo.h> LiquidCrystal lcd(8, 9, 4, 5, 6, 7); Servo s_servo; int readkey; char keypressed ='x'; int start_angle = 75; int end_angle = 115; int s_data = 2; char last_pos = 'e'; int s_pos; int s_speed = 20; void setup() { lcd.begin(16, 2); lcd.print("Servotest 2018"); lcd.setCursor(0, 1); lcd.print("by XFLOW"); delay(3000); lcd.clear(); s_servo.attach(s_data); } void display_write(){ lcd.setCursor(0, 0); lcd.print("Start"); lcd.setCursor (8,0); lcd.print(start_angle); lcd.setCursor(0, 1); lcd.print("End"); lcd.setCursor (8,1); lcd.print(end_angle); lcd.setCursor (14,0); lcd.print(last_pos); } void read_key(){ readkey=analogRead(0); if (readkey<50) { lcd.setCursor (14,1); lcd.print("R"); keypressed = 'r'; } else if(readkey<195) { lcd.setCursor (14,1); lcd.print("U"); keypressed = 'u'; } else if(readkey<380) { lcd.setCursor (14,1); lcd.print("D"); keypressed = 'd'; } else if(readkey<600) { lcd.setCursor (14,1); lcd.print("L"); keypressed = 'l'; } else if(readkey<900) { lcd.setCursor (14,1); lcd.print("S"); keypressed = 's'; } delay (200); } void keyprocess(){ if (keypressed == 'r'){ start_angle++; } else if (keypressed =='l'){ start_angle--; } else if (keypressed =='u'){ end_angle++; } else if (keypressed =='d'){ end_angle--; } else if (keypressed =='s'){ servo_action(); } keypressed = 'x'; } void servo_action(){ if (last_pos=='e') { s_servo.write(start_angle); last_pos = 's'; } else if (last_pos=='s') { s_servo.write(end_angle); last_pos = 'e'; } delay (200); } void loop() { display_write(); read_key(); keyprocess(); lcd.clear(); } |