Kategorie: Elektronik mit PICAXE und Arduino
Zugriffe: 1813

AUSFAHRGERÄTE, SCHNORCHEL UND DIE PASSENDE ANSTEUERELEKTRONIK IM XXVIW

Im XXVIw sollten von Anfang an Ausfahrgeräte eingebaut werden.  

 

Zur Steuerung der Antriebsmotoren der einzelnen Ausfahrgeräte bedurfte es einer passenden Ansteuerung, der Einfachheit halber entschied ich mich für eine einfache Relaisansteuerung. Da die verwendeten Motoren nur eine geringe Leistungsaufnahme hatten brauchten die benötigten Relais eher schmächtiger Natur zu sein. Ein erster Blick beim Elektronikversand präsentierte mir aber saftige Preise für diese Relais, sodass ich mich nach Alternativen umschaute. In meinem Fundus hatte ich noch aus uralten Tagen eine Schublade voll mit kleinen bistabilen Relais mit nur einer Spule die bisher nie für irgendwas von Nutzen waren. Hier hatte ich endlich mal die Möglichkeit die Dinger zu verbauen und auch Geld für einen Neukauf zu sparen. Es muss eigentlich nur die Spannung an der Spule umgepolt werden um die Relais an- oder aus zu schalten. Da der zu verwendende PICAXE 18m2 genug freie Pins hat war das kein Problem. Bei 5 Relais wurden 10 Pins benötigt, dazu noch der Pin welcher mit dem Empfänger verbunden wird. 

 

Vor einiger Zeit hatte ich mal ein einfaches Programm zusammengeschrieben, welches eine simple Tip Auswertung eines Fernsteuerkanals mit im Prinzip beliebig vielen Ausgängen darstellt. Einmal lang tippen, erster Kanal ein. Einmal kurz, einmal lang, zweiter Kanal ein und so weiter. Gleiche Prozedur um den entsprechenden Kanal wieder auszuschalten. Anzahl der Kanäle +1 tippen schaltet alle Kanäle aus. Mit ein bisschen Übung hat man das Timing schnell raus. Hat man sich vertan oder ist man sich unsicher genügt es 2 Sekunden zu warten und dann wieder neu zu beginnen. Die dazu gehörige Schaltung gestaltete sich auch recht einfach und wurde in kurzer Zeit entworfen. Ich habe dann das Ganze auf eine Lochrasterplatine gebaut um die Funktionsfähigkeit zu testen. Vor Allem der direkte Anschluss der Relaisspulen ohne Freilaufdiode an den Pins des Mikroprozessors machte mir Sorgen. Der Spuleninnenwiderstand lag noch so gerade eben im Bereich des maximalen Stroms den der PICAXE pro Pin schalten kann. Um das zu testen habe ich ein kurzes Testprogramm geschrieben welches alle Relais auf einmal in schneller Reihenfolge an- und wieder ausschaltet. Nach einer guten halben Stunde im Dauerfeuer mit 5 Schaltvorgängen pro Sekunde lebte der Chip immer noch und arbeitete klaglos. Einem Weiterbau stand also nichts im Wege. Die Schaltung wurde um Leuchtdioden erweitert die den Schaltzustand anzeigen, aber es waren immer noch Pins frei die ungenutzt waren. 

Diese wurden genutzt, um den Schnorchel anzusteuern. Da der Schnorchel mit einem Servo angetrieben wird liessen sich sehr einfach die eingebauten Servobefehle im PICAXE einsetzen. Natürlich kann man nicht einfach den Mast in der "originalen" Servogeschwindigkeit aufstellen, das sähe sehr unrealistisch aus. Also wurde eine Softwareverzögerung kurzerhand in das Programm integriert sodass eine Ansteuerung mit einem separaten Empfängersignal unnötig wurde und mit einem "Schaltkanal" ausgelöst werden konnte. Der sechste Kanal ist nun für das Ein- und Ausfahren des Schnorchels vorgesehen. Eine LED zeigt den Betriebszustand an. Über zwei Potis kann die Verzögerungsgeschwindigkeit und der Endanschlag des Servos eingestellt werden, dies hilft an die örtlichen Gegebenheiten anzupassen und macht die Schaltung auch für andere, ähnliche Anwendungen geeignet. Die ganze Schaltung ist mit Fädeldraht verdrahtet, das ist natürlich nicht gerade Servicefreundlich, aber vielleicht bau ich mal ne ordentliche Platine dazu, die Schaltung dazu habe ich auf jeden Fall entworfen.

Servoschaltungen mit PICAXE neigen schon mal zum sogenannten "Jitter", das macht sich durch kurzes Zucken am Servo bemerkbar. Dieser Jitter ist ein Hardwareproblem, kann aber minimiert werden. Aus diesem Grund wurden in der Software entsprechende Kommandos eingebaut und auch der Pullup Widerstand am Servoausgang trägt zur Unterdrückung bei. Auch spielt das Servo selbst eine gewisse Rolle, manche Servos sind unempfindlicher. Da muss man einfach ausprobieren. Mit meinen Komponenten konnte ich das Zucken komplett unterdrücken.

