A MakeCode project
View the Project on GitHub cmiicbrg/microbit-car-unified-sender-and-receiver
In diesem Tutorial lernst du, wie du ein Fahrzeug mit dem Micro:bit steuern kannst. Dazu verwenden wir einen Motor und ein Motorshield (Motortreiber). Der Motortreiber ist die rote Platine, die auf dem Fahrzeug steckt. Der Motor wird mit dem Motortreiber verbunden und der Motortreiber wird mit dem Micro:bit verbunden. Das ist alles schon fertig auf dem Fahrzeug. Du musst, wenn es so weit ist, nur noch den Micro:bit in den Steckplatz stecken.
Wir haben für dich bereits eine Variable r und eine Funktion bestimmeRichtung erstellt. Die Funktion bestimmeRichtung bestimmt die Ausrichtung (Drehung) des Micro:bit. Dazu wird der Beschleunigungssensor verwendet. Die Variable r wird später verwendet, um die Richtung des Fahrzeugs zu steuern. Hier ist also noch nichts zu tun!
let r = 0
function bestimmeRichtung () {
// Wenn zu weit gedreht, wird sonst genau die entgegengesetzte Richtung gesetzt
if (input.acceleration(Dimension.Y) > 0) {
r = 180 * (Math.atan2(input.acceleration(Dimension.Y), -1 * input.acceleration(Dimension.X)) / Math.PI) - 90
}
}
Erstelle die Variablen vl und vr.
Die Variable r gibt es schon, sie wird für die Richtung verwendet. vl und vr werden für die Geschwindigkeit der linken und rechten Motoren verwendet.
Beim Starten ||basic:beim Start|| wird das Symbol SmallDiamond (kleiner Diamant) angezeigt und die Geschwindigkeit der Motoren auf 703 und die Richtung auf 0 gesetzt.
Außerdem musst du die Funkgruppe einstellen. Am besten du nimmst die selbe Zahl wie im vorherigen Tutorial.
let r = 0
let vl = 0
let vr = 0
basic.showIcon(IconNames.SmallDiamond)
vr = 703
vl = 703
radio.setGroup(134)
Wenn der Knopf A gedrückt wird, senden wir den Text “vor” über Funk. Wenn der Knopf B gedrückt wird, senden wir den Text “zurück” über Funk. Wenn das Logo gedrückt wird, senden wir den Text “stop” über Funk.
Außerdem verwenden wir Pfleile, um die Richtung anzuzeigen und das Icon SmallDiamond um anzuzeigen, dass das Fahrzeug gestoppt wurde.
input.onButtonPressed(Button.A, function () {
basic.showArrow(ArrowNames.North)
radio.sendString("vor")
})
input.onButtonPressed(Button.B, function () {
basic.showArrow(ArrowNames.South)
radio.sendString("zurück")
})
input.onLogoEvent(TouchButtonEvent.Pressed, function () {
basic.showIcon(IconNames.SmallDiamond)
radio.sendString("stop")
})
Um eine Funktion zu erstellen, klicke unter Fortgeschritten auf Funktionen und dann auf Erstelle eine Funktion.
Die Pins 0, 1, 8, 12 des Micro:bit sind mit den Eingängen des Motortreibers, die die Richtung der Motoren steuern, verbunden.
Um dem Motortreiber mitzuteilen, in welche Richtung die Motoren laufen sollen, müssen die Pins auf 1 oder 0 gesetzt werden.
Wie die Werte der Pins gesetzt werden müssen, um rückwärts fahren zu können, wirst du später selbst herausfinden (müssen).
function vor () {
pins.digitalWritePin(DigitalPin.P0, 1)
pins.digitalWritePin(DigitalPin.P1, 0)
pins.digitalWritePin(DigitalPin.P8, 0)
pins.digitalWritePin(DigitalPin.P12, 1)
basic.showArrow(ArrowNames.North)
}
function stop () {
pins.digitalWritePin(DigitalPin.P0, 0)
pins.digitalWritePin(DigitalPin.P1, 0)
pins.digitalWritePin(DigitalPin.P8, 1)
pins.digitalWritePin(DigitalPin.P12, 1)
basic.showIcon(IconNames.SmallDiamond)
}
function zurück () {
basic.showArrow(ArrowNames.South)
}
Auf Pin 14 und 13 des Micro:bit sind die Ausgänge des Motortreibers, die die Geschwindigkeit der Motoren steuern, verbunden.
function schreibeGeschwindigkeit () {
pins.analogWritePin(AnalogPin.P14, vr)
pins.analogWritePin(AnalogPin.P13, vl)
}
||functions:Aufruf vor|| findest du unter Fortgeschritten - Funktionen.
Usw.
radio.onReceivedString(function (receivedString) {
if (receivedString == "vor") {
vor()
} else if (receivedString == "zurück") {
zurück()
} else if (receivedString == "stop") {
stop()
}
})
// @hide
function vor () {
pins.digitalWritePin(DigitalPin.P0, 1)
pins.digitalWritePin(DigitalPin.P1, 0)
pins.digitalWritePin(DigitalPin.P8, 0)
pins.digitalWritePin(DigitalPin.P12, 1)
basic.showArrow(ArrowNames.North)
}
// @hide
function stop () {
pins.digitalWritePin(DigitalPin.P0, 0)
pins.digitalWritePin(DigitalPin.P1, 0)
pins.digitalWritePin(DigitalPin.P8, 1)
pins.digitalWritePin(DigitalPin.P12, 1)
basic.showIcon(IconNames.SmallDiamond)
}
// @hide
function zurück () {
basic.showArrow(ArrowNames.South)
}
Da sich später die Werte von vl und vr ständig ändern, schreiben wir sie fortlaufend. (||functions:bestimmeRichtung||)
Außerdem senden wir die Richtung r über Funk.
basic.forever(function () {
radio.sendNumber(r)
schreibeGeschwindigkeit()
})
// @hide
function schreibeGeschwindigkeit () {
pins.analogWritePin(AnalogPin.P14, vr)
pins.analogWritePin(AnalogPin.P13, vl)
}
Dein Fahrzeug sollte nun in der Lage sein vorwärts zu fahren und zu stoppen. Hole dir ein Fahrzeug, suche dir einen Partner, stellt die Funkgruppe ein und probiert es aus. Ein micro:bit steckt im Fahrzeug und der andere steuert es.
Die Richtung wird mit dem Beschleunigungssensor bestimmt. Dazu wird die Funktion bestimmeRichtung verwendet. Diese Funktion hat es schon von Anfang an gegeben, du musst sie also nicht neu erstellen.
Du musst aber dauerhaft um bestimmeRichtung ergänzen. (Erstelle keinesfalls einen neuen dauerhaft Block!)
function bestimmeRichtung () {
// Wenn zu weit gedreht, wird sonst genau die entgegengesetzte Richtung gesetzt
if (input.acceleration(Dimension.Y) > 0) {
r = 180 * (Math.atan2(input.acceleration(Dimension.Y), -1 * input.acceleration(Dimension.X)) / Math.PI) - 90
}
}
basic.forever(function () {
// @highlight
bestimmeRichtung()
radio.sendNumber(r)
schreibeGeschwindigkeit()
})
// @hide
function schreibeGeschwindigkeit () {
pins.analogWritePin(AnalogPin.P14, vr)
pins.analogWritePin(AnalogPin.P13, vl)
}
Die empfangene Zahl wird in die Geschwindigkeit umgerechnet und in die Variablen vl und vr geschrieben.
radio.onReceivedNumber(function (receivedNumber) {
// serial.writeValue("r", receivedNumber)
vr = Math.map(receivedNumber, -90, 90, 383, 1023)
vl = Math.map(-1 * receivedNumber, -90, 90, 383, 1023)
})
Das fertige Projekt sieht dann so aus:
let r = 0
let vl = 0
let vr = 0
basic.showIcon(IconNames.SmallDiamond)
vr = 703
vl = 703
radio.setGroup(134)
stop()
// @hide
function stop () {
pins.digitalWritePin(DigitalPin.P0, 0)
pins.digitalWritePin(DigitalPin.P1, 0)
pins.digitalWritePin(DigitalPin.P8, 1)
pins.digitalWritePin(DigitalPin.P12, 1)
basic.showIcon(IconNames.SmallDiamond)
}
input.onLogoEvent(TouchButtonEvent.Pressed, function () {
basic.showIcon(IconNames.SmallDiamond)
radio.sendString("stop")
})
radio.onReceivedNumber(function (receivedNumber) {
vr = Math.map(receivedNumber, -90, 90, 383, 1023)
vl = Math.map(-1 * receivedNumber, -90, 90, 383, 1023)
})
function vor () {
pins.digitalWritePin(DigitalPin.P0, 1)
pins.digitalWritePin(DigitalPin.P1, 0)
pins.digitalWritePin(DigitalPin.P8, 0)
pins.digitalWritePin(DigitalPin.P12, 1)
basic.showArrow(ArrowNames.North)
}
function stop () {
pins.digitalWritePin(DigitalPin.P0, 0)
pins.digitalWritePin(DigitalPin.P1, 0)
pins.digitalWritePin(DigitalPin.P8, 1)
pins.digitalWritePin(DigitalPin.P12, 1)
basic.showIcon(IconNames.SmallDiamond)
}
input.onButtonPressed(Button.A, function () {
basic.showArrow(ArrowNames.North)
radio.sendString("vor")
})
function zurück () {
basic.showArrow(ArrowNames.South)
}
radio.onReceivedString(function (receivedString) {
if (receivedString == "vor") {
vor()
} else if (receivedString == "zurück") {
zurück()
} else if (receivedString == "stop") {
stop()
}
})
input.onButtonPressed(Button.B, function () {
basic.showArrow(ArrowNames.South)
radio.sendString("zurück")
})
function bestimmeRichtung () {
// Wenn zu weit gedreht, wird sonst genau die entgegengesetzte Richtung gesetzt
if (input.acceleration(Dimension.Y) > 0) {
r = 180 * (Math.atan2(input.acceleration(Dimension.Y), -1 * input.acceleration(Dimension.X)) / Math.PI) - 90
}
}
function schreibeGeschwindigkeit () {
pins.analogWritePin(AnalogPin.P14, vr)
pins.analogWritePin(AnalogPin.P13, vl)
}
basic.forever(function () {
bestimmeRichtung()
radio.sendNumber(r)
schreibeGeschwindigkeit()
})
let r = 0
let vl = 0
let vr = 0
// @hide
basic.showIcon(IconNames.SmallDiamond)
// @hide
vr = 703
// @hide
vl = 703
// @hide
radio.setGroup(134)
// @hide
stop()
Zeigt einem Lehrer, dass euer Fahrzeug funktioniert und gebt euren Code ab.
# BlocksExistValidator
* enabled: true