Mit
einer Proportionalfernsteuerung kann man ein Modell mit beliebiger
Geschwindigkeit und beliebiger Richtung steuern. Jeder der beiden
Motoren kann stufenlos angesteuert werden. Meist verwendet man analoge
Kreuzpotis mit einem gemeinsamen Steuerknüppel für diesen Zweck. Hier
bietet sich jedoch eine andere Lösung an. Es wird der
3-Achsen-Beschleunigungssensor verwendet, sodass man die Steuerung über
die Neigung des Senders beeinflussen kann:
Neigung nach oben: Vorwärts
Neigung nach rechts: Rechtskurve
Neigung nach links: Linkskurve
Der
RC-Sender misst die Beschleunigung in x- und y-Richtung. Die Messwerte
reichen jeweils bis ca. 1000 mG. In einem mittleren Bereich bis
300 mG sollen die Motoren still stehen. Darüber hinaus werden sie
linear zur Neigung gesteuert. Jeder Motor erhält so einen Steuerwert
von 0% bis 99%. Beide Zahlen werden zu einer gemeinsamen Zahl
zusammengefügt, sodass 9999 für Geradeausfahrt steht oder 9970 für eine
Sanfte Kurve. Dieser kombinierte Zahlenwert wird dann an den Empfänger
gesendet. Dort wird die Zahl wieder zerlegt, sodass beide Motoren
getrennt gesteuert werden können. Mit etwas Übung lassen Fahrmodelle
mit zwei Motoren allein über die Neigung der Platine feinfühlig
steuern. Der Empfänger wurde mit einem separaten Programm
realisiert, um Timing-Probleme zwischen Sender und Empfänger zu
vermeiden. Der Empfänger bekommt die gesamte Rechenzeit um auf Daten
vom Sender zu reagieren.
Der RCsender
let M2 = 0
let M1 = 0
let Gy = 0
let Gx = 0
basic.forever(() => {
Gx = input.acceleration(Dimension.X)
Gy = input.acceleration(Dimension.Y)
if (Gy < 300) {
Gy = 0
}
M1 = 0
M2 = 0
if (Gx > 300) {
M1 = Gx
}
if (Gx < -300) {
M2 = Gx * -1
}
M1 = M1 + Gy
M1 = M1 / 10
M2 = M2 + Gy
M2 = M2 / 10
if (M1 > 99) {
M1 = 99
}
if (M2 > 99) {
M2 = 99
}
M2 = M2 * 100
M2 = M2 + M1
radio.sendNumber(M2)
basic.pause(100)
})
radio.setGroup(15)
radio.setTransmitPower(7)
Der RCempfänger
let Mo1 = 0
let t = 0
let Mo2 = 0
let D = 0
radio.onDataPacketReceived(({receivedNumber}) => {
D = receivedNumber
t = 0
})
basic.forever(() => {
Mo2 = D / 100
motors.dualMotorPower(Motor.A, Mo2)
Mo1 = D % 100
motors.dualMotorPower(Motor.B, Mo1)
basic.pause(100)
t = t + 1
if (t > 2) {
D = 0
}
})
radio.setGroup(15)
radio.setTransmitPower(7)
Elektronik-Labor Projekte Microbit