Einer dieser Befehle in der Software sorgt dafür, dass der Chip nicht mehr den seriellen Eingang abfragt. Dieses wurde nötig, da das hinzufügen der Leuchtdiode am letzten freien Output Pin c.3 das Servo wieder zum Zucken veranlasste. In Konsequenz kann der Chip nun nicht mehr umprogrammiert werden wenn man nicht einen kleinen Trick anwendet: Man muss die Datenübertragung starten und erst dann sofort im Anschluss den Chip mit dem PC verbinden, dann klappts auch mit dem Neubespielen. 

DAS PROGRAMM

;5kanalschalter mit 18m2

#picaxe 18m2

sertxd   ("5kanalschalter mit 18m2",cr,lf) ;text wird bei einschalten zur identifizierung des chips gesendet

disablebod

disconnect

 

;variablen definieren

 

;c.0/1= Rel1

;c.6/7= Rel2

;b.6/7= Rel3

;b.4/5= Rel4

;b.2/3= Rel5

symbol Schnorchelservo = b.0

symbol Verzoegerung =b.1

symbol Endansch = c.2

symbol schnorchelled = c.3

symbol Eingang = c.5

symbol zaehler = b0

symbol nummer = b1

symbol poti = b2

symbol schnorchel = b3

symbol endanschlag = b4

symbol minanschlag = b5

symbol empfaenger = b6

 

;variablen setzen

let dirsB = %11111111 ;ports initialisieren

let dirsC = %11000011

let pinsB = %00000000 ;ports setzen

let pinsC = %00000000

let minanschlag = 80

 

;nur beim ersten mal 

gosub relaisaus ;alle afg einfahren

nummer =-1

 

;hauptschleife

main:

if time >1 then ;setzt den ledzaehler zurueck wenn keine eingabe

nummer=0

endif

pulsin Eingang,1,empfaenger

if empfaenger > 180 then ;taste ist gedrückt 

gosub signal

endif

goto main ;und von vorne

 

signal:

zaehler =0 ;zaehler auf null

time=0 ;zeit zuruecksetzen

 

signal2:

pulsin Eingang,1,empfaenger

if empfaenger < 160 then ;wenn taste losgelassen dann wieder alles von vorne

return

endif

 

zaehler=zaehler+1 ;ansonsten zaehler starten

pause 10 ;kleine pause

select case zaehler

case 2 ;kurz gedrueckt dann lednummer inkrementieren

inc nummer

 

case 5 ;lang gedrueckt dann auswahl

branch nummer,(nix,rel1an,rel2an,rel3an,rel4an,rel5an,schnorchelaus,ende)

 

nix:

goto raus

 

rel1an:

if pinc.0 = 1 then ;wenn relais auf ausfahren steht dann 

low c.0 : high c.1 : else ;einfahren, togglefunktion

high c.0 : low c.1 ;ansonsten afg ausfahren

endif

goto raus

 

rel2an:

if pinc.7 = 1 then ;wenn relais auf ausfahren steht dann

low c.7 : high c.6 : else ;einfahren, togglefunktion

high c.7 : low c.6 ;ansonsten afg ausfahren

endif

goto raus

 

rel3an:

if pinb.6 = 1 then ;wenn relais auf ausfahren steht dann

low b.6 : high b.7 : else ;einfahren, togglefunktion

high b.6 : low b.7 ;ansonsten afg ausfahren

endif

goto raus

 

rel4an:

if pinb.4 = 1 then ;wenn relais auf ausfahren steht dann

low b.4 : high b.5 : else ;einfahren, togglefunktion

high b.4 : low b.5 ;ansonsten afg ausfahren

endif

goto raus

 

rel5an:

if pinb.2 = 1 then ;wenn relais auf ausfahren steht dann

low b.2 : high b.3 : else ;einfahren, togglefunktion

high b.2 : low b.3 ;ansonsten afg ausfahren

endif

goto raus

 

schnorchelaus: ;schnorchel ausfahren

gosub adlesen

if schnorchel > 100 then ;wenn schnorchel auf ausfahren steht dann

gosub schnorchelein

goto raus

else ;einfahren, togglefunktion

for schnorchel = minanschlag to endanschlag

pause poti

servo Schnorchelservo,schnorchel

next

high schnorchelled ;schnorchelled ein

goto raus

endif

 

ende:

gosub relaisaus ;alle afg und schnorchel einfahren

 

raus:

endselect

pause 100 ;kleine pause

goto signal2

 

relaisaus: ;alle afg einfahren

let pinsB = %10101000 ;ports setzen

Let pinsC = %01000010

 

schnorchelein: ;schnorchel einfahren

if schnorchel < 100 then ;schon ausgefahren? dann überspringen

return

else

gosub adlesen

for schnorchel = endanschlag to minanschlag step -1

pause poti

servo Schnorchelservo,schnorchel

low schnorchelled ;schnorchelled aus

next

return

endif

 

adlesen:

readadc Verzoegerung,poti

poti=poti/10

readadc Endansch,endanschlag ;endanschlag lesen

endanschlag = endanschlag/10

endanschlag = 210-endanschlag ;wert auf 185-210 begrenzen

return