Modellbau Steuerungen selber bauen...

Kirmes-Müller

Kirmes Fan
Registriert
21 Juni 2010
Beiträge
223
Likes
117
Hallo,

immer wieder kommt die Frage nach der perfekten Steuerung für Faller oder Eigenbauten auf.
Ich habe schon in verschiedenen Themen auf eine Umgebung in welcher man seine eigenen Steuerungen Programmieren kann hingewiesen.

Ich gebe zu, dass es für außenstehende sicher schwer ist sich das Programmieren anzueignen. Aber da ich aus eigener Erfahrung sagen kann, dass es nicht schwer ist und man schnell zum gewünschten Ergebnis kommt möchte ich hier ein tutorial geben in wlechem Schritt für Schritt der Umgang mit Code und Microcontrollern zeige.

Ich würde mich sehr freuen wenn der ein oder andere mit macht und seine Erfahrungen berichtet. Ich stehe für Fragen gerne zur Verfügung.


Dann gehts hier auch schon los.

Ich verwenden einen Chip von Atmel. Es ist der Atmega 168 20pu.

Anhang anzeigen 104681

Ich werde diesen in der Entwicklerumgebung Arduino vorstellen. Später zeige ich dann wie man nur deisen Chip verwendet.
Das ist das Arduino Board. Man kann es bei Segor elektronik oder Watterott für 22-25 Euro bestellen.
 
Auf den ersten Blick schaut das Board sehr kompliziert aus. Dem ist jedoch nicht so.

Anhang anzeigen 104683

Wir haben auf dem Board eine USB Schnittstelle [1] eine Spannungsversorgung für den Avr [2] und eben den atmega 168.

Zudem noch einige LED zum anzeigen des Status Power und ob das Programm geladen wird.
Was noch zu sehen ist sind die Pinleisten welche eins zu eins mit denen des Avr übereinstimmen.
An Pin 13 ist noch eine LED welche ins Programm aufgenommen werden kann.
 
Letztens habe ich Arduino vorgestellt.

Nun möchte ich erste Schritte zeigen. Der Klassiker beim Programmieren ist "Hello World".
Da wir am Arduino kein Display haben müßen wir uns einer anderen Ausgabe bedienen.

Wenn wir von oben auf das Board schauen und der USB Anschluß links ist sehen wir oben die Digitalen Pins und unten die Analogen.
Digitale Pins können als Input oder Otuput verwendet werden. Analoge Pins nur als Input. Dies benötigen wir Später für Sensoren deren Werte sich ständig ändern.

Wir wollen also ein "Hallo Welt" programmieren. Dies tun wir mit Hilfe einer LED. Auf dem Board ist schon eine, an Digitalpin Pin 13. Wir können auch einen anderen Pin verwenden. Dann benötigen wir eine LED mit Vorwiderstand. Jetzt verwenden wir Pin13.

OK! Nach installation des Programms und des Tribers öffnen wir es.

Zu erst legen wir fest welcher Pin verwendet werden soll. Und schreiben...

int ledPin = 13;

Nun kommt das Setup. Dieses benötigen wir im Programm immer. Hier werden die Pins als aus oder Eingang definiert.


void setup() {

pinMode(ledPin, OUTPUT);

}

Jetzt haben wir pin 13 als Ausgang definiert. Würden wir das Programm nun in den Arduino laden würde nichts geschen.
Das ligt daran, dass wir ihm noch nicht gesagt haben was es tun soll.
Dies machen wir im Loop. Dem wichtigsten Teil im Programm.

Dieser wird immer wieder wiederholt und fürht dabei die Befehle aus.

void loop() {

digitalWrite(ledPin, HIGH);

}

Nachdem wir nun das Programm haben[hier noch mal zusammengefasst] laden wir es in das Arduino-Board.


int ledPin = 13;

void setup() {

pinMode(ledPin, OUTPUT);

}

void loop() {

digitalWrite(ledPin, HIGH);

}

Hierzu gehen wir auf "Tools", wählen "Board" und klicken das Board an welches wir haben. Ich habe das Uno.
Danach gehen wir wieder auf "Tools" und clicken auf "Serial Port" dort muß nun der virtuelle Port gewählt
werden unter welchem das Board registriert ist.
Dieser kann im Gerätemangager ermittelet werden. Oder man Zieht das Board ab Schaut in der Arduino Software welche
Poarts ohne das Board da sind, steckt es wieder an un schaut welcher Port hinzu gekommen ist.

