Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
83793fc668 | ||
|
47ee87fe72 | ||
|
374fa36548 | ||
|
358ef7e19f |
35
.github/ISSUE_TEMPLATE/bug_report.md
vendored
35
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@ -1,35 +0,0 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
|
||||
---
|
||||
|
||||
**Describe the bug**
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
**To Reproduce**
|
||||
Steps to reproduce the behavior:
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
|
||||
**Expected behavior**
|
||||
A clear and concise description of what you expected to happen.
|
||||
|
||||
**Screenshots**
|
||||
Add screenshots to help explain your problem. You can copy paste the screenshot in the github report. The .gif screen recording is very useful as well.
|
||||
|
||||
**Desktop (please complete the following information):**
|
||||
- OS: [e.g. iOS]
|
||||
- Browser [e.g. chrome, safari]
|
||||
- Version [e.g. 22]
|
||||
|
||||
**Smartphone (please complete the following information):**
|
||||
- Device: [e.g. iPhone6]
|
||||
- OS: [e.g. iOS8.1]
|
||||
- Browser [e.g. stock browser, safari]
|
||||
- Version [e.g. 22]
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the problem here.
|
17
.github/ISSUE_TEMPLATE/feature_request.md
vendored
17
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@ -1,17 +0,0 @@
|
||||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea for this project
|
||||
|
||||
---
|
||||
|
||||
**Is your feature request related to a problem? Please describe.**
|
||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||
|
||||
**Describe the solution you'd like**
|
||||
A clear and concise description of what you want to happen.
|
||||
|
||||
**Describe alternatives you've considered**
|
||||
A clear and concise description of any alternative solutions or features you've considered.
|
||||
|
||||
**Additional context**
|
||||
Add any other context or screenshots about the feature request here.
|
9
.github/calibre/image-actions.yml
vendored
9
.github/calibre/image-actions.yml
vendored
@ -1,9 +0,0 @@
|
||||
jpeg:
|
||||
quality: 80
|
||||
png:
|
||||
quality: 80
|
||||
webp:
|
||||
quality: 80
|
||||
ignorePaths:
|
||||
- "node_modules/**"
|
||||
- "libs/**"
|
@ -1,16 +0,0 @@
|
||||
name: Compress images
|
||||
on:
|
||||
pull_request:
|
||||
paths:
|
||||
- 'docs/**.jpg'
|
||||
- 'docs/**.png'
|
||||
jobs:
|
||||
build:
|
||||
name: calibreapp/image-actions
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@master
|
||||
- name: calibreapp/image-actions
|
||||
uses: docker://calibreapp/github-image-actions
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
40
.github/workflows/pxt-buildmain.yml
vendored
40
.github/workflows/pxt-buildmain.yml
vendored
@ -1,40 +0,0 @@
|
||||
name: pxt-buildmain
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- 'master'
|
||||
- 'main'
|
||||
create:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [14.x]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
- name: npm install
|
||||
run: |
|
||||
sudo apt-get install xvfb
|
||||
sudo npm install -g pxt
|
||||
npm install
|
||||
- name: pxt ci
|
||||
run: |
|
||||
pxt ci
|
||||
env:
|
||||
CROWDIN_KEY: ${{ secrets.CROWDIN_KEY }}
|
||||
PXT_ACCESS_TOKEN: ${{ secrets.PXT_ACCESS_TOKEN }}
|
||||
PXT_RELEASE_REPO: ${{ secrets.PXT_RELEASE_REPO }}
|
||||
NPM_ACCESS_TOKEN: ${{ secrets.NPM_ACCESS_TOKEN }}
|
||||
CHROME_BIN: chromium-browser
|
||||
DISPLAY: :99.0
|
||||
CI: true
|
31
.github/workflows/pxt-buildpr.yml
vendored
31
.github/workflows/pxt-buildpr.yml
vendored
@ -1,31 +0,0 @@
|
||||
name: pxt-buildpr
|
||||
|
||||
on: [pull_request]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [14.x]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
- name: npm install
|
||||
run: |
|
||||
sudo apt-get install xvfb
|
||||
sudo npm install -g pxt
|
||||
npm install
|
||||
- name: pxt ci
|
||||
run: |
|
||||
pxt ci
|
||||
env:
|
||||
CHROME_BIN: chromium-browser
|
||||
DISPLAY: :99.0
|
||||
CI: true
|
39
.github/workflows/pxt-buildpush.yml
vendored
39
.github/workflows/pxt-buildpush.yml
vendored
@ -1,39 +0,0 @@
|
||||
name: pxt-buildpush
|
||||
|
||||
on:
|
||||
push:
|
||||
# main/master has its own build that includes the crowdin key
|
||||
branches-ignore:
|
||||
- 'main'
|
||||
- 'master'
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [14.x]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
- name: npm install
|
||||
run: |
|
||||
sudo apt-get install xvfb
|
||||
sudo npm install -g pxt
|
||||
npm install
|
||||
- name: pxt ci
|
||||
run: |
|
||||
pxt ci
|
||||
env:
|
||||
PXT_ACCESS_TOKEN: ${{ secrets.PXT_ACCESS_TOKEN }}
|
||||
PXT_RELEASE_REPO: ${{ secrets.PXT_RELEASE_REPO }}
|
||||
NPM_ACCESS_TOKEN: ${{ secrets.NPM_ACCESS_TOKEN }}
|
||||
CHROME_BIN: chromium-browser
|
||||
DISPLAY: :99.0
|
||||
CI: true
|
2
.gitignore
vendored
2
.gitignore
vendored
@ -16,8 +16,6 @@ clients/win10/*.opendb
|
||||
clients/**/bin/**
|
||||
clients/**/obj/**
|
||||
clients/electron/projects
|
||||
libs/**/_locales/**
|
||||
package-lock.json
|
||||
|
||||
videos/**
|
||||
|
||||
|
42
README.md
42
README.md
@ -1,34 +1,32 @@
|
||||
# LEGO® MINDSTORMS® Education EV3 for Microsoft MakeCode [![Build Status](https://travis-ci.org/microsoft/pxt-ev3.svg?branch=master)](https://travis-ci.org/microsoft/pxt-ev3)
|
||||
# LEGO Mindstorms EV3 target for PXT
|
||||
|
||||
This repo contains the editor target hosted at https://makecode.mindstorms.com
|
||||
[![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/)
|
||||
|
||||
## Local setup
|
||||
This repo contains the editor target hosted at https://d541eec2-1e96-4b7b-a223-da9d01d0337a.pxt.io/
|
||||
|
||||
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
|
||||
|
||||
## Local Dev setup
|
||||
|
||||
These instructions assume familiarity with dev tools and languages.
|
||||
|
||||
* install Node.js 8.9.4+
|
||||
* install Node.js 6+
|
||||
* install Docker; make sure `docker` command is in your `PATH`
|
||||
* (optional) install [Visual Studio Code](https://code.visualstudio.com/)
|
||||
|
||||
In a common folder,
|
||||
|
||||
* clone https://github.com/Microsoft/pxt to ``pxt`` folder
|
||||
* clone https://github.com/Microsoft/pxt-common-packages to ``pxt-common-packages`` folder
|
||||
* clone https://github.com/Microsoft/pxt-ev3 to ``pxt-ev3`` folder
|
||||
* go to ``pxt`` and run
|
||||
|
||||
```
|
||||
npm install
|
||||
typings install
|
||||
```
|
||||
|
||||
* to run the local server,
|
||||
```
|
||||
pxt serve --cloud
|
||||
```
|
||||
|
||||
## Local Dev setup
|
||||
|
||||
In the common folder,
|
||||
|
||||
* clone https://github.com/Microsoft/pxt to ``pxt`` folder
|
||||
* clone https://github.com/Microsoft/pxt-common-packages to ``pxt-common-packages`` folder
|
||||
|
||||
* go to ``pxt-common-packages`` and run
|
||||
|
||||
```
|
||||
@ -60,12 +58,18 @@ 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/
|
||||
|
||||
## License
|
||||
MIT
|
||||
|
||||
## Trademarks
|
||||
MICROSOFT, the Microsoft Logo, and MAKECODE are registered trademarks of Microsoft Corporation. They can only be used for the purposes described in and in accordance with Microsoft’s Trademark and Brand guidelines published at https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general.aspx. If the use is not covered in Microsoft’s published guidelines or you are not sure, please consult your legal counsel or the MakeCode team (makecode@microsoft.com).
|
||||
|
||||
## Code of Conduct
|
||||
|
||||
This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.
|
||||
|
41
SECURITY.md
41
SECURITY.md
@ -1,41 +0,0 @@
|
||||
<!-- BEGIN MICROSOFT SECURITY.MD V0.0.7 BLOCK -->
|
||||
|
||||
## Security
|
||||
|
||||
Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/).
|
||||
|
||||
If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below.
|
||||
|
||||
## Reporting Security Issues
|
||||
|
||||
**Please do not report security vulnerabilities through public GitHub issues.**
|
||||
|
||||
Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report).
|
||||
|
||||
If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey).
|
||||
|
||||
You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc).
|
||||
|
||||
Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue:
|
||||
|
||||
* Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.)
|
||||
* Full paths of source file(s) related to the manifestation of the issue
|
||||
* The location of the affected source code (tag/branch/commit or direct URL)
|
||||
* Any special configuration required to reproduce the issue
|
||||
* Step-by-step instructions to reproduce the issue
|
||||
* Proof-of-concept or exploit code (if possible)
|
||||
* Impact of the issue, including how an attacker might exploit the issue
|
||||
|
||||
This information will help us triage your report more quickly.
|
||||
|
||||
If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs.
|
||||
|
||||
## Preferred Languages
|
||||
|
||||
We prefer all communications to be in English.
|
||||
|
||||
## Policy
|
||||
|
||||
Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd).
|
||||
|
||||
<!-- END MICROSOFT SECURITY.MD BLOCK -->
|
14
cmds/cmds.ts
Normal file
14
cmds/cmds.ts
Normal file
@ -0,0 +1,14 @@
|
||||
/// <reference path="../node_modules/pxt-core/built/pxtlib.d.ts" />
|
||||
|
||||
import * as fs from 'fs';
|
||||
|
||||
const deploy = require("./editor/deploy")
|
||||
|
||||
export function deployCoreAsync(resp: pxtc.CompileResult) {
|
||||
return deploy.deployCoreAsync(resp, process.env["PXT_SERIAL"] ? false : true)
|
||||
.then(() => {
|
||||
fs.writeFileSync("built/full-" + pxtc.BINARY_UF2, resp.outfiles[pxtc.BINARY_UF2], {
|
||||
encoding: "base64"
|
||||
})
|
||||
})
|
||||
}
|
6
cmds/pxtrequire.ts
Normal file
6
cmds/pxtrequire.ts
Normal file
@ -0,0 +1,6 @@
|
||||
/// <reference path="../node_modules/pxt-core/built/pxtlib.d.ts" />
|
||||
|
||||
import * as path from "path";
|
||||
export let pxtCore = require("pxt-core");
|
||||
// require.resolve() gives path to [pxt dir]/built/pxt.js, so move up twice to get pxt root dir
|
||||
export let pxtCoreDir = path.resolve(require.resolve("pxt-core"), "..", "..");
|
14
cmds/tsconfig.json
Normal file
14
cmds/tsconfig.json
Normal file
@ -0,0 +1,14 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "es5",
|
||||
"noImplicitAny": true,
|
||||
"noImplicitReturns": true,
|
||||
"declaration": true,
|
||||
"outDir": "../built",
|
||||
"module": "commonjs",
|
||||
"rootDir": ".",
|
||||
"newLine": "LF",
|
||||
"sourceMap": false,
|
||||
"types": ["node"]
|
||||
}
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
<footer class="ui vertical footer segment hideprint" aria-hidden="false">
|
||||
<div class="ui center aligned container">
|
||||
<div class="ui section divider"></div>
|
||||
<div class="ui container horizontal small divided link list">
|
||||
<!-- <a class="item" href="https://makecode.com/contact" target="_blank" rel="noopener">Contact Us</a> -->
|
||||
<a class="item" href="https://makecode.com/privacy" target="_blank" rel="noopener">Privacy & Cookies</a>
|
||||
<a class="item" href="https://makecode.com/termsofuse" target="_blank" rel="noopener"> Terms Of Use</a>
|
||||
<a class="item" href="https://makecode.com/trademarks" target="_blank" rel="noopener">Trademarks</a>
|
||||
<div class="item">© 2018 Microsoft</div>
|
||||
</div>
|
||||
<div class="ui container horizontal small divided link list">
|
||||
<a class="ui centered item" href="https://makecode.com/" title="Microsoft MakeCode" target="_blank" rel="noopener">Powered by Microsoft MakeCode</a>
|
||||
</div>
|
||||
<div class="ui centered container small list">
|
||||
<p class="item">LEGO, the LEGO logo, MINDSTORMS and the MINDSTORMS EV3 logo are trademarks and/ or copyrights of the LEGO Group. ©2018 The LEGO Group. All rights reserved.</p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
130
docs/SUMMARY.md
130
docs/SUMMARY.md
@ -1,135 +1,5 @@
|
||||
# @extends
|
||||
|
||||
## Support #support
|
||||
|
||||
* [Troubleshoot](/troubleshoot)
|
||||
* [EV3 Manager](https://ev3manager.education.lego.com/)
|
||||
* [Bluetooth](/bluetooth)
|
||||
* [Forum](https://forum.makecode.com)
|
||||
* [LEGO Support](https://www.lego.com/service/)
|
||||
* [FIRST LEGO League](/fll)
|
||||
|
||||
## Projects #projects
|
||||
|
||||
* [Getting Started](/getting-started)
|
||||
* [Try](/getting-started/try)
|
||||
* [Use](/getting-started/use)
|
||||
|
||||
* [Tutorials](/tutorials)
|
||||
* [Wake Up!](/tutorials/wake-up)
|
||||
* [Make An Animation](/tutorials/make-an-animation)
|
||||
* [What Animal Am I?](/tutorials/what-animal-am-i)
|
||||
* [Music Brick](/tutorials/music-brick)
|
||||
* [Run Motors](/tutorials/run-motors)
|
||||
* [Tank ZigZag](/tutorials/tank-zigzag)
|
||||
* [Touch to Run](/tutorials/touch-to-run)
|
||||
* [Touch Sensor Values](/tutorials/touch-sensor-values)
|
||||
* [What Color?](/tutorials/what-color)
|
||||
* [Line Following](/tutorials/line-following)
|
||||
* [Red Light, Green Light](/tutorials/redlight-greenlight)
|
||||
* [Reflected Light Measure](/tutorials/reflected-light-measure)
|
||||
* [Reflected Light Calibration](/tutorials/reflected-light-calibration)
|
||||
* [Object Near?](/tutorials/object-near)
|
||||
* [Security Alert](/tutorials/security-alert)
|
||||
|
||||
* [Coding](/coding)
|
||||
* [Autonomous Parking](/coding/autonomous-parking)
|
||||
* [Object Detection](/coding/object-detection)
|
||||
* [Line Detection](/coding/line-detection)
|
||||
|
||||
* [Design Engineering](/design-engineering)
|
||||
* [Make It Move Without Wheels](/design-engineering/make-it-move)
|
||||
* [Make It Smarter and Faster](/design-engineering/make-it-smarter)
|
||||
* [Make a System that Communicates](/design-engineering/make-it-communicate)
|
||||
|
||||
* [Maker](/maker)
|
||||
* [Make a Sound Machine](/maker/sound-machine)
|
||||
* [Make a Security Gadget](/maker/security-gadget)
|
||||
|
||||
## Reference #reference
|
||||
|
||||
* [Reference](/reference)
|
||||
* [Brick](/reference/brick)
|
||||
* [show string](/reference/brick/show-string)
|
||||
* [show number](/reference/brick/show-number)
|
||||
* [show value](/reference/brick/show-value)
|
||||
* [show mood](/reference/brick/show-mood)
|
||||
* [show image](/reference/brick/show-image)
|
||||
* [clear screen](/reference/brick/clear-screen)
|
||||
* [show ports](/reference/brick/show-ports)
|
||||
* [on event](/reference/brick/button/on-event)
|
||||
* [is pressed](/reference/brick/button/is-pressed)
|
||||
* [was pressed](/reference/brick/button/was-pressed)
|
||||
* [pause until](/reference/brick/button/pause-until)
|
||||
* [set light](/reference/brick/set-status-light)
|
||||
* [battery level](/reference/brick/battery-level)
|
||||
* [Motors](/reference/motors)
|
||||
* [run](/reference/motors/motor/run)
|
||||
* [stop](/reference/motors/motor/stop)
|
||||
* [reset](/reference/motors/motor/reset)
|
||||
* [set brake](/reference/motors/motor/set-brake)
|
||||
* [set inverted](/reference/motors/motor/set-inverted)
|
||||
* [set regulated](/reference/motors/motor/set-regulated)
|
||||
* [tank](/reference/motors/synced/tank)
|
||||
* [steer](/reference/motors/synced/steer)
|
||||
* [angle](/reference/motors/motor/angle)
|
||||
* [speed](/reference/motors/motor/speed)
|
||||
* [clear counts](/reference/motors/motor/clear-counts)
|
||||
* [stop all motors](/reference/motors/stop-all)
|
||||
* [Sensors](/reference/sensors)
|
||||
* [Touch](/reference/sensors/touch-sensor)
|
||||
* [on event](/reference/sensors/touch-sensor/on-event)
|
||||
* [pause until](/reference/sensors/touch-sensor/pause-until)
|
||||
* [is pressed](/reference/sensors/touch-sensor/is-pressed)
|
||||
* [was pressed](/reference/sensors/touch-sensor/was-pressed)
|
||||
* [Gyro](/reference/sensors/gyro)
|
||||
* [angle](/reference/sensors/gyro/angle)
|
||||
* [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)
|
||||
* [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 until color detected](/reference/sensors/color-sensor/pause-until-color-detected)
|
||||
* [on light detected](/reference/sensors/color-sensor/on-light-detected)
|
||||
* [pause until light condition detected](/reference/sensors/color-sensor/pause-until-light-detected)
|
||||
* [color](/reference/sensors/color-sensor/color)
|
||||
* [light](/reference/sensors/color-sensor/ambient-light)
|
||||
* [Music](/reference/music)
|
||||
* [play sound effect](/reference/music/play-sound-effect)
|
||||
* [play sound effect until done](/reference/music/play-sound-effect-until-done)
|
||||
* [play tone](/reference/music/play-tone)
|
||||
* [ring tone](/reference/music/ring-tone)
|
||||
* [stop all sounds](/reference/music/stop-all-sounds)
|
||||
* [rest](/reference/music/rest)
|
||||
* [change tempo by](/reference/music/change-tempo-by)
|
||||
* [set tempo](/reference/music/set-tempo)
|
||||
* [note frequency](/reference/music/note-frequency)
|
||||
* [beat](/reference/music/beat)
|
||||
* [set volume](/reference/music/set-volume)
|
||||
* [Control](/reference/control)
|
||||
* [Timer](/reference/control/timer)
|
||||
* [seconds](/reference/control/timer/seconds)
|
||||
* [millis](/reference/control/timer/millis)
|
||||
* [reset](/reference/control/timer/reset)
|
||||
* [pause until](/reference/control/timer/pause-until)
|
||||
* [Console](/reference/console)
|
||||
* [log](/reference/console/log)
|
||||
* [log value](/reference/console/log-value)
|
||||
* [send to screen](/reference/console/send-to-screen)
|
||||
|
||||
## #misc
|
||||
|
||||
## devs
|
||||
|
@ -6,52 +6,38 @@ Welcome to the **Microsoft MakeCode** editor for the **@boardname@**!
|
||||
|
||||
You can program the @boardname@ using [Blocks](/blocks) or [JavaScript](/javascript) in your web browser:
|
||||
|
||||
```blocks
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Bumped, () => {
|
||||
motors.largeA.run(50)
|
||||
```block
|
||||
input.buttonA.onEvent(ButtonEvent.Click, () => {
|
||||
light.showRing(`blue blue blue blue blue blue blue blue blue blue`)
|
||||
})
|
||||
```
|
||||
```typescript
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Bumped, () => {
|
||||
motors.largeA.run(50)
|
||||
input.buttonA.onEvent(ButtonEvent.Click, () => {
|
||||
light.showRing(`blue blue blue blue blue blue blue blue blue blue`)
|
||||
})
|
||||
```
|
||||
|
||||
The editor works in [most modern browsers](/browsers). It works [offline](/offline) once loaded and doesn't require any installation. Take a look at some of the [features](/about/editor-features) of the editor.
|
||||
The editor work in [most modern browsers](/browsers), work [offline](/offline) once loaded and do not require any installation.
|
||||
|
||||
### ~ hint
|
||||
## [Compile and Flash: Your Program!](/device/usb)
|
||||
|
||||
#### Using LEGO® MINDSTORMS® Education NXT
|
||||
|
||||
The MakeCode editor works with @boardname@. To create code for LEGO® MINDSTORMS® Education NXT, you need to [download](https://education.lego.com/downloads/retiredproducts/nxt/software) the software to program it.
|
||||
|
||||
### ~
|
||||
|
||||
## Compile and Flash: Your Program!
|
||||
|
||||
When you have your code ready, you connect your EV3 Brick to a computer with a USB cable so it appears as an attached drive (named **@drivename@**).
|
||||
When you have your code ready, you connect your @boardname@ to a computer via a USB cable
|
||||
**then press the reset button** so it appears as a mounted drive (named **CPLAYBOOT**).
|
||||
|
||||
Compilation to machine code from [Blocks](/blocks) or [JavaScript](/javascript) happens in the browser. You save the binary
|
||||
program to a **.uf2** file, which you then copy to the **@drivename@** drive. The process of copying will flash the device with the new program.
|
||||
|
||||
### ~ hint
|
||||
|
||||
#### Bluetooth support
|
||||
|
||||
**Experimental support** for Bluetooth download is now available. Please read the [Bluetooth](/bluetooth) page for more information.
|
||||
|
||||
### ~
|
||||
program to a **.uf2** file, which you then copy to the **CPLAYBOOT** drive, which flashes the device with the new program.
|
||||
|
||||
## Simulator: Test Your Code
|
||||
|
||||
You can run your code using the @boardname@ simulator, all inside the same browser window.
|
||||
The simulator has support for the EV3 Brick screen, buttons, sensors, and motors.
|
||||
You can run your code using the micro:bit simulator, all within the confines of a web browser.
|
||||
The simulator has support for the LED screen, buttons, as well as compass, accelerometer, and digital I/O pins.
|
||||
|
||||
```sim
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Bumped, () => {
|
||||
motors.largeA.run(50)
|
||||
motors.mediumD.run(50)
|
||||
sensors.touch1.pauseUntil(ButtonEvent.Pressed)
|
||||
sensors.ultrasonic4.pauseUntil(UltrasonicSensorEvent.ObjectDetected)
|
||||
loops.forever(() => {
|
||||
light.pixels.showAnimation(light.animation(LightAnimation.Rainbow), 1000)
|
||||
})
|
||||
```
|
||||
```
|
||||
|
||||
```package
|
||||
light
|
||||
```
|
||||
|
@ -1,81 +0,0 @@
|
||||
# @extends
|
||||
|
||||
#### #blocks-images
|
||||
|
||||
| |
|
||||
|-|
|
||||
| ![Blocks Toolbox with Loops shelf open](/static/about/blocks-toolbox.png) |
|
||||
| Blocks Toolbox |
|
||||
|
||||
#### #home-images
|
||||
|
||||
| |
|
||||
|-|
|
||||
| ![Home button](/static/about/home-button.png) |
|
||||
| Home Button |
|
||||
|
||||
#### #share-images
|
||||
|
||||
| |
|
||||
|-|
|
||||
| ![Share button](/static/about/share-button.png) |
|
||||
| Share Button |
|
||||
|
||||
#### #blocksjs-images
|
||||
|
||||
| |
|
||||
|-|
|
||||
| ![Switch from Blocks to JavaScript](/static/about/blocks-to-js.gif) |
|
||||
| Switch from Blocks to JavaScript |
|
||||
|
||||
#### #help-images
|
||||
|
||||
| |
|
||||
|-|
|
||||
| ![Help button](/static/about/help-button.png) |
|
||||
| Help Button |
|
||||
|
||||
#### #moresettings-images
|
||||
|
||||
| |
|
||||
|-|
|
||||
| ![More settings button](/static/about/more-settings.png) |
|
||||
| More Button |
|
||||
|
||||
#### #undoredo-images
|
||||
|
||||
| | | |
|
||||
|-|-|-|
|
||||
| ![Undo button](/static/about/undo-button.png) | | ![Redo button](/static/about/redo-button.png) |
|
||||
| Undo Button | | Redo Button |
|
||||
|
||||
#### #zoom-images
|
||||
|
||||
| | | |
|
||||
|-|-|-|
|
||||
| ![Zoom in button](/static/about/zoom-in.png) | | ![Zoom out button](/static/about/zoom-out.png) |
|
||||
| Zoom In | | Zoom Out |
|
||||
|
||||
#### #saveproject-images
|
||||
|
||||
| |
|
||||
|-|
|
||||
| ![Save project field](/static/about/save-project.png) |
|
||||
| Save Project |
|
||||
|
||||
#### #download-images
|
||||
|
||||
| |
|
||||
|-|
|
||||
| ![Download button](/static/about/download-button.png) |
|
||||
| Download Button |
|
||||
|
||||
#### #explorer-images
|
||||
|
||||
| |
|
||||
|-|
|
||||
| ![Explorer button](/static/about/explorer-button.png) |
|
||||
| Explorer Button |
|
||||
| |
|
||||
| ![Explorer File View](/static/about/explorer-view.png) |
|
||||
| Explorer File View |
|
@ -1,3 +1,3 @@
|
||||
{
|
||||
"appref": "v1.4"
|
||||
"appref": "v"
|
||||
}
|
||||
|
@ -3,6 +3,6 @@
|
||||
### #specific
|
||||
|
||||
```cards
|
||||
forever(() => {});
|
||||
pause(0)
|
||||
loops.forever(() => {});
|
||||
loops.pause(0)
|
||||
```
|
@ -1,62 +0,0 @@
|
||||
# Bluetooth
|
||||
|
||||
This page describes the procedure to download MakeCode program to the EV3 brick
|
||||
over Bluetooth.
|
||||
|
||||
## ~ hint
|
||||
|
||||
### WARNING: EXPERIMENTAL FEATURES AHEAD!
|
||||
|
||||
Support for Bluetooth download relies on [Web Serial](https://wicg.github.io/serial/),
|
||||
an experimental browser feature. Web Serial is a work [in progress](https://www.chromestatus.com/feature/6577673212002304);
|
||||
it may change or be removed in future versions without notice.
|
||||
|
||||
By enabling these experimental browser features, you could lose browser data or compromise your device security
|
||||
or privacy.
|
||||
|
||||
## ~
|
||||
|
||||
https://youtu.be/VIq8-6Egtqs
|
||||
|
||||
## Supported browsers
|
||||
|
||||
* Chrome desktop, version 77 and higher, Windows 10 or Mac OS.
|
||||
* [Microsoft Edge Insider desktop](https://www.microsoftedgeinsider.com), version 77 and higher, Windows 10 or Mac OS.
|
||||
|
||||
To make sure your browser is up to date, go to the '...' menu, click "Help" then "About".
|
||||
|
||||
Next you need to enable the experimental features (this may change in the future)
|
||||
|
||||
* go to **chrome://flags/#enable-experimental-web-platform-features** and **enable**
|
||||
**Experimental Web Platform features**
|
||||
|
||||
![A screenshot of the flags page in chrome](/static/bluetooth/experimental.png)
|
||||
|
||||
## Machine Setup
|
||||
|
||||
* pair your EV3 brick with your computer over Bluetooth. This is the usual pairing procedure.
|
||||
|
||||
## Download over Bluetooth
|
||||
|
||||
* go to https://makecode.mindstorms.com/
|
||||
* click on **Download** to start a file download as usual
|
||||
* on the download dialog, you should see a **Bluetooth** button. Click on the
|
||||
**Bluetooth** button to enable the mode.
|
||||
* **make sure the EV3 brick is not running a program**
|
||||
* click on **Download** again to download over bluetooth.
|
||||
|
||||
## Choosing the correct serial port
|
||||
|
||||
Unfortunately, the browser dialog does not make it easy to select which serial port is the brick.
|
||||
|
||||
* On Windows, choose ``Standard Serial over Bluetooth``. There might be multiple of those but only one works. Try your luck! Once you know the COM port number, remember it for the next time around.
|
||||
* On Mac OS, choose ``cu.BRICKNAME-SerialPort``
|
||||
|
||||
## Known issues
|
||||
|
||||
* We do not detect properly that the program is running on the brick. Make sure to stop the program before starting the download procedure.
|
||||
* The list of programs on the brick screen is not updated when uploading via bluetooth.
|
||||
|
||||
## Feedback
|
||||
|
||||
Please send us your feedback through https://forum.makecode.com.
|
176
docs/coding.md
176
docs/coding.md
@ -1,27 +1,171 @@
|
||||
# Coding Activites
|
||||
|
||||
12 computer science activities, with cross-curricular opportunities in design and technology, science, and math.
|
||||
|
||||
## Projects
|
||||
* [Download Curriculum Materials](https://education.lego.com/en-us/downloads/mindstorms-ev3)
|
||||
|
||||
## Three Point Turn
|
||||
|
||||
```codecard
|
||||
[
|
||||
{
|
||||
"name": "Autonomous Parking",
|
||||
"description": "Design cars that can park themselves safely without driver intervention.",
|
||||
"url":"/coding/autonomous-parking",
|
||||
"imageUrl": "/static/lessons/autonomous-parking.png",
|
||||
"cardType": "side"
|
||||
"name": "Three Point Turn 1",
|
||||
"description": "Activity 1",
|
||||
"url":"/coding/three-point-turn-1",
|
||||
"cardType": "example"
|
||||
}, {
|
||||
"name": "Object Detection",
|
||||
"description": "Design ways to avoid accidents between vehicles and objects in the road.",
|
||||
"url":"/coding/object-detection",
|
||||
"imageUrl": "/static/lessons/object-detection.jpg",
|
||||
"cardType": "side"
|
||||
"name": "Three Point Turn 2",
|
||||
"description": "Activity 2",
|
||||
"url":"/coding/three-point-turn-2",
|
||||
"cardType": "example"
|
||||
}, {
|
||||
"name": "Line Detection",
|
||||
"description": "Design ways to improve driving safety by helping to prevent drivers from falling asleep and causing an accident.",
|
||||
"url":"/coding/line-detection",
|
||||
"imageUrl": "/static/lessons/line-detection.jpg",
|
||||
"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"
|
||||
}]
|
||||
```
|
||||
|
@ -1,177 +0,0 @@
|
||||
# Autonomous Parking
|
||||
|
||||
Design cars that can park themselves safely without driver intervention.
|
||||
|
||||
![Autonomous parking graphic](/static/coding/autonomous-parking/auto-parking-connect.jpg)
|
||||
|
||||
## Connect
|
||||
|
||||
**Think about:**
|
||||
|
||||
* How do autonomous cars work?
|
||||
* What would it take to ensure that autonomous cars are safe?
|
||||
* What types of movements do autonomous cars need to perform?
|
||||
|
||||
## Construct
|
||||
|
||||
### Build
|
||||
|
||||
Build a @boardname@ vehicle that can park itself safely without driver intervention. Start by constructing this model:
|
||||
|
||||
[![EV3- Robot Driving Base](/static/coding/autonomous-parking/ev3-robot-driving-base.jpg)](https://le-www-live-s.legocdn.com/sc/media/lessons/mindstorms-ev3/building-instructions/ev3-rem-driving-base-79bebfc16bd491186ea9c9069842155e.pdf)
|
||||
|
||||
### ~hint
|
||||
|
||||
If clicking the above image doesn't open the instructions, right-click on the image and choose "Save link as..." to download the PDF.
|
||||
|
||||
### ~
|
||||
|
||||
### Check
|
||||
|
||||
Before you program, check:
|
||||
|
||||
* Are all the wires correctly connected from the motors to ports B and C?
|
||||
* Are the wheels correctly installed?
|
||||
* Are the wheels rotating freely?
|
||||
|
||||
### Program
|
||||
|
||||
Write a program that will make the robot turn three times in various ways.
|
||||
|
||||
**Think about:**
|
||||
|
||||
* How will you make the robot turn in different ways?
|
||||
* How can the robot make a three point turn?
|
||||
|
||||
### ~hint
|
||||
|
||||
Consider using these blocks in your solution:
|
||||
|
||||
```block
|
||||
motors.largeBC.tank(50, 50)
|
||||
pause(500)
|
||||
```
|
||||
|
||||
### ~
|
||||
|
||||
### Sample Solution - Three Point Turn
|
||||
|
||||
1. When the brick button is pressed, turn the driving base right and stop after 1.5 seconds.
|
||||
2. Turn the driving base left and stop after 1 second.
|
||||
3. Move the driving base forward for 3 seconds.
|
||||
|
||||
```blocks
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Pressed, function () {
|
||||
motors.largeBC.tank(75, 30)
|
||||
loops.pause(1500)
|
||||
motors.largeBC.tank(-30, -75)
|
||||
loops.pause(1000)
|
||||
motors.largeBC.tank(50, 50)
|
||||
loops.pause(3000)
|
||||
})
|
||||
```
|
||||
|
||||
### 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
|
||||
|
||||
Choose one of the following autonomous driving scenarios and create a program for it:
|
||||
|
||||
* Parallel parking
|
||||
* Angle parking
|
||||
* Perpendicular parking
|
||||
|
||||
### ~hint
|
||||
|
||||
Document pseudocode for your program before choosing programming blocks.
|
||||
|
||||
### ~
|
||||
|
||||
### Sample Solution - Parallel Parking
|
||||
|
||||
1. When the brick button is pressed, drive forward in a straight line for 3 rotations.
|
||||
2. Wait for 1 second.
|
||||
3. Reverse motor rotation while turning for 1.5 rotations.
|
||||
4. Reverse motor rotation while turning the other way for 1.5 rotations.
|
||||
5. Drive backward in a straight line for 0.5 rotations.
|
||||
6. Drive forward in a straight line for 0.5 rotations.
|
||||
|
||||
```blocks
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Pressed, function () {
|
||||
motors.largeBC.steer(0, 50, 3, MoveUnit.Rotations)
|
||||
pause(1000)
|
||||
motors.largeBC.steer(-50, -50, 1.5, MoveUnit.Rotations)
|
||||
motors.largeBC.steer(50, -50, 1.5, MoveUnit.Rotations)
|
||||
motors.largeBC.steer(0, -50, 0.5, MoveUnit.Rotations)
|
||||
motors.largeBC.steer(0, 50, 0.5, MoveUnit.Rotations)
|
||||
})
|
||||
```
|
||||
|
||||
### 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.
|
||||
|
||||
### Differentiation
|
||||
|
||||
Create a program that simulates displaying appropriate warning lights while parking.
|
||||
|
||||
### ~hint
|
||||
|
||||
Consider using this block in your solution:
|
||||
|
||||
```block
|
||||
brick.setStatusLight(StatusLight.OrangeFlash)
|
||||
```
|
||||
|
||||
### ~
|
||||
|
||||
### Sample Solution - Simulating Reverse Gear and Reverse Warning Lights
|
||||
|
||||
1. When the brick button is pressed, drive forward in a straight line for 3 rotations.
|
||||
2. Wait for 1 second.
|
||||
3. Set brick status light to orange flash.
|
||||
4. Reverse motor rotation while turning for 1.5 rotations.
|
||||
5. Reverse motor rotation while turning the other way for 1.5 rotations.
|
||||
6. Drive backward in a straight line for 0.5 rotations.
|
||||
7. Set brick status light to off.
|
||||
8. Drive forward in a straight line for 0.5 rotations.
|
||||
|
||||
```blocks
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Pressed, function () {
|
||||
motors.largeBC.steer(0, 50, 3, MoveUnit.Rotations)
|
||||
pause(1000)
|
||||
brick.setStatusLight(StatusLight.OrangeFlash)
|
||||
motors.largeBC.steer(-50, -50, 1.5, MoveUnit.Rotations)
|
||||
motors.largeBC.steer(50, -50, 1.5, MoveUnit.Rotations)
|
||||
motors.largeBC.steer(0, -50, 0.5, MoveUnit.Rotations)
|
||||
brick.setStatusLight(StatusLight.Off)
|
||||
motors.largeBC.steer(0, 50, 0.5, MoveUnit.Rotations)
|
||||
})
|
||||
```
|
||||
|
||||
### 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.
|
||||
|
||||
### Share
|
||||
|
||||
**Think about:**
|
||||
|
||||
* What challenged you?
|
||||
* Were there any surprises?
|
||||
* How can you improve your program?
|
||||
* Can your program be more streamlined? Have you used too many blocks?
|
||||
* Is there a more efficient way to build your program?
|
||||
* How can your program be used in real-world scenarios?
|
||||
|
||||
## Continue
|
||||
|
||||
* Click on the JavaScript tab and experiment with changing the values in the code.
|
||||
* Add a custom image or sounds from the Brick or Music menus.
|
||||
* Create a video of your project, especially your final presentation and your robot’s performance. Explain some important features of your software program.
|
||||
* Include an image of your program with comments.
|
||||
* Add a team photograph!
|
||||
|
||||
Congratulations! What will you design next?
|
10
docs/coding/cruise-control-1.md
Normal file
10
docs/coding/cruise-control-1.md
Normal file
@ -0,0 +1,10 @@
|
||||
# Cruise Control Activity 1
|
||||
|
||||
```blocks
|
||||
let speed = 0;
|
||||
sensors.touch1.onEvent(TouchSensorEvent.Pressed, function () {
|
||||
if (speed < 100)
|
||||
speed = speed + 10;
|
||||
motors.largeBC.setSpeed(speed);
|
||||
})
|
||||
```
|
15
docs/coding/cruise-control-2.md
Normal file
15
docs/coding/cruise-control-2.md
Normal file
@ -0,0 +1,15 @@
|
||||
# Cruise Control Activity 2
|
||||
|
||||
```blocks
|
||||
let speed = 0;
|
||||
sensors.touch1.onEvent(TouchSensorEvent.Pressed, function () {
|
||||
if (speed < 100)
|
||||
speed = speed + 10;
|
||||
motors.largeBC.setSpeed(speed);
|
||||
})
|
||||
sensors.touch2.onEvent(TouchSensorEvent.Pressed, function () {
|
||||
if (speed > -100)
|
||||
speed = speed - 10;
|
||||
motors.largeBC.setSpeed(speed);
|
||||
})
|
||||
```
|
28
docs/coding/cruise-control-3.md
Normal file
28
docs/coding/cruise-control-3.md
Normal file
@ -0,0 +1,28 @@
|
||||
# Cruise Control Activity 3
|
||||
|
||||
```blocks
|
||||
let speed = 0
|
||||
function decelerate() {
|
||||
if (speed > -100) {
|
||||
speed = speed - 10
|
||||
}
|
||||
}
|
||||
function accelerate() {
|
||||
if (speed < 100) {
|
||||
speed = speed + 10
|
||||
}
|
||||
}
|
||||
function update() {
|
||||
brick.clearScreen()
|
||||
brick.printLine("speed: " + speed, 1)
|
||||
motors.largeBC.setSpeed(speed)
|
||||
}
|
||||
sensors.touch2.onEvent(TouchSensorEvent.Pressed, function () {
|
||||
accelerate()
|
||||
update()
|
||||
})
|
||||
sensors.touch1.onEvent(TouchSensorEvent.Pressed, function () {
|
||||
decelerate()
|
||||
update()
|
||||
})
|
||||
```
|
@ -1,65 +0,0 @@
|
||||
# Cruise Control
|
||||
|
||||
Learn how to set and adjust motor speeds.
|
||||
|
||||
## Activity 1
|
||||
|
||||
Increase motor speed when touch sensor `1` is pressed.
|
||||
|
||||
```blocks
|
||||
let speed = 0;
|
||||
sensors.touch1.onEvent(ButtonEvent.Pressed, function () {
|
||||
if (speed < 100)
|
||||
speed = speed + 10;
|
||||
motors.largeBC.run(speed);
|
||||
})
|
||||
```
|
||||
|
||||
## Activity 2
|
||||
|
||||
Add a "reduce" motor speed action when touch sensor `2` is pressed.
|
||||
|
||||
```blocks
|
||||
let speed = 0;
|
||||
sensors.touch1.onEvent(ButtonEvent.Pressed, function () {
|
||||
if (speed < 100)
|
||||
speed = speed + 10;
|
||||
motors.largeBC.run(speed);
|
||||
})
|
||||
sensors.touch2.onEvent(ButtonEvent.Pressed, function () {
|
||||
if (speed > -100)
|
||||
speed = speed - 10;
|
||||
motors.largeBC.run(speed);
|
||||
})
|
||||
```
|
||||
|
||||
## Activity 3
|
||||
|
||||
Refactor your code by moving the speed increase and speed decrease code into ``||functions:accelerate||`` and ``||functions:decelerate||`` functions. Run the motors at the new speed in an ``||functions:update||`` function.
|
||||
|
||||
```blocks
|
||||
let speed = 0
|
||||
function decelerate() {
|
||||
if (speed > -100) {
|
||||
speed = speed - 10
|
||||
}
|
||||
}
|
||||
function accelerate() {
|
||||
if (speed < 100) {
|
||||
speed = speed + 10
|
||||
}
|
||||
}
|
||||
function update() {
|
||||
brick.clearScreen()
|
||||
brick.showString("speed: " + speed, 1)
|
||||
motors.largeBC.run(speed)
|
||||
}
|
||||
sensors.touch2.onEvent(ButtonEvent.Pressed, function () {
|
||||
accelerate()
|
||||
update()
|
||||
})
|
||||
sensors.touch1.onEvent(ButtonEvent.Pressed, function () {
|
||||
decelerate()
|
||||
update()
|
||||
})
|
||||
```
|
11
docs/coding/ignition-1.md
Normal file
11
docs/coding/ignition-1.md
Normal file
@ -0,0 +1,11 @@
|
||||
# Ignition Activity 1
|
||||
|
||||
```blocks
|
||||
sensors.touch1.onEvent(TouchSensorEvent.Pressed, function () {
|
||||
brick.showImage(images.eyesDizzy)
|
||||
})
|
||||
sensors.ultrasonic4.onEvent(UltrasonicSensorEvent.ObjectDetected, function () {
|
||||
brick.showImage(images.eyesTiredMiddle)
|
||||
})
|
||||
brick.showImage(images.eyesSleeping)
|
||||
```
|
12
docs/coding/ignition-2.md
Normal file
12
docs/coding/ignition-2.md
Normal file
@ -0,0 +1,12 @@
|
||||
# Ignition Activity 2
|
||||
|
||||
```blocks
|
||||
while (true) {
|
||||
if (sensors.touch1.wasPressed() &&
|
||||
sensors.ultrasonic4.distance() < 10) {
|
||||
music.playSoundEffectUntilDone(sounds.mechanicalMotorStart)
|
||||
music.playSoundEffectUntilDone(sounds.mechanicalMotorIdle);
|
||||
}
|
||||
loops.pause(1);
|
||||
}
|
||||
```
|
13
docs/coding/ignition-3.md
Normal file
13
docs/coding/ignition-3.md
Normal file
@ -0,0 +1,13 @@
|
||||
# Ignition Activity 3
|
||||
|
||||
```blocks
|
||||
while (true) {
|
||||
if (sensors.ultrasonic4.distance() < 10 &&
|
||||
sensors.touch1.wasPressed() &&
|
||||
brick.buttonEnter.wasPressed()) {
|
||||
music.playSoundEffectUntilDone(sounds.mechanicalMotorStart)
|
||||
music.playSoundEffectUntilDone(sounds.mechanicalMotorIdle);
|
||||
}
|
||||
loops.pause(1);
|
||||
}
|
||||
```
|
@ -1,46 +0,0 @@
|
||||
# Ignition
|
||||
|
||||
Explore sensor events and sensor status.
|
||||
|
||||
## Activity 1
|
||||
|
||||
Wait for a touch sensor press or ultrasonic object detection. Show an expression on the screen when they happen.
|
||||
|
||||
```blocks
|
||||
sensors.touch1.onEvent(ButtonEvent.Pressed, function () {
|
||||
brick.showImage(images.eyesDizzy)
|
||||
})
|
||||
sensors.ultrasonic4.onEvent(UltrasonicSensorEvent.ObjectDetected, function () {
|
||||
brick.showImage(images.eyesTiredMiddle)
|
||||
})
|
||||
brick.showImage(images.eyesSleeping)
|
||||
```
|
||||
|
||||
## Activity 2
|
||||
|
||||
Play some motor sounds if touch sensor `1` is pressed at the same moment when and object comes close.
|
||||
|
||||
```blocks
|
||||
while (true) {
|
||||
if (sensors.touch1.isPressed() &&
|
||||
sensors.ultrasonic4.distance() < 10) {
|
||||
music.playSoundEffectUntilDone(sounds.mechanicalMotorStart)
|
||||
music.playSoundEffectUntilDone(sounds.mechanicalMotorIdle);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Activity 3
|
||||
|
||||
Play some motor sounds if touch sensor `1` is pressed when both the `enter` button is pressed on the brick and an object comes close.
|
||||
|
||||
```blocks
|
||||
while (true) {
|
||||
if (sensors.ultrasonic4.distance() < 10 &&
|
||||
sensors.touch1.isPressed() &&
|
||||
brick.buttonEnter.isPressed()) {
|
||||
music.playSoundEffectUntilDone(sounds.mechanicalMotorStart)
|
||||
music.playSoundEffectUntilDone(sounds.mechanicalMotorIdle);
|
||||
}
|
||||
}
|
||||
```
|
@ -1,9 +1,9 @@
|
||||
# Light the way Activity 1
|
||||
|
||||
```blocks
|
||||
sensors.color3.onLightDetected(LightIntensityMode.Ambient, Light.Dark, function () {
|
||||
sensors.color3.onLightChanged(LightIntensityMode.Ambient, LightCondition.Dark, function () {
|
||||
brick.showImage(images.objectsLightOn)
|
||||
pause(5000)
|
||||
loops.pause(5000)
|
||||
brick.clearScreen()
|
||||
})
|
||||
```
|
@ -1,10 +1,10 @@
|
||||
# Light the way Activity 2
|
||||
|
||||
```blocks
|
||||
sensors.color3.onLightDetected(LightIntensityMode.Ambient, Light.Bright, function () {
|
||||
sensors.color3.onLightChanged(LightIntensityMode.Ambient, LightCondition.Bright, function () {
|
||||
brick.clearScreen()
|
||||
})
|
||||
sensors.color3.onLightDetected(LightIntensityMode.Ambient, Light.Dark, function () {
|
||||
sensors.color3.onLightChanged(LightIntensityMode.Ambient, LightCondition.Dark, function () {
|
||||
brick.showImage(images.objectsLightOn)
|
||||
})
|
||||
```
|
@ -1,13 +1,13 @@
|
||||
# Light the way Activity 3
|
||||
|
||||
```blocks
|
||||
sensors.color3.onLightDetected(LightIntensityMode.Ambient, Light.Bright, function () {
|
||||
sensors.color3.onLightChanged(LightIntensityMode.Ambient, LightCondition.Bright, function () {
|
||||
brick.clearScreen()
|
||||
})
|
||||
sensors.color3.onLightDetected(LightIntensityMode.Ambient, Light.Dark, function () {
|
||||
sensors.color3.onLightChanged(LightIntensityMode.Ambient, LightCondition.Dark, function () {
|
||||
brick.showImage(images.objectsLightOn)
|
||||
})
|
||||
sensors.touch1.onEvent(ButtonEvent.Pressed, function () {
|
||||
sensors.touch1.onEvent(TouchSensorEvent.Pressed, function () {
|
||||
brick.showImage(images.objectsLightOn);
|
||||
})
|
||||
```
|
@ -1,241 +0,0 @@
|
||||
# Line Detection
|
||||
|
||||
Design ways to improve driving safety by helping to prevent drivers from falling asleep and causing an accident.
|
||||
|
||||
![Car following the line on the road](/static/coding/line-detection/car-road-line.jpg)
|
||||
|
||||
## Connect
|
||||
|
||||
Think about:
|
||||
|
||||
* How can autonomous cars react to different traffic light signals?
|
||||
* What can happen if a driver falls asleep while driving?
|
||||
* How can we detect when a driver is falling asleep?
|
||||
|
||||
## Construct
|
||||
|
||||
### Build
|
||||
|
||||
Build a @boardname@ vehicle that can help prevent drivers from falling asleep and causing an accident. Start by constructing this model:
|
||||
|
||||
[![EV3 robot with color sensor](/static/coding/line-detection/ev3-robot-color-sensor-down.jpg)](https://le-www-live-s.legocdn.com/sc/media/lessons/mindstorms-ev3/building-instructions/ev3-rem-color-sensor-down-driving-base-d30ed30610c3d6647d56e17bc64cf6e2.pdf)
|
||||
|
||||
Build red and green “lights” for your robot to detect. You can use LEGO bricks, colored tape, or marker on white paper. Building instructions:
|
||||
|
||||
[![IMAGE: Color Squares](/static/coding/line-detection/ev3-color-squares.jpg)](https://le-www-live-s.legocdn.com/sc/media/files/support/mindstorms%20ev3/building-instructions/design%20engineering%20projects/color%20squares-0a88dfd98bb2e64b5b8151fc422bae36.pdf)
|
||||
|
||||
### ~hint
|
||||
|
||||
If clicking the above images doesn't open the instructions, right-click on the image and choose "Save link as..." to download the PDF.
|
||||
|
||||
### ~
|
||||
|
||||
### Check
|
||||
|
||||
Before you program, check:
|
||||
|
||||
* Are all the wires correctly connected from the motors to ports B and C?
|
||||
* Are the wheels correctly installed?
|
||||
* Are the wheels rotating freely?
|
||||
* Are the wires connected from the Color Sensor to port 3?
|
||||
|
||||
![EV3 Driving Base](/static/coding/line-detection/ev3-robot-driving-base.jpg)
|
||||
|
||||
### Program
|
||||
|
||||
Autonomous cars need to recognize and respond to traffic lights automatically. Create a program that will make your robot stop at red lights. Make sure your robot is only responding to the color red. Once you have succeeded, program your robot to drive forward again when the light changes from red to green.
|
||||
|
||||
Before you program, think about:
|
||||
|
||||
* How will you program the robot to detect a color?
|
||||
* How will you program the robot to stop at a color?
|
||||
* Which programming blocks will you use?
|
||||
|
||||
### ~ hint
|
||||
|
||||
Consider using these blocks in your solution:
|
||||
|
||||
```block
|
||||
loops.forever(function () {
|
||||
|
||||
})
|
||||
motors.largeBC.steer(0, 50)
|
||||
sensors.color3.pauseUntilColorDetected(ColorSensorColor.Red)
|
||||
motors.stopAll()
|
||||
```
|
||||
|
||||
### ~
|
||||
|
||||
### Sample Solution - Red light detection
|
||||
|
||||
1. Loop forever.
|
||||
2. Start motors ``B`` and ``C`` (drive forward).
|
||||
3. Wait for the color sensor to detect the color red.
|
||||
4. Stop all motors.
|
||||
|
||||
```blocks
|
||||
loops.forever(function () {
|
||||
motors.largeBC.steer(0, 50)
|
||||
sensors.color3.pauseUntilColorDetected(ColorSensorColor.Red)
|
||||
motors.stopAll()
|
||||
})
|
||||
```
|
||||
|
||||
### Download and test
|
||||
|
||||
Click **Download** and follow the instructions to get your code onto your EV3 Brick.
|
||||
|
||||
Congratulations! Your robot can stop at a red light.
|
||||
|
||||
Now add to your program and have your robot to drive forward again when the light changes from red to green.
|
||||
|
||||
### Sample Solution - Red and green light detection in a loop
|
||||
|
||||
1. Start motors ``B`` and ``C`` (drive forward).
|
||||
2. Wait for the color sensor to detect the color red.
|
||||
3. Stop all motors.
|
||||
4. Wait for the color sensor to detect the color green.
|
||||
5. Loop forever.
|
||||
|
||||
```blocks
|
||||
loops.forever(function () {
|
||||
motors.largeBC.steer(0, 50)
|
||||
sensors.color3.pauseUntilColorDetected(ColorSensorColor.Red)
|
||||
motors.stopAll()
|
||||
sensors.color3.pauseUntilColorDetected(ColorSensorColor.Green)
|
||||
})
|
||||
```
|
||||
|
||||
### Download and test
|
||||
|
||||
Click **Download** and follow the instructions to get your code onto your EV3 Brick.
|
||||
|
||||
## Contemplate
|
||||
|
||||
To simulate what could happen if a driver falls asleep while driving, your robot could sound an alarm signal when it crosses the line. This feature is often available in new cars.
|
||||
|
||||
Program your robot to perform this function.
|
||||
|
||||
Draw a dark line with tape or marker for your robot to cross.
|
||||
|
||||
### ~hint
|
||||
|
||||
Consider using these blocks in your solution:
|
||||
|
||||
```block
|
||||
motors.largeBC.steer(0, 50)
|
||||
music.playSoundEffect(sounds.systemGeneralAlert)
|
||||
```
|
||||
### ~
|
||||
|
||||
### Sample Solution - Line detection in a loop
|
||||
|
||||
1. Start motors ``B`` and ``C`` (drive forward with a curve toward the line).
|
||||
2. Wait for the color sensor to detect the color black.
|
||||
3. Play sound effect ``system general alert``.
|
||||
4. Start motors ``B`` and ``C`` (drive forward with a curve away from the line).
|
||||
5. Wait for the color sensor to detect the color white.
|
||||
6. Loop forever.
|
||||
|
||||
```blocks
|
||||
loops.forever(function () {
|
||||
motors.largeBC.steer(-30, 20)
|
||||
sensors.color3.pauseUntilColorDetected(ColorSensorColor.Black)
|
||||
music.playSoundEffect(sounds.systemGeneralAlert)
|
||||
motors.largeBC.steer(30, 20)
|
||||
sensors.color3.pauseUntilColorDetected(ColorSensorColor.White)
|
||||
})
|
||||
```
|
||||
|
||||
#### Download and test
|
||||
|
||||
Click **Download** and follow the instructions to get your code onto your EV3 Brick.
|
||||
|
||||
#### Differentiation
|
||||
|
||||
Program your robot to drive on “autopilot” along a given route. You will need to create a program that recognizes and responds to a dark line (or white line). You will create a line-following program and your robot will need to travel along the line without losing contact with it.
|
||||
|
||||
You will need to constantly debug your program in order to make your robot travel as smoothly as possible along the line.
|
||||
|
||||
### ~hint
|
||||
|
||||
Consider using these blocks in your solution:
|
||||
|
||||
```block
|
||||
while (true) {
|
||||
|
||||
}
|
||||
motors.largeBC.steer(0, 50)
|
||||
```
|
||||
|
||||
> **- OR -**
|
||||
|
||||
```block
|
||||
if (true) {
|
||||
|
||||
} else {
|
||||
|
||||
}
|
||||
```
|
||||
|
||||
### ~
|
||||
|
||||
### Sample Solutions - Line Following in Loop
|
||||
|
||||
#### Method 1
|
||||
|
||||
1. While the Color Sensor detects the color black, start motors ``B`` and ``C`` (drive forward with a curve toward the line).
|
||||
2. While the Color Sensor detects the color white, start motors ``B`` and ``C`` (drive forward with a curve away from the line).
|
||||
3. Loop forever.
|
||||
|
||||
```blocks
|
||||
forever(function () {
|
||||
while (sensors.color3.color() == ColorSensorColor.Black) {
|
||||
motors.largeBC.steer(-30, 50)
|
||||
}
|
||||
while (sensors.color3.color() == ColorSensorColor.White) {
|
||||
motors.largeBC.steer(30, 50)
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
#### Method 2
|
||||
|
||||
1. If the Color Sensor detects the color black, start motors ``B`` and ``C`` (drive forward with a curve toward the line).
|
||||
Else the Color Sensor detects the color white, start motors ``B`` and ``C`` (drive forward with a curve away from the line).
|
||||
2. Loop forever.
|
||||
|
||||
```blocks
|
||||
forever(function () {
|
||||
if (sensors.color3.color() == ColorSensorColor.Black) {
|
||||
motors.largeBC.steer(-30, 50)
|
||||
} else {
|
||||
motors.largeBC.steer(30, 50)
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
### Download and test
|
||||
|
||||
Click **Download** and follow the instructions to get your code onto your EV3 Brick.
|
||||
|
||||
### Share
|
||||
|
||||
Think about:
|
||||
|
||||
* What challenged you?
|
||||
* Were there any surprises?
|
||||
* How can you improve your program?
|
||||
* Can your program be more streamlined? Have you used too many blocks?
|
||||
* Is there a more efficient way to build your program?
|
||||
* How can your program be used in real-world scenarios?
|
||||
|
||||
Personalize:
|
||||
|
||||
* Click on the **JavaScript** tab and experiment with changing the values in the code.
|
||||
* Add a custom image or sounds from the ``||brick:Brick||`` or ``||music:Music||`` menus.
|
||||
* Create a video of your project, especially your final presentation and your robot’s performance. Explain some important features of your software program.
|
||||
* Include an image of your program with comments.
|
||||
* Add a team photograph!
|
||||
|
||||
Congratulations! What will you design next?
|
@ -1,143 +0,0 @@
|
||||
# Object Detection
|
||||
|
||||
Design ways to avoid accidents between vehicles and objects in the road.
|
||||
|
||||
![Deer in the road](/static/coding/object-detection/road-deer.jpg)
|
||||
|
||||
## Connect
|
||||
|
||||
Think about:
|
||||
|
||||
* In what driving situations can a car hit an obstacle?
|
||||
* What do you need to be aware of to avoid collisions with obstacles?
|
||||
* What causes traffic jams in high density areas?
|
||||
|
||||
## Construct
|
||||
|
||||
### Build
|
||||
|
||||
Build a @boardname@ vehicle that can avoid accidents between vehicles and objects in the road. Start by constructing this model:
|
||||
|
||||
[![EV3 Robot Driving Base](/static/coding/object-detection/ev3-robot-driving-base.jpg)](https://le-www-live-s.legocdn.com/sc/media/lessons/mindstorms-ev3/building-instructions/ev3-ultrasonic-sensor-driving-base-61ffdfa461aee2470b8ddbeab16e2070.pdf)
|
||||
|
||||
Build an obstacle for your robot to detect. You can build the **cuboid model** out of LEGO bricks or an obstacle of your choice.
|
||||
|
||||
[![Cubiod block](/static/coding/object-detection/ev3-cuboid.jpg)](https://le-www-live-s.legocdn.com/sc/media/lessons/mindstorms-ev3/building-instructions/ev3-cuboid-dc93b2e60bed2981e76b3bac9ea04558.pdf)
|
||||
|
||||
### ~hint
|
||||
|
||||
If clicking the above images doesn't open the instructions, right-click on the image and choose "Save link as..." to download the PDF.
|
||||
|
||||
### ~
|
||||
|
||||
### Check
|
||||
|
||||
Before you program, check:
|
||||
|
||||
* Are all the wires correctly connected from the motors to ports B and C?
|
||||
* Are the wheels correctly installed?
|
||||
* Are the wheels rotating freely?
|
||||
* Are the wires connected from the Ultrasonic Sensor to port 4?
|
||||
|
||||
### Program
|
||||
|
||||
* Program your robot to detect any obstacles that might appear while the robot is moving forward (or backward).
|
||||
* Make the robot stop when it detects an object that is less than 20 cm away.
|
||||
|
||||
Before you program, think about:
|
||||
* How will you program the robot to detect obstacles?
|
||||
* How will you program the robot to stop at obstacles?
|
||||
* Which programming blocks will you use?
|
||||
|
||||
### ~hint
|
||||
|
||||
Consider using these blocks in your solution:
|
||||
|
||||
```block
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Pressed, function () {
|
||||
|
||||
})
|
||||
motors.largeBC.steer(0, 50)
|
||||
pauseUntil(() => true)
|
||||
let near = sensors.ultrasonic4.distance() < 20
|
||||
motors.stopAll()
|
||||
```
|
||||
|
||||
### ~
|
||||
|
||||
### Sample Solution
|
||||
|
||||
1. Start the program when EV3 ``enter`` button is pressed.
|
||||
2. Turn motors ``B`` and ``C`` on at speed ``50``.
|
||||
3. Wait until Ultrasonic Sensor detects an obstacle at a distance of less than ``20`` cm.
|
||||
4. Stops all motors.
|
||||
|
||||
```blocks
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Pressed, function () {
|
||||
motors.largeBC.steer(0, 50)
|
||||
pauseUntil(() => sensors.ultrasonic4.distance() < 20)
|
||||
motors.stopAll()
|
||||
})
|
||||
```
|
||||
|
||||
### 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
|
||||
|
||||
On the road, when a driver sees and object, they slow their car down before coming to a full stop.
|
||||
|
||||
Program your EV3 Driving Base to do the same.
|
||||
|
||||
If the Ultrasonic Sensor:
|
||||
|
||||
* Detects an object less than `10` cm away, make the robot stop.
|
||||
* Detects an object between `10` and `20` cm away, make the robot slow down.
|
||||
* Does not detect any object, continue to move at full speed.
|
||||
|
||||
### ~hint
|
||||
|
||||
Consider using this block in your solution:
|
||||
|
||||
```block
|
||||
if (true) {
|
||||
}
|
||||
```
|
||||
|
||||
### ~
|
||||
|
||||
### Sample Solution
|
||||
|
||||
```blocks
|
||||
loops.forever(function () {
|
||||
motors.largeBC.steer(0, 50)
|
||||
if (sensors.ultrasonic4.distance() < 10) {
|
||||
motors.stopAll()
|
||||
} else if (sensors.ultrasonic4.distance() < 20) {
|
||||
motors.largeBC.steer(0, 10)
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
### 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.
|
||||
|
||||
## Continue
|
||||
|
||||
* Get together with other building teams and make a traffic jam by placing all of your robots in a line with varying amounts of space between them.
|
||||
* Have everyone start their robots at the same time and see what happens.
|
||||
* Refine your programs so that all of the robots continue driving at the same speed with equal distances between them.
|
||||
* Click on the JavaScript tab and experiment with changing the values in the code.
|
||||
* Add a custom image or sounds from the Brick or Music menus.
|
||||
|
||||
### Share
|
||||
|
||||
* Share what you think “efficiency in programming” means.
|
||||
* Explore the different solutions other programmers came up with.
|
||||
* Create a video of your project, especially your final presentation and your robot’s performance. Explain some important features of your software program.
|
||||
* Include an image of your program with comments.
|
||||
* Add a team photograph!
|
||||
|
||||
Congratulations! What will you design next?
|
@ -1,11 +1,11 @@
|
||||
# Reverse Beeper Activity 1
|
||||
|
||||
```blocks
|
||||
forever(function () {
|
||||
loops.forever(function () {
|
||||
music.playTone(440, sensors.ultrasonic4.distance());
|
||||
pause(50)
|
||||
loops.pause(50)
|
||||
})
|
||||
motors.largeBC.run(-20);
|
||||
motors.largeBC.setSpeed(-20);
|
||||
sensors.ultrasonic4.pauseUntil(UltrasonicSensorEvent.ObjectNear);
|
||||
motors.largeBC.stop();
|
||||
motors.stopAllMotors();
|
||||
```
|
||||
|
@ -1,13 +1,13 @@
|
||||
# Reverse Beeper Activity 2
|
||||
|
||||
```blocks
|
||||
forever(function () {
|
||||
loops.forever(function () {
|
||||
if (motors.largeB.speed() != 0 && sensors.ultrasonic4.distance() < 20) {
|
||||
music.playTone(440, sensors.ultrasonic4.distance());
|
||||
pause(50)
|
||||
loops.pause(50)
|
||||
}
|
||||
})
|
||||
motors.largeBC.run(-20);
|
||||
motors.largeBC.setSpeed(-20);
|
||||
sensors.ultrasonic4.pauseUntil(UltrasonicSensorEvent.ObjectNear);
|
||||
motors.largeBC.stop();
|
||||
motors.stopAllMotors();
|
||||
```
|
||||
|
@ -3,17 +3,18 @@
|
||||
```blocks
|
||||
let beep = false
|
||||
beep = true
|
||||
control.runInParallel(function () {
|
||||
motors.largeBC.run(-20)
|
||||
control.runInBackground(function () {
|
||||
motors.largeB.setSpeed(-20)
|
||||
motors.largeC.setSpeed(-20)
|
||||
sensors.ultrasonic4.pauseUntil(UltrasonicSensorEvent.ObjectNear)
|
||||
motors.largeBC.stop()
|
||||
motors.stopAllMotors()
|
||||
beep = false
|
||||
})
|
||||
control.runInParallel(function () {
|
||||
control.runInBackground(function () {
|
||||
while (beep) {
|
||||
if (sensors.ultrasonic4.distance() < 20) {
|
||||
music.playTone(440, sensors.ultrasonic4.distance())
|
||||
pause(50)
|
||||
loops.pause(50)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
@ -1,14 +1,14 @@
|
||||
# Reversing the robot Activity 1
|
||||
|
||||
```blocks
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Bumped, function () {
|
||||
motors.largeBC.run(50)
|
||||
sensors.touch1.pauseUntil(ButtonEvent.Pressed)
|
||||
motors.largeBC.run(0)
|
||||
pause(1000)
|
||||
brick.setStatusLight(StatusLight.OrangeFlash)
|
||||
motors.largeBC.run(-50)
|
||||
pause(2000)
|
||||
motors.largeBC.run(0)
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Click, function () {
|
||||
motors.largeBC.setSpeed(50)
|
||||
sensors.touchSensor1.pauseUntil(TouchSensorEvent.Pressed)
|
||||
motors.largeBC.setSpeed(0)
|
||||
loops.pause(1000)
|
||||
brick.setLight(LightsPattern.OrangeFlash)
|
||||
motors.largeBC.setSpeed(-50)
|
||||
loops.pause(2000)
|
||||
motors.largeBC.setSpeed(0)
|
||||
})
|
||||
```
|
@ -1,15 +1,15 @@
|
||||
# Reversing the robot Activity 2
|
||||
|
||||
```blocks
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Bumped, function () {
|
||||
sensors.touch1.pauseUntil(ButtonEvent.Pressed)
|
||||
motors.largeBC.run(50)
|
||||
sensors.touch2.pauseUntil(ButtonEvent.Pressed)
|
||||
motors.largeBC.run(0)
|
||||
pause(1000)
|
||||
brick.setStatusLight(StatusLight.OrangeFlash)
|
||||
motors.largeBC.run(-50)
|
||||
pause(2000)
|
||||
motors.largeBC.run(0)
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Click, function () {
|
||||
sensors.touchSensor1.pauseUntil(TouchSensorEvent.Pressed)
|
||||
motors.largeBC.setSpeed(50)
|
||||
sensors.touchSensor2.pauseUntil(TouchSensorEvent.Pressed)
|
||||
motors.largeBC.setSpeed(0)
|
||||
loops.pause(1000)
|
||||
brick.setLight(LightsPattern.OrangeFlash)
|
||||
motors.largeBC.setSpeed(-50)
|
||||
loops.pause(2000)
|
||||
motors.largeBC.setSpeed(0)
|
||||
})
|
||||
```
|
@ -1,19 +1,19 @@
|
||||
# Reversing the robot Activity 3
|
||||
|
||||
```blocks
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Bumped, function () {
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Click, function () {
|
||||
brick.showImage(images.eyesSleeping)
|
||||
sensors.touch1.pauseUntil(ButtonEvent.Pressed)
|
||||
sensors.touchSensor1.pauseUntil(TouchSensorEvent.Pressed)
|
||||
brick.showImage(images.eyesNeutral)
|
||||
motors.largeBC.run(50)
|
||||
sensors.touch2.pauseUntil(ButtonEvent.Pressed)
|
||||
motors.largeBC.setSpeed(50)
|
||||
sensors.touchSensor2.pauseUntil(TouchSensorEvent.Pressed)
|
||||
brick.showImage(images.eyesTiredMiddle)
|
||||
motors.largeBC.run(0)
|
||||
pause(1000)
|
||||
brick.setStatusLight(StatusLight.OrangeFlash)
|
||||
motors.largeBC.setSpeed(0)
|
||||
loops.pause(1000)
|
||||
brick.setLight(LightsPattern.OrangeFlash)
|
||||
brick.showImage(images.eyesDizzy)
|
||||
motors.largeBC.run(-50)
|
||||
pause(2000)
|
||||
motors.largeBC.run(0)
|
||||
motors.largeBC.setSpeed(-50)
|
||||
loops.pause(2000)
|
||||
motors.largeBC.setSpeed(0)
|
||||
})
|
||||
```
|
@ -2,30 +2,34 @@
|
||||
|
||||
```blocks
|
||||
let drive: number[] = []
|
||||
brick.buttonLeft.onEvent(ButtonEvent.Bumped, function () {
|
||||
brick.buttonLeft.onEvent(ButtonEvent.Click, function () {
|
||||
drive.push(1)
|
||||
})
|
||||
brick.buttonRight.onEvent(ButtonEvent.Bumped, function () {
|
||||
brick.buttonRight.onEvent(ButtonEvent.Click, function () {
|
||||
drive.push(3)
|
||||
})
|
||||
brick.buttonUp.onEvent(ButtonEvent.Bumped, function () {
|
||||
brick.buttonUp.onEvent(ButtonEvent.Click, function () {
|
||||
drive.push(4)
|
||||
})
|
||||
brick.buttonDown.onEvent(ButtonEvent.Bumped, function () {
|
||||
brick.buttonDown.onEvent(ButtonEvent.Click, function () {
|
||||
drive.push(5)
|
||||
})
|
||||
pauseUntil(() => drive.length >= 5)
|
||||
pause(1000)
|
||||
loops.pause(1000)
|
||||
music.playSoundEffectUntilDone(sounds.communicationGo)
|
||||
for (let d of drive) {
|
||||
if (d == 1) {
|
||||
motors.largeC.run(50, 360, MoveUnit.Degrees)
|
||||
motors.largeC.setSpeedFor(50, 360, MoveUnit.Degrees)
|
||||
motors.largeC.pauseUntilReady()
|
||||
} else if (d == 3) {
|
||||
motors.largeB.run(50, 360, MoveUnit.Degrees)
|
||||
motors.largeB.setSpeedFor(50, 360, MoveUnit.Degrees)
|
||||
motors.largeB.pauseUntilReady()
|
||||
} else if (d == 4) {
|
||||
motors.largeBC.run(50, 360, MoveUnit.Degrees)
|
||||
motors.largeBC.setSpeedFor(50, 360, MoveUnit.Degrees)
|
||||
motors.largeBC.pauseUntilReady()
|
||||
} else {
|
||||
motors.largeBC.run(-50, 360, MoveUnit.Degrees)
|
||||
motors.largeBC.setSpeedFor(-50, 360, MoveUnit.Degrees)
|
||||
motors.largeBC.pauseUntilReady()
|
||||
}
|
||||
}
|
||||
music.playSoundEffectUntilDone(sounds.communicationGameOver)
|
||||
|
@ -2,34 +2,38 @@
|
||||
|
||||
```blocks
|
||||
let drive: number[] = []
|
||||
brick.buttonLeft.onEvent(ButtonEvent.Bumped, function () {
|
||||
brick.buttonLeft.onEvent(ButtonEvent.Click, function () {
|
||||
drive.push(1)
|
||||
music.playSoundEffectUntilDone(sounds.systemClick)
|
||||
})
|
||||
brick.buttonRight.onEvent(ButtonEvent.Bumped, function () {
|
||||
brick.buttonRight.onEvent(ButtonEvent.Click, function () {
|
||||
drive.push(3)
|
||||
music.playSoundEffectUntilDone(sounds.systemClick)
|
||||
})
|
||||
brick.buttonUp.onEvent(ButtonEvent.Bumped, function () {
|
||||
brick.buttonUp.onEvent(ButtonEvent.Click, function () {
|
||||
drive.push(4)
|
||||
music.playSoundEffectUntilDone(sounds.systemClick)
|
||||
})
|
||||
brick.buttonDown.onEvent(ButtonEvent.Bumped, function () {
|
||||
brick.buttonDown.onEvent(ButtonEvent.Click, function () {
|
||||
drive.push(5)
|
||||
music.playSoundEffectUntilDone(sounds.systemClick)
|
||||
})
|
||||
brick.buttonEnter.pauseUntil(ButtonEvent.Bumped);
|
||||
pause(1000)
|
||||
brick.buttonEnter.pauseUntil(ButtonEvent.Click);
|
||||
loops.pause(1000)
|
||||
music.playSoundEffectUntilDone(sounds.communicationGo)
|
||||
for (let d of drive) {
|
||||
if (d == 1) {
|
||||
motors.largeC.run(50, 360, MoveUnit.Degrees)
|
||||
motors.largeC.setSpeedFor(50, 360, MoveUnit.Degrees)
|
||||
motors.largeC.pauseUntilReady()
|
||||
} else if (d == 3) {
|
||||
motors.largeB.run(50, 360, MoveUnit.Degrees)
|
||||
motors.largeB.setSpeedFor(50, 360, MoveUnit.Degrees)
|
||||
motors.largeB.pauseUntilReady()
|
||||
} else if (d == 4) {
|
||||
motors.largeBC.run(50, 360, MoveUnit.Degrees)
|
||||
motors.largeBC.setSpeedFor(50, 360, MoveUnit.Degrees)
|
||||
motors.largeBC.pauseUntilReady()
|
||||
} else {
|
||||
motors.largeBC.run(-50, 360, MoveUnit.Degrees)
|
||||
motors.largeBC.setSpeedFor(-50, 360, MoveUnit.Degrees)
|
||||
motors.largeBC.pauseUntilReady()
|
||||
}
|
||||
}
|
||||
music.playSoundEffectUntilDone(sounds.communicationGameOver)
|
||||
|
@ -1,12 +1,12 @@
|
||||
# Three Point Turn Activity 1
|
||||
|
||||
```blocks
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Bumped, function () {
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Click, function () {
|
||||
motors.largeBC.tank(75, 30)
|
||||
pause(1500)
|
||||
loops.pause(1500)
|
||||
motors.largeBC.tank(-30, -75)
|
||||
pause(1000)
|
||||
loops.pause(1000)
|
||||
motors.largeBC.tank(50, 50)
|
||||
pause(3000)
|
||||
loops.pause(3000)
|
||||
})
|
||||
```
|
@ -1,14 +1,14 @@
|
||||
# Three Point Turn Activity 2
|
||||
|
||||
```blocks
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Bumped, function () {
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Click, function () {
|
||||
motors.largeBC.tank(75, 30)
|
||||
pause(1500)
|
||||
loops.pause(1500)
|
||||
motors.largeBC.tank(-30, -75)
|
||||
sensors.ultrasonic4.pauseUntil(UltrasonicSensorEvent.ObjectNear);
|
||||
motors.largeBC.tank(0, 0)
|
||||
pause(1000)
|
||||
loops.pause(1000)
|
||||
motors.largeBC.tank(50, 50)
|
||||
pause(3000)
|
||||
loops.pause(3000)
|
||||
})
|
||||
```
|
@ -1,15 +1,15 @@
|
||||
# Three Point Turn Activity 3
|
||||
|
||||
```blocks
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Bumped, function () {
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Click, function () {
|
||||
motors.largeBC.tank(75, 30)
|
||||
pause(1500)
|
||||
loops.pause(1500)
|
||||
motors.largeBC.tank(-30, -75)
|
||||
sensors.ultrasonic4.pauseUntil(UltrasonicSensorEvent.ObjectNear);
|
||||
motors.largeBC.tank(0, 0)
|
||||
music.playSoundEffect(sounds.animalsDogBark1)
|
||||
pause(1000)
|
||||
loops.pause(1000)
|
||||
motors.largeBC.tank(50, 50)
|
||||
pause(3000)
|
||||
loops.pause(3000)
|
||||
})
|
||||
```
|
@ -1,9 +1,9 @@
|
||||
# Traffic Lights Activity 1
|
||||
|
||||
```blocks
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Bumped, function () {
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Click, function () {
|
||||
motors.largeBC.tank(20, 20)
|
||||
sensors.color3.pauseUntilColorDetected(ColorSensorColor.Red)
|
||||
sensors.color3.pauseForColor(ColorSensorColor.Red)
|
||||
motors.largeBC.tank(0, 0)
|
||||
})
|
||||
```
|
@ -1,7 +1,7 @@
|
||||
# Traffic Lights Activity 3
|
||||
|
||||
```blocks
|
||||
forever(function () {
|
||||
loops.forever(function () {
|
||||
if (sensors.color3.light(LightIntensityMode.Reflected) < 15) {
|
||||
motors.largeBC.tank(30, 12)
|
||||
} else {
|
||||
|
@ -1,29 +0,0 @@
|
||||
# Design Engineering Projects
|
||||
|
||||
## Projects
|
||||
|
||||
```codecard
|
||||
[
|
||||
{
|
||||
"name": "Make It Move Without Wheels",
|
||||
"description": "Design, build and program a robot that can move itself using no wheels for locomotion.",
|
||||
"imageUrl": "/static/lessons/make-it-move-without-wheels.png",
|
||||
"url": "/design-engineering/make-it-move",
|
||||
"cardType": "side"
|
||||
},
|
||||
{
|
||||
"name": "Make It Smarter and Faster",
|
||||
"description": "Design, build and program a robotic creature that can sense its environment and respond by moving.",
|
||||
"imageUrl": "/static/lessons/make-it-smarter-and-faster.png",
|
||||
"url": "/design-engineering/make-it-smarter",
|
||||
"cardType": "side"
|
||||
},
|
||||
{
|
||||
"name": "Make a System that Communicates",
|
||||
"description": "Design, build and program a robotic system that follows a path and communicates its position at least twice along the way.",
|
||||
"imageUrl": "/static/lessons/make-a-system-that-communicates.png",
|
||||
"url": "/design-engineering/make-it-communicate",
|
||||
"cardType": "side"
|
||||
}
|
||||
]
|
||||
```
|
@ -1,163 +0,0 @@
|
||||
# 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/ev3-plus-parts.jpg)
|
||||
|
||||
## Construct
|
||||
|
||||
### Build
|
||||
|
||||
You can start by tinkering with the LEGO elements in the picture and then build on.
|
||||
|
||||
More building ideas:
|
||||
|
||||
[![EV3 Frames](/static/lessons/make-it-communicate/ev3-frames.jpg)](https://le-www-live-s.legocdn.com/sc/media/files/support/mindstorms%20ev3/building-instructions/design%20engineering%20projects/ev3%20frames-5054ee378e624fb4cb31158d2fc8e5cf.pdf)
|
||||
|
||||
[![Tracks](/static/lessons/make-it-communicate/ev3-tracks.jpg)](https://le-www-live-s.legocdn.com/sc/media/files/support/mindstorms%20ev3/building-instructions/design%20engineering%20projects/tracks-32d7554813af3f25cf5012d54a4bad2b.pdf)
|
||||
|
||||
[![Color Sensor 2](/static/lessons/make-it-communicate/ev3-color-sensor2.jpg)](https://le-www-live-s.legocdn.com/sc/media/files/support/mindstorms%20ev3/building-instructions/design%20engineering%20projects/color%20sensor_v2-e7fd54b6fa3cdfe36f414c1d2510f9cb.pdf)
|
||||
|
||||
### ~hint
|
||||
|
||||
If clicking the above images doesn't open the instructions, right-click on the image and choose "Save link as..." to download the 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/ev3-track-rover.jpg)](https://legoeducation.23video.com/v.ihtml/player.html?token=79c99735f906403a4dd7f2909935983d&source=embed&photo%5fid=19857954)
|
||||
|
||||
The Track Rover follows a path using the color sensor. It identifies two locations by color.
|
||||
|
||||
Track Rover solution combines these building ideas:
|
||||
|
||||
* EV3 frames
|
||||
* Tracks
|
||||
* Color sensor 2
|
||||
|
||||
Two copies of the tracks are built: one for the right side and a mirror image for the left side.
|
||||
|
||||
[![Track rover assembled](/static/lessons/make-it-communicate/ev3-track-rover2.jpg)](https://le-www-live-s.legocdn.com/sc/media/lessons/mindstorms-ev3/ev3-dep/building%20instructions/track-rover-bi-6aadb1b053df0c58a0dea108b5ce0eea.pdf)
|
||||
|
||||
### ~hint
|
||||
|
||||
If clicking the above image doesn't open the instructions, right-click on the image and choose "Save link as..." to download the 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)
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
### 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 robot’s 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 robot’s 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?
|
@ -1,105 +0,0 @@
|
||||
# Make It Move Without Wheels
|
||||
|
||||
## Connect
|
||||
|
||||
### Design Brief
|
||||
|
||||
Design, build and program a robot that can move itself using no wheels for locomotion.
|
||||
|
||||
![Make it move banner](/static/lessons/make-it-move/make-it-move-without-wheels.png)
|
||||
|
||||
Your robot will:
|
||||
|
||||
* Go a distance of at least 30cm
|
||||
* Use at least one motor
|
||||
* Use NO wheels for locomotion
|
||||
|
||||
### Brainstorm
|
||||
|
||||
In nature, creatures use many methods to get around. None of them, however, use wheels to move. Can we copy the method of animal locomotion with our robot? Using motors and legs, make a robot that can move without using any wheels.
|
||||
|
||||
## Construct
|
||||
|
||||
### Build
|
||||
|
||||
Think about a creature’s movement for inspiration. Will you make the robot walk, crawl, hop, or wiggle? Your mechanism can be attached or unattached to the EV3 Brick. You can start by tinkering with the LEGO elements in the picture above and then build on.
|
||||
|
||||
### Building Hint
|
||||
|
||||
If you want some building help you can follow these instructions.
|
||||
|
||||
[![Toddle Bot](/static/lessons/make-it-move/toddle-bot.jpg)](https://le-www-live-s.legocdn.com/sc/media/files/support/mindstorms%20ev3/building-instructions/design%20engineering%20projects/toddle%20bot-3dcad146d7f5deac4753f93e9dcc0739.pdf)
|
||||
|
||||
Click [here](https://le-www-live-s.legocdn.com/sc/media/files/support/mindstorms%20ev3/building-instructions/design%20engineering%20projects/toddle%20bot-3dcad146d7f5deac4753f93e9dcc0739.pdf)
|
||||
|
||||
### ~hint
|
||||
|
||||
If clicking the above image or link doesn't open the instructions, right-click on the link and choose "Save link as..." to download the PDF.
|
||||
|
||||
### ~
|
||||
|
||||
### Program
|
||||
|
||||
Before you program, think about:
|
||||
|
||||
* How will you program the robot to move?
|
||||
* How will you program the robot to stop?
|
||||
* How will you program the robot to display the distance moved?
|
||||
|
||||
Which programming blocks will you use:
|
||||
|
||||
* To turn on and turn off the motor or motors?
|
||||
* To display the distance moved?
|
||||
|
||||
### Sample Code
|
||||
|
||||
Example code of a robot that moves without wheels using one motor:
|
||||
|
||||
* The robot moves with ``large motor D`` rotating at ``-100`` speed
|
||||
* The robot moves for ``30000`` milliseconds (30 seconds)
|
||||
* The robot stops
|
||||
* The robot displays the text ``"30cm"``
|
||||
|
||||
```blocks
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Pressed, function () {
|
||||
motors.largeD.run(-100)
|
||||
loops.pause(30000)
|
||||
motors.stopAll()
|
||||
brick.showString("30cm", 1)
|
||||
})
|
||||
```
|
||||
|
||||
### 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
|
||||
|
||||
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?
|
||||
* What is one part of your design that worked well?
|
||||
* What is a change that you need to make?
|
||||
* What will you try next?
|
||||
|
||||
## Continue
|
||||
|
||||
### Personalize your project
|
||||
|
||||
* Add/remove LEGO elements to improve the way your robot moves. Will your robot walk, wiggle, hop, or slither? Will it move slower, faster or farther?
|
||||
* 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.
|
||||
* Does your robot resemble a creature? Add arts and crafts materials to your project.
|
||||
|
||||
## Communicate
|
||||
|
||||
* Create a video of your project, especially your final presentation and your robot’s 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?
|
@ -1,178 +0,0 @@
|
||||
# Make It Smarter and Faster
|
||||
|
||||
## Connect
|
||||
|
||||
### Design Brief
|
||||
|
||||
Design, build and program a robotic creature that can sense its environment and respond by moving.
|
||||
|
||||
https://www.youtube.com/watch?v=y9-A_C_08KY
|
||||
|
||||
* What do the robots in the video need to be able to sense, plan, and act?
|
||||
* What senses do humans have and why are they important to us?
|
||||
* How many human-like senses do you see the robots demonstrating?
|
||||
|
||||
### Brainstorm
|
||||
|
||||
Discuss different solutions to the design brief.
|
||||
|
||||
Think about:
|
||||
|
||||
* What kind of creature can it be?
|
||||
* How can it move?
|
||||
* What does it need to be aware so that it stays safe, well fed and warm (or cool)?
|
||||
* Is it looking for food, a safe place to hide or a warm place to soak up the sun?
|
||||
* Will the creature need to move fast or slow?
|
||||
* Will it need to turn?
|
||||
* Will it need to go backward?
|
||||
|
||||
![EV3 and bricks](/static/lessons/make-it-smarter/bricks.png)
|
||||
|
||||
## Construct
|
||||
|
||||
### Build
|
||||
|
||||
Think about a creature’s movement for inspiration. Your mechanism can be attached or unattached to the EV3 Brick. You can start by tinkering with the LEGO elements in the picture add then build on.
|
||||
|
||||
More building ideas:
|
||||
|
||||
|
||||
* [EV3 Frames]
|
||||
* [Color Sensor 1]
|
||||
* [Gyro Sensor]
|
||||
* [Ultrasonic Sensor]
|
||||
* [Touch Sensor]
|
||||
* [Jaw]
|
||||
* [Leg 1]
|
||||
* [Leg 2]
|
||||
* [Leg 3]
|
||||
|
||||
### ~hint
|
||||
|
||||
If clicking the above links doesn't open the instructions, right-click on the image and choose "Save link as..." to download the PDF.
|
||||
|
||||
### ~
|
||||
|
||||
### Program
|
||||
|
||||
Before you program, think about:
|
||||
|
||||
* How will you program the robot to sense?
|
||||
* How will you program the robot to respond?
|
||||
* Which programming blocks will you use?
|
||||
|
||||
### ~hint
|
||||
|
||||
**Hint:** Explore the different Sensor blocks in the Sensors Menu
|
||||
|
||||
### ~
|
||||
|
||||
### Sample Solution
|
||||
|
||||
The Insect uses its Ultrasonic Sensor to sense danger and move away from a threat.
|
||||
|
||||
https://www.youtube.com/watch?v=PoeYoiXHHE4
|
||||
<br/>
|
||||
The Insect solution combines these building ideas:
|
||||
|
||||
* [EV3 Frames]
|
||||
* [Leg 2]
|
||||
* [Leg 3]
|
||||
* [Ultrasonic Sensor]
|
||||
|
||||
Four copies of Leg 3 are built: one for the front left, one for the back right, and two mirror copies for the front right and back left.
|
||||
|
||||
Building Instructions:
|
||||
|
||||
[![Insect robot](/static/lessons/make-it-smarter/insect-bot.jpg)](https://le-www-live-s.legocdn.com/sc/media/files/support/mindstorms%20ev3/building-instructions/design%20engineering%20projects/insect-94b8a46f0dc5082c9d78ddb734626dc9.pdf)
|
||||
|
||||
### ~hint
|
||||
|
||||
If clicking the above images or links doesn't open the instructions, right-click on the link and choose "Save link as..." to download the PDF.
|
||||
|
||||
### ~
|
||||
|
||||
### Sample Solution
|
||||
|
||||
This program checks if the Ultrasonic Sensor senses something near.
|
||||
|
||||
The blocks inside the ``||loops:forever||`` loop have these actions:
|
||||
|
||||
1. Turn on the ``green`` EV3 Brick Status Light.
|
||||
2. Wait for Ultrasonic Sensor to detect an object.
|
||||
3. Turn on Motors ``A`` and ``D`` in opposite directions.
|
||||
4. Wait for one and a half seconds (``1500`` milli seconds).
|
||||
5. Reverse the direction of Motors ``A`` and ``D``.
|
||||
6. Wait for one and a half seconds.
|
||||
7. Stop all motors.
|
||||
8. Make an insect chirping sound.
|
||||
9. Loop continuously so that the insect wanders around when the Ultrasonic Sensor is detects something.
|
||||
|
||||
```blocks
|
||||
forever(function () {
|
||||
brick.setStatusLight(StatusLight.Green)
|
||||
sensors.ultrasonic4.pauseUntil(UltrasonicSensorEvent.ObjectDetected)
|
||||
motors.largeAD.tank(50, -50)
|
||||
pause(1500)
|
||||
motors.largeAD.tank(-50, 50)
|
||||
pause(1500)
|
||||
motors.stopAll()
|
||||
music.playSoundEffectUntilDone(sounds.animalsInsectChirp)
|
||||
})
|
||||
```
|
||||
|
||||
### 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:
|
||||
|
||||
* Does your robot move when the sensor is activated?
|
||||
* If not, what will you change to make the robot’s ability to sense and respond more obvious?
|
||||
* What other behaviors can you add to the robot to make it more realistic?
|
||||
|
||||
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.
|
||||
* Does your robot resemble a creature? Maybe add more craft materials to your project.
|
||||
|
||||
## Communicate
|
||||
|
||||
Here are some ideas:
|
||||
|
||||
* Create a video of your project, especially your final presentation and your robot’s 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?
|
||||
|
||||
|
||||
[EV3 Frames]: https://le-www-live-s.legocdn.com/sc/media/files/support/mindstorms%20ev3/building-instructions/design%20engineering%20projects/ev3%20frames-5054ee378e624fb4cb31158d2fc8e5cf.pdf
|
||||
[Color Sensor 1]: https://le-www-live-s.legocdn.com/sc/media/files/support/mindstorms%20ev3/building-instructions/design%20engineering%20projects/color%20sensor_v1-16a7231bdc187cd88a8da120c68f58d5.pdf
|
||||
[Gyro Sensor]: https://le-www-live-s.legocdn.com/sc/media/files/support/mindstorms%20ev3/building-instructions/design%20engineering%20projects/gyro%20sensor-6f0fdbd82ae45fe0effa0ebf3f460f3d.pdf
|
||||
[Ultrasonic Sensor]: https://le-www-live-s.legocdn.com/sc/media/files/support/mindstorms%20ev3/building-instructions/design%20engineering%20projects/ultrasonic%20sensor-a56156c72e8946ed4c58c5e69f3520d3.pdf
|
||||
[Touch Sensor]: https://le-www-live-s.legocdn.com/sc/media/files/support/mindstorms%20ev3/building-instructions/design%20engineering%20projects/touch%20sensor-868fda1b9d6070a0a034fb22456a7fc9.pdf
|
||||
[Jaw]: https://le-www-live-s.legocdn.com/sc/media/files/support/mindstorms%20ev3/building-instructions/design%20engineering%20projects/jaw-ee93e8f3243e4d30cd34b0c337c33653.pdf
|
||||
[Leg 1]: https://le-www-live-s.legocdn.com/sc/media/files/support/mindstorms%20ev3/building-instructions/design%20engineering%20projects/leg%201-c14624046ea3a95148820ed404f5ac65.pdf
|
||||
[Leg 2]: https://le-www-live-s.legocdn.com/sc/media/files/support/mindstorms%20ev3/building-instructions/design%20engineering%20projects/leg%202-8855c35b990205f6b9d7130687a3d4db.pdf
|
||||
[Leg 3]: https://le-www-live-s.legocdn.com/sc/media/files/support/mindstorms%20ev3/building-instructions/design%20engineering%20projects/leg%203-575d52ef15fb79f1e4d3350d36607160.pdf
|
211
docs/examples.md
211
docs/examples.md
@ -2,207 +2,6 @@
|
||||
|
||||
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": "Movement Detector",
|
||||
"description": "Raise the alarm when an movement sneaks in",
|
||||
"url":"/maker/movement-detector",
|
||||
"cardType": "example",
|
||||
"imageUrl": "/static/maker/movement-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
|
||||
@ -212,15 +11,5 @@ Here are some fun programs for your @boardname@!
|
||||
"description": "Keep your brick entertained and happy",
|
||||
"url":"/examples/happy-unhappy",
|
||||
"cardType": "example"
|
||||
}, {
|
||||
"name": "Turtle",
|
||||
"description": "Encode moves and run them on a driving base",
|
||||
"url":"/examples/turtle",
|
||||
"cardType": "example"
|
||||
}, {
|
||||
"name": "Distance Measurer",
|
||||
"description": "Use a motor to measure angle and distance",
|
||||
"url": "/examples/distance-measurer",
|
||||
"cardType": "example"
|
||||
}]
|
||||
```
|
@ -1,178 +0,0 @@
|
||||
# Gyroboy
|
||||
|
||||
Work in progress
|
||||
|
||||
```blocks
|
||||
let motorSpeed1 = 0
|
||||
let motorSpeed2 = 0
|
||||
let motorSpeed3 = 0
|
||||
let motorSpeed = 0
|
||||
let fallen = false
|
||||
let motorSpeed0 = 0
|
||||
let oldControlDrive = 0
|
||||
let controlDrive = 0
|
||||
let power = 0
|
||||
let motorAngle = 0
|
||||
let gyroAngle = 0
|
||||
let controlSteering = 0
|
||||
let state = 0
|
||||
let motorPosition = 0
|
||||
let temp = 0
|
||||
let gyroRate = 0
|
||||
let timestep = 0
|
||||
sensors.color1.onColorDetected(ColorSensorColor.Red, function () {
|
||||
music.playTone(2000, 100)
|
||||
controlDrive = 0
|
||||
controlSteering = 0
|
||||
})
|
||||
// reads the motor angle and computes the motor speed,
|
||||
// position
|
||||
function computeMotors() {
|
||||
temp = motorAngle
|
||||
// read angle on both motors
|
||||
motorAngle = motors.largeD.angle() + motors.largeA.angle()
|
||||
// and estimate speed as angle difference
|
||||
motorSpeed0 = motorAngle - temp
|
||||
// average last 4 speed readings
|
||||
motorSpeed = (motorSpeed0 + motorSpeed1 + motorSpeed2 + motorSpeed3) / 4 / timestep
|
||||
// shift all previous recorded speeds by one
|
||||
motorSpeed3 = motorSpeed2
|
||||
motorSpeed2 = motorSpeed1
|
||||
motorSpeed1 = motorSpeed0
|
||||
// compute position from speed
|
||||
motorPosition = motorPosition + timestep * motorSpeed
|
||||
}
|
||||
// read the gyro rate and computes the angle
|
||||
function computeGyro() {
|
||||
gyroRate = sensors.gyro2.rate()
|
||||
gyroAngle = gyroAngle + timestep * gyroRate
|
||||
}
|
||||
function reset() {
|
||||
state = 0
|
||||
// sleeping
|
||||
moods.sleeping.show();
|
||||
// reset counters
|
||||
motors.largeA.reset()
|
||||
motors.largeD.reset()
|
||||
// motors are unregulated
|
||||
motors.largeA.setRegulated(false)
|
||||
motors.largeD.setRegulated(false)
|
||||
// clear the gyro sensor to remove drift
|
||||
sensors.gyro2.reset()
|
||||
// fall detection timer
|
||||
control.timer2.reset()
|
||||
// timestep computation timer
|
||||
control.timer3.reset()
|
||||
motorAngle = 0
|
||||
motorPosition = 0
|
||||
motorSpeed = 0
|
||||
motorSpeed0 = 0
|
||||
motorSpeed1 = 0
|
||||
motorSpeed2 = 0
|
||||
motorSpeed3 = 0
|
||||
gyroRate = 0
|
||||
gyroAngle = 0
|
||||
fallen = false
|
||||
power = 0
|
||||
controlSteering = 0
|
||||
controlDrive = 0
|
||||
// awake
|
||||
moods.awake.show();
|
||||
gyroAngle = -0.25
|
||||
state = 1;
|
||||
}
|
||||
// compute set point for motor position and required
|
||||
// motor power
|
||||
function computePower() {
|
||||
// apply control and compute desired motor position
|
||||
motorPosition -= timestep * controlDrive;
|
||||
// estimate power based on sensor readings and control
|
||||
// values
|
||||
power = 0.8 * gyroRate + 15 * gyroAngle + (0.08 * motorSpeed + 0.12 * motorPosition) - 0.01 * controlDrive
|
||||
// ensure that power stays within -100, 100
|
||||
if (power > 100) {
|
||||
power = 100
|
||||
} else if (power < -100) {
|
||||
power = -100
|
||||
}
|
||||
}
|
||||
// test if the robot has fallen off
|
||||
function checkFallen() {
|
||||
if (Math.abs(power) < 100) {
|
||||
control.timer2.reset()
|
||||
}
|
||||
if (control.timer2.seconds() > 2) {
|
||||
fallen = true
|
||||
}
|
||||
}
|
||||
// stop all motors and wait for touch button to be
|
||||
// pressed
|
||||
function stop() {
|
||||
motors.stopAll()
|
||||
state = 0
|
||||
moods.knockedOut.show();
|
||||
sensors.touch3.pauseUntil(ButtonEvent.Pressed)
|
||||
moods.neutral.show();
|
||||
}
|
||||
sensors.ultrasonic4.onEvent(UltrasonicSensorEvent.ObjectNear, function () {
|
||||
moods.dizzy.show()
|
||||
controlSteering = 0
|
||||
oldControlDrive = controlDrive
|
||||
controlDrive = -10
|
||||
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
|
||||
}
|
||||
pause(4000)
|
||||
music.playTone(2000, 100)
|
||||
controlSteering = 0
|
||||
controlDrive = oldControlDrive
|
||||
moods.neutral.show()
|
||||
})
|
||||
// compute the elapsed time since the last iteration
|
||||
function computeTimestep() {
|
||||
timestep = control.timer3.seconds()
|
||||
control.timer3.reset()
|
||||
}
|
||||
sensors.color1.onColorDetected(ColorSensorColor.Green, function () {
|
||||
moods.winking.show()
|
||||
controlDrive = 150
|
||||
controlSteering = 0
|
||||
})
|
||||
sensors.color1.onColorDetected(ColorSensorColor.Blue, function () {
|
||||
moods.middleRight.show()
|
||||
controlSteering = 70
|
||||
})
|
||||
// apply power to motors
|
||||
function controlMotors() {
|
||||
motors.largeA.run(power + controlSteering * 0.1)
|
||||
motors.largeD.run(power - controlSteering * 0.1)
|
||||
}
|
||||
sensors.color1.onColorDetected(ColorSensorColor.Yellow, function () {
|
||||
moods.middleLeft.show()
|
||||
controlSteering = -70
|
||||
})
|
||||
sensors.color1.onColorDetected(ColorSensorColor.White, function () {
|
||||
moods.sad.show();
|
||||
controlDrive = -75
|
||||
})
|
||||
timestep = 0.014
|
||||
// main loop
|
||||
forever(function () {
|
||||
reset()
|
||||
while (!fallen) {
|
||||
control.timer3.pauseUntil(5)
|
||||
computeTimestep()
|
||||
computeGyro()
|
||||
computeMotors()
|
||||
computePower()
|
||||
controlMotors()
|
||||
checkFallen()
|
||||
}
|
||||
stop()
|
||||
})
|
||||
```
|
@ -1,215 +0,0 @@
|
||||
# Gyroboy LabView
|
||||
|
||||
```typescript
|
||||
let mSum = 0;
|
||||
let mPos = 0;
|
||||
let mSpd = 0;
|
||||
let mD = 0;
|
||||
let mDP1 = 0;
|
||||
let mDP2 = 0;
|
||||
let mDP3 = 0;
|
||||
let Crdv = 0;
|
||||
let cLo = 0;
|
||||
let gAng = 0;
|
||||
let ok = false;
|
||||
let pwr = 0;
|
||||
let Cstr = 0;
|
||||
let Cdrv = 0;
|
||||
let gMn = 0;
|
||||
let gMx = 0;
|
||||
let gSum = 0;
|
||||
let gyro = 0;
|
||||
let gOS = 0;
|
||||
let gSpd = 0;
|
||||
let tInt = 0.014;
|
||||
let lpwr = 0
|
||||
let rpwr = 0
|
||||
let tStart = 0
|
||||
let st = 0
|
||||
let oldDr = 0
|
||||
|
||||
function RST() {
|
||||
motors.largeA.reset()
|
||||
motors.largeD.reset()
|
||||
motors.largeA.setRegulated(false)
|
||||
motors.largeD.setRegulated(false)
|
||||
sensors.gyro2.reset()
|
||||
sensors.gyro2.rate()
|
||||
control.timer2.reset()
|
||||
pause(5000)
|
||||
mSum = 0;
|
||||
mPos = 0;
|
||||
mD = 0;
|
||||
mDP1 = 0;
|
||||
mDP2 = 0;
|
||||
mDP3 = 0;
|
||||
Crdv = 0;
|
||||
cLo = 0;
|
||||
gAng = 0;
|
||||
ok = false;
|
||||
pwr = 0;
|
||||
st = 0;
|
||||
Cstr = 0;
|
||||
Cdrv = 0;
|
||||
}
|
||||
|
||||
function OS() {
|
||||
// OSL
|
||||
do {
|
||||
gMn = 1000;
|
||||
gMx = -100;
|
||||
gSum = 0;
|
||||
// gChk
|
||||
for (let i = 0; i < 200; i++) {
|
||||
gyro = sensors.gyro2.rate()
|
||||
gSum = gyro;
|
||||
gMx = Math.max(gMx, gyro)
|
||||
gMn = Math.min(gMn, gyro)
|
||||
pause(4);
|
||||
}
|
||||
} while (gMx - gMn > 2);
|
||||
gOS = gSum / 200;
|
||||
}
|
||||
|
||||
function GT() {
|
||||
if (cLo == 0) {
|
||||
tInt = 0.014;
|
||||
control.timer1.reset();
|
||||
} else {
|
||||
tInt = control.timer1.seconds() / cLo;
|
||||
}
|
||||
cLo++;
|
||||
}
|
||||
|
||||
function GG() {
|
||||
gyro = sensors.gyro2.rate();
|
||||
gOS = 0.0005 * gyro + (1 - 0.0005) * gOS
|
||||
gSpd = gyro - gOS;
|
||||
gAng = gAng + tInt * gSpd;
|
||||
}
|
||||
|
||||
function GM() {
|
||||
let temp = mSum
|
||||
mSum = motors.largeD.angle() + motors.largeA.angle();
|
||||
mD = mSum - temp;
|
||||
mPos = mPos + mD;
|
||||
mSpd = ((mDP1 + mDP2 + mDP3 + mD) / 4) / tInt;
|
||||
mDP3 = mDP2;
|
||||
mDP2 = mDP1;
|
||||
mDP1 = mD;
|
||||
}
|
||||
|
||||
function EQ() {
|
||||
mPos = mPos - Cdrv * tInt;
|
||||
pwr = (0.8 * gSpd + 15 * gAng) + (0.08 * mSpd + 0.12 * mPos) - 0.01 * Cdrv
|
||||
if (pwr > 100) pwr = 100
|
||||
else if (pwr < -100) pwr = -100
|
||||
}
|
||||
|
||||
function cntrl() {
|
||||
mPos = mPos - tInt * Cdrv
|
||||
lpwr = (pwr + Cstr * 0.1)
|
||||
rpwr = (pwr - Cstr * 0.1)
|
||||
}
|
||||
|
||||
function CHK() {
|
||||
if (Math.abs(pwr) < 100)
|
||||
control.timer2.reset();
|
||||
if (control.timer2.seconds() > 2) {
|
||||
ok = true;
|
||||
}
|
||||
}
|
||||
|
||||
// M
|
||||
forever(function () {
|
||||
RST();
|
||||
brick.showImage(images.eyesSleeping)
|
||||
OS()
|
||||
gAng = -0.25;
|
||||
music.playSoundEffect(sounds.movementsSpeedUp)
|
||||
brick.showImage(images.eyesAwake)
|
||||
st = 1;
|
||||
// BALANCE
|
||||
while (!ok) {
|
||||
GT();
|
||||
let t1 = control.timer1.millis()
|
||||
GG();
|
||||
GM();
|
||||
EQ();
|
||||
cntrl();
|
||||
motors.largeA.run(lpwr)
|
||||
motors.largeD.run(rpwr)
|
||||
CHK()
|
||||
let t2 = control.timer1.millis();
|
||||
let p = 5 - (t2 - t1);
|
||||
pause(Math.max(1, p))
|
||||
}
|
||||
motors.stopAll()
|
||||
st = 0;
|
||||
brick.setStatusLight(StatusLight.RedPulse);
|
||||
brick.showImage(images.eyesKnockedOut)
|
||||
music.playSoundEffect(sounds.movementsSpeedDown)
|
||||
sensors.touch3.pauseUntil(ButtonEvent.Pressed)
|
||||
brick.setStatusLight(StatusLight.Off);
|
||||
})
|
||||
|
||||
// BHV
|
||||
forever(function () {
|
||||
switch (st) {
|
||||
case 0:
|
||||
Cdrv = 0;
|
||||
Cstr = 0;
|
||||
break;
|
||||
case 1:
|
||||
Cdrv = 40;
|
||||
pause(4000);
|
||||
Cdrv = 0;
|
||||
music.playTone(1000, 100);
|
||||
st = 2;
|
||||
break;
|
||||
case 2:
|
||||
switch (sensors.color1.color()) {
|
||||
case ColorSensorColor.Red:
|
||||
music.playTone(2000, 100);
|
||||
Cdrv = 0;
|
||||
Cstr = 0;
|
||||
break;
|
||||
case ColorSensorColor.Green:
|
||||
music.playTone(2000, 100);
|
||||
Cdrv = 150;
|
||||
Cstr = 0;
|
||||
break;
|
||||
case ColorSensorColor.Blue:
|
||||
music.playTone(2000, 100);
|
||||
Cstr = 70;
|
||||
break;
|
||||
case ColorSensorColor.Yellow:
|
||||
music.playTone(2000, 100);
|
||||
Cstr = -70;
|
||||
break;
|
||||
case ColorSensorColor.White:
|
||||
music.playTone(2000, 100);
|
||||
Cdrv = -75;
|
||||
break;
|
||||
}
|
||||
if (sensors.ultrasonic4.distance() < 25) {
|
||||
Cstr = 0;
|
||||
oldDr = Cdrv;
|
||||
Cdrv = -10;
|
||||
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;
|
||||
pause(4000);
|
||||
music.playTone(2000, 100)
|
||||
Cstr = 0;
|
||||
Cdrv = oldDr;
|
||||
}
|
||||
break;
|
||||
}
|
||||
pause(80);
|
||||
})
|
||||
```
|
@ -1,390 +0,0 @@
|
||||
# Puppy
|
||||
|
||||
```typescript
|
||||
let P_T = 0;
|
||||
let ISS = 0;
|
||||
let F_T = 0;
|
||||
let P_C = 0;
|
||||
let F_C = 0;
|
||||
let DB_S = 0;
|
||||
let NS = false;
|
||||
let IBP = 0;
|
||||
let IAP = 0;
|
||||
let C = false;
|
||||
let TC = false;
|
||||
let OTC = false;
|
||||
let COL = 0;
|
||||
let OCOL = 0;
|
||||
let _C = false;
|
||||
let GTO = 0;
|
||||
|
||||
function DN() {
|
||||
motors.largeAD.setBrake(true);
|
||||
motors.largeAD.tank(50, 50, 1, MoveUnit.Seconds);
|
||||
pause(100);
|
||||
motors.largeA.clearCounts()
|
||||
motors.largeD.clearCounts()
|
||||
}
|
||||
|
||||
function MNRH() {
|
||||
motors.mediumC.setBrake(true)
|
||||
brick.showImage(images.legoEv3icon)
|
||||
brick.setStatusLight(StatusLight.OrangePulse)
|
||||
while (!brick.buttonEnter.wasPressed()) {
|
||||
if (brick.buttonUp.wasPressed()) {
|
||||
motors.mediumC.run(-100);
|
||||
} else if (brick.buttonDown.wasPressed()) {
|
||||
motors.mediumC.run(100);
|
||||
} else {
|
||||
motors.mediumC.stop();
|
||||
}
|
||||
}
|
||||
motors.mediumC.stop();
|
||||
motors.mediumC.clearCounts();
|
||||
brick.setStatusLight(StatusLight.Green);
|
||||
}
|
||||
|
||||
function IS(t: number) {
|
||||
ISS = t;
|
||||
switch (t) {
|
||||
case 0:
|
||||
brick.showImage(images.eyesNeutral);
|
||||
break;
|
||||
case 1:
|
||||
brick.showImage(images.eyesSleeping);
|
||||
break;
|
||||
case 2:
|
||||
brick.showImage(images.eyesTear);
|
||||
// draw rect...
|
||||
break;
|
||||
case 3:
|
||||
brick.showImage(images.eyesHurt);
|
||||
break;
|
||||
case 4:
|
||||
brick.showImage(images.eyesAngry);
|
||||
break;
|
||||
case 5:
|
||||
brick.showImage(images.eyesTiredMiddle);
|
||||
break;
|
||||
case 6:
|
||||
brick.showImage(images.eyesTiredRight);
|
||||
break;
|
||||
case 7:
|
||||
brick.showImage(images.eyesTiredLeft);
|
||||
break;
|
||||
case 8:
|
||||
brick.showImage(images.eyesLove);
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function UP() {
|
||||
if (motors.largeA.angle() > -50) {
|
||||
control.runInParallel(function () {
|
||||
motors.largeD.clearCounts()
|
||||
motors.largeD.run(-35);
|
||||
pauseUntil(() => motors.largeD.angle() < -25);
|
||||
motors.largeD.stop();
|
||||
motors.largeD.setRegulated(false)
|
||||
motors.largeD.run(-15)
|
||||
pauseUntil(() => motors.largeD.angle() < -65);
|
||||
motors.largeD.stop();
|
||||
})
|
||||
motors.largeA.clearCounts()
|
||||
motors.largeA.run(-35);
|
||||
pauseUntil(() => motors.largeA.angle() < -25);
|
||||
motors.largeA.stop();
|
||||
motors.largeA.setRegulated(false)
|
||||
motors.largeA.run(-15)
|
||||
pauseUntil(() => motors.largeA.angle() < -65);
|
||||
motors.largeA.stop();
|
||||
|
||||
pause(500);
|
||||
}
|
||||
}
|
||||
|
||||
function RST() {
|
||||
P_T = Math.randomRange(3, 6);
|
||||
F_T = Math.randomRange(2, 4);
|
||||
P_C = 1;
|
||||
F_C = 1;
|
||||
control.timer1.reset();
|
||||
control.timer2.reset();
|
||||
control.timer3.reset();
|
||||
CS(0);
|
||||
}
|
||||
|
||||
function CS(db: number) {
|
||||
if (DB_S != db) {
|
||||
DB_S = db;
|
||||
NS = true;
|
||||
}
|
||||
}
|
||||
|
||||
function MON() {
|
||||
if (control.timer2.seconds() > 10) {
|
||||
control.timer2.reset();
|
||||
P_C--;
|
||||
if (P_C < 0) {
|
||||
P_C = 0;
|
||||
}
|
||||
}
|
||||
if (control.timer1.seconds() > 20) {
|
||||
control.timer1.reset()
|
||||
F_C--;
|
||||
if (F_C < 0) {
|
||||
F_C = 0;
|
||||
}
|
||||
}
|
||||
if (control.timer3.seconds() > 30) {
|
||||
control.timer3.reset();
|
||||
CS(1);
|
||||
}
|
||||
}
|
||||
|
||||
function UIS() {
|
||||
if (control.timer5.seconds() > IBP) {
|
||||
control.timer5.reset();
|
||||
if (ISS == 1) {
|
||||
ISS = 6;
|
||||
IBP = Math.randomRange(1, 5);
|
||||
} else {
|
||||
ISS = 1;
|
||||
IBP = 0.25;
|
||||
}
|
||||
IS(ISS);
|
||||
}
|
||||
if (control.timer6.seconds() > IAP) {
|
||||
if (ISS != 1) {
|
||||
control.timer6.reset();
|
||||
IAP = Math.randomRange(1, 10)
|
||||
if (ISS != 7) {
|
||||
ISS = 7
|
||||
} else {
|
||||
ISS = 6;
|
||||
}
|
||||
IS(ISS);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function UPDB() {
|
||||
if ((P_T == P_C) && (F_T == F_C)) {
|
||||
CS(6);
|
||||
}
|
||||
if ((P_T > P_C) && (F_T < F_C)) {
|
||||
CS(3);
|
||||
}
|
||||
if ((P_T < P_C) && (F_T > F_C)) {
|
||||
CS(5);
|
||||
}
|
||||
if ((P_C == 0) && (F_C > 0)) {
|
||||
CS(2)
|
||||
}
|
||||
if (F_C == 0) {
|
||||
CS(4)
|
||||
}
|
||||
}
|
||||
|
||||
function PTC() {
|
||||
C = false;
|
||||
OTC = TC;
|
||||
TC = sensors.touch1.isPressed()
|
||||
if (TC != OTC && TC) {
|
||||
P_C++;
|
||||
control.timer3.reset();
|
||||
if (DB_S != 4) {
|
||||
IS(2);
|
||||
music.playSoundEffect(sounds.animalsDogSniff);
|
||||
C = true;
|
||||
}
|
||||
}
|
||||
return C;
|
||||
}
|
||||
|
||||
function FDC() {
|
||||
OCOL = COL;
|
||||
COL = sensors.color4.color();
|
||||
_C = false;
|
||||
if ((COL != 0) && (OCOL != COL)) {
|
||||
F_C++;
|
||||
_C = true;
|
||||
control.timer3.reset();
|
||||
IS(2);
|
||||
music.playSoundEffect(sounds.expressionsCrunching)
|
||||
}
|
||||
return _C;
|
||||
}
|
||||
|
||||
function IDL() {
|
||||
if (NS) {
|
||||
NS = false;
|
||||
UP();
|
||||
}
|
||||
UIS();
|
||||
UPDB();
|
||||
PTC();
|
||||
FDC();
|
||||
}
|
||||
|
||||
function MHT(Pos: number) {
|
||||
let _R = Pos - motors.mediumC.angle();
|
||||
if (_R >= 0) {
|
||||
motors.mediumC.run(100, _R, MoveUnit.Degrees);
|
||||
} else {
|
||||
motors.mediumC.run(-100, Math.abs(_R), MoveUnit.Degrees);
|
||||
}
|
||||
}
|
||||
|
||||
function SLP() {
|
||||
if (NS) {
|
||||
NS = false;
|
||||
IS(5)
|
||||
DN()
|
||||
MHT(3000)
|
||||
IS(1)
|
||||
music.playSoundEffect(sounds.expressionsSnoring)
|
||||
}
|
||||
if (sensors.touch1.isPressed() || brick.buttonEnter.isPressed()) {
|
||||
music.stopAllSounds();
|
||||
control.timer3.reset();
|
||||
CS(7);
|
||||
}
|
||||
}
|
||||
|
||||
function PLF() {
|
||||
if (NS) {
|
||||
NS = false
|
||||
IS(0)
|
||||
UP()
|
||||
music.playSoundEffect(sounds.animalsDogBark2)
|
||||
control.timer4.reset()
|
||||
GTO = Math.randomRange(4, 8);
|
||||
}
|
||||
if(PTC()) {
|
||||
CS(0);
|
||||
}
|
||||
if (control.timer4.seconds() > GTO) {
|
||||
music.playSoundEffect(sounds.animalsDogBark2)
|
||||
control.timer4.reset();
|
||||
GTO = Math.randomRange(4, 8);
|
||||
}
|
||||
}
|
||||
|
||||
function NGR() {
|
||||
NS = false
|
||||
IS(4)
|
||||
music.playSoundEffect(sounds.animalsDogGrowl);
|
||||
UP();
|
||||
pause(1500);
|
||||
music.stopAllSounds()
|
||||
music.playSoundEffect(sounds.animalsDogBark1)
|
||||
P_C--;
|
||||
CS(0);
|
||||
}
|
||||
|
||||
function HNG() {
|
||||
if (NS) {
|
||||
NS = false;
|
||||
IS(3)
|
||||
DN();
|
||||
music.playSoundEffect(sounds.animalsDogWhine);
|
||||
}
|
||||
if(FDC()) {
|
||||
CS(0)
|
||||
}
|
||||
if (PTC()) {
|
||||
CS(3);
|
||||
}
|
||||
}
|
||||
|
||||
function PPP() {
|
||||
NS = false;
|
||||
IS(2);
|
||||
UP();
|
||||
pause(100)
|
||||
motors.largeA.run(-30, 70, MoveUnit.Degrees);
|
||||
pause(800);
|
||||
music.playSoundEffect(sounds.mechanicalHorn1);
|
||||
pause(1000);
|
||||
for(let i = 0; i < 3; ++i) {
|
||||
motors.largeA.run(-30, 20, MoveUnit.Degrees);
|
||||
motors.largeA.run(30, 20, MoveUnit.Degrees);
|
||||
}
|
||||
motors.largeA.run(30, 70, MoveUnit.Degrees);
|
||||
F_C = 1;
|
||||
CS(0);
|
||||
}
|
||||
|
||||
function HPY() {
|
||||
IS(8)
|
||||
MHT(0);
|
||||
motors.largeAD.run(10, 0.8, MoveUnit.Seconds);
|
||||
for(let i = 0; i < 3; ++i) {
|
||||
music.playSoundEffect(sounds.animalsDogBark1);
|
||||
motors.largeAD.run(-100, 0.2, MoveUnit.Seconds);
|
||||
pause(300)
|
||||
motors.largeAD.run(10, 0.3, MoveUnit.Seconds)
|
||||
}
|
||||
pause(500);
|
||||
music.stopAllSounds();
|
||||
DN();
|
||||
RST();
|
||||
}
|
||||
|
||||
function STL() {
|
||||
UP();
|
||||
motors.largeAD.run(-20, 60, MoveUnit.Degrees);
|
||||
music.playSoundEffect(sounds.animalsDogWhine);
|
||||
motors.largeAD.run(20, 60, MoveUnit.Degrees);
|
||||
}
|
||||
|
||||
function WKU() {
|
||||
let stateC = false;
|
||||
IS(5);
|
||||
music.playSoundEffect(sounds.animalsDogWhine)
|
||||
MHT(0)
|
||||
DN()
|
||||
STL()
|
||||
pause(1000);
|
||||
UP()
|
||||
CS(0;)
|
||||
}
|
||||
|
||||
DN();
|
||||
MNRH();
|
||||
// compare button state???
|
||||
IS(1);
|
||||
UP();
|
||||
RST();
|
||||
forever(function () {
|
||||
MON();
|
||||
switch (DB_S) {
|
||||
case 0:
|
||||
IDL();
|
||||
break;
|
||||
case 1:
|
||||
SLP();
|
||||
break;
|
||||
case 2:
|
||||
PLF();
|
||||
break;
|
||||
case 3:
|
||||
NGR();
|
||||
break;
|
||||
case 4:
|
||||
HNG();
|
||||
break;
|
||||
case 5:
|
||||
PPP();
|
||||
break;
|
||||
case 6:
|
||||
HPY();
|
||||
break;
|
||||
case 7:
|
||||
WKU();
|
||||
break;
|
||||
}
|
||||
})
|
||||
```
|
@ -1,51 +0,0 @@
|
||||
# Robot Arm
|
||||
|
||||
```typescript
|
||||
function INI() {
|
||||
motors.largeB.setBrake(true)
|
||||
motors.largeC.setBrake(true)
|
||||
motors.mediumA.setBrake(true)
|
||||
motors.largeB.run(-50)
|
||||
pauseUntil(() => sensors.color3.light(LightIntensityMode.Reflected) > 25);
|
||||
motors.largeB.stop();
|
||||
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.run(-50, 0.86, MoveUnit.Rotations);
|
||||
}
|
||||
|
||||
INI()
|
||||
|
||||
let down = false;
|
||||
forever(function () {
|
||||
brick.showImage(images.informationQuestionMark)
|
||||
brick.setStatusLight(StatusLight.OrangePulse);
|
||||
pauseUntil(() => (down = brick.buttonDown.wasPressed()) || brick.buttonUp.wasPressed())
|
||||
brick.setStatusLight(StatusLight.Off)
|
||||
music.playSoundEffect(sounds.mechanicalAirRelease)
|
||||
brick.showImage(images.informationAccept)
|
||||
if (down) {
|
||||
brick.showImage(images.informationForward)
|
||||
motors.largeC.run(65, 0.85, MoveUnit.Rotations);
|
||||
} else {
|
||||
brick.showImage(images.informationBackward)
|
||||
motors.largeC.run(-65, 0.85, MoveUnit.Rotations);
|
||||
}
|
||||
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.run(-65, 0.86, MoveUnit.Rotations);
|
||||
} else {
|
||||
motors.largeC.run(65, 0.85, MoveUnit.Rotations);
|
||||
}
|
||||
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()
|
||||
})
|
||||
```
|
@ -1,51 +0,0 @@
|
||||
# Crane LabView
|
||||
|
||||
```blocks
|
||||
function INI() {
|
||||
motors.largeB.setBrake(true)
|
||||
motors.largeC.setBrake(true)
|
||||
motors.mediumA.setBrake(true)
|
||||
motors.largeB.run(-50)
|
||||
pauseUntil(() => sensors.color3.light(LightIntensityMode.Reflected) > 25);
|
||||
motors.largeB.stop();
|
||||
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.run(-50, 0.86, MoveUnit.Rotations);
|
||||
}
|
||||
|
||||
INI()
|
||||
|
||||
let down = false;
|
||||
forever(function () {
|
||||
brick.showImage(images.informationQuestionMark)
|
||||
brick.setStatusLight(StatusLight.OrangePulse);
|
||||
pauseUntil(() => (down = brick.buttonDown.wasPressed()) || brick.buttonUp.wasPressed())
|
||||
brick.setStatusLight(StatusLight.Off)
|
||||
music.playSoundEffect(sounds.mechanicalAirRelease)
|
||||
brick.showImage(images.informationAccept)
|
||||
if (down) {
|
||||
brick.showImage(images.informationForward)
|
||||
motors.largeC.run(65, 0.85, MoveUnit.Rotations);
|
||||
} else {
|
||||
brick.showImage(images.informationBackward)
|
||||
motors.largeC.run(-65, 0.85, MoveUnit.Rotations);
|
||||
}
|
||||
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.run(-65, 0.86, MoveUnit.Rotations);
|
||||
} else {
|
||||
motors.largeC.run(65, 0.85, MoveUnit.Rotations);
|
||||
}
|
||||
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()
|
||||
})
|
||||
```
|
@ -1,34 +0,0 @@
|
||||
# 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)
|
||||
})
|
||||
```
|
@ -1,215 +0,0 @@
|
||||
# Gyro Boy LabView
|
||||
|
||||
```blocks
|
||||
let mSum = 0;
|
||||
let mPos = 0;
|
||||
let mSpd = 0;
|
||||
let mD = 0;
|
||||
let mDP1 = 0;
|
||||
let mDP2 = 0;
|
||||
let mDP3 = 0;
|
||||
let Crdv = 0;
|
||||
let cLo = 0;
|
||||
let gAng = 0;
|
||||
let ok = false;
|
||||
let pwr = 0;
|
||||
let Cstr = 0;
|
||||
let Cdrv = 0;
|
||||
let gMn = 0;
|
||||
let gMx = 0;
|
||||
let gSum = 0;
|
||||
let gyro = 0;
|
||||
let gOS = 0;
|
||||
let gSpd = 0;
|
||||
let tInt = 0.014;
|
||||
let lpwr = 0
|
||||
let rpwr = 0
|
||||
let tStart = 0
|
||||
let st = 0
|
||||
let oldDr = 0
|
||||
|
||||
function RST() {
|
||||
motors.largeA.reset()
|
||||
motors.largeD.reset()
|
||||
motors.largeA.setRegulated(false)
|
||||
motors.largeD.setRegulated(false)
|
||||
sensors.gyro2.reset()
|
||||
sensors.gyro2.rate()
|
||||
control.timer2.reset()
|
||||
pause(5000)
|
||||
mSum = 0;
|
||||
mPos = 0;
|
||||
mD = 0;
|
||||
mDP1 = 0;
|
||||
mDP2 = 0;
|
||||
mDP3 = 0;
|
||||
Crdv = 0;
|
||||
cLo = 0;
|
||||
gAng = 0;
|
||||
ok = false;
|
||||
pwr = 0;
|
||||
st = 0;
|
||||
Cstr = 0;
|
||||
Cdrv = 0;
|
||||
}
|
||||
|
||||
function OS() {
|
||||
// OSL
|
||||
do {
|
||||
gMn = 1000;
|
||||
gMx = -100;
|
||||
gSum = 0;
|
||||
// gChk
|
||||
for (let i = 0; i < 200; i++) {
|
||||
gyro = sensors.gyro2.rate()
|
||||
gSum = gyro;
|
||||
gMx = Math.max(gMx, gyro)
|
||||
gMn = Math.min(gMn, gyro)
|
||||
pause(4);
|
||||
}
|
||||
} while (gMx - gMn > 2);
|
||||
gOS = gSum / 200;
|
||||
}
|
||||
|
||||
function GT() {
|
||||
if (cLo == 0) {
|
||||
tInt = 0.014;
|
||||
control.timer1.reset();
|
||||
} else {
|
||||
tInt = control.timer1.seconds() / cLo;
|
||||
}
|
||||
cLo++;
|
||||
}
|
||||
|
||||
function GG() {
|
||||
gyro = sensors.gyro2.rate();
|
||||
gOS = 0.0005 * gyro + (1 - 0.0005) * gOS
|
||||
gSpd = gyro - gOS;
|
||||
gAng = gAng + tInt * gSpd;
|
||||
}
|
||||
|
||||
function GM() {
|
||||
let temp = mSum
|
||||
mSum = motors.largeD.angle() + motors.largeA.angle();
|
||||
mD = mSum - temp;
|
||||
mPos = mPos + mD;
|
||||
mSpd = ((mDP1 + mDP2 + mDP3 + mD) / 4) / tInt;
|
||||
mDP3 = mDP2;
|
||||
mDP2 = mDP1;
|
||||
mDP1 = mD;
|
||||
}
|
||||
|
||||
function EQ() {
|
||||
mPos = mPos - Cdrv * tInt;
|
||||
pwr = (0.8 * gSpd + 15 * gAng) + (0.095 * mSpd + 0.13 * mPos) - 0.01 * Cdrv
|
||||
if (pwr > 100) pwr = 100
|
||||
else if (pwr < -100) pwr = -100
|
||||
}
|
||||
|
||||
function cntrl() {
|
||||
mPos = mPos - tInt * Cdrv
|
||||
lpwr = (pwr + Cstr * 0.1)
|
||||
rpwr = (pwr - Cstr * 0.1)
|
||||
}
|
||||
|
||||
function CHK() {
|
||||
if (Math.abs(pwr) < 100)
|
||||
control.timer2.reset();
|
||||
if (control.timer2.seconds() > 2) {
|
||||
ok = true;
|
||||
}
|
||||
}
|
||||
|
||||
// M
|
||||
forever(function () {
|
||||
RST();
|
||||
brick.showImage(images.eyesSleeping)
|
||||
OS()
|
||||
gAng = -0.25;
|
||||
music.playSoundEffect(sounds.movementsSpeedUp)
|
||||
brick.showImage(images.eyesAwake)
|
||||
st = 1;
|
||||
// BALANCE
|
||||
while (!ok) {
|
||||
GT();
|
||||
let t1 = control.timer1.millis()
|
||||
GG();
|
||||
GM();
|
||||
EQ();
|
||||
cntrl();
|
||||
motors.largeA.run(lpwr)
|
||||
motors.largeD.run(rpwr)
|
||||
CHK()
|
||||
let t2 = control.timer1.millis();
|
||||
let p = 5 - (t2 - t1);
|
||||
pause(Math.max(1, p))
|
||||
}
|
||||
motors.stopAll()
|
||||
st = 0;
|
||||
brick.setStatusLight(StatusLight.RedPulse);
|
||||
brick.showImage(images.eyesKnockedOut)
|
||||
music.playSoundEffect(sounds.movementsSpeedDown)
|
||||
sensors.touch3.pauseUntil(ButtonEvent.Pressed)
|
||||
brick.setStatusLight(StatusLight.Off);
|
||||
})
|
||||
|
||||
// BHV
|
||||
forever(function () {
|
||||
switch (st) {
|
||||
case 0:
|
||||
Cdrv = 0;
|
||||
Cstr = 0;
|
||||
break;
|
||||
case 1:
|
||||
Cdrv = 40;
|
||||
pause(4000);
|
||||
Cdrv = 0;
|
||||
music.playTone(1000, 100);
|
||||
st = 2;
|
||||
break;
|
||||
case 2:
|
||||
switch (sensors.color1.color()) {
|
||||
case ColorSensorColor.Red:
|
||||
music.playTone(2000, 100);
|
||||
Cdrv = 0;
|
||||
Cstr = 0;
|
||||
break;
|
||||
case ColorSensorColor.Green:
|
||||
music.playTone(2000, 100);
|
||||
Cdrv = 150;
|
||||
Cstr = 0;
|
||||
break;
|
||||
case ColorSensorColor.Blue:
|
||||
music.playTone(2000, 100);
|
||||
Cstr = 70;
|
||||
break;
|
||||
case ColorSensorColor.Yellow:
|
||||
music.playTone(2000, 100);
|
||||
Cstr = -70;
|
||||
break;
|
||||
case ColorSensorColor.White:
|
||||
music.playTone(2000, 100);
|
||||
Cdrv = -75;
|
||||
break;
|
||||
}
|
||||
if (sensors.ultrasonic4.distance() < 25) {
|
||||
Cstr = 0;
|
||||
oldDr = Cdrv;
|
||||
Cdrv = -10;
|
||||
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;
|
||||
pause(4000);
|
||||
music.playTone(2000, 100)
|
||||
Cstr = 0;
|
||||
Cdrv = oldDr;
|
||||
}
|
||||
break;
|
||||
}
|
||||
pause(80);
|
||||
})
|
||||
```
|
@ -3,10 +3,10 @@
|
||||
Use a touch sensor to make the brick happy.
|
||||
|
||||
```blocks
|
||||
sensors.touch1.onEvent(ButtonEvent.Pressed, function () {
|
||||
sensors.touchSensor1.onEvent(TouchSensorEvent.Pressed, function () {
|
||||
brick.showImage(images.expressionsBigSmile)
|
||||
})
|
||||
sensors.touch1.onEvent(ButtonEvent.Released, function () {
|
||||
sensors.touchSensor1.onEvent(TouchSensorEvent.Released, function () {
|
||||
brick.showImage(images.expressionsSick)
|
||||
})
|
||||
```
|
@ -14,7 +14,7 @@ v = sensors.color3.light(LightIntensityMode.Reflected)
|
||||
min = v
|
||||
max = v
|
||||
setpoint = v
|
||||
while (!(brick.buttonEnter.isPressed())) {
|
||||
while (!(brick.buttonEnter.wasPressed())) {
|
||||
brick.clearScreen()
|
||||
brick.showString("Move robot on terrain", 1)
|
||||
brick.showString("Press ENTER when done", 2)
|
||||
@ -26,9 +26,9 @@ while (!(brick.buttonEnter.isPressed())) {
|
||||
brick.showValue("min", min, 4)
|
||||
brick.showValue("max", v, 5)
|
||||
brick.showValue("setpoint", setpoint, 6)
|
||||
pause(100)
|
||||
loops.pause(100)
|
||||
}
|
||||
forever(function () {
|
||||
loops.forever(function () {
|
||||
brick.clearScreen()
|
||||
v = sensors.color3.light(LightIntensityMode.Reflected)
|
||||
brick.showValue("light", v, 1)
|
||||
@ -43,8 +43,8 @@ forever(function () {
|
||||
motors.largeBC.steer(P + (I + D), 100)
|
||||
lasterror = error
|
||||
if (brick.buttonEnter.wasPressed()) {
|
||||
motors.largeBC.run(0)
|
||||
brick.buttonDown.pauseUntil(ButtonEvent.Bumped)
|
||||
motors.largeBC.setSpeed(0)
|
||||
brick.buttonDown.pauseUntil(ButtonEvent.Click)
|
||||
}
|
||||
})
|
||||
```
|
@ -1,18 +0,0 @@
|
||||
# Extensions
|
||||
|
||||
## #gallery
|
||||
|
||||
## Using Extensions
|
||||
|
||||
In the web editor, click on ``Settings`` then ``Extensions`` to search and add extensions to the project.
|
||||
The Blocks and JavaScript definitions will be automatically loaded in the editor.
|
||||
|
||||
## Custom extensions
|
||||
|
||||
The [Build Your Own Extension](https://makecode.com/extensions/getting-started) manual is for advanced users who want to publish their own extension.
|
||||
|
||||
## ~ hint
|
||||
|
||||
**Extensions** were previously called **Packages** in MakeCode.
|
||||
|
||||
## ~
|
Binary file not shown.
134
docs/fll.md
134
docs/fll.md
@ -1,134 +0,0 @@
|
||||
# MakeCode for _FIRST_ LEGO League
|
||||
|
||||
![FIRST LEGO League logo](/static/fll/fll-logo.png)
|
||||
|
||||
**For teams participating in City Shaper challenge**, you can use MakeCode for your challenge (see [City Shaper Challenge, page 7 bottom](https://firstinspiresst01.blob.core.windows.net/fll/2020/city-shaper-game-guide-pdf.pdf)!
|
||||
|
||||
We’ve compiled a list of resources and information that we hope will be helpful for you.
|
||||
|
||||
* **Got a question? Post it on the forums** at https://forum.makecode.com/
|
||||
|
||||
## FAQ
|
||||
|
||||
### I found a bug what do I do?
|
||||
|
||||
If you found a bug, please try if it hasn't been fixed yet! Go to https://makecode.mindstorms.com/beta and try if the bug is corrected. Otherwise, please tell us at https://forum.makecode.com/.
|
||||
|
||||
### How do I use MakeCode with my EV3?
|
||||
|
||||
* You will need to install the latest EV3 firmware on your brick. Instructions on how to do that are located here: https://makecode.mindstorms.com/troubleshoot.
|
||||
* You will need a computer with a USB port to connect to the EV3 in order to download your programs.
|
||||
* You will need internet access and a browser on your computer to get to https://makecode.mindstorms.com.
|
||||
* You can [install the app](/offline-app) to use the editor offline.
|
||||
|
||||
### I know LabView, how is MakeCode different?
|
||||
|
||||
We have compiled a guide for EV3 LabView users at https://makecode.mindstorms.com/labview.
|
||||
|
||||
### What’s the best way to get started with MakeCode?
|
||||
|
||||
Go to https://makecode.mindstorms.com. The home screen is filled with videos, tutorials and examples that might be relevant for your missions.
|
||||
|
||||
On the home page, scroll down to the **FLL / City Shaper** section for specific lessons related to Mission 2.
|
||||
|
||||
### Can I load both LEGO MINDSTORMS EV3 Software and MakeCode programs onto my EV3?
|
||||
|
||||
Yes.
|
||||
|
||||
### Can I run the program again on the brick?
|
||||
|
||||
![EV3 Brick with Try in BrkProg_Save Folder in File Manager](/static/getting-started/try-in-file-manager.png)
|
||||
|
||||
Use the Brick Buttons and navigate to the File Manager tab. Open the **BrkProg_SAVE** folder,
|
||||
select your program and click the center button to run it again.
|
||||
|
||||
### Does it work without internet?
|
||||
|
||||
No, the editor is cached in your browser cache. However, you can also download the [offline app](/offline-app) in case you need to install it on a computer.
|
||||
|
||||
### How do I figure out what a block does?
|
||||
|
||||
You can right-click on any block and select “Help” in the context menu to open the documentation page describing what that block does.
|
||||
|
||||
![Select help in context menu for block](/static/fll/context-help.jpg)
|
||||
|
||||
### How do I program in JavaScript?
|
||||
|
||||
Click the **JavaScript** button at the top of the page to get to the JavaScript editor. Students can drag and drop code snippets from the Toolbox on the left, or type directly in the editor. You can switch back and forth between **Blocks** and **JavaScript** as you program.
|
||||
|
||||
![Coding in JavaScript](/static/fll/code-js.gif)
|
||||
|
||||
Also, watch the [Text-based Coding](https://legoeducation.videomarketingplatform.co/v.ihtml/player.html?token=3513a83b87fe536b2dc512237465fd1b&source=embed&photo%5fid=35719471) video for more about coding using the JavaScript editor.
|
||||
|
||||
### How do I use the Simulator?
|
||||
|
||||
The Simulator will show the physical representation of your code blocks. For example, based on this code snippet, the Simulator will show the touch sensor on Port 1, and a large motor on Port D.
|
||||
|
||||
```blocks
|
||||
sensors.touch1.onEvent(ButtonEvent.Pressed, function () {
|
||||
motors.largeD.run(50)
|
||||
})
|
||||
```
|
||||
|
||||
![Simulator demonstration](/static/fll/simulator.gif)
|
||||
|
||||
Note that the Simulator is also interactive, so you can simulate inputs with any of the sensors.
|
||||
|
||||
See the video [Block-based Coding and Simulation](https://legoeducation.videomarketingplatform.co/v.ihtml/player.html?token=629730c938e452f0fd7653fbc4708166&source=embed&photo%5fid=35719470) for more about using the simulator.
|
||||
|
||||
### How do I save my programs?
|
||||
|
||||
MakeCode will automatically save your recent projects in the browser. However, you can also save a copy of your project as a file on your computer:
|
||||
|
||||
* From the **Settings** menu, select **Save Project**
|
||||
* This will download your program from the browser as a _lego-myproject.uf2_ file
|
||||
|
||||
![Save project menu selection](/static/fll/save-project.jpg)
|
||||
|
||||
* You can import your saved projects by clicking the Import button on the Home Page
|
||||
|
||||
![Import button on home screen](/static/fll/import-button.jpg)
|
||||
|
||||
### How do I share my programs?
|
||||
|
||||
You can share your projects by clicking on the **share** button in the top left of the screen. This will create a URL which you can send others to open and view your project.
|
||||
|
||||
![Share button in editor](/static/fll/share-button.jpg)
|
||||
|
||||
![Share button and dialogs demo](/static/fll/share-program.gif)
|
||||
|
||||
Sharing programs is also shown in the [Tips and Tricks](https://legoeducation.videomarketingplatform.co/v.ihtml/player.html?token=5c594c2373367f7870196f519f3bfc7a&source=embed&photo%5fid=35719472) video.
|
||||
|
||||
### Can I use Bluetooth to transfer my program?
|
||||
|
||||
The official answer is currently no. That being said, we have **Experimental support** for Bluetooth download. Please read the [Bluetooth](/bluetooth) page for more information.
|
||||
|
||||
https://youtu.be/VIq8-6Egtqs
|
||||
|
||||
## Are there YouTube videos on MakeCode for EV3?
|
||||
|
||||
The MakeCode has a [FLL / City Shaper YouTube Channel](https://www.youtube.com/watch?v=IqL0Pyeu5Ng&list=PLMMBk9hE-SeqkOObethhlZtBTEK6FYx3n) with useful videos.
|
||||
|
||||
https://youtu.be/-AirqwC9DL4
|
||||
|
||||
## Do you have examples of program used in competitions?
|
||||
|
||||
The MakeCode team ran a team with friends and family in South Seattle and scored 175 points.
|
||||
The programs used for the crane, swing, red blocks and ramp are at https://github.com/lego-marshmallows (the robot build is not detailled).
|
||||
|
||||
### Why can't I delete my program (*.uf2) files from the Brick?
|
||||
|
||||
There's a bug in the firmware which prevents you from deleting the programs (``*.uf2`` files) from your EV3 Brick. There isn't a firmware update to fix this yet.
|
||||
|
||||
We have prepared a special program that lets you delete UF2 files from the brick.
|
||||
Download [these PDF instructions](/file-manager.pdf) and drop the PDF on the brick drive.
|
||||
This will present you with an menu for deleting files.
|
||||
|
||||
For other common questions, try the FAQ page https://makecode.mindstorms.com/faq.
|
||||
|
||||
## Workarounds
|
||||
|
||||
1. Deleting Programs from the EV3 brick
|
||||
|
||||
>* Description: Unable to delete program files from the EV3 brick after downloading them
|
||||
>* Status: LEGO Education team is working on a fix, no estimated date yet
|
@ -1,36 +0,0 @@
|
||||
# Getting Started
|
||||
|
||||
## Projects
|
||||
|
||||
```codecard
|
||||
[
|
||||
{
|
||||
"name": "Prepare",
|
||||
"imageUrl": "/static/lessons/firmware.png",
|
||||
"description": "To use Microsoft MakeCode with your EV3 Brick, you will need to install the latest LEGO® MINDSTORMS® Education EV3 firmware.",
|
||||
"label": "New? Start Here!",
|
||||
"labelClass": "red ribbon large",
|
||||
"url": "https://makecode.mindstorms.com/troubleshoot"
|
||||
},
|
||||
{
|
||||
"name": "Try",
|
||||
"imageUrl": "/static/lessons/try.png",
|
||||
"description": "Get a quick introduction to programming.",
|
||||
"url": "/getting-started/try",
|
||||
"cardType": "side"
|
||||
},
|
||||
{
|
||||
"name": "Use",
|
||||
"imageUrl": "/static/lessons/use.png",
|
||||
"description": "Build a robot and drive into the world of robotics!",
|
||||
"url": "/getting-started/use",
|
||||
"cardType": "side"
|
||||
},
|
||||
{
|
||||
"name": "First LEGO League",
|
||||
"imageUrl": "/static/fll/fll-big.png",
|
||||
"description": "Information about using MakeCode in FLL competitions",
|
||||
"url": "/fll"
|
||||
}
|
||||
]
|
||||
```
|
@ -1,200 +0,0 @@
|
||||
# Try
|
||||
|
||||
## Introduction @unplugged
|
||||
|
||||
Get a quick introduction to programming with EV3.
|
||||
|
||||
![Display on EV3 Brick with Music Notes](/static/getting-started/01_EyesOn_Intro.png)
|
||||
|
||||
We are excited to help you get started with @boardname@. In this project we will guide you through connecting your EV3 Brick, creating your first program, controlling a Large Motor, a Touch Sensor and a Color Sensor. These steps can take up to 45 minutes.
|
||||
|
||||
## Turn on your EV3 Brick @unplugged
|
||||
|
||||
Power on your EV3 Brick by pressing the Center Button.
|
||||
|
||||
![Hand pressing power button](/static/getting-started/02_PowerOn.png)
|
||||
|
||||
## Connect Your EV3 Brick to Your Device @unplugged
|
||||
|
||||
Use the USB cable to connect your EV3 Brick to your device.
|
||||
|
||||
![Computer and cable connected to EV3 Brick](/static/getting-started/03_insert-usb-02.png)
|
||||
|
||||
## Handle a button press @fullscreen
|
||||
|
||||
Drag out a ``||brick:on button||`` block from Buttons section in the ``||brick:Brick||`` Toolbox drawer.
|
||||
|
||||
```blocks
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Pressed, function () {
|
||||
})
|
||||
```
|
||||
|
||||
## Change of mood @fullscreen
|
||||
|
||||
Drag a Brick Screen ``||brick:show mood||`` block inside the ``||brick:on button||`` block.
|
||||
Change mood to ``neutral``.
|
||||
|
||||
```blocks
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Pressed, function () {
|
||||
brick.showMood(moods.neutral)
|
||||
})
|
||||
```
|
||||
|
||||
## Simulate @fullscreen
|
||||
|
||||
**Try out your code in the simulator!**
|
||||
|
||||
Click the center button on the EV3 Brick in the web page. It should display the mood you selected on the screen. Don't hesitate to use the simulator to try out your code during this tutorial!
|
||||
|
||||
![EV3 Brick simulator](/static/getting-started/simulate.png)
|
||||
|
||||
## Play some tunes @fullscreen
|
||||
|
||||
Drag a Music ``||music:play sound effect||`` block below the ``||brick:show mood||`` block.
|
||||
Change sound effect to ``communication hello``.
|
||||
|
||||
```blocks
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Pressed, function () {
|
||||
brick.showMood(moods.neutral)
|
||||
music.playSoundEffect(sounds.communicationHello)
|
||||
})
|
||||
```
|
||||
|
||||
## Download to your brick @unplugged
|
||||
|
||||
**Download:** 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.
|
||||
|
||||
### Did It Work?
|
||||
|
||||
Verify that the program you just created shows eyes on the Brick Display, and that the EV3 Brick played the sound “Hello!”
|
||||
|
||||
![EV3 Brick with eyes on the display](/static/getting-started/05_EyesOn.png)
|
||||
|
||||
|
||||
**Well done!**
|
||||
|
||||
## Run it Again
|
||||
|
||||
![EV3 Brick with Try in BrkProg_Save Folder in File Manager](/static/getting-started/try-in-file-manager.png)
|
||||
|
||||
Use the Brick Buttons and navigate to the File Manager tab. Open the **BrkProg_SAVE** folder, select **Try** and click the center button to run it again.
|
||||
|
||||
## Connect a Large Motor @unplugged
|
||||
|
||||
Now you will learn to control the Large Motor.
|
||||
|
||||
![EV3 Brick with hands connecting Large Motor to Port D](/static/getting-started/06_PlugInLargeMotor.png)
|
||||
|
||||
Connect a Large Motor to **Port D** of your EV3 Brick using any of the connector cables.
|
||||
|
||||
## Run a motor @fullscreen
|
||||
|
||||
Drag a ``||motors:run large A motor||`` block inside the ``||brick:on button||`` block.
|
||||
|
||||
```blocks
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Pressed, function () {
|
||||
motors.largeA.run(50)
|
||||
})
|
||||
```
|
||||
|
||||
## Tune your motor @fullscreen
|
||||
|
||||
Change ``large motor A`` to ``large motor D``.
|
||||
Click on the **(+)** sign and change to ``1`` rotation.
|
||||
|
||||
```blocks
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Pressed, function () {
|
||||
motors.largeD.run(50, 1, MoveUnit.Rotations)
|
||||
})
|
||||
```
|
||||
|
||||
## Download @unplugged
|
||||
|
||||
**Download:** 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.
|
||||
|
||||
### Did It Rotate?
|
||||
|
||||
Confirm that your motor has turned one rotation at power level 50 before stopping.
|
||||
|
||||
Download and run the program as many times as you want in order to verify this, or tinker with different power levels and different rotations.
|
||||
|
||||
![Large Motor D w/Rotating “WHRRR,” Hand, EV3 Brick](/static/getting-started/08_WorkingLargeMotor.png)
|
||||
|
||||
## Connect a Touch Sensor @unplugged
|
||||
|
||||
We will now control the Large Motor using a Touch Sensor.
|
||||
|
||||
Keeping the Large Motor connected to **Port D**, connect a Touch Sensor to **Port 1** of your EV3 Brick.
|
||||
|
||||
![Hands connecting Touch Sensor to Port 1 on EV3 Brick](/static/getting-started/09_Connect_Touch.png)
|
||||
|
||||
## Modify Your Program @fullscreen
|
||||
|
||||
* Add a ``||sensors:pause until touch 1 pressed||`` Sensor block on top of the ``||motors:run large motor D||`` block.
|
||||
|
||||
```blocks
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Pressed, function () {
|
||||
sensors.touch1.pauseUntil(ButtonEvent.Pressed)
|
||||
motors.largeD.run(50, 1, MoveUnit.Rotations)
|
||||
})
|
||||
```
|
||||
|
||||
## Download @unplugged
|
||||
|
||||
**Download:** 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.
|
||||
|
||||
### Press the Touch Sensor
|
||||
|
||||
Confirm that the Large Motor has turned one rotation AFTER you press the Touch Sensor.
|
||||
|
||||
Download and run the program as many times as you want in order to verify this, or tinker with different Touch Sensor and Large Motor values.
|
||||
|
||||
![Hand Touch Sensor Pressed & EV3 Brick & Large Motor](/static/getting-started/11_TouchMotorWorking.png)
|
||||
|
||||
## Connect a Color Sensor @unplugged
|
||||
|
||||
Now we will try to control the Large Motor using another sensor.
|
||||
|
||||
![Hand connecting Color Sensor to Port 4, Large Motor D, EV3 Brick](/static/getting-started/12_ConnectColor.png)
|
||||
|
||||
Keeping the Large Motor connected to **Port D**, connect the Color Sensor to **Port 4**.
|
||||
|
||||
## Update your code @fullscreen
|
||||
|
||||
Using the same program, replace the ``||sensors:pause until touch 1||`` block with a ``||sensors:pause color sensor 3||`` for color block.
|
||||
|
||||
```blocks
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Pressed, function () {
|
||||
sensors.color3.pauseUntilColorDetected(ColorSensorColor.Green)
|
||||
motors.largeD.run(50, 1, MoveUnit.Rotations)
|
||||
})
|
||||
```
|
||||
|
||||
Don't forget to select the color you want to detect (e.g., green)!
|
||||
|
||||
## Download @unplugged
|
||||
|
||||
**Download:** 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.
|
||||
|
||||
### Place a Colored Brick in Front of the Color Sensor
|
||||
|
||||
Confirm that the Large Motor has turned one rotation AFTER the Color Sensor has detected the colored brick.
|
||||
|
||||
Download and run the program as many times as you want in order to verify this, or tinker with different Color Sensor and Large Motor values.
|
||||
|
||||
![IMG: Colored bricks in front of Color Sensor, hands, EV3 Brick](/static/getting-started/14_ColorSensorWorking.png)
|
||||
|
||||
## JavaScript @fullscreen
|
||||
|
||||
Click on the **JavaScript** tab and change the color the Color Sensor detects to Black, Blue, Green, Yellow, Red, White, or Brown. Use Title Case for the color names.
|
||||
|
||||
```typescript
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Pressed, function () {
|
||||
sensors.color3.pauseUntilColorDetected(ColorSensorColor.Blue)
|
||||
motors.largeD.run(50, 1, MoveUnit.Rotations)
|
||||
})
|
||||
```
|
||||
|
||||
## Well Done! @unplugged
|
||||
|
||||
You have now learned how to control some of the inputs and outputs of the EV3.
|
@ -1,171 +0,0 @@
|
||||
# Try
|
||||
|
||||
Get a quick introduction to programming with EV3.
|
||||
|
||||
![Display on EV3 Brick with Music Notes](/static/getting-started/01_EyesOn_Intro.png)
|
||||
|
||||
We are excited to help you get started with @boardname@. In this project we will guide you through connecting your EV3 Brick, creating your first program, controlling a Large Motor, a Touch Sensor and a Color Sensor. These steps can take up to 45 minutes.
|
||||
|
||||
## Turn on your EV3 Brick
|
||||
|
||||
Power on your EV3 Brick by pressing the Center Button.
|
||||
|
||||
![Hand pressing power button](/static/getting-started/02_PowerOn.png)
|
||||
|
||||
## Connect Your EV3 Brick to Your Device
|
||||
|
||||
Use the USB cable to connect your EV3 Brick to your device.
|
||||
|
||||
![Computer and cable connected to EV3 Brick](/static/getting-started/03_insert-usb-02.png)
|
||||
|
||||
## Create and Run your First Program
|
||||
|
||||
**Code it:** Create the program shown here.
|
||||
|
||||
```blocks
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Pressed, function () {
|
||||
brick.showMood(moods.neutral)
|
||||
music.playSoundEffect(sounds.communicationHello)
|
||||
})
|
||||
```
|
||||
|
||||
* Drag out a ``||brick:on button||`` block from Buttons section in the ``||brick:Brick||`` Toolbox drawer.
|
||||
* Drag a Brick Screen ``||brick:show mood||`` block inside the ``||brick:on button||`` block.
|
||||
* Change mood to ``neutral``.
|
||||
|
||||
```block
|
||||
brick.showMood(moods.neutral)
|
||||
```
|
||||
|
||||
* Drag a Music ``||music:play sound effect||`` block below the ``||brick:show mood||`` block.
|
||||
* Change sound effect to ``communication hello``.
|
||||
|
||||
```block
|
||||
music.playSoundEffect(sounds.communicationHello)
|
||||
```
|
||||
|
||||
**Download:** 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.
|
||||
|
||||
## Did It Work?
|
||||
|
||||
![EV3 Brick with eyes on the display](/static/getting-started/05_EyesOn.png)
|
||||
|
||||
Verify that the program you just created shows eyes on the Brick Display, and that the EV3 Brick played the sound “Hello!”
|
||||
|
||||
**Well done!**
|
||||
|
||||
## Run it Again
|
||||
|
||||
![EV3 Brick with Try in BrkProg_Save Folder in File Manager](/static/getting-started/try-in-file-manager.png)
|
||||
|
||||
Use the Brick Buttons and navigate to the File Manager tab. Open the **BrkProg_SAVE** folder, select **Try** and click the center button to run it again.
|
||||
|
||||
## Connect a Large Motor
|
||||
|
||||
Now you will learn to control the Large Motor.
|
||||
|
||||
![EV3 Brick with hands connecting Large Motor to Port D](/static/getting-started/06_PlugInLargeMotor.png)
|
||||
|
||||
Connect a Large Motor to **Port D** of your EV3 Brick using any of the connector cables.
|
||||
|
||||
## Create and Run This Program
|
||||
|
||||
**Code it:** Create the program shown here.
|
||||
|
||||
```blocks
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Pressed, function () {
|
||||
motors.largeD.run(50, 1, MoveUnit.Rotations)
|
||||
})
|
||||
```
|
||||
|
||||
* Start a new program.
|
||||
* Drag a ``||motors:run large A motor||`` block inside the ``||brick:on button||`` block.
|
||||
* Change ``large motor A`` to ``large motor D``.
|
||||
* Click on the **(+)** sign.
|
||||
* Change to ``1`` rotation.
|
||||
|
||||
**Download:** 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.
|
||||
|
||||
## Did It Rotate?
|
||||
|
||||
Confirm that your motor has turned one rotation at power level 50 before stopping.
|
||||
|
||||
![Large Motor D w/Rotating “WHRRR,” Hand, EV3 Brick](/static/getting-started/08_WorkingLargeMotor.png)
|
||||
|
||||
Download and run the program as many times as you want in order to verify this, or tinker with different power levels and different rotations.
|
||||
|
||||
## Connect a Touch Sensor
|
||||
|
||||
We will now control the Large Motor using a Touch Sensor.
|
||||
|
||||
![Hands connecting Touch Sensor to Port 1 on EV3 Brick](/static/getting-started/09_Connect_Touch.png)
|
||||
|
||||
Keeping the Large Motor connected to **Port D**, connect a Touch Sensor to **Port 1** of your EV3 Brick.
|
||||
|
||||
## Modify Your Program
|
||||
|
||||
**Code it:** Add code to the program for the Touch Sensor.
|
||||
|
||||
```blocks
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Pressed, function () {
|
||||
sensors.touch1.pauseUntil(ButtonEvent.Pressed)
|
||||
motors.largeD.run(50, 1, MoveUnit.Rotations)
|
||||
})
|
||||
```
|
||||
|
||||
* Add a ``||sensors:pause until touch 1 pressed||`` Sensor block on top of the ``||motors:run large motor D||`` block.
|
||||
|
||||
```block
|
||||
sensors.touch1.pauseUntil(ButtonEvent.Pressed)
|
||||
```
|
||||
|
||||
**Download:** 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.
|
||||
|
||||
## Press the Touch Sensor
|
||||
|
||||
Confirm that the Large Motor has turned one rotation AFTER you press the Touch Sensor.
|
||||
|
||||
![Hand Touch Sensor Pressed & EV3 Brick & Large Motor](/static/getting-started/11_TouchMotorWorking.png)
|
||||
|
||||
Download and run the program as many times as you want in order to verify this, or tinker with different Touch Sensor and Large Motor values.
|
||||
|
||||
## Connect a Color Sensor
|
||||
|
||||
Now we will try to control the Large Motor using another sensor.
|
||||
|
||||
![Hand connecting Color Sensor to Port 4, Large Motor D, EV3 Brick](/static/getting-started/12_ConnectColor.png)
|
||||
|
||||
Keeping the Large Motor connected to **Port D**, connect the Color Sensor to **Port 4**.
|
||||
|
||||
**Code it:** Modify Your Program to use the Color Sensor.
|
||||
|
||||
```blocks
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Pressed, function () {
|
||||
sensors.color4.pauseUntilColorDetected(ColorSensorColor.Green)
|
||||
motors.largeD.run(50, 1, MoveUnit.Rotations)
|
||||
})
|
||||
```
|
||||
|
||||
* Using the same program, replace the ``||sensors:pause until touch 1||`` block with a ``||sensors:pause color sensor 4||`` for color block.
|
||||
|
||||
```block
|
||||
sensors.color4.pauseUntilColorDetected(ColorSensorColor.Green)
|
||||
```
|
||||
|
||||
* Select the color you want to detect (e.g., green).
|
||||
|
||||
**Download:** 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.
|
||||
|
||||
## Place a Colored Brick in Front of the Color Sensor
|
||||
|
||||
![IMG: Colored bricks in front of Color Sensor, hands, EV3 Brick](/static/getting-started/14_ColorSensorWorking.png)
|
||||
|
||||
Confirm that the Large Motor has turned one rotation AFTER the Color Sensor has detected the colored brick.
|
||||
|
||||
Download and run the program as many times as you want in order to verify this, or tinker with different Color Sensor and Large Motor values.
|
||||
|
||||
Click on the **JavaScript** tab and change the color the Color Sensor detects to Black, Blue, Green, Yellow, Red, White, or Brown. Use Title Case for the color names.
|
||||
|
||||
## Well Done!
|
||||
|
||||
You have now learned how to control some of the inputs and outputs of the EV3.
|
@ -1,121 +0,0 @@
|
||||
# Use
|
||||
|
||||
Build a robot and drive into the world of robotics!
|
||||
|
||||
![EV3 Driving Base full w/cuboid](/static/getting-started/EV3_GettingStarted_13.jpg)
|
||||
|
||||
In this project we will guide you through building a Driving Base Robot and programming it to move straight and turn. You will also build and Object Detector Module, and program it to detect an object. It’s a good idea to have done the [Try](/getting-started/try) sequence first.
|
||||
|
||||
## Connect
|
||||
|
||||
What if your school had a multipurpose robot? How would you use it?
|
||||
|
||||
![Apple Picker Robot](/static/getting-started/02_ApplePickerRobot.jpg)
|
||||
|
||||
Would you use it to clean the school or plant trees?
|
||||
|
||||
## Build Your Driving Base Robot
|
||||
|
||||
Build the robot driving base:
|
||||
|
||||
[![EV3 Driving Base](/static/lessons/common/ev3-driving-base.jpg)](https://le-www-live-s.legocdn.com/sc/media/lessons/mindstorms-ev3/building-instructions/ev3-rem-driving-base-79bebfc16bd491186ea9c9069842155e.pdf)
|
||||
|
||||
### ~hint
|
||||
|
||||
If clicking the above image doesn't open the instructions, right-click on the image and choose "Save link as..." to download the PDF.
|
||||
|
||||
### ~
|
||||
|
||||
## Make It Move
|
||||
|
||||
**Code it:** Create a program that makes the Driving Base move forward and stop at the finish line, which is ``1`` meter away.
|
||||
|
||||
Start by building this program:
|
||||
|
||||
```blocks
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Pressed, function () {
|
||||
motors.largeBC.steer(0, 50, 1, MoveUnit.Rotations)
|
||||
})
|
||||
```
|
||||
|
||||
* Drag a ``||motors:steer large motors B+C||`` block inside an ``||brick:on button||`` block.
|
||||
* Click on the **(+)** sign.
|
||||
* Change to ``1`` rotation.
|
||||
|
||||
### ~hint
|
||||
|
||||
**Hint:** You will have to modify the number of rotations until you find the number that matches the robot moving forward 1 meter and stopping.
|
||||
|
||||
### ~
|
||||
|
||||
**Download:** 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.
|
||||
|
||||
## Make It Turn
|
||||
|
||||
**Code it:** Create a new program that turns the Driving Base 180 degrees.
|
||||
|
||||
```blocks
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Pressed, function () {
|
||||
motors.largeBC.steer(-50, 50, 1, MoveUnit.Rotations)
|
||||
})
|
||||
```
|
||||
|
||||
### ~hint
|
||||
|
||||
**Hint:** You will have to modify the turn ratio and the number of rotations until the robot reaches 180 degrees.
|
||||
|
||||
### ~
|
||||
|
||||
**Download:** 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.
|
||||
|
||||
## Add an Ultrasonic Sensor to Your Driving Base
|
||||
|
||||
Build and attach an Ultrasonic Sensor to your driving base:
|
||||
|
||||
[![EV3 Ultrasonic Sensor Driving Base Building Instructions Main Image](/static/lessons/common/ev3-ultrasonic-sensor-driving-base.jpg)](https://le-www-live-s.legocdn.com/sc/media/lessons/mindstorms-ev3/building-instructions/ev3-ultrasonic-sensor-driving-base-61ffdfa461aee2470b8ddbeab16e2070.pdf)
|
||||
|
||||
### ~hint
|
||||
|
||||
If clicking the above image doesn't open the instructions, right-click on the image and choose "Save link as..." to download the PDF.
|
||||
|
||||
### ~
|
||||
|
||||
## Detect an Object
|
||||
|
||||
**Code it:** Create a program that moves the Driving Base and makes it stop ``6`` cm from the Cuboid.
|
||||
|
||||
Create a new program:
|
||||
|
||||
```blocks
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Pressed, function () {
|
||||
motors.largeBC.tank(50, 50)
|
||||
sensors.ultrasonic4.setThreshold(UltrasonicSensorEvent.ObjectDetected, 6)
|
||||
sensors.ultrasonic4.pauseUntil(UltrasonicSensorEvent.ObjectDetected);
|
||||
motors.stopAll()
|
||||
})
|
||||
```
|
||||
|
||||
* Drag a ``||motors:tank large motors B+C||`` motor block inside the ``||brick:on button||`` block.
|
||||
* Drag the Ultrasonic Sensor threshold ``||sensors:set ultrasonic 4||`` block and place it below the motor block.
|
||||
* Drag a ``|sensors:pause until ultrasonic 4||`` block and place it under the threshold block.
|
||||
* Drag a ``||motors:stop all motors||`` block and place it below the sensor block.
|
||||
|
||||
### ~hint
|
||||
|
||||
**Hint:** You will have to modify the values of the Ultrasonic Sensor block until the robot reaches the desired position.
|
||||
|
||||
### ~
|
||||
|
||||
**Download:** 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.
|
||||
|
||||
Click on the **JavaScript** tab. Change and test the number value of the Ultrasonic
|
||||
Sensor.
|
||||
|
||||
```typescript
|
||||
sensors.ultrasonic4.setThreshold(UltrasonicSensorEvent.ObjectDetected, 10)
|
||||
```
|
||||
|
||||
**Congratulations!**
|
||||
|
||||
You are ready to move on to the next steps.
|
||||
Try a [Design Engineering](/design-engineering), [Coding](/coding), or [Maker](/maker) activity.
|
@ -1,3 +1,3 @@
|
||||
{
|
||||
"appref": "v1.2.31"
|
||||
"appref": "v"
|
||||
}
|
||||
|
254
docs/labview.md
254
docs/labview.md
@ -1,254 +0,0 @@
|
||||
# Coding in MakeCode
|
||||
|
||||
This guide helps users who are used to working with @boardname@ become familiar with using blocks in MakeCode.
|
||||
|
||||
## Snap together the blocks
|
||||
|
||||
Just like in LabView, blocks in the MakeCode editor can be dragged from the cabinet and snapped together
|
||||
to create a sequence of program instructions.
|
||||
|
||||
Take a look a the LabView program below: it **starts**, turns on motor A, waits a second, and finally stops motor A.
|
||||
|
||||
![sequence of block](/static/labview/sequencing.png)
|
||||
|
||||
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.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.run(50)
|
||||
pause(1000)
|
||||
motors.largeA.stop()
|
||||
```
|
||||
|
||||
## Download to the EV3
|
||||
|
||||
Before you actually run your program on the EV3 Brick, you can first try it in the simulator. The MakeCode editor includes a simulator in the browser for you to test your code. You can make changes to your program and check them out it the simulator to make sure your code works the way want. The similator knows when you modify your code and it restarts automatically to run the new code.
|
||||
|
||||
Once you're ready to transfer your program to the EV3 Brick, click the ``|Download|`` button and follow the instructions.
|
||||
|
||||
## Single motors
|
||||
|
||||
This program controls a large motor on port A in several different ways. It sets just the speed and then sets speed for: an amount of time, angle of movement, and a number of rotations.
|
||||
|
||||
![Single motor blocks](/static/labview/motors.png)
|
||||
|
||||
```blocks
|
||||
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();
|
||||
```
|
||||
|
||||
## Steering
|
||||
|
||||
The **steering** blocks let you to synchronize two motors at a precise rate. They can also specify the duration, angle, or number of rotations for the motors to turn.
|
||||
|
||||
![Steering blocks](/static/labview/steer.png)
|
||||
|
||||
```blocks
|
||||
motors.largeBC.steer(0, 50);
|
||||
motors.largeBC.steer(0, 50, 1000, MoveUnit.MilliSeconds);
|
||||
motors.largeBC.steer(0, 50, 360, MoveUnit.Degrees);
|
||||
motors.largeBC.steer(0, 50, 1, MoveUnit.Rotations);
|
||||
motors.largeBC.stop();
|
||||
```
|
||||
|
||||
### ~ hint
|
||||
|
||||
The **turn ratio range is -200, 200** unlike LabView who used -100,100.
|
||||
|
||||
### ~
|
||||
|
||||
## Tank
|
||||
|
||||
The **tank** blocks control the speed of two motors. These are commonly used for a differential drive robot. The blocks can also specify the duration, angle, or number of rotations.
|
||||
|
||||
![Tank block](/static/labview/tank.png)
|
||||
|
||||
```blocks
|
||||
motors.largeBC.tank(50, 50);
|
||||
motors.largeBC.tank(50, 50, 1000, MoveUnit.MilliSeconds);
|
||||
motors.largeBC.tank(50, 50, 360, MoveUnit.Degrees);
|
||||
motors.largeBC.tank(50, 50, 1, MoveUnit.Rotations);
|
||||
motors.largeBC.stop();
|
||||
```
|
||||
|
||||
## Coasting and braking
|
||||
|
||||
By default, all motors coast when any command used to move finishes. You can keep them from coasting with the ``||motors:set brake||`` block.
|
||||
|
||||
![Brake block](/static/labview/brake.png)
|
||||
|
||||
```blocks
|
||||
motors.largeD.setBrake(true);
|
||||
motors.largeD.run(50, 1, MoveUnit.Rotations)
|
||||
```
|
||||
|
||||
## Inverting and regulating motors
|
||||
|
||||
If you wan to change the direction that a motor turns, use the ``||motors:set inverted||`` block.
|
||||
|
||||
![Brake block](/static/labview/invertmotor.png)
|
||||
|
||||
```blocks
|
||||
motors.largeA.setInverted(true);
|
||||
```
|
||||
|
||||
By default, the speed of motors is regulated. This means that if your robot goes up a hill,
|
||||
the regulator will adjust the power to match the desired speed. You can disable this feature
|
||||
using ``||motors:set regulated||``.
|
||||
|
||||
![Brake block](/static/labview/unregulatedmotor.png)
|
||||
|
||||
```blocks
|
||||
motors.largeA.setRegulated(false);
|
||||
```
|
||||
|
||||
## Brick
|
||||
|
||||
The **Brick** category has a number of blocks to display graphics on the brick screen.
|
||||
|
||||
![brick image](/static/labview/brickimage.png)
|
||||
|
||||
```blocks
|
||||
brick.clearScreen()
|
||||
brick.showImage(images.expressionsWink)
|
||||
```
|
||||
|
||||
![brick status light](/static/labview/brickstatuslight.png)
|
||||
|
||||
```blocks
|
||||
brick.setStatusLight(StatusLight.Off);
|
||||
brick.setStatusLight(StatusLight.Red);
|
||||
brick.setStatusLight(StatusLight.OrangePulse);
|
||||
```
|
||||
|
||||
## Waiting (pausing)
|
||||
|
||||
It is quite common to have to wait for a task to finish or for a sensor state to change, such as when a touch button pressed. The ``||loops:pause||`` and ``||sensors:pause until||`` blocks provide a way for your program to wait for a period of time.
|
||||
|
||||
![pause for time](/static/labview/pausefortime.png)
|
||||
|
||||
```blocks
|
||||
motors.largeD.run(50)
|
||||
pause(1000)
|
||||
motors.largeD.stop();
|
||||
```
|
||||
|
||||
![pause for touch](/static/labview/pausefortouch.png)
|
||||
|
||||
```blocks
|
||||
motors.largeD.run(50)
|
||||
sensors.touch1.pauseUntil(ButtonEvent.Pressed)
|
||||
motors.largeD.stop();
|
||||
```
|
||||
|
||||
![pause for distance](/static/labview/pausefordistance.png)
|
||||
|
||||
```blocks
|
||||
motors.largeD.run(50)
|
||||
sensors.ultrasonic4.pauseUntil(UltrasonicSensorEvent.ObjectNear)
|
||||
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.run(50)
|
||||
pauseUntil(() => sensors.touch1.isPressed())
|
||||
motors.largeD.stop()
|
||||
```
|
||||
|
||||
## Loops
|
||||
|
||||
![Single loop](/static/labview/loopinfinite.png)
|
||||
|
||||
```blocks
|
||||
forever(() => {
|
||||
motors.largeD.run(50, 1, MoveUnit.Rotations);
|
||||
motors.largeD.run(-50, 1, MoveUnit.Rotations);
|
||||
})
|
||||
```
|
||||
|
||||
![While loop](/static/labview/while.png)
|
||||
|
||||
```blocks
|
||||
for(let i = 0; i < 10; i++) {
|
||||
motors.largeD.run(50, 1, MoveUnit.Rotations);
|
||||
motors.largeD.run(-50, 1, MoveUnit.Rotations);
|
||||
}
|
||||
let k = 0;
|
||||
while(k < 10) {
|
||||
motors.largeD.run(50, 1, MoveUnit.Rotations);
|
||||
motors.largeD.run(-50, 1, MoveUnit.Rotations);
|
||||
k++;
|
||||
}
|
||||
```
|
||||
|
||||
## Variables
|
||||
|
||||
![Variable block](/static/labview/speedoflightvar.png)
|
||||
|
||||
```blocks
|
||||
let light = 0;
|
||||
forever(function () {
|
||||
light = sensors.color3.light(LightIntensityMode.Reflected);
|
||||
motors.largeD.run(light)
|
||||
})
|
||||
```
|
||||
|
||||
## Concurrent loops
|
||||
|
||||
You can start up multiple ``||loops:forever||`` loops that run at the same time. Actually, only the code in just one of the loops is really running at any exact moment in time. Each loop, though, gets a turn to run all of its code and this makes them run [_concurrently_](https://en.wikipedia.org/wiki/Concurrent_computing).
|
||||
|
||||
![Multiple loops running at the same time](/static/labview/multipleloops.png)
|
||||
|
||||
```blocks
|
||||
forever(() => {
|
||||
motors.largeD.run(50, 1, MoveUnit.Rotations);
|
||||
motors.largeD.run(-50, 1, MoveUnit.Rotations);
|
||||
})
|
||||
forever(() => {
|
||||
brick.showImage(images.eyesMiddleRight)
|
||||
pause(1000)
|
||||
brick.showImage(images.eyesMiddleLeft)
|
||||
pause(1000)
|
||||
})
|
||||
```
|
||||
|
||||
## Conditional
|
||||
|
||||
The ``||logic:if||`` block allows you to run different code depending on whether some condition ([boolean](/types/boolean) expression) is `true` or `false`. Also, this is similar to the ``||loops:switch||`` block.
|
||||
|
||||
![Brake block](/static/labview/ife.png)
|
||||
|
||||
```blocks
|
||||
forever(function() {
|
||||
if(sensors.touch1.isPressed()) {
|
||||
motors.largeD.run(50)
|
||||
} else {
|
||||
motors.largeD.stop()
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
## Random
|
||||
|
||||
The ``||math:pick random||`` block returns a random number selected from a range of numbers.
|
||||
|
||||
![Brake block](/static/labview/random.png)
|
||||
|
||||
```blocks
|
||||
forever(function () {
|
||||
motors.largeBC.steer(Math.randomRange(-5, 5), 50)
|
||||
pause(100)
|
||||
})
|
||||
```
|
@ -1,27 +0,0 @@
|
||||
# Lessons
|
||||
|
||||
Learning activities for @boardname@ with MakeCode.
|
||||
|
||||
## Motors and motion
|
||||
|
||||
```codecard
|
||||
[{
|
||||
"name": "Make it Move",
|
||||
"imageUrl":"/static/lessons/make-it-move.jpg",
|
||||
"url": "/lessons/make-it-move",
|
||||
"cardType": "project",
|
||||
"description": "Make a robot that moves itself without wheels."
|
||||
}, {
|
||||
"name": "Make it Move TUTORIAL",
|
||||
"imageUrl":"/static/lessons/make-it-move.jpg",
|
||||
"url": "/lessons/make-it-move-tutorial",
|
||||
"cardType": "tutorial",
|
||||
"description": "Make a robot that moves itself without wheels."
|
||||
}, {
|
||||
"name": "Line Detection",
|
||||
"imageUrl":"/static/lessons/line-detection.jpg",
|
||||
"url": "/lessons/line-detection",
|
||||
"cardType": "project",
|
||||
"description": "Make your robot drive itself by following lines."
|
||||
}]
|
||||
```
|
@ -1,274 +0,0 @@
|
||||
# Line Detection
|
||||
|
||||
## Objective
|
||||
|
||||
Design ways to improve driving safety by helping to prevent drivers from falling asleep and causing an accident.
|
||||
|
||||
![Car driving on highway](/static/lessons/line-detection/car-driving.jpg)
|
||||
|
||||
## Connect
|
||||
|
||||
Make sure that you can answer the following questions:
|
||||
|
||||
* Can autonomous cars react to different traffic light signals?
|
||||
* What can happen if a driver falls asleep while driving?
|
||||
* How can we detect when a driver is falling asleep?
|
||||
|
||||
Think about what you have learned, then document it. Describe the problem in your own words. Creatively record your ideas and findings.
|
||||
|
||||
## Construct
|
||||
|
||||
Start by constructing this model. Read the building instructions [here](https://le-www-live-s.legocdn.com/sc/media/lessons/mindstorms-ev3/building-instructions/ev3-rem-color-sensor-down-driving-base-d30ed30610c3d6647d56e17bc64cf6e2.pdf) first.
|
||||
|
||||
### ~hint
|
||||
|
||||
If clicking the above image doesn't open the instructions, right-click on the image and choose "Save link as..." to download the PDF.
|
||||
|
||||
### ~
|
||||
|
||||
![Color sensor on the driving base](/static/lessons/line-detection/color-sensor-driving.jpg)
|
||||
|
||||
## Program
|
||||
|
||||
Autonomous cars need to recognize and respond to traffic lights automatically.
|
||||
First, create a program that will make your robot stop at red lights.
|
||||
Make sure your robot is only responding to the color red.
|
||||
Once you have succeeded, program your robot to drive forward again when the light changes from red to green.
|
||||
|
||||
There are two coding tasks for this lesson:
|
||||
|
||||
1. Create a program that will make your robot stop at red lights.
|
||||
2. Create a program that drives the robot forward until the Color Sensor sees red. The robot then stops.
|
||||
|
||||
## Coding task 1 - Stop at red lights
|
||||
|
||||
**Goal:** Create a program that will make your robot stop at red lights.
|
||||
|
||||
### Step 1
|
||||
|
||||
Create a program that drives the robot forward until the Color Sensor sees red. The robot then stops.
|
||||
|
||||
Place a ``||motors:steer large B+C||`` block from ``||motors:Motors||`` under ``||loops:on start||``. Change the speed to 20%.
|
||||
|
||||
```blocks
|
||||
motors.largeBC.steer(0, 20)
|
||||
```
|
||||
|
||||
### Step 2
|
||||
|
||||
Place a ``||loops:while||`` loop block under ``||motors:steer large B+C||``.
|
||||
|
||||
```blocks
|
||||
motors.largeBC.steer(0, 20)
|
||||
while (true) {
|
||||
}
|
||||
```
|
||||
|
||||
### Step 3
|
||||
|
||||
Place a ``||sensors:pause until color detected||`` from ``||sensors:Sensors||`` inside the ``||loops:while||`` loop block. Change the color to red.
|
||||
|
||||
```blocks
|
||||
motors.largeBC.steer(0, 20)
|
||||
while (true) {
|
||||
sensors.color3.pauseUntilColorDetected(ColorSensorColor.Red)
|
||||
}
|
||||
```
|
||||
|
||||
### Step 4
|
||||
|
||||
Place a ``||motors:stop all motors||`` block under the ``||sensors:pause until color detected||`` block.
|
||||
|
||||
Study the program...what do you think the program will do?
|
||||
|
||||
**Hint:** The motors will run until the Color Sensor senses the color red, then all motors will stop. The motors will run until the sensor reading in the while block is true.
|
||||
|
||||
```blocks
|
||||
motors.largeBC.steer(0, 20)
|
||||
while (true) {
|
||||
sensors.color3.pauseUntilColorDetected(ColorSensorColor.Red)
|
||||
motors.stopAll()
|
||||
}
|
||||
```
|
||||
|
||||
### Step 5
|
||||
|
||||
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.
|
||||
|
||||
## Coding task 2 - Detect light changes
|
||||
|
||||
**Goal:** Program your robot to drive forward again when the light changes from red to green.
|
||||
|
||||
### Step 1
|
||||
|
||||
Place a ``||loops:while||`` loop block under ``||loops:on start||``.
|
||||
|
||||
```blocks
|
||||
while (true) {
|
||||
|
||||
}
|
||||
```
|
||||
|
||||
### Step 2
|
||||
|
||||
Place a ``||motors:steer large B+C||`` block from ``||motors:Motors||`` inside the ``||loops:while||`` loop block. Change the speed to 20%.
|
||||
|
||||
```blocks
|
||||
while (true) {
|
||||
motors.largeBC.steer(0, 20)
|
||||
}
|
||||
```
|
||||
|
||||
### Step 4
|
||||
|
||||
Place a ``||loops:while||`` loop block under the ``||motors:steer large B+C||`` block.
|
||||
|
||||
```blocks
|
||||
while (true) {
|
||||
motors.largeBC.steer(0, 20)
|
||||
while (true) {
|
||||
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Step 5
|
||||
|
||||
Place a ``||sensors:pause until color detected||`` block from ``||sensors:Sensors||`` inside the ``||loops:while||`` loop block. Change the color to red.
|
||||
|
||||
```blocks
|
||||
while (true) {
|
||||
motors.largeBC.steer(0, 20)
|
||||
while (true) {
|
||||
sensors.color3.pauseUntilColorDetected(ColorSensorColor.Red)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Step 6
|
||||
|
||||
Place a ``||motors:stop all motors||`` block under the ``||sensors:pause until color detected||`` block.
|
||||
|
||||
```blocks
|
||||
while (true) {
|
||||
motors.largeBC.steer(0, 20)
|
||||
while (true) {
|
||||
sensors.color3.pauseUntilColorDetected(ColorSensorColor.Red)
|
||||
motors.stopAll()
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Step 7
|
||||
|
||||
Place a ``||loops:while||`` loop block under the second ``||loops:while||`` loop block.
|
||||
|
||||
```blocks
|
||||
while (true) {
|
||||
motors.largeBC.steer(0, 20)
|
||||
while (true) {
|
||||
sensors.color3.pauseUntilColorDetected(ColorSensorColor.Red)
|
||||
motors.stopAll()
|
||||
}
|
||||
while (true) {
|
||||
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Step 8
|
||||
|
||||
Place a ``||sensors:pause unril color detected||`` block inside the new ``||loops:while||`` loop block. Change the color to red.
|
||||
|
||||
What do you think the program will do?
|
||||
|
||||
**Hint:** The motors will run until the Color Sensor detects the color red, then it will stop all motors. The motors will also run and not stop when the color sensor detects the color green.
|
||||
|
||||
```blocks
|
||||
while (true) {
|
||||
motors.largeBC.steer(0, 20)
|
||||
while (true) {
|
||||
sensors.color3.pauseUntilColorDetected(ColorSensorColor.Red)
|
||||
motors.stopAll()
|
||||
}
|
||||
while (true) {
|
||||
sensors.color3.pauseUntilColorDetected(ColorSensorColor.Red)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Step 9
|
||||
|
||||
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
|
||||
|
||||
To simulate what could happen if a driver falls asleep while driving, your robot could sound an alarm signal when it crosses the line. This feature is often available in new cars.
|
||||
|
||||
Program your robot to perform this function.
|
||||
|
||||
Think about what you have learned, then document it. Describe your pseudocode for this task. Creatively record your ideas, and findings.
|
||||
|
||||
### Programming hint
|
||||
|
||||
```blocks
|
||||
motors.largeBC.steer(0, 20)
|
||||
while (true) {
|
||||
sensors.color3.pauseUntilColorDetected(ColorSensorColor.Yellow)
|
||||
music.playSoundEffect(sounds.systemGeneralAlert)
|
||||
}
|
||||
while (true) {
|
||||
while (true) {
|
||||
sensors.color3.pauseUntilLightDetected(LightIntensityMode.Reflected, Light.Bright)
|
||||
motors.largeB.run(10)
|
||||
motors.largeC.run(-10)
|
||||
}
|
||||
while (true) {
|
||||
sensors.color3.pauseUntilLightDetected(LightIntensityMode.Reflected, Light.Bright)
|
||||
motors.largeA.run(-10)
|
||||
motors.largeA.run(10)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Continue
|
||||
|
||||
Program your robot to drive on “autopilot” along a given route. You will need to create a program that recognizes and responds to a dark line (or white line). You will create a line-following program and your robot will need to travel along the line without losing contact with it.
|
||||
|
||||
You will need to constantly debug your program in order to make your robot travel as smoothly as possible along the line.
|
||||
|
||||
### Programming hint
|
||||
|
||||
```blocks
|
||||
while (true) {
|
||||
while (true) {
|
||||
sensors.color3.pauseUntilLightDetected(LightIntensityMode.Reflected, Light.Bright)
|
||||
motors.largeB.run(10)
|
||||
motors.largeC.run(-10)
|
||||
}
|
||||
while (true) {
|
||||
sensors.color3.pauseUntilLightDetected(LightIntensityMode.Reflected, Light.Bright)
|
||||
motors.largeB.run(-10)
|
||||
motors.largeC.run(10)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Share
|
||||
|
||||
Consider the following questions:
|
||||
|
||||
1. What challenged you?
|
||||
2. Where there any surprises?
|
||||
3. How could you improve your program?
|
||||
4. Could your program have been more streamlined?
|
||||
5. Have you used too many blocks?
|
||||
6. Is there a more efficient way of building your program?
|
||||
7. How could your program be used in real-world scenarios?
|
||||
|
||||
Think about what you have learned, then document it. Creatively record and present your ideas, creations, and findings.
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,78 +0,0 @@
|
||||
# Make It Move Without Wheels
|
||||
|
||||
## Objective @unplugged
|
||||
|
||||
Design, build and program a robot that can move itself:
|
||||
|
||||
Your robot will:
|
||||
|
||||
* Go a distance of at least 30cm
|
||||
* Use at least one motor
|
||||
* Use NO wheels for locomotion
|
||||
|
||||
![@boardname@ with parts](/static/lessons/make-it-move/locomotion-no-wheels.jpg)
|
||||
|
||||
|
||||
## Construct @unplugged
|
||||
|
||||
Build a Walker Bot!
|
||||
|
||||
The Walker Bot is one example of many possible solutions for making a robot move without wheels.
|
||||
|
||||
The Walker Bot combines an EV3 Frame and two legs that are mirror-images to create left and right legs.
|
||||
|
||||
The legs in the Walker Bot are designed to show how to change the rotary motion of a motor to reciprocating motion.
|
||||
|
||||
Start by reading [these](https://le-www-live-s.legocdn.com/sc/media/lessons/mindstorms-ev3/ev3-dep/building%20instructions/walker-bot-bi-180fc24f9298e1dd6201099627d43903.pdf) instructions first.
|
||||
|
||||
### ~hint
|
||||
|
||||
If clicking the above image doesn't open the instructions, right-click on the image and choose "Save link as..." to download the PDF.
|
||||
|
||||
### ~
|
||||
|
||||
![@boardname@ Walker Bot](/static/lessons/make-it-move/walker-bot.jpg)
|
||||
|
||||
|
||||
## Program 1 @fullscreen
|
||||
|
||||
In nature, creatures use many methods to get around. None of them, however, use wheels to move. Can we copy the method of animal locomotion with our robot? Using motors and legs, make the robot move without using any wheels.
|
||||
|
||||
Place a ``||motors:tank large B+C||`` block from ``||motors:Motors||`` under ``||loops:on start||``.
|
||||
|
||||
Change the speed to `-60%` (for motor B) and `+60%` (for motor C).
|
||||
Change the rotations to `9`.
|
||||
|
||||
The ``||motors:tank large B+C||`` block will run for `9` rotations when the **center** button is pressed on the EV3 Brick. The motors are set for the reverse direction because they are mounted upside down in this model.
|
||||
|
||||
```blocks
|
||||
motors.largeBC.tank(-60, 60, 9, MoveUnit.Rotations)
|
||||
```
|
||||
|
||||
## Program 2 @fullscreen
|
||||
|
||||
Place a ``||motors:stop all motors||`` block under ``||motors:tank large B+C||``.
|
||||
|
||||
The ``||motors:tank large B+C||`` block will run for `9` rotations when the **center** button is pressed on the EV3 Brick then stop.
|
||||
|
||||
```blocks
|
||||
motors.largeBC.tank(-60, 60, 9, MoveUnit.Rotations)
|
||||
motors.stopAll()
|
||||
```
|
||||
|
||||
## Program 3 @fullscreen
|
||||
|
||||
Place a ``||brick:show string||`` block under ``||motors:stop all motors||``.
|
||||
Change the `"Hello World"` text to `"30 cm"`.
|
||||
|
||||
The ``||motors:tank large B+C||`` will run for `9` rotations when the **center** button is pressed on the EV3 Brick then stop and display "30 cm" on the EV3 Brick’s screen.
|
||||
|
||||
```blocks
|
||||
motors.largeBC.tank(-60, 60, 9, MoveUnit.Rotations)
|
||||
motors.stopAll()
|
||||
brick.showString("30 cm", 1)
|
||||
```
|
||||
|
||||
## Download @fullscreen
|
||||
|
||||
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.
|
@ -1,79 +0,0 @@
|
||||
# Make It Move Without Wheels
|
||||
|
||||
## Objective
|
||||
|
||||
Design, build and program a robot that can move itself:
|
||||
|
||||
Your robot will:
|
||||
|
||||
* Go a distance of at least 30cm
|
||||
* Use at least one motor
|
||||
* Use NO wheels for locomotion
|
||||
|
||||
![@boardname@ with parts](/static/lessons/make-it-move/locomotion-no-wheels.jpg)
|
||||
|
||||
## Construct
|
||||
|
||||
Build a Walker Bot!
|
||||
|
||||
The Walker Bot is one example of many possible solutions for making a robot move without wheels.
|
||||
|
||||
The Walker Bot combines an EV3 Frame and two legs that are mirror-images to create left and right legs.
|
||||
|
||||
The legs in the Walker Bot are designed to show how to change the rotary motion of a motor to reciprocating motion.
|
||||
|
||||
Start by reading [these](https://le-www-live-s.legocdn.com/sc/media/lessons/mindstorms-ev3/ev3-dep/building%20instructions/walker-bot-bi-180fc24f9298e1dd6201099627d43903.pdf) instructions first.
|
||||
|
||||
### ~hint
|
||||
|
||||
If clicking the above image doesn't open the instructions, right-click on the image and choose "Save link as..." to download the PDF.
|
||||
|
||||
### ~
|
||||
|
||||
![@boardname@ Walker Bot](/static/lessons/make-it-move/walker-bot.jpg)
|
||||
|
||||
|
||||
## Program
|
||||
|
||||
In nature, creatures use many methods to get around. None of them, however, use wheels to move. Can we copy the method of animal locomotion with our robot? Using motors and legs, make the robot move without using any wheels.
|
||||
|
||||
### Step 1
|
||||
|
||||
Place a ``||motors:tank large B+C||`` block from ``||motors:Motors||`` under ``||loops:on start||``.
|
||||
|
||||
Change the speed to `-60%` (for motor B) and `+60%` (for motor C).
|
||||
Change the rotations to `9`.
|
||||
|
||||
The ``||motors:tank large B+C||`` block will run for `9` rotations when the **center** button is pressed on the EV3 Brick. The motors are set for the reverse direction because they are mounted upside down in this model.
|
||||
|
||||
```blocks
|
||||
motors.largeBC.tank(-60, 60, 9, MoveUnit.Rotations)
|
||||
```
|
||||
|
||||
### Step 2
|
||||
|
||||
Place a ``||motors:stop all motors||`` block under ``||motors:tank large B+C||``.
|
||||
|
||||
The ``||motors:tank large B+C||`` block will run for `9` rotations when the **center** button is pressed on the EV3 Brick then stop.
|
||||
|
||||
```blocks
|
||||
motors.largeBC.tank(-60, 60, 9, MoveUnit.Rotations)
|
||||
motors.largeBC.stop()
|
||||
```
|
||||
|
||||
### Step 3
|
||||
|
||||
Place a ``||brick:show string||`` block under ``||motors:stop all motors||``.
|
||||
Change the `"Hello World"` text to `"30 cm"`.
|
||||
|
||||
The ``||motors:tank large B+C||`` will run for `9` rotations when the **center** button is pressed on the EV3 Brick then stop and display "30 cm" on the EV3 Brick’s screen.
|
||||
|
||||
```blocks
|
||||
motors.largeBC.tank(-60, 60, 9, MoveUnit.Rotations)
|
||||
motors.largeBC.stop()
|
||||
brick.showString("30 cm", 1)
|
||||
```
|
||||
|
||||
### Step 4
|
||||
|
||||
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.
|
@ -1,24 +1,47 @@
|
||||
# Maker Activites
|
||||
|
||||
These six activities require the LEGO® MINDSTORMS® Education EV3 Core Set (45544). Supporting materials for teachers and middle school students are provided, offering everything teachers and students need to explore their inner makers as they follow the design process to solve open-ended, themed challenges...
|
||||
|
||||
* [Download Curriculum Materials](https://education.lego.com/en-us/downloads/mindstorms-ev3)
|
||||
|
||||
## Activites
|
||||
|
||||
```codecard
|
||||
[
|
||||
{
|
||||
"name": "Make A Sound Machine",
|
||||
"description": "Make a Sound Machine that can play a rhythm, music or just noise!",
|
||||
"name": "Sound Machine",
|
||||
"description": "Create instruments with your EV3 Brick!",
|
||||
"url":"/maker/sound-machine",
|
||||
"cardType": "example",
|
||||
"imageUrl": "/static/lessons/make-a-sound-machine.png",
|
||||
"cardType": "side"
|
||||
"imageUrl": "/static/maker/sound-machine.png"
|
||||
},
|
||||
{
|
||||
"name": "Make A Security Gadget",
|
||||
"description": "Invent a Security Gadget that will protect your belongings by warning you!",
|
||||
"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/lessons/make-a-security-device.png",
|
||||
"cardType": "side"
|
||||
"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"
|
||||
}
|
||||
]
|
||||
```
|
||||
|
11
docs/maker/intruder-detector.md
Normal file
11
docs/maker/intruder-detector.md
Normal file
@ -0,0 +1,11 @@
|
||||
# Intruder Detector
|
||||
|
||||
This program will activate an alarm when an object moves in front of the Ultrasonic Sensor.
|
||||
|
||||
TODO support for event when value changes
|
||||
|
||||
```blocks
|
||||
input.ultrasonic4.onObjectNear(function () {
|
||||
music.playSoundUntilDone(music.sounds(Sounds.PowerUp))
|
||||
})
|
||||
```
|
@ -1,9 +0,0 @@
|
||||
# Movement Detector
|
||||
|
||||
This program will activate an alarm when an object moves in front of the Ultrasonic Sensor.
|
||||
|
||||
```blocks
|
||||
sensors.ultrasonic4.onEvent(UltrasonicSensorEvent.ObjectNear, function () {
|
||||
music.playSoundEffectUntilDone(sounds.informationActivate)
|
||||
})
|
||||
```
|
@ -3,13 +3,15 @@
|
||||
Use this program with the Programmable Brick and Large Motor.
|
||||
|
||||
```blocks
|
||||
forever(function () {
|
||||
motors.largeA.run(30)
|
||||
pause(100)
|
||||
motors.largeA.stop()
|
||||
music.playSoundEffectUntilDone(sounds.animalsCatPurr)
|
||||
motors.largeA.run(-30)
|
||||
pause(100)
|
||||
motors.largeA.stop()
|
||||
loops.forever(function () {
|
||||
output.largeMotorA.setPower(30)
|
||||
output.largeMotorA.on(true)
|
||||
loops.pause(100)
|
||||
output.largeMotorA.on(false)
|
||||
music.playSoundUntilDone(music.sounds(Sounds.PowerUp))
|
||||
output.largeMotorA.setPower(-30)
|
||||
output.largeMotorA.on(true)
|
||||
loops.pause(100)
|
||||
output.largeMotorA.on(false)
|
||||
})
|
||||
```
|
||||
|
@ -1,139 +1,9 @@
|
||||
# Security Gadget
|
||||
|
||||
# Make a Security Gadget
|
||||
|
||||
Invent a Security Gadget that will protect your belongings by warning you!
|
||||
|
||||
![Maker – Make a Security Gadget Main Image](/static/lessons/make-a-security-gadget/lego-maker-security-detect.jpg)
|
||||
|
||||
## Connect
|
||||
|
||||
Over time, people have come up with many different ways to help protect their personal belongings from theft. These inventions include simple alarm systems and even traps!
|
||||
|
||||
![Make a Security Gadget 3 Stock Footage Images](/static/lessons/make-a-security-gadget/three-stock.jpg)
|
||||
|
||||
Look at the photos and think about:
|
||||
|
||||
* What do you see?
|
||||
* Can you see any new design opportunities?
|
||||
* What problems can you see?
|
||||
* How could you make use of the LEGO bricks, the EV3 Programmable Brick, motors, and sensors?
|
||||
|
||||
### Things You’ll Need
|
||||
|
||||
* [@boardname@ Core Set](https://education.lego.com/enus/products/legomindstormseducationev3coreset/5003400)
|
||||
|
||||
Additional materials to add to your Security Gadget:
|
||||
|
||||
* String
|
||||
* Arts and crafts materials such as:
|
||||
>* Cardboard
|
||||
>* Construction paper
|
||||
>* Pipe cleaners
|
||||
>* Plastic or paper cups
|
||||
>* Recycled materials
|
||||
>* Rubber bands
|
||||
>* Wire
|
||||
|
||||
### Prior Knowledge
|
||||
|
||||
This activity uses sensor inputs. You may want to try the [Use](/getting-started/use) or [Object Detection](/coding/object-detection) activity before this one. Or, you can start out with this activity and tinker with coding sensor inputs on your own.
|
||||
|
||||
## Contemplate
|
||||
|
||||
Follow the steps of the _Maker Design Process_ for this lesson:
|
||||
|
||||
* Define the Problem
|
||||
* Brainstorming
|
||||
* Define the Design Criteria
|
||||
* Go Make
|
||||
* Review and Revise Your Solution
|
||||
* Communicate Your Solution
|
||||
|
||||
### Defining the Problem
|
||||
|
||||
1. What problems did you imagine?
|
||||
2. Pick one problem and explain it to a partner.
|
||||
|
||||
### Brainstorm
|
||||
|
||||
Now that you have defined a problem, start to generate ideas for solving it.
|
||||
|
||||
### ~hint
|
||||
|
||||
Some things to do while brainstorming:
|
||||
|
||||
* Use the bricks from the LEGO set to help you brainstorm or sketch your ideas on paper.
|
||||
* The goal of brainstorming is to explore as many solutions as possible. You can use the tinkering examples in the Sample Solutions section below as inspiration for getting started.
|
||||
* Share your ideas and get some feedback. It may lead to more ideas!
|
||||
|
||||
### ~
|
||||
|
||||
### Define the Design Criteria
|
||||
|
||||
1. You should have generated a number of ideas. Now select the best one to make.
|
||||
2. Write out two or three specific design criteria your design must meet.
|
||||
|
||||
### Go Make
|
||||
|
||||
It is time to start making!
|
||||
|
||||
* Use the components from the @boardname@ Core Set and additional materials to make your chosen solution.
|
||||
* Test and analyze your design as you go and record any improvements that you make.
|
||||
|
||||
### Review and Revise Your Solution
|
||||
|
||||
* Have you managed to solve the problem that you defined?
|
||||
* Look back at your design criteria. How well does your solution work?
|
||||
* How can you improve your design?
|
||||
|
||||
### Communicate Your Solution
|
||||
|
||||
Now that you have finished you can:
|
||||
|
||||
* Make a sketch or take a photo or video of your model.
|
||||
* Label the three most important parts and explain how they work.
|
||||
* Share your work with others.
|
||||
|
||||
## Continue
|
||||
|
||||
### Phone Protector - Sample Solution
|
||||
|
||||
This example program combined with the small model will sound an alarm if someone picks it up. The program activates an alarm when an object is lifted from the Touch Sensor.
|
||||
|
||||
![Security Gadget Tinkering Example #1 – Phone Stand](/static/lessons/make-a-security-gadget/lego-maker-security-gadget.jpg)
|
||||
|
||||
#### Programming
|
||||
|
||||
1. Drag a ``||sensors:pause until touch||`` block and place it inside the ``||loops:forever||`` loop.
|
||||
2. Drag a ``||music:play sound effect||`` block and place it below the ``||sensors:pause until||`` block.
|
||||
3. Change the sound effect to ``mechanical horn1``.
|
||||
This program will activate an alarm when an object is lifted from the Touch Sensor.
|
||||
|
||||
```blocks
|
||||
forever(function () {
|
||||
sensors.touch1.pauseUntil(ButtonEvent.Pressed)
|
||||
music.playSoundEffect(sounds.mechanicalHorn1)
|
||||
input.touchSensor1.onEvent(TouchSensorEvent.Released, function () {
|
||||
music.playSoundUntilDone(music.sounds(Sounds.PowerUp))
|
||||
})
|
||||
```
|
||||
|
||||
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.
|
||||
|
||||
### Object Detection - Sample Solution
|
||||
|
||||
This example program combined with the small model will sound an alarm if someone (or something) crosses its path! The program activates an alarm when an object moves in front of the Ultrasonic Sensor.
|
||||
|
||||
![Security Gadget Tinkering Example #1 – Mouse detector](/static/lessons/make-a-security-gadget/lego-maker-security-detect.jpg)
|
||||
|
||||
#### Programming
|
||||
|
||||
1. Drag a ``||sensors:pause until ultrasonic||`` block and place it inside the ``||loops:forever||`` loop.
|
||||
2. Drag a ``||music:play sound effect||`` block and place it below the ``||sensors:pause until||`` block.
|
||||
3. Change the sound effect to ``mechanical horn1``.
|
||||
|
||||
```blocks
|
||||
forever(function () {
|
||||
sensors.ultrasonic4.pauseUntil(UltrasonicSensorEvent.ObjectDetected)
|
||||
music.playSoundEffect(sounds.mechanicalHorn1)
|
||||
})
|
||||
```
|
||||
|
||||
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.
|
||||
```
|
@ -1,163 +1,12 @@
|
||||
# Make a Sound Machine
|
||||
|
||||
Make a Sound Machine that can play a rhythm, music or just noise!
|
||||
|
||||
![Maker – Make a Sound Machine Main Image](/static/lessons/make-a-sound-machine/lego-maker-sound-machine-1.jpg)
|
||||
|
||||
## Connect
|
||||
|
||||
Music is made up of a combination of sounds, notes and rhythm. A rhythm is a regular movement or repeated pattern of movements that can be used in many different ways. In mechanical machines, a rhythm can help keep a machine running smoothly. It can also be used to generate different sounds in music.
|
||||
|
||||
![Sound Machine 3 Stock Footage Images](/static/lessons/make-a-sound-machine/three-stock.jpg)
|
||||
|
||||
Look at the photos and think about:
|
||||
|
||||
* What do you see?
|
||||
* Can you see any new design opportunities?
|
||||
* What problems can you see?
|
||||
* How could you make use of the LEGO bricks, the EV3 Programmable Brick, motors, and sensors?
|
||||
|
||||
### Things You’ll Need
|
||||
|
||||
* [@boardname@ Core Set](https://education.lego.com/enus/products/legomindstormseducationev3coreset/5003400)
|
||||
|
||||
Additional materials to add to your Sound Machine:
|
||||
|
||||
* Small musical instruments, such as chimes, bells, and small drums
|
||||
* Arts and crafts materials such as:
|
||||
>* Cardboard
|
||||
>* Construction paper
|
||||
>* Pipe cleaners
|
||||
>* Plastic or paper cups
|
||||
>* Recycled materials
|
||||
>* Rubber bands
|
||||
>* Wire
|
||||
|
||||
### Prior Knowledge
|
||||
|
||||
This activity uses motor rotations and sensor inputs. You may want to try the [Use](/getting-started/use) or [Object Detection](/coding/object-detection) activity before this one. Or, you can start out with this activity and tinker with coding motor and sensor inputs on your own.
|
||||
|
||||
## Contemplate
|
||||
|
||||
Follow the steps of the _Maker Design Process_ for this lesson:
|
||||
|
||||
* Define the Problem
|
||||
* Brainstorming
|
||||
* Define the Design Criteria
|
||||
* Go Make
|
||||
* Review and Revise Your Solution
|
||||
* Communicate Your Solution
|
||||
|
||||
### Defining the Problem
|
||||
|
||||
1. What problems did you imagine?
|
||||
2. Pick one problem and explain it to a partner.
|
||||
|
||||
### Brainstorm
|
||||
|
||||
Now that you have defined a problem, start to generate ideas for solving it.
|
||||
|
||||
### ~hint
|
||||
|
||||
Some things to do while brainstorming:
|
||||
|
||||
* Use the bricks from the LEGO set to help you brainstorm or sketch your ideas on paper.
|
||||
* The goal of brainstorming is to explore as many solutions as possible. You can use the tinkering examples in the Sample Solutions section below as inspiration for getting started.
|
||||
* Share your ideas and get some feedback. It may lead to more ideas!
|
||||
|
||||
### ~
|
||||
|
||||
### Define the Design Criteria
|
||||
|
||||
* You should have generated a number of ideas. Now select the best one to make.
|
||||
* Write out two or three specific design criteria your design must meet.
|
||||
|
||||
### Go Make
|
||||
|
||||
It is time to start making!
|
||||
|
||||
* Use the components from the @boardname@ Core Set and additional materials to make your chosen solution.
|
||||
* Test and analyze your design as you go and record any improvements that you make.
|
||||
|
||||
### Review and Revise Your Solution
|
||||
|
||||
* Have you managed to solve the problem that you defined?
|
||||
* Look back at your design criteria. How well does your solution work?
|
||||
* How can you improve your design?
|
||||
|
||||
### Communicate Your Solution
|
||||
|
||||
Now that you have finished you can:
|
||||
* Make a sketch or take a photo or video of your model.
|
||||
* Label the three most important parts and explain how they work.
|
||||
* Share your work with others.
|
||||
|
||||
## Continue
|
||||
|
||||
### Rhythm Maker - Sample Solution
|
||||
# Sound Machine
|
||||
|
||||
This example program combined with the small model will make a beat and rhythm on any surface when the program is run.
|
||||
|
||||
![Sound Machine Tinkering Example](/static/lessons/make-a-sound-machine/lego-maker-sound-machine.jpg)
|
||||
|
||||
#### Programming
|
||||
|
||||
1. Drag a run ``||motors:large motor A||`` block inside the ``||loops:forever||`` loop.
|
||||
2. Press the **(+)**.
|
||||
3. Change the rotations to `2`.
|
||||
4. Drag a ``||loops:pause||`` block and place it under the motor block.
|
||||
5. Change the duration to ``200`` ms.
|
||||
6. Drag a ``||run large motor A||`` block inside the ``||loops:forever||`` loop.
|
||||
7. Press the **(+)**.
|
||||
8. Change the power to `100`.
|
||||
9. Change the rotations to `1`.
|
||||
|
||||
```blocks
|
||||
forever(function () {
|
||||
motors.largeA.run(50, 2, MoveUnit.Rotations)
|
||||
pause(200)
|
||||
motors.largeA.run(100, 1, MoveUnit.Rotations)
|
||||
loops.forever(function () {
|
||||
output.motorA.on(50)
|
||||
loops.pause(200)
|
||||
output.motorA.on(100)
|
||||
loops.pause(200)
|
||||
})
|
||||
```
|
||||
|
||||
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.
|
||||
|
||||
### Color Sensor Sounds - Sample Solution
|
||||
|
||||
You can also tinker with the use of sensors.
|
||||
|
||||
![Sound Machine Color Sensor](/static/lessons/make-a-sound-machine/lego-maker-sound-machine-color-sensor.jpg)
|
||||
|
||||
#### Programming
|
||||
|
||||
1. Drag an ``||logic:if else||`` Logic block and place it inside the ``||loops:forever||`` loop.
|
||||
2. Drag a ``||sensors:pause color sensor||`` block and place it inside the ``||logic:if true then||`` block.
|
||||
3. Change the color to ``blue``.
|
||||
4. Drag a ``||music:play tone||`` block and place under the sensor block.
|
||||
5. Change the tone to ``Middle G`` (392 Hz).
|
||||
6. Drag a ``||sensors:pause color sensor||`` block and place it inside the ``||logic:else||`` block.
|
||||
7. Change the color to ``red``.
|
||||
8. Drag a ``||music:play tone||`` block and place under the new sensor block.
|
||||
9. Change the tone to ``High C`` (523 Hz).
|
||||
10. Press the **(+)**.
|
||||
11. Drag a ``||sensors:pause color sensor||`` block and place it inside the ``||logic:else if||`` block.
|
||||
12. Change the color to ``green``.
|
||||
13. Drag a ``||music:play tone||`` block and place under the new sensor block.
|
||||
14. Change the tone to ``High D`` (587 Hz).
|
||||
|
||||
```blocks
|
||||
forever(function () {
|
||||
if (true) {
|
||||
sensors.color3.pauseUntilColorDetected(ColorSensorColor.Blue)
|
||||
music.playTone(392, music.beat(BeatFraction.Whole))
|
||||
} else if (false) {
|
||||
sensors.color3.pauseUntilColorDetected(ColorSensorColor.Red)
|
||||
music.playTone(523, music.beat(BeatFraction.Half))
|
||||
} else {
|
||||
sensors.color3.pauseUntilColorDetected(ColorSensorColor.Green)
|
||||
music.playTone(587, music.beat(BeatFraction.Half))
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
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.
|
||||
```
|
@ -3,13 +3,13 @@
|
||||
This program will play different sounds when the wheel is rotated. The sound is determined by which color is placed in front of the color Sensor.
|
||||
|
||||
```blocks
|
||||
sensors.color3.onColorDetected(ColorSensorColor.Blue, function () {
|
||||
input.color3.onColorDetected(ColorSensorColor.Blue, function () {
|
||||
music.playTone(Note.G4, music.beat(BeatFraction.Half))
|
||||
})
|
||||
sensors.color3.onColorDetected(ColorSensorColor.Red, function () {
|
||||
input.color3.onColorDetected(ColorSensorColor.Red, function () {
|
||||
music.playTone(Note.C5, music.beat(BeatFraction.Half))
|
||||
})
|
||||
sensors.color3.onColorDetected(ColorSensorColor.Green, function () {
|
||||
input.color3.onColorDetected(ColorSensorColor.Green, function () {
|
||||
music.playTone(Note.D5, music.beat(BeatFraction.Half))
|
||||
})
|
||||
```
|
@ -1,791 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:og="http://ogp.me/ns#" xmlns:fb="http://www.facebook.com/2008/fbml">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>LEGO® MINDSTORMS® Education EV3 Offline App</title>
|
||||
<meta name="Description" content="A MakeCode for LEGO® MINDSTORMS® Education EV3 offline app" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<!-- @include indexhead.html -->
|
||||
|
||||
<style>
|
||||
p.item {
|
||||
color: rgba(0, 0, 0, 0.4);
|
||||
}
|
||||
|
||||
.topbar {
|
||||
background: rgb(170, 39, 143) !important;
|
||||
}
|
||||
|
||||
.ui.inverted.content {
|
||||
/* background: #00a5c8; */
|
||||
background: #2a7af3;
|
||||
}
|
||||
|
||||
.content.segment {
|
||||
min-height: 80%;
|
||||
}
|
||||
|
||||
.content .welcomeheader {
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
.footer.segment {
|
||||
padding: 5em 0em;
|
||||
}
|
||||
|
||||
.image.left {
|
||||
padding-left: 2em;
|
||||
}
|
||||
|
||||
.image.right {
|
||||
padding-right: 2em;
|
||||
float: right;
|
||||
}
|
||||
|
||||
.segments {
|
||||
max-width: 60%;
|
||||
}
|
||||
|
||||
.segments.terms-container {
|
||||
margin-top: 5em;
|
||||
}
|
||||
|
||||
.terms-container .segment {
|
||||
background-color: rgb(250, 250, 250);
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 800px) {
|
||||
.grid .column .image {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.segments {
|
||||
max-width: 95%;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
<!-- Auto-generated styles for the license terms -->
|
||||
<style type="text/css">
|
||||
.terms ol {
|
||||
margin: 0;
|
||||
padding: 0
|
||||
}
|
||||
|
||||
.terms table td,
|
||||
.terms table th {
|
||||
padding: 0
|
||||
}
|
||||
|
||||
.c2 {
|
||||
margin-left: 22.5pt;
|
||||
padding-top: 6pt;
|
||||
text-indent: -18pt;
|
||||
padding-bottom: 6pt;
|
||||
line-height: 1.15;
|
||||
orphans: 2;
|
||||
widows: 2;
|
||||
text-align: left
|
||||
}
|
||||
|
||||
.c8 {
|
||||
margin-left: 40.5pt;
|
||||
padding-top: 6pt;
|
||||
text-indent: -18pt;
|
||||
padding-bottom: 6pt;
|
||||
line-height: 1.15;
|
||||
orphans: 2;
|
||||
widows: 2;
|
||||
text-align: left
|
||||
}
|
||||
|
||||
.c15 {
|
||||
padding-top: 0pt;
|
||||
padding-bottom: 12pt;
|
||||
line-height: 1.15;
|
||||
orphans: 2;
|
||||
widows: 2;
|
||||
text-align: left;
|
||||
height: 11pt
|
||||
}
|
||||
|
||||
.c7 {
|
||||
padding-top: 0pt;
|
||||
padding-bottom: 0pt;
|
||||
line-height: 1.15;
|
||||
orphans: 2;
|
||||
widows: 2;
|
||||
text-align: left;
|
||||
height: 11pt
|
||||
}
|
||||
|
||||
.c0 {
|
||||
margin-left: 23pt;
|
||||
padding-top: 6pt;
|
||||
padding-bottom: 6pt;
|
||||
line-height: 1.15;
|
||||
orphans: 2;
|
||||
widows: 2;
|
||||
text-align: left
|
||||
}
|
||||
|
||||
.c10 {
|
||||
margin-left: 40.5pt;
|
||||
padding-top: 6pt;
|
||||
padding-bottom: 6pt;
|
||||
line-height: 1.15;
|
||||
orphans: 2;
|
||||
widows: 2;
|
||||
text-align: left
|
||||
}
|
||||
|
||||
.c6 {
|
||||
margin-left: 40.5pt;
|
||||
padding-top: 0pt;
|
||||
padding-bottom: 0pt;
|
||||
line-height: 1.15;
|
||||
orphans: 2;
|
||||
widows: 2;
|
||||
text-align: left
|
||||
}
|
||||
|
||||
.c20 {
|
||||
padding-top: 0pt;
|
||||
padding-bottom: 0pt;
|
||||
line-height: 1.15;
|
||||
orphans: 2;
|
||||
widows: 2;
|
||||
text-align: center
|
||||
}
|
||||
|
||||
.c4 {
|
||||
color: #000000;
|
||||
font-weight: 700;
|
||||
text-decoration: none;
|
||||
vertical-align: baseline;
|
||||
font-family: "Arial";
|
||||
font-style: normal
|
||||
}
|
||||
|
||||
.c11 {
|
||||
padding-top: 0pt;
|
||||
padding-bottom: 0pt;
|
||||
line-height: 1.15;
|
||||
orphans: 2;
|
||||
widows: 2;
|
||||
text-align: left
|
||||
}
|
||||
|
||||
.c12 {
|
||||
padding-top: 6pt;
|
||||
padding-bottom: 6pt;
|
||||
line-height: 1.15;
|
||||
orphans: 2;
|
||||
widows: 2;
|
||||
text-align: left
|
||||
}
|
||||
|
||||
.c3 {
|
||||
color: #000000;
|
||||
font-weight: 400;
|
||||
text-decoration: none;
|
||||
vertical-align: baseline;
|
||||
font-family: "Arial";
|
||||
font-style: normal
|
||||
}
|
||||
|
||||
.c16 {
|
||||
padding-top: 0pt;
|
||||
padding-bottom: 12pt;
|
||||
line-height: 1.15;
|
||||
orphans: 2;
|
||||
widows: 2;
|
||||
text-align: left
|
||||
}
|
||||
|
||||
.c13 {
|
||||
color: #000000;
|
||||
text-decoration: none;
|
||||
vertical-align: baseline;
|
||||
font-family: "Arial";
|
||||
font-style: italic
|
||||
}
|
||||
|
||||
.c14 {
|
||||
text-decoration-skip-ink: none;
|
||||
-webkit-text-decoration-skip: none;
|
||||
color: #1155cc;
|
||||
text-decoration: underline
|
||||
}
|
||||
|
||||
.c17 {
|
||||
background-color: #ffffff;
|
||||
max-width: 540pt;
|
||||
padding: 36pt 36pt 36pt 36pt
|
||||
}
|
||||
|
||||
.c18 {
|
||||
text-decoration-skip-ink: none;
|
||||
-webkit-text-decoration-skip: none;
|
||||
text-decoration: underline
|
||||
}
|
||||
|
||||
.c9 {
|
||||
color: inherit;
|
||||
text-decoration: inherit
|
||||
}
|
||||
|
||||
.c5 {
|
||||
font-weight: 700
|
||||
}
|
||||
|
||||
.c1 {
|
||||
font-size: 10pt
|
||||
}
|
||||
|
||||
.c19 {
|
||||
font-size: 11pt
|
||||
}
|
||||
|
||||
.terms .title {
|
||||
padding-top: 0pt;
|
||||
color: #000000;
|
||||
font-size: 26pt;
|
||||
padding-bottom: 3pt;
|
||||
font-family: "Arial";
|
||||
line-height: 1.15;
|
||||
page-break-after: avoid;
|
||||
orphans: 2;
|
||||
widows: 2;
|
||||
text-align: left
|
||||
}
|
||||
|
||||
.terms .subtitle {
|
||||
padding-top: 0pt;
|
||||
color: #666666;
|
||||
font-size: 15pt;
|
||||
padding-bottom: 16pt;
|
||||
font-family: "Arial";
|
||||
line-height: 1.15;
|
||||
page-break-after: avoid;
|
||||
orphans: 2;
|
||||
widows: 2;
|
||||
text-align: left
|
||||
}
|
||||
|
||||
.terms li {
|
||||
color: #000000;
|
||||
font-size: 11pt;
|
||||
font-family: "Arial"
|
||||
}
|
||||
|
||||
.terms p {
|
||||
margin: 0;
|
||||
color: #000000;
|
||||
font-size: 11pt;
|
||||
font-family: "Arial"
|
||||
}
|
||||
|
||||
.terms h1 {
|
||||
padding-top: 20pt;
|
||||
color: #000000;
|
||||
font-size: 20pt;
|
||||
padding-bottom: 6pt;
|
||||
font-family: "Arial";
|
||||
line-height: 1.15;
|
||||
page-break-after: avoid;
|
||||
orphans: 2;
|
||||
widows: 2;
|
||||
text-align: left
|
||||
}
|
||||
|
||||
.terms h2 {
|
||||
padding-top: 18pt;
|
||||
color: #000000;
|
||||
font-size: 16pt;
|
||||
padding-bottom: 6pt;
|
||||
font-family: "Arial";
|
||||
line-height: 1.15;
|
||||
page-break-after: avoid;
|
||||
orphans: 2;
|
||||
widows: 2;
|
||||
text-align: left
|
||||
}
|
||||
|
||||
.terms h3 {
|
||||
padding-top: 16pt;
|
||||
color: #434343;
|
||||
font-size: 14pt;
|
||||
padding-bottom: 4pt;
|
||||
font-family: "Arial";
|
||||
line-height: 1.15;
|
||||
page-break-after: avoid;
|
||||
orphans: 2;
|
||||
widows: 2;
|
||||
text-align: left
|
||||
}
|
||||
|
||||
.terms h4 {
|
||||
padding-top: 14pt;
|
||||
color: #666666;
|
||||
font-size: 12pt;
|
||||
padding-bottom: 4pt;
|
||||
font-family: "Arial";
|
||||
line-height: 1.15;
|
||||
page-break-after: avoid;
|
||||
orphans: 2;
|
||||
widows: 2;
|
||||
text-align: left
|
||||
}
|
||||
|
||||
.terms h5 {
|
||||
padding-top: 12pt;
|
||||
color: #666666;
|
||||
font-size: 11pt;
|
||||
padding-bottom: 4pt;
|
||||
font-family: "Arial";
|
||||
line-height: 1.15;
|
||||
page-break-after: avoid;
|
||||
orphans: 2;
|
||||
widows: 2;
|
||||
text-align: left
|
||||
}
|
||||
|
||||
.terms h6 {
|
||||
padding-top: 12pt;
|
||||
color: #666666;
|
||||
font-size: 11pt;
|
||||
padding-bottom: 4pt;
|
||||
font-family: "Arial";
|
||||
line-height: 1.15;
|
||||
page-break-after: avoid;
|
||||
font-style: italic;
|
||||
orphans: 2;
|
||||
widows: 2;
|
||||
text-align: left
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
tickEvent = function (id, data) {
|
||||
if (!pxt.aiTrackEvent) return;
|
||||
if (!data) pxt.aiTrackEvent(id);
|
||||
else {
|
||||
var props = {};
|
||||
var measures = {};
|
||||
for (var k in data)
|
||||
if (typeof data[k] == "string") props[k] = data[k];
|
||||
else measures[k] = data[k];
|
||||
pxt.aiTrackEvent(id, props, measures);
|
||||
}
|
||||
}
|
||||
});
|
||||
function agreeCheckboxChanged() {
|
||||
var downloadSegment = document.getElementById("download-segment");
|
||||
downloadSegment.classList.toggle("hidden");
|
||||
}
|
||||
function downloadWin64() {
|
||||
// TODO: Keep this link up-to-date with the desired release version
|
||||
window.open("https://makecode.com/api/release/ev3/v1.2.26/win64");
|
||||
tickEvent("offlineapp.download", { "target": "ev3", "platform": "win64" });
|
||||
}
|
||||
function downloadMac64() {
|
||||
// TODO: Keep this link up-to-date with the desired release version
|
||||
window.open("https://makecode.com/api/release/ev3/v1.2.26/mac64");
|
||||
tickEvent("offlineapp.download", { "target": "ev3", "platform": "mac64" });
|
||||
}
|
||||
</script>
|
||||
|
||||
</head>
|
||||
|
||||
<body id="root" class="root">
|
||||
|
||||
<div class="ui inverted vertical center aligned segment content">
|
||||
|
||||
<div class="ui grid topbar">
|
||||
<div class="three wide column">
|
||||
<img class="ui small image left" src="/static//lego_education_logo_white.png" />
|
||||
</div>
|
||||
<div class="ten wide column">
|
||||
<h1 class="ui inverted welcomeheader">MakeCode Offline App</h1>
|
||||
</div>
|
||||
<div class="three wide column">
|
||||
<img class="ui small image right" src="/static//Microsoft-logo_rgb_c-white.png" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="ui compact segments terms-container">
|
||||
<div class="ui secondary center aligned segment">
|
||||
Please read and accept the following terms to download the app.
|
||||
</div>
|
||||
<div class="ui left aligned segment terms">
|
||||
<div class="c17">
|
||||
<p class="c11">
|
||||
<span class="c4 c1">MICROSOFT PRE-RELEASE SOFTWARE LICENSE TERMS</span>
|
||||
</p>
|
||||
<p class="c11">
|
||||
<span class="c4 c1">MICROSOFT MAKECODE FOR LEGO MINDSTORMS EDUCATION EV3</span>
|
||||
</p>
|
||||
<p class="c7">
|
||||
<span class="c4 c1"></span>
|
||||
</p>
|
||||
<p class="c11">
|
||||
<span class="c3 c1">These license terms are an agreement between Microsoft Corporation (or based on where you live, one
|
||||
of its affiliates) and you. They apply to the software named above. The terms also apply to any
|
||||
Microsoft services or updates for the software, except to the extent those have additional terms.</span>
|
||||
</p>
|
||||
<p class="c7">
|
||||
<span class="c3 c1"></span>
|
||||
</p>
|
||||
<p class="c11">
|
||||
<span class="c4 c1">IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE RIGHTS BELOW.</span>
|
||||
</p>
|
||||
<p class="c2">
|
||||
<span class="c5 c1">1.</span>
|
||||
<span class="c1"> </span>
|
||||
<span class="c5 c1">INSTALLATION AND USE RIGHTS. </span>
|
||||
<span class="c3 c1">You may install and use any number of copies of the software to evaluate it as you develop and test
|
||||
your software applications for use with Lego Mindstorms Education EV3 hardware.</span>
|
||||
</p>
|
||||
<p class="c2">
|
||||
<span class="c5 c1">2.</span>
|
||||
<span class="c1"> </span>
|
||||
<span class="c5 c1">PRE-RELEASE SOFTWARE. </span>
|
||||
<span class="c3 c1">The software is a pre-release version. It may not work the way a final version of the software will.
|
||||
Microsoft may change it for the final, commercial version. We also may not release a commercial
|
||||
version. Microsoft is not obligated to provide maintenance, technical support or updates to you
|
||||
for the software.</span>
|
||||
</p>
|
||||
<p class="c2">
|
||||
<span class="c5 c1">3.</span>
|
||||
<span class="c1"> </span>
|
||||
<span class="c5 c1">ASSOCIATED ONLINE SERVICES.</span>
|
||||
<span class="c1"> Some features of the software provide access
|
||||
to, or rely on, online services to provide you information about updates to the software or extensions,
|
||||
or to enable you to retrieve content, collaborate with others, or otherwise supplement your development
|
||||
experience. As used throughout these license terms, the term <q>software</q> includes these online
|
||||
services and features. By using these online services and features you consent to the to the
|
||||
transmission of information as described in Section 5, DATA.
|
||||
</span>
|
||||
</p>
|
||||
<p class="c2">
|
||||
<span class="c5 c1">4.</span>
|
||||
<span class="c1"> </span>
|
||||
<span class="c5 c1">LICENSES FOR OTHER COMPONENTS.</span>
|
||||
<span class="c3 c1"> The software may include third party components with separate legal notices or governed by
|
||||
other agreements, as described in the ThirdPartyNotices file accompanying the software. Even
|
||||
if such components are governed by other agreements, the disclaimers and the limitations on and
|
||||
exclusions of damages below also apply.</span>
|
||||
</p>
|
||||
<p class="c2">
|
||||
<span class="c5 c1">5.</span>
|
||||
<span class="c1"> </span>
|
||||
<span class="c1 c4">DATA.</span>
|
||||
</p>
|
||||
<p class="c8">
|
||||
<span class="c5 c1">a.</span>
|
||||
<span class="c1"> </span>
|
||||
<span class="c1 c5">Data Collection. </span>
|
||||
<span class="c1">The software may collect information about you and your use of the software, and send that to Microsoft.
|
||||
Microsoft may use this information to provide services and improve our products and services.
|
||||
You may opt out of many of these scenarios, but not all, as described in the product documentation.
|
||||
In using the software, you must comply with applicable law. You can learn more about data collection
|
||||
and use in the help documentation and the privacy statement at </span>
|
||||
<span class="c14 c1">
|
||||
<a class="c9" href="http://go.microsoft.com/fwlink/?LinkId=398505">http://go.microsoft.com/fwlink/?LinkId=398505</a>
|
||||
</span>
|
||||
<span class="c1">.</span>
|
||||
<span class="c3 c1"> Your use of the software operates as your consent to these practices.</span>
|
||||
</p>
|
||||
<p class="c8">
|
||||
<span class="c5 c1">b.</span>
|
||||
<span class="c1"> </span>
|
||||
<span class="c5 c1">Processing of Personal Data. </span>
|
||||
<span class="c1">To the extent Microsoft is a processor or subprocessor of personal data in connection with the software,
|
||||
Microsoft makes the commitments in the European Union General Data Protection Regulation Terms
|
||||
of the Online Services Terms to all customers effective May 25, 2018, at </span>
|
||||
<span class="c1 c14">
|
||||
<a class="c9" href="http://go.microsoft.com/?linkid=9840733">http://go.microsoft.com/?linkid=9840733</a>
|
||||
</span>
|
||||
<span class="c3 c1">.</span>
|
||||
</p>
|
||||
<p class="c2">
|
||||
<span class="c5 c1">6.</span>
|
||||
<span class="c1"> </span>
|
||||
<span class="c5 c1">FEEDBACK. </span>
|
||||
<span class="c3 c1">If you give feedback about the software to Microsoft, you give to Microsoft, without charge, the
|
||||
right to use, share and commercialize your feedback in any way and for any purpose. You will
|
||||
not give feedback that is subject to a license that requires Microsoft to license its software
|
||||
or documentation to third parties because we include your feedback in them. These rights survive
|
||||
this agreement.</span>
|
||||
</p>
|
||||
<p class="c2">
|
||||
<span class="c5 c1">7.</span>
|
||||
<span class="c1"> </span>
|
||||
<span class="c5 c1">SCOPE OF LICENSE.</span>
|
||||
<span class="c3 c1"> The software is licensed, not sold. This agreement only gives you some rights to use the software.
|
||||
Microsoft reserves all other rights. Unless applicable law gives you more rights despite this
|
||||
limitation, you may use the software only as expressly permitted in this agreement. In
|
||||
doing so, you must comply with any technical limitations in the software that only allow you
|
||||
to use it in certain ways. You may not:</span>
|
||||
</p>
|
||||
<p class="c8">
|
||||
<span class="c3 c1">- work around any technical limitations in the software;</span>
|
||||
</p>
|
||||
<p class="c8">
|
||||
<span class="c3 c1">- reverse engineer, decompile or disassemble the software, or attempt to do so, except
|
||||
and only to the extent required by third party licensing terms governing use of certain open
|
||||
source components that may be included with the software;</span>
|
||||
</p>
|
||||
<p class="c8">
|
||||
<span class="c3 c1">- remove, minimize, block or modify any notices of Microsoft or its suppliers in the
|
||||
software;
|
||||
</span>
|
||||
</p>
|
||||
<p class="c8">
|
||||
<span class="c3 c1">- use the software in any way that is against the law; or</span>
|
||||
</p>
|
||||
<p class="c8">
|
||||
<span class="c3 c1">- share, publish, rent or lease the software, or provide the software as a stand-alone
|
||||
offering for others to use.</span>
|
||||
</p>
|
||||
<p class="c2">
|
||||
<span class="c5 c1">8. UPDATES. </span>
|
||||
<span class="c3 c1">The software may periodically check for updates and download and install them for you. You may obtain
|
||||
updates only from Microsoft or authorized sources. Microsoft may need to update your system to
|
||||
provide you with updates. You agree to receive these automatic updates without any additional
|
||||
notice. Updates may not include or support all existing software features, services, or peripheral
|
||||
devices.
|
||||
</span>
|
||||
</p>
|
||||
<p class="c2">
|
||||
<span class="c5 c1">9.</span>
|
||||
<span class="c1"> </span>
|
||||
<span class="c5 c1">EXPORT RESTRICTIONS.</span>
|
||||
<span class="c3 c1"> You must comply with all domestic and international export laws and regulations that apply
|
||||
to the software, which include restrictions on destinations, end users and end use. For further
|
||||
information on export restrictions, visit (aka.ms/exporting).</span>
|
||||
</p>
|
||||
<p class="c2">
|
||||
<span class="c5 c1">10.</span>
|
||||
<span class="c1"> </span>
|
||||
<span class="c5 c1">SUPPORT SERVICES. </span>
|
||||
<span class="c3 c1">Because the software is “as is,” we may not provide support services for it.</span>
|
||||
</p>
|
||||
<p class="c2">
|
||||
<span class="c5 c1">11.</span>
|
||||
<span class="c1"> </span>
|
||||
<span class="c5 c1">ENTIRE AGREEMENT.</span>
|
||||
<span class="c3 c1"> This agreement, and the terms for supplements, updates, Internet-based services and support
|
||||
services that you use, are the entire agreement for the software and support services.</span>
|
||||
</p>
|
||||
<p class="c2">
|
||||
<span class="c5 c1">12.</span>
|
||||
<span class="c1"> </span>
|
||||
<span class="c5 c1">APPLICABLE LAW. </span>
|
||||
<span class="c3 c1">If you acquired the software in the United States, Washington State law applies to interpretation
|
||||
of and claims for breach of this agreement, and the laws of the state where you live apply to
|
||||
all other claims. If you acquired the software in any other country, its laws apply.</span>
|
||||
</p>
|
||||
<p class="c2">
|
||||
<span class="c5 c1">13.</span>
|
||||
<span class="c1"> </span>
|
||||
<span class="c5 c1">CONSUMER RIGHTS; REGIONAL VARIATIONS. </span>
|
||||
<span class="c3 c1">This agreement describes certain legal rights. You may have other rights, including consumer rights,
|
||||
under the laws of your state or country. Separate and apart from your relationship with Microsoft,
|
||||
you may also have rights with respect to the party from which you acquired the software. This
|
||||
agreement does not change those other rights if the laws of your state or country do not permit
|
||||
it to do so. For example, if you acquired the software in one of the below regions, or mandatory
|
||||
country law applies, then the following provisions apply to you:</span>
|
||||
</p>
|
||||
<p class="c8">
|
||||
<span class="c5 c1">a.</span>
|
||||
<span class="c1"> </span>
|
||||
<span class="c5 c1">Australia. </span>
|
||||
<span class="c3 c1">You have statutory guarantees under the Australian Consumer Law and nothing in this agreement is
|
||||
intended to affect those rights.</span>
|
||||
</p>
|
||||
<p class="c8">
|
||||
<span class="c5 c1">b.</span>
|
||||
<span class="c1"> </span>
|
||||
<span class="c5 c1">Canada. </span>
|
||||
<span class="c3 c1">If you acquired the software in Canada, you may stop receiving updates by turning off the automatic
|
||||
update feature, disconnecting your device from the Internet (if and when you re-connect to the
|
||||
Internet, however, the software will resume checking for and installing updates), or uninstalling
|
||||
the software. The product documentation, if any, may also specify how to turn off updates for
|
||||
your specific device or software.</span>
|
||||
</p>
|
||||
<p class="c8">
|
||||
<span class="c5 c1">c.</span>
|
||||
<span class="c1"> </span>
|
||||
<span class="c5 c1">Germany and Austria</span>
|
||||
<span class="c3 c1">.</span>
|
||||
</p>
|
||||
<p class="c6">
|
||||
<span class="c5 c1">(i)</span>
|
||||
<span class="c1"> </span>
|
||||
<span class="c5 c1">Warranty</span>
|
||||
<span class="c3 c1">. The properly licensed software will perform substantially as described in any Microsoft materials
|
||||
that accompany the software. However, Microsoft gives no contractual guarantee in relation to
|
||||
the licensed software.</span>
|
||||
</p>
|
||||
<p class="c6">
|
||||
<span class="c4 c1"> </span>
|
||||
</p>
|
||||
<p class="c6">
|
||||
<span class="c5 c1">(ii)</span>
|
||||
<span class="c1"> </span>
|
||||
<span class="c5 c1">Limitation of Liability</span>
|
||||
<span class="c3 c1">. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as
|
||||
well as, in case of death or personal or physical injury, Microsoft is liable according to the
|
||||
statutory law.</span>
|
||||
</p>
|
||||
<p class="c10">
|
||||
<span class="c3 c1">Subject to the foregoing clause (ii), Microsoft will only be liable for slight negligence if Microsoft
|
||||
is in breach of such material contractual obligations, the fulfillment of which facilitate the
|
||||
due performance of this agreement, the breach of which would endanger the purpose of this agreement
|
||||
and the compliance with which a party may constantly trust in (so-called "cardinal obligations").
|
||||
In other cases of slight negligence, Microsoft will not be liable for slight negligence.</span>
|
||||
</p>
|
||||
<p class="c2">
|
||||
<span class="c5 c1">14.</span>
|
||||
<span class="c1"> </span>
|
||||
<span class="c5 c1">LEGAL EFFECT.</span>
|
||||
<span class="c3 c1"> This agreement describes certain legal rights. You may have other rights under the laws of
|
||||
your country. You may also have rights with respect to the party from whom you acquired the software.
|
||||
This agreement does not change your rights under the laws of your country if the laws of your
|
||||
country do not permit it to do so.</span>
|
||||
</p>
|
||||
<p class="c2">
|
||||
<span class="c5 c1">15.</span>
|
||||
<span class="c1"> </span>
|
||||
<span class="c4 c1">DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF
|
||||
USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED
|
||||
UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.</span>
|
||||
</p>
|
||||
<p class="c2">
|
||||
<span class="c5 c1">16.</span>
|
||||
<span class="c1"> </span>
|
||||
<span class="c4 c1">LIMITATION ON AND EXCLUSION OF DAMAGES. YOU CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT
|
||||
DAMAGES UP TO U.S. $5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST
|
||||
PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES.</span>
|
||||
</p>
|
||||
<p class="c0">
|
||||
<span class="c3 c1">This limitation applies to (a) anything related to the software, services, content (including code)
|
||||
on third party Internet sites, or third party programs; and (b) claims for breach of contract,
|
||||
breach of warranty, guarantee or condition, strict liability, negligence, or other tort to the
|
||||
extent permitted by applicable law.</span>
|
||||
</p>
|
||||
<p class="c0">
|
||||
<span class="c3 c1">It also applies even if Microsoft knew or should have known about the possibility of the damages.
|
||||
The above limitation or exclusion may not apply to you because your country may not allow the
|
||||
exclusion or limitation of incidental, consequential or other damages.</span>
|
||||
</p>
|
||||
<p class="c12">
|
||||
<span class="c4 c1">Please note: As the software is distributed in Quebec, Canada, some of the clauses in this agreement
|
||||
are provided below in French.</span>
|
||||
</p>
|
||||
<p class="c12">
|
||||
<span class="c4 c1">Remarque : Ce logiciel étant distribué au Québec, Canada, certaines des clauses
|
||||
dans ce contrat sont fournies ci-dessous en français.</span>
|
||||
</p>
|
||||
<p class="c11">
|
||||
<span class="c5 c1">EXONÉRATION DE GARANTIE.</span>
|
||||
<span class="c1 c3"> Le logiciel visé par une licence est offert « tel quel ». Toute utilisation
|
||||
de ce logiciel est à votre seule risque et péril. Microsoft n’accorde aucune
|
||||
autre garantie expresse. Vous pouvez bénéficier de droits additionnels en vertu
|
||||
du droit local sur la protection des consommateurs, que ce contrat ne peut modifier. La ou elles
|
||||
sont permises par le droit locale, les garanties implicites de qualité marchande, d’adéquation
|
||||
à un usage particulier et d’absence de contrefaçon sont exclues.
|
||||
</span>
|
||||
</p>
|
||||
<p class="c11">
|
||||
<span class="c5 c1">LIMITATION DES DOMMAGES-INTÉRÊTS ET EXCLUSION DE RESPONSABILITÉ POUR LES DOMMAGES.</span>
|
||||
<span class="c3 c1"> Vous pouvez obtenir de Microsoft et de ses fournisseurs une indemnisation en cas de dommages
|
||||
directs uniquement à hauteur de 5,00 $ US. Vous ne pouvez prétendre à aucune
|
||||
indemnisation pour les autres dommages, y compris les dommages spéciaux, indirects ou
|
||||
accessoires et pertes de bénéfices.</span>
|
||||
</p>
|
||||
<p class="c12">
|
||||
<span class="c3 c1">Cette limitation concerne :</span>
|
||||
</p>
|
||||
<p class="c2">
|
||||
<span class="c3 c1">- tout ce qui est relié au logiciel, aux services ou au contenu
|
||||
(y compris le code) figurant sur des sites Internet tiers ou dans des programmes tiers ; et</span>
|
||||
</p>
|
||||
<p class="c2">
|
||||
<span class="c3 c1">- les réclamations au titre de violation de contrat ou de garantie,
|
||||
ou au titre de responsabilité stricte, de négligence ou d’une autre faute
|
||||
dans la limite autorisée par la loi en vigueur.</span>
|
||||
</p>
|
||||
<p class="c12">
|
||||
<span class="c3 c1">Elle s’applique également, même si Microsoft connaissait ou devrait connaître
|
||||
l’éventualité d’un tel dommage. Si votre pays n’autorise pas
|
||||
l’exclusion ou la limitation de responsabilité pour les dommages indirects, accessoires
|
||||
ou de quelque nature que ce soit, il se peut que la limitation ou l’exclusion ci-dessus
|
||||
ne s’appliquera pas à votre égard.</span>
|
||||
</p>
|
||||
<p class="c16">
|
||||
<span class="c5 c1">EFFET JURIDIQUE.</span>
|
||||
<span class="c3 c1"> Le présent contrat décrit certains droits juridiques. Vous pourriez avoir d’autres
|
||||
droits prévus par les lois de votre pays. Le présent contrat ne modifie pas les
|
||||
droits que vous confèrent les lois de votre pays si celles-ci ne le permettent pas.</span>
|
||||
</p>
|
||||
<p class="c15">
|
||||
<span class="c3 c1"></span>
|
||||
</p>
|
||||
<p class="c16">
|
||||
<span class="c3 c1"> </span>
|
||||
</p>
|
||||
<p class="c11">
|
||||
<span class="c3 c1">LEGO, the LEGO logo, MINDSTORMS and the MINDSTORMS EV3 logo are trademarks and/ or copyrights of
|
||||
the LEGO Group. ©2018 The LEGO Group. All rights reserved.</span>
|
||||
</p>
|
||||
<p class="c11">
|
||||
<span class="c3 c1"> </span>
|
||||
</p>
|
||||
<p class="c20">
|
||||
<span class="c5 c1 c13">Remainder of this page intentionally left blank.</span>
|
||||
</p>
|
||||
<p class="c7">
|
||||
<span class="c3 c19"></span>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="ui center aligned segment">
|
||||
<input id="agree-checkbox" type="checkbox" autocomplete="off" onchange="agreeCheckboxChanged(this)">
|
||||
<label for="agree-checkbox">I agree to these Microsoft Software License Terms and to the
|
||||
<a href="https://privacy.microsoft.com/en-us/privacystatement">Microsoft Privacy Statement.</a>
|
||||
</label>
|
||||
</div>
|
||||
<div id="download-segment" class="ui center aligned segment hidden">
|
||||
<div class="ui grid">
|
||||
<div class="eight wide column">
|
||||
<h3 class="ui">Windows</h3>
|
||||
<button class="ui icon button" onclick="downloadWin64()">
|
||||
<i class="download icon"></i>
|
||||
makecode-ev3-setup-win64.exe
|
||||
</button>
|
||||
</div>
|
||||
<div class="eight wide column">
|
||||
<h3 class="ui">Mac OS</h3>
|
||||
<button class="ui icon button" onclick="downloadMac64()">
|
||||
<i class="download icon"></i>
|
||||
makecode-ev3-mac64.zip
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- @include footer.html -->
|
||||
<!-- @include tracking.html -->
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
@ -1,5 +0,0 @@
|
||||
# @extends
|
||||
|
||||
## Offline app #target-app
|
||||
|
||||
The MakeCode editor is available as app which you can install on a computer with Windows or Mac OS. Once installed, the **[MakeCode Offline App](/offline-app)** lets you create, run, and download your projects to the @boardname@. It works the same as the Web application does in your browser but it's a stand-alone application that will work when a connection to the internet is restricted or not available.
|
@ -1,3 +0,0 @@
|
||||
{
|
||||
"redirect": "/extensions"
|
||||
}
|
@ -1,3 +0,0 @@
|
||||
{
|
||||
"redirect": "https://makecode.com/extensions/approval"
|
||||
}
|
@ -1,3 +0,0 @@
|
||||
{
|
||||
"redirect": "https://makecode.com/extensions/getting-started"
|
||||
}
|
@ -1,3 +0,0 @@
|
||||
{
|
||||
"redirect": "https://makecode.com/extensions/versioning"
|
||||
}
|
@ -1,88 +1,9 @@
|
||||
# Projects
|
||||
|
||||
```codecard
|
||||
[
|
||||
{
|
||||
"name": "Getting Started",
|
||||
"url": "/getting-started",
|
||||
"imageUrl": "/static/lessons/firmware.png"
|
||||
},
|
||||
{
|
||||
"name": "Brick Tutorials",
|
||||
"url": "/tutorials/brick",
|
||||
"imageUrl": "/static/tutorials/wake-up.png"
|
||||
},
|
||||
{
|
||||
"name": "Motor Tutorials",
|
||||
"url": "/tutorials/motors",
|
||||
"imageUrl": "/static/tutorials/run-motors.png"
|
||||
},
|
||||
{
|
||||
"name": "Touch Sensor Tutorials",
|
||||
"url": "/tutorials/touch-sensor",
|
||||
"imageUrl": "/static/tutorials/touch-to-run.png"
|
||||
},
|
||||
{
|
||||
"name": "Color Sensor Tutorials",
|
||||
"url": "/tutorials/color-sensor",
|
||||
"imageUrl": "/static/tutorials/what-color.png"
|
||||
},
|
||||
{
|
||||
"name": "Ultrasonic Sensor Tutorials",
|
||||
"url": "/tutorials/ultrasonic-sensor",
|
||||
"imageUrl": "/static/tutorials/object-near.png"
|
||||
},
|
||||
{
|
||||
"name": "Gyro Tutorials",
|
||||
"url": "/tutorials/gyro",
|
||||
"imageUrl": "/static/tutorials/calibrate-gyro.png"
|
||||
},
|
||||
{
|
||||
"name": "Infrared Sensor Tutorials",
|
||||
"url": "/tutorials/infrared-sensor",
|
||||
"imageUrl": "/static/tutorials/security-alert.png"
|
||||
},
|
||||
{
|
||||
"name": "FLL / City Shaper",
|
||||
"url": "/tutorials/city-shaper",
|
||||
"imageUrl": "/static/tutorials/city-shaper/robot1.jpg"
|
||||
},
|
||||
{
|
||||
"name": "Design Engineering",
|
||||
"url": "/design-engineering",
|
||||
"imageUrl": "/static/lessons/make-it-move-without-wheels.png"
|
||||
},
|
||||
{
|
||||
"name": "Coding",
|
||||
"url": "/coding",
|
||||
"imageUrl": "/static/lessons/autonomous-parking.png"
|
||||
},
|
||||
{
|
||||
"name": "Maker",
|
||||
"url": "/maker",
|
||||
"imageUrl": "/static/lessons/make-a-sound-machine.png"
|
||||
},
|
||||
{
|
||||
"name": "Tutorial Videos",
|
||||
"url": "/videos",
|
||||
"imageUrl": "https://legoeducation.videomarketingplatform.co/27288170/35719444/5d009e5f93fbf479c2e5ed2bf87a7990/thumbnail.png"
|
||||
}
|
||||
]
|
||||
```
|
||||
Here are some cool projects that you can build with your @boardname@!
|
||||
|
||||
## See Also
|
||||
## Basic
|
||||
|
||||
[Getting Started](/getting-started),
|
||||
[Brick Tutorials](/tutorials/brick),
|
||||
[Motor Tutorials](/tutorials/motors),
|
||||
[Touch Sensor Tutorials](/tutorials/touch-sensor),
|
||||
[Color Sensor Tutorials](/tutorials/color-sensor),
|
||||
[Ultrasonic Sensor Tutorials](/tutorials/ultrasonic-sensor),
|
||||
[Gyro Tutorials](/tutorials/gyro),
|
||||
[Infrared Sensor Tutorials](/tutorials/infrared-sensor),
|
||||
[FLL / City Shaper](/tutorials/city-shaper),
|
||||
[Design Engineering](/design-engineering),
|
||||
[Coding](/coding),
|
||||
[Maker](/maker),
|
||||
[Tutorial Videos](/videos)
|
||||
Basic projects to build with your @boardname@.
|
||||
|
||||
Coming soon.
|
@ -1,69 +0,0 @@
|
||||
# Projects
|
||||
|
||||
* [Getting Started](/getting-started)
|
||||
* [Prepare](https://makecode.mindstorms.com/troubleshoot)
|
||||
* [Try](/getting-started/try)
|
||||
* [Use](/getting-started/use)
|
||||
* [First LEGO League](/fll)
|
||||
* [Brick Tutorials](/tutorials/brick)
|
||||
* [Wake Up!](/tutorials/wake-up)
|
||||
* [Make an Animation](/tutorials/make-an-animation)
|
||||
* [What Animal Am I?](/tutorials/what-animal-am-i)
|
||||
* [Music Brick](/tutorials/music-brick)
|
||||
* [Pause On Start](/tutorials/pause-on-start)
|
||||
* [Motor Tutorials](/tutorials/motors)
|
||||
* [Run Motors](/tutorials/run-motors)
|
||||
* [Spin Turn](/tutorials/spin-turn)
|
||||
* [Pivot Turn](/tutorials/pivot-turn)
|
||||
* [Smooth Turn](/tutorials/smooth-turn)
|
||||
* [Tank ZigZag](/tutorials/tank-zigzag)
|
||||
* [Coast Or Brake](/tutorials/coast-or-brake)
|
||||
* [Turtle](/tutorials/turtle)
|
||||
* [Touch Sensor Tutorials](/tutorials/touch-sensor)
|
||||
* [Touch to Run](/tutorials/touch-to-run)
|
||||
* [Sensor Values](/tutorials/touch-sensor-values)
|
||||
* [Stop At Object](/tutorials/stop-at-object)
|
||||
* [Color Sensor Tutorials](/tutorials/color-sensor)
|
||||
* [What Color?](/tutorials/what-color)
|
||||
* [Line Following](/tutorials/line-following)
|
||||
* [Red Light, Green Light](/tutorials/redlight-greenlight)
|
||||
* [Move To Color](/tutorials/move-to-color)
|
||||
* [Reflected Light Measure](/tutorials/reflected-light-measure)
|
||||
* [Reflected Light Calibration](/tutorials/reflected-light-calibration)
|
||||
* [Ultrasonic Sensor Tutorials](/tutorials/ultrasonic-sensor)
|
||||
* [Object Near](/tutorials/object-near)
|
||||
* [Wall Follower](/tutorials/wall-follower)
|
||||
* [Gyro Tutorials](/tutorials/gyro)
|
||||
* [Calibrate](/tutorials/calibrate-gyro)
|
||||
* [Turn](/tutorials/turn-with-gyro)
|
||||
* [Move Straight](/tutorials/move-straight-with-gyro)
|
||||
* [Drifter](/tutorials/drifter)
|
||||
* [Infrared Sensor Tutorials](/tutorials/infrared-sensor)
|
||||
* [Security Alert](/tutorials/security-alert)
|
||||
* [FLL / City Shaper](/tutorials/city-shaper)
|
||||
* [Crane Mission / Robot 1](/tutorials/city-shaper/robot-1)
|
||||
* [Crane Mission / Robot 2](/tutorials/city-shaper/robot-2)
|
||||
* [Crane Mission / Video 1](https://youtu.be/IqL0Pyeu5Ng)
|
||||
* [Bluetooth download (beta)](https://youtu.be/VIq8-6Egtqs)
|
||||
* [Turn with Gyro](https://youtu.be/I7ncuXAfBwk)
|
||||
* [Moving with Gyro](https://youtu.be/ufiOPvW37xc)
|
||||
* [Line following with 1 color sensor](https://youtu.be/_LeduyKQVjg)
|
||||
* [Proportional line following with 1 color sensor](https://youtu.be/-AirqwC9DL4)
|
||||
* [Proportional line following with 2 color sensors](https://youtu.be/QWOflBuu9Oo)
|
||||
* [Design Engineering](/design-engineering)
|
||||
* [Make It Move Without Wheels](/design-engineering/make-it-move)
|
||||
* [Make It Smarter and Faster](/design-engineering/make-it-smarter)
|
||||
* [Make a System that Communicates](/design-engineering/make-it-communicate)
|
||||
* [Coding](/coding)
|
||||
* [Autonomous Parking](/coding/autonomous-parking)
|
||||
* [Object Detection](/coding/object-detection)
|
||||
* [Line Detection](/coding/line-detection)
|
||||
* [Maker](/maker)
|
||||
* [Make A Sound Machine](/maker/sound-machine)
|
||||
* [Make A Security Gadget](/maker/security-gadget)
|
||||
* [Tutorial Videos](/videos)
|
||||
* [undefined](https://legoeducation.videomarketingplatform.co/v.ihtml/player.html?token=5d009e5f93fbf479c2e5ed2bf87a7990&source=embed&photo%5fid=35719444)
|
||||
* [undefined](https://legoeducation.videomarketingplatform.co/v.ihtml/player.html?token=2008a566f1fb034d58d5ebe19ba8621f&source=embed&photo%5fid=35719467)
|
||||
* [undefined](https://legoeducation.videomarketingplatform.co/v.ihtml/player.html?token=629730c938e452f0fd7653fbc4708166&source=embed&photo%5fid=35719470)
|
||||
* [undefined](https://legoeducation.videomarketingplatform.co/v.ihtml/player.html?token=3513a83b87fe536b2dc512237465fd1b&source=embed&photo%5fid=35719471)
|
||||
* [undefined](https://legoeducation.videomarketingplatform.co/v.ihtml/player.html?token=5c594c2373367f7870196f519f3bfc7a&source=embed&photo%5fid=35719472)
|
@ -1,24 +1,8 @@
|
||||
# Reference
|
||||
|
||||
```namespaces
|
||||
music.playSoundEffect(sounds.animalsCatPurr);
|
||||
sensors.color(null);
|
||||
motors.stopAll();
|
||||
brick.showMood(moods.sleeping);
|
||||
```
|
||||
|
||||
## Advanced
|
||||
|
||||
```namespaces
|
||||
console.log("");
|
||||
control.runInParallel(function(){});
|
||||
```
|
||||
|
||||
## See Also
|
||||
|
||||
[brick](/reference/brick),
|
||||
[sensors](/reference/sensors),
|
||||
[motors](/reference/motors),
|
||||
[music](/reference/music),
|
||||
[control](/reference/control),
|
||||
[console](/reference/console)
|
||||
[touch sensor](/reference/sensors/touch-sensor),
|
||||
[color sensor](/reference/sensors/color-sensor)
|
@ -1,31 +0,0 @@
|
||||
# Brick
|
||||
|
||||
## Screen
|
||||
|
||||
```cards
|
||||
brick.showMood(moods.sleeping);
|
||||
brick.showImage(images.expressionsBigSmile);
|
||||
brick.showString("Hello world!", 1);
|
||||
brick.showNumber(0, 1);
|
||||
brick.showValue("item", 0, 1);
|
||||
brick.clearScreen();
|
||||
brick.showPorts();
|
||||
```
|
||||
|
||||
## Buttons
|
||||
|
||||
```cards
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Bumped, function () {
|
||||
|
||||
});
|
||||
brick.buttonEnter.pauseUntil(ButtonEvent.Bumped);
|
||||
brick.buttonEnter.isPressed()
|
||||
brick.setStatusLight(StatusLight.Red);
|
||||
brick.buttonEnter.wasPressed()
|
||||
```
|
||||
|
||||
## Other
|
||||
|
||||
```cards
|
||||
brick.batteryLevel()
|
||||
```
|
@ -1,33 +0,0 @@
|
||||
# battery Level
|
||||
|
||||
Return the current battery level.
|
||||
|
||||
```sig
|
||||
brick.batteryLevel();
|
||||
```
|
||||
|
||||
## Returns
|
||||
|
||||
* a [number](/types/number) which is the current charge level of the brick's battery. This is a percentage of total charge left in the battery.
|
||||
|
||||
## Example
|
||||
|
||||
Show the battery level percentage on the screen. Also, show a green light if the battery level is above 15%. If the battery level is below 15% but above 5%, show a orange light. But, if the battery level is below 5%, show a pulsing red light.
|
||||
|
||||
```blocks
|
||||
let battery = 0;
|
||||
forever(function() {
|
||||
brick.showString("Battery level:", 1)
|
||||
brick.showNumber(battery, 2)
|
||||
battery = brick.batteryLevel();
|
||||
if (battery > 15)
|
||||
{
|
||||
brick.setStatusLight(StatusLight.Green);
|
||||
} else if (battery > 5) {
|
||||
brick.setStatusLight(StatusLight.Orange);
|
||||
} else {
|
||||
brick.setStatusLight(StatusLight.RedPulse)
|
||||
}
|
||||
pause(30000)
|
||||
})
|
||||
```
|
@ -1,47 +0,0 @@
|
||||
# battery Property
|
||||
|
||||
Return the information about the battery
|
||||
|
||||
```sig
|
||||
brick.batteryInfo(BatteryProperty.Level)
|
||||
```
|
||||
|
||||
## Parameters
|
||||
|
||||
* property: the kind of information
|
||||
|
||||
## Returns
|
||||
|
||||
* a [number](/types/number) which represents the value of the property requested.
|
||||
|
||||
## Example
|
||||
|
||||
Show the battery level percentage on the screen. Also, show a green light if the battery level is above 15%. If the battery level is below 15% but above 5%, show a orange light. But, if the battery level is below 5%, show a pulsing red light.
|
||||
|
||||
```blocks
|
||||
let battery = 0;
|
||||
forever(function() {
|
||||
brick.showString("Battery level:", 1)
|
||||
brick.showNumber(battery, 2)
|
||||
battery = brick.batteryInfo(BatteryProperty.Level);
|
||||
if (battery > 15)
|
||||
{
|
||||
brick.setStatusLight(StatusLight.Green);
|
||||
} else if (battery > 5) {
|
||||
brick.setStatusLight(StatusLight.Orange);
|
||||
} else {
|
||||
brick.setStatusLight(StatusLight.RedPulse)
|
||||
}
|
||||
pause(30000)
|
||||
})
|
||||
```
|
||||
|
||||
Or see all the values
|
||||
|
||||
```blocks
|
||||
forever(function () {
|
||||
brick.showValue("bat V", brick.batteryInfo(BatteryProperty.Voltage), 1)
|
||||
brick.showValue("bat %", brick.batteryInfo(BatteryProperty.Level), 2)
|
||||
brick.showValue("bat I", brick.batteryInfo(BatteryProperty.Current), 3)
|
||||
})
|
||||
```
|
@ -1,53 +0,0 @@
|
||||
# is Pressed
|
||||
|
||||
Check if a button is being pressed or not.
|
||||
|
||||
```sig
|
||||
brick.buttonEnter.isPressed()
|
||||
```
|
||||
|
||||
## ~hint
|
||||
|
||||
**Touch sensors**
|
||||
|
||||
Your @boardname@ has touch sensors that work like buttons. Instead of saying `enter` or `left` as the source button, use a touch sensor block with a sensor name like `touch 1`.
|
||||
|
||||
```block
|
||||
if (sensors.touch1.isPressed()) {
|
||||
console.log("Hey, I feel pressed.");
|
||||
}
|
||||
```
|
||||
|
||||
Read about [touch sensors](/reference/sensors/touch-sensor) and using them as touch buttons.
|
||||
|
||||
## ~
|
||||
|
||||
## Returns
|
||||
|
||||
* a [boolean](types/boolean): `true` if the button is pressed, `false` if the button is not pressed
|
||||
|
||||
## Example
|
||||
|
||||
Set the brick light to green when the `down` is pressed. When the button is not pressed, the brick light is red.
|
||||
|
||||
```blocks
|
||||
let isRed = false;
|
||||
forever(function() {
|
||||
if (brick.buttonLeft.isPressed()) {
|
||||
brick.setStatusLight(StatusLight.Green);
|
||||
isRed = false;
|
||||
} else {
|
||||
if (!isRed) {
|
||||
brick.setStatusLight(StatusLight.Red);
|
||||
isRed = true;
|
||||
}
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
## See also
|
||||
|
||||
[was pressed](/reference/brick/button/was-pressed),
|
||||
[on event](/reference/brick/button/on-event)
|
||||
|
||||
[Touch sensors](/reference/sensors/touch-sensor)
|
@ -1,57 +0,0 @@
|
||||
# on Event
|
||||
|
||||
Run some code when a button is clicked, pressed down, or released.
|
||||
|
||||
```sig
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Bumped, function () {
|
||||
|
||||
});
|
||||
```
|
||||
|
||||
## ~hint
|
||||
|
||||
**Touch sensors**
|
||||
|
||||
Your @boardname@ has touch sensors that work like buttons. Instead of saying `enter` or `left` as the source button, use a touch sensor block with a sensor name like `touch 1`.
|
||||
|
||||
```block
|
||||
sensors.touch1.onEvent(ButtonEvent.Pressed, function () {
|
||||
brick.setStatusLight(StatusLight.Orange);
|
||||
});
|
||||
```
|
||||
|
||||
Read about [touch sensors](/reference/sensors/touch-sensor) and using them as touch buttons.
|
||||
|
||||
## ~
|
||||
|
||||
## Parameters
|
||||
|
||||
* **ev**: the button action to run some code for. The button actions (events) are:
|
||||
> * ``click``: button was clicked (pressed and released)
|
||||
> * ``up``: button is released from just being pressed
|
||||
> * ``down``: button is just pressed down
|
||||
* **body**: the code you want to run when something happens with a button
|
||||
|
||||
## Example
|
||||
|
||||
Check for event on the ENTER button. Put a message on the screen when the button is pressed, clicked, or released.
|
||||
|
||||
```blocks
|
||||
brick.showString("ENTER is: UP", 1);
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Released, function () {
|
||||
brick.showString("ENTER is: UP ", 1);
|
||||
});
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Pressed, function () {
|
||||
brick.showString("ENTER is: DOWN ", 1);
|
||||
});
|
||||
brick.buttonEnter.onEvent(ButtonEvent.Bumped, function () {
|
||||
brick.showString("ENTER was: CLICKED", 1);
|
||||
});
|
||||
```
|
||||
|
||||
### See also
|
||||
|
||||
[is pressed](/reference/brick/button/is-pressed),
|
||||
[was pressed](/reference/brick/button/was-pressed),
|
||||
|
||||
[Touch sensor](/reference/sensors/touch-sensor)
|
@ -1,37 +0,0 @@
|
||||
# pause Until
|
||||
|
||||
Causes your program to wait until an event at a button happens.
|
||||
|
||||
```sig
|
||||
brick.buttonEnter.pauseUntil(ButtonEvent.Bumped);
|
||||
```
|
||||
|
||||
## Parameters
|
||||
|
||||
* **ev**: the button action to wait for. The button actions (events) are:
|
||||
> * ``click``: button was clicked (pressed and released)
|
||||
> * ``up``: button is released from just being pressed
|
||||
> * ``down``: button is just pressed down
|
||||
|
||||
## Example
|
||||
|
||||
Wait for the `up` button to go up before continuing with displaying a message on the screen.
|
||||
|
||||
```blocks
|
||||
let waitTime = 0;
|
||||
brick.showString("We're going to wait", 1);
|
||||
brick.showString("for you to press and", 2);
|
||||
brick.showString("release the UP button", 3);
|
||||
waitTime = control.millis();
|
||||
brick.buttonUp.pauseUntil(ButtonEvent.Bumped);
|
||||
brick.clearScreen();
|
||||
if (control.millis() - waitTime > 5000) {
|
||||
brick.showString("Ok, that took awhile!", 1)
|
||||
} else {
|
||||
brick.showString("Ah, you let go!", 1)
|
||||
}
|
||||
```
|
||||
|
||||
## See also
|
||||
|
||||
[on event](/reference/brick/button/on-event)
|
@ -1,49 +0,0 @@
|
||||
# was Pressed
|
||||
|
||||
Check if a button was pressed earlier.
|
||||
|
||||
```sig
|
||||
brick.buttonEnter.wasPressed()
|
||||
```
|
||||
|
||||
The fact that a button was pressed earlier is remembered. Once **was pressed** is used, this fact is forgotten and the result is `false` the next time you check with **was pressed** button _state_ is reset). But, if you press the button again before you check with **was pressed**, it will tell you `true`.
|
||||
|
||||
## ~hint
|
||||
|
||||
**Touch sensors**
|
||||
|
||||
Your @boardname@ has touch sensors that work like buttons. Instead of saying `enter` or `left` as the source button, use a touch sensor block with a sensor name like `touch 1`.
|
||||
|
||||
```typescript
|
||||
if (sensors.touch1.wasPressed()) {
|
||||
console.log("Hey, I was pressed.");
|
||||
}
|
||||
```
|
||||
|
||||
Read about [touch sensors](/reference/sensors/touch-sensor) and using them as touch buttons.
|
||||
|
||||
## ~
|
||||
|
||||
## Returns
|
||||
|
||||
* a [boolean](types/boolean): `true` if the button was pressed before, `false` if the button was not pressed before
|
||||
|
||||
## Example
|
||||
|
||||
Set the brick light to green if the `right` button was pressed before the `left` button. If not, the brick light is turned off when the `left` button is pressed.
|
||||
|
||||
```typescript
|
||||
brick.buttonLeft.onEvent(ButtonEvent.Bumped, function() {
|
||||
if (brick.buttonRight.wasPressed()) {
|
||||
brick.setStatusLight(StatusLight.Green)
|
||||
} else {
|
||||
brick.setStatusLight(StatusLight.Off)
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
## See also
|
||||
|
||||
[is pressed](/reference/brick/button/is-pressed),
|
||||
[on event](/reference/brick/button/on-event),
|
||||
[Touch sensors](/reference/sensors/touch-sensor)
|
@ -1,22 +0,0 @@
|
||||
# clear Screen
|
||||
|
||||
Clear any text or numbers displayed on the screen. The screen will be blank.
|
||||
|
||||
```sig
|
||||
brick.clearScreen();
|
||||
```
|
||||
|
||||
## Example
|
||||
|
||||
Clear the screen after displaying the message.
|
||||
|
||||
```blocks
|
||||
brick.showString("This message will", 1);
|
||||
brick.showString("self-destruct in:", 2);
|
||||
brick.showString("seconds", 5);
|
||||
for (let i = 0; i < 10; i++) {
|
||||
brick.showNumber(10 - i, 4);
|
||||
pause(1000);
|
||||
}
|
||||
brick.clearScreen();
|
||||
```
|
@ -1,18 +0,0 @@
|
||||
# exit Program
|
||||
|
||||
Stops the program and returns to the brick menu
|
||||
|
||||
```sig
|
||||
brick.exitProgram();
|
||||
```
|
||||
|
||||
## Example
|
||||
|
||||
Do a sequence of motor commands and stop the program.
|
||||
|
||||
```blocks
|
||||
motors.largeA.run(50)
|
||||
pause(500)
|
||||
motors.stopAll()
|
||||
brick.exitProgram();
|
||||
```
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user