Compare commits

...

34 Commits

Author SHA1 Message Date
c157b4d922 0.0.106 2018-02-22 10:18:13 -08:00
0837123828 bumping pxt 2018-02-22 10:15:58 -08:00
e51a32b69f use full motor names (#338) 2018-02-22 10:03:25 -08:00
029066000d updated style 2018-02-22 08:28:42 -08:00
7e35abeff3 lock on 0.0.104 2018-02-22 06:54:18 -08:00
0166785c1b 0.0.105 2018-02-22 06:36:41 -08:00
ea0f6a4734 updated pxt 2018-02-22 06:36:26 -08:00
271721561d turn sample into blocks 2018-02-21 22:39:35 -08:00
ed8f8bafa7 Add 'infrared beacon' api topics (#330)
* Add 'infrared beacon' api topics

* Include note about channel selection
2018-02-21 22:35:51 -08:00
8cfb70c97b Threshold api docs - 01 (#336)
* Local commit

* Throw on more topics

* Throw in threshold topics for infrared
2018-02-21 22:35:25 -08:00
84c8e31ff5 First burst of 'color' pages (#335)
* Add 'color sensor' api topics

* Last set of edits/adds
2018-02-21 14:03:55 -08:00
ceb9b7fabf 0.0.104 2018-02-21 06:45:29 -08:00
9e0670551f upgrading pxt 2018-02-21 06:45:14 -08:00
6613607503 Make it comm lesson (#331)
* integrating lego lesson

* fixed link

* adding various solutions

* updatring to 3.4.6

* using play sound effect until done

* revert pxtversion

* fixing link
2018-02-21 06:43:53 -08:00
3a67190914 Add some 'infrared' api docs (#326)
* Add some 'infrared' api docs

* Fix display messages

* Change discussion of distance to relative

* Include motor speed note
2018-02-20 10:38:41 -08:00
05e916e247 0.0.103 2018-02-19 07:35:38 -08:00
fad4ca98db renaming 'set speed' to 'run' (#327) 2018-02-19 07:35:08 -08:00
3b6cfed5b2 added distance measurer 2018-02-15 13:56:50 -08:00
472ea170d0 fixing default light 2018-02-15 13:49:04 -08:00
80f24948ec 0.0.102 2018-02-14 16:05:40 -08:00
daa88b299d replacing loops.pause -> pause, loops.forever -> forever 2018-02-14 16:05:31 -08:00
0384eb4d9d upgrading common packages 2018-02-14 15:59:08 -08:00
f33f88e87c fixing struture 2018-02-14 11:20:56 -08:00
239827c259 0.0.101 2018-02-14 11:06:56 -08:00
cd0097749a updated readme 2018-02-14 11:00:12 -08:00
94db31beb7 bring back the shims 2018-02-14 10:56:50 -08:00
408631d426 upgrading common packages 2018-02-14 10:32:09 -08:00
2407e7e179 0.0.100 2018-02-14 10:16:57 -08:00
f63b447fee upgraded to v3.4.3 2018-02-14 10:16:27 -08:00
bbd1a9d215 Merge branch 'master' of https://github.com/microsoft/pxt-ev3 2018-02-14 10:15:28 -08:00
cfc4688fbe adding targetconfig to package 2018-02-14 09:49:47 -08:00
24d48c0171 update firmware url 2018-02-14 09:36:20 -08:00
523c507c35 Projectupdate1 (#325)
* integrating test lesson from lego

* adding side card annotations
2018-02-14 08:56:12 -08:00
d6cbbcc3d9 support for importing urls 2018-02-13 21:41:49 -08:00
136 changed files with 8206 additions and 5392 deletions

2
.gitignore vendored
View File

@ -17,8 +17,6 @@ clients/**/bin/**
clients/**/obj/**
clients/electron/projects
libs/**/_locales/**
libs/**/shims.d.ts
libs/**/enums.d.ts
videos/**

View File

@ -2,7 +2,7 @@
[![Build Status](https://ci2.dot.net/buildStatus/icon?job=Private/pxt_project_rainbow/master/pxt-ev3_Push)](https://ci2.dot.net/job/Private/job/pxt_project_rainbow/job/master/job/pxt-ev3_Push/)
This repo contains the editor target hosted at https://d541eec2-1e96-4b7b-a223-da9d01d0337a.pxt.io/
This repo contains the editor target hosted at https://makecode.legoeducation.com
LEGO Auth: https://src.education.lego.com/groups/ev3-makecode (use Google Authenticator)
LEGO Chat: https://chat.internal.education.lego.com/make-code/channels/town-square
@ -11,7 +11,7 @@ LEGO Chat: https://chat.internal.education.lego.com/make-code/channels/town-squa
These instructions assume familiarity with dev tools and languages.
* install Node.js 6+
* install Node.js 8.9.4+
* install Docker; make sure `docker` command is in your `PATH`
* (optional) install [Visual Studio Code](https://code.visualstudio.com/)
@ -58,12 +58,6 @@ cd libs/core
pxt deploy
```
### Hosted editor
Currently hosted at:
https://d541eec2-1e96-4b7b-a223-da9d01d0337a.pxt.io/
### Jenkins build
https://ci2.dot.net/job/Private/job/pxt_project_rainbow/job/master/

View File

@ -2,14 +2,30 @@
## Projects #projects
* [Getting Started](/getting-started)
* [Try](/getting-started/try)
* [Use](/getting-started/use)
* [Coding](/coding)
* [Autonomous Parking](/coding/autonomous-parking)
* [Object Detection](/coding/object-detection)
* [Line Following](/coding/line-following)
* [Design Engineering](/design-engineering)
* [Make It Move Without Wheels](/design-engineering/make-it-move)
* [Make It Smarter and Faster](/design-engineering/make-it-faster)
* [Make a System that Communicates](/design-engineering/make-it-communicate)
* [Maker](/maker)
* [Sound Machine](/maker/sound-machine)
* [Make a Sound Machine](/maker/sound-machine)
* [Examples](/examples)
* [Make it move](/lessons/make-it-move)
* [Line detection](/lessons/line-detection)
* [Sound of Color](/maker/sound-of-color)
* [Security Gadget](/maker/security-gadget)
* [Intruder detector](/maker/intruder-detector)
* [Puppet](/maker/puppet)
* [Coding](/coding)
* [Three Point Turn 1](/coding/three-point-turn-1)
* [Three Point Turn 2](/coding/three-point-turn-2)
* [Three Point Turn 3](/coding/three-point-turn-3)
@ -34,10 +50,6 @@
* [Roaming 1](/coding/roaming-1)
* [Roaming 2](/coding/roaming-2)
* [Lessons](/lessons)
* [Make it move](/lessons/make-it-move)
* [Line detection](/lessons/line-detection)
## Reference #reference
* [Reference](/reference)
@ -55,7 +67,7 @@
* [set light](/reference/brick/set-status-light)
* [battery level](/reference/brick/battery-level)
* [Motors](/reference/motors)
* [set speed](/reference/motors/motor/set-speed)
* [run](/reference/motors/motor/run)
* [stop](/reference/motors/motor/stop)
* [reset](/reference/motors/motor/reset)
* [set brake](/reference/motors/motor/set-brake)
@ -67,7 +79,7 @@
* [angle](/reference/motors/motor/angle)
* [speed](/reference/motors/motor/speed)
* [clear counts](/reference/motors/motor/clear-counts)
* [stop all motors](/reference/motors/stop-all-motors)
* [stop all motors](/reference/motors/stop-all)
* [Sensors](/reference/sensors)
* [Touch](/reference/sensors/touch-sensor)
* [on event](/reference/sensors/touch-sensor/on-event)
@ -79,6 +91,23 @@
* [rate](/reference/sensors/gyro/rate)
* [reset](/reference/sensors/gyro/reset)
* [Ultrasonic](/reference/sensors/ultrasonic)
* [on event](/reference/sensors/ultrasonic/on-event),
* [distance](reference/sensors/ultrasonic/distance),
* [pause until](reference/sensors/ultrasonic/pause-until)
* [on event](/reference/sensors/ultrasonic/on-event)
* [distance](reference/sensors/ultrasonic/distance)
* [pause until](reference/sensors/ultrasonic/pause-until)
* [Infrared](/reference/sensors/infrared)
* [on event](/reference/sensors/infrared/on-event)
* [distance](reference/sensors/infrared/proximity)
* [pause until](reference/sensors/infrared/pause-until)
* [Infrared beacon](/reference/sensors/beacon)
* [on event](/reference/sensors/beacon/on-event)
* [pause until](/reference/sensors/beacon/pause-until)
* [is pressed](/reference/sensors/beacon/is-pressed)
* [was pressed](/reference/sensors/beacon/was-pressed)
* [set remote channel](/reference/sensors/beacon/set-remote-channel)
* [Color](/reference/sensors/color-sensor)
* [on color detected](/reference/sensors/color-sensor/on-color-detected)
* [pause for color](/reference/sensors/color-sensor/pause-for-color)
* [on light changed](/reference/sensors/color-sensor/on-light-changed)
* [pause for light](/reference/sensors/color-sensor/pause-for-light)
* [color](/reference/sensors/color-sensor/color)
* [light](/reference/sensors/color-sensor/ambient-light)

View File

@ -8,12 +8,12 @@ You can program the @boardname@ using [Blocks](/blocks) or [JavaScript](/javascr
```blocks
brick.buttonEnter.onEvent(ButtonEvent.Bumped, () => {
motors.largeA.setSpeed(50)
motors.largeA.run(50)
})
```
```typescript
brick.buttonEnter.onEvent(ButtonEvent.Bumped, () => {
motors.largeA.setSpeed(50)
motors.largeA.run(50)
})
```
@ -34,6 +34,6 @@ The simulator has support for the LED screen, buttons, as well as compass, accel
```sim
brick.buttonEnter.onEvent(ButtonEvent.Bumped, () => {
motors.largeA.setSpeed(50)
motors.largeA.run(50)
})
```

View File

@ -3,6 +3,6 @@
### #specific
```cards
loops.forever(() => {});
loops.pause(0)
forever(() => {});
pause(0)
```

View File

@ -1,171 +1,24 @@
# Coding Activites
12 computer science activities, with cross-curricular opportunities in design and technology, science, and math.
* [Download Curriculum Materials](https://education.lego.com/en-us/downloads/mindstorms-ev3)
## Three Point Turn
## Projects
```codecard
[
{
"name": "Three Point Turn 1",
"description": "Activity 1",
"url":"/coding/three-point-turn-1",
"cardType": "example"
"name": "Autonomous Parking",
"description": "TBD",
"url":"/coding/autonomous-parking",
"cardType": "side"
}, {
"name": "Three Point Turn 2",
"description": "Activity 2",
"url":"/coding/three-point-turn-2",
"cardType": "example"
"name": "Object Detection",
"description": "TBD",
"url":"/coding/object-detection",
"cardType": "side"
}, {
"name": "Three Point Turn 3",
"description": "Activity 3",
"url":"/coding/three-point-turn-3",
"cardType": "example"
}]
```
## Reversing the robot
```codecard
[{
"name": "Reversing the robot 1",
"description": "Activity 1",
"url":"/coding/reversing-the-robot-1",
"cardType": "example"
}, {
"name": "Reversing the robot 2",
"description": "Activity 2",
"url":"/coding/reversing-the-robot-2",
"cardType": "example"
}, {
"name": "Reversing the robot 3",
"description": "Activity 3",
"url":"/coding/reversing-the-robot-3",
"cardType": "example"
}]
```
## Light the way
```codecard
[{
"name": "Light the way 1",
"description": "Activity 1",
"url":"/coding/light-the-way-1",
"cardType": "example"
}, {
"name": "Light the way 2",
"description": "Activity 2",
"url":"/coding/light-the-way-2",
"cardType": "example"
}, {
"name": "Light the way 3",
"description": "Activity 3",
"url":"/coding/light-the-way-3",
"cardType": "example"
}
]
```
## Traffic Lights
```codecard
[{
"name": "Traffic Lights 1",
"description": "Activity 1",
"url":"/coding/traffic-lights-1",
"cardType": "example"
}, {
"name": "Traffic Lights 2",
"description": "Activity 2",
"url":"/coding/traffic-lights-2",
"cardType": "example"
}, {
"name": "Traffic Lights 3",
"description": "Activity 3",
"url":"/coding/traffic-lights-3",
"cardType": "example"
}
]
```
## Reverse Bepper
```codecard
[{
"name": "Reverse Beeper 1",
"description": "Activity 1",
"url":"/coding/reverse-beeper-1",
"cardType": "example"
}, {
"name": "Reverse Beeper 2",
"description": "Activity 2",
"url":"/coding/reverse-beeper-2",
"cardType": "example"
}, {
"name": "Reverse Beeper 3",
"description": "Activity 3",
"url":"/coding/reverse-beeper-3",
"cardType": "example"
}]
```
## Ignition
```codecard
[{
"name": "Ignition 1",
"description": "Activity 1",
"url":"/coding/ingition-1",
"cardType": "example"
}, {
"name": "Ignition 2",
"description": "Activity 2",
"url":"/coding/ignition-2",
"cardType": "example"
}, {
"name": "Ignition 3",
"description": "Activity 3",
"url":"/coding/ignition-3",
"cardType": "example"
}]
```
## Cruise Control
```codecard
[{
"name": "Cruise Control 1",
"description": "Activity 1",
"url":"/coding/cruise-control-1",
"cardType": "example"
}, {
"name": "Cruise Control 2",
"description": "Activity 2",
"url":"/coding/cruise-control-2",
"cardType": "example"
}, {
"name": "Cruise Control 3",
"description": "Activity 3",
"url":"/coding/cruise-control-3",
"cardType": "example"
}]
```
## Roaming
```codecard
[{
"name": "Roaming 1",
"description": "Activity 1",
"url":"/coding/roaming-1",
"cardType": "example"
}, {
"name": "Roaming 2",
"description": "Activity 2",
"url":"/coding/roaming-2",
"cardType": "example"
"name": "Line Following",
"description": "TBD",
"url":"/coding/line-following",
"cardType": "side"
}]
```

View File

@ -5,6 +5,6 @@ let speed = 0;
sensors.touch1.onEvent(ButtonEvent.Pressed, function () {
if (speed < 100)
speed = speed + 10;
motors.largeBC.setSpeed(speed);
motors.largeBC.run(speed);
})
```

View File

@ -5,11 +5,11 @@ let speed = 0;
sensors.touch1.onEvent(ButtonEvent.Pressed, function () {
if (speed < 100)
speed = speed + 10;
motors.largeBC.setSpeed(speed);
motors.largeBC.run(speed);
})
sensors.touch2.onEvent(ButtonEvent.Pressed, function () {
if (speed > -100)
speed = speed - 10;
motors.largeBC.setSpeed(speed);
motors.largeBC.run(speed);
})
```

View File

@ -15,7 +15,7 @@ function accelerate() {
function update() {
brick.clearScreen()
brick.showString("speed: " + speed, 1)
motors.largeBC.setSpeed(speed)
motors.largeBC.run(speed)
}
sensors.touch2.onEvent(ButtonEvent.Pressed, function () {
accelerate()

View File

@ -7,6 +7,6 @@ while (true) {
music.playSoundEffectUntilDone(sounds.mechanicalMotorStart)
music.playSoundEffectUntilDone(sounds.mechanicalMotorIdle);
}
loops.pause(1);
pause(1);
}
```

View File

@ -8,6 +8,6 @@ while (true) {
music.playSoundEffectUntilDone(sounds.mechanicalMotorStart)
music.playSoundEffectUntilDone(sounds.mechanicalMotorIdle);
}
loops.pause(1);
pause(1);
}
```

View File

@ -3,7 +3,7 @@
```blocks
sensors.color3.onLightChanged(LightIntensityMode.Ambient, LightCondition.Dark, function () {
brick.showImage(images.objectsLightOn)
loops.pause(5000)
pause(5000)
brick.clearScreen()
})
```

View File

@ -1,11 +1,11 @@
# Reverse Beeper Activity 1
```blocks
loops.forever(function () {
forever(function () {
music.playTone(440, sensors.ultrasonic4.distance());
loops.pause(50)
pause(50)
})
motors.largeBC.setSpeed(-20);
motors.largeBC.run(-20);
sensors.ultrasonic4.pauseUntil(UltrasonicSensorEvent.ObjectNear);
motors.largeBC.stop();
```

View File

@ -1,13 +1,13 @@
# Reverse Beeper Activity 2
```blocks
loops.forever(function () {
forever(function () {
if (motors.largeB.speed() != 0 && sensors.ultrasonic4.distance() < 20) {
music.playTone(440, sensors.ultrasonic4.distance());
loops.pause(50)
pause(50)
}
})
motors.largeBC.setSpeed(-20);
motors.largeBC.run(-20);
sensors.ultrasonic4.pauseUntil(UltrasonicSensorEvent.ObjectNear);
motors.largeBC.stop();
```

View File

@ -4,7 +4,7 @@
let beep = false
beep = true
control.runInParallel(function () {
motors.largeBC.setSpeed(-20)
motors.largeBC.run(-20)
sensors.ultrasonic4.pauseUntil(UltrasonicSensorEvent.ObjectNear)
motors.largeBC.stop()
beep = false
@ -13,7 +13,7 @@ control.runInParallel(function () {
while (beep) {
if (sensors.ultrasonic4.distance() < 20) {
music.playTone(440, sensors.ultrasonic4.distance())
loops.pause(50)
pause(50)
}
}
})

View File

@ -2,13 +2,13 @@
```blocks
brick.buttonEnter.onEvent(ButtonEvent.Bumped, function () {
motors.largeBC.setSpeed(50)
motors.largeBC.run(50)
sensors.touch1.pauseUntil(ButtonEvent.Pressed)
motors.largeBC.setSpeed(0)
loops.pause(1000)
motors.largeBC.run(0)
pause(1000)
brick.setStatusLight(StatusLight.OrangeFlash)
motors.largeBC.setSpeed(-50)
loops.pause(2000)
motors.largeBC.setSpeed(0)
motors.largeBC.run(-50)
pause(2000)
motors.largeBC.run(0)
})
```

View File

@ -3,13 +3,13 @@
```blocks
brick.buttonEnter.onEvent(ButtonEvent.Bumped, function () {
sensors.touch1.pauseUntil(ButtonEvent.Pressed)
motors.largeBC.setSpeed(50)
motors.largeBC.run(50)
sensors.touch2.pauseUntil(ButtonEvent.Pressed)
motors.largeBC.setSpeed(0)
loops.pause(1000)
motors.largeBC.run(0)
pause(1000)
brick.setStatusLight(StatusLight.OrangeFlash)
motors.largeBC.setSpeed(-50)
loops.pause(2000)
motors.largeBC.setSpeed(0)
motors.largeBC.run(-50)
pause(2000)
motors.largeBC.run(0)
})
```

View File

@ -5,15 +5,15 @@ brick.buttonEnter.onEvent(ButtonEvent.Bumped, function () {
brick.showImage(images.eyesSleeping)
sensors.touch1.pauseUntil(ButtonEvent.Pressed)
brick.showImage(images.eyesNeutral)
motors.largeBC.setSpeed(50)
motors.largeBC.run(50)
sensors.touch2.pauseUntil(ButtonEvent.Pressed)
brick.showImage(images.eyesTiredMiddle)
motors.largeBC.setSpeed(0)
loops.pause(1000)
motors.largeBC.run(0)
pause(1000)
brick.setStatusLight(StatusLight.OrangeFlash)
brick.showImage(images.eyesDizzy)
motors.largeBC.setSpeed(-50)
loops.pause(2000)
motors.largeBC.setSpeed(0)
motors.largeBC.run(-50)
pause(2000)
motors.largeBC.run(0)
})
```

View File

@ -15,17 +15,17 @@ brick.buttonDown.onEvent(ButtonEvent.Bumped, function () {
drive.push(5)
})
pauseUntil(() => drive.length >= 5)
loops.pause(1000)
pause(1000)
music.playSoundEffectUntilDone(sounds.communicationGo)
for (let d of drive) {
if (d == 1) {
motors.largeC.setSpeed(50, 360, MoveUnit.Degrees)
motors.largeC.run(50, 360, MoveUnit.Degrees)
} else if (d == 3) {
motors.largeB.setSpeed(50, 360, MoveUnit.Degrees)
motors.largeB.run(50, 360, MoveUnit.Degrees)
} else if (d == 4) {
motors.largeBC.setSpeed(50, 360, MoveUnit.Degrees)
motors.largeBC.run(50, 360, MoveUnit.Degrees)
} else {
motors.largeBC.setSpeed(-50, 360, MoveUnit.Degrees)
motors.largeBC.run(-50, 360, MoveUnit.Degrees)
}
}
music.playSoundEffectUntilDone(sounds.communicationGameOver)

View File

@ -19,17 +19,17 @@ brick.buttonDown.onEvent(ButtonEvent.Bumped, function () {
music.playSoundEffectUntilDone(sounds.systemClick)
})
brick.buttonEnter.pauseUntil(ButtonEvent.Bumped);
loops.pause(1000)
pause(1000)
music.playSoundEffectUntilDone(sounds.communicationGo)
for (let d of drive) {
if (d == 1) {
motors.largeC.setSpeed(50, 360, MoveUnit.Degrees)
motors.largeC.run(50, 360, MoveUnit.Degrees)
} else if (d == 3) {
motors.largeB.setSpeed(50, 360, MoveUnit.Degrees)
motors.largeB.run(50, 360, MoveUnit.Degrees)
} else if (d == 4) {
motors.largeBC.setSpeed(50, 360, MoveUnit.Degrees)
motors.largeBC.run(50, 360, MoveUnit.Degrees)
} else {
motors.largeBC.setSpeed(-50, 360, MoveUnit.Degrees)
motors.largeBC.run(-50, 360, MoveUnit.Degrees)
}
}
music.playSoundEffectUntilDone(sounds.communicationGameOver)

View File

@ -3,10 +3,10 @@
```blocks
brick.buttonEnter.onEvent(ButtonEvent.Bumped, function () {
motors.largeBC.tank(75, 30)
loops.pause(1500)
pause(1500)
motors.largeBC.tank(-30, -75)
loops.pause(1000)
pause(1000)
motors.largeBC.tank(50, 50)
loops.pause(3000)
pause(3000)
})
```

View File

@ -3,12 +3,12 @@
```blocks
brick.buttonEnter.onEvent(ButtonEvent.Bumped, function () {
motors.largeBC.tank(75, 30)
loops.pause(1500)
pause(1500)
motors.largeBC.tank(-30, -75)
sensors.ultrasonic4.pauseUntil(UltrasonicSensorEvent.ObjectNear);
motors.largeBC.tank(0, 0)
loops.pause(1000)
pause(1000)
motors.largeBC.tank(50, 50)
loops.pause(3000)
pause(3000)
})
```

View File

@ -3,13 +3,13 @@
```blocks
brick.buttonEnter.onEvent(ButtonEvent.Bumped, function () {
motors.largeBC.tank(75, 30)
loops.pause(1500)
pause(1500)
motors.largeBC.tank(-30, -75)
sensors.ultrasonic4.pauseUntil(UltrasonicSensorEvent.ObjectNear);
motors.largeBC.tank(0, 0)
music.playSoundEffect(sounds.animalsDogBark1)
loops.pause(1000)
pause(1000)
motors.largeBC.tank(50, 50)
loops.pause(3000)
pause(3000)
})
```

View File

@ -1,7 +1,7 @@
# Traffic Lights Activity 3
```blocks
loops.forever(function () {
forever(function () {
if (sensors.color3.light(LightIntensityMode.Reflected) < 15) {
motors.largeBC.tank(30, 12)
} else {

View File

@ -0,0 +1,29 @@
# Design Engineering Projects
## Projects
```codecard
[
{
"name": "Make It Move Without Wheels",
"description": "TBD",
"imageUrl": "/static/lessons/make-it-move.png",
"url": "/design-engineering/make-it-move",
"cardType": "side"
},
{
"name": "Make It Smarter and Faster",
"description": "TBD",
"imageUrl": "/static/lessons/make-it-smarter.png",
"url": "/design-engineering/make-it-move",
"cardType": "side"
},
{
"name": "Make a System that Communicates",
"description": "A robot that tells you what it is doing.",
"imageUrl": "/static/lessons/make-it-communicate.png",
"url": "/design-engineering/make-it-communicate",
"cardType": "side"
}
]
```

View File

@ -0,0 +1,164 @@
# Make A System That Communicates
## Connect
### Design Brief
Design, build and program a robotic system that follows a path and communicates its position at least twice along the way.
https://www.youtube.com/watch?v=6piMI1JPDQc
* Robotic systems are built from smaller, related subsystems. Look at the automobile system shown in the video. What subsystems can you see?
* What kinds of robots follow a path?
* What kind of system do you want to make?
### Brainstorm
Discuss different solutions to the design brief.
Think about:
* What kind of motorized mechanism can be used to control the movements of a robot?
* How can the robot sense where it is along the path?
* How can the robot communicate its position?
![EV3 + LEGO Bricks](/static/lessons/make-it-communicate/hero.png)
## Construct
### Build
You can start by tinkering with the LEGO elements in the picture and then build on.
More building ideas:
* [EV3 Frames](https://le-www-live-s.legocdn.com/sc/media/files/support/mindstorms%20ev3/building-instructions/design%20engineering%20projects/ev3%20frames-5054ee378e624fb4cb31158d2fc8e5cf.pdf)
* [Tracks](https://le-www-live-s.legocdn.com/sc/media/files/support/mindstorms%20ev3/building-instructions/design%20engineering%20projects/tracks-32d7554813af3f25cf5012d54a4bad2b.pdf)
* [Color Sensor 2](https://le-www-live-s.legocdn.com/sc/media/files/support/mindstorms%20ev3/building-instructions/design%20engineering%20projects/color%20sensor_v2-e7fd54b6fa3cdfe36f414c1d2510f9cb.pdf)
Build a path for your robot to follow. You can use electrical tape on a floor, or marker on paper. You can use objects as milestones to indicate a path that can be detected by either the Touch Sensor, Color Sensor, or Ultrasonic Sensor.
## Program
Before you program, think about:
* How will you program the robot to follow a path?
* How will you program the robot to communicate its position?
* Which programming blocks will you use?
### ~ hint
Explore the different Motor and Sensor blocks in the programming menu.
### ~
### Sample Solution
[Video: EV3 Track Rover](/static/lessons/make-it-communicate/trackrover.mp4)
The Track Rover follows a path using the color sensor. It identifies two locations by color.
[Building Instructions](https://le-www-live-s.legocdn.com/sc/media/lessons/mindstorms-ev3/ev3-dep/building%20instructions/track-rover-bi-6aadb1b053df0c58a0dea108b5ce0eea.pdf)
### Sample Program Solution
This program works with the Track Rover. If you create a different robot, adjust the program to fit your solution.
#### Program summary:
* If the Color Sensor sees black, Motor B runs at -50 power and Motor C turns off.
* If the Color Sensor sees white, Motor B turns off and Motor C runs at -50 power.
* If the Color Sensor sees green, all motors stop and the green sound plays.
* The robot waits one second, then motors move forward.
* If the Color Sensor sees red, all motors stop, and the red sound plays.
* The robot waits one second, then motors move forward.
* Loops unlimited.
```blocks
forever(function () {
if (sensors.color3.color() == ColorSensorColor.Black) {
motors.largeB.run(-50)
motors.largeC.run(0)
} else if (sensors.color3.color() == ColorSensorColor.White) {
motors.largeC.run(-50)
motors.largeB.run(0)
} else if (sensors.color3.color() == ColorSensorColor.Green) {
motors.stopAll()
music.playSoundEffectUntilDone(sounds.colorsGreen)
motors.largeBC.run(-50)
} else if (sensors.color3.color() == ColorSensorColor.Red) {
motors.stopAll()
music.playSoundEffectUntilDone(sounds.colorsRed)
motors.largeBC.run(-50)
} else {
}
})
```
```blocks
sensors.color3.onColorDetected(ColorSensorColor.Black, function () {
motors.largeB.run(-50)
motors.largeC.run(0)
})
sensors.color3.onColorDetected(ColorSensorColor.White, function () {
motors.largeB.run(0)
motors.largeC.run(-50)
})
sensors.color3.onColorDetected(ColorSensorColor.Green, function () {
motors.stopAll()
music.playSoundEffect(sounds.colorsGreen)
pause(1000)
motors.largeBC.run(-50)
})
sensors.color3.onColorDetected(ColorSensorColor.Red, function () {
motors.stopAll()
music.playSoundEffect(sounds.colorsRed)
pause(1000)
motors.largeBC.run(-50)
})
```
### Download and test
Click Download and follow the instructions to get your code onto your EV3 Brick. Press the center button on the EV3 Brick to run the program.
## Contemplate
### Test and Analyze
As you work on your solution:
1. Describe one part of your design that worked especially well.
2. Describe one design change that you had to make.
3. What will you try next?
### Review and Revise
Take a moment to reflect on your robot solution.
### Think about:
* Can the robots movement be more accurate?
* What are some ways that others have solved the problem?
Describe two ways you could improve your robot.
## Continue
### Personalize your project
* Add/remove LEGO elements to improve the way your robot moves.
* Click on the JavaScript tab and experiment with changing the values in the code.
* Add a custom image or sounds by adding blocks from the Brick or Music menus.
## Communicate
Here are some ideas:
* Create a video of your project, especially your final presentation and your robots performance.
* Explain some important features of your software program.
* Produce a building guide for your model by taking a series of photographs as you deconstruct it.
* Include an image of your program with comments.
* Add a team photograph!
Congratulations! What will you design next?

View File

@ -0,0 +1,90 @@
# Make It Move Without Wheels
## ~ avatar
Design, build and program a robot that can move itself using no wheels for locomotion.
## ~
## Connect
### Design Brief
Design, build and program a robot that can move itself a distance of at least 30cm, using at least one motor, using NO wheels for locomotion.
### Brainstorm
Discuss different solutions to the design brief.
Think about:
How can robots move without wheels? For example, how will you:
* Connect the motor(s) to something to make the robot walk, crawl, or wiggle?
How will you program the robot to move? For example, which programming blocks will you use to:
* Turn on and turn off the motor or motors?
* Display the distance moved?
### Select the Best Solution
Describe the solution that you have agreed to build and program.
Think about examples from your brainstorming discussion. Then explain why you chose this solution for the design brief.
![The Mars rover](/static/lessons/make-it-move/hero.png)
https://www.youtube.com/ErC_s3hLGMk
## Construct
### Build and Program
Now you are ready to start building and programming your solution!
```blocks
motors.largeBC.tank(-60, 60, 9, MoveUnit.Rotations);
motors.stopAll();
```
As you work on your solution:
* Describe one part of your design that worked especially well.
* Describe one design change that you had to make.
What will you try next?
As you test your design solution, use the table for recording your findings.
[**VIEW BUILDING INSTRUCTIONS**](TODO) for a sample solution. (7.8 MB, PDF)
## Contemplate
### Test and Analyze
How well does your solution satisfy the design brief? Record your data. Name the columns and rows, such as Trial Number, Distance Moved, and Observations.
### Review and Revise
Take a moment to reflect on your robot solution.
Think about:
* Is the robot using something other than wheels to move? Trace the movement from the motor axle to the mechanism(s) that drives the robot forward, backward or sideways. Wheels can be used to stabilize the robot but not to drive it.
* Does the robot display the distance moved?
* Is it accurate? How do you know?
Describe two ways you could improve your robot.
## Continue
### Communicate
Here are some ideas:
* Create a video of your project, especially your final presentation and your robots performance.
* Explain some important features of your software program.
* Produce a building guide for your model by taking a series of photographs as you deconstruct it.
* Include an image of your program with comments.
* Add a team photograph!
## ~ avatar
Congratulations! What will you design next?
## ~

View File

@ -2,6 +2,207 @@
Here are some fun programs for your @boardname@!
## Maker
```codecard
[
{
"name": "Sound Of Color",
"description": "Play different sounds based on the color",
"url":"/maker/sound-of-color",
"cardType": "example",
"imageUrl": "/static/maker/sound-of-color.png"
},
{
"name": "Security Gadget",
"description": "Raise the alarm when your brick is lifted!",
"url":"/maker/security-gadget",
"cardType": "example",
"imageUrl": "/static/maker/security-gadget.png"
},
{
"name": "Intruder Detector",
"description": "Raise the alarm when an intruder sneaks in",
"url":"/maker/intruder-detector",
"cardType": "example",
"imageUrl": "/static/maker/intruder-detector.png"
},
{
"name": "Puppet",
"description": "Build an automated puppet",
"url":"/maker/puppet",
"cardType": "example",
"imageUrl": "/static/maker/puppet.png"
}
]
```
## Three Point Turn
```codecard
[
{
"name": "Three Point Turn 1",
"description": "Activity 1",
"url":"/coding/three-point-turn-1",
"cardType": "example"
}, {
"name": "Three Point Turn 2",
"description": "Activity 2",
"url":"/coding/three-point-turn-2",
"cardType": "example"
}, {
"name": "Three Point Turn 3",
"description": "Activity 3",
"url":"/coding/three-point-turn-3",
"cardType": "example"
}]
```
## Reversing the robot
```codecard
[{
"name": "Reversing the robot 1",
"description": "Activity 1",
"url":"/coding/reversing-the-robot-1",
"cardType": "example"
}, {
"name": "Reversing the robot 2",
"description": "Activity 2",
"url":"/coding/reversing-the-robot-2",
"cardType": "example"
}, {
"name": "Reversing the robot 3",
"description": "Activity 3",
"url":"/coding/reversing-the-robot-3",
"cardType": "example"
}]
```
## Light the way
```codecard
[{
"name": "Light the way 1",
"description": "Activity 1",
"url":"/coding/light-the-way-1",
"cardType": "example"
}, {
"name": "Light the way 2",
"description": "Activity 2",
"url":"/coding/light-the-way-2",
"cardType": "example"
}, {
"name": "Light the way 3",
"description": "Activity 3",
"url":"/coding/light-the-way-3",
"cardType": "example"
}
]
```
## Traffic Lights
```codecard
[{
"name": "Traffic Lights 1",
"description": "Activity 1",
"url":"/coding/traffic-lights-1",
"cardType": "example"
}, {
"name": "Traffic Lights 2",
"description": "Activity 2",
"url":"/coding/traffic-lights-2",
"cardType": "example"
}, {
"name": "Traffic Lights 3",
"description": "Activity 3",
"url":"/coding/traffic-lights-3",
"cardType": "example"
}
]
```
## Reverse Bepper
```codecard
[{
"name": "Reverse Beeper 1",
"description": "Activity 1",
"url":"/coding/reverse-beeper-1",
"cardType": "example"
}, {
"name": "Reverse Beeper 2",
"description": "Activity 2",
"url":"/coding/reverse-beeper-2",
"cardType": "example"
}, {
"name": "Reverse Beeper 3",
"description": "Activity 3",
"url":"/coding/reverse-beeper-3",
"cardType": "example"
}]
```
## Ignition
```codecard
[{
"name": "Ignition 1",
"description": "Activity 1",
"url":"/coding/ingition-1",
"cardType": "example"
}, {
"name": "Ignition 2",
"description": "Activity 2",
"url":"/coding/ignition-2",
"cardType": "example"
}, {
"name": "Ignition 3",
"description": "Activity 3",
"url":"/coding/ignition-3",
"cardType": "example"
}]
```
## Cruise Control
```codecard
[{
"name": "Cruise Control 1",
"description": "Activity 1",
"url":"/coding/cruise-control-1",
"cardType": "example"
}, {
"name": "Cruise Control 2",
"description": "Activity 2",
"url":"/coding/cruise-control-2",
"cardType": "example"
}, {
"name": "Cruise Control 3",
"description": "Activity 3",
"url":"/coding/cruise-control-3",
"cardType": "example"
}]
```
## Roaming
```codecard
[{
"name": "Roaming 1",
"description": "Activity 1",
"url":"/coding/roaming-1",
"cardType": "example"
}, {
"name": "Roaming 2",
"description": "Activity 2",
"url":"/coding/roaming-2",
"cardType": "example"
}]
```
## Fun stuff
```codecard
@ -11,5 +212,10 @@ Here are some fun programs for your @boardname@!
"description": "Keep your brick entertained and happy",
"url":"/examples/happy-unhappy",
"cardType": "example"
}, {
"name": "Distance Measurer",
"description": "Use a motor to measure angle and distance",
"url": "/examples/distance-measurer",
"cardType": "example"
}]
```

View File

@ -108,7 +108,7 @@ function checkFallen() {
// stop all motors and wait for touch button to be
// pressed
function stop() {
motors.stopAllMotors()
motors.stopAll()
state = 0
moods.knockedOut.show();
sensors.touch3.pauseUntil(ButtonEvent.Pressed)
@ -119,15 +119,15 @@ sensors.ultrasonic4.onEvent(UltrasonicSensorEvent.ObjectNear, function () {
controlSteering = 0
oldControlDrive = controlDrive
controlDrive = -10
motors.mediumC.setSpeed(30, 30, MoveUnit.Degrees);
motors.mediumC.setSpeed(-30, 60, MoveUnit.Degrees);
motors.mediumC.setSpeed(30, 30, MoveUnit.Degrees);
motors.mediumC.run(30, 30, MoveUnit.Degrees);
motors.mediumC.run(-30, 60, MoveUnit.Degrees);
motors.mediumC.run(30, 30, MoveUnit.Degrees);
if (Math.randomRange(-1, 1) >= 1) {
controlSteering = 70
} else {
controlSteering = -70
}
loops.pause(4000)
pause(4000)
music.playTone(2000, 100)
controlSteering = 0
controlDrive = oldControlDrive
@ -149,8 +149,8 @@ sensors.color1.onColorDetected(ColorSensorColor.Blue, function () {
})
// apply power to motors
function controlMotors() {
motors.largeA.setSpeed(power + controlSteering * 0.1)
motors.largeD.setSpeed(power - controlSteering * 0.1)
motors.largeA.run(power + controlSteering * 0.1)
motors.largeD.run(power - controlSteering * 0.1)
}
sensors.color1.onColorDetected(ColorSensorColor.Yellow, function () {
moods.middleLeft.show()
@ -162,7 +162,7 @@ sensors.color1.onColorDetected(ColorSensorColor.White, function () {
})
timestep = 0.014
// main loop
loops.forever(function () {
forever(function () {
reset()
while (!fallen) {
control.timer3.pauseUntil(5)

View File

@ -36,7 +36,7 @@ function RST() {
sensors.gyro2.reset()
sensors.gyro2.rate()
control.timer2.reset()
loops.pause(5000)
pause(5000)
mSum = 0;
mPos = 0;
mD = 0;
@ -65,7 +65,7 @@ function OS() {
gSum = gyro;
gMx = Math.max(gMx, gyro)
gMn = Math.min(gMn, gyro)
loops.pause(4);
pause(4);
}
} while (gMx - gMn > 2);
gOS = gSum / 200;
@ -121,7 +121,7 @@ function CHK() {
}
// M
loops.forever(function () {
forever(function () {
RST();
brick.showImage(images.eyesSleeping)
OS()
@ -137,14 +137,14 @@ loops.forever(function () {
GM();
EQ();
cntrl();
motors.largeA.setSpeed(lpwr)
motors.largeD.setSpeed(rpwr)
motors.largeA.run(lpwr)
motors.largeD.run(rpwr)
CHK()
let t2 = control.timer1.millis();
let p = 5 - (t2 - t1);
loops.pause(Math.max(1, p))
pause(Math.max(1, p))
}
motors.stopAllMotors()
motors.stopAll()
st = 0;
brick.setStatusLight(StatusLight.RedPulse);
brick.showImage(images.eyesKnockedOut)
@ -154,7 +154,7 @@ loops.forever(function () {
})
// BHV
loops.forever(function () {
forever(function () {
switch (st) {
case 0:
Cdrv = 0;
@ -162,7 +162,7 @@ loops.forever(function () {
break;
case 1:
Cdrv = 40;
loops.pause(4000);
pause(4000);
Cdrv = 0;
music.playTone(1000, 100);
st = 2;
@ -196,20 +196,20 @@ loops.forever(function () {
Cstr = 0;
oldDr = Cdrv;
Cdrv = -10;
motors.mediumC.setSpeed(30, 30, MoveUnit.Degrees);
motors.mediumC.setSpeed(-30, 60, MoveUnit.Degrees);
motors.mediumC.setSpeed(30, 30, MoveUnit.Degrees);
motors.mediumC.run(30, 30, MoveUnit.Degrees);
motors.mediumC.run(-30, 60, MoveUnit.Degrees);
motors.mediumC.run(30, 30, MoveUnit.Degrees);
if (Math.randomRange(-1, 1) >= 1)
Cstr = 70;
else
Cstr = -70;
loops.pause(4000);
pause(4000);
music.playTone(2000, 100)
Cstr = 0;
Cdrv = oldDr;
}
break;
}
loops.pause(80);
pause(80);
})
```

View File

@ -21,7 +21,7 @@ let GTO = 0;
function DN() {
motors.largeAD.setBrake(true);
motors.largeAD.tank(50, 50, 1, MoveUnit.Seconds);
loops.pause(100);
pause(100);
motors.largeA.clearCounts()
motors.largeD.clearCounts()
}
@ -32,9 +32,9 @@ function MNRH() {
brick.setStatusLight(StatusLight.OrangePulse)
while (!brick.buttonEnter.wasPressed()) {
if (brick.buttonUp.wasPressed()) {
motors.mediumC.setSpeed(-100);
motors.mediumC.run(-100);
} else if (brick.buttonDown.wasPressed()) {
motors.mediumC.setSpeed(100);
motors.mediumC.run(100);
} else {
motors.mediumC.stop();
}
@ -83,24 +83,24 @@ function UP() {
if (motors.largeA.angle() > -50) {
control.runInParallel(function () {
motors.largeD.clearCounts()
motors.largeD.setSpeed(-35);
motors.largeD.run(-35);
pauseUntil(() => motors.largeD.angle() < -25);
motors.largeD.stop();
motors.largeD.setRegulated(false)
motors.largeD.setSpeed(-15)
motors.largeD.run(-15)
pauseUntil(() => motors.largeD.angle() < -65);
motors.largeD.stop();
})
motors.largeA.clearCounts()
motors.largeA.setSpeed(-35);
motors.largeA.run(-35);
pauseUntil(() => motors.largeA.angle() < -25);
motors.largeA.stop();
motors.largeA.setRegulated(false)
motors.largeA.setSpeed(-15)
motors.largeA.run(-15)
pauseUntil(() => motors.largeA.angle() < -65);
motors.largeA.stop();
loops.pause(500);
pause(500);
}
}
@ -231,9 +231,9 @@ function IDL() {
function MHT(Pos: number) {
let _R = Pos - motors.mediumC.angle();
if (_R >= 0) {
motors.mediumC.setSpeed(100, _R, MoveUnit.Degrees);
motors.mediumC.run(100, _R, MoveUnit.Degrees);
} else {
motors.mediumC.setSpeed(-100, Math.abs(_R), MoveUnit.Degrees);
motors.mediumC.run(-100, Math.abs(_R), MoveUnit.Degrees);
}
}
@ -277,7 +277,7 @@ function NGR() {
IS(4)
music.playSoundEffect(sounds.animalsDogGrowl);
UP();
loops.pause(1500);
pause(1500);
music.stopAllSounds()
music.playSoundEffect(sounds.animalsDogBark1)
P_C--;
@ -303,16 +303,16 @@ function PPP() {
NS = false;
IS(2);
UP();
loops.pause(100)
motors.largeA.setSpeed(-30, 70, MoveUnit.Degrees);
loops.pause(800);
pause(100)
motors.largeA.run(-30, 70, MoveUnit.Degrees);
pause(800);
music.playSoundEffect(sounds.mechanicalHorn1);
loops.pause(1000);
pause(1000);
for(let i = 0; i < 3; ++i) {
motors.largeA.setSpeed(-30, 20, MoveUnit.Degrees);
motors.largeA.setSpeed(30, 20, MoveUnit.Degrees);
motors.largeA.run(-30, 20, MoveUnit.Degrees);
motors.largeA.run(30, 20, MoveUnit.Degrees);
}
motors.largeA.setSpeed(30, 70, MoveUnit.Degrees);
motors.largeA.run(30, 70, MoveUnit.Degrees);
F_C = 1;
CS(0);
}
@ -320,14 +320,14 @@ function PPP() {
function HPY() {
IS(8)
MHT(0);
motors.largeAD.setSpeed(10, 0.8, MoveUnit.Seconds);
motors.largeAD.run(10, 0.8, MoveUnit.Seconds);
for(let i = 0; i < 3; ++i) {
music.playSoundEffect(sounds.animalsDogBark1);
motors.largeAD.setSpeed(-100, 0.2, MoveUnit.Seconds);
loops.pause(300)
motors.largeAD.setSpeed(10, 0.3, MoveUnit.Seconds)
motors.largeAD.run(-100, 0.2, MoveUnit.Seconds);
pause(300)
motors.largeAD.run(10, 0.3, MoveUnit.Seconds)
}
loops.pause(500);
pause(500);
music.stopAllSounds();
DN();
RST();
@ -335,9 +335,9 @@ function HPY() {
function STL() {
UP();
motors.largeAD.setSpeed(-20, 60, MoveUnit.Degrees);
motors.largeAD.run(-20, 60, MoveUnit.Degrees);
music.playSoundEffect(sounds.animalsDogWhine);
motors.largeAD.setSpeed(20, 60, MoveUnit.Degrees);
motors.largeAD.run(20, 60, MoveUnit.Degrees);
}
function WKU() {
@ -347,7 +347,7 @@ function WKU() {
MHT(0)
DN()
STL()
loops.pause(1000);
pause(1000);
UP()
CS(0;)
}
@ -358,7 +358,7 @@ MNRH();
IS(1);
UP();
RST();
loops.forever(function () {
forever(function () {
MON();
switch (DB_S) {
case 0:

View File

@ -5,20 +5,20 @@ function INI() {
motors.largeB.setBrake(true)
motors.largeC.setBrake(true)
motors.mediumA.setBrake(true)
motors.largeB.setSpeed(-50)
motors.largeB.run(-50)
pauseUntil(() => sensors.color3.light(LightIntensityMode.Reflected) > 25);
motors.largeB.stop();
motors.mediumA.setSpeed(30, 1, MoveUnit.Seconds);
motors.mediumA.setSpeed(-50, 90, MoveUnit.Degrees);
motors.largeC.setSpeed(50)
motors.mediumA.run(30, 1, MoveUnit.Seconds);
motors.mediumA.run(-50, 90, MoveUnit.Degrees);
motors.largeC.run(50)
sensors.touch1.pauseUntil(ButtonEvent.Pressed);
motors.largeC.setSpeed(-50, 0.86, MoveUnit.Rotations);
motors.largeC.run(-50, 0.86, MoveUnit.Rotations);
}
INI()
let down = false;
loops.forever(function () {
forever(function () {
brick.showImage(images.informationQuestionMark)
brick.setStatusLight(StatusLight.OrangePulse);
pauseUntil(() => (down = brick.buttonDown.wasPressed()) || brick.buttonUp.wasPressed())
@ -27,24 +27,24 @@ loops.forever(function () {
brick.showImage(images.informationAccept)
if (down) {
brick.showImage(images.informationForward)
motors.largeC.setSpeed(65, 0.85, MoveUnit.Rotations);
motors.largeC.run(65, 0.85, MoveUnit.Rotations);
} else {
brick.showImage(images.informationBackward)
motors.largeC.setSpeed(-65, 0.85, MoveUnit.Rotations);
motors.largeC.run(-65, 0.85, MoveUnit.Rotations);
}
motors.largeB.setSpeed(20, 275, MoveUnit.Degrees)
motors.mediumA.setSpeed(30, 1, MoveUnit.Seconds)
motors.largeB.setSpeed(-55)
motors.largeB.run(20, 275, MoveUnit.Degrees)
motors.mediumA.run(30, 1, MoveUnit.Seconds)
motors.largeB.run(-55)
pauseUntil(() => sensors.color3.light(LightIntensityMode.Reflected) > 25);
motors.largeB.stop();
if (down) {
motors.largeC.setSpeed(-65, 0.86, MoveUnit.Rotations);
motors.largeC.run(-65, 0.86, MoveUnit.Rotations);
} else {
motors.largeC.setSpeed(65, 0.85, MoveUnit.Rotations);
motors.largeC.run(65, 0.85, MoveUnit.Rotations);
}
motors.largeB.setSpeed(20, 275, MoveUnit.Degrees);
motors.mediumA.setSpeed(-30, 90, MoveUnit.Degrees);
motors.largeB.setSpeed(-55)
motors.largeB.run(20, 275, MoveUnit.Degrees);
motors.mediumA.run(-30, 90, MoveUnit.Degrees);
motors.largeB.run(-55)
pauseUntil(() => sensors.color3.light(LightIntensityMode.Reflected) > 25);
motors.largeB.stop()
})

View File

@ -5,20 +5,20 @@ function INI() {
motors.largeB.setBrake(true)
motors.largeC.setBrake(true)
motors.mediumA.setBrake(true)
motors.largeB.setSpeed(-50)
motors.largeB.run(-50)
pauseUntil(() => sensors.color3.light(LightIntensityMode.Reflected) > 25);
motors.largeB.stop();
motors.mediumA.setSpeed(30, 1, MoveUnit.Seconds);
motors.mediumA.setSpeed(-50, 90, MoveUnit.Degrees);
motors.largeC.setSpeed(50)
motors.mediumA.run(30, 1, MoveUnit.Seconds);
motors.mediumA.run(-50, 90, MoveUnit.Degrees);
motors.largeC.run(50)
sensors.touch1.pauseUntil(ButtonEvent.Pressed);
motors.largeC.setSpeed(-50, 0.86, MoveUnit.Rotations);
motors.largeC.run(-50, 0.86, MoveUnit.Rotations);
}
INI()
let down = false;
loops.forever(function () {
forever(function () {
brick.showImage(images.informationQuestionMark)
brick.setStatusLight(StatusLight.OrangePulse);
pauseUntil(() => (down = brick.buttonDown.wasPressed()) || brick.buttonUp.wasPressed())
@ -27,24 +27,24 @@ loops.forever(function () {
brick.showImage(images.informationAccept)
if (down) {
brick.showImage(images.informationForward)
motors.largeC.setSpeed(65, 0.85, MoveUnit.Rotations);
motors.largeC.run(65, 0.85, MoveUnit.Rotations);
} else {
brick.showImage(images.informationBackward)
motors.largeC.setSpeed(-65, 0.85, MoveUnit.Rotations);
motors.largeC.run(-65, 0.85, MoveUnit.Rotations);
}
motors.largeB.setSpeed(20, 275, MoveUnit.Degrees)
motors.mediumA.setSpeed(30, 1, MoveUnit.Seconds)
motors.largeB.setSpeed(-55)
motors.largeB.run(20, 275, MoveUnit.Degrees)
motors.mediumA.run(30, 1, MoveUnit.Seconds)
motors.largeB.run(-55)
pauseUntil(() => sensors.color3.light(LightIntensityMode.Reflected) > 25);
motors.largeB.stop();
if (down) {
motors.largeC.setSpeed(-65, 0.86, MoveUnit.Rotations);
motors.largeC.run(-65, 0.86, MoveUnit.Rotations);
} else {
motors.largeC.setSpeed(65, 0.85, MoveUnit.Rotations);
motors.largeC.run(65, 0.85, MoveUnit.Rotations);
}
motors.largeB.setSpeed(20, 275, MoveUnit.Degrees);
motors.mediumA.setSpeed(-30, 90, MoveUnit.Degrees);
motors.largeB.setSpeed(-55)
motors.largeB.run(20, 275, MoveUnit.Degrees);
motors.mediumA.run(-30, 90, MoveUnit.Degrees);
motors.largeB.run(-55)
pauseUntil(() => sensors.color3.light(LightIntensityMode.Reflected) > 25);
motors.largeB.stop()
})

View File

@ -0,0 +1,34 @@
# Distance Measurer
```blocks
let distance = 0
let angle = 0
let measuring = false
let radius = 0
// Start and stop measuring with the enter button
brick.buttonEnter.onEvent(ButtonEvent.Pressed, function () {
if (measuring) {
// turn off the measuring
measuring = false
brick.setStatusLight(StatusLight.Off)
} else {
// turn on the measuring clear the counters so that
// the motor tracks the angle
measuring = true
motors.largeB.clearCounts()
brick.setStatusLight(StatusLight.GreenPulse)
}
})
radius = 2.5
brick.showString("Press ENTER to measure", 4)
forever(function () {
if (measuring) {
angle = motors.largeB.angle()
distance = angle / 180 * Math.PI * radius
brick.clearScreen()
brick.showValue("angle", angle, 2)
brick.showValue("distance", distance, 3)
}
pause(100)
})
```

View File

@ -36,7 +36,7 @@ function RST() {
sensors.gyro2.reset()
sensors.gyro2.rate()
control.timer2.reset()
loops.pause(5000)
pause(5000)
mSum = 0;
mPos = 0;
mD = 0;
@ -65,7 +65,7 @@ function OS() {
gSum = gyro;
gMx = Math.max(gMx, gyro)
gMn = Math.min(gMn, gyro)
loops.pause(4);
pause(4);
}
} while (gMx - gMn > 2);
gOS = gSum / 200;
@ -121,7 +121,7 @@ function CHK() {
}
// M
loops.forever(function () {
forever(function () {
RST();
brick.showImage(images.eyesSleeping)
OS()
@ -137,14 +137,14 @@ loops.forever(function () {
GM();
EQ();
cntrl();
motors.largeA.setSpeed(lpwr)
motors.largeD.setSpeed(rpwr)
motors.largeA.run(lpwr)
motors.largeD.run(rpwr)
CHK()
let t2 = control.timer1.millis();
let p = 5 - (t2 - t1);
loops.pause(Math.max(1, p))
pause(Math.max(1, p))
}
motors.stopAllMotors()
motors.stopAll()
st = 0;
brick.setStatusLight(StatusLight.RedPulse);
brick.showImage(images.eyesKnockedOut)
@ -154,7 +154,7 @@ loops.forever(function () {
})
// BHV
loops.forever(function () {
forever(function () {
switch (st) {
case 0:
Cdrv = 0;
@ -162,7 +162,7 @@ loops.forever(function () {
break;
case 1:
Cdrv = 40;
loops.pause(4000);
pause(4000);
Cdrv = 0;
music.playTone(1000, 100);
st = 2;
@ -196,20 +196,20 @@ loops.forever(function () {
Cstr = 0;
oldDr = Cdrv;
Cdrv = -10;
motors.mediumC.setSpeed(30, 30, MoveUnit.Degrees);
motors.mediumC.setSpeed(-30, 60, MoveUnit.Degrees);
motors.mediumC.setSpeed(30, 30, MoveUnit.Degrees);
motors.mediumC.run(30, 30, MoveUnit.Degrees);
motors.mediumC.run(-30, 60, MoveUnit.Degrees);
motors.mediumC.run(30, 30, MoveUnit.Degrees);
if (Math.randomRange(-1, 1) >= 1)
Cstr = 70;
else
Cstr = -70;
loops.pause(4000);
pause(4000);
music.playTone(2000, 100)
Cstr = 0;
Cdrv = oldDr;
}
break;
}
loops.pause(80);
pause(80);
})
```

View File

@ -26,9 +26,9 @@ while (!(brick.buttonEnter.wasPressed())) {
brick.showValue("min", min, 4)
brick.showValue("max", v, 5)
brick.showValue("setpoint", setpoint, 6)
loops.pause(100)
pause(100)
}
loops.forever(function () {
forever(function () {
brick.clearScreen()
v = sensors.color3.light(LightIntensityMode.Reflected)
brick.showValue("light", v, 1)
@ -43,7 +43,7 @@ loops.forever(function () {
motors.largeBC.steer(P + (I + D), 100)
lasterror = error
if (brick.buttonEnter.wasPressed()) {
motors.largeBC.setSpeed(0)
motors.largeBC.run(0)
brick.buttonDown.pauseUntil(ButtonEvent.Bumped)
}
})

22
docs/getting-started.md Normal file
View File

@ -0,0 +1,22 @@
# Getting Started
## Projects
```codecard
[
{
"name": "Try",
"imageUrl": "/static/lessons/try.png",
"description": "TBD",
"url": "/getting-started/try",
"cardType": "side"
},
{
"name": "use",
"imageUrl": "/static/lessons/use.png",
"description": "TBD",
"url": "/getting-started/use",
"cardType": "side"
}
]
```

View File

@ -1,3 +1,3 @@
{
"appref": "v"
"appref": "v0.0.104"
}

View File

@ -14,16 +14,16 @@ Take a look a the LabView program below: it **starts**, turns on motor A, waits
The blocks in MakeCode have similar functions and go together in the same way: they snap into the ``||loops:on start||`` block and then connect to each other vertically.
```blocks
motors.largeA.setSpeed(50)
loops.pause(1000)
motors.largeA.run(50)
pause(1000)
motors.largeA.stop()
```
Any block program can be converted to JavaScript and you can edit it as lines of code too.
```typescript
motors.largeA.setSpeed(50)
loops.pause(1000)
motors.largeA.run(50)
pause(1000)
motors.largeA.stop()
```
@ -40,10 +40,10 @@ This program controls a large motor on port A in several different ways. It sets
![Single motor blocks](/static/labview/motors.png)
```blocks
motors.largeA.setSpeed(50);
motors.largeA.setSpeed(50, 1000, MoveUnit.MilliSeconds);
motors.largeA.setSpeed(50, 360, MoveUnit.Degrees);
motors.largeA.setSpeed(50, 1, MoveUnit.Rotations);
motors.largeA.run(50);
motors.largeA.run(50, 1000, MoveUnit.MilliSeconds);
motors.largeA.run(50, 360, MoveUnit.Degrees);
motors.largeA.run(50, 1, MoveUnit.Rotations);
motors.largeA.stop();
```
@ -83,7 +83,7 @@ By default, all motors coast when any command used to move finishes. You can kee
```blocks
motors.largeD.setBrake(true);
motors.largeD.setSpeed(50, 1, MoveUnit.Rotations)
motors.largeD.run(50, 1, MoveUnit.Rotations)
```
## Inverting and regulating motors
@ -132,15 +132,15 @@ It is quite common to have to wait for a task to finish or for a sensor state to
![pause for time](/static/labview/pausefortime.png)
```blocks
motors.largeD.setSpeed(50)
loops.pause(1000)
motors.largeD.run(50)
pause(1000)
motors.largeD.stop();
```
![pause for touch](/static/labview/pausefortouch.png)
```blocks
motors.largeD.setSpeed(50)
motors.largeD.run(50)
sensors.touch1.pauseUntil(ButtonEvent.Pressed)
motors.largeD.stop();
```
@ -148,7 +148,7 @@ motors.largeD.stop();
![pause for distance](/static/labview/pausefordistance.png)
```blocks
motors.largeD.setSpeed(50)
motors.largeD.run(50)
sensors.ultrasonic4.pauseUntil(UltrasonicSensorEvent.ObjectNear)
motors.largeD.stop();
```
@ -156,7 +156,7 @@ motors.largeD.stop();
You can also use the ``||loops:pause until||`` block to wait on any [boolean](/types/boolean) expression. As your program runs, it waits until the condition (expression) inside becomes true.
```blocks
motors.largeD.setSpeed(50)
motors.largeD.run(50)
pauseUntil(() => sensors.touch1.isPressed())
motors.largeD.stop()
```
@ -166,9 +166,9 @@ motors.largeD.stop()
![Single loop](/static/labview/loopinfinite.png)
```blocks
loops.forever(() => {
motors.largeD.setSpeed(50, 1, MoveUnit.Rotations);
motors.largeD.setSpeed(-50, 1, MoveUnit.Rotations);
forever(() => {
motors.largeD.run(50, 1, MoveUnit.Rotations);
motors.largeD.run(-50, 1, MoveUnit.Rotations);
})
```
@ -176,13 +176,13 @@ loops.forever(() => {
```blocks
for(let i = 0; i < 10; i++) {
motors.largeD.setSpeed(50, 1, MoveUnit.Rotations);
motors.largeD.setSpeed(-50, 1, MoveUnit.Rotations);
motors.largeD.run(50, 1, MoveUnit.Rotations);
motors.largeD.run(-50, 1, MoveUnit.Rotations);
}
let k = 0;
while(k < 10) {
motors.largeD.setSpeed(50, 1, MoveUnit.Rotations);
motors.largeD.setSpeed(-50, 1, MoveUnit.Rotations);
motors.largeD.run(50, 1, MoveUnit.Rotations);
motors.largeD.run(-50, 1, MoveUnit.Rotations);
k++;
}
```
@ -193,9 +193,9 @@ while(k < 10) {
```blocks
let light = 0;
loops.forever(function () {
forever(function () {
light = sensors.color3.light(LightIntensityMode.Reflected);
motors.largeD.setSpeed(light)
motors.largeD.run(light)
})
```
@ -206,15 +206,15 @@ You can start up multiple ``||loops:forever||`` loops that will run at the same
![Multiple loops running at the same time](/static/labview/multipleloops.png)
```blocks
loops.forever(() => {
motors.largeD.setSpeed(50, 1, MoveUnit.Rotations);
motors.largeD.setSpeed(-50, 1, MoveUnit.Rotations);
forever(() => {
motors.largeD.run(50, 1, MoveUnit.Rotations);
motors.largeD.run(-50, 1, MoveUnit.Rotations);
})
loops.forever(() => {
forever(() => {
brick.showImage(images.eyesMiddleRight)
loops.pause(1000)
pause(1000)
brick.showImage(images.eyesMiddleLeft)
loops.pause(1000)
pause(1000)
})
```
@ -225,9 +225,9 @@ The ``||logic:if||`` block allows you to run different code depending on whether
![Brake block](/static/labview/ife.png)
```blocks
loops.forever(function() {
forever(function() {
if(sensors.touch1.isPressed()) {
motors.largeD.setSpeed(50)
motors.largeD.run(50)
} else {
motors.largeD.stop()
}
@ -241,8 +241,8 @@ The ``||math:pick random||`` block returns a random number selected from a range
![Brake block](/static/labview/random.png)
```blocks
loops.forever(function () {
forever(function () {
motors.largeBC.steer(Math.randomRange(-5, 5), 50)
loops.pause(100)
pause(100)
})
```

View File

@ -81,7 +81,7 @@ Study the program...what do you think the program will do?
motors.largeBC.steer(0, 20)
while (true) {
sensors.color3.pauseForColor(ColorSensorColor.Red)
motors.stopAllMotors()
motors.stopAll()
}
```
@ -148,7 +148,7 @@ while (true) {
motors.largeBC.steer(0, 20)
while (true) {
sensors.color3.pauseForColor(ColorSensorColor.Red)
motors.stopAllMotors()
motors.stopAll()
}
}
```
@ -162,7 +162,7 @@ while (true) {
motors.largeBC.steer(0, 20)
while (true) {
sensors.color3.pauseForColor(ColorSensorColor.Red)
motors.stopAllMotors()
motors.stopAll()
}
while (true) {
@ -183,7 +183,7 @@ while (true) {
motors.largeBC.steer(0, 20)
while (true) {
sensors.color3.pauseForColor(ColorSensorColor.Red)
motors.stopAllMotors()
motors.stopAll()
}
while (true) {
sensors.color3.pauseForColor(ColorSensorColor.Red)
@ -213,13 +213,13 @@ music.playSoundEffect(sounds.systemGeneralAlert)
}
while (true) {
while (true) { sensors.color3.pauseForLight(LightIntensityMode.Reflected, LightCondition.Bright)
motors.largeB.setSpeed(10)
motors.largeC.setSpeed(-10)
motors.largeB.run(10)
motors.largeC.run(-10)
}
while (true) {
sensors.color3.pauseForLight(LightIntensityMode.Reflected, LightCondition.Bright)
motors.largeA.setSpeed(-10)
motors.largeA.setSpeed(10)
motors.largeA.run(-10)
motors.largeA.run(10)
}
}
```
@ -235,13 +235,13 @@ You will need to constantly debug your program in order to make your robot trave
```blocks
while (true) {
while (true) { sensors.color3.pauseForLight(LightIntensityMode.Reflected, LightCondition.Bright)
motors.largeB.setSpeed(10)
motors.largeC.setSpeed(-10)
motors.largeB.run(10)
motors.largeC.run(-10)
}
while (true) {
sensors.color3.pauseForLight(LightIntensityMode.Reflected, LightCondition.Bright)
motors.largeB.setSpeed(-10)
motors.largeC.setSpeed(10)
motors.largeB.run(-10)
motors.largeC.run(10)
}
}
```

View File

@ -51,7 +51,7 @@ The ``||motors:tank large B+C||`` block will run for `9` rotations when the **ce
```blocks
motors.largeBC.tank(-60, 60, 9, MoveUnit.Rotations)
motors.stopAllMotors()
motors.stopAll()
```
## Program 3 @fullscreen
@ -63,7 +63,7 @@ The ``||motors:tank large B+C||`` will run for `9` rotations when the **center**
```blocks
motors.largeBC.tank(-60, 60, 9, MoveUnit.Rotations)
motors.stopAllMotors()
motors.stopAll()
brick.showString("30 cm", 1)
```

View File

@ -9,39 +9,12 @@ These six activities require the LEGO® MINDSTORMS® Education EV3 Core Set (455
```codecard
[
{
"name": "Sound Machine",
"name": "Make A Sound Machine",
"description": "Create instruments with your EV3 Brick!",
"url":"/maker/sound-machine",
"cardType": "example",
"imageUrl": "/static/maker/sound-machine.png"
},
{
"name": "Sound Of Color",
"description": "Play different sounds based on the color",
"url":"/maker/sound-of-color",
"cardType": "example",
"imageUrl": "/static/maker/sound-of-color.png"
},
{
"name": "Security Gadget",
"description": "Raise the alarm when your brick is lifted!",
"url":"/maker/security-gadget",
"cardType": "example",
"imageUrl": "/static/maker/security-gadget.png"
},
{
"name": "Intruder Detector",
"description": "Raise the alarm when an intruder sneaks in",
"url":"/maker/intruder-detector",
"cardType": "example",
"imageUrl": "/static/maker/intruder-detector.png"
},
{
"name": "Puppet",
"description": "Build an automated puppet",
"url":"/maker/puppet",
"cardType": "example",
"imageUrl": "/static/maker/puppet.png"
"imageUrl": "/static/maker/sound-machine.png",
"cardType": "side"
}
]
```

View File

@ -3,13 +3,13 @@
Use this program with the Programmable Brick and Large Motor.
```blocks
loops.forever(function () {
motors.largeA.setSpeed(30)
loops.pause(100)
forever(function () {
motors.largeA.run(30)
pause(100)
motors.largeA.stop()
music.playSoundEffectUntilDone(sounds.animalsCatPurr)
motors.largeA.setSpeed(-30)
loops.pause(100)
motors.largeA.run(-30)
pause(100)
motors.largeA.stop()
})
```

View File

@ -3,10 +3,10 @@
This example program combined with the small model will make a beat and rhythm on any surface when the program is run.
```blocks
loops.forever(function () {
motors.largeA.setSpeed(50)
loops.pause(200)
motors.largeA.setSpeed(100)
loops.pause(200)
forever(function () {
motors.largeA.run(50)
pause(200)
motors.largeA.run(100)
pause(200)
})
```

View File

@ -3,7 +3,7 @@
```namespaces
brick.showMood(moods.sleeping);
sensors.color(null);
motors.stopAllMotors();
motors.stopAll();
```
## See Also

View File

@ -16,7 +16,7 @@ Show the battery level percentage on the screen. Also, show a green light if the
```blocks
let battery = 0;
loops.forever(function() {
forever(function() {
brick.showString("Battery level:", 1)
brick.showNumber(battery, 2)
battery = brick.batteryLevel();
@ -28,6 +28,6 @@ loops.forever(function() {
} else {
brick.setStatusLight(StatusLight.RedPulse)
}
loops.pause(30000)
pause(30000)
})
```

View File

@ -32,7 +32,7 @@ Set the brick light to green when the `down` is pressed. When the button is not
```blocks
let isRed = false;
loops.forever(function() {
forever(function() {
if (brick.buttonLeft.isPressed()) {
brick.setStatusLight(StatusLight.Green);
isRed = false;

View File

@ -16,7 +16,7 @@ brick.showString("self-destruct in:", 2);
brick.showString("seconds", 5);
for (let i = 0; i < 10; i++) {
brick.showNumber(10 - i, 4);
loops.pause(1000);
pause(1000);
}
brick.clearScreen();
```

View File

@ -24,14 +24,14 @@ brick.setStatusLight(StatusLight.Red);
Repeatedly show a different color pattern for the brick light.
```blocks
loops.forever(function () {
forever(function () {
brick.setStatusLight(StatusLight.Orange)
loops.pause(1000)
pause(1000)
brick.setStatusLight(StatusLight.GreenFlash)
loops.pause(2000)
pause(2000)
brick.setStatusLight(StatusLight.RedPulse)
loops.pause(2000)
pause(2000)
brick.setStatusLight(StatusLight.Off)
loops.pause(500)
pause(500)
})
```

View File

@ -3,7 +3,7 @@
## Motion
```cards
motors.largeA.setSpeed(50)
motors.largeA.run(50)
motors.largeAB.tank(50, 50)
motors.largeAB.steer(0, 50)
motors.largeA.pauseUntilReady()
@ -12,7 +12,7 @@ motors.largeA.setInverted(true)
motors.largeA.setRegulated(false)
motors.largeA.stop()
motors.largeA.reset()
motors.stopAllMotors()
motors.stopAll()
```
## Counters

View File

@ -19,8 +19,8 @@ Reset the motor connected to port **A** and run it for for 2 seconds at a speed
```blocks
let motorAngle = 0;
motors.largeA.reset()
motors.largeA.setSpeed(45)
loops.pause(2000)
motors.largeA.run(45)
pause(2000)
motors.largeA.stop()
motorAngle = motors.largeA.angle()
```

View File

@ -15,12 +15,12 @@ See if the motor turns the same number of times for each of two count periods. R
```blocks
let tachoCount = 0;
motors.largeA.reset()
motors.largeA.setSpeed(50)
loops.pause(10000)
motors.largeA.run(50)
pause(10000)
tachoCount = motors.largeA.tacho()
motors.largeA.clearCounts()
motors.largeA.setSpeed(50)
loops.pause(10000)
motors.largeA.run(50)
pause(10000)
if (tachoCount == motors.largeA.tacho()) {
brick.showString("Motor turns equal.", 1)
} else {

View File

@ -13,13 +13,13 @@ The motor's speed is set back to `0` and the **tacho**, **angle**, and **speed**
See what the angle count is when a motor is stopped. Then, try it again after a reset.
```blocks
motors.largeA.setSpeed(30)
loops.pause(2000)
motors.largeA.run(30)
pause(2000)
motors.largeA.stop()
brick.showString("Angle count:", 1)
brick.showNumber(motors.largeA.angle(), 2)
motors.largeA.setSpeed(30)
loops.pause(2000)
motors.largeA.run(30)
pause(2000)
motors.largeA.reset()
brick.showString("Angle count:", 4)
brick.showNumber(motors.largeA.angle(), 5)

View File

@ -1,9 +1,9 @@
# set Speed
# run
Set the rotation speed of the motor as a percentage of maximum speed.
```sig
motors.largeA.setSpeed(50)
motors.largeA.run(50)
```
The speed setting is a pecentage of the motor's full speed. Full speed is the speed that the motor runs when the brick supplies maximum output voltage to the port.
@ -19,28 +19,28 @@ If you use a number of milliseconds as movement units, then you don't need to in
To run the motor for 500 milliseconds:
```block
motors.largeA.setSpeed(50, 500)
motors.largeA.run(50, 500)
```
## ~
Here is how you use each different movement unit to run the motor for a fixed rotation distance.
```typescript
```blocks
// Run motor for 700 Milliseconds.
motors.largeA.setSpeed(25, 700, MoveUnit.MilliSeconds);
motors.largeA.run(25, 700, MoveUnit.MilliSeconds);
// Run motor for 700 Milliseconds again but no units specified.
motors.largeA.setSpeed(25, 700);
motors.largeA.run(25, 700);
// Run the motor for 45 seconds
motors.largeA.setSpeed(50, 45, MoveUnit.Seconds);
motors.largeA.run(50, 45, MoveUnit.Seconds);
// Turn the motor for 270 degrees
motors.largeA.setSpeed(50, 270, MoveUnit.Degrees)
motors.largeA.run(50, 270, MoveUnit.Degrees)
// Turn the motor at full speed for 9 full rotations
motors.largeA.setSpeed(100, 9, MoveUnit.Rotations);
motors.largeA.run(100, 9, MoveUnit.Rotations);
```
## Parameters
@ -56,7 +56,7 @@ motors.largeA.setSpeed(100, 9, MoveUnit.Rotations);
Turning the motor in the opposite direction (reverse) is simple. Reverse is just a negative speed setting. To drive the motor in reverse at 25% speed:
```block
motors.largeB.setSpeed(-25)
motors.largeB.run(-25)
```
## ~
@ -68,8 +68,8 @@ motors.largeB.setSpeed(-25)
Run the motor connected to port **A** continuously. Pause 20 seconds and then stop the motor.
```blocks
motors.largeA.setSpeed(75)
loops.pause(20000)
motors.largeA.run(75)
pause(20000)
motors.largeA.stop()
```
@ -78,8 +78,8 @@ motors.largeA.stop()
Run the motor connected to port **A** in reverse. Pause 5 seconds and then stop the motor.
```blocks
motors.largeA.setSpeed(-60)
loops.pause(5000)
motors.largeA.run(-60)
pause(5000)
motors.largeA.stop()
```
@ -88,7 +88,7 @@ motors.largeA.stop()
Run the motor connected to port **B** for 35 full rotations and then stop.
```blocks
motors.largeB.setSpeed(50, 35, MoveUnit.Rotations)
motors.largeB.run(50, 35, MoveUnit.Rotations)
```
## See also

View File

@ -19,8 +19,8 @@ Also, you can use the brake to do simple skid steering for your brick.
Run the motor connected to port **A** for 2 seconds at a speed of `30`. Stop and set the brake.
```blocks
motors.largeA.setSpeed(30)
loops.pause(2000)
motors.largeA.run(30)
pause(2000)
motors.largeA.stop()
motors.largeA.setBrake(true)
```

View File

@ -17,13 +17,13 @@ You use a positive value (some number greater than `0`) to drive you motor in th
Run the motor connected to port **A** for 2 seconds at a speed of `30`. Stop and switch the direciton of rotation. Run the motor at a speed of `-30`. Watch and see if the motor turns in the same direction as before.
```blocks
motors.largeA.setSpeed(30)
loops.pause(2000)
motors.largeA.run(30)
pause(2000)
motors.largeA.stop()
loops.pause(2000)
pause(2000)
motors.largeA.setInverted(true)
motors.largeA.setSpeed(-30)
loops.pause(2000)
motors.largeA.run(-30)
pause(2000)
motors.largeA.stop()
```

View File

@ -22,11 +22,11 @@ Turn off the speed regulation for the motor connected to port **A**.
```blocks
motors.largeA.setRegulated(false)
motors.largeA.setSpeed(75)
loops.pause(20000)
motors.largeA.run(75)
pause(20000)
motors.largeA.stop()
```
## See also
[set speed](/reference/motors/motor/set-speed), [stop](/reference/motors/motor/stop)
[run](/reference/motors/motor/run), [stop](/reference/motors/motor/stop)

View File

@ -6,7 +6,7 @@ Get the current speed of motor rotation as a percentage of maximum speed.
motors.largeA.speed()
```
The actual speed of the motor is the same or very close to it's current speed setting when the motor is regulated. If not regulated, the actual speed can change from the set speed when a force, or load, is applied to it.
The actual speed of the motor is the same or very close to it's current speed setting when the motor is regulated. If not regulated, the actual speed can change from the speed you told it to run at (your desired or _set point_ speed) when a force, or load, is applied to it.
## Returns
@ -18,10 +18,10 @@ Turn speed regulation off and report the actual speed of the large motor in the
```blocks
motors.largeA.setRegulated(false)
motors.largeA.setSpeed(55)
motors.largeA.run(55)
brick.showString("Actual speed:", 1)
for (let i = 0; i < 30; i++) {
loops.pause(500)
pause(500)
brick.showNumber(motors.largeA.speed(), 3)
}
motors.largeA.stop()

View File

@ -13,11 +13,11 @@ The motor stops but any motion caused from previously running the motor continue
Run the motor connected to port **A** for 2 seconds at a speed of `30`. Stop and wait for 2 seconds, then continue at a speed of `50`.
```blocks
motors.largeA.setSpeed(30)
loops.pause(2000)
motors.largeA.run(30)
pause(2000)
motors.largeA.stop()
loops.pause(2000)
motors.largeA.setSpeed(50)
pause(2000)
motors.largeA.run(50)
```
## See also

View File

@ -33,12 +33,12 @@ A standard way to know how fast a motor is turning is by measuring its _revoluti
Run the motor connected to port **A** at half speed for 5 seconds. Display the number of full rotations on the screen.
```blocks
motors.largeA.setSpeed(50)
loops.pause(5000)
motors.largeA.run(50)
pause(5000)
motors.largeA.stop()
brick.showString("Motor rotations:", 1)
brick.showNumber(motors.largeA.tacho() / 360, 3)
motors.largeA.setSpeed(50)
motors.largeA.run(50)
```
## See also

View File

@ -3,7 +3,7 @@
Stops all motors currently running on the brick.
```sig
motors.stopAllMotors();
motors.stopAll();
```
The motors stops but any motion caused from previously running the motors continues until it runs down. If you are driving your brick and then stop the motors, it will coast for awhile before stopping.
@ -14,8 +14,8 @@ Tank the @boardname@ forward at half speed for 5 seconds and then stop.
```blocks
motors.largeAB.tank(50, 50);
loops.pause(5000);
motors.stopAllMotors();
pause(5000);
motors.stopAll();
```
## See also

View File

@ -18,7 +18,7 @@ The speed setting is a pecentage of the motor's full speed. Full speed is the sp
If you use just the **speed** number, the motors run continously and won't stop unless you tell them to. You can also give a value for a certain amount of distance you want the motors to rotate for. The **value** can be an amount of time, a turn angle in degrees, or a number of full rotations.
If you decide to use a **value** of rotation distance, you need to choose a type of movement **unit**. Also, if you use a number of milliseconds as movement units, then you don't need to include the unit type. The description in [set speed](/reference/motors/motor/set-speed) shows how to use different movement units.
If you decide to use a **value** of rotation distance, you need to choose a type of movement **unit**. Also, if you use a number of milliseconds as movement units, then you don't need to include the unit type. The description in [run](/reference/motors/motor/run) shows how to use different movement units.
## Parameters
@ -72,13 +72,13 @@ Steer the brick in a snake pattern for a short time.
```block
for (let i = 0; i < 4; i++) {
motors.largeBC.steer(30, 30)
loops.pause(5000)
pause(5000)
motors.largeBC.steer(-30, 30)
loops.pause(5000)
pause(5000)
}
motors.stopAllMotors()
motors.stopAll()
```
## See also
[tank](/reference/motors/synced/tank), [set speed](/reference/motors/motor/set-speed)
[tank](/reference/motors/synced/tank), [run](/reference/motors/motor/run)

View File

@ -14,7 +14,7 @@ The speed setting is a pecentage of the motor's full speed. Full speed is the sp
If you use just the **speed** number, the motors run continously and won't stop unless you tell them to. You can also give a value for a certain amount of distance you want the motors to rotate for. The **value** can be an amount of time, a turn angle in degrees, or a number of full rotations.
If you decide to use a **value** of rotation distance, you need to choose a type of movement **unit**. Also, if you use a number of milliseconds as movement units, then you don't need to include the unit type. The description in [set speed](/reference/motors/motor/set-speed) shows how to use different movement units.
If you decide to use a **value** of rotation distance, you need to choose a type of movement **unit**. Also, if you use a number of milliseconds as movement units, then you don't need to include the unit type. The description in [run](/reference/motors/motor/run) shows how to use different movement units.
## Parameters
@ -43,10 +43,10 @@ Move the brick straight ahead and then go backward.
```blocks
motors.largeAB.tank(75, 75)
loops.pause(10000)
pause(10000)
motors.largeAB.tank(-55, -55)
loops.pause(10000)
motors.stopAllMotors()
pause(10000)
motors.stopAll()
```
### Slip steer
@ -72,10 +72,10 @@ Run both motors in opposite directions to spin the brick around to the left.
```blocks
motors.largeAB.tank(-30, 30)
loops.pause(5000)
motors.stopAllMotors()
pause(5000)
motors.stopAll()
```
## See also
[steer](/reference/motors/synced/steer), [set speed](/reference/motors/motor/set-speed)
[steer](/reference/motors/synced/steer), [run](/reference/motors/motor/run)

View File

@ -1,5 +1,17 @@
# Sensors
# Color
```cards
sensors.color1.onColorDetected(ColorSensorColor.Blue, function () {})
sensors.color1.onLightChanged(LightIntensityMode.Reflected, LightCondition.Dark, function () {})
sensors.color1.pauseForLight(LightIntensityMode.Reflected, LightCondition.Dark)
sensors.color1.pauseForColor(ColorSensorColor.Blue)
sensors.color1.color();
sensors.color1.light(LightIntensityMode.Ambient)
sensors.color(ColorSensorColor.Blue)
```
## Touch
```cards
@ -24,3 +36,22 @@ sensors.ultrasonic4.onEvent(UltrasonicSensorEvent.ObjectDetected, function () {}
sensors.ultrasonic1.distance();
sensors.ultrasonic1.pauseUntil(UltrasonicSensorEvent.ObjectDetected);
```
## Infrared
```cards
sensors.infraredSensor1.onEvent(null, function () {});
sensors.infraredSensor1.pauseUntil(null);
sensors.infraredSensor1.proximity();
```
## Infrared beacon button
```cards
sensors.remoteButtonCenter.onEvent(ButtonEvent.Pressed, function () {})
sensors.remoteButtonCenter.pauseUntil(ButtonEvent.Pressed);
sensors.remoteButtonCenter.isPressed()
sensors.remoteButtonCenter.wasPressed()
sensors.infraredSensor1.setRemoteChannel(null)
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

BIN
docs/static/lessons/make-a-system.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 592 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

BIN
docs/static/lessons/make-it-move.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 357 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 357 KiB

BIN
docs/static/lessons/make-it-smarter.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 413 KiB

BIN
docs/static/lessons/try.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

BIN
docs/static/lessons/use.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 KiB

View File

@ -73,7 +73,7 @@ pxt.editor.initExtensionsAsync = function (opts: pxt.editor.ExtensionOptions): P
<span class="ui blue circular label">2</span>
<strong>${lf("Make sure you have the latest EV3 firmware")}</strong>
<br/>
<a href="" target="_blank">${lf("Click here to update to latest firmware")}</a>
<a href="https://ev3manager.education.lego.com/" target="_blank">${lf("Click here to update to latest firmware")}</a>
</div>
</div>
</div>

File diff suppressed because one or more lines are too long

34
libs/base/enums.d.ts vendored Normal file
View File

@ -0,0 +1,34 @@
// Auto-generated. Do not edit.
declare const enum NumberFormat {
Int8LE = 1,
UInt8LE = 2,
Int16LE = 3,
UInt16LE = 4,
Int32LE = 5,
Int8BE = 6,
UInt8BE = 7,
Int16BE = 8,
UInt16BE = 9,
Int32BE = 10,
UInt32LE = 11,
UInt32BE = 12,
Float32LE = 13,
Float64LE = 14,
Float32BE = 15,
Float64BE = 16,
}
declare const enum ValType {
Undefined = 0,
Boolean = 1,
Number = 2,
String = 3,
Object = 4,
Function = 5,
}
// Auto-generated. Do not edit. Really.

159
libs/base/shims.d.ts vendored Normal file
View File

@ -0,0 +1,159 @@
// Auto-generated. Do not edit.
//% indexerGet=BufferMethods::getByte indexerSet=BufferMethods::setByte
declare interface Buffer {
/**
* Write a number in specified format in the buffer.
*/
//% shim=BufferMethods::setNumber
setNumber(format: NumberFormat, offset: int32, value: number): void;
/**
* Read a number in specified format from the buffer.
*/
//% shim=BufferMethods::getNumber
getNumber(format: NumberFormat, offset: int32): number;
/** Returns the length of a Buffer object. */
//% property shim=BufferMethods::length
length: int32;
/**
* Fill (a fragment) of the buffer with given value.
*/
//% offset.defl=0 length.defl=-1 shim=BufferMethods::fill
fill(value: int32, offset?: int32, length?: int32): void;
/**
* Return a copy of a fragment of a buffer.
*/
//% offset.defl=0 length.defl=-1 shim=BufferMethods::slice
slice(offset?: int32, length?: int32): Buffer;
/**
* Shift buffer left in place, with zero padding.
* @param offset number of bytes to shift; use negative value to shift right
* @param start start offset in buffer. Default is 0.
* @param length number of elements in buffer. If negative, length is set as the buffer length minus
* start. eg: -1
*/
//% start.defl=0 length.defl=-1 shim=BufferMethods::shift
shift(offset: int32, start?: int32, length?: int32): void;
/**
* Convert a buffer to its hexadecimal representation.
*/
//% shim=BufferMethods::toHex
toHex(): string;
/**
* Rotate buffer left in place.
* @param offset number of bytes to shift; use negative value to shift right
* @param start start offset in buffer. Default is 0.
* @param length number of elements in buffer. If negative, length is set as the buffer length minus
* start. eg: -1
*/
//% start.defl=0 length.defl=-1 shim=BufferMethods::rotate
rotate(offset: int32, start?: int32, length?: int32): void;
/**
* Write contents of `src` at `dstOffset` in current buffer.
*/
//% shim=BufferMethods::write
write(dstOffset: int32, src: Buffer): void;
}
declare namespace loops {
/**
* Repeats the code forever in the background. On each iteration, allows other codes to run.
* @param body code to execute
*/
//% help=loops/forever weight=100 afterOnStart=true deprecated=true
//% blockId=forever_deprecated block="forever" blockAllowMultiple=1 shim=loops::forever
function forever(a: () => void): void;
/**
* Pause for the specified time in milliseconds
* @param ms how long to pause for, eg: 100, 200, 500, 1000, 2000
*/
//% help=loops/pause weight=99 deprecated=true
//% async block="pause %pause=timePicker|ms"
//% blockId=device_pause_deprecated shim=loops::pause
function pause(ms: int32): void;
}
declare namespace control {
/**
* Gets the number of milliseconds elapsed since power on.
*/
//% help=control/millis weight=50
//% blockId=control_running_time block="millis (ms)" shim=control::millis
function millis(): int32;
/**
* Run code when a registered event happens.
* @param id the event compoent id
* @param value the event value to match
*/
//% weight=20 blockGap=8 blockId="control_on_event" block="on event|from %src|with value %value"
//% blockExternalInputs=1
//% help="control/on-event" flags.defl=16 shim=control::onEvent
function onEvent(src: int32, value: int32, handler: () => void, flags?: int32): void;
/**
* Reset the device.
*/
//% weight=30 async help=control/reset blockGap=8
//% blockId="control_reset" block="reset" shim=control::reset
function reset(): void;
/**
* Block the current fiber for the given microseconds
* @param micros number of micro-seconds to wait. eg: 4
*/
//% help=control/wait-micros weight=29 async
//% blockId="control_wait_us" block="wait (µs)%micros" shim=control::waitMicros
function waitMicros(micros: int32): void;
/**
* Run other code in the parallel.
*/
//% help=control/run-in-parallel handlerStatement=1
//% blockId="control_run_in_parallel" block="run in parallel" blockGap=8 shim=control::runInParallel
function runInParallel(a: () => void): void;
/**
* Blocks the calling thread until the specified event is raised.
*/
//% help=control/wait-for-event async
//% blockId=control_wait_for_event block="wait for event|from %src|with value %value" shim=control::waitForEvent
function waitForEvent(src: int32, value: int32): void;
/**
* Derive a unique, consistent serial number of this device from internal data.
*/
//% blockId="control_device_serial_number" block="device serial number" weight=9
//% help=control/device-serial-number shim=control::deviceSerialNumber
function deviceSerialNumber(): int32;
}
declare namespace serial {
/**
* Write some text to the serial port.
*/
//% help=serial/write-string
//% weight=87 blockHidden=true
//% blockId=serial_writestring block="serial|write string %text" shim=serial::writeString
function writeString(text: string): void;
/**
* Send a buffer across the serial connection.
*/
//% help=serial/write-buffer weight=6 blockHidden=true
//% blockId=serial_writebuffer block="serial|write buffer %buffer" shim=serial::writeBuffer
function writeBuffer(buffer: Buffer): void;
}
// Auto-generated. Do not edit. Really.

View File

@ -19,28 +19,28 @@ enum LightIntensityMode {
}
const enum ColorSensorColor {
//% block="none" jres=colors.none
//% block="none" jres=colors.none blockIdentity=sensors.color
None,
//% block="black" jres=colors.black
//% block="black" jres=colors.black blockIdentity=sensors.color
Black,
//% block="blue" jres=colors.blue
//% block="blue" jres=colors.blue blockIdentity=sensors.color
Blue,
//% block="green" jres=colors.green
//% block="green" jres=colors.green blockIdentity=sensors.color
Green,
//% block="yellow" jres=colors.yellow
//% block="yellow" jres=colors.yellow blockIdentity=sensors.color
Yellow,
//% block="red" jres=colors.red
//% block="red" jres=colors.red blockIdentity=sensors.color
Red,
//% block="white" jres=colors.white
//% block="white" jres=colors.white blockIdentity=sensors.color
White,
//% block="brown" jres=colors.brown
//% block="brown" jres=colors.brown blockIdentity=sensors.color
Brown
}
enum LightCondition {
//% block="dark"
Dark = sensors.ThresholdState.Low,
//$ block="bright"
//% block="bright"
Bright = sensors.ThresholdState.High
}
@ -192,7 +192,7 @@ namespace sensors {
}
/**
* Waits for the given color to be detected
* Wait for the given color to be detected
* @param color the color to detect
*/
//% help=sensors/color-sensor/pause-for-light
@ -210,7 +210,7 @@ namespace sensors {
}
/**
* Measures the ambient or reflected light value from 0 (darkest) to 100 (brightest).
* Measure the ambient or reflected light value from 0 (darkest) to 100 (brightest).
* @param sensor the color sensor port
*/
//% help=sensors/color-sensor/light
@ -237,7 +237,7 @@ namespace sensors {
}
/**
* Sets a threshold value
* Set a threshold value
* @param condition the dark or bright light condition
* @param value the value threshold
*/
@ -245,6 +245,7 @@ namespace sensors {
//% group="Threshold" blockGap=8 weight=90
//% value.min=0 value.max=100
//% sensor.fieldEditor="ports"
//% help=sensors/color-sensor/set-threshold
setThreshold(condition: LightCondition, value: number) {
if (condition == LightCondition.Dark)
this.thresholdDetector.setLowThreshold(value)
@ -253,12 +254,13 @@ namespace sensors {
}
/**
* Gets the threshold value
* Get a threshold value
* @param condition the light condition
*/
//% blockId=colorGetThreshold block="%sensor|%condition"
//% group="Threshold" blockGap=8 weight=89
//% sensor.fieldEditor="ports"
//% help=sensors/color-sensor/threshold
threshold(condition: LightCondition): number {
return this.thresholdDetector.threshold(<ThresholdState><number>LightCondition.Dark);
}
@ -266,9 +268,10 @@ namespace sensors {
/**
* Collects measurement of the light condition and adjusts the threshold to 10% / 90%.
*/
//% blockId=colorCalibrateLight block="calibrate|%sensor|for %mode|light"
//% blockId=colorCalibrateLight block="calibrate|%sensor|for %mode"
//% group="Threshold" weight=91 blockGap=8
//% sensor.fieldEditor="ports"
//% help=sensors/color-sensor/calibrate-light
calibrateLight(mode: LightIntensityMode, deviation: number = 8) {
this.calibrating = true; // prevent events
@ -294,7 +297,7 @@ namespace sensors {
}
// wait a bit
loops.pause(50);
pause(50);
}
// apply tolerance
@ -313,11 +316,18 @@ namespace sensors {
/**
* Returns a color that the sensor can detect
* @param color the color sensed by the sensor, eg: ColorSensorColor.Red
*/
//% shim=TD_ID
//% blockId=colorSensorColor block="color %color"
//% group="Color Sensor"
//% weight=97
//% help=sensors/color
//% color.fieldEditor="gridpicker"
//% color.fieldOptions.columns=4
//% color.fieldOptions.tooltips=true
//% color.fieldOptions.hideRect=true
//% color.fieldOptions.width=268
export function color(color: ColorSensorColor): ColorSensorColor {
return color;
}

View File

@ -1,16 +1,19 @@
# Color Sensor
# Color sensor
```cards
sensors.color1.onColorDetected(ColorSensorColor.Blue, function () {
})
sensors.color1.onColorDetected(ColorSensorColor.Blue, function () {})
sensors.color1.onLightChanged(LightIntensityMode.Reflected, LightCondition.Dark, function () {})
sensors.color1.pauseForLight(LightIntensityMode.Reflected, LightCondition.Dark)
sensors.color1.pauseForColor(ColorSensorColor.Blue)
sensors.color1.color();
sensors.color1.ambientLight();
sensors.color1.reflectedLight();
sensors.color1.light(LightIntensityMode.Ambient)
```
## See Also
## See slso
[on color detected](/reference/sensors/color-sensor/on-color-detected),
[pause for color](/reference/sensors/color-sensor/pause-for-color),
[on light changed](/reference/sensors/color-sensor/on-light-changed),
[pause for light](/reference/sensors/color-sensor/pause-for-light),
[color](/reference/sensors/color-sensor/color),
[ambient light](/reference/sensors/color-sensor/ambient-light),
[reflected light](/reference/sensors/color-sensor/reflected-light),
[light](/reference/sensors/color-sensor/ambient-light)

View File

@ -1,11 +1,31 @@
# Ambient Light
# ambient Light
Get the amount of ambient light dectected.
```sig
sensors.color1.ambientLight()
```
The amount of ambient light measured is in the range of `0` (darkest) to `100` (brightest).
## Returns
* a [number](/types/number) that is the amount of ambiernt light measured. No light (darkness) is `0` and the brightest light is `100`.
## Example
Make the status light show ``green`` if the ambient light is greater than `20`.
```blocks
loops.forever(function () {
forever(function () {
if (sensors.color1.ambientLight() > 20) {
brick.setStatusLight(StatusLight.Green)
} else {
brick.setStatusLight(StatusLight.Orange)
}
})
```
```
## See also
[reflected light](/reference/sensors/color-sensor/reflected-light)

View File

@ -0,0 +1,26 @@
# calibrate Light
Calibrate the thresholds for dark and bright in current lighting conditions.
```sig
sensors.color1.calibrateLight(LightIntensityMode.Ambient, 0)
```
Sometimes when external lighting conditions change, the light sensor measures light intensty differently than when its thresholds were set before. You can calibrate the light sensor to adjust the thresholds slightly for current conditions. This is so that both the ``dark`` and ``bright`` threshold conditions happen with a similar amount of light to what you set the thresholds before.
## Parameters
* **mode**: the type of light threshold to calibrate. This is either ``ambient`` or ``reflected`` light.
* **deviation**: a [number](/types/number) that is the amount of light level change to adjust in a measurement.
## Example
Calibrate the ``dark`` and ``light`` thresholds for the ``color 2`` sensor using reflected light.
```blocks
sensors.color2.calibrateLight(LightIntensityMode.Reflected)
```
## See also
[set threshold](/reference/sensors/color-sensor/set-threshold)

View File

@ -1,11 +1,39 @@
# color
Get the current color detected by the sensor.
```sig
sensors.color1.color()
```
The [color](/reference/sensors/color) value returned is one of the colors that the sensor can detect. If you want to use colors for tracking, it's best to use a color that is the same or very close to the ones the sensor detects.
## Returns
* a color value for the current color detected by the color sensor. The colors detected are:
>* ``none``: no color is detected.
>* ``blue``
>* ``green``
>* ``yellow``
>* ``red``
>* ``white``
>* ``brown``
## Example
Turn the status light to ``green`` if the color detected by the ``color 1`` sensor is green.
```blocks
loops.forever(function () {
forever(function () {
if (sensors.color1.color() == ColorSensorColor.Green) {
brick.setStatusLight(StatusLight.Green)
} else {
brick.setStatusLight(StatusLight.Orange)
}
})
```
```
## See also
[color](/reference/sensors/color-sensor/color)

View File

@ -0,0 +1,35 @@
# light
Get the amount of ambient or reflected light measured by the sensor.
```sig
sensors.color1.light(LightIntensityMode.Ambient)
```
The light sensor adjusts itself to more accurately measure light depending on the source of the light. You decide if you want to measure _ambient_ light (light all around or direct light) or if you want to know how much light is reflected from a surface. The amount of light measured is in the range of `0` (darkest) to `100` (brightest).
## Parameters
* **mode**: the type of measurement for light. This is either ``ambient`` or ``reflected`` light.
## Returns
* a number that is the amount of light measured. No light (darkness) is `0` and the brightest light is `100`.
## Example
Make the status light show ``green`` if the ambient light is greater than `20`.
```blocks
forever(function () {
if (sensors.color1.light(LightIntensityMode.Ambient) > 20) {
brick.setStatusLight(StatusLight.Green)
} else {
brick.setStatusLight(StatusLight.Orange)
}
})
```
## See also
[calibrate light](/reference/sensors/color-sensor/calibrate-light)

View File

@ -1,16 +1,27 @@
# On Color Detected
# on Color Detected
Run some code when the color you want to watch for is detected.
```sig
sensors.color1.onColorDetected(ColorSensorColor.Blue, function () { })
```
# Parameters
The [color](/reference/sensors/color) you choose to look for is one of the colors that the sensor can detect. If you want to use colors for tracking, it's best to use a color that is the same or very close to the ones the sensor detects.
## Examples
## Parameters
* **color**: the [color](/reference/sensors/color) to watch for.
* **handler**: the code you want to run when the color is detected.
## Example
Show an expression on the screen when the color sensor ``color 1`` sees ``blue``.
```blocks
sensors.color1.onColorDetected(ColorSensorColor.Blue, function () {
brick.showImage(images.expressionsSick)
})
```
## See also
[pause for color](/reference/sensors/color-sensor/pause-for-color), [color](/reference/sensors/color)

View File

@ -0,0 +1,33 @@
# on Light Changed
Run some code when the amount of light dectected changes.
```sig
sensors.color1.onLightChanged(LightIntensityMode.Reflected, LightCondition.Dark, function () {
})
```
You can check for a change in either _ambient_ or _reflected_ light and run some code when it happens. This event happens when the sensor detects light going to ``dark`` or to ``bright``. You choose what condition you will run your code for.
## Parameters
* **mode**: lighting mode to use for detection. This is for either ``ambient`` or ``reflected`` light.
* **condition**: the condition that the light changed to: ``dark`` or ``bright``.
* **handler**: the code you want to run when the light changes.
## Example
Show a message on the screen when the ambient light goes dark.
```blocks
sensors.color1.onLightChanged(LightIntensityMode.Ambient, LightCondition.Dark, function() {
brick.clearScreen();
brick.showString("It just got dark", 1)
brick.showString("Can you see me?", 2)
})
```
## See also
[light](/reference/sensors/color-sensor/light), [on color detected](/reference/sensors/color-sensor/on-color-detected)

View File

@ -0,0 +1,28 @@
# pause For Color
Wait for the sensor to see a certain color.
```sig
sensors.color1.pauseForColor(ColorSensorColor.Blue)
```
The [color](/reference/sensors/color) you choose to look for is one of the colors that the sensor can detect. If you want to use colors for tracking, it's best to use a color that is the same or very close to the ones the sensor detects.
## Parameters
* **color**: the [color](/reference/sensors/color) to watch for.
## Example
Wait for the sensor to see ``blue``. Then, show an expression on the screen.
```blocks
brick.showString("Waiting for blue", 1)
sensors.color1.pauseForColor(ColorSensorColor.Blue)
brick.clearScreen()
brick.showImage(images.expressionsSick)
```
## See also
[on color detected](/reference/sensors/color-sensor/on-color-detected), [color](/reference/sensors/color)

View File

@ -0,0 +1,29 @@
# pause For Light
Wait for the light condition to change.
```sig
sensors.color1.pauseForLight(LightIntensityMode.Reflected, LightCondition.Dark)
```
You can wait for a change in either _ambient_ or _reflected_ light. This event happens when the sensor detects light going to ``dark`` or to ``bright``. You choose what condition you will wait for.
## Parameters
* **mode**: lighting mode to use for detection. This is for either ``ambient`` or ``reflected`` light.
* **condition**: the condition that the light changed to: ``dark`` or ``bright``.
## Example
Wait for the ambient light to go dark, then show an expression on the screen.
```blocks
brick.showString("Waiting for dark", 1)
sensors.color1.pauseForLight(LightIntensityMode.Reflected, LightCondition.Dark)
brick.clearScreen()
brick.showImage(images.expressionsSick)
```
## See also
[on light changed](/reference/sensors/color-sensor/on-light-changed)

View File

@ -1,11 +1,31 @@
# Reflected Light
# reflected Light
Get the amount of reflected light dectected.
```sig
sensors.color1.reflectedLight()
```
The amount of reflected light measured is in the range of `0` (darkest) to `100` (brightest).
## Returns
* a [number](/types/number) that is the amount of ambiernt light measured. No light (darkness) is `0` and the brightest light is `100`.
## Example
Make the status light show ``green`` if the reflected light is greater than `20`.
```blocks
loops.forever(function () {
forever(function () {
if (sensors.color1.reflectedLight() > 20) {
brick.setStatusLight(StatusLight.Green)
} else {
brick.setStatusLight(StatusLight.Orange)
}
})
```
```
## See also
[ambient light](/reference/sensors/color-sensor/ambient-light)

View File

@ -0,0 +1,41 @@
# set Threshold
Set the threshold value for dark or bright light.
```sig
sensors.color1.setThreshold(LightCondition.Dark, 0)
```
Light intensity is measured from `0` (very dark) to `100` (very bright). You can decide what dark and bright mean for your purposes and set a _threshold_ for them. A threshold is a boundary or a limit. If you want a light intensity of `20` mean that it's dark, then you set the sensor threshold for ``dark`` to `20`. Also, if you think that `75` is bright, then you can set the threshold for ``bright`` to that.
After setting a threshold, any event for that light condition won't happen until the amount of light reaches your threshold value:
```block
sensors.color1.setThreshold(LightCondition.Dark, 20)
sensors.color1.onLightChanged(LightIntensityMode.Reflected, LightCondition.Dark, function () {
brick.showMood(moods.sleeping)
})
```
## Parameters
* **condition**: the light intensity threshold to set, ``dark`` or ``bright``.
* **value**: the value of light intensity for the threshold: `0` for very dark to `100` for very bright.
## Example
Make a daylight alarm. When the ambient light reaches `70` flash the status light and play a sound.
```blocks
sensors.color3.setThreshold(LightCondition.Bright, 70)
sensors.color3.onLightChanged(LightIntensityMode.Ambient, LightCondition.Bright, function () {
brick.setStatusLight(StatusLight.GreenFlash)
for (let i = 0; i < 5; i++) {
music.playSoundEffectUntilDone(sounds.mechanicalBackingAlert)
}
})
```
## See also
[threshold](/reference/sensors/color-sensor/threshold)

View File

@ -0,0 +1,27 @@
# threshold
Get the threshold value for dark or bright light.
```sig
sensors.color1.threshold(LightCondition.Dark)
```
Light intensity is measured from `0` (very dark) to `100` (very bright). A _threshold_ sets what dark and bright mean for your purposes. A threshold is a boundary or a limit. If a light intensity of `20` means that it's dark, then the sensor threshold for ``dark`` is `20`. Also, if `75` means bright, then the threshold value for ``bright`` is `75`.
## Returns
* a [number](/types/number) that is the amount of light set for the threshold. No light (darkness) is `0` and the brightest light is `100`.
## Example
Find out what light level is set as the ``dark`` threshold when a dark light event happens.
```blocks
sensors.color3.onLightChanged(LightIntensityMode.Reflected, LightCondition.Dark, function () {
brick.showValue("DarknessThresholdValue", sensors.color3.threshold(LightCondition.Dark), 1)
})
```
## See also
[set threshold](/reference/sensors/color-sensor/set-threshold)

View File

@ -0,0 +1,55 @@
# color
Get a color that the sensor can detect that is close to the color you asked for.
```sig
sensors.color(ColorSensorColor.Blue)
```
Since the color sensor can accurately detect some basic colors, you can't just tell it to look for any color. The sensor may recoginze some color component of the color you ask for. So, you can get a simple color that matches some of your color and tell the sensor to look for that.
## Parameters
* **color**: a color to match with a detectable color. The colors to choose from are:
>* ``blue``
>* ``green``
>* ``yellow``
>* ``red``
>* ``white``
>* ``brown``
## Returns
* a color value that the color sensor can detect. The detectable colors are:
>* ``blue``
>* ``green``
>* ``yellow``
>* ``red``
>* ``white``
>* ``brown``
## ~hint
Currently, the colors you can ask for (input colors) and the colors returned are the same.
## ~
## Example
Turn the status light to ``green`` if the color detected by the ``color 1`` sensor is green.
```blocks
forever(function () {
if (sensors.color1.color() == sensors.color(ColorSensorColor.Green)) {
brick.setStatusLight(StatusLight.Green)
} else {
brick.setStatusLight(StatusLight.Orange)
}
})
```
## See also
[color](/reference/sensors/color-sensor/color)

View File

@ -161,7 +161,7 @@ namespace brick {
// this needs to be done in query(), which is run without the main JS execution mutex
// otherwise, while(true){} will lock the device
if (ret & DAL.BUTTON_ID_ESCAPE) {
motors.stopAllMotors(); // ensuring that all motors are off
motors.stopAll(); // ensuring that all motors are off
control.reset()
}
return ret
@ -248,7 +248,7 @@ namespace brick {
/**
* Set lights.
* @param pattern the lights pattern to use. eg: BrickLight.Orange
* @param pattern the lights pattern to use. eg: StatusLight.Orange
*/
//% blockId=setLights block="set status light to %pattern"
//% weight=100 group="Buttons"

29
libs/core/enums.d.ts vendored Normal file
View File

@ -0,0 +1,29 @@
// Auto-generated. Do not edit.
/**
* Mode for lseek()
*/
declare const enum SeekWhence {
Set = 0,
Current = 1,
End = 2,
}
/**
* Drawing modes
*/
declare const enum Draw {
Normal = 0x00,
Clear = 0x01,
Xor = 0x02,
Fill = 0x04,
Transparent = 0x08,
Double = 0x10,
Quad = 0x20,
}
// Auto-generated. Do not edit. Really.

View File

@ -15,7 +15,7 @@ namespace sensors.internal {
let prev = query()
changeHandler(prev, prev)
while (true) {
loops.pause(periodMs)
pause(periodMs)
let curr = query()
if (prev !== curr) {
changeHandler(prev, curr)
@ -57,9 +57,9 @@ namespace sensors.internal {
uartMM = control.mmap("/dev/lms_uart", UartOff.Size, 0)
if (!uartMM) control.fail("no uart sensor")
loops.forever(() => {
forever(() => {
detectDevices()
loops.pause(500)
pause(500)
})
for (let info_ of sensorInfos) {
@ -258,7 +258,7 @@ namespace sensors.internal {
if (port < 0) return 0
let s = getUartStatus(port)
if (s) return s
loops.pause(25)
pause(25)
}
}
@ -280,7 +280,7 @@ namespace sensors.internal {
uartMM.setNumber(NumberFormat.Int8LE, UartOff.Status + port,
getUartStatus(port) & 0xfffe)
loops.pause(10)
pause(10)
}
}
@ -299,7 +299,7 @@ namespace sensors.internal {
} else {
break
}
loops.pause(10)
pause(10)
}
}

View File

@ -113,8 +113,8 @@ namespace motors {
//% blockId=motorStopAll block="stop all motors"
//% weight=1
//% group="Move"
//% help=motors/stop-all-motors
export function stopAllMotors() {
//% help=motors/stop-all
export function stopAll() {
const b = mkCmd(Output.ALL, DAL.opOutputStop, 0)
writePWM(b)
}
@ -134,17 +134,17 @@ namespace motors {
protected _brake: boolean;
private _initialized: boolean;
private _init: () => void;
private _setSpeed: (speed: number) => void;
private _run: (speed: number) => void;
private _move: (steps: boolean, stepsOrTime: number, speed: number) => void;
constructor(port: Output, init: () => void, setSpeed: (speed: number) => void, move: (steps: boolean, stepsOrTime: number, speed: number) => void) {
constructor(port: Output, init: () => void, run: (speed: number) => void, move: (steps: boolean, stepsOrTime: number, speed: number) => void) {
super();
this._port = port;
this._portName = outputToName(this._port);
this._brake = false;
this._initialized = false;
this._init = init;
this._setSpeed = setSpeed;
this._run = run;
this._move = move;
}
@ -202,7 +202,7 @@ namespace motors {
// if we've recently completed a motor command with brake
// allow 500ms for robot to settle
if(this._brake)
loops.pause(500);
pause(500);
}
/**
@ -218,17 +218,17 @@ namespace motors {
}
/**
* Sets the motor speed for limited time or distance.
* Runs the motor at a given speed for limited time or distance.
* @param speed the speed from ``100`` full forward to ``-100`` full backward, eg: 50
* @param value (optional) measured distance or rotation
* @param unit (optional) unit of the value
*/
//% blockId=motorSetSpeed block="set %motor speed to %speed=motorSpeedPicker|\\%||for %value %unit"
//% blockId=motorRun block="run %motor at %speed=motorSpeedPicker|\\%||for %value %unit"
//% weight=100 blockGap=8
//% group="Move"
//% expandableArgumentMode=toggle
//% help=motors/motor/set-speed
setSpeed(speed: number, value: number = 0, unit: MoveUnit = MoveUnit.MilliSeconds) {
//% help=motors/motor/run
run(speed: number, value: number = 0, unit: MoveUnit = MoveUnit.MilliSeconds) {
this.init();
speed = Math.clamp(-100, 100, speed >> 0);
// stop if speed is 0
@ -238,7 +238,7 @@ namespace motors {
}
// special: 0 is infinity
if (value == 0) {
this._setSpeed(speed);
this._run(speed);
return;
}
// timed motor moves
@ -421,28 +421,28 @@ namespace motors {
}
}
//% whenUsed fixedInstance block="large A"
//% whenUsed fixedInstance block="large motor A"
export const largeA = new Motor(Output.A, true);
//% whenUsed fixedInstance block="large B"
//% whenUsed fixedInstance block="large motor B"
export const largeB = new Motor(Output.B, true);
//% whenUsed fixedInstance block="large C"
//% whenUsed fixedInstance block="large motor C"
export const largeC = new Motor(Output.C, true);
//% whenUsed fixedInstance block="large D"
//% whenUsed fixedInstance block="large motor D"
export const largeD = new Motor(Output.D, true);
//% whenUsed fixedInstance block="medium A"
//% whenUsed fixedInstance block="medium motor A"
export const mediumA = new Motor(Output.A, false);
//% whenUsed fixedInstance block="medium B"
//% whenUsed fixedInstance block="medium motor B"
export const mediumB = new Motor(Output.B, false);
//% whenUsed fixedInstance block="medium C"
//% whenUsed fixedInstance block="medium motor C"
export const mediumC = new Motor(Output.C, false);
//% whenUsed fixedInstance block="medium D"
//% whenUsed fixedInstance block="medium motor D"
export const mediumD = new Motor(Output.D, false);
//% fixedInstances
@ -586,16 +586,16 @@ namespace motors {
}
}
//% whenUsed fixedInstance block="large B+C"
//% whenUsed fixedInstance block="large motors B+C"
export const largeBC = new SynchedMotorPair(Output.BC);
//% whenUsed fixedInstance block="large A+D"
//% whenUsed fixedInstance block="large motors A+D"
export const largeAD = new SynchedMotorPair(Output.AD);
//% whenUsed fixedInstance block="large A+B"
//% whenUsed fixedInstance block="large motors A+B"
export const largeAB = new SynchedMotorPair(Output.AB);
//% whenUsed fixedInstance block="large C+D"
//% whenUsed fixedInstance block="large motors C+D"
export const largeCD = new SynchedMotorPair(Output.CD);
function reset(out: Output) {

144
libs/core/shims.d.ts vendored Normal file
View File

@ -0,0 +1,144 @@
// Auto-generated. Do not edit.
declare namespace control {
/** Create new file mapping in memory */
//% shim=control::mmap
function mmap(filename: string, size: int32, offset: int32): MMap;
}
declare interface MMap {
/**
* Write a number in specified format in the buffer.
*/
//% shim=MMapMethods::setNumber
setNumber(format: NumberFormat, offset: int32, value: number): void;
/**
* Read a number in specified format from the buffer.
*/
//% shim=MMapMethods::getNumber
getNumber(format: NumberFormat, offset: int32): number;
/**
* Read a range of bytes into a buffer.
*/
//% offset.defl=0 length.defl=-1 shim=MMapMethods::slice
slice(offset?: int32, length?: int32): Buffer;
/** Returns the length of a Buffer object. */
//% property shim=MMapMethods::length
length: int32;
/** Perform ioctl(2) on the underlaying file */
//% shim=MMapMethods::ioctl
ioctl(id: uint32, data: Buffer): int32;
/** Perform write(2) on the underlaying file */
//% shim=MMapMethods::write
write(data: Buffer): int32;
/** Perform read(2) on the underlaying file */
//% shim=MMapMethods::read
read(data: Buffer): int32;
/** Set pointer on the underlaying file. */
//% shim=MMapMethods::lseek
lseek(offset: int32, whence: SeekWhence): int32;
}
declare namespace control {
/**
* Announce that an event happened to registered handlers.
* @param src ID of the Component that generated the event
* @param value Component specific code indicating the cause of the event.
* @param mode optional definition of how the event should be processed after construction.
*/
//% weight=21 blockGap=12 blockId="control_raise_event"
//% block="raise event|from %src|with value %value" blockExternalInputs=1 shim=control::raiseEvent
function raiseEvent(src: int32, value: int32): void;
/**
* Allocates the next user notification event
*/
//% help=control/allocate-notify-event shim=control::allocateNotifyEvent
function allocateNotifyEvent(): int32;
/** Write data to DMESG debugging buffer. */
//% shim=control::dmesg
function dmesg(s: string): void;
}
declare namespace serial {
/** Send DMESG debug buffer over serial. */
//% shim=serial::writeDmesg
function writeDmesg(): void;
}
declare namespace screen {
/** Decompresses a 1-bit gray scale PNG image to image format. */
//% shim=screen::unpackPNG
function unpackPNG(png: Buffer): Image;
}
declare namespace screen {
/** Clear screen and reset font to normal. */
//% shim=screen::clear
function clear(): void;
/** Makes an image bound to a buffer. */
//% shim=screen::imageOf
function imageOf(buf: Buffer): Image;
}
//% fixedInstances
declare interface Image {
/** Returns the underlaying Buffer object. */
//% property shim=ImageMethods::buffer
buffer: Buffer;
/** Returns the width of an image. */
//% property shim=ImageMethods::width
width: int32;
/** Returns the height of an image. */
//% property shim=ImageMethods::height
height: int32;
/** Double size of an image. */
//% shim=ImageMethods::doubled
doubled(): Image;
/** Draw an image on the screen. */
//% shim=ImageMethods::draw
draw(x: int32, y: int32, mode: Draw): void;
}
declare namespace output {
/**
* Create a new zero-initialized buffer.
* @param size number of bytes in the buffer
*/
//% shim=output::createBuffer
function createBuffer(size: int32): Buffer;
}
declare namespace motors {
/**
* Mark a motor as used
*/
//% shim=motors::__motorUsed
function __motorUsed(port: int32, large: boolean): void;
}
declare namespace sensors {
/**
* Mark a sensor as used
*/
//% shim=sensors::__sensorUsed
function __sensorUsed(port: int32, type: int32): void;
}
// Auto-generated. Do not edit. Really.

View File

@ -31,15 +31,15 @@ brick.buttonUp.onEvent(ButtonEvent.Bumped, () => {
let num = 0
loops.forever(() => {
forever(() => {
serial.writeDmesg()
loops.pause(100)
pause(100)
})
/*
loops.forever(() => {
forever(() => {
let v = input.color.getColor()
screen.print(10, 60, v + " ")
loops.pause(200)
pause(200)
})
*/

View File

@ -41,7 +41,7 @@ namespace control {
//% blockId=timerPauseUntil block="%timer|pause until (ms) %ms"
pauseUntil(ms: number) {
const remaining = this.millis() - ms;
loops.pause(Math.max(0, remaining));
pause(Math.max(0, remaining));
}
}

Some files were not shown because too many files have changed in this diff Show More