Nach dem man diese Einstellungen gemacht hat drückt man auf Anhang anzeigen 104734 und wartet bist LED 13 leuchtet. Es ist ein Dauerleuchten.
Während des Hochladens blinken zwei andere LED welche anzeigen, dass das Board geflasht wird.
Bitte nicht mit LED 13 verwchseln!


Morgen zeige ich dann wie man die LED zum Blinken bringt und wie man ein einfaches Lauflicht macht. Keine Angst es wird nicht kompliziert, vesprochen ;)!
Über feedback würde ich mich freuen!

Viele Grüße
Torsten
 
Hi Thorsten!Ein sehr komplexes aber spannendes Thema!Vielen Dank für deine Einbringung und Mühe!Beste Grüße Tobias
 
Stimmt, ist überdimensioniert. Aber für den Einstig sehr leicht. Zudem wird es von der Community gut unterstützt. Es gibt extrem viele tutorial und Beispiele. Genau das richtige wenn man mit Programmieren anfängt.

Im weiteren Verlauf zeige ich dann wie man vom überdimensionierten Arduino zur eigenen Steuerung mit Stroboskoplicht, "Lichtorgel" usw kommt. Dafür ist der atmega 168 dann nicht überdiemensioniert.

Aber erst mal zeige ich für alle interessierten die Grundlagen! Sonst kapiert das keiner.

Beste Grüße
Torsten
 
Hallo,

es ist eine abgespeckte Variante von C++.


Heute möchte ich zeigen wie man die LED zum Blinken bringt.
Zur Verdeutlichung noch mal de Code von gestern.

int ledPin = 13; //Pin13 Verwenden und in Variable [ledPin] speichern

void setup() {

pinMode(ledPin, OUTPUT); //Pin als Ausgang verwenden

}

void loop() {

digitalWrite(ledPin, HIGH); //LED einschalten

}

Um nun eine Unterbrechung des Leuchtes zu erzeugen muß man nach" digitalWrite(ledPin, HIGH);" ein Warten einbauen.
delay(2000); //warten für 2 Sekunden

Nun reicht es nicht ein Warten ein zu bauen. Die Led soll ja auh aus gehen.
also schreiben wir nach dem delay...

digitalWrite(ledPin, LOW); //LED ausschalten
delay(2000); //warten für 2 Sekunden

Das Programm schaut nun so aus.

int ledPin = 13; //Pin13 Verwenden und in Variable [ledPin] speichern

void setup() {

pinMode(ledPin, OUTPUT); //Pin als Ausgang verwenden

}

void loop() {

digitalWrite(ledPin, HIGH); //LED einschalten

delay(2000); //warten für 2 Sekunden

digitalWrite(ledPin,LOW); //LED einschalten
delay(2000); //warten für 2 Sekunden

}

Die Led sollte blinken wenn man es ins Board läd.
 
Hi,

zuerst einmal, deine Beiträge gefallen mir sehr gut Kirmes-Müller.

Ich habe meinen Octopussy jetzt mit drei Motoren ausgestattet ( 1. Motor Heben-Senken , 2.Motor Taumelscheibe, 3. Motor Tragearmescheibe ).

Da ich den Octopussy gerne auch im Automatikbetrieb laufen lassen will, brauche ich eine entsprechende Steuerung.

Frage ist jetzt, ob ich in den vorgestellten IC eine Art Schrittkette einprogrammieren kann und die Platine dafür verwenden kann?

Habe mir das mal so vorgestellt:

1 Schritt: Hebmotor und Taumelmotor an und letzter Schritt wird deaktiviert.

2 Schritt: Nach 10 Sekunden ist nur noch der Taumelmotor an, Schritt 1 wird deaktiviert.

3 Schritt: Nach 15 Sekunden ist der Taumelmotor und das Blitzlicht an, Schritt 2 wird deaktiviert.

4 Schritt: Nach 10 Sekunden ist der Taumelmotor und der Tragearmmotor an, Schritt 3 wird deaktiviert.

usw.

habe insgesamt 10 Schritte!!!

Ist dies überhaupt möglich????

Ich könnte dieses Programm ohne Probleme in eine S7 einprogrammieren, nur ist mir eine S7 ein wenig zu teuer ( ca. 500€ gebraucht bei Ebay ).

Freue mich über Antworten!

Gruß Dominik
 
Hallo Dominik,

