2,4GHz-Umbau für Helium-Hai

MaJa

User
Hallo zusammen,

ein unser Vereinsvorsitzender und mein langjähriger Kumpel (in Personalunion) hat einen Helium-Hai,
für alle die nicht wissen was das ist:
http://www.lightinthebox.com/de/rem...-80809630575&gclid=CKSRysOY48sCFcSRGwodg-IDkg

Das Problem: wenn er damit auf einer Modellbau-Messe rumfliegen will, ist die eingebaute 27MHz-Tippanlage schnell an ihrer Grenze, allein wegen den anderen vielen Spielzeugen dort.

Seine Idee: Umbau auf 2,4GHz
Herausforderung: darf quasi nichts zusätzlich wiegen

Lösungen:
Akku: ein kleiner 1s
Flosse: kleines Servo
Empfänger: Spektrum indoor

Problem: für die Höhe/Tiefe wird der Schwerpunkt mit einem kleinen Spindelmotor verschoben,
eine dafür passende und leichte Elektronik war nicht da!
 

MaJa

User
der Antrieb

der Antrieb

Die ganze Einheit ist so gewichtsoptimiert das man nicht einfach etwas aus der Kiste zum Tauschen findet,
also sollte die Mechanik und der Motor bleiben.

mit einigen Messungen waren schnell mal folgende Eckparameter ermittelt.
Der Motor läuft bei ca. 1,6V und mit etwa 50mA in der gewünschten Geschwindigkeit.

Dann kam die Idee einen kleinen Atmel-µC zu nehmen, den erforderlichen Strom durch Paralleschaltung von Ausgängen zu treiben, und die Spannungsanpassung von 1s zu 1,6V mit Vorwiderständen zu erledigen, diese sollen auch gleich die gerechte Lastverteilung auf die einzelnen Ausgänge übernehmen:

schematic2.jpg
 

MaJa

User
Das Programm

Das Programm

Da wegen fehlendem Poti/Sensor die konkrete Position nicht bekannt ist soll weiterhin nur im Tippbetrieb gefahren werden.
Weil der interne Oszilator nicht sehr genau ist und damit der Motor in der Mitte wirklich steht wird ein relativ grosser Totbereich rund um die Mitte gebraucht. um ggf. bei der Ausgabe noch Korrekturen vornehmen zu können sollten die Augänge mit einer Art einfacher PWM etwas proportional gesteuert werden können, so könnte zumindest mit den Servowegen die beiden Richtungen noch etwas angepasst werden.

Hier mal die recht simple Lösung, war ausreichend gut und hat alle Anforderungen erfüllt:

#define _Msk_Motor_D 0b00111100
#define _Msk_Motor_B 0b00001111
#define _Signal_In_D 6
#define F_CPU 1000000UL // Systemtakt 1 MHz (Fuse CKDIV8)

int16_t Time_0; // [µs] Start-Zeit für Zeitmessung
int16_t Time_Diff; // [µs] Ergebnis Zeitmessung
int16_t Impuls; // [µs] Sollzeit für Impuls-Ausgabe

/* -------------------------------------------------------------------------------------
Hauptprogramm : Servo-Schalter
--------------------------------------------------------------------------------------*/
#define _Servo_Mitte_us 1520 // [µs] Servomitte
#define _Servo_Min_us 100 // [µs] +/- Nullbereich
#define _Servo_Max_us 800 // [µs] Maximalweg für einen gültigen Impuls (720..1520..2320)

void fu_Motor(int8_t p)
{
switch (p)
{
case -1:
PORTD &= ~(_Msk_Motor_D); // Motor-Ausgänge = 0
PORTB |= _Msk_Motor_B; // Motor-Ausgänge = 1
DDRB |= _Msk_Motor_B; // setzt Port-Pins als Ausgänge
DDRD |= _Msk_Motor_D; // setzt Port-Pins als Ausgänge
break;
case 0:
DDRD &= ~(_Msk_Motor_D); // setzt Port-Pins als Eingänge
DDRB &= ~(_Msk_Motor_B); // setzt Port-Pins als Eingänge
break;
case 1:
PORTB &= ~(_Msk_Motor_B); // Motor-Ausgänge = 0
PORTD |= _Msk_Motor_D; // Motor-Ausgänge = 1
DDRB |= _Msk_Motor_B; // setzt Port-Pins als Ausgänge
DDRD |= _Msk_Motor_D; // setzt Port-Pins als Ausgänge
break;
}
}