was du vor hast ist natürlich möglich.
Ich werde demnächst mal zu Motoren kommen. Hierfür benötigt man noch H Brücken um die Motoren zu steuern. Sonnst fließt zu viel Strom über den AVR. Das wollen wir aber nicht.

Werde kommende Woche das Tut hierzu on stellen.

Viele Grüße
Torsten
 
Hi Thosten,

das hört sich wunderbar an, dann werde ich in nächster Zeit mal die
Platine mit dem IC bestellen.

Gruß Dominik
 
Hi,

zuerst einmal, deine Beiträge gefallen mir sehr gut Kirmes-Müller.

Ich habe meinen Octopussy jetzt mit drei Motoren ausgestattet ( 1. Motor Heben-Senken , 2.Motor Taumelscheibe, 3. Motor Tragearmescheibe ).

Da ich den Octopussy gerne auch im Automatikbetrieb laufen lassen will, brauche ich eine entsprechende Steuerung.

Frage ist jetzt, ob ich in den vorgestellten IC eine Art Schrittkette einprogrammieren kann und die Platine dafür verwenden kann?

Habe mir das mal so vorgestellt:

1 Schritt: Hebmotor und Taumelmotor an und letzter Schritt wird deaktiviert.

2 Schritt: Nach 10 Sekunden ist nur noch der Taumelmotor an, Schritt 1 wird deaktiviert.

3 Schritt: Nach 15 Sekunden ist der Taumelmotor und das Blitzlicht an, Schritt 2 wird deaktiviert.

4 Schritt: Nach 10 Sekunden ist der Taumelmotor und der Tragearmmotor an, Schritt 3 wird deaktiviert.

usw.

habe insgesamt 10 Schritte!!!

Ist dies überhaupt möglich????

Ich könnte dieses Programm ohne Probleme in eine S7 einprogrammieren, nur ist mir eine S7 ein wenig zu teuer ( ca. 500€ gebraucht bei Ebay ).

Freue mich über Antworten!

Gruß Dominik


Dein Beitrag liest sich auch sehr schön....Vielleicht hast du auch ein paar Bilder oder ein Video deines Octopussyumbaus?Das würde mich brennend interessieren!Grüße Tobias
 
Hallo,

mich hatte ja einige wegen des Themas angeschrieben. Ihr wolltet euch ja auch ein Board besorgen. Mich würde ja freuen wenn Ihr euch hier beteiligt und eure Erfahrungen mit uns teilt. Ich werde über Ostern mal zeigen wie man Motoren anschließt.
Oder gibt es kein Interesse? Bisher haben sich ja ehr wenig Leute gemeldet.

Beste Grüße
Torsten
 
Kirmes-Müller schrieb:
Ich werde über Ostern mal zeigen wie man Motoren anschließt.
Oder gibt es kein Interesse? Bisher haben sich ja ehr wenig Leute gemeldet.

Beste Grüße
Torsten


Doch, doch immer her mit Input......

Willy
 
Doch Doch!! Mach bitte weiter. Ich find das sehr interessant. Gerade, wenn man die Lichteffekte selber herstellen kann. :good3:
 
Hi,

habe heute mein Arduino Uno bekommen. Fang jetzt erstmal an dein Programm mit der Led aus zutesten.

Mich würde besonderes interessieren, wie man eine sogenannte Schrittkette programmiert.

Gruß Dominik
 
Hallo,
bin ganz frisch hier und finde dieses Tutorial bisher recht interessant.

vor dem Programmieren ist mir nicht wirklich bange, da ich damit schon einige Übung habe wenn auch nicht in Bezug auf diesen speziellen Bereich.

Interessant wäre auf jeden fall noch wie weitere LEDs genau anzuschliesen sind für den Test und wie sich das ganze später auf eine eigene Platine installieren lässt.

Auf jeden Fall hab ich mir jetzt erstmal die nötigen Teile bestellt...

Was ich bisher jedoch noch nicht ganz verstanden habe ist wieviele nutzbare Ausgänge nun tatsächlich vorhanden sind, zumal da die Aussage je nach Seite wo es den Baustein gibt unterschiedlich sind :-(

MfG
Martin
 
Schön zu sehen, dass doch einige Interesse an diesem Thema haben!
Das Board hat 13 Digitalpins die alle als Ausgang genutzt werden können.
Jedoch denke ich , dass Masse nicht = Klasse ist. Das ist jka das Gute. Man kann sich das ganze auf seine Bedürfnisse anpassen und kann somit recht realistische Lauflichter herstellen.

Beste Grüße
Torsten

ps bald gehts weiter :)
 
Kirmes-Müller schrieb:
Jedoch denke ich , dass Masse nicht = Klasse ist.

Da möchte ich Dir auf keinen Fall wieder sprechen...
Und dennoch hat man für einen Schriftzug schnell mal ein paar Kanäle zusammen ;-)

MfG
Martin
 
So, damit es hier mal etwas weiter geht...

hier mal mein erster Beitrag ;-)

Hier mal das Beispiel für ein einfaches Lauflicht.


Da ich gerne mit Arrays arbeite und Zeilen spare lege ich zunächst einen Counter und einen Array für die Kanäle fest. Die 0 wäre in diesem Fall zwar nicht nötig, da aber für Informatiker die 0 eben auch eine Zahl ist und Arrays beim schreiben der Daten mit 0 beginnen wird diese am Anfang erfasst, so haben wir später mit led[1] auch den Kanal 1 und nicht den Kanal 2 ;-)
Code:
const int ledCount = 14;
int led[] = {0, 1, 2, 3 , 4 , 5 , 6 , 7 , 8 , 9, 10, 11, 12, 13};

Nachdem wir die Variablen und den Array angelgt haben müssen wir auch hier wieder dem Programm sagen das es sich hierbei um Ausgänge handelt.
Da wir oben einen Array gewählt haben können wir eine FOR() Schleife für alle Kanäle verwenden und können so einige Zeilen sparen.

Code:
void setup() {
for (int thisLed = 1; thisLed < ledCount; thisLed++) {
pinMode(led[thisLed], OUTPUT);
}
}

Das eigentliche Programm habe ich zur verdeutlichung wieviel Bytes gespart werden können zunächst einmal ausführlich dargestellt. In dieser Form benötigt das Programm 1.502 der möglichen 32.256 Bytes.
Code:
void loop() {
digitalWrite(led[1], HIGH);
digitalWrite(led[13], LOW);
delay(500);
digitalWrite(led[2], HIGH);
digitalWrite(led[1], LOW);
delay(500);

digitalWrite(led[3], HIGH);
digitalWrite(led[2], LOW);
delay(500);
digitalWrite(led[4], HIGH);
digitalWrite(led[3], LOW);
delay(500);
digitalWrite(led[5], HIGH);
digitalWrite(led[4], LOW);
delay(500);
digitalWrite(led[6], HIGH);
digitalWrite(led[5], LOW);
delay(500);
digitalWrite(led[7], HIGH);
digitalWrite(led[6], LOW);
delay(500);
digitalWrite(led[8], HIGH);
digitalWrite(led[7], LOW);
delay(500);
digitalWrite(led[9], HIGH);
digitalWrite(led[8], LOW);
delay(500);

digitalWrite(led[10], HIGH);
digitalWrite(led[9], LOW);
delay(500);

digitalWrite(led[11], HIGH);
digitalWrite(led[10], LOW);
delay(500);

digitalWrite(led[12], HIGH);
digitalWrite(led[11], LOW);
delay(500);

digitalWrite(led[13], HIGH);
digitalWrite(led[12], LOW);
delay(500);
}

Auch für die Schaltung kann man zusätzlich eine FOR() Schleife verwenden.
In diesem Fall benötigen wir noch eine Variable die uns sagt welche LED ausgeschaltet werden muss.
Um auf die 13 bei der 1. LED zu kommen benötigen wir zusätzlich noch eine IF abfrage.

Der gesamte Code benötigt in diesem Fall nur noch 1.190 Bytes
Code:
const int ledCount = 14;
int led[] = {0, 1, 2, 3 , 4 , 5 , 6 , 7 , 8 , 9, 10, 11, 12, 13};

void setup() {
// loop over the pin array and set them all to output:
for (int thisLed = 1; thisLed < ledCount; thisLed++) {
pinMode(led[thisLed], OUTPUT);
}
}

void loop() {
for(int thisLed = 1; thisLed < ledCount; thisLed++){
int thisLed2 = thisLed - 1;
if (thisLed2 == 0){thisLed2 = 13;}
digitalWrite(led[thisLed], HIGH);
digitalWrite(led[thisLed2], LOW);
delay(500);
}
}

wie genau die Arrays, schleifen und abfragen funktionieren, werde ich falls bedarf besteht gerne in einem extra beitrag erklären
 

Premium Mitglied

Keine Lust auf Werbung | Du möchtest das Forum unterstützen | Extra Banner .
Zurück
Oben