int main(void)
{ // ================= Initialisierung ===================

// ------ Port D (Taster1/2/3/4 und EIN_TASTER) ------
DDRD &= ~(1<<_Signal_In_D); // definiert Port-Pin für Signal_In als Eingang
fu_Motor(0);

// -------- Timer1 für interne Zeitmessung --------- // Timer1 ist ein 16Bit Timer
TCCR1B |= (0<<CS12) | (0<<CS11) | (1<<CS10); // Vorteiler=1; CLK=1.000.000 Hz : 1 ==> 1 MHz (1µs)
TCNT1 = 0xFFFF; // Normal-Mode (0..0xFFFF)

while(1)
{
fu_Motor(0); // Motor=AUS
while(!( PIND & (1<<_Signal_In_D))); // Steigende Flanke
Time_0 = TCNT1; // Timer merken
while( ( PIND & (1<<_Signal_In_D)) && ((TCNT1-Time_0) < 2500) ); // Fallende Flanke
Time_Diff = TCNT1-Time_0; // ZeitMessung Signal_In
Time_0 = TCNT1; // Timer merken

if ( (Time_Diff > (_Servo_Mitte_us - _Servo_Max_us)) // > 720
&& (Time_Diff < (_Servo_Mitte_us - _Servo_Min_us)) // < 1420
) {
Impuls = (_Servo_Mitte_us - Time_Diff) << 5; // Faktor = 32, // 100% = 500 µs --> 16ms Puls alle 20 ms
fu_Motor(-1); // Motor in neg. Richtung starten
}
else if ( (Time_Diff > (_Servo_Mitte_us + _Servo_Min_us)) // > 1620
&& (Time_Diff < (_Servo_Mitte_us + _Servo_Max_us)) // < 2320
) {
Impuls = ( Time_Diff - _Servo_Mitte_us ) << 5; // Faktor = 32, // 100% = 500 µs --> 16ms Puls alle 20 ms
fu_Motor(1); // Motor in pos. Richtung starten
}
else Impuls = 0;
if(Impuls > 14000) Impuls = 14000;
if(Impuls) while ((TCNT1 - Time_0) < Impuls); // ggf. auf Timer-Ende warten
}
}
 

MaJa

User
Formatierung des Programmes

Formatierung des Programmes

sorry wegen der schlechten Lesbarkeit, als Bild war die Quelle zu lang und wie ich eine c-Datei mit anhängen kann habe ich noch nicht gefunden.

Für Feedback und Fragen bin ich offen und dankbar,
auf Wunsch sende ich auch gern die Quellen zu.
 

MaJa

User
Fertige Lösungen

Fertige Lösungen

Einfach fertige Komponenten nehmen war auch meine erste Idee, hatte ich vergessen zu erwähnen.
Dazu habe ich auch einige Versuche unternommen. Das Hauptproblem dabei war immer das fehlende Poti auf der einen Achse, dadurch ging es nicht mit den netten kleinen und leichten Elektroniken der Servos einem stabilen Stop in der Mitte hin zu bekommen, und geeignete Regler mit Rückwärtsgang waren alle viel zu schwer.
Die gebaute Schaltung macht ja quasi nichts anderes als ein Vor-Stop-Rück-Gleichstromregler kleiner Leistung.
 

MaJa

User
für LED's gehts natürlich auch!

für LED's gehts natürlich auch!

Natürlich kann man diese Schaltung auch 1:1 als Ansteuerung für LED's nehmen, sogar mit Dimm-Funktion, je nach Aussteuerung in Plus und Minus, so habe ich die Schaltung auf dem Tisch auch getestet bei Programmieren.
Der IC kostet etwa einen Euro, der Rest liegt in fast jeder Bastelkiste, und eine Leiterplatte braucht man auch nicht wirklich dafür. Schrumpfschlauch oder einfach Tesa ist das Gehäuse von heute.
 
Ansicht hell / dunkel umschalten
Oben